長らく 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.exe
は
equalsraf/neovim-qtで別配布されていたと思うけど、同梱されるようになったのね。
equalsraf/neovim-qtのreleasesは2020年から更新されてない。
何故か32bit
ダウンロードして、一応"C:\Program Files\Neovim\bin\nvim-qt.exe"
として展開する。 nvim-win64.zip をダウンロードしたのに、タスクマネージャーで見ると32bitとある。64bit対応というだけで、Windows版64bitはないのか?
同じ疑問を持った人がいるようで、 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:
と回答されて、閉じられている。うん?どういうこと。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.vim にcall GuiClipboard()
を追記しろ、とのこと。解決。
nvr
がWindowsではフォークできない
thinca/vim-singletonが使えないなら、
mhinz/neovim-remoteを使おうとするも
Creating a new process on Windows · Issue #133 · mhinz/neovim-remote · GitHubに見られるように、Windowsではnvr
がうまくフォークできない。
issueの後に続く回答にあるとおり、
AutoIt2、
invrau3.zipを使えば解決できる。なので、面倒だなぁ、と思いつつやってみた。nvr
は勿論、インストールした上で以下を行う。
AutoItのインストールはよく分からないが、自分は以下のとおり行なった。
-
64-bit Operation System Support
- Use x86 tools by default (recommended for compatibility)
-
Default for *.au3
- Run the script
-
Choose Components
- AutoIt Core Files (require
- Script Examples
- UDF Script Examples
そして、 invrau3.zip を解凍して、 invr.au3 を右クリックする。コンテキストメニューにCompile Script
というが表示されるので、選択。すると、 invr.exe が出来る。 invr.exe が出来てしまえば、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>\""
issueだとシングルコーテーション'
を使っていたり、<cr>
が抜けていたが、上記の通り"C:\Users\ユーザー名\bin\invr.exe" --remote-send ":tabe ""%1""<cr>"
と設定した。invr.exe
はPATH
に追加してあってもフルパスで記述する必要があるのと、%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>"
とすれば良い。
コマンド履歴をみると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日本語入力FEP、fcitx5
はIMEを無効のまま起動することができる。
追記ここまで
-
Merge pull request #1 from kuuote/feature/skk-server · vim-skk/skkeleton@6719093 · GitHub ↩︎
-
v3.3.14.5 ↩︎
-
tabnew
が先頭にあるためにその後の文字列が無視されているのではないか? ↩︎ -
これまで自分は
送る
はリンク先のコマンドに、送る
対象のファイルパスが引数として追加されて、実行されてると思っていたけど、実際はリンク先にドロップダウンした動きするんだなぁ。多分。 ↩︎