📑

neovim remote

2023/06/20に公開

TL; DR

  • vscode (+ code-server) 的なことが neovim でもできる
  • サーバー nvim --listen ~/.cache/nvim/server.pipe --headless
  • クライアント nvim --server ~/.cache/nvim/server.pipe --remote-ui

neovim remote

  • neovim にはリモートと通信ができる機能がある
  • https://neovim.io/doc/user/remote.html
  • これを使って、リモートのneovimに対して操作が可能
    • 例えば、nvim --remote-send "<C-\><C-N>:n filename<CR> のようなことができる
    • "<C-\><C-N>:n filename<CR>" のコマンドをリモートのneovimに送信する
  • --headless オプションと --listen オプションを組み合わせればサーバーのように起動できる
    • --headless UIなしで起動
    • --listen address addressで待ち受ける
  • --remote-ui オプションと --server オプションで、クライアントとしてリモートのneovimに接続できる
    • --remote-ui リモート側のUIを利用
    • --server address addressに接続する
  • address には UNIXソケットやip:port形式が指定できる
  • これらを使うことで例えば、dockerコンテナの中のneovimにホストから接続できる
    • VSCode の Remote Container (Dev Containers) に近いこと

dockerコンテナ内のneovimにホストのneovimから接続してみる

  • dockerコンテナ内のneovimにホストのneovimから接続してみる
    • 今回は、ポートを開けておいて、ip:port指定で接続する
  • docker コンテナを立ち上げる
    • このときポートを開けておく (今回は適当に 22222番)
docker run --rm -it -p 22222:22222 ubuntu:latest bash
  • コンテナ内のbashが操作できるようになるのでneovimをダウンロードしていく
apt update -y && apt install -y curl
curl -LO https://github.com/neovim/neovim/releases/download/stable/nvim-linux64.tar.gz
tar xzf nvim-linux64.tar.gz
# ./nvim-linux64/bin/nvim でneovimが起動できる
  • コンテナ内でサーバーとしてneovimを起動
./nvim-linux64/bin/nvim --headless --listen 0.0.0.0:22222
  • ホスト側でも stable のneovimをインストール (既にインストールされていたらスキップ)
  • 別のターミナルでサーバーの (コンテナ内の) neovimに接続
nvim --remote-ui --server localhost:22222
  • これで dockerコンテナ内のneovimに接続できた
  • いろいろコマンド実行してみて、コンテナの中にいることを確認
    • :pwd してみると /
    • :!whoami" してみると root

その他

  • リモート側で実行していることになるので、:term で開いたターミナルはリモート側のシェル (上記の例だとコンテナ内のシェル)
  • LSPもリモート側でインストールできる (バージョンの使い分けが上手くできそう)
  • devcontainerと組み合わせると相性よさそう
  • ホスト側で --remote-ui してるので、リモート側のUIを使っていそう (この点はVSCode + code-server の場合とは違いそう)

Discussion