如何使用 vi 编辑实用程序的提示行?

如何使用 vi 编辑实用程序的提示行?

我在 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

现在您可以在命令行中键入/复制命令。要离开插入模式并进入正常模式,请使用EscShift+ Tab。现在您可以vi按 打开v

在 中vi,您现在可以执行所需的所有更改,保存缓冲区并退出vi,然后命令将被执行。

答案2

Ctrl在 bash 中,您可以使用+ xCtrl+调用当前命令行的编辑器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+ )^

相关内容