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_LINE
和 READLINE_POINT
由 bind 设置的变量:
-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
中回答了我的问题
在 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_LINE
和 READLINE_POINT
由 bind 设置的变量:
-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
中回答了我的问题