移至多行命令的上一行

移至多行命令的上一行

编辑多行命令时,使用转义换行符时,我无法向上移动行。

例如,假设我输入echo \一行,然后按Enter,然后我想编辑echo \该命令的部分。按Up不会返回到第一个命令行。

这适用于换行的长命令,但不适用于转义换行符:

_physical_up_line()   { zle backward-char -n $COLUMNS }
_physical_down_line() { zle forward-char  -n $COLUMNS }
zle -N physical-up-line _physical_up_line
zle -N physical-down-line _physical_down_line
bindkey -M vicmd "R" physical-up-line
bindkey -M vicmd "N" physical-down-line

答案1

当您按下Enteraccept-line命令)时,当前行将被解析并计划执行。如果该行在语法上不完整(例如echo \for x in foo),则不会执行它,但它已经被存储。您可以看到 zsh 处于这种状态,因为它显示的是PS2提示符而不是通常的PS1

据我所知,没有内置方法来编辑这些存储的行。应该可以通过存储当前行而不执行它并调用上一个历史行进行编辑来实现。

获取上一行的最简单方法是确保当前行未完成(例如\在末尾键入),接受它(按Enter),然后取消它(按Ctrl+ C)。然后,您可以通过按 来将整个存储的命令作为单个历史记录行调用为单个多行缓冲区Up

答案2

假设您有默认的 emacs 键绑定,请尝试使用Alt+Enter而不是 plainEnter来安排执行一行。
对我来说,当以这种方式添加线条时,我可以轻松地上下移动这些线条。例如,当出现 zsh 终端提示符时:

% cat << EOF<ALT-ENTER>
first line<ALT-ENTER>
second line<ALT-ENTER>
thi
   ^ 
   pressing <UP> moves up a line like you would expect

答案3

中的一个Zsh 用户指南提到当您打算创建换行符时,您可以Escape按后跟,以避免进入无法再编辑上一行的多重提示符(PS2)。Enter

这也仅适用于默认的 emacs 键绑定。

然而,我发现 the_velour_fog 的答案应该被标记为接受的答案,因为它更加优雅!

答案4

ZSH:使用 ctrl-g 将光标移动到提示符的第 0 行/位置 0(在 vi 模式/插入模式下测试):

zsh-move-to-first-line() {
  local line_count=$(echo "$BUFFER" | wc -l)
  local current_line=1
  while [ "$current_line" -lt "$line_count" ]; do
    zle up-line-or-history
    current_line=$((current_line+1))
  done
  zle beginning-of-line
}

zle -N zsh-move-to-first-line
bindkey '^G' zsh-move-to-first-line

逆:从第 0 行位置 0 到最后一行最后一个位置。使用 ctrl-h

zsh-move-to-last-line() {
  local line_count=$(echo "$BUFFER" | wc -l)
  local current_line=1
  while [ "$current_line" -lt "$line_count" ]; do
    zle down-line-or-history
    current_line=$((current_line+1))
  done
  zle end-of-line
}

zle -N zsh-move-to-last-line
bindkey '^H' zsh-move-to-last-line

来源:ChatGpt4

相关内容