在多行命令中,之间存在差异
- 线路开始
- 命令开始
使用 vim 键绑定set -o vi
FOR READLINE(例如 bash、psql 等),如何转到行的开头而不是命令的开头。
VIM 上没有这个问题。它位于 readline 应用程序的 vi keybinidngs 上。
复制这个...全部(下面的多行块引用)
在多行命令中,之间存在差异
- 线路开始
- 命令开始
使用 vim 键绑定
set -o vi
,如何转到行的开头而不是命令的开头。
现在请按照这些说明进行操作..
- 类型
echo "
- 粘贴上面的内容。
- 键入
"
以完成命令并按Enter。
现在按向上箭头将其放入命令缓冲区。
- 现在你如何转到一行的开头和结尾,不是命令?
- 如何在多行命令中向上移动一行,不执行不同的命令?
答案1
我不确定这是否有效确切地你想要什么,但我怀疑这可能是你能得到的最接近的东西。
escv
$EDITOR
将在您选择的编辑器(例如,或 debian 中设置的编辑器/etc/alternatives
)中打开当前命令。据推测,您将将此设置为 vi 或 vim,并且您可以使用j、k、0等在行之间导航$。
作为奖励,
shopt -s lithist
将保留历史记录中的行格式,而不是连接用分号分隔的命令。
正如 Evan Carroll 所指出的,这仅适用于 bash,但许多使用 readline 的其他程序也有外部编辑器......例如psql
允许使用\e
.
答案2
bash 根本不执行所要求的操作:它与 ksh 的模仿相当接近六。这里请求的功能不是六功能,而是 vim 提供的扩展。
答案3
- 线路开始
- 命令开始
很容易证明 readline/bash 中这两个(在多行命令中)事物之间的区别无法执行。并且由于无法进行区分,因此不能为每个键绑定。
以下所有内容均假设set -o vi
假设我在 bash 提示符中输入以下内容(我也按下Return并生成输出):
[~]$ echo "yay
> yep
> yup"
yay
yep
yup
接下来我按Esc,k并得到以下信息({.}
是光标的位置):
[~]$ {e}cho "yay
yep
yup"
请注意以下几点:
PS2
(>
在我的机器上)没有像我直接键入时那样打印。- 如果我继续按k和/或j滚动浏览以前的命令,而不是命令中的行。
因此,让我们假设我们实际上正在编辑不是几行但是一个包含换行符的单行(是的,那里有一个巨大的差异。命令历史记录(在内存中)存储为链接列表,而不是以换行符分隔的文本。)。
让我们尝试找到一种方法来证明只有当解释器解析该行时,该行才变成多个命令。这是来自 readline 部分的命令man bash
:
comment-begin (``#'')
The string that is inserted when the readline insert-comment command is executed. This command is bound to
M-# in emacs mode and to # in vi command mode.
基本上,如果我们击中#该行应该被注释掉并传递给解释器(不确定为什么它被传递给解释器,我猜会出现在历史记录中)。无论如何,我们知道,如果我们点击#readline 命令就会执行,即它不是一个编辑命令(实际上应该是 Vi 中的“搜索下一个”)。
首先让我们按以下键将光标移动到末尾$:
[~]$ echo "yay
yep
yup{"}
现在我们点击#,事情发生了,这就是 shell 会话的样子:
[~]$ #echo "yay
yep
yup"
bash: yep: command not found
> { }
这看起来很奇怪,对吧?但这正是我们所要求的,readline 评论道线并将其传递给解析器。 echo "yay
被注释掉,shell 尝试运行yep
,我们看到了,PS2
因为我们有一个未完成的引用yup"
。输入"Return即可退出。
所以,我们可以得出的结论是readline 不区分多行命令中的行我们在上面输入了。如果 readline 不区分,那么位于它之上的 Vi 模式也无法区分。
如果您需要分别编辑多行,请按照@BartonChittenden的答案(+1)并输入编辑器。编辑器将行分成不同的实体,以便您可以在它们之间导航。
答案4
这个顺序Shift ^
似乎对我有用。