NeovimのターミナルをExコマンド実行環境化する

by

Neovim内に開いたTerminalで:から始まる文字列を入力すると、Neovimで実行した結果を表示する仕組みを作ってみました。

Zshプラグインとして利用できます。

https://github.com/atusy/zsh-nvrepl

解説

Zshにはzleというプロンプトに入力している文字列(バッファ)を編集する機能があります。

また、bindkeyというVimのようにキー入力をなんらかの関数にマッピングする機能もあります。

これを使い、Enterしたら、バッファが:で始まるか確認し、:始まりならNeovim経由で実行し、その他はZsh上で実行します。

:qすると、ターミナルが閉じるようになるのも便利ですね!

コマンドとその結果をNeovimとやりとりする方法にはneovim-remoteを使っています。

function nvr-or-accept-line() {
  # バッファが:で始まる場合はNeovimに実行させ結果を表示する
  if echo $BUFFER | grep --silent "^:"; then
    # コマンドをNeovimに実行させ、出力を受けとる
    local RES="$( nvr --remote-expr "execute(\"${BUFFER//\"/\\\"}\")" )"

    # 出力を表示する
    printf "$RES"

    # <C-C>っぽいことして現在のZshのバッファを終了する
    zle send-break
    return
  fi

  # Neovimに送らない時は普通に処理する
  zle accept-line
}

# Enterキーでnvr-or-accept-lineが発動するようにマッピング
zle -N nvr-or-accept-line
bindkey '^m' nvr-or-accept-line

Enjoy!