輪ごむの空き箱

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を切り替える方法について書きました。