4ae*_*1e1 4 shell command-line zsh
请注意,我不是在谈论历史上的前几行.我在谈论当前多行命令中的前一行.
例如,当我在zsh中键入多行命令时(_
表示光标):
$ for i in {1..5}; do
for> echo i_
Run Code Online (Sandbox Code Playgroud)
在这一点上,我可能会改变主意,并希望让i
循环通过{1..10}
,所以我需要回到上一行.但是,我无法弄清楚如何做到这一点,如⌫,或←,或者C-b
,或者我能想到的第二行开头的所有停靠点.那么,是否有可能退回去?提前致谢.
实际上,这不仅限于zsh.例如,我从来没有在bash中想到这一点.
我已经花了相当多的时间谷歌搜索没有任何调查结果,所以请原谅我并责怪我的谷歌如果这是显而易见的.
供您参考,我正在使用Emacs键绑定,以及
$ bindkey | grep delete
"^D" delete-char-or-list
"^H" backward-delete-char
"^[[3~" delete-char
"^?" backward-delete-char
Run Code Online (Sandbox Code Playgroud)
不确定这是否有帮助.
这是你在visual
模式下bash
的vim
模式.
里面.bashrc
放了以下几行.
set -o vi
# I do not remember which one of these is used by `v`, so I set both
export VISUAL=/usr/bin/nano
export EDITOR=/usr/bin/nano
Run Code Online (Sandbox Code Playgroud)
重新加载bash
,然后按下Esc
进入normal
模式.键入v
,并nano
应加载.您现在可以输入多行命令了nano
.保存并退出时,将执行多行命令.
对于zsh
,您rc
可以执行以下操作.我从这个答案中偷了最后三行并在我的身上测试了它zsh
.
bindkey -v
autoload -U edit-command-line
zle -N edit-command-line
bindkey -M vicmd v edit-command-line
Run Code Online (Sandbox Code Playgroud)
我认为这是不可能的,但这里有其他解决方法:
\n\n您可以绑定一些键(例如<C-Enter>
,如果您可以告诉您的终端在这种情况下不要输出<C-m>
)
function _-add-newline()\n{\n LBUFFER="$LBUFFER"$\'\\n\'\n}\nzle -N add-newline _-add-newline\nbindkey "\\Ca" add-newline\n
Run Code Online (Sandbox Code Playgroud)\n\n。这样,如果您按<C-a>
换行符将出现在缓冲区中,但它不会触发接受行小部件,并且上一行仍然是可编辑的。例如,您可以使用左/右箭头移动到它。
for x in y ; do<CR>echo foo<CR><C-c><Up>
看到并且所有文本都将是可编辑的。for x in y ; do\\necho foo
注意:您需要<CR>
保留最后一行(中止的行<C-c>
不保存)并<C-c>
中止输入;done
如果您已经输入(首先<CR>
将运行循环),则此变体将不起作用。在最后一种情况下,您可以丢弃最后一行<C-c>
并重新输入。accept-line
您的输入并确定您是否已完全编写命令的代码来覆盖小部件,如果没有,那么它将仅附加\\n
到缓冲区(如上面的函数中)并且不运行original accept-line
,否则accept-line
运行original。不过,这个变体更难实现,所以我说的是\xe2\x80\x9c理论上\xe2\x80\x9d。