在OS X 10.5上使用readline的rl_insert_text

时间:2009-06-08 21:05:59

标签: c macos readline

所以,我正在尝试使用readline将一些默认文本填充到用户输入中,并且无法使其在OSX 10.5上运行:

// rl_insert_text_ex.c
// gcc -o rl_insert_text_ex rl_insert_text_ex.c -lreadline
#include <stdio.h>
#include <readline/readline.h>

int my_startup_hook(void) {
  return rl_insert_text("ponycorns");
}
int main(int argc, char *argv[]) {
  char *line;
  rl_startup_hook = (Function*) my_startup_hook;
  line = readline("What's your favorite mythical animal? ");
  if (NULL == line || '\0' == *line) {
    printf("Nothing given... :(\n");
  }
  else {
    printf("That's funny, I love %s too!\n", line);
  }
  return 0;
}

这段代码甚至没有在10.4上编译(在10.4上没有_rl_insert_text的定义,这有点令人失望),但是在10.5上编译。但是,rl_insert_text()'d文本永远不会显示在屏幕上,也不会作为用户输入返回。正在使用回调并且rl_insert_text()返回正确的值,(谢谢,printf),所以我不确定这里发生了什么。

我检查了/usr/include/readline/readline.hrl_insert_text()位于:

/* supported functions */

令人困惑的是:

/*
 * The following is not implemented
 */

我是SOL,还是我做错了?

1 个答案:

答案 0 :(得分:1)

不幸的是,您可能运气不好,至少使用OS X中包含的readline库。由于许可证兼容性问题,Apple使用libedit,(显然)提供了不完整的readline仿真。 (此库在OS X附带的readline.h中以“editline”名称记录。)

GNU Readline Library(“一个真正的”读取库)属于GPL,它(作为copyleft许可证)不能很好地处理非完全开源的代码。如果归结为(A)开源所有Xcode,OS X等,或者(B)使用你真正想要使用的东西,Apple(像大多数公司一样)总是会选择B.这是一个无赖,但这就是生活。

就我个人而言,我认为这是GPL代码在这片土地上有点枯萎的一个原因,因为在“坚持这个人”的行为中,它通常也会扣留购买软件的群众的代码。 。 {BSD,MIT,Apache}风格的许可证更有利于在闭源系统中使用,并且仍然允许商业实体提供补丁等。我的猜测libedit没有得到足够的重视要妥善修理。社区补丁当然会受到欢迎,虽然如果我们可以使用代码而不必自己破解它就会更好......; - )

顺便说一下,同样的事情适用于其他GPL项目 - 只要{git,mercurial,bazaar}仍然在GPL下,不要屏住呼吸让Apple在Xcode中为他们提供集成。 : - (

更新:新的Xcode 4提供git支持。好哇!我的理解是,这是由于新的插件架构将GPL代码与主Xcode代码库隔离开来。但是,我强调,copyleft许可证仍然是代码的错误解决方案,应该使每个人受益。显然有些人不同意(你是朋友,匿名的downvoter),但事实是GPL can restrict freedoms too - 通常它与闭源/专有软件不同,但GPL在预防方面也非常有效非法使用源代码......区别在于道德优越感。