Bash: 如何配置 运行 程序的键盘快捷键并将其输出插入光标位置?

Bash: how to configure a keyboard shortcut to run a program and insert its output at the position of cursor?

在 Bash 中键入命令时,我希望能够按组合键进入 运行 程序,并将程序的输出插入命令行的位置光标。 例如:

$ cat <Ctrl-G>
# bash runs a program that prints "some-file" to stdout
$ cat some-file

我希望它适用于每个命令 - 不仅是 cat

我尝试了以下方法:

bind -x '"\C-g":"echo some-file"'

但是 "some-file" 打印到终端而不是命令行:

$ cat <Ctrl-G>
some-file
$ cat 

我有 Lubuntu 和 X windows,OpenBox 和我通过在 Openbox 中定义快捷方式解决了这个问题。

nano ~/.config/openbox/lubuntu-rc.xml
#setting shortcuts to point at a special bash script
openbox --reconfigure # restart shortcuts

所以如果我在任何地方按下 ctrl+G 它就会运行给定的脚本 将结果输出到剪贴板,比如:

 echo "Hello World at $(date +%Y-%m-%d_%H-%M-%S)" | xsel -b -i 

然后我将输出粘贴到 Bash 终端 (ctrl+shift+V)。

我知道它并不纯粹BASH,但它可能会以某种方式帮助你。

PS。如果我需要将密钥直接发送到应用程序,我使用 xdotool.

答案在于 READLINE_LINEREADLINE_POINTbind 设置的变量:

-x keyseq:shell-command

Cause shell-command to be executed whenever keyseq is entered. When shell-command is executed, the shell sets the READLINE_LINE variable to the contents of the Readline line buffer and the READLINE_POINT variable to the current location of the insertion point. If the executed command changes the value of READLINE_LINE or READLINE_POINT, those new values will be reflected in the editing state.

例如:

stuff() { 
    local pre="${READLINE_LINE:0:$READLINE_POINT}"
    local suf="${READLINE_LINE:$READLINE_POINT}"
    local stuff='my string here'
    READLINE_LINE="${pre}$stuff$suf"
    ((READLINE_POINT += ${#stuff}))
}

bind -x '"\C-g":"stuff;"'

感谢 Greg Wooledge 在 help-bash mailing list

中回答了我的问题