matarillo.com

The best days are ahead of us.

31日間ReSharper一周 Day 15: Ctrl+Spaceの一族

2012-12-30 18:17:12

元記事

31日間ReSharper一周」の15日目にようこそ。

昨日はReSharper版Ctrl+Spaceについて話した。今日はReSharperが追加する2つの仲間を取り上げる。Ctrl+Shift+SpaceとCtrl+Alt+Spaceだ。

(「パラメータ情報」は以前はCtrl+Shift+Spaceだったが今はCtrl+Pになっているのを忘れないように。)

Ctrl+Shift+Space:予想される型でフィルタリング

Visual Studioの標準のCtrl+Spaceは(ReSharperでもそうなんだけど)、現在インポートしている全名前空間に含まれるあらゆる型を表示する。ReSharperにはコンテキスト依存の選択肢もあり、それだと正しい型だけを――現在のカーソル位置から予想される全ての型を――表示する。コンテキスト依存版はCtrl+Shift+Spaceで起動する。

たとえば、

Stream stream = new FileStream(fileName, FileMode.Open);
StreamReader reader = new StreamReader(

と入力してCtrl+Shift+Spaceを押せば、かなり短い補完候補一覧が得られる。というのは、StreamReaderのコンストラクタの第1引数となりえるものだけを表示するからだ。streamは候補の1つだし、Stream.Nullもそうだ。それに、文字列を返す静的メソッドの山もそうだ。StreamReaderのコンストラクタには文字列を受け取るオーバーロードもあるからだ。

この機能はコンストラクタではまだ動作しない。

Stream stream = new

と入力してCtrl+Shift+Spaceを押したときは、このコンテキストで使用できる具象クラスが全部表示されることを期待するだろう。ところが表示はされない。「候補なし」となるだけだ。サポートいわく、新しいシナリオはまだサポートされていないけれど、すでに将来のリリース計画にはあるとのこと。

でもなー。こういう時ばっかりはDelphiで作業するほうがいいと思うわけだよ。(もちろん、Delphi IDEが「バックグラウンドで」コンパイルしようとして(そして何度もやり直して)いる間、マウスを動かそうとしても30秒ずつ固まったりしないならと仮定しての話だけどね――ありえない希望だとは思うけど、人は夢を見る生き物だし。)どうしてかと言うと、今でもDelphiのCtrl+Spaceの方がすごいからなんだ。こっちもコンテキスト依存だけど、正しい型を持つ式を表示するってだけではない。正しい型を得ることができる式をも表示するんだ。たとえば、Integer型が予想されるコンテキストなら、Delphiは一覧にTFormのインスタンスを表示する。なぜならInteger型のプロパティ(Width、Height、Constraints.MinWidthなど)を持つからだ。この機能にはあっという間に慣れるよ。だから僕は、制限がずっと多いReSharperのコンテキスト補完に慣れるのに苦労している。とはいえ、たぶんそのせいで、Delphiが候補一覧を作るのは泣くほど遅い。

追記: 空のメソッドを新しく作って、その中でCtrl+Shift+Spaceを押すと、補完できる型がないはずなのに自動補完ボックスがポップアップする。ReSharper開発者のIlyaが言うには

空のメソッド内か、文が予想されるならどんな場所でも――たとえば、ある2つの文の間とかで――Ctrl+Shift+Spaceを押すと、「void」型が予想されるから、戻り値のないメソッドだけが表示される。

Ilyaありがとう!

Ctrl+Alt+Space: どこかの名前空間に属する型全部

方向性が違うんだけど、Ctrl+Alt+Spaceは型名だけを表示する――プロパティも、メソッドも、定数も表示せず、ただ型だけ。でもCtrl+Spaceとは違い、全ての名前空間から探してくる。しかも、その時点でusing文がある名前空間に限らない。

Ctrl+Alt+Spaceのドキュメントには、現在のソリューションの中にある型名を補完するとある。でもそれは正しくなくて、参照しているアセンブリからも型が補完される。だから、マイクロソフトやサードパーティが作ったアセンブリから来る、FileStreamやTestFixtureAttributeのような型でも動作する。)

ここまで聞いただけだと、まあ少し面白いけどねーって感じだと思う。いやいや、ここからが面白いんだ。型を選択したとき、まだusing文がなかったなら、ReSharperは適切なusing文を自動的に追加する。

(ReSharperには、必要なusing文を追加する別の機能もある――実は、明日その話をしようと思っているんだけどね。それでも、ちょくちょくCtrl+Alt+Spaceを使うくせをつけたほうがいいと思う。こっちの方が速くて簡単であると断言しよう。)

Ctrl+Alt+Spaceは、押す前に型名の最初の数文字を入力しておかないといけない。これはわざとなのかサポートに連絡して聞いたところ、ええ、その通りですと言われた。全部のアセンブリから候補一覧を拾ってくるから、何か入力してフィルターをかけないと時間がかかりすぎるだろうとのこと。納得いく理由ではある(その理由をドキュメントに記載していたなら素晴らしかっただろうけれど)。


31日間ReSharper一周 インデックスへ戻る