Effective Visual F# Power Tools
さてさて、またもや他人のAdvent Calendarに乗っかったネタです。 今日は、Visual F# Power Tools の紹介というF# Advent Calendar 2014の11日目の記事です。
VFPTの基本的な便利な機能は元記事を参照いただくとして、このエントリでは更に進んだ使い方等を紹介します。
シンタックスのカラーリングのカスタマイズ
シンタックスのカラーリングはカスタマイズできます。 カスタマイズは、VS自体のオプションの左のペインから環境、フォントおよび色と選択し、 表示項目のF#から始まる項目です。
カスタマイズできる項目は以下の通りです。
- F# Escaped Characters
- F# Functions / Methods
- F# Modules
- F# Mutable Variables / Reference Cells
- F# Patterns
- F# Printf Format
- F# Quotations
- F# Types
- F# Value Types
この中でおすすめなのが、「F# Mutable Variables / Reference Cells」です。
これを設定することで、mutable
な変数やref
型の変数に色が付き、どこで再代入を使っているかが一目瞭然になります。
スコープもちゃんと認識していますね。 ちなみに、setterがあるプロパティなんかも、Mutable Variablesとみなされて色が付きます。
他には、「F# Escaped Characters」と「F# Printf Format」も便利です。
上のコードでも、printf
系の関数のフォーマットに色が付いているのが分かります。
「F# Quotations」も人によっては便利でしょう。
「F# Patterns」は、便利かどうかは微妙ですが、設定してあります。
Some
とNone
に色がついているのや、自動実装プロパティのFailed
に色がついているのが分かります。
自動実装とタスクリストコメント
元記事ではインターフェイスの自動実装と判別共用体ケースの自動実装に触れられていますが、もう一つ、レコードのスタブ生成機能もあります。 これら自動実装系の機能と、タスクリストコメント*1を合わせる技をadacolaさんが呟いています。
Visual F# Power ToolsのCode GenerationをUncompilable Codeにして内容を(* TODO 自動生成のまま未実装 *)みたいにしておくと、タスク一覧で自動生成したままの箇所が一覧できてよさげ
— adaco (@adacola) November 8, 2014
これは是非設定しておくといいでしょう。
failwith "oops!" (* TODO : Not implemented yet *)
このように設定しておけば、(Uncompilable Codeと言いつつ)コンパイル可能で、かつタスク一覧に「TODO : Not implemented yet」と表示されるようになります。
便利!
その他の機能
元記事では触れられていない機能をざっくり紹介します。
ドキュメンテーションコメントの自動生成
///<
までタイプするとドキュメンテーションコメントのひな形を生成してくれます。
地味ですが、ドキュメンテーションコメントを書くときに便利です。
VFPTとは関係ありませんが、F#ではドキュメンテーションコメントの中身がsummaryだけであれば、summaryを省略できるという便利機能があります。
/// とても素晴らしい変数です。 let x = 42
これも知っていると便利なので使っていきましょう。
ソースコードの整形
整形してくれます。あんまり使ったことはありません。
もちろん、VSの整形のショートカットで呼び出せます。 使う人は使う機能かも?
ナビゲーションバー
便利機能です。この機能を有効にするには、VSを管理者権限で立ち上げてから「Navigation bar」のチェックボックスをチェックし、VSを再起動する必要がありますので注意してください*2。
この機能を有効にすると、エディタの上にナビゲーションバーが表れて、選択した型やメンバに簡単にジャンプできるようになります。 上の画像で、「Program」とか「g」とか表示されているのが分かります。
参照箇所のハイライト
便利機能です。カーソルを置いている変数や関数と同じものを参照している箇所をハイライトしてくれます。
インデントガイド/Depth colorizer
便利機能です。F#はインデントに意味のある言語なので、インデントガイドを出してくれると色々と捗ります。
上の画像でも、インデントガイドが確認できます。
NavigateTo
便利機能です。Ctrlキーを押しながらカンマキーを押すと起動できます。 起動したら、型名とか関数名とか適当にタイプしてみてください。そういうことです。
フォルダ機能
最近使ってません。 プロジェクトが巨大になればお世話になることでしょう。
openしていない名前空間の解決
便利機能です。Hoge
を含むモジュールがあった時に、Hoge.piyo
とかやってHoge
までカーソルを持っていくと、スマートタグが表れるのでCtrl+.
で起動してEnter
です。
未使用宣言のグレーアウト
使っていない変数や関数などをグレーアウトしてくれます。 不安定なので現状ではOffにしておくといいでしょう。 次のバージョンではもうちょっと改善される予定です。
未使用openのグレーアウト
使っていないopen
をグレーアウトしてくれます。
不安定なので現状ではOffにしておくといいでしょう。
次のバージョンではもうちょっと改善される予定です。
メタデータに移動
便利機能です。ソースを持っていないコードのシグネチャ等を確認する際、この機能がない時代はオブジェクトブラウザを使ったりしていましたが、F12で確認できるようになりました。
タスクリストコメント
便利機能です。この機能は実装にも関わったので、思い入れもある機能です。 タスク一覧ウィンドウを開いて、(ユーザー タスクではなく)「コメント」を選ぶと、TODOコメントなどが一覧できます。
オプションからカスタマイズ可能で、「環境」、「タスク一覧」と辿ると設定画面になります。 「名前」の欄に「XXX」とか入れて、追加ボタンを押すとトークンリストに追加されます。 このUIは非常にわかりにくいと思うんですが、まぁVS標準の機能だし仕方ない。
VFPTの今後
次のバージョン
次のバージョンでは、細かい点が修正され、目立った新機能は追加されないようです。
- New folderダイアログがリストアされない問題を修正
- 大きなソリューションでの「全ての参照の検索」機能のパフォーマンスを改善
- Goto Metadataで表示されるコードにエラーが表示される問題のいくつかを修正
- これ以上自動生成するものがないスマートタグを表示しないように変更
printf
系関数のフォーマットの色付けをユーザ定義のものまで拡張- ソースが存在する構造体への移動がメタデータへの移動になる問題を修正
今後載るかもしれない機能
コメントの折り畳み機能がもしかしたら載るかもしれないです。
機能追加の要望方法
GithubのIssuesではなく、VFPTのUser Voiceに投稿してください。 Voteもできるので、気になった機能があればVoteするといいでしょう。 幾つかピックアップして紹介します。
クラスビューでのコードナビゲーション
Feaure Request: Code Navigation Using Class View で提案されています。
ナビゲーションバーは一つのファイルであれば便利だけど、クラスビューであればプロジェクト全体をナビゲートできて便利だよね、という提案です。
ローカルで閉じたIDisposableでletを使っていた場合にuseを使うよう提案
Suggest to use use
instead of let
for local IDisposable valuesで提案されています。
IDisposable
を実装した型にlet
を使っていた場合、それをuse
を使うように提案してくれるような機能の提案です。
実装されれば有用そうですが、ローカルで閉じているかどうかのチェックって簡単にできるんでしょうか・・・
式の型の表示
Show type annotation on expressionで提案されています。
Scala-plugin for Intellij ideaで実装されている機能のようですね。 あると便利なのは間違いないでしょう。
推論された型の表示
Display inferred types above declarationで提案されています。
コンパイラによって推論された型を、定義の上に(CodeLensのように)表示する機能の提案です。 コメントでは結構散々な言われようですが、これ、実装されればめちゃくちゃ便利だと思うんですよ。
CodeLens APIが公開されていないようなので、CodeLensっぽくできるかどうかわからないかつ、公開されたとしても関数内関数は結局自作になりそうなので、全部自作してしまえばいいじゃん、と思うんですが果たして。 エディタ上にCodeLensのように行じゃない行(?)を差し込めるのかどうかが問題だと思うんですが、教えてVS拡張に詳しい人!
まとめ
VFPTを使いこなして楽しくF#でプログラミングしましょう!