マイクロソフトのVisual Studioに付いている、コードの入力支援機能インテリセンス(IntelliSense)。
入力候補のメソッドやプロパティを表示してくれるのは便利だが、どれかひとつ選ぶのにカーソル移動が必要になる。右手を十字キーかマウスに移すと、ホームポジションが崩れてしまうのが悩みだった。
Visual Studio内で簡単なショートカットを割り当て、3Dゲーム風にWASDを真似したIJKLカーソル移動を実現してみた。ちょっとした工夫で大幅に作業効率を上げられるかもしれない。
※以下の内容はWindows8.1、VisualStudio2017および2019で動作検証しています。
デフォルトのショートカットはない
インテリセンス関連のショートカットについて調べたが、「入力候補のカーソル移動」については割り当てがない。
メンバー表示や「完了/提案モード」の切り替えといったキーは用意されている。しかし表示された候補のひとつを選ぶには、十字キーかマウス操作が必要だ。
外部ツールを使う方法
単純に思いついた対策のひとつは、ChangeKeyやAutoHotkeyという外部ツールを使って任意のショートカットを設定する方法。
CtrlやShiftを組み合わせたり、普段使わないCapsLockを潰したりもできる。Visual Studio自体にそなわった、他のショートカットと競合しないパターンも見つかるだろう。
しかしこの方法だと開発環境が変わった場合に、使い慣れたショートカットを容易に再現できない。
外出中に借りたマシン、会社で割り当てられたPCでは、変なツールを入れられないかもしれない。特にChangeKeyはレジストリの書き換えを伴うため、不測のトラブルも懸念される。
Visual Studio内でショートカット設定
汎用性とリスクを考えると、あまりおおげさなことはしたくない。次にVisual Studio自体のショートカット設定で解決できないか考えてみた。
参考サイト2案
キー配置の参考にさせていただいたのはこちらのサイト。
Ctrl+ShiftとHJKLキーを組み合わせて、vi風のカーソル移動をVisual Studioで実現している。
同じやり方を試してみたが、Ctrl+Shift+○ではなく左Alt+○で設定した方が楽に感じた。左手・右手の指1本ずつで入力できる。
さらにFPSゲームの前後左右移動を真似して、右手IJKLで凸型に配置する方法もあると知った。以下のサイトではAutoHotkeyを用いて実現している。
快適キーボード操作のためのキーカスタマイズ 〜Windows編〜
ホームポジションから右手の指が移動する距離は、vi流のHJKLとほぼ同じ。凸型のキー配置がビジュアル的に上下左右と一致するため、こちらの方が覚えやすかった。
最終決定案
上記のWASD案を参考に、Hと;(セミコロン)キーにもショートカットを追加して以下のパターンに落ち着いた。
- Alt+I…編集.1行上へ(全体)
- Alt+J…編集.左に1文字移動(全体)
- Alt+K…編集.1行下へ(全体)
- Alt+L…編集.右に1文字移動(全体)
- Alt+H…編集.行頭に移動(全体)
- Alt+;…編集.行末に移動(全体)
WASD式の移動に加え「左の左はHome」「右の右はEnd」と直感的にわかりやすいレイアウト。自分の場合は十字キーのカーソル移動と同じくらい、Home/Endのキーも使う。
Altキーが空いていた
ちなみに右AltキーはUS配列キーボードのIMEオンオフに割り当てているため、左Altのみ使用している。
Altキーは親指を折り曲げたかたちで押すため、CtrlやShiftよりは使いにくい。しかし後者はVisual Studioデフォルトのショートカットと競合してしまうため、大幅な設定変更が必要になってしまう。
必要最小限のキー編集でカーソル移動を実現するには、Altキーとの組み合わせが早いと思った。
ShiftとCtrlを使わない理由
Shift+○は大文字/小文字の切り替えに使うためか、Visual Studioのショートカットとしては設定できなかった。
Ctrl+○の場合、たとえば以下のような既存ショートカットと競合してしまう。
- Ctrl+H…編集.置換(全体)
- Ctrl+I…編集.インクリメンタル検索(テキストエディター)
- Ctrl+K…編集.クイックヒント(テキストエディター)
- Ctrl+L…編集.行の切り取り(テキストエディター)
- Ctrl+;…ウィンドウ.ソリューションエクスプローラーの検索(全体)
コーディング中は(全体)よりも(テキストエディター)で設定したショートカットが優先されてしまうようだ。
ためしに(全体)でCtrl+I/H/J/K/L/;など設定してみたが、検索やクイックヒントが作動してしまい、うまくいかなかった。
これらの初期設定を無効化・上書きしてもよいが、後々トラブルになりそうな予感がする。
Visual Studioのキー設定方法
上部メニューの「ツール>オプション」を選び、左列から「環境>キーボード」を選択。
ショートカットを設定可能な操作が無数に表示されるので、「以下の文字列を含むコマンドを表示」に適当な単語を入力して選択肢を減らす。
カーソル移動に関するものとしては、「1行」「1文字」「行頭」「行末」などで候補を絞り込める。
続いてダイアログ画面下の方の「ショートカットキー」から任意のキーを組み合わせて入力し、「割り当て」ボタンを押す。カーソル移動を設定するなら「使用する場所」は「全体」でOK。
間違って割り当ててしまった場合は、その上の「選択したコマンドへのショートカット」から選んで削除できる。
もし既存設定とバッティングしていれば、その下の「現在使用されているショートカット」というプルダウンメニューに対象のコマンドが一覧表示される。
たとえばCtrl+Kは2段階ショートカットの最初に使われるため、12もの機能がプリセットされている。
このような主要ショートカットは上書きしない方が無難だと思う。
どこまでショートカット設定するか
これでホームポジションに手を置いたまま、上下左右・行頭・行末移動が可能になった。インテリセンスの候補選択もCtrl+I/Kで上下移動が可能。
慣れるまでは指が滑って、Ctrl+J/Lの左右1文字移動を押してしまいやすい。間違って押すとインテリセンスが解除され、カーソルが左右に動いてしまう。
インテリセンスに特化するなら、上下移動の以外のショートカットは設定しない方がいいかもしれない。
フルサイズもしくはテンキーレスのキーボードで十字キーやHome/Endが付いているなら、そこまでショートカットのカーソル移動にこだわる必要はない。
viかEmacsか
上下左右をHJKLキーに割り当てるのはviやVimに慣れた人向けだ。
Visual StudioにはVsVimという拡張機能があるので、独自にショートカットを設定するよりこれを導入した方が早いのかもしれない。
もうひとつEmacs式にPNBFキーを用いてカーソル移動するという手もある。
EmacsのショートカットはuP、Down、Forward、Backwardという移動を意味する英単語から取られているようだ。上移動はUpのUでよさそうなものだが、なぜ遠く離れたPなのかは謎。
Emacsに比べると、viの設定は右手ホームポジションから小指セミコロンを除いたHJKLの4文字。左から「上下左右」と覚えやすいうえ、こちらの方が指の移動も少なく合理的に思われる。
学生時代にUnixやLinuxを使っていたときは、どちらかというとviよりEmacsで作業していた。しかし10年以上のブランクがあると、ショートカットの使い方はすっかり忘れてしまっている。
あらためて比べるとEmacsよりvi式のカーソル移動の方が便利だと思う。そして特にこれらのエディターになじみがなければ、今回提案したFPSゲーム風のWASD→IJKL設定がベターでないかと思う。
左手Alt+WASDも可能
ちなみに左手だけのショートカットでWASDカーソル移動をそのまま実現できないだろうか。
操作が片手で済めば、とっさのときに素早く入力したり、空いた右手で別の作業をしたりできる。
Ctrlキーとの組み合わせは、「Ctrl+A=すべて選択」や「Ctrl+S=上書き保存」など重要なショートカットと競合してしまう。しかしAltキーとであれば、右側IJKLと同様に問題なく設定できた。
独自キーの設定前は、
- Alt+W…ウィンドウ
- Alt+S…テスト
- Alt+D …デバッグ
など上部のメニューにフォーカスが移ってしまう。しかし設定後は(全体)ショートカットが優先されるようだ。
Alt+IJKLとAlt+WASDのカーソル移動は重複設定・共存できた。
- Alt+W…編集.1行上へ(全体)
- Alt+A…編集.左に1文字移動(全体)
- Alt+S…編集.1行下へ(全体)
- Alt+D…編集.右に1文字移動(全体)
しばらく作業してみて、どちらが便利か検討してみたい。
コード補完、完了/提案モードの違い
候補選択の上下移動は存在しなかったが、インテリセンスにはいくつか使えそうなショートカットが初期設定されている。
まずCtlr+Alt+Spaceで「完了/提案モード」の切り替えができる。
デフォルトでは「完了モード」になっており、SpaceやEnterキーを押すと選択中の用語が自動入力される。
これに対して「提案モード」では、明示的にTabキーを押すまで候補が確定されない。そのため基本的には自力で入力して、インテリセンスは補助的に使いたい人には向いている。勝手にコード補完されてイライラすることがなくなる。
見た目の違いとしては「提案モード」の場合、自分で入力中の文字列が候補の最上段に独立して表示される。
上の画像の状態でEnterを押しても、候補として選択中のWriteが補完されず、Writという中途半端な状態のままインテリセンスが解除され改行される。
インテリセンスの手動呼び出し
また単語を途中まで入力した段階でCtrl+Jを押すとメンバーの一覧、Ctrl+Spaceだと入力候補の一覧を手動で表示されることができる。
たとえば既存コードを修正する場面。
入力済みのフィールドやメソッドの末尾にカーソルを合わせてCtrl+Jを押すと、ほかのメンバーリストを表示できる。ここから変更したいものを選べば、もとの語を消さなくても置き換えられる。
メンバー名がうろ覚えな場合、末尾から数文字削除して途中段階の用語に対してCtrl+Spaceを押すと、その時点で選択可能なメンバー候補が表示される。
Ctrl+JとCtrl+Spaceはいちからコーディングする際には使わない。既存コードを再編集する場合に使い分けると、威力を発揮するショートカットだ。
インテリセンス・スニペット推奨派
よほどのコーディング上級者でなければ、インテリセンスに頼って作業を進めた方が打ち間違いを防げるだろう。for文やtry-catchのブロックを自動挿入できる、スニペット機能も同様。
昔のように、おまじないとして暗記したコードを入力する楽しみは減る。その代り生産性や保守性は高まると思う。