zsh命令行编辑器:输入命令时返回上一行

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)

不确定这是否有帮助.

mer*_*011 5

这是你在visual模式下bashvim模式.

里面.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)


ZyX*_*ZyX 1

我认为这是不可能的,但这里有其他解决方法:

\n\n
    \n
  1. 您可以将所有内容写在一行中。编辑并不容易,但多行字符串也不容易编辑。
  2. \n
  3. 您可以绑定一些键(例如<C-Enter>,如果您可以告诉您的终端在这种情况下不要输出<C-m>

    \n\n
    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>换行符将出现在缓冲区中,但它不会触发接受行小部件,并且上一行仍然是可编辑的。例如,您可以使用左/右箭头移动到它。

  4. \n
  5. 如果您键入,您将在缓冲区中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>并重新输入。
  6. \n
  7. 理论上,您可以使用解析accept-line您的输入并确定您是否已完全编写命令的代码来覆盖小部件,如果没有,那么它将仅附加\\n到缓冲区(如上面的函数中)并且不运行original accept-line,否则accept-line运行original。不过,这个变体更难实现,所以我说的是\xe2\x80\x9c理论上\xe2\x80\x9d。
  8. \n
\n