Wagomu no Akibako

Windowsでdenops shared serverを使ったり使わなかったりする


この​記事はVim駅伝2024年1月31日(水)の​記事です。

前回の​記事は​ Liquid_systemさんの​「新世代の​neovimプラグインマネージャlazy.nvimの​紹介」と​いう​記事でした。

次回の​記事は​ 2月2日(金) に​投稿される​予定です。


はじめに

Windows使い​(WSLではない)の​Vimmerが​denopsプラグインを​使うと、​ある​問題に​気が​付きます。​それは​denopsの​サービス起動が​ゆっくりである​ために​プラグインを​使えるまでに​すこし時間が​かかってしまうと​いう​ことだ。

この​問題を​解決する​ために​多くの​Windows​使いの​Vimmerはdenops-shared-server.vimと​いう​プラグインを​別途入れています。​これは​プラグイン名の​とおり、​共有サーバー を​立ち上げて​その​サーバーに​対して​Vimが​アクセスする​ことに​よって​起動毎に​denopsの​サービスを​立ち上げる​必要が​なくなり起動速度が​向上する​プラグインです。

しかし、​shared serverを​使っても​ごく​まれに​起動速度が​遅いことがります。​そのような​ときは​PCの​再起動あるいは​denops shared serverの​再起動で​大抵の​場合復活します。​それらを​するのが​面倒な​とき​自分は​shread serverを​介さずに​Neovimを​起動しています。

本編

前​置きが​長くなってしまいましたが​ここからが​結論で​あり本編です。​どう​したら​denops shared serverを​使ったり​使わなかったりと​いう​切り​替えが​できるのでしょうか。

nvimコマンドの​ヘルプを​みると--cmdフラグを​つける​ことに​よって、​設定の​前に<cmd>を​実行できると​書いています。

$ nvim -h
Usage:
  nvim [options] [file ...]

Options:
  --cmd <cmd>           Execute <cmd> before any config
  +<cmd>, -c <cmd>      Execute <cmd> after config and first file
  -l <script> [args...] Execute Lua <script> (with optional args)
  -S <session>          Source <session> after loading the first file
  -s <scriptin>         Read Normal mode commands from <scriptin>
  -u <config>           Use this config file

  -d                    Diff mode
  -es, -Es              Silent (batch) mode
  -h, --help            Print this help message
  -i <shada>            Use this shada file
  -n                    No swap file, use memory only
  -o[N]                 Open N windows (default: one per file)
  -O[N]                 Open N vertical windows (default: one per file)
  -p[N]                 Open N tab pages (default: one per file)
  -R                    Read-only (view) mode
  -v, --version         Print version information
  -V[N][file]           Verbose [level][file]

  --                    Only file names after this
  --api-info            Write msgpack-encoded API metadata to stdout
  --clean               "Factory defaults" (skip user config and plugins, shada)
  --embed               Use stdin/stdout as a msgpack-rpc channel
  --headless            Don't start a user interface
  --listen <address>    Serve RPC API from this address
  --remote[-subcommand] Execute commands remotely on a server
  --server <address>    Specify RPC server to send commands to
  --startuptime <file>  Write startup timing messages to <file>

See ":help startup-options" for all options.

と​いう​ことはnvim --cmd "let g:useShared=v:true"で​起動する​ことに​よってuseSharedと​いう​変数を​定義できると​いうわけです。​あとは、​変数が​trueに​なっているかを​判断すれば​いいので​このような​コードを​書けば​OSが​Windows且つ、useSharedtrueの​ときには​shared serverに​接続しに​いく​ことができます。

if vim.uv.os_uname().sysname == "Windows_NT" and vim.g['useShared'] == true then
  vim.g['denops_server_addr'] = '127.0.0.1:32123'
end

shared serverを​使いたい​ときに​毎度​この​コマンドを​打つのは​非常に​面倒なので、
Windows ユーザは​ cmd.exe で​生きるべき 2020年版
この​ブログ投稿を​元にinit.macrosに​下記の​エイリアスを​定義しています。

n=nvim --cmd "let g:useShared=v:true" $*
nn=nvim $*

これに​よりnで​shared serverを​使って、nnでは​通常の​起動が​できるようになっています。

おわりに

## はじめにでも​書きましたが​大抵の​場合shared serverの​再起動で​問題は​解決できるので​わざわざnnから​Neovimを​起動する​ことは​ありません。​しかし​稀に​役に​立つことがあるので​残しています。

今日は​denops shared serverを​切り​替える​方​法に​ついて​書きました。