反省はしても後悔はしない

Vim とか備忘録とか。それと関数型言語勉強中

vim で gitk 的なことを行う gitv が便利

前回に引き続き、今回も Vim + Git ネタですが・・・。

vimshell や fugitive.vim を使っているとほとんどの操作を Vim 上で実現できるます。でも、gitk だけは別ウィンドウで起動しなければならず面倒だと思っていました。
Vim 上で gitk 的なことを行うプラグインがないかと思っていたら gitv.vim というものがありました。

インストール

というか github
gregsexton/gitv

使い方

コマンドモードで

:Gitv

と打てばブラウザモード(後述)で起動します。
gitk --all 相当のことは

:Gitv --all

でいけます。
また、

:Gitv!

のように ! をつけるとファイルモード(後述)で起動します。

ブラウザモード

左のウィンドウにコミットのグラフ、右のウィンドウにコミットメッセージとそのコミットでの変更点が表示されます。
j や k でグラフ上を移動でき、<CR> でそのコミットの情報が見れます。

ファイルモード

ファイルモードは1つのファイルの履歴を追うモードです。
:Gitv! コマンドを叩いた時に開いていたファイルの履歴をたどります。
上にコミットのログ、下にコミット時のファイルの状態が表示されます。

キーバインド

キー ブラウザモード ファイルモード
<CR> 選択したコミットの情報を開く 選択したコミット時におけるファイルを表示
o 水平にウィンドウを分割してコミットの情報を開く 水平にウィンドウを分割してファイルを表示
O 新しいタブでコミットの情報を開く 新しいタブでファイルを表示
s 垂直にウィンドウを分割して(ry 垂直にウィンドウを分割して(ry
i <CR>と同じ コミット情報の表示
q gitv の終了 gitv の終了
u 最新の情報に更新 最新の情報に更新
co ブランチやコミットをチェックアウト(HEAD が移動) ファイルをチェックアウト(HEADは移動しない)
D なにもなし 表示されているファイルと選択されたファイルの差分を vim の diff で見る
S diff --stat の表示 diff --stat の表示
ビジュアルモードで複数のコミットをハイライトした状態で D なにもなし ハイライトされている一番上のコミットと一番下のコミットの差分を vim の diff で見る
ビジュアルモードで複数のコミットをハイライトした状態で S 一番上のコミットと一番下のコミットの diff --stat 一番上のコミットと一番下のコミットの diff --stat
ビジュアルモードで複数のコミットをハイライトした状態で m 一番上のブランチと一番下のブランチをマージする(上と下が必ずブランチやタグでなければならない) (たぶん)なにもなし

不具合・・・?

ひとによるのかもしれませんが、私の環境ではブラウザモードで開いた時に diff が折りたたまれて表示されてしまいました。
以下のようにやれば直るようです。

autocmd FileType git :setlocal foldlevel=99
参考
:help gitv

fugitive.vim が便利すぎたのでメモ

Vim から Git を操作するプラグインとしては、今まで git.vim を使っていたんですが、fugitive.vim のほうが便利だったので乗り換えました。

詳しい説明はここ
VimmerなGit使いはfugitive.vimを今すぐ入れたほうがいい - SELECT * FROM life;

ここでは、自分が特に便利だと思った機能を書きます。

git add -p をグラフィカルに行う

git add -p を使うと、複数の変更箇所のうちどの変更をコミットに含めるかを選ぶことができますが、fugitive の :Gdiff を使うとこれをグラフィカルに行うことができます。
:Gdiff コマンドはインデックスとワークツリーの状態の差分を vim の diff で表示します。
こんな感じ

たとえば、スタイルシートの設定(上のほうの差分)はコミットに含めたいけど、クラス属性の付与(下のほう)は含めたくないとしましょう。
まず、カーソルを上の青い所に移動させます。(]c や [c で変更箇所にジャンプできます)
そこで dp と押すと、カーソル位置の変更がインデックスに取り込まれます。

コミットに含めたい変更をすべて取り込んだら、左のウィンドウ(インデックスのウィンドウ)に移動して :wq としましょう。
そして、:Gcommit -v すると、

見事、スタイルシートの設定の変更のみがコミットに含まれています。

ちなみに・・・

]c とか dp とかは Vim の機能です。詳しくは :help diff
ほかにもいろいろな差分の操作方法があります。

Gblame でどんどん歴史をたどれる。

fugitive には git blame のためのコマンド :Gblame があります。

ある特定の行の変更をたどりたいときは blame 側のウィンドウでその行に移動し、~ または P を押します。
~ は HEAD~ みたいな感じです。2~ で 2 世代前のコミットに移動できます。
逆に P は HEAD^ で 2^ で 2 番目の親を指定できます。

もう一度押すとさらに歴史をたどれます。

この行への変更がコミットした時点のファイルの状態をみたい場合は Enter を押します。

終了するには q か gq を押します
q だと blame が終了してもウィンドウの状態はそのままです。
gq は blame を終了してワークツリーの状態に戻ります。

ステータスラインにブランチ名を表示

地味に一番感動した機能。
statusline に %{fugitive#statusline()} を追加すると、ステータスラインに今いるブランチ名が表示されるようになります。

rails + mongoDB

Ubuntu 11.10 に rails + mongoDB な環境を構築したのでメモ。

10gen の GPG キーをインストール

$ apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10

10gen のリポジトリを追加

$ sudo vim /etc/apt/sources.list

で管理者権限でファイルを開き、以下の URL を追加します。

deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen

mongoDB のインストール

$ sudo apt-get update
$ sudo apt-get install mongodb-10gen

rails new

ActiveRecord はいらないので、-O (--skip-active-record) をつける。

$ rails new hoge -O

mongoid をインストール

gem 'mongoid'
gem 'bson_ext'
$ bundle install

Vim のプラグインを Vundle でインストールして Git で管理しようとしたらハマった

vimrc に

Bundle 'rails.vim'

を記述して

:BundleInstall

みたいな感じで rails.vim を ~/.vim/bundle/vundle にインストールしたあと、.vim ディレクトリで

$ git add .

しても、

#	new file:   bundle/rails.vim
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#	modified:   bundle/rails.vim (untracked content)

みたいな感じで untracked content と言われる。

解決方法

調べたけどよくわからなかった。
とりあえず、.gitignore に bundle/* を追加して解決した。

Vim のインサートモードで方向キーが A B C D になる・・・。

現象

Vim のインサートモード時に hoge と入力したあと、方向キー(↑、↓、→、←)を入力すると、

D
C
B
A
hoge

みたいな感じで1行上に移動しながら A B C D という文字入力になる。
まぁ、普段はあまり方向キーを入力しないので気にならないです。
が、neocomplcache で補完候補を選ぶときにも文字入力になってしまうので候補が選べなくなってしまいました・・・。

解決策

.vimrc に以下を追加

imap ^[OA <Up>
imap ^[OB <Down>
imap ^[OC <Right>
imap ^[OD <Left>

ちなみに入力方法は imapスペースのあとに Ctrl-V上矢印。
私の環境だと ^[ の部分の色が変わります。

原因

環境にもよると思いますが、どうやら、Vim のインサートモード時のカーソル移動は ANSI のエスケープシーケンスで行われているみたいです。
一連のエスケープシーケンスの途中が Vim に解釈されてしまって、最後の A B C D が入力されてしまう感じ?

sbt と scalatest をいれました。

sbt のインストール

sbt-launch.jar を拾ってきて、パスの通ったフォルダ(例: ~/bin)に置く。
以下のようなスクリプトファイルを作成して sbt という名前で保存。

java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"

作ったファイルに実行権限を付与する。

$ chmod u+x ~/bin/sbt

sbt の実行

sbt でコンパイルと実行を行うには次のようにします。

$ sbt
..
> run
Hello, World

heroku にデプロイするときにハマった。

ローカルでは問題なく動作するアプリケーションを

$ git push heroku

で heroku にデプロイしてみたんだけど、 We’re sorry, but something went wrong. とか表示されてうまく動かない・・・。

原因は heroku サーバー上でのマイグレーションのし忘れ。

$ heroku rake db:migrate

マイグレーションを実行してから git push heroku すれば OK でした。

あと、ローカルのデータベースの内容は

$ heroku db:push

でサーバー側に転送できる。