概要
vimのterminalでシェルを開いたとき、その中でさらにvimを開いてしまって困ることはありませんか?
これはterminalのbashの中でさらにvimを開いている状態ですので、
レジスタもバッファも別のものになります
pstreeで表示するとこんな感じ
`-vim memo.md
`-bash
`-vim hoge.md
vimのクライアントサーバー機能を使うと一つのvimにまとめることが出来ます
(gvimを使った事がある人は「既存のvimで開く」みたいなメニューがあると思うのでイメージしやすいかと思います)
terminal内で開いたvimが既存のvimタブで表示されています
設定
この機能はXサーバーの機能を使いますので, vim-gtkをインストールします
(今回はUbuntu20.04でやってみました)
sudo apt install vim-gtk
Xサーバーが既に走っているなら問題ないですが、無い場合はxvfb等でxserverだけ上げます
sudo apt install xvfb
sudo bash -c "curl -L https://git.io/JfDyE > /etc/systemd/system/xvfb.service"
# User, Groupを適宜変更
sudo vi /etc/systemd/system/xvfb.service
sudo systemctl enable xvfb
sudo systemctl start xvfb
bashrc に 以下のようなaliasを追加します
alias vim="DISPLAY=:1 vim --servername vim1 --remote-tab-silent"
この設定を入れると、tmux等で開いた新しいシェル内で起動したvimもまとめる事ができます
以下のコマンドで, VIM1というサーバーが見えると思います
# aliasを解除するために、バックスペースを付けてvimを実行しています
\vim --serverlist
その他詳しいことはvimのヘルプを参照ください
:h client-server
その他
vim内のシェルに限定すれば、terminal apiを使っても出来ると思います
開いたターミナル側から、親のvimに対して命令が出せる機能です
ファイルを開くときに、カレントディレクトリの情報が伝わらないので、フルパスで指定しないといけないかもしれませんが手軽に出来るかと思います
詳しくはヘルプを参照してください
:h terminal-api
vim から開いたコンソールには $VIM_SERVERNAME
, $VIM_TERMINAL
という変数が設定されます
tmuxから開かれたシェルは既存のvimにまとめたくない場合などは、こちらの変数を見て分岐するといいかもしれません
以下のような設定で親のvimで開くことができます
alias vim="DISPLAY=:1 vim --servername $VIM_SERVERNAME --remote-tab"