Hatena::ブログ(Diary)

ヤルキデナイズドだった

Yarukidenized

2012-04-13

[]Zsh で文脈に応じて内容が変わるエイリアスを定義するやつ作った 01:39 Zsh で文脈に応じて内容が変わるエイリアスを定義するやつ作った - ヤルキデナイズドだった を含むブックマーク

バージョン管理狂の皆様におかれましては alias st='git status' などのエイリアスは当然定義されていることと思います。

うっかり Mercurial リポジトリの中で st を叩いてしまって fatal: Not a git repository などと言われ、ここで st つったら hg status に決まってるだろボケがとターミナルを叱責した経験も当然あることと思います。

泣く泣く gsthst を定義したものの、3文字打つのがかったるくて枕を濡らしたことも当然一度や二度ではないことでしょう。

というわけでちょっと賢いエイリアスを定義できるやつを作りました。 Git リポジトリの中で st を叩いたら git statusになり、Mercurial リポジトリの中では hg status になる、そんな空気の読めるやつです。

uasi/zsh-context-sensitive-alias ? GitHub

こういう感じで使えます:

# {{{ in ~/.zshrc

# 初期化
source csa.zsh
csa_init

# コンテキストを指定してエイリアスを定義する
# csalias <context> <alias> <command>
csalias git st 'git status'
csalias hg st 'hg status'
csalias rake ra 'rake'
csalias bundler ra 'bundle exec rake'

# cd 先のリポジトリの種類に合わせてコンテキストを設定する(詳細は後述の sample-zshrc.zsh で)
function chpwd() { ... }

# }}} 

# Git リポジトリに cd すると st == git status になる
$ cd git-repo
$ st
# On branch master
nothing to commit (working directory clean)

# Hg リポジトリに cd すると st == hg status になる
$ cd hg-repo
$ st
? readme.txt

# リポジトリでないディレクトリでは st は未定義
$ cd not-a-repo
$ st
zsh: command not found: st

# Rakefile があるディレクトリに cd すると ra == rake になる
$ cd some-ruby-lib
$ ra --version
rake, version 9.2.2

# Gemfile があるディレクトリに cd すると ra == bundle exec rake になる
# (同じディレクトリに Rakefile があっても ra == rake にはならない)
$ cd some-rails-proj
$ ra --version
rake, version 9.1.0

詳しい使い方は README.markdownsample-zshrc.zsh を読んでください。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証