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 が可能です
インストールはコチラから
NeoBundleな方はコチラから
NeoBundle 'tpope/vim-fugitive.git'
2. gitv
fugitive.vim を入れたら間髪入れずにインストールするのが gitv
一番のおすすめは :Gitv!
:Gitv git をコミットグラフで表示しつつ、差分を確認できます
:Gitv! でファイル単位のコミットログを確認できますショートカット D からの diff も非常に見やすく重宝してます
vim-powerlineをもっとカッコ良くする
皆さん、vimってますか?
なかなか pathogen から移行できない yanaken です。
以前から vim-powerline を導入していましたが、更にカッコ良く出来るとのことでやってみました。
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
git log で変更ファイル一覧を取得する
忘れないようにメモメモ
// 最新と一つ前の変更ファイルを取得する git diff --stat --color HEAD^ HEAD app/controllers/TestController.php | 85 ---------------------------- app/models/UserTest.php | 37 ------------ app/views/test.html.php | 2 +-
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}
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