【问题标题】:custom readline functions in bash commandline?bash命令行中的自定义readline函数?
【发布时间】:2014-03-06 12:33:11
【问题描述】:

来自GNU readline and key bindings的代码:

#include <stdio.h>

#include <readline/readline.h>

int my_cool_readline_func (int count, int key) {
   printf ("key pressed: %d\n", key);
   rl_on_new_line ();
   return 0;
}

int main(void) {
     rl_command_func_t my_cool_readline_func;
     rl_bind_key ('\t', my_cool_readline_func);
     rl_bind_key (27, my_cool_readline_func); /* ascii code for ESC */
     rl_bind_keyseq ("\\C-a", my_cool_readline_func);

     while (1) {
         char *line = readline ("rl> ");
     }
}

是否可以在 bash 命令行中使用这种自定义的 readline 函数?

例如,我已经尝试过这些(当然,自定义函数可能要复杂得多):

bind '"\C-t" beginning-of-line shell-kill-word'

bind '"\C-t" beginning-of-line, shell-kill-word'

bind '"\C-t" beginning-of-line; shell-kill-word'

它们都不起作用。

【问题讨论】:

    标签: c bash readline


    【解决方案1】:

    我认为这个绑定是理解这是如何完成的关键:

     "\C-x\"": "\"\"\C-b"
    

    阅读“当我按下 Ctrl+X 和 " 时,插入两个引号 (\"\") 并将光标向左移动一次 (\C-b),使其最终位于两个双引号之间。

    : 的右侧,您只能有一个 readline 函数或一个“宏”或一个 shell 函数。宏是一系列击键。

    所以你需要做的是将你想要的功能分配给键,然后使用宏中的

     bind '"\C-t":"\C-a\ed"'
    

    另请参阅:Complex keybinding in bash

    【讨论】:

    • 我不明白这是如何回答这个问题的。当我点击标签时,我如何做到这一点,我的自定义函数被调用?
    • @GregSchmit 这个问题有点令人困惑。我已经编辑了我的答案以使其更清楚。
    • rl_bind_key 实际上对我不起作用,我认为 OP 也有同样的问题。就我而言,事实证明这是因为我不小心使用了 libedit 而不是 GNU Readline。我最终弄明白了:stackoverflow.com/questions/47588197/…
    猜你喜欢
    • 2014-03-15
    • 2014-03-17
    • 1970-01-01
    • 2023-03-12
    • 2016-06-30
    • 2015-08-13
    • 2016-03-11
    • 1970-01-01
    • 2014-06-11
    相关资源
    最近更新 更多