shellをもっと便利に ~リターン で ls実行〜
はじめに
私が参加している某エディタのコミュニティ内でshellのエイリアスの話になり、その中で「空エンターに ls
を割り当てている」という人がちらほらいました。自分的になるほどと思ったので自分なりのカスタマイズも加えて実装してみました。
なお今回はshellはzsh
を利用しています。他のshellでの動作確認はしておりません。
実際の動作
コマンド内容
今回は、以下の挙動を実装しました。
- lsコマンド
- カレントディレクトリがGitリポジトリの場合、現在のブランチを表示
コードは以下の通りになります。
function do_ls(){
if [[ -n "$BUFFER" ]]; then
return 0
fi
#if current dir is git repo, show now branch
if git rev-parse --git-dir > /dev/null 2>&1; then
echo "\n[branch]"
echo "$(git rev-parse --abbrev-ref @)"
fi
ls
echo "\n"
zle reset-prompt
return 0
}
zle -N do_ls
bindkey '^m' do_ls
lsコマンドのあとにecho "\n"
があるのは、zle reset-prompt の動作調整のためです。
zle reset-promptは以下のように定義されています。
reset-prompt (unbound) (unbound) (unbound)
Force the prompts on both the left and right of the screen to be re-expanded, then redisplay the edit buffer. This reflects changes both to the prompt variables themselves and changes in the expansion of the values (for example, changes in time or directory, or changes to the value of variables referred to by the prompt).
参考 : http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html
ls
のあとに reset-promptを書いてしまうと、実行結果の最終行が消えてしまうため、echo "\n"
を挟むことで最終行が消えることを防いでいます。
(なぜ最終行が消えてしまうのか詳しい方がいましたらぜひ教えて下さい。)
git branchの処理では、まずカレントディレクトリがGitリポジトリかどうかを判別しています。[1]
ブランチ取得は、git rev-parse --abbrev-ref @
で行っています。[2]
最後に
ということで今回は ls
だけでなく git branchも表示させるようにしてみました。
とても実用的ですし、ライブコーディングやペアプログラミングのときに、ちょっとした飛び道具にもなりそうですね。
-
@
はHEAD
の代わりです ↩︎
Discussion