有馬総一郎のブログ

(彼氏の事情)

2022年02月05日 02:04:53 JST - 8 minute read - Vim

WindowsでもNeovim-qtを使う(起動中の既存インスタンスに接続してタブ表示していく)

長らく vim-skk/eskk.vimをインストールしてSKK生活を送ってきたが、遂にskk server機能が実装された1ので、 vim-skk/skkeletonを使うことにした。

でもって、Windowsの KaoriYa GVimでも使おうとしたら

[denops] Denops requires Vim 8.2.3081 or Neovim 0.5.0. See ":h 
g:denops_disable_version_check" to disable this check.

Kaoriya GVimは 8.2.1287 に対して、求められているのは 8.2.3081 とバージョン外。

IMEを無効化してくれるset imdisableが使えるのと、nvrとか使わなくても、起動中のインスタンスがあれば、それで開いてくれる thinca/vim-singletonが使えるので、どうしようかと思ったが、 Neovimを使うことにした。

昔はneovim-qt.exeequalsraf/neovim-qtで別配布されていたと思うけど、同梱されるようになったのね。 equalsraf/neovim-qtのreleasesは2020年から更新されてない。

何故か32bit

ダウンロードして、一応"C:\Program Files\Neovim\bin\nvim-qt.exe"として展開する。 nvim-win64.zip をダウンロードしたのに、タスクマネージャーで見ると32bitとある。64bit対応というだけで、Windows版64bitはないのか?

nvim-qt.exe

同じ疑問を持った人がいるようで、 Question) How can I get the 64-bit Version for Windows? · Issue #11397 · neovim/neovim · GitHubと質問しているが

64bit packages for macOS, Windows, and Linux are built daily and uploaded to:

https://github.com/neovim/neovim/releases

と回答されて、閉じられている。うん?どういうこと。prereleaseを試してみるも同じだった。また、 equalsraf/neovim-qtも32bitで表示される。

g:python_host_progがより厳格に

neovim-qt.exeを起動するとpythonが有効にならない。あれ、GVimだと動いてるのに、どうして…と思いつつhelp provider-pythonすると

Note: The old “neovim” module was renamed to “pynvim”. https://github.com/neovim/neovim/wiki/Following-HEAD#20181118 If you run into problems, uninstall both then install “pynvim” again: >

python -m pip uninstall neovim pynvim
python -m pip install --user --upgrade pynvim

とあるので、するも駄目。あれぇ、と思ったら、let g:python_host_prog = expand('~/AppData/Local/Programs/Python/Python37')とディレクトリになっていた。let g:python_host_prog = expand('~/AppData/Local/Programs/Python/Python37/python')としてOK。

Command to start Python 3 (executable, not directory).

と書いてあるじゃないか!しかし、GVimだとディレクトリ指定でも動いちゃうんだよねぇ。いやぁ恥ずかしい。

redir @*> するとクリップボードが壊れる

redir @*>
silent message
reider end

したら

clipboard: error invoking win32yank.exe: thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: WinAPI Error(1418)', src\libcore\result.rs:859 note: Run with `RUST_BACKTRACE=1` for a backtrace`

というエラーが。しかも、他のGUIアプリとかまでに影響が出てクリップボードがおかしくなった。

ググって win32yank crashes when pasting from vim in WSLを見ると ginit.vimcall GuiClipboard()を追記しろ、とのこと。解決。

nvrがWindowsではフォークできない

thinca/vim-singletonが使えないなら、 mhinz/neovim-remoteを使おうとするも Creating a new process on Windows · Issue #133 · mhinz/neovim-remote · GitHubに見られるように、Windowsではnvrがうまくフォークできない。

issueの後に続く回答にあるとおり、 AutoIt2invrau3.zipを使えば解決できる。なので、面倒だなぁ、と思いつつやってみた。nvrは勿論、インストールした上で以下を行う。

AutoItのインストールはよく分からないが、自分は以下のとおり行なった。

  • 64-bit Operation System Support

    • Use x86 tools by default (recommended for compatibility)
AutoIt
  • Default for *.au3

    • Run the script
AutoIt
  • Choose Components

    • AutoIt Core Files (require
    • Script Examples
    • UDF Script Examples
AutoIt

そして、 invrau3.zip を解凍して、 invr.au3 を右クリックする。コンテキストメニューにCompile Scriptというが表示されるので、選択。すると、 invr.exe が出来る。 invr.exe が出来てしまえば、AutoItはアンインストールしても動くようなので、自分はアンインストールした。

AutoIt

動作の確認としては、issueに書かれたとおり、まずはPowerShellで行う。

nvim-qt.exe -- --listen '127.0.0.1:7777'
."C:\Users\ユーザー名\bin\invr.exe" --remote-send ':tabe "C:\src\log.txt"<cr>'

環境変数NVIM_LISTEN_ADDRESSを設定している場合は、invrはそちらを見に行くので、設定しないか、--listenのアドレスを合わせておく。2行目は先頭にドット.を付けるのを忘れないこと。またtabnew :eとしてあったが、自分の環境だと空のバッファが表示される3だけでなので、そこはtabeとした。

上記はPowerShellで行なう場合だけどもcmdの場合は以下となる。

nvim-qt.exe -- --listen 127.0.0.1:7777
"C:\Users\ユーザー名\bin\invr.exe" --remote-send ":tabe ""C:\src\log.txt""<cr>"

シングルコーテーション'が付いてるとエラーになるので、外すか、ダブルコーテーション"とすれば実行できた。2行目のダブルコーテーションの中のダブルコーテーションは、何故かエスケープしなくても開いたけど、一応""と重ねるのが正しいのかな?

既存のNeovimで編集

仕組みが確認できたところで、エクスプローラー上のコンテキストメニューとして 既存のNeovimで編集(Edit with existing Neovim) を追加して、上記、確認したコマンドで起動しているインスタンスで開くようにレジストリにエントリを追加する。

右クリックメニューにアイテムを追加する - Windows 10が参考になった。

既存のNeovimで編集.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\既存のNeovimで編集\command]
@="\"C:\\Users\\ユーザー名\\bin\\invr.exe\" --remote-send \":tabe \"\"%1\"\"<cr>\""
既存のNeovimで編集

issueだとシングルコーテーション'を使っていたり、<cr>が抜けていたが、上記の通り"C:\Users\ユーザー名\bin\invr.exe" --remote-send ":tabe ""%1""<cr>"と設定した。invr.exePATHに追加してあってもフルパスで記述する必要があるのと、%USERPROFILE%など環境変数は、レジストリ値として使えなかった。

設定後、試すもファイルの関連付け設定ダイアログが表示される場合はinvr.exeのパス指定が失敗している可能性がある。

そして、タスクバーなどにピン留めした nvim-qt のプロパティのリンク先を"C:\Program Files\Neovim\bin\nvim-qt.exe" -- --listen 127.0.0.1:7777としておいた。

既存のNeovimで編集 だけでなく Windows でファイルを開くときに既存の GVim 内のタブで開く | まくまくVimノートのように

/HKEY_CLASSES_ROOT/Applications/gvim.exe/shell/open/command の値を “C:\app\vim73-kaoriya\gvim.exe” –remote-tab-silent “%1” のように変更

を真似て[HKEY_CLASSES_ROOT\Applications\nvim-qt.exe\shell\open\command][HKEY_CLASSES_ROOT\*\shell\既存のNeovimで編集\command]と同じ値にしてしまえば、nvim-qt.exeが起動していない状態からでも、ダブルクリックでの通常のファイルの開き方でも、既存インスタンスから起動できるようになった。ただし、初回起動時は、無題が開いた上で、タブ表示される。

それが躊躇われる場合は、-- --listen 127.0.0.1:7777 だけ追加して

- `"C:\Program Files\Neovim\bin\nvim-qt.exe" "%1"`
+ `"C:\Program Files\Neovim\bin\nvim-qt.exe" -- --listen 127.0.0.1:7777 "%1"`

することで、一回目だけダブルクリックして開き、次に 既存のNeovimで編集 で開けば、余計な無題は表示されない。

送るshell:sendto

あれこれ試すと、上記のようにコンテキストメニューを追加しなくても、 送る shell:sendto にショートカットを追加することで 既存のNeovimで編集 と同じ?動作ができる。いつものようにC:\Program Files\Neovim\bin\nvim-qt.exeへのショートカットを置くだけでは、駄目だけど、そのショートカットーのリンク先をC:\Users\ユーザー名\bin\invr.exe --remote-send ":tabnew<cr>"とすれば良い。

nvim-qt.exe

コマンド履歴をみるとtabnewが実行されているようで、その新規バッファにドロップダウンしたような動き4となるようだ。tabeでも同じ動きとなるが引数を必要としてないのでtabnewとした。下手にtabe %1とすると、編集中のファイル名1が開いた上で、送る対象のファイルが表示される。

リンク先をinvr.exeとしたせいでアイコンが未指定の状態になってしまうが、それは後からC:\Program Files\Neovim\bin\nvim-qt.exeを選択すればneovim-qtのアイコンに戻る。

これが出来ることが分かったので 既存のNeovimで編集 のレジストリ編集は止めた(削除した)。

後は、IMEが自動で無効化になればなぁ、とは思うものの贅沢はいうまい。


追記 2022-02-18
Windowsで’vim-skk/skkeleton’を使うで記述したとおり、 SKK日本語入力FEPfcitx5はIMEを無効のまま起動することができる。
追記ここまで


  1. Merge pull request #1 from kuuote/feature/skk-server · vim-skk/skkeleton@6719093 · GitHub ↩︎

  2. v3.3.14.5 ↩︎

  3. tabnewが先頭にあるためにその後の文字列が無視されているのではないか? ↩︎

  4. これまで自分は送るはリンク先のコマンドに、送る対象のファイルパスが引数として追加されて、実行されてると思っていたけど、実際はリンク先にドロップダウンした動きするんだなぁ。多分。 ↩︎

Tags: Vim Windows

NextcloudをWeb画面から21にアップグレードする Windowsで'vim-skk/skkeleton'を使う