所以,我正在尝试使用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.h
,rl_insert_text()
位于:
/* supported functions */
令人困惑的是:
/*
* The following is not implemented
*/
我是SOL,还是我做错了?
答案 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
没有得到足够的重视要妥善修理。社区补丁当然会受到欢迎,虽然如果我们可以使用代码而不必自己破解它就会更好......; - )
更新:新的Xcode 4提供git支持。好哇!我的理解是,这是由于新的插件架构将GPL代码与主Xcode代码库隔离开来。但是,我强调,copyleft许可证仍然是代码的错误解决方案,应该使每个人受益。显然有些人不同意(你是朋友,匿名的downvoter),但事实是GPL can restrict freedoms too - 通常它与闭源/专有软件不同,但GPL在预防方面也非常有效非法使用源代码......区别在于道德优越感。