ぬるグラマー向け開発環境構築

  • 35
    Like
  • 0
    Comment
More than 1 year has passed since last update.

この記事は、C++ Advent Calendar 2013 - PARTAKE 16日目の記事です。

お手軽に開発環境を構築したい

さっとファイルと修正したり、コンパイル通るか確認するためだけに、重いIDEを開くのはめんどいです。メイン開発がJavaなので、常にEclipseかIDEAが起動している、という事情もあります。
昔はVim派だったのですが、マシン間あるいはOS間で設定を揃えるのがめんどくさくなって(特にプラグイン)、エディター+コマンドプロンプト (orターミナル) という、なあなあ開発環境でやり過ごしてました。「ハッカーはめんどくさい作業をしないように、エディターにこだわりまくる」という格言がありますが、“ぬるグラマー”はその労力すら惜しむのです(自己矛盾)。

とまぁそんな前口上はさておき、最近スクリプト系言語でSublime Text2を使い始めたところ、想像以上使い易かったので、C++もこれに切り替えて使い始めました。

Sublime Text2 + SublimeClang で基本OK

Sublime Textは、何もしなくても、「Build (⌘+B)」と「Run (⌘+Shift+B)」というツールがついています。すばらしいですね。Macは(普通は)何もしなくても g++ コマンドが使えるので、デフォルト状態でコンパイルできます。Winは、path にC++コンパイルのコマンドを通せば可能のようです。BuildとRunは↓な感じ。

Tool Screen.png

さらに、Packege Control を使用して、SublimeClangというプラグインを入れると、保存の度にコンパイルして、結果を表示してくれます。なお、Macの場合は内部でClangを呼び出すために(?) Command Line Toolsが必要です。OSX10.9以降の方は $ xcode-select --install でインストールしてからどうぞ (実はこれに超ハマった…)。

CompileAtSave.png

※上のコードは C++ Design Patterns and Derivatives Pricing の最初のサンプルコードの写経で、記事とは何の関係もありません。

「Alt+D,Alt+D」で参照先移動したり、「Alt+D,Alt+O」でプロジェクト全体をコンパイル検査したりしてくれます。私はショートカットをF12とF5に変えて某IDEと揃えましたが、キーバインドは Preference > Key Bindings で手軽に編集できます。以下は一例(一部抜粋)。

[
    {
        "keys": ["f12"],
        "command": "clang_goto_def", 
        "context": [
            {"key": "clang_supported_language"}
            ]
    },
    {
        "keys": ["ctrl+f12"],
        "command": "clang_goto_implementation",
        "context": [
            {"key": "clang_supported_language"}
            ]
    },
    {
        "keys": ["shift+f12"],
        "command": "clang_go_back",
        "context": [
            {"key": "clang_supported_language"}
            ]
    }
]

外部ファイルについては、*.sublime-project ファイルに sublimeclang-options-I/[path] を設定すれば、include のファイルも呼び出せます。手軽に使う上では特に支障ないです。依存関係がそれなり複雑なプロジェクトになると、使えるようにするまでに大変なんですけど。。。*.vcproj はよくできてますね(何)。

ちなみに、SublimeClangプラグインは、開発ストップ中で、Sublime Text3向けに絶賛開発中とのこと。Sublime Text3限定だと、似たようなのを別の方が作成しているみたいです。→pfultz2/ClangComplete · GitHub

clang-format でコード整形

ぬるグラマーとしてはこれで十分なのですが、どうせならコードの整形もやりたいです。pull/request ドリブンが主流だと、余計な改行やスペースで差分が出るのは煩わしいです。
C++のコード整形は clang-format を使っていますが(というか他に何があるのか知らない)、LLVMにプラグインがありました。

https://llvm.org/svn/llvm-project/cfe/trunk/tools/clang-format/clang-format-sublime.py

このファイルのコメントにプラグインの使い方が書いてあります。今使っているMacだと clang-format が無かったので、1からビルドせざるを得ませんでしたが、プラグイン自体は所定のフォルダに突っ込めば使えました。フォーマットの細かい設定は特別なことは不要で *.clang-format ファイルを用意して、自分好みのに設定すればOKです。

というわけで、複素数偏角Fizzbuzzを書いてみました(元ネタ:Fizzbuzz in Complex Plane)。

(整形前) ※ちょっとワザとらしい

#include <complex>
#include <string>
#include <iostream>

std::string fizzbuzz(int n) {
    std::string fizzbuzz[4] 
    = {"Fizzbuzz","Buzz","%d","Fizz"};
    std::complex<double> z(-n % 5, n % 3);
    char s[9];sprintf(s, fizzbuzz[(int) arg(z)].c_str(), n);std::string ss = s;
        return ss;
}

int main() {
    for (int i=1; i<=100; i++) {
        std::cout << fizzbuzz(i) << std::endl;
    }
}

(整形後) 選択範囲で「Ctrl+Shift+C」

#include <complex>
#include <string>
#include <iostream>

std::string fizzbuzz(int n) {
  std::string fizzbuzz[4] = { "Fizzbuzz", "Buzz", "%d", "Fizz" };
  std::complex<double> z(-n % 5, n % 3);
  char s[9];
  sprintf(s, fizzbuzz[(int)arg(z)].c_str(), n);
  std::string ss = s;
  return ss;
}

int main() {
  for (int i = 1; i <= 100; i++) {
    std::cout << fizzbuzz(i) << std::endl;
  }
}

まとめ

ひとまず、Sublime Text2で、ゆるふわC++開発の紹介でした。結局カスタマイズいろいろして、「PC間で共通の設定にするのめんどくさいじゃないか」というツッコミはスルーさせていただきます。