ushumpei’s blog

生活で気になったことを随時調べて書いていきます。

Ctags と vim と Git

概要

vimでタグジャンプを楽にする方法です。以下適当な翻訳です。

参考: Effortless Ctags with Git

Ctags はコードのインデックスを作成し, 関数, 変数, クラス, その他の識別子への Vim でのジャンプを容易にします. Gitのフックはリポジトリ単位です(Git hooks). あるリポジトリに対して, 指定されたフックをインストールするスクリプトを使用するのが推奨されていますが, 手作業で面倒です. テンプレを作成して楽しましょう.

テンプレートのフック作成

git全体で使用するテンプレートディレクトリを設定, 作成します.

git config --global init.templatedir '~/.git_template'
mkdir -p ~/.git_template/hooks

ctagsファイルを作成します.

vim .git_template/hooks/ctags
#!/bin/sh
set -e
PATH="/usr/local/bin:$PATH"
dir="`git rev-parse --git-dir`"
trap 'rm -f "$dir/$$.tags"' EXIT
git ls-files | \
  ctags --tag-relative -L - -f"$dir/$$.tags" --languages=-javascript,sql
mv "$dir/$$.tags" "$dir/tags"

上の内容は,

  • set -e: スクリプト内の各コマンドの実行でエラーが出たら処理を中止する
  • PATH..: 環境変数/usr/local/binを追加
  • dir...: gitリポジトリのパスをdir変数に格納
  • trap..: EXITシグナルを検知したら, 古いタグ .git/tags を削除する?
  • git...: git管理下のファイルに対しctagsを生成, jsとsqlは除く
  • mv ...: 生成されたタグをtagsディレクトリに移動

という感じです.

各フックファイルを作成します。pre-commitは以下です。

#!/bin/sh
.git/hooks/ctags >/dev/null 2>&1 &

post-checkout, post-mergeも内容は一緒です. 最後に rebase, commit --amend の対応として post-rewrite を作成します.

#!/bin/sh
case "$1" in
  rebase) exec .git/hooks/post-merge ;;
esac

これでいけるはずです。

結局5つのファイルを作成しました。

/Users/ushumpei/.git_template
|--hooks
|  |--ctags
|  |--post-checkout
|  |--post-commit
|  |--post-merge
|  |--post-rewrite

感想

Ctagsについて昔書いた文章が見つかったので載せてみました。

trapgit rev-parseがわかっていない...