在OS X 10.5上使用readline的rl_insert_text

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

// rl_insert_text_ex.c // gcc -o rl_insert_text_ex rl_insert_text_ex.c -lreadline #include  #include  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.h ,并且rl_insert_text()位于:

 /* supported functions */ 

这是令人困惑的:

 /* * The following is not implemented */ 

我是SOL,还是我做错了?

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

GNU Readline Library (“一个真正的”readline库)属于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也可以限制自由 – 通常它与封闭源/专有软件通常不同,但GPL在预防方面也非常有效非法使用源代码……区别在于道德优越感。