2021年1月21日木曜日

VS Code の入力候補を好きなキーで閉じられるようにする

単語を打ち終わって改行したいのに、Suggestions(入力候補)で別の単語が出てしまっていて、改行すると違う単語になってしまう。

Escで抜けることはできるんですが、キーが遠い…
Enterキーで確定する設定をOFFにしてTabキーで確定するのも試したのですが、やっぱりEnterで確定したい。

自分がSuggestionsを閉じようとして直感的に押すキーは方向キーの「←」。しかし単語の頭まで移動しないと抜けてくれない。
行末で、次の行がある状態なら「→」を押せば良いのですが、ファイルの1行目を書き始めたところだったりすると→を押しても閉じてくれない。

なのでEscapeキーの動作を←キーに割り当てられないか?と調べました。

解決策

keybindings.jsonに下記の設定を追加することで実現できました。

// keybindings.json
{
    "key": "left",
    "command": "hideSuggestWidget",
    "when": "suggestWidgetVisible && textInputFocus"
  }

"key": "キー名" の指定を変えれば好きなキーに割り当てられます。
指定可能なキーの一覧はこちら
Visual Studio Code Key Bindings > Accepted keys

元のキーの機能も維持する

このままだと、もともとのキーの動作(カーソルを左に動かす)が実行されなくなってしまう。
最初はそれでいいやと思っていたのですが、しばらく使ってみると違和感がある瞬間が。

なので結局 multi-command という拡張機能を追加して、「Suggestionsを閉じる+カーソルを左に動かす」の二つの動作が実行されるように設定しました。

// settings.json
"multiCommand.commands": [
    {
      "command": "multiCommand.hideSuggestWidgetAndLeft",
      "sequence": [
        "hideSuggestWidget",
        "cursorLeft"
      ]
    }
  ]
// keybindings.json
{
    "key": "left",
    "command": "multiCommand.hideSuggestWidgetAndLeft",
    "when": "suggestWidgetVisible && textInputFocus"
  }

参考:
Visual Studio Code Key Bindings > Removing a specific key binding rule
ここのコード例にある { "key": "tab", "command": "tab", "when": ... }, を見て、escapeキーの役割を別のキーに割り当てられるのではと思いついた(そのままの書き方ではうまくいかなかったけど)

Implement Intellisense Suggestion Mode · Issue #33725 · microsoft/vscode
一つ目の候補が常にデフォルトで選択されるのではなく、方向キー上下で選択した時だけsuggestionを適用するモードを提案しているIssue。
これが実装されてくれればベストなのですが、対応予定なしでクローズされている…(´・ω・`)

key bindings - visual studio code keybindings - Running two or more commands with one shortcut - Stack Overflow
ひとつのショートカットキーで二つのコマンドを実行する方法 (拡張機能 multi-command を使う)

0 件のコメント:

コメントを投稿