pit-rayの備忘録

知識のあうとぷっと

WindowsのためのVimキーバインディングツール ー win-vind 4.0

先日、win-vindの4.0.0をリリースしたので、その更新内容を書きます。

win-vindとは

 WindowsをVimライクに操作するための常駐ツールです。機能は次の通りです。

  • 独自の高速なバインディング機構
  • Vimライクなモード管理
  • マウスレスでGUIを操作
  • WebのフォームやOffice WordなどでVimライクなテキスト編集
  • ターミナルを開かずに、ターミナルを操作 (常駐ターミナル)
  • .vimrcライクな設定
  • ユーザ権限内でのキーリマッピング
  • VimやAutoHotKeyからのワンショット呼び出し

言い換えれば、バインディングと様々なユーティリティが備わったツールです。とりわけ、Vimユーザにとっては学習コストが小さいことが特徴です。

GitHub github.com

ホームページ (日本語に対応しています) pit-ray.github.io

v4.0の更新内容

低レベルなキーマッピング

 imap <capslock> <ctrl>のような構文で、低レベルなキーマッピングを行います。このキーマッピングの大きな特徴は、ユーザ権限内で利用できることと、トグルキーを通常のキーのように動作させることができる点です。例えば、AHKやPowerToysなどのキーマッピングでは、トグルキーにマッピングしたキーが押下状態のままになってしまうことが多々あります。対して、このマッピングではトグルキーの押下状態をモニタリングし、疑似的な押下状態の開放を行います。

 テスト段階では、非常に低負荷で動作しており、実用上の問題はありません。ただ、実装で述べているように、トグルキーの開放には数ミリ秒の遅延があります。この点、プルリクエストをお待ちしております。

ウィンドウを対話的に操作

f:id:pit-ray:20210624214823g:plain
Window Resizer Demo
 Vimのプラグインwinresizerに強く影響された機能です。

github.com

 デフォルトのバインディングはGUIノーマルモードで<C-w>eです。呼び出すと、リサイズ、移動、選択の3つのサブモードからなるウィンドウリサイザを利用できます。eキーでそれぞれのモードを切り替えることができ、どれもhjklによるスムーズな操作を行えます。ちなみに、ウィンドウリサイザの初期モードは、winresizer_initmodeオプションで変更できます。

set winresizer_initmode = 0 " リサイズモード
set winresizer_initmode = 1 " 移動モード
set winresizer_initmode = 2 " 選択モード
プロセス実行系の強化

ShellExecuteのラッパ
 まず、Windowsの有名なAPIであるShellExecuteのラッパを追加しました。デフォルトでは、:execute, :e, :editにマッピングされています。ShellExecuteは、エクスプローラでアイコンをダブルクリックしたのと同様の処理を行うAPIで、指定したファイルに関連付けられたアプリケーションでファイルを開きます。

 例えば、:e ~/.vimrcという風に実行すると、Vimで.vimrcファイルを開きます。URLも同様で、:e https://www.google.comのように実行すると、ブラウザでGoogleのトップページが開かれます。

:!コマンドの拡張
 :!コマンドの動作が、Vimとほぼ同じような動作になりました。従来のwin-vindは、事前に登録したエイリアスに従ってプロセスを起動する陳腐なものでしたが、v4からは指定したターミナルを介してプロセスを起動します。

 加えて、:!:shell:terminalなどのターミナルを起動するコマンドは、エクスプローラのウィンドウを選択しながら実行することで、そのディレクトリをカレントディレクトリとして起動します。

新たなオプションは、次の通りです。

set shell = powershell
set shellcmdflag = -c
set shell_startupdir = C:/Users  "このオプションを利用すると、カレントディレクトリが固定されます
インスタントモード

 一時的にGUIノーマルモードに移行し、コマンドを処理したら元のモードに戻る特殊なモードです。デフォルトのバインディングは、インサートモードで<F8>で、マップリーダのように利用します。例えば、インサートモードにいるとき<F8>FFと入力すると、このモードを介してGUIノーマルモードの機能であるEasyClickを呼び出すことができます。

 この機能が必要になった経緯は、インサートモードがキー入力を吸収しないという特性によるものです。インサートモードでのバインディングは、コマンドが他のアプリケーションのショートカットキーになっていないか、テキストとして入力されないかを意識しなければならず、その組み合わせに限りがあります。その点、このインスタントモードを活用すれば、GUIノーマルモードだけを管理すれば良くなります。

その他
  • --helpオプションを追加しました。
  • キーボードの配列を自動検出するようになりました。
  • タスクトレイに「起動時に起動するかどうか」ボタンを追加しました。
  • タスクトレイに更新確認ボタンを追加しました。
  • 従来のGUIを廃止することで、win-vindが高速に起動するようになりました。
  • 高速でキー入力をすると、キーが押下状態だと誤解する問題を修正しました。
  • ある状況において、1回のバックスペース入力で、仮想コマンドラインの文字が複数消える問題を修正しました。

最後に

 今回のバージョンアップのテーマは、導入コストを減らす普段使いに溶け込むです。特に、rcスタイルの設定は、懸念していたカスタマイズ性や学習コストの問題を大幅に解消できたと思います。今後の課題は、mapやnoremapのコマンドからコマンドへのマッピングや、トグルキーの遅延の問題などがありますが、のんびり改善していけたらと思います。