Itt*_*ayD 8 shell bash prompt vi readline
我在 bash 中编写了一个实用程序,read -e用于为类似 sql 的查询提供提示。有时这些很长,所以我希望能够打开 vi,编辑当前行并在退出时用 vim 中的内容替换该行。我用read. 就像是:
query> select .... from .... very long... <ctrl-e>
Run Code Online (Sandbox Code Playgroud)
现在在 vi
select .... from .... very long...
Run Code Online (Sandbox Code Playgroud)
编辑为
select ...
from ....
very long ...
Run Code Online (Sandbox Code Playgroud)
退出六
query> select ...
from ....
very long ... <enter>
Run Code Online (Sandbox Code Playgroud)
查询运行。
更新:在 'read -e' 之前使用 'set -o vi' 似乎是我的方式,但目前当我单击<esc>v打开的缓冲区时,不包含在线内容,而是一些其他查询,来自我的历史记录(但不是我之前输入的那个)。
pfn*_*sel 13
首先,您必须确保使用 vi 作为 shell 命令行编辑器:
set -o vi
Run Code Online (Sandbox Code Playgroud)
现在您可以输入/复制您的命令到命令行。要离开插入模式并进入正常模式,请使用Esc或Shift+ Tab。现在您可以vi通过按来打开v。
在 中vi,您现在可以进行所需的所有更改,保存缓冲区并退出vi,然后执行命令。
在 bash 中,您可以使用Ctrl+ x、Ctrl+为当前命令行调用编辑器e。
在我必须处理的系统上,这不在其man readline自身下的文档中,而是在man bash“readline”部分下,所以我不确定它是否是 bash 特定的功能,或者其他基于 readline 的程序是否会支持它。
这是来自 bash 的文档:
edit-and-execute-command(C-xC-e)在当前命令行调用编辑器,并将结果作为 shell 命令执行。Bash 尝试按照编辑器的顺序调用
$VISUAL、$EDITOR和emacs。
只要您的提示是 shell 提示(例如调用read),所有其他答案都是有效且有用的
如果不是(您在这方面并不完全清楚),例如,当您使用 SQL 解释器时,xxxsql您可以使用
rlwrap --multi-line -a xxxsql然后使用特殊(可配置)键来调用您选择的编辑器(例如export RLWRAP_EDITOR="vim '+call cursor(%L,%C)"在输入中指定) --call_cursor在调用时保留光标位置很有用vim)
作为额外的好处,即使是多行命令,您也将拥有完整的命令历史记录(在将它们放入历史列表之前,它们被“压缩”为单行命令,但在重新使用时会再次展开)
编辑:更多信息可以在rlwraps Github 页面上找到 。就像使用的所有命令GNU readline库其行为的最多的是指定 的用户$INPUTRC ,其rlwrap具有添加了一些自己的选项控制,除其他事项外,上述特殊键来调用外部编辑器(CTRL+^默认)