在从历史记录中提取的多行zsh命令中插入换行符

Sea*_*sey 14 zsh zsh-zle

有时我在zsh以下方面使用多行命令:

? echo \
> a \
> multiline \
> command
Run Code Online (Sandbox Code Playgroud)

从历史搜索中拉出命令后编辑命令时,我可以更改各行的内容.但是,我无法弄清楚如何插入另一行:

# I want to insert another line after "multiline"...
? echo \
> a \
> multiline \  # but hitting <return> here just runs the command, even though there's a backslash at the end of the line
> command
Run Code Online (Sandbox Code Playgroud)

如何在从历史记录中拉出的多行命令的中间插入换行符?

Ada*_*hon 20

您可以使用self-insert-unmeta绑定Alt+ Return来插入文字换行符而不接受命令:

bindkey '^[^M' self-insert-unmeta
Run Code Online (Sandbox Code Playgroud)

使用你的例子:在光标位置按下Alt+ Return(#)

% echo \
a \
multiline \#
command
Run Code Online (Sandbox Code Playgroud)

会得到你这个:

% echo \
a \
multiline \
#
command
Run Code Online (Sandbox Code Playgroud)

这不仅适用于编辑历史记录,也适用于键入命令时.因此,您可以像时尚一样在脚本中准备几个命令,并使用单个接受它们Return.

例如,在此示例中按Alt+ Return而不是#:

% echo command 1#
echo command 2#
echo command 3
Run Code Online (Sandbox Code Playgroud)

将执行与命令相同的操作echo command 1; echo command 2; echo command 3并生成此输出:

command 1
command 2
command 3
Run Code Online (Sandbox Code Playgroud)

  • 我知道我们不应该感谢 Stack Overflow 上的人,但我觉得有必要这样做。谢谢 :DI 现在可以创建一个 zsh 键绑定,它创建一个多行命令(带有一个 here 文档)并对其进行执行时更改而不打印 `heredoc&gt;` 并阻止我编辑它,如下所示:`bindkey -s "^[t" 'sh &lt;&lt;EOF ^[^Mecho "编译步骤 1 (可选)"; ^[^Mecho“编译第2步(必填)” ^[^MEOF^[[A^[[A^[[H'` (2认同)

Kam*_*chi 16

你可以使用ESC- Return.

FWIW,我在Debian Jessie,zsh 5.0.7上进行了测试,它在那里工作.


che*_*ner 6

(来自https://unix.stackexchange.com/questions/6620/how-to-edit-command-line-in-full-screen-editor-in-zsh的答案摘要)

zsh附带一个函数,可用于在您喜欢的编辑器中打开当前命令行.将以下行添加到您的.zshrc:

autoload -z edit-command-line
zle -N edit-command-line
bindkey "^X^E" edit-command-line
Run Code Online (Sandbox Code Playgroud)

第一行加载函数.第二行zle从同名函数为Z shell行编辑器()创建一个新的小部件.第三行将小部件绑定到Control- X Control- E.如果您使用vi绑定而不是emacs键绑定,请使用类似的东西

bindkey -M vicmd v edit-command-line
Run Code Online (Sandbox Code Playgroud)

代替(其结合了小部件vvicmd模式).