ソフトウェア

MKAddin (Visual Studio 用 add-in)

Visual Studio 用のこまごました機能を集めた Add-in です。

Visual Assist X という Add-in を私は使っているので、組み合わせないとちゃんと動かない or 意味がないこともあるかも。

ちなみにデフォルトではキーにバインドしていないので、 各機能を自分でキーカスタマイズして好きなキーに割り当てて下さい。

ReTab

下記のようなソースコードを編集しているとき、

for(...) {
    if(...) {
|
    }
}

ソース中の他のところを覗きに行って戻ってきたら | のところにカーソルがあって、自分で Tab を2回打った経験とかありませんか? ReTabコマンドなら一発で正しいインデント位置に戻せます。

for(...) {
    if(...) {
    |}
}

こんなケース(カーソル位置は|のところ)でReTabをしても、一行空けて Tab 2回分を打ってくれます。

CancelRet

下記のようなソースコードで(カーソル位置は|のところ)うっかり改行を押してしまい、

for(...) {
    if(...|) {
    }
}

バックスペースを連打しないと戻せなくなったことはありませんか?

for(...) {
    if(...
        |) {
    }
}

たぶん CTRL+Z を2回連打するのが正解なんですが、ワンキーで元に戻せると便利ですよね。

OperatorCompletion

イテレーターのループを書くのは面倒ですよね。

BOOST_FORとか、evil_forとかマクロを使ったハックをしてもいいんですけど、マクロを知らない人にはソースが読みにくくなってしまいますし、 リファクタリングツールがマクロを解釈できなくてソースを壊しちゃったりするのもなかなか怖いところです。

そういうわけで、Visual Assist X とか CodeRush のコードテンプレートを使って私はループを書いています。 ところが、コードテンプレート中に渡すコンテナ名だとかは補完が効かないのですよね。

だったら、補完が効く状態でいろいろ打って貰って最後にループに変換しよう、というのがこれです。

vector<string$gt; projectRecord.memberNames forcit

と打って OperatorCompletion すると

for(vector<string$gt;::const_iterator cit = projectRecord.memberNames.begin(); cit != projectRecord.memberNames.end(); ++cit) {
}

に展開されます。長いですって?最近はワイド液晶流行ってるし、160文字ぐらいまでは普通に表示できますよね。

次期C++の auto キーワードで半分はカバーできてしまうという話もありますが、数年はきっと使えます。

AddCppUnitTestMethod

CppUnit は便利なんですけど、準備がめちゃくちゃ面倒です。 CppUnit 用の main 関数や、fixture は VAX のコードテンプレートで何とかできますが、テストメソッドの追加をするときに2カ所編集するのが面倒です。

これを使うとテストメソッド名を入れると2カ所に追記してくれます。河童プロジェクトのはき出す雛形に依存しているので、コメントのマークが無いと動きません。

私自身は河童使ってないんですけどね・・・。

SmartSemicolon

括弧は開いたら閉じも先に入力してしまうことが多いのですが、文を終わりにしたいときに、行末に移動+セミコロン、と打つことが多いのでまとめました。小ネタすぎますね。

SwitchToPreviousDocument

.cpp/.h の切り替えは VAX にあるんですが、一つ前に編集していたタブに戻る命令がほしくて作りました。a.cpp -> b.cpp と移動したときに使うと a.cpp に戻ります。

a.cpp -> b.cpp と移動した後に b.h も参照したくなってその後使うと a.cpp に戻ります。prefix が同じなのはひとまとまり、という考えです。b.cpp に戻りたいなら VAX でできますので。

AddCppAndH

.cpp ファイルと .h ファイルを同時に作ってプロジェクトに加えたいことはありませんか?本当にそれをするだけです。

テンプレートはハードコードしているので、気に入らない人はいじってコンパイルしてください。

ExtractConstant

Refactor Pro を使うと同じことができちゃうんですけど Refactor Pro が重すぎるので自前のを作りました。こんなコードがあるときに、

if(getErrorCode(bts) == -3) {

if 文の中を select してコマンドを使うと

const bool foundCommunicationError = getErrorCode(bts);
if(foundCommunicationError) {

こんな風に書き直すのが楽になります。いわゆる "Intorducing Explaining Variable" のリファクタリングです。

MakeTupleConstructor

C++ で std::pair とか boost.tuple とかを使いすぎていませんか? first とか second だと名前が無くてわかりにくいですよね。

それでもつい使っちゃうのはタイプ数を節約したいんでしょう。でもね、構造体宣言なんてコードテンプレートでささっと作れるし、コンストラクタさえすぐに書ければクラスをちゃんと書いた方がわかりやすいプログラムが作れるんです。

struct JustOnceStruct {
    int x;
    string y;
    vector z;
|
};

こんなコード(例によって|はカーソル)でコマンドを使うとあら不思議!デフォルトコンストラクタと全メンバを初期化するコンストラクタを作っちゃいます。

struct JustOnceStruct {
    int x;
    string y;
    vector z;
    JustOnceStruct(int x, const string& y, const vector& z) : x(x), y(y), z(z) {}
    JustOnceStruct() {}
};

パーサーがかなりいい加減なので、1つの変数を宣言するのに2行以上使ってはダメとか、1行に2つ以上の変数を宣言してはダメとか、いろいろ制限はありますが、それでも std::pair<std::pair<T1, T2>, T3> とかついつい作っちゃう人にはとってもお勧めですよ!

入手方法

GitHub からどうぞ。

git clone git://github.com/mkasa/MKAddin.git