Neovim内に開いたTerminalで:
から始まる文字列を入力すると、Neovimで実行した結果を表示する仕組みを作ってみました。
Zshプラグインとして利用できます。
解説
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!