ShellScript
Zsh
Linux

プロンプトに表示するカレントディレクトリのpathを画面幅によって短くする

2018-01-27_21_11_12.png

私はtmuxを使ってよく画面の分割を行ったり、ディスプレイの右半分にターミナルを配置したりします。その際にプロンプトを折り返して表示するのが、嫌だったので画面の横幅によってpathが短くなるようにしました。プロンプトを2行にしたり右プロンプトを使ったりして問題を解決する方法がよく見られますが、私には合いませんでした。

function __dirPrompt() {
  local pwd=$(pwd | sed "s@${HOME}@~@")
  local num=$(expr $(expr $(tput cols) - 55 | xargs -I{} sh -c "test 1 -gt {} && echo 1 || echo {}") / $(echo ${pwd} | grep -o '[~/]' | wc -l))

  PROMPT="%{${fg[white]}${bg[black]}%}%n@%m %{${fg[black]}${bg[blue]}%}%{${fg[black]}${bg[blue]}%} $(echo ${pwd} | sed "s@\(/[^/]\{${num}\}\)[^/]*@\1@g") %{${reset_color}${fg[blue]}%} "
}
autoload -Uz add-zsh-hook
add-zsh-hook precmd __dirPrompt

55はプロンプトの右端から画面の右端までの最低限の文字数です。
numはディレクトリ名の文字数です。
expr $(tput cols) - 55はプロンプトの表示に使う文字数です。負の数になる場合は文字数を1にしています。
echo ${pwd} | grep -o '[~/]' | wc -lで階層数。~は例外です。ホームディレクトリ配下だけ/が先頭にならないため。
sed "s@\(/[^/]\{${cnt}\}\)[^/]*@\1@g"でディレクトリ名を短くする。