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