2

我正在使用 Netbeans IDE 用 C 语言编写一个多平台(Windows、Linux 和 MacOSX)应用程序。

它是基于 shell 的(bash),我使用 readline 和 history 进行数据输入。

另外,我想覆盖快捷键(Ctrl + A,Ctrl + B,...),所以我使用了 rl_bind_key 函数。

rl_bind_key 在 Windows 中正常工作,但在 Linux 和 MacOSX 中不起作用,它总是返回 -1。

我遇到的另一个问题是在 Netbeans(集成到 IDE 的 shell)内部,一切运行正常,但在 Netbeans Shell 外部,我的应用程序看起来不完整。我认为这些行为是由于外壳配置造成的,如何将配置从一个外壳导出到另一个外壳......?

4

1 回答 1

2

如何修复它:

OS X正在使用一个古老的版本readline。要解决此问题,只需升级到较新的版本。只需在终端中运行它(我使用 Homebrew 作为我的包管理器):

brew install readline
brew link readline --force

force是必需的,因为它应该覆盖系统库。

如果上面的代码对您有用,并且您不在乎它为什么失败,请在此处停止阅读。

什么地方出了错?

出于某种原因,该函数没有被实现为接受回调,而只是为了启用或禁用该rl_insert函数。即使它被记录为能够绑定任意回调。

下面是函数在readline 1.* (OS X 中使用的版本)中的具体实现:

int rl_bind_key(int c, rl_command_func_t *func)
{
    int retval = -1;

    if (h == NULL || e == NULL)
        rl_initialize();

    if (func == rl_insert) {
        /* XXX notice there is no range checking of ``c'' */
        e->el_map.key[c] = ED_INSERT;
        retval = 0;
    }
    return retval;
}

如您所见,除了 时func == rl_insert,函数总是返回-1

于 2015-05-23T17:41:11.573 回答