我正在使用 Netbeans IDE 用 C 语言编写一个多平台(Windows、Linux 和 MacOSX)应用程序。
它是基于 shell (bash) 的,我使用 readline 和历史记录进行数据输入。
另外,我想覆盖快捷键(Ctrl + A,Ctrl + B,...),所以我使用了rl_bind_key函数。
rl_bind_key 在 Windows 中可以正常工作,但在 Linux 和 MacOSX 中不起作用,它总是返回 -1。
我遇到的另一个麻烦是,在 Netbeans(集成到 IDE 的 shell)内,一切运行正常,但在 Netbeans Shell 外,我的应用程序看起来不完整。我认为这些行为是由于 shell 配置造成的,如何将配置从一个 shell 导出到另一个 shell..?
最佳答案
如何修复它:
OS X
正在使用 readline
的古代版本。要解决此问题,只需升级到较新的版本即可。只需在终端中运行它(我使用 Homebrew 作为我的包管理器):
brew install readline
brew link readline --force
force
是必需的,因为它应该覆盖系统库。
如果上面的代码对您有用并且您不关心它为什么失败,请停止阅读此处。
出了什么问题?
由于某种原因,该函数并未实现接受回调,而只是启用或禁用 rl_insert
功能。尽管它被记录为能够绑定(bind)任意回调。
下面是 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
.
关于linux - 使用 readline 的多平台(Windows、MacOSX、Linux)应用程序出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12584871/