VSCodeでなるべくマウスを使わない開発環境をがんばる

# はじめに

最近，職場の若手が自分も愛用しているVSCodeを使って開発をがんばっています．それに触発されてVSCodeでの開発環境についてまとめたものを書いていきたいと思います．まわりにはターミナル上でEmacsやVimを使ってコードを書いているプログラマも多い環境なので，なるべくマウスを使わずにキーボード操作だけで開発できるようにまとめます．

[https://code.visualstudio.com](https://code.visualstudio.com)

# やりたいこと

次にあげる内容をキーボード操作で行えるようにするのが目標です．

* 指定したファイルを素早く開く
* 関数やクラスなどのシンボルで検索する
* 定義にジャンプしたり戻ったりする
* 手軽にC/C++をビルドして，素早くコンパイルエラーの場所を表示する

前提としてがっつり設定などをカスタマイズするというのではなく，初心者向けになるべく簡単に環境を立ち上げられる内容でまとめていきます．またビルドの項目などは今回はC言語，C++を前提にまとめていきますが，VSCodeの操作としては他の言語でも基本的に共通な内容となっています．

# 環境

今回の環境は次の通りです．OSはLinuxを使っていますが，他のOSでもキーバインドに一部違いがある程度で同じように操作できると思います．

* Debian 9
* Visual Studio Code 1.32

参考に自分の環境のイメージを載せておきます．通常はエディタ部を横に2つ並べてコードを書いています．また下部（パネル）にはターミナルなどを表示することができ，左部（サイドバー）にはエクスプローラなどを表示しています．これらは簡単に表示・非表示を切り替えられるので普段は非表示にして画面を広く使っています．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/059cd108-083a-b69a-001c-03366e5fe46f.png)


## 開発言語用の拡張機能を追加

VSCode本体には各プログラミング言語に特化した強い機能はついていないので，必要に応じて拡張機能をインストールします．今回はC/C++を使いたいので，下図の一番上にあるMicrosoft製の拡張を1つインストールしておけばOKかと思います．他の言語の場合でも対応する拡張をインストールしておけば，ここで紹介する操作は大体が使っていけると思います．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/2574dd0f-b00a-ddbc-f60d-f21ba458477a.png)
また拡張機能のインストールはターミナルからも行えます．

```console
$ code --install-extension ms-vscode.cpptools
```

# VSCodeの起動

VSCodeは基本的に開発プロジェクトのトップのディレクトリを開いて使います．本記事でまとめる操作もそれを前提として紹介します．Linux環境の場合はターミナルを使っていることが多いと思うので，初回は次のようにディレクトリを指定して起動してください．

```console
$ code /path/to/your_project
```

2回目以降の起動は最後に開いたディレクトリを自動で開いてくれます．パラメータなしで`code`コマンドだけの起動でOKです．またターミナルからVSCodeを起動すると環境変数まわりも引き継いでくれるので便利です．（例えばProxyの設定など）
また`-r`オプションを使って起動すると，すでに立ち上がっているVSCodeで指定したディレクトリを開きなおすことができます．

```console
$ code -r /path/to/your_project
```

## 過去に開いたディレクトリを開く

最後に開いたディレクトリだけでなく，一度開いたことのあるディレクトリは簡単に開きなおすことができます．VSCode上で<kbd>Ctrl</kbd> + <kbd>R</kbd>で過去に開いたディレクトリ一覧が表示されます．矢印キーか<kbd>Ctrl</kbd> + <kbd>R</kbd>の連打でお目当てのディレクトリを選択して<kbd>Enter</kbd>でそのディレクトリを開くことができます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/ce2c20f4-47f1-92cf-2407-c59582bb0a92.png)
基本的には同じウィンドウのVSCodeで選択したディレクトリを開きなおしますが，複数ウィンドウでVSCodeを立ち上げている場合，すでに別のウィンドウで開いているディレクトを選択したときはそちらのウィンドウに切り替わってくれます．（普通に開きなおすより高速で切り替わります．）
また，<kbd>Ctrl</kbd> + <kbd>Enter</kbd>でディレクトリを選択すると，新しいウィンドウでVSCodeを立ち上げて開いてくれます．

# ファイルを開く系の操作

ファイルを開かないとはじまりませんね．ファイルを開く系の操作をいくつか紹介します．よく使う操作なので効率のいい使い方を覚えておくとよいです．

## ファイル名で検索して開く

<kbd>Ctrl</kbd> + <kbd>P</kbd>でファイル検索用のパレットが開きます．ファイル名を入力するとインクリメンタルサーチで候補が更新されます．結構あいまいに検索がヒットしてくれるので，なんとなくのファイル名でもお目当てのファイルが表示されやすいと思います．サイドバーのエクスプローラからマウス操作で探すよりも効率がいいはずです．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/cc091f03-1e39-6e65-8dab-7cb1885c760e.png)
またファイル検索用のパレットを開いた直後は最近開いたファイルが表示されています．ここからカーソルを移動してファイルを開くこともできます．矢印キーでもカーソルの移動はできますが，<kbd>Ctrl</kbd> + <kbd>P</kbd>を連打することでもカーソルが移動できます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/9724d4f7-dd7c-84bc-952f-7987e832cbee.png)

## タブ表示されているファイルから選択する

<kbd>Ctrl</kbd> + <kbd>PgUp</kbd> or <kbd>PgDn</kbd>で表示しているタブの中から巡回してファイルを開いていきます．
ただし自分は冒頭で紹介したとおり，エディタを左右に2つ並べて表示していることが多く，この操作では反対側のエディタのファイルも切り替わってしまうことがあります．
そこでおすすめなのが，<kbd>Ctrl</kbd> + <kbd>K</kbd> <kbd>Ctrl</kbd> + <kbd>P</kbd>です．`edt`と入力された状態でパレットが表示されて，タブ表示されているファイルの一覧が表示されます．ここから開きたいファイルを矢印キーで選択するかファイル名を入力して選択すると，反対側のエディタを切り替えずにダイレクトに表示することができます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/969f2b98-297f-d051-419a-887c19d5317b.png)

# 関数やクラスなどのシンボルを検索

通常の検索は<kbd>Ctrl</kbd> + <kbd>F</kbd>（ファイル内検索）や<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>F</kbd>（プロジェクト内検索）がありますが，ここではプログラミングらしくシンボルでの検索の方法を紹介します．

## ファイル内のシンボル検索

<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>O</kbd>で，`@`が入力された状態でパレットが表示されて，今開いているファイルの中のシンボル一覧が表示されます．ここで名前を入力していくとインクリメンタルサーチで内容が絞り込まれていきます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/c5f366ed-83a9-016a-f9b1-9595fe4ec425.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/58d73ed0-3e8b-49f0-8f3d-48276c3ba45a.png)
先頭で`:`を入力すると，フィールドや関数などのカテゴリごとに整理して表示されます．大きなファイルの中の全体像を知りたいときなどに便利です．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/341a5bf6-7640-8df4-c6f9-d0be8782fc62.png)
またここでの検索は，Enterで確定させなくても選択しているカーソルを移動するだけで，あわせて背景のエディタの選択行が切り替わっていきます．

## プロジェクト全体でのシンボル検索

<kbd>Ctrl</kbd> + <kbd>T</kbd>で`#`が入力された状態でパレットが表示されます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/394557ab-938d-c6bf-f481-658d35a83a7f.png)
ここで名前を入力すると，インクリメンタルサーチでプロジェクト全体からシンボルが検索されます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/aecd3007-411a-d835-cf9e-f7c51a3f7a02.png)

例えば，まずはmain関数を見てみようと思ったときや，どのファイルか分からないけど調べたい関数名やクラス名にあたりがついているときなどに使います．

# 定義にジャンプしたり戻ったり

コードを読むときに関数の定義先にジャンプしたり戻ったりができると作業がスムーズになります．

## 関数やクラスの定義にジャンプ

関数の呼び出しを行っている個所にカーソルが当たっている状態で<kbd>F12</kbd>を押すと，関数の定義先にジャンプします．クラスや構造体などの型の定義も同様です．また変数も宣言している個所にジャンプします．変数については以前はグローバル変数のみ対応していたような記憶がありましたが，今試すとローカル変数についてもしっかりとジャンプしていました．

## ジャンプした先から戻る

ジャンプした先から元の場所に戻るには<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>-</kbd>で戻ります．Windowsの場合はキーバインドが違っていて<kbd>Alt</kbd> + <kbd>LeftArrow</kbd>です．このように一部LinuxとWindowsでキーバインドが違っています．

また別の方法として，コマンドパレットでコマンドを入力して実行する方法もあります．コマンドパレットは<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>で，パレットに`>`が入力された状態で表示されます．（または<kbd>F1</kbd>でも表示します．）

コマンドパレットで`Go Back`と入力して実行することでも，同じようにジャンプ先から戻ることができます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/12cff624-c52f-a887-8bc0-cc28780c7bb0.png)

コマンドパレットもインクリメンタルサーチであいまいに検索して候補のコマンドが表示されます．また最近使ったコマンドは優先して表示されるので，このコマンドに限らずよく使うコマンドは絞り込みのコツを覚えながら使っていくと，手軽に使っていくことができます．
よく使うコマンドや連打が必要なものについてはキーバインドを覚えたほうが効率的ですが，たまにしか使わないようなものはコマンドパレットを使って，なんとなく検索しながら使うことにも慣れておくといいと思います．

ちなみにGo Backしたものを，また逆向きに戻りなおすのは<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>\\</kbd>（`Go Forward`）です．

## ジャンプはせずに定義をチラ見する

カーソルのジャンプはさせずに，その場で定義の内容をちらっと見たいときには，<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>F10</kbd>でその場に定義の内容を数行だけ表示することができます．例えば定数の値などを確認したいときなどに便利です．<kbd>Esc</kbd>で表示を消せます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/e0717ff5-8177-5f3b-4695-1fd65e377c01.png)

# ビルドとエラーの場所を表示

今まではビルドするときはVSCode上のターミナルから普通にmakeコマンドを実行していました．プログラムの記述にミスがある場合はmake時のエラーログにファイルパスも出力され，ここがリンクになっているのでクリックすることでエラーの個所を開くこともできます．ただし以下の不満点があります．

* キーボード操作だけではエラーの出たファイルを開きづらい．
* コンパイルエラーが大量に発生した場合，たいていは先頭のエラーから追っていきたいが，ターミナルで先頭に移動する操作が手間となる．

コンパイルエラーの出るコードをビルドするとこのような感じです．自分はターミナルが表示される画面下部のパネルをそれほど広くは表示させていないので，たくさんエラーが発生するとビルドのログの先頭に戻るのはわりと面倒です．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/224193ff-3f6d-6c3b-9fbf-30481e96a410.png)
この章の内容は少し事前の設定が必要になります．ここではC/C++のビルド環境を前提に説明しますが，そこを各々の環境に読み替えれば他の言語でも同じように対応が可能になるところもあると思います．

## 対応方法の概要

VSCodeにある`タスク`という機能を使います．ビルド用のタスクを作成し手軽にビルドが実行できるようにします．またここで出たエラーログを解析して，ターミナルと同じ画面下部のパネルに表示できる問題ビューに出力することで，エラーの内容を分かりやすく表示し，またキーボード操作でも扱いやすくすることができます．

## 前提とするビルド環境

今回の解説では，プロジェクトのトップの階層に`build`ディレクトリがあり，その中に`Makefile`が用意されていて`make`コマンドでビルドが行えるとします．

## タスクの設定

ビルド用のタスクを設定します．以前は少し手間だった気がしますが，これがだいぶ簡単にできるようになっていました．
まずはコマンドパレットから`Tasks: Configure Task`を実行します．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/beff1cdd-9020-774d-1578-0e954d6f7935.png)
そこから手順でタスク テンプレートに`Others`を選択します．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/f6d893fd-642b-b5a9-6027-e79bb2404967.png)
tasks.jsonがプロジェクト内の`.vscode`ディレクトリにできます．デフォルトでサンプル用のechoタスクが登録されていますが，それを次の内容に書き換えます．

```json:tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "make",
            "args": [
                "-C${workspaceFolder}/build",
                "-j4"
            ],
            "group": "build",
            "presentation": {
                "focus": true
            },
            "problemMatcher": {
                "base": "$gcc",
                "fileLocation": "absolute"
            }
        }
    ]
}
```

`label`はタスクの名前を表し，実行するときに指定する名前になります．`command`には実際に実行するコマンド名を設定します．`args`にはそのオプションを指定します．今回は前提条件に示した通りのMakefileへのパスを指定しています．
`group`にはタスクのグループ名を設定します．コマンドパレットからタスクを実行するときに，`build`や`test`というグループは別枠で実行することができるようです．
`problemMatcher`にはエラーログを問題ビューに表示するための設定を行います．細かに正規表現でパターンを指定することもできますが，`"base": "$gcc"`のように指定すると簡単です．またこの設定を行わずにタスクを実行すると，手順で項目（今回はgcc）を選択して自動でこの設定を行うこともできます．自分の環境はファイルのパスが絶対パスで出力されていたので`fileLocation`を指定しています．これがないと問題ビューからリンクでファイルに飛ぶときに，絶対パスと相対パスを取り間違えてエラーが出ていました．
`presentation`にはターミナルに出力されるときの挙動を設定することができます．自分はタスク実行時にターミナルにフォーカスが当たるようにしています．
`tasks`はリストになっているので複数登録することができます．例えばビルド対象が複数ある場合にも対応することができます．

その他の細かな内容は[こちら](https://code.visualstudio.com/docs/editor/tasks#vscode)を参照してください．

## ビルドタスクの実行

<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>B</kbd>でビルドタスクを実行できます．
コマンドパレットから`Tasks: Run Build Task`または`Tasks: Run Task`で実行することもできます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/74bad9f0-1d24-b383-e965-ae0f1e2c49df.png)
手順でタスク名を選択できるので，先ほど設定した`build`を選択し実行します．ターミナルが自動的に立ち上がりログが出力されます．上記の設定ではこのターミナルにフォーカスが当たるようになっているので，何かしらのキーを押すとターミナルを閉じることができます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/b163f0f6-af63-df04-d185-229fe56a5a9f.png)

## 問題ビューの表示

<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>M</kbd>で問題ビューを表示できます．ビルド時のエラーログを解析して表示しています．各ファイルごとにエラーがまとまっているのと，検索キーワードでフィルタすることもできます．
またキーボードの矢印キーで項目を選択すると，その該当箇所がエディタ上に表示されます．これでマウスを使うことなくビルドエラーになっている個所を修正していくことができます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/32cd0049-956e-1356-fd1a-a4401411e19e.png)

# その他の操作など

最後に自分がよく使うその他の操作などについていくつか紹介します．キーバインドでなくコマンドパレットから実行するものもありますが，あいまいに検索されるのをうまく利用して，コマンド中の単語の頭文字の組み合わせなど少ないタイプ数でコマンドを確定させるコツを，自分なりに見つけると効率が上がると思います．

## サイドバーとパネルの表示切替

<kbd>Ctrl</kbd> + <kbd>B</kbd>でサイドバーの表示・非表示，<kbd>Ctrl</kbd> + <kbd>J</kbd>でパネルの表示・非表示を切り替えます．これらはサイドバー，パネルの中のビューは切り替えずに，単純に表示のON・OFFをするだけです．
具体的なビューの表示で自分がよく使うキーバインドは次のようになっています．

|ビュー|キーバインド|
|---|---|
|エクスプローラ|<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>|
|検索|<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>F</kbd>|
|Git|<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>G</kbd>（GitLensをインストールしている場合は<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>G</kbd> <kbd>G</kbd>）|
|ターミナル|<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>@</kbd>（Windowsの場合は<kbd>Ctrl</kbd> + <kbd>@</kbd>）|
|問題ビュー|<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>M</kbd>|

余談ですが，カーソルがエディタ以外のところに移っている状態からエディタに戻したいときは，<kbd>Ctrl</kbd> + <kbd>J</kbd>を2回続けて入力しています．（パネルを非表示にしたときはカーソルがエディタに戻ります．）

## エディタを閉じる

開いているエディタを閉じるには<kbd>Ctrl</kbd> + <kbd>W</kbd>です．VSCode全体を閉じるのは<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>W</kbd>です．
また最後に閉じたエディタを開きなおすのは<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>T</kbd>（`View: Reopen Closed Editor`）です．

## エディタを保持

VSCodeでは何らかでファイルを開いただけでは，エディタのタブに表示されているファイル名が斜体になっています．（下図のREADME.md）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/1dc808fd-adfb-a68c-0cd4-2e9b5e279a0a.png)
この状態では次に別のファイルを開いたときに，このファイルは保持されずに閉じられてから次のファイルが開く仕様となっています．例えば関数などの定義にジャンプしながらコードを読み進めるときに，大量にファイルが開かれ続けるのを防ぐことができて便利です．

開いたファイルを編集するとファイル名の斜体が通常に変わって保持されるのですが，<kbd>Ctrl</kbd> + <kbd>K</kbd> <kbd>Enter</kbd>（`View: Keep Editor`）でも保持状態に切り替えることができます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/c1b80f40-b56c-ccb2-319c-4f8787f10a33.png)

## 左右のエディタ間での移動

冒頭で少し説明した通り，自分はよくエディタを横に2つ並べるのですが，そのときに使うのが<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>RightArrow</kbd>（`View: Move Editor into Next Group`）です．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/53a10e18-0e97-b61e-7494-b7c2fe10f2fe.png)
このコマンドで，今開いているエディタを左から右のグループに移動します．（右がなければ新しくグループを作って並べて表示します．）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/df653b97-83b9-86ac-53a5-0a8ec254f7d5.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/a9eba826-e6a3-d9b1-bedc-04c882257268.png)
逆に右から左に移動するのは<kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>LeftArrow</kbd>（`View: Move Editor into Previous Group`）です．

またすでに横に2つエディタが並んでいる状態でカーソルを左右のグループに移動するには<kbd>Ctrl</kbd> + <kbd>K</kbd> <kbd>Ctrl</kbd> + <kbd>RightArrow</kbd>（<kbd>LeftArrow</kbd>）です．（`View: Focus Right（Left） Editor Group`）

## エディタの最大化

エディタを左右に並べて表示させている場合，1行の文字数が多いファイルを見るときに表示領域が狭くて不便なことがあります．このときには`View: Maximize Editor Group`を使うと表示領域を広げることができます．（となりのエディタが狭くなります．）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/ac02d3cc-07ff-658c-d96c-a4152e25a8f9.png)
また広げたサイズを左右均等に戻すには`View: Reset Editor Group Size`を使います．

## Diffの表示

編集中のファイルのGitでの差分を表示させるには`Git: Open Changes`を使用します．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/451a15dc-5c6b-ab5b-f98c-6d9228aa6872.png)
ただしDiff表示がSideBySide設定の場合は，エディタを2つ並べて表示していると少し狭いです．このときは上記のようにエディタの最大化をしてもいいですが，<kbd>F7</kbd>で差分を縦に並べて表示できます．基本はSideBySide設定で見たいけどって人には覚えておくと便利な操作です．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/bdff15f8-7274-20fc-0808-a16f56ed6627.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/754d5824-8dde-8c22-3497-859af884c57c.png)

## テーマの変更

最後に操作ではありませんが，自分のエディタをお気に入りにするためには見た目も大事かと思います．VSCodeはデフォルトのテーマもカッコいいですが，簡単に配色などを変更することができます．コマンドパレットから`Preferences: Color Theme`を実行すると標準で入っている数パターンから切り替えることができます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/19c289de-42ca-f891-e5f6-177bb38493d8.png)
人気の`Monokai`テーマなどもあります．また標準以外にも`その他の色のテーマをインストール`から多くのテーマを探すこともできるので，ぜひお気に入りのテーマを見つけてみてください．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/45310/b051a46a-aef9-38cf-f379-db2380b72268.png)

# おわりに

ここまでの内容で，マウス操作に頼らずVSCodeを使ってコードを書いていく最低限の準備はできたのではないかと思います．自分も愛用しているエディタを使って楽しくコードを書いていけるよう，誰かの手助けになれば幸いです．