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

时间:2014-10-16 16:23:40

标签: zsh zsh-zle

有时我在zsh中使用多行命令:

❯ echo \
> a \
> multiline \
> command

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

# 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

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

6 个答案:

答案 0 :(得分:17)

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

bindkey '^[^M' self-insert-unmeta

使用你的例子:点击 Alt + 返回在光标位置(#

% echo \
a \
multiline \#
command

会告诉你:

% echo \
a \
multiline \
#
command

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

例如,在此示例中按 Alt + 返回而不是#

% echo command 1#
echo command 2#
echo command 3

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

command 1
command 2
command 3

答案 1 :(得分:15)

您可以使用 ESC - 返回

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

答案 2 :(得分: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

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

的内容
bindkey -M vicmd v edit-command-line

代替(在vicmd模式下将小部件绑定到 v )。

答案 3 :(得分:4)

如果使用bindkey -v模式,您还可以使用vicmd模式下的默认 o / O 命令添加换行符并输入其中insert模式,分别高于或低于当前行。

答案 4 :(得分:0)

听起来像是使用shell脚本文件的合适位置而不是吗?

#!/bin/zsh
my
commands
here
I can even add a new line at a later time.

答案 5 :(得分:0)

请注意,如果您想在多行命令中发表评论,可以使用:

❯ echo `#first comment` \
> a `#second comment` \
> multiline \
> command