LoginSignup
4
6

More than 3 years have passed since last update.

vimをちょっと便利にするクライアントサーバー機能

Last updated at Posted at 2020-06-08

概要

vimのterminalでシェルを開いたとき、その中でさらにvimを開いてしまって困ることはありませんか?

ng.gif

これはterminalのbashの中でさらにvimを開いている状態ですので、
レジスタもバッファも別のものになります

setumei.png

pstreeで表示するとこんな感じ

 `-vim memo.md
     `-bash
         `-vim hoge.md

vimのクライアントサーバー機能を使うと一つのvimにまとめることが出来ます
(gvimを使った事がある人は「既存のvimで開く」みたいなメニューがあると思うのでイメージしやすいかと思います)

ok.gif

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"
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6