Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

VSCodeで最低限のRuby環境構築、2021年版-設定編

RubyVSCode拡張の更新に伴い、その設定方法も更新されていることに気付いた。その要点は、

  • Language serverを使え。
    • まだ開発中ではあるものの使用推奨。
  • これまでの設定はLegacy Configuration。
    • 今後の更改見込みはなく、Ver 1.0到達時点で排除。

It is highly recommended that you enable the Ruby language server (via the Use Language Server setting or ruby.useLanguageServer config option). The server does not default to enabled while it is under development but it provides a significantly better experience than the legacy extension functionality. See docs/language-server.md for more information on the language server.

Legacy functionality will most likely not receive additional improvements and will be fully removed when the extension hits v1.0

Ruby - Visual Studio Marketplace

2018年に投稿した「VSCodeで最低限のRuby環境構築*1」での設定が、まさにLegacy Configurationだ。Rails環境を整える前に、その内容を2021年版的なものへ更新しようと思い立った。

注意、前提、要件

jsonファイル

作業前にsettings.json、workspace.jsonなど、必要な設定ファイルをバックアップしておくこと。
この投稿で紹介する手順は、設定ファイルのRubyに関連する箇所を更新する。特にLegacy Configurationからの移行に伴い、コードの書き心地に劣化を感じたとしても、簡単に後戻りできる。

Ruby、DevKit、MSYS2、VSCode拡張のインストール

以前の投稿とは異なり、Ruby自体の導入工程については取り上げない。RubyInstallerを用いる限り、バージョンは異なれども手順は変わらない。導入工程を知りたい人は、以前の投稿の該当箇所を参照してほしい。
ちなみに、この投稿時点での私の環境は「Ruby+Devkit 2.7.3-1 (x64) 」だ。

Gemのインストール

サポートされているGemが変化した。実際のところLegacy Configurationが機能しているのだから、これまで導入したGemが動作しなくなるわけではない。開発中のLanguage Serverが、いくつかのGemの機能を代替する結果なのだろう。
結果として、新しいバージョンではサポート対象として明記されているGemが減少している。

用途 パッケージ名
Linting reek
rubocop
standard
必要なGemだけをインストールする。
Formatting prettier
rubocop
rubyfmt
rufo
standard
必要なGemだけをインストールする。
Debugger debase
ruby-debug-ide
必須
2つともインストールする。

Formattingについて、GitHubの文書に”Prettier”は記載されていないのだが、Marketplaceの文書には記載されている。

Format support via RuboCop, Standard, Rufo, Prettier and RubyFMT

Ruby - Visual Studio Marketplace

Linting、Formattingは、必要なGemだけをインストールすればよい。両機能兼用で単一のGemを用いるのも問題ないし、異なるものを用いても問題ない。また複数の異なるGemをUserレベル、Workspaceレベルで使い分けることもできる。

IntelliSense、Autocompleteについて、Marketplaceに次の記述がある。

Semantic code folding support
Semantic highlighting support
Basic Intellisense support

Ruby - Visual Studio Marketplace
特別に何かを導入する必要はないのだが、IntelliSenseのために"rcodetools"が必要とするならば、インストールしておくと良い。

Gemのインストール・コマンド

#必須実行
gem list debase
gem list ruby-debug-ide

#必要な行だけ任意実行
gem list reek
gem list rubocop
gem list rubyfmt
gem list rufo
gem list standard

#IntelliSenseで必要ならば実行
gem list rcodetools


VSCodeの設定

まず「Settings」からRubyの設定画面を確認する。

Preferences > Settings > Extensions > Ruby

設定画面
f:id:espio999:20210429132240p:plain

基本的には”User”レベルの設定だけで問題ないが、”Workspace”や特定フォルダ(画面中では”testflight”)のレベルで設定を切り替えることもできる。

”Use Language Server”を”on”にするのを忘れないこと。

”Use Bundler”は”on”にする前提なのだが、現時点ではユーザーの好み次第だ。現バージョンのRuby拡張では、Formattingには適用されるものの、Lintには適用されないのだという。

The global useBundler flag does not apply to linters. This is an outstanding issue and will be corrected later.

vscode-ruby/linting.md at main · rubyide/vscode-ruby · GitHub

Formatの設定

”Edit in settings.json”をクリックすると、”settngs.json”の該当箇所に飛び、さらにIntelliSenseが候補となるGemを提案してくる。

IntelliSense - Formatting Gem
f:id:espio999:20210429132335p:plain

注意したいのは、IntelliSenseが示しているのは、設定可能な値であり、その時点でインストールされているGemではないことだ。例えば、私の環境で言えば"prettier"は導入されていないのだが、設定候補として表示されている。

"ruby.format"は単一の値をとるので、Gemを一つ選択する。変更したい場合には、”Workspace”や特定フォルダのレベルで設定するか、設定を変更する必要がある。

Lintの設定

同じく”Edit in settings.json”をクリックすると、”settngs.json”の該当箇所に飛び、さらにIntelliSenseが候補となるGemを提案してくる。

IntelliSense - Linting Gem
f:id:espio999:20210429132456p:plain

"ruby.format"と異なり、"ruby.lint"は配列を取るので、複数のGemを登録することができる。そして、使用するGemをtrue、falseで切り替える。具体的には、このような具合だ。

"ruby.lint":{
    "reek": true,
    "rubocop": false,
    "standard": false,
},

ここまでで、この投稿での作業は終了。
次の投稿で、必要な機能が動作しているかを検証する。
impsbl.hatenablog.jp