あんパン

こしあん派

zshでghq管理ディレクトリ以下にいるときはPROMPTのpwdを省略して表示する

motemen/ghq使い始めた.ghqはGitのリポジトリ管理ツールみたいな感じ.

ghq自体かなり便利なのだけど,PROMPTにpwdを表示しているとこれが長くなって大変なことになる.

f:id:masawada:20160222013718p:plain

というわけで,ghq管理ディレクトリ以下にいるときは省略しようというのが今回の試み.

以下のコードを.zshrcに書いてシェルを再起動する.

precmd () {
  RPROMPT="%{${fg[cyan]}%}[$(pwd | sed -e "s,^$HOME,~," | perl -pe "s/~\/(.ghq|.go\/src)\/.+?\//ghq:/")]%{${reset_color}%}"
}

f:id:masawada:20160222014120p:plain

こうなる.

この設定のキモは

$(pwd | sed -e "s,^$HOME,~," | perl -pe "s/~\/(.ghq|.go\/src)\/.+?\//ghq:/")

の部分.pwdして,ルートからの絶対パスのうちホームディレクトリまでをsedで~に置き換えて,その後Perlで~/.ghq/または~/.go/src/があればこれをghq:に置換している.これはぼくが$GOPATH~/.ghqを管理ディレクトリにしているためで,ここは自分の設定にあわせて書き換えるとよさそう.なんかもう少し良い置換方法とかあったら教えてください.

precmdはプロンプト表示直前に実行される関数で,これを定義するとよしなに実行してくれる.設定がわちゃわちゃしているのは色の指定とかが入ってるため.

これで快適にghqを使うことができそう.zsh以外で使えるのかどうかは知らない.

case-insensitiveなファイルシステムにおいてGitで間違えてコミットしたcaseを修正する

TL;DR

git mv を使いましょう

何を言っているのか

OSXのファイルシステムはデフォルトでcase-insensitiveとなっている.OSを入れなおすことでcase-sensitiveにできたり,case-sensitiveなfsのパーティションを切ることもできる.なお,Linuxではたいていのファイルシステムはcase-sensitiveになっている.この差がよくない.

例えばmainWindow.jsというファイル名なのにimport MainWindow from './MainWindow'というコードを書くとMacでは正しくうごくが,Linuxでは動かないみたいなことが起きる(はず).これを修正するためにファイル名をMainWindow.jsに変更すると,MacではGitがファイル名の変更を正しく認識しないのでdiffが見えない.なので,修正するためにgit mvしようという話でした.git mvしておけば,別の人がすでにcloneしててもgit pullすればちゃんとファイル名を変えてくれる.

Macのfsをむやみにcase-sensitiveに変えるべきではないと思う.Mac用のツールが(無意識的に)case-insensitiveであることを前提に書かれている場合,不具合の原因となりうる.

実践

github.com

このrepoみたらだいたい言いたいことがわかると思う.