概要
普段VSCodeにEmacsキーバインドの拡張機能を入れてコーディングを行っているのですが、VS2022を使う機会が増えてきたので、VSでも同じようなキーバインドを使いたいと思いいろいろ設定したので、メモとして残します。
拡張機能
なにはともあれ、Emacsキーバインドを使用できるようにする拡張機能を入れます。
Marketplace の Emacs Emulation
まずVisual Studio Marketplace に公開されている Emacs Emulationを入れたのですが、こちらではset-markで選択した範囲を一括で削除することができませんでした。
Fork版 Emacs Emulation
いろいろ探してみたところ、以下の記事を見つけました。
Visual StudioのEmacs Emulationで選択範囲を一気に消せるぞ! - プログラムdeタマゴ
現在MarketplaceにアップされているソースをForkして、選択範囲削除をできるように変更されている方がいらっしゃるようです。(ありがたい)
記事に紹介されているリポジトリのdelete-selection-modeブランチをビルドして、インストールするとうまく動作してくれました。
※ ちゃんと会話内容を追い切れていないようですが、この変更はmainブランチへとはマージされていないようです。(従来と挙動が変わるため設定などでユーザーが切り替えを行えるようにする必要があるというのが理由?)
その他キー割り当て
その他、使用しているVSCodeのEmacs拡張機能(Awesome Emacs Keymap)と自分のVSCodeの環境と似たような使い心地になるようにキー割り当てを行いました。
-
Ctrl + H
でBackspaceできるようにする- 「編集.後退削除」に
Ctrl + H
を割り当て
- 「編集.後退削除」に
-
Ctrl + A
での移動先を行の先頭ではなく、インデントの先頭に変更する(デフォルトの行頭移動になるので、set-markが切れてしまう)- 「編集.Emacsの行頭に移動」のキー割り当てを削除
- 「編集.行頭に移動」に
Ctrl + A
を割り当て
-
Ctrl + P
/Ctrl + N
でインテリセンスの補完や入力候補を上下選択できるようにする
⇒下移動(Ctrl+N
)と行頭移動(Ctrl+A
)を連続して入力すると、Ctrl
を拾いきれず、'e'が入力されてしまうことが分かったので、設定を削除- 「編集.Emacsの1行上へ」/「編集.Emacsの1行下へ」を削除
- 「編集.1行上へ」/「編集.1行下へ」に
Ctrl + P
/Ctrl + N
を割り当て
-
Ctrl + G
でEscape と同じ挙動にする(入力候補の取り消しがEmacs Emulationの拡張ではできなかった)
⇒Ctrl + P
/Ctrl + N
の連続入力問題と同様に削除-
Microsoft PowerToys (MS Storeリンク)をインストールし、 Keyboard Manager で Visual Sutdio (devenv)を使用中はCtrl + G
をEscに割り当て
⇒CtrlL + G
にESC
と同じコマンドを割り当てることで、入力候補の非表示が可能だったので、それらを割り当て
-
課題
現状の設定でコーディングすることに関してはかなりいいところまで来ているのですが、いくつか課題があります。
Ctrlキーによる入力候補の半透明化
VSにはCtrlキーを押し続けると、インテリセンスの補完候補を半透明にしてくれるという機能があるのですが、これがCtrlを多用するEmacsキーバインド使いには候補の見え方が変わってしまい、見づらいです…。
よい拡張機能、設定などあれば知りたい…。
公式のDeveloper Communityでも投稿がありましたが、まだまだ進展はないようです…。
tab + tab
でスニペットを挿入できない
Visual Studioではスニペットを挿入するのにtab + tab
を使用するのですが、どうもEmacs Emulationsがtabキーを何か上書きしているようで、スニペットの挿入をうまくできません。
スニペットの挿入自体はほかのコマンドが用意されているので、そちらを使えばよいですが、tab + tab
のようにコーディングしながら流れるように使えないので、少し不便です。
XAMLファイルの空行でtabインデントを行うと例外が発生する
XAMLファイルで以下の赤枠で囲ったような空白行でtabキーを押すと、例外が発生してVSごと落ちてしまいます。
これが地味にストレスで、手癖でtabキーを押してしまうとVSを再起動しなくてはいけません。
※ こちらでも質問にあげていました。
解決策1(設定で回避)
設定などで回避できないかといろいろ試したところ、XAMLのインデントを"ブロック"に設定していると、この問題は起こらなさそうだったのですが、インデントが個人的にきれいにされないと感じたので断念しました。
解決策2(拡張機能を修正する)
拡張機能のソースをクローンして、落ちる部分を無理やり直しました。
ソースと内容は別の記事に書こうと思います。
以下のコミットで修正しています。ご参考まで。
まとめ
VSでEmacsキーバインドを設定するのにいろいろとやったことをまとめてみました。
VSCodeは情報があふれているのですが、VSは情報を入手するのにかなり苦戦してしまいました。
ほかにもよい設定などあれば、いろいろな設定を試してみようと思います。