こんにちは!
エージェンシー事業部でアプリケーションエンジニアをしている23新卒の森田です!
4,5年前に Atom から VSCode に乗り換えてすっかり VSCode のことを相棒だと信じ、もう知らぬことはないとそう思っていました。
しかし、今年エンジニアとして業務で VSCode を使用していると、「あれっ、そんなこともできるの?」と日々相棒の新しい機能を発見しています。
完全に理解したと思ったところからさらに新しい面に気づかせてくれる VSCode は最高の相棒ですね!!
そんなところでこのブログでは、VSCode を完全に理解した VSCode 初心者の僕が、VSCode やっぱわからん VSCode 中級者になるために使いこなす必要がありそうだなと思った機能の Tips 集をご紹介します。
筆者の環境は以下のとおりです。
- Mac
- Apple シリコン
- Ventura 13.3.1(a)
- VSCode: 1.84.2
はじめに
このブログでは、前述したように業務で VSCode を使用するにあたって、僕が「使いこなすと便利だな」と思った機能と僕が実際に使用している例を紹介いたします。
VSCode の基本的な使用方法や初心者がとりあえず入れておくべきといったような便利な拡張機能などはこのブログでは紹介いたしません。
なので、下記のような方々はこのブログの内容が参考になるかもしれません。
- 初心者向けの VSCode の記事を読み漁って、VSCode を完全に理解した方
- 業務で VSCode をよりうまく使いこなしたいと思っている方
逆に下記のような方々にはこの記事の内容は合わないかもしれません。
- VSCode なにそれ?って方
- VSCode 入れてみたけど、なにから始めたらいいかわからんって方
- VSCode は初心者の方向けの記事が大変多くあるのでそちらを是非ご参照ください
- 一通りコーディングしてみたら「VSCode 拡張機能」などで検索してみると、よりイイ感じの VSCode の使い方ができるようになると思います
- VSCode チョットワカル方
閑話休題
弊チームでは、自由にエディタを選択することができます。
僕自身を入れた弊チームのエンジニア 11 人のエディタの使用状況は次のとおりです。
エディタ | 人数 |
---|---|
RubyMine | 6 |
VSCode | 3 |
Vim | 2 |
RubyMine が使用できる + Rails で開発するのもあって RubyMine が優勢です。
ですが、Rails だけではなく フロントやクラウドインフラも触る弊チームの事情もあって、RubyMine を使用している方でも VSCode を併用している方がいらっしゃるようです。
VSCode が多数派になる日も近い...
話は変わるのですが、僕の同期のデザイナーのみやたくんがブログの中で VSCode について触れています!
このみやたくんのブログを見た時は、遠い異国の地で日本人を見つけた時のような気分になりました...(海外行ったことない)
VSCode は部署を超える...
↓ みやたくんのブログ
終 閑話休題
settings.json
僕が VSCode 中級者になるために使いこなす必要があると感じる機能 1つ目は settings.json
です!!
VSCode の設定を管理するファイルのことで、⌘ + ,
で開く GUI 設定エディタの右上のくるってボタンを押下すると開くファイルのことです。
本節ではこのボタンで開くsettings.json
ファイルでできることを紹介していくのですが、settings.json
でできることは くるってボタンがある GUI 設定エディタでもできます。
なぜ、settings.json
の説明をするのって話ですが、僕が普段こちらを使っているからです!!
GUI のほうが使いやすくね?って方は適宜 GUI で同等の作業をしていただければおそらく実現できると思います。
GUI の方も使いこなしたら便利だなとは思うのですが、なかなか重い腰が上がらず...ただ、今まじまじと GUI 見てみると左ペインの内容が割と想像できますね。いつか触ってみます。
ただ、settings.json
にも利点はもちろんあります。
- チームで共有できる
- ネットに書いてるやつをコピペできる
- (記事書く時にスクショを撮る数が減って楽)
GUI で設定した項目も settings.json
の方に変更が反映されるはずなので、それを共有なりコピペすれば大体上記の利点はあってないようなもんです。
僕はスクショを撮らなくて良いので楽です。
重要な前提知識
VSCode の設定には大きく分けて2種類あります。
- User Settings
- ユーザ固有の設定で、どのフォルダーで VSCode を開いても適用される設定
- Workspace Settings
- ワークスペース固有の設定で、VSCode で開いているワークスペースのみで適用される設定
- シングルフォルダーワークスペースの設定
- 現在開いているフォルダーのみに適用される設定
- マルチルートワークスペースの設定
- VSCode のワークスペース機能を使用して開いている全てのフォルダーに適用される設定
これらの種類を踏まえてうまく設定してこそ VSCode 中級者と言えるものでしょう。
頑張って覚えました。
ここで、微妙な違いなのですが、マルチルートワークスペースの設定のみ、設定ファイルがsettings.json
ではなく.code-workspace
ファイル内のsettings
キーにsettings.json
と同等の内容を記述するようになっています。
ほぼsettings.json
ですね。
節タイトル詐欺になりかねないので、言い訳させておいてください mm
↓ 公式のsettings.json
のドキュメントはこちら
↓ ワークスペースについてのドキュメントはこちら
↓設定のスコープが狭いほど、広いスコープを上書きするようになります。詳しくはこちら
フォーマッタの設定パスをプロジェクトごとに設定する
複数人で開発するプロジェクトは、リンタやフォーマッタの設定を共有するべきですね。
例えば、Prettierではプロジェクト内のどこかに.prettierrc.json
なりのファイルを配置してコマンドラインからそのファイルを読むようにして実行していると思います。
VSCode には便利な拡張機能がいっぱいあるので、イイ感じに Prettier を実行してくれる拡張機能 Prettier - Code formatter ももちろんあります。
こちらを使用してイイ感じに Prettier を実行してこそ VSCode 中級者でしょう。
ただ、携わるプロジェクトが一つであれば何も考えずに、prettier.configPath: path/to/.prettierrc.json
をsettings.json
に記述すればいいのですが、複数のプロジェクトでそれぞれに.prettierrc.json
が存在する場合は少し考える必要があります。
具体的には各プロジェクトの.prettierrc.json
を設定する必要があります。
プロジェクトA の Prettier の設定で プロジェクトB のコードを気付かないうちにフォーマットしてしまい、コミットに紛れてしまうと事故ですね。
これは、前節で触れた Workspace Settingsで解決できます。
Workspace Settings は VSCode で開いているフォルダーの直下に.vscode
フォルダを作成し、その中にsettings.json
を配置することで設定を適用できるようになります。
例えば、prjA
を VSCode で開いているなら、prjA
を含むディレクトリ構造は以下です。
prjA ├── .vscode │ └── settings.json └── .prettierrc.json
.vscode/settings.json
を下記のように変更します。
{ "prettier.configPath": ".prettierrc.json" }
これでprjA
を VSCode で開いている間はprjA
の.prettierrc.json
が Prettier - Code formatter で読み込まれるようになりました!!
後はもう一方のプロジェクトも同様にするだけです。prjB
とすると以下のように.vscode/settings.json
を配置します。
prjB ├── .vscode │ └── settings.json └── .prettierrc.json
.vscode/settings.json
{ "prettier.configPath": ".prettierrc.json" }
これだけで、それぞれのプロジェクトの Prettier をイイ感じに実行できるようになりました。
さらに、それぞれの.vscode/settings.json
で下記のようにしてやれば保存時に Prettier を実行してくれます。
{ "prettier.configPath": ".prettierrc.json", "editor.formatOnSave": false, // 意図しないファイルでの自動フォーマットを防ぐ "[javascript][html][css]": { // 言語ごとの設定もできる。これは javascript,html,css のファイルのみに有効な設定 "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true } }
↓ 言語の識別子はこちらをご覧ください。.jsx
が javascriptreact
なのは言われないとマジでわからないです。
注意すること
リポジトリ管理しているプロジェクトに.vscode
を追加する場合、.vscode
をリポジトリ管理するかどうかはチームの判断が必要になります。
仮に、リポジトリに入れないとなった時に、リポジトリで管理している.gitignore
に個人の持ち物である.vscode
を追記するのはイケてないです。
なのでこの場合はリポジトリに個人用の.gitignore
相当の設定ができる.git/info/exclude
に.vscode
を加筆します!!
書き方は.gitignore
と一緒です。
.git/info/exclude
+ .vscode
↓ .git/info/exclude
の公式ドキュメントはこちら
チームで共有している.vscode/settings.json
を自分用にカスタマイズしたい
なかなかないと思いますが、チームで共有している.vscode/settings.json
を自分用にカスタマイズしたい時の解決方針を共有いたします。
そもそもですが、docker-compose.override.yml
のようにオーバーライドできればこれに書けば解決なのですが、執筆当時この機能はなさそうです。
過去に issue に上がっているようですが、解決されずに Close されていそうです...
僕が VSCode チョットワカル レベルになったら PR を出したいですね。
自分用にカスタマイズしたい時ってどんな時?
根本的に.vscode/settings.json
の運用を変えたほうがいい時も存在するかもなので、そこから考えていきましょう。
.vscode/settings.json
にeditor.fontSize
の設定が入っていて、文字が小さい/大きい- これは設定を入れた人に言って、User Settings にその設定を移していただきましょう。チームで共有すべき設定ではないです。
- ですが、言いにくい時、ありますよね。自分用にカスタマイズする にお進みください。
- 自分の好みなので他人に共有するほどでもない
- あなたがいいと感じるなら、他の人もいいと感じてくれると思います。この設定どすか?って話題に上げてみましょう
- ですが、言いにくい時、ありますよね。自分用にカスタマイズする にお進みください。
- なんか特定の拡張機能がうまく動かないので、代替の拡張機能を使用したい
- 将来的に他の人も同じ問題に直面するかもしれないし、もしくは、過去に他の人が直面しているかもしれません。質問してみて解決しましょう
- ですが、言いにくい時、ありますよね。自分用にカスタマイズする にお進みください。
- 他
- 自分用にカスタマイズする にお進みください。
自分用にカスタマイズする
自分用にカスタマイズする方法ですが、先述した通り、最高の解決方法であるところの.vscode/settings.override.json
のようなオーバーライドが使用できないです。
ですので、ここで紹介するのはあくまでワークアラウンドであることをご承知ください。
解決方法としては下記を考えています。
settings.json.default
をリポジトリ管理する- ワークスペース機能を用いる
.vscode/settings.json
を触ってコミットしないように気を付ける
順番に見ていきましょう。
1. settings.json.default
をリポジトリ管理する
そもそも、.vscode/settings.json
を直接リポジトリ管理しない運用方法です。
チームで共有すべき設定をsettings.json.default
などのファイルで共有しておき、各々の環境で.gitignore
で除外されている.vscode/settings.json
にコピペする方法ですね。
この方法なら.vscode/settings.json
は触り放題なのでやりたい放題カスタマイズできます。
この方法のデメリットとしては、settings.json.default
に差分が出た際に作業が発生するのでめんどくさいところですね。
ワークアラウンドとしては、この方法が一番スマートだと僕は考えています。
2. ワークスペース機能を用いる
前述した マルチルートワークスペースの設定 の設定ファイル .code-workspace
の方に自分用の設定を記述する方法です。
このコメントで言及されている方法ですね。
ただ、この方法には大きめのデメリットがあって、.code-workspace
の内容を.vscode/settings.json
が上書きしてしまうことです。
.vscode/settings.json
の editor.fontSize
を変えたい時、.code-workspace
の方に記述しても変更できないということですね...
残念。
ただ、自分だけが使って見ている拡張機能の設定を書くとかはできそうです!!
3. .vscode/settings.json
を触ってコミットしないように気を付ける
リポジトリ管理している .vscode/settings.json
を触る方法ですね。
事故率が高いのでやめましょう。
以上です。
スマートに解決したいところですが、なかなか難しそうですね...
チームレベルで運用の最適化が理想ですが、そうもいかないこともあると思うのでうまく乗り越えていけたらいいですね。
僕が携わっているプロジェクトではまだ.vscode/settings.json
をリポジトリ管理していないのですが、リポジトリ管理するようになった暁には 1 の方法でイイ感じにしようと考えています。
.code-snippets
僕が VSCode 中級者になるために使いこなす必要があると感じる機能 2つ目は .code-snippets
です!!
正確には*.code-snippets
ですし、GUI での設定がないので Code Snippets(コードスニペット) とだいたい一意です。
どうでもイイですね。
コードスニペットとは、ちょっとしたコードのテンプレートを呼び出せる機能のことです!!
例えば次の画像の for
とかのことですね。
これを使用しているのが次の gif です。
fo
しか打ってないのに、それっぽいfor文を挿入してくれています!!すごい!!
VSCode には次の3種類のコードスニペットがあります。
- 組み込みのもの
- 拡張機能で追加されるもの
- 自分で作るもの
本ブログでは、*.code-snippets
に記述して自分で作成するコードスニペットの使用例を紹介いたします!
なお、*.code-snippets
にもsettings.json
で言うところの User Settings と Project Settings のようなものがありますが、ここでは Project スコープの*.code-snippets
を紹介します。
なんで自作すんの?って話、ありますよね。
自作する利点をちょっと紹介します。
- 組み込み、拡張機能では足りない時がある
- ちょっとしたものなら探すより早い
- 自分好みのコードスニペットを作成できる
- (ブログに書ける)
こんな感じです。重要そう。
↓ 公式の Snippets
のドキュメントはこちら
ちょっとしたマジックコメントを入れる
どんなファイルにも記述が必要なコードのコードスニペット化は結構コスパが高いです。
例えば、shebang とかマジックコメントとかですね。
僕は Rails の開発をする際に使用する # frozen_string_literal: true
をコードスニペットとして登録しています。
. ├── .vscode │ └── ruby.code-snippets └── hoge.rb 2 directories, 2 files
.vscode/ruby.code-snippets
{ "frozen": { "prefix": "frozen", // これを打つと候補に上がるようになる "body": "# frozen_string_literal: true", // コードスニペットを適用すると反映される内容 "scope": "ruby" // 言語ごとにスコープを絞れる。 }
こんな感じですね。簡単です。
残念ながら下記のような記述はできません、残念。
// 注:この記述は不可 { "[ruby]": { "frozen": { "prefix": "frozen", "body": "# frozen_string_literal: true" } } }
これで frozen
とか fro
とか打って tab
するだけで # frozen_string_literal: true
を挿入してくれます!!一瞬ですね。
プロジェクトのコードスニペットは好きなファイル名を使用できるので、運用方法に合わせて作成してください。
僕の場合は、この例のように言語ごとにファイルを作成して管理しています。
いつの日か上位で言語でのスコープが絞れると信じて、今はコードスニペットごとにスコープを設定しています。
JavaScript の default export
React などを書いているとき export default function
という構文が長すぎると思うことがありますよね。
僕は3回くらい思ったのでコードスニペット化しました。
ここでは、export default function
の例を紹介しますが、他の言語やフレームワークの関数宣言にも応用できると思います。
ちょっとしたマジックコメントを入れる
と同様サクッと作っていきましょう。
.vscode/javascript.code-snippets
{ "export default function": { "prefix": "edf", "scope": "javascript", "body": "export default function" } }
サクッ
できましたが、僕のもうひとりの相棒こと GitHub Copilot 君も 続きあるやろ? と提案してくれている通り、関数には他にも書きたいことがあるはずですね。
具体的には下記を関数周りでは触りたいです。
- 関数名
- 引数
- 関数の中身
これはコードスニペットの Tabstops
の記述で解決できます。
具体的には下記のように書き換えます。
.vscode/javascript.code-snippets
{ "export default function": { "prefix": "edf", "scope": "javascript", - "body": "export default function" + "body": [ + "export default function ${1}(${2}) {", + "\t${0}", + "}" + ] } }
このように変更すると次のようになります。
ポイントとしては以下だと思います。
- 複数行のコードスニペットは配列で渡す
- タブを挿入する時は
\t
で入れる ${n}
の記述をするとtab
で移動できる- gif だとわかりにくいのですが、関数名 -> 引数 -> 中身 の順に
tab
キーで移動しています ${1} -> ${2} -> ... -> ${0}
の順番で移動する${0}
まで行くと、tab
キーの挙動が普段と同じ挙動に戻る
- gif だとわかりにくいのですが、関数名 -> 引数 -> 中身 の順に
ここで、僕はコンポーネントを返す関数もコードスニペット化したいと思いました!!!!(ブログに書けるので)
なお、下記の規則のプロジェクトであるとします。
- コンポーネントを返す関数を
export default
する時はファイル名と同じ関数名で定義する - ファイル名はスネークケース
- 関数名はパスカルケース
つまりこんな感じの規則のプロジェクトです。
foo_bar.jsx
export default function FooBar(args) { return ( <> baz </> ) }
ファイル名と関数名の命名規則に関連性があるなら利用したいですよね。
僕はしたい。
コードスニペットはこれも解決できます!!
具体的にはこうします。
.vscode/javascriptreact.code-snippets
{ "export default component function": { "prefix": "edf", "scope": "javascriptreact", "body": [ "export default function ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}(${1}) {", "\treturn (", "\t\t<>", "\t\t\t${0}", "\t\t</>", "\t)", "}" ] } }
スネークケースのファイル名foo_bar.jsx
がパスカルケースの関数名FooBar
に反映されていることが確認できます。
最高ですね。
ここのポイントは以下です。
${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}
- 一般化すると
${VAR/regex/${1:/option}}
/
で繋げてそれぞれの記述をしています${1:/option}}
が置換の書き方もあるぽい
TM_FILENAME_BASE
VAR
の部分- コードスニペットでは変数を扱うことができ、
TM_FILENAME_BASE
は拡張子を除いたファイル名の変数です
(.*)
regex
の部分- 正規表現です。全ての部分を受けてます
pascalcase
option
の部分- パスカルケースを指定してます。便利
- 一般化すると
ここまで来るとチョットややこしいですが、一度作れば生産性爆上がり間違いなしなので中級者らしく使いこなしたいです!!
↓.code-snippets
で使用できる変数はこちら
↓option
の公式ドキュメントは見つけられなかったのですが、こちらの記事がまとめてくださってます
keybindings.json
僕が VSCode 中級者になるために使いこなす必要があると感じる機能 3つ目は keybindings.json
です!!
VSCode 上で使用できるキーボードショートカットを定義できるファイルのことで、⌘ + k ⌘ + s
で開く GUI キーボードショートカット設定エディタの右上のくるってボタンを押下すると開くファイルのことです。
キーボードショートカットを制するものは開発生産性を制するかもしれないので、是非とも使いこなしたい機能ですね!!
keybindings.json
はsettings.json
や.code-snippets
で言うところの User スコープ しか存在しません。
ちょっとした手間を加えれば Project スコープのような挙動をするように変更できますので、後ほど紹介いたします。
また、keybindings.json
は GUI にできないことも結構できます。
例えば、一つのショートカットキーに複数の処理をさせるとかですね!!
これについては、僕自身まだまだ発見中なのであまり触れることができません!!
僕の中級者への道は始まったばかりです!!!!
↓ 公式の keybindings.json
のドキュメントはこちら
エディタ領域を広くする
お気づきでしょうか。
先ほどからの僕の VSCode の画面のキャプチャ。
エディタ領域が広いです。
デフォルトの状態だと次のようにアクティビティバー(アイコンが並んでるところ)とサイドバー(画像だとエクスプローラーが開いていてファイルが並んでるところ)が開いています。
一方で僕の VSCode はどちらも開いていなくてエディタ領域が一面に広がっています。
コーディングしやすそうですよね?しやすいです!!
アクティビティバーとサイドバーは常に見えていて欲しい情報ではなく、欲しい時にだけ見えていたらいいなって僕は思っています。
なので、普段は閉じていて、欲しい時にだけショートカットキーで開いています。
サイドバーはデフォルトで開閉できるショートカットキーが ⌘ + b
に設定されています。
一方でアクティビティバーの方はデフォルトで開閉できるショートカットキーは設定されていません。
そこで、keybindings.json
の出番です!!
keybindings.json
を開いて、次を加筆します。
{ "key": "cmd+shift+b", "command": "workbench.action.toggleActivityBarVisibility" },
これだけで、アクティビティバーが ⌘ + ⇧ + b
で開閉できるようになります!!
簡単ですね!!
(workbench.action.toggleActivityBarVisibility
はどこからわかるねん、って話ですが、GUIで検索しました。これが一番早いと思います。)
なぜか効かないショートカットキーを復活させる
なぜか効かないショートカットキーみなさんありませんか??
僕はありました...
同じ悩みを抱えてる皆さんのために僕のワークアラウンドを共有します。
GUI から効かないショートカットキーを検索して、右クリック -> コピー で keybindings.json
に貼り付けです。
簡単ですね。
僕の場合はターミナルの移動の ⌘ + ⇧ + [ or ]
が効かなかったんですが、keybindings.json
から削除したら動きました...なんでや...
ショートカットキーにどの機能が設定されているか確認する
ショートカットキーを設定しようにも、既存のショートカットキーとバッティングすると困りますよね。
そんな時は便利な機能が GUI にあります。
GUI を ⌘ + k ⌘ + s
などで開いていただくと、右上にキーボードのボタンが確認できると思います。
このボタンをクリックすると、キーを記録しています
と表示され、この間に入力したキーが設定されているものを検索してくれます!!
プロジェクト固有のキーバインドを設定する
先ほどもちろっと触れましたが、User スコープにしか定義できないショートカットキーを Project スコープっぽい挙動をするように変更できます!!
例えば、フォーマッタの設定パスをプロジェクトごとに設定する
で登場したそれぞれの Prettier の設定を抱えているプロジェクトAとプロジェクトBを考えます。
↓このような構成です。
prjA ├── .vscode │ └── settings.json └── .prettierrc.json
prjA/.vscode/settings.json
{ "prettier.configPath": ".prettierrc.json" }
prjB ├── .vscode │ └── settings.json └── .prettierrc.json
prjB/.vscode/settings.json
{ "prettier.configPath": ".prettierrc.json" }
このプロジェクトAのみで JavaScript の default export
で作成したコードスニペットを使用したいとします。
↓これですね
プロジェクトAで想定される foo_bar.jsx
export default function FooBar(args) { return ( <> baz </> ) }
.vscode/javascriptreact.code-snippets
{ "export default component function": { "prefix": "edf", "scope": "javascriptreact", "body": [ "export default function ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/}(${1}) {", "\treturn (", "\t\t<>", "\t\t\t${0}", "\t\t</>", "\t)", "}" ] } }
プロジェクトBで使用したくない理由としてはプロジェクトBが↓アロー関数式派なんでしょうか。
プロジェクトBで想定される foo_bar.jsx
const FooBar = (args) => { return ( <> baz </> ) } export default FooBar;
くせで関数宣言の方をコードスニペットで使うため、制限をしたいってことですね。
さらに、今回はedf
すらタイプするのがめんどくさくなったので、⌘ + ⇧ + c
で上記のコードスニペットを呼び出したいです!!ブログを書くために!!
keybindings.json
{ { "key": "cmd+shift+c", "command": "editor.action.insertSnippet", "when": "editorTextFocus", "args": { "name": "export default component function" } } }
keybindings.json
の設定はこんな感じです。
command
キーにeditor.action.insertSnippet
を指定args
のname
にコードスニペットの定義のキーを渡すwhen
は キーボードショートカットが有効になる条件を指定する- 今回はエディタのテキスト部分にフォーカスがある時です
- ターミナルとかにフォーカスがあると効かない感じですね。
今回はexport default component function
の名前がついたコードスニペットが定義されていないプロジェクトではこのショートカットキーは効きません。
ですが、なんか気持ち悪いですよね。グローバルが汚れている感じがします。
効かないだけで動いてそう。
なので、今回はプロジェクトAだけでこのキーボードショートカットを動いてる風にします!!
具体的には次のように変更します。
prjA/.vscode/settings.json
{
"prettier.configPath": ".prettierrc.json",
+ "workspaceKeybindings.prjA.enabled": true
}
keybindings.json
{ { "key": "cmd+shift+c", "command": "editor.action.insertSnippet", - "when": "editorTextFocus", + "when": "config.workspaceKeybindings.prjA.enabled && editorTextFocus", "args": { "name": "export default component function" } } }
settings.json
の Project Settings に keybindings.json
の when
条件で参照する設定を追加する方法です!!
こうすれば他のプロジェクトでは when
で絶対弾かれるので動かないですね。安心。心が綺麗になった気分です。
補足としては以下です。
settings.json
では好きな設定を追加できるkeybindings.json
からはconfig.*
で参照できる
↓参考にしたのはこちら
tasks.json
僕が VSCode 中級者になるために使いこなす必要があると感じる機能 最後は tasks.json
です!!
だいたいなんでもできそうなまさに最強で無敵の機能です。
僕自身、どこまでできるのかこれから知っていく機能ではあるのですが、ビルドタスクとか、フォーマット、リント、テストをまとめて実行できるようになります。
すごいな????
ここでは、まだtasks.json
を知り始めた僕が使用しているものを紹介します!!
↓ 公式の tasks.json
のドキュメントはこちら
現在開いているファイルのテストを実行する
僕は普段、Rails を開発する際は Docker コンテナを用いています。
その中で、「このファイルのテスト開いて、相対パスコピーして、ターミナル開いて、docker-compose exec container_name bundle exec rspec 相対パス
打つのめんどくさい」って思ってました。
(実際には zsh がいい感じに補完してくれますし、.zshrc
に docker-compose exec container_name bundle exec rspec
コマンドを crspec
という名前でエイリアス設定を行っているのでそんなにめんどくさくはありませんが、ブログなので)
今回の問題を解決するために達成しないといけない点をまとめると次の2点になります。
- テストファイルのパスを取得
- コンテナ内の RSpec を実行する
他にも考えるべき点はあるんですが、そこはプラスアルファですね。
なお、この設定は Rails のディレクトリ構成とファイルの命名規則によります。
必要ならご自身の環境に合わせて${relativePath}
から RSpec の相対パス取得を書き換えてください。
もしくは、拡張機能に現在開いているファイルに対応するテストファイルを開くものがあるよう(観測できてない)なので、そちらをご使用ください。
他の言語のテストでも、ディレクトリ構成とファイルの命名規則がしっかりしていれば応用可能です!!
うまく使いこなしてテスト実行を快適にしてみてください!!
.vscode/tasks.json
{ "version": "2.0.0", "tasks": [ { "label": "Run RSpec for Current File", "type": "shell", "command": "./mysh/run_rspec_from_file.sh ${relativeFile}", } ] }
mysh/run_rspec_from_file.sh
#!/bin/bash test_file=$(echo $1 | sed 's/app/spec/' | sed 's/.rb/_spec.rb/') docker-compose exec container_name bundle exec rspec $test_file
今回はこんな感じで設定しています。
ポイントは下記です。
type
にshell
を設定- コマンドを実行するタスクになる
${relativePath}
でタスクを実行した時のファイルのパスを取得command
からシェルスクリプトを呼び出す- パス文字列の
app
をspec
に、.rb
を_spec.rb
に置換- ex)
app/path/to/hoge.rb
->spec/path/to/hoge_spec.rb
- ex)
- コンテナ内で
rspec
コマンドを実行
- パス文字列の
ここまで設定したところで、⌘ + ⇧ + p
-> Tasks: Run Task
-> Run RSpec for Current File
で開いているファイルに対応するテストを実行してくれます!!
テスト実行までの手順がめんどくさいですね!!!!
なので、Run RSpec for Current File
にショートカットキーを設定します。
keybindings.json
{ "key": "cmd+r", "command": "workbench.action.tasks.runTask", "args": "Run RSpec for Current File", "when": "editorTextFocus && editorLangId == ruby" },
こんな感じで、
command
にworkbench.action.tasks.runTask
args
にtasks.json
に設定したlabel
を設定することで、ショートカットキーでタスクを実行することができます!!
やったぜ!!
ちなみに、コンテナの中の RSpec を実行するケースですが、特定のプロジェクトのために設定しているので実際には↓のように設定しています。
keybindings.json
{ "key": "cmd+r", "command": "workbench.action.tasks.runTask", "args": "Run RSpec for Current File", - "when": "editorTextFocus && editorLangId == ruby", + "when": "config.workspaceKeybindings.prj.enabled && editorTextFocus && editorLangId == ruby" },
↓tasks.json
で使用できる変数の一覧はこちら
プラスアルファ
ここで蛇足なんですが、この設定にはまだ満足いってないので今後の改良点を挙げておきます。
誰かいい感じに設定できたら教えてください。
spec
ファイルの時はそのファイルをテストするようにする- テストファイルに対するテストファイルを実行する謎の挙動を発揮してしまう
- ファイルを保存した時に自動でテストするようにする
おわりに
このブログでは、VSCode 中級者になるために僕が使いこなす必要があると感じている設定になぞってその Tips を紹介いたしました。
VSCode は拡張機能を触るだけでもいい感じになりますが、もう一歩踏み込んだ設定をすることでより使いやすくなっていきます。
みなさんもぜひ自分なりの設定を見つけてみてください。
本ブログを最後までお読みいただきありがとうございました!!