外部からvimと話す


12

vimのインスタンスの変数を別のシェルから(tmuxを介してキーを送信せずに)変更できますか?

latexmkのcompiling_cmd、success_cmd、およびfailure_cmdオプションを使用して、ステータスラインにコンパイルステータスを表示したいので、お願いします。

おそらく、特定のファイルの存在または非存在をvimに見てもらうことができます(ブール変数としてファイルを使用)?しかし、これは少し汚いようです。うまくいけばもっと良い方法があります。

回答:


19

引数を指定して最初のVimセッションを起動する場合--servername VIM

$ vim --servername VIM

その後、引数を使用して他のシェルからコマンドを送信できます--remote-send

たとえば、ステータスラインを使用して変数の値を表示g:myvarし、vimrcに次の行がある場合:

let g:myvar = "foo"
set stl+=%{g:myvar}

次に:let g:myvar = "bar"、別のシェルからその値()を変更できます。

$ vim --remote-send ':let g:myvar = "bar"<cr>'

ステータスラインは、値の変更を反映する必要があります。


最後のコメントにあるように、Vimインスタンスが通常モードでない場合、前のコマンドは期待どおりに機能しません。もっとシンプルかもしれませんが、2つの解決策があります:

1)キー<esc>を追加して通常モードにする
2)式を評価する--remote-expr代わりに引数を使用して--remote-send、コードに変数に新しい値を割り当てる小さなヘルパー関数を作成する

最初の解決策:

$ vim --remote-send '<esc>:let g:myvar = "bar"<cr>'

2番目の解決策:

vimrcで次の関数を定義します。

function! Myfunc(value)
    let g:myvar = a:value
endfunction

次に、シェルで:

$ vim --remote-expr 'Myfunc("bar")'

ありがとうございました!この機能はコンパイルされていないので、再コンパイルします。うまくいけば、neovimでも同じです。
歯磨き

3
@Lawrence私は間違っているかもしれませんが、neovimはこの+clientserver機能を実装していないと思います(github.com/tpope/vim-dispatch/issues/163#issuecomment-175383047)。その場合、このプラグインが役立つかもしれません:github.com/mhinz/neovim-remote
user9433424

これはtmuxでキーを送信するのと同じ効果があり、vimサーバーがどのモードであるかを知ることに依存しているようです(例では通常モードを想定しています)。理想的には、変数を直接設定できるようにしたいと思います。
歯磨き
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.