vimmerに捧げるgitプラグイン集

この記事はMikeTOKYO Advent Calendar 2013の7日目です。

「メリーvimリマス!」

vimと過ごすvimリマスの季節が今年もやって来ました(人´∀`)
今日は僕がgitをvimで使用する際のオススメプラグイン3点を紹介したいと思います。

1. vim-fugitive

定番の fugitive.vim です。

一番のおすすめは :Gblame
git の blame はとにかく速いですね。
svn なんかだとひとまず「( ゚Д゚)⊃旦 チャノメヤ」となりますが、
:Gblame は一瞬。そう一瞬です。

:Gstatus から add, commit, diff, checkout が可能です

インストールはコチラから

https://github.com/tpope/vim-fugitive

NeoBundleな方はコチラから

NeoBundle 'tpope/vim-fugitive.git'

2. gitv

fugitive.vim を入れたら間髪入れずにインストールするのが gitv

一番のおすすめは :Gitv!
:Gitv git をコミットグラフで表示しつつ、差分を確認できます
:Gitv! でファイル単位のコミットログを確認できます

ショートカット D からの diff も非常に見やすく重宝してます

vim-powerlineをもっとカッコ良くする

皆さん、vimってますか?
なかなか pathogen から移行できない yanaken です。

以前から vim-powerline を導入していましたが、更にカッコ良く出来るとのことでやってみました。

結果、以下になりました。


やり方・失敗談(w)は以下。
以前はこんな感じ。


1. fontpacher をインストール
macports でインストール!(←これが失敗)

$ sudo port install fontforge
$ fontforge --version
Copyright (c) 2000-2011 by George Williams.
 Executable based on sources from 13:48 GMT 22-Feb-2011-NoPython-D.
 Library based on sources from 13:48 GMT 22-Feb-2011.

※どうやら Python が入っておらず後述する変換に失敗し、"fontpatcher line: 4 Unterminated ff_statement" となりました。

諦めて homebrew でインストール!(成功)

$ sudo port install fontforge
$ fontforge --version
Copyright (c) 2000-2012 by George Williams.
 Executable based on sources from 14:57 GMT 31-Jul-2012-D.
 Library based on sources from 14:57 GMT 31-Jul-2012.
fontforge 20120731
libfontforge 20120731


2. vim-powerline 付属のスクリプトでフォント(Osaka-等幅)を変換

$ cd ~/.vim/bundle/vim-powerline/fontpatcher
$ cp /Library/Fonts/Osaka.ttf .
$ fontforge  -script fontpatcher Osaka.ttf

成功すると Osaka-Powerline.ttf が作成される(Win,Macであればクリックでインストール)


3. .vimrcに設定

set guifont=Osaka-Powerline:h10
let g:Powerline_symbols='fancy'


4. vim-powerline のキャッシュをクリア

:PowerlineClearCache


んー格好良い(人´∀`)

PHP5.4 alpha1 - 配列(array)について

ずいぶん久々に投稿します。
今回はPHP5.4で追加された配列に関する内容を記述。

・配列で[]による初期化が可能

$a = [1,2,3,['hige'=>'higehige']];
print_r($a);
//Array
//(
//    [0] => 1
//    [1] => 2
//    [2] => 3
//    [3] => Array
//        (
//            [hige] => higehige
//        )
//)

少しJavaScriptの文法に似た記述もできるようになりました。

※PHP5.3ではこのように書いてます。

$a = array(1,2,3,array('hige'=>'higehige'));


・関数の戻り値に配列でアクセス - Array dereferencing
他のスクリプト、静的言語でも通常である機能が実装されました。

function f() {
    return array(1,2,3,array('hige'=>'higehige'));
}
print(f()['hige']);
// 'higehige'

※PHP5.3ではこのように書いてます。

function f() {
    return array(1,2,3,array('hige'=>'higehige'));
}
$test = f();
print($test['hige']);


次回はCakePHP2.0について書きたいと思いますヽ(・∀・ )ノ キャッ キャッ

std::vector - erase 時に std::remove を活用する

std::vector で特定を消去したい時に便利な方法があったので記載。
とりあえず今までのコードを記述。

std::vector<int> hige;
hige.push_back(2);
hige.push_back(5);
hige.push_back(2);
hige.push_back(6);
...
std::vector<int>::iterator it = hige.begin();
while (it != hige.end()) {
    if (*it == 2) {
        it = hige.erase(it);
    }
    else {
        ++it;
    }
}

std::remove を使用するとこうなる。

std::vector<int> hige;
hige.push_back(2);
hige.push_back(5);
hige.push_back(2);
hige.push_back(6);
...
hige.erase(std::remove(hige.begin(), hige.end(), 2), hige.end());

[説明]
std::vector - erase は [begin, end) 範囲の要素を削除する。
std::remove は [begin, end) 範囲の指定された値(=2)が切り詰められる
切り詰められるだけなので、コンテナサイズは変わらない。

hige = {5,6,2,6}  // 切り詰められた結果、末尾の{2,6}が残る

切り詰められた末尾の iterator が戻り値となる。

hige = {5,6,^2,6} // ^ の iterator ポインタが戻り値となる

2行に分けるとこんな感じになる。

// hige = {2,5,2,6}
std::vector<int>::iterator it = std::remove(hige.begin(), hige.end(), 2); // hige = {5,6,2,6}
hige.erase(it, hige.end()); // hige = {5,6}


参考リンク
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E6%B6%88%E5%8E%BB%E3%83%BB%E5%89%8A%E9%99%A4%28Erase-Remove%29

std::map - erase の戻り値を活用する

またまた std::map の記事です;
std::map で erase してみた。

std::map<int, char> hige;
hige.insert(std::make_pair(1, 'a'));
...
std::map<int, char>::iterator it = hige.find(1);
if (it == hige.end()) {
    // キーが重複している
} else {
    hige.erase(it);
}

「erase 時に find するのが面倒くさい!」
と思ったので STL の中身を調べてみたら、このようにできた。

std::map<int, char> hige;
hige.insert(std::make_pair(1, 'a'));
...
if (!hige.erase(1)) {
    // キーが重複している
}

実は、わざわざ find しなくてもキーを引数として削除できる。
キーを引数とした erase の定義は以下。

size_type erase(const key_type& _Keyval)

戻り値にはキーで find した際にヒットした数が入る(0 or 1 じゃないのは multimap 用かと)
std::map は insert も erase も、実行してみてから戻り値でチェックした方が効率的だった。
これを知った後のプログラムの修正が大変。

戻り値の型が異なる関数をオーバーロードする

「戻り値の型が異なる関数をオーバーロードしたい!」
ってことがよくある。
とりあえずパッと思いついたのはこれ。
※Traits(=特性)というテクニックらしい 追記:2010-03-14

template<class T> T getValue();
template<> int   getValue<int>()   { return 1; }
template<> char* getValue<char*>() { return "test"; }

int   iHige = getValue<int>();
char* cHige = getValue<char*>();

なんかテンプレート引数の の部分が面倒だ。
そんな時は「変換演算子」を使用するとこうなる。

int   iHige = getValue();
char* cHige = getValue();

[説明]
変換演算子の記述の仕方はこんな感じ。

struct getValue {
    operator int()   { return 1; }
    operator char*() { return "test"; }
};

関数じゃなく演算子でした。
変換演算子は型が必要としている時に呼び出されるようになっています。
記述的に 関数呼び出し演算子 void operator() に似てますが、
変換演算子は operator 型() という形です。


参考リンク
http://www.geocities.jp/ky_webid/cpp/language/029.html