VSCodeあまり知られていない拡張（プログラミング言語によらずテキスト編集一般に役に立つもの）

他であまり紹介されていないものを紹介する。特にVimmerにとって有用かもしれない。
おすすめ度は★から★★★まで。

# 拡張機能

## [advanced-new-file](https://marketplace.visualstudio.com/items?itemName=patbenatar.advanced-new-file) ★
任意のパスへのファイル新規作成を楽にしてくれる拡張。
Cmd+Opt+Nで起動するとまずファイルを配置するフォルダを聞かれ、次にそのファイル名を聞かれる。スラッシュを含めると途中のフォルダも作成してくれる。
なお、VSCode標準のエクスプローラでの新規作成も、スラッシュを含めると途中のフォルダを作成してくれる。

## [ctagsx](https://marketplace.visualstudio.com/items?itemName=jtanx.ctagsx) ★★
古くからのVimmerにはおなじみ、ctagsサポート。標準機能と同じくF12で定義ジャンプできる。
2024年10月現在、ShopifyのRuby LSPはメソッドの定義ジャンプをサポートしていないのでこれを使っている。

## [Error Lens](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens) ★★★
lintの警告やエラーをエディタ内にインラインで表示する。

## [Filter Text](https://marketplace.visualstudio.com/items?itemName=yhirose.FilterText) ★★
エディタ内のテキストに対し、任意のシェルコマンドをフィルタとして実行。Vimの `:%!` みたいなもの。

## [Find Word At Cursor](https://marketplace.visualstudio.com/items?itemName=mksafi.find-word-at-cursor) ★★
カーソル下の単語を検索（単語の区切りを認識してくれる）。Vimの `*` みたいなもの。
地味に重宝。

## [Numbered Bookmarks](https://marketplace.visualstudio.com/items?itemName=alefragnani.numbered-bookmarks) ★★
1〜9まで番号付きのブックマークを設定できる。
`Cmd+k Ckd+1` でブックマーク1設定、`Cmd+Opt+1` でブックマーク1へジャンプというようにしている。
9個設定できるが、実際は1か2までしか使わない。

## [multi-command](https://marketplace.visualstudio.com/items?itemName=ryuta46.multi-command) ★★★
複数のキーストロークを1つのキーに割り当ててマクロ化できる。
なぜ標準でないのか不思議な機能。

```json
{
    "key": "alt+x",
    "command": "extension.multiCommand.execute",
    "args": { 
        "sequence": [
            "cursorDown",
            "cursorDown",
            "cursorDown",
            { "command": "type", "args": { "text": "CUT !!" } }
        ]
    }
}
```

## [Quick and Simple Text Selection](https://marketplace.visualstudio.com/items?itemName=dbankier.vscode-quick-select) ★★★
引用符やカッコで囲まれた文字列を選択できる。Vimのテキストオブジェクトみたいなもの。
下記のように設定している。クォートの内側を選択する機能は非常によく使う。

```jsonc
  {
    // クォートの種類をトグル
    "key": "cmd+1",
    "command": "extension.switchQuotes",
    "when": "editorTextFocus"
  },
  {
    // クォートを選択（1回押下で内側選択、2回押下でクォートも含めて選択）
    "key": "cmd+2",
    "command": "extension.selectEitherQuote",
    "when": "editorTextFocus"
  },
```

## [Select by Indent](https://marketplace.visualstudio.com/items?itemName=haberdashPI.vscode-select-by-indent) ★
インデントレベルに基づいてテキスト選択できる。
選択範囲の判定方法は多数用意されているが、自分は下記のみ利用している。

```jsonc
  // 現在行から同じインデントの行まで選択
  {
    "key": "cmd+3",
    "command": "vscode-select-by-indent.select-outer-down"
  },
```

これにより、下記の`if`の行にカーソルをおいた状態で`Cmd+3`を押すと、カーソル行から`}`の行までを選択してくれる。

```
function() {
  if (hoge) {
    ...
  }
  return 0;
}
```

## [VS Code Mark/Point](https://marketplace.visualstudio.com/items?itemName=ericmccarthy.vs-code-mark-point) ★
1回目の実行で「マーク」を設定し、2回目の実行で「マーク」から現在のカーソル位置までを選択。Emacsの`Ctrl+Space`みたいなもの。
これがあると、まずマークを設定しておいて、ショートカットキーにより希望の終端までカーソル移動、選択、という流れで操作ができる。

※いつの間にかVSCode標準でできるようになったらしい。`Cmd+K Cmd+B` (Set Selection Anchor)でマーク。`Cmd+K Cmd+K` (Select from Anchor to Cursor)でマークからカーソル位置までを選択。

# キーバインド
よく使う機能は左手だけで押せるキーバインドにしておきたい。そうすると右手にマウス、左手にキーボードというスタイルで操作しやすい。
`Cmd+l`（行を選択）は非常に便利なのにあまり使われていない印象でもったいない。

```jsonc
{
    // 行選択。連続押下で選択範囲を下へ広げる。デフォルト: cmd+l ★★★
    "key": "cmd+e",
    "command": "expandLineSelection",
    "when": "textInputFocus"
},
{
    // 選択モードのままカーソルを1行上へ（cmd+lの逆）★
    "key": "cmd+q",
    "command": "cursorUpSelect",
    "when": "textInputFocus"
},
{
    // 対応するカッコへジャンプ。★★★
    "key": "ctrl+z",
    "command": "editor.action.jumpToBracket",
    "when": "editorTextFocus"
},
```

# 設定

## フォルダを新規ウィンドウで開くようにする　★★★
複数リポジトリを扱う際、最近使ったリポジトリを開くにはOpen Recent（`Ctrl-R`）でインクリメンタルサーチするのが便利。
しかしデフォルトでは現在のウィンドウが置き換えられてしまうので、以下の設定で新規ウィンドウで開くようにできる。
```
    "window.openFoldersInNewWindow": "on",
```
https://yigarashi.hatenablog.com/entry/vscode-open-recent

## ダブルクリック時の単語選択で日本語を含まないようにする ★★
https://qiita.com/aosho235/items/0e1f0a525c8e3e7027d9

## マウスホイールでスクロールする行を増やす ★★
下記で2行ずつスクロールになる。
なお、Optionを押しながらホイールで高速スクロールになる（標準機能）。
```
    "editor.mouseWheelScrollSensitivity": 2,
```

## エディター・グループやアプリ間で検索語を共通にする（macOS）★★
デフォルトでは、Cmd+fによる検索語はエディター・グループごとに記憶される。
そのため、左のエディター・グループで検索したあと、右のエディター・グループでF3を押してもマッチしない。
下記を設定すると検索語がグローバルに記憶されるようになる（macOSのみと思われる）。

```
    "editor.find.globalFindClipboard": true,
```

なお、VSCodeだけでなくChromeやiTerm2など、他のアプリ間でも検索語が共有される。

## ホイールスクロールでタブ切り替え★
デフォルトでは、Shiftを押しながらタブ上部でマウスホイールをスクロールすると、タブ切り替えができる。
下記を `true` にすると、Shiftを押さなくてもタブ切り替えになる。

```
    "workbench.editor.scrollToSwitchTabs": true,
```

## 開いているすべてのドキュメントから補完候補を拾う

```
    "editor.wordBasedSuggestions": "allDocuments"
```

デフォルトは `matchingDocuments`（開いている同じ言語のドキュメントから拾う）

# 標準機能

## トリプルクリックで行選択、そのままドラッグで複数行選択
トリプルクリックで行選択できる。3回目のクリックで押したままにし、上下へドラッグすると行単位で複数行選択できる。
マウスで行単位選択するには、行頭でクリックしてそのまま真下へドラッグするやり方もあるが、クリックするポイントに少し神経を使うので、もしかしたらトリプルクリックの方が楽かもしれない？

## ダブルクリックで単語選択、そのままドラッグで複数単語選択
例えば次のテキストにおいて、

```
http.request(url, options)
```

`http`をダブルクリックして単語選択してから、そのまま右へドラッグすると`http.request`まで選択された状態になる。

## Fold Level 1 〜 Fold Level 7
コマンドパレットに`Fold Level 1`を入力。指定したレベルの折りたたみを閉じてくれる。
rspecやjestなどのファイルで行うと見出しだけを残してくれていい感じになる。

## 最後に編集した位置へ戻る（Cmd+k Cmd+q）
vimの <code>`.</code> と同じ。