外部エディタを使用して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

これにより、編集コマンドが完了すると、以下のスクリーンショットのように最終結果が元の結果の下に配置されます。

それぞれコマンドを含む2行を含む例。

私が望むのは最終結果です。変えるオリジナルライン。主な理由は、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

おすすめ記事