【问题标题】:Using readline's rl_insert_text on OS X 10.5在 OS X 10.5 上使用 readline 的 rl_insert_text
【发布时间】:2010-11-01 07:24:16
【问题描述】:

所以,我正在尝试使用 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,还是我做错了?

【问题讨论】:

  • 为什么这被标记为红宝石?代码看起来像 C 代码。

标签: c macos readline


【解决方案1】:

不幸的是,您可能不走运,至少对于 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 许可证仍然是应该使所有人受益的代码的错误解决方案。显然有些人不同意(你是朋友,匿名的反对者),但事实是 GPL can restrict freedoms too - 通常它与闭源/专有软件不同,但 GPL 在防止非法使用方面也非常有效源代码……区别在于道德优越感。

【讨论】:

  • 谢谢!这再次证实了我在 OS X 上只使用 editline() 的决定。
猜你喜欢
  • 2016-03-28
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多