使用外部编辑器编辑 Zsh 命令并替换原始命令

使用外部编辑器编辑 Zsh 命令并替换原始命令

我正在使用 Zsh齐姆。我已经设置了一个键绑定,用于在 Neovim 中编辑当前命令,方法是将以下内容放入.zshrc

bindkey -v
export VISUAL=nvim
autoload edit-command-line; zle -N edit-command-line
bindkey -M vicmd v edit-command-line

这样,当我完成编辑命令时,最终结果将放置在原始结果下方,如下面的屏幕截图所示。

包含两行的示例,每行都有一个命令。

我想要的是最终结果取代原来的线。主要原因是我使用 Powerlevel10k瞬时提示已启用。此功能在这种特殊情况下不起作用。

答案1

免责声明:我是 Powerlevel10k 的作者。

当瞬态提示启用时,Powerlevel10k应该在外部编辑器中完成命令编辑后截断提示。然而事实并非如此。我刚刚修复感谢您的报告。

现在回到你原来的问题。

我想要的是最终结果取代原来的线。

您需要为此定义一个自定义 zle 小部件。这是一种实现:

function edit-command-line-inplace() {
  if [[ $CONTEXT != start ]]; then
    if (( ! ${+widgets[edit-command-line]} )); then
      autoload -Uz edit-command-line
      zle -N edit-command-line
    fi
    zle edit-command-line
    return
  fi
  () {
    emulate -L zsh -o nomultibyte
    local editor=("${(@Q)${(z)${VISUAL:-${EDITOR:-vi}}}}") 
    case $editor in
      (*vim*)
        "${(@)editor}" -c "normal! $(($#LBUFFER + 1))go" -- $1
      ;;
      (*emacs*)
        local lines=("${(@f)LBUFFER}") 
        "${(@)editor}" +${#lines}:$((${#lines[-1]} + 1)) $1
      ;;
      (*)
        "${(@)editor}" $1
      ;;
    esac
    BUFFER=$(<$1)
    CURSOR=$#BUFFER
  } =(<<<"$BUFFER") </dev/tty
}

您可以按照与以下相同的方式绑定它edit-command-line

zle -N edit-command-line-inplace
bindkey -M vicmd v edit-command-line-inplace

请注意,这edit-command-line-inplace取决于edit-command-line是否无法就地更新命令行。例如,尝试输入echo 'first line、点击Enter,然后调用edit-command-line-inplace。无法更新命令的第一行,因此edit-command-line-inplace其行为方式与edit-command-line.

edit-command-line-inplace编辑:我发布的第一个版本明确调用nvim来编辑命令行。我已经更新了代码以尊重VISUAL环境EDITOR变量。

相关内容