linux - 使用 readline 的多平台(Windows、MacOSX、Linux)应用程序出现问题

标签 linux macos bash netbeans multiplatform

我正在使用 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/

相关文章:

javascript - 如何在 npm install 中克服这个错误?

c - 什么是通用信号量范围?

python - 如何在 Mac OS X 10.11 上安装 Paramiko

linux - 在 shell 脚本中终止程序 (CTRL+C)

bash - Sed/Awk 删除第二次出现的字符串 - 平台无关

linux - 什么是linux进程表?它由什么组成?

ios - 什么是操作系统状态?

eclipse - 从 Eclipse 中删除 "Build Workspace"键盘快捷键

linux - 同时执行 awk 和 sed 命令

linux - Linux 上的 Subversion CLI 默认文本编辑器