vimコマンドの履歴を共有する方法はありますか?


8

Vimコマンド履歴をインスタンス間でリアルタイムに共有できますか?

つまり、この方法で人々がbashで何をするかを意味します。

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

つまりecho test1、あるシェルでコマンドを実行してからUp、別のシェルで押すと、が表示されecho test1ます。(正確には、それが機能EnterするUpためには、前に押す必要があります。)

これはVimで可能ですか?最初は、+clientserverオプションを使用するとうまくいくと思いました。しかし、それは別のことのようです。


回答:


13

コマンド履歴はviminfoファイル(:help viminfo)に保存されます。通常、これは起動時に読み取られ、終了時に書き込まれますが、:wviminfoおよびの組み合わせを使用して、Vimインスタンス間で明示的に永続化および同期することができます:rviminfo。これにより情報全体が同期されることに注意してください。つまり、内容、マーク、バッファリストなども登録します。



1

Vimで取得できる最も近いのは(Ingoの回答とクリスチャンのコメントにあるように)です。

augroup viminfo
    autocmd!
    autocmd FocusLost   * wviminfo
    autocmd FocusGained * rviminfo
augroup end

Focus*端末からVimを使用する場合、特にtmuxまたはscreenを使用している場合は特に、自動コマンドが常に実行されるとは限らないことを理解することが重要です。まず、を使用してこれをテストする必要があり:au FocusLost :echoerr "Focus lost!"ます。

私の知る限り、これらのオートコマンドが機能しない場合の適切な回避策はありません。他のイベント(などCursorHold)の使用は、ほぼ確実に発生するタイミングの問題のため、私には問題があるようです。


Neovimには、Vimのviminfoシステムに置き換わる「ShaDa」が付属しています。それがより良い1つの側面は、異なるインスタンスからのファイルをマージすることです、そしてそれは複数のインスタンス間の同期を直接サポートしていませんが(まだ)、これは少なくとも1人のNeovim開発者にとってうまく機能するようです:

augroup shada
  autocmd!
  autocmd CursorHold * rshada | wshada
augroup end

:help shada-mergingマージプロセスの詳細については、を参照してください。


注:Vim 8では、入力されたコマンドにタイムスタンプが付けられるため、マージ機能も導入されていると思います。参照:h viminfo-timestamp
クリスチャンブラバンド

この回答を@ChristianBrabandtに投稿する前に自分のシステムで試してみましたが、うまく機能しないようでした。多分私は何か間違ったことをしました。
マーティンTournoij

おそらくバグですか?@ vim-devリストにある再現可能な良い例が必要です
Christian Brabandt 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.