📑

Fish shell の 1 文字ディレクトリ名を Bash で雑に実現する

2022/10/08に公開

はじめに

Fish shell において、デフォルトのプロンプトの場合ディレクトリを巡り深い階層までいくと一番深い階層のディレクトリ名以外は1文字で表示される。

例えばこのような形である。

~ > cd ~/aaa/bbb/ccc/ddd/
~/a/b/c/ddd >

この仕組みは、Fish shell に prompt_pwd という関数が組み込まれていて、それを標準で呼び出しているからである。
https://fishshell.com/docs/current/cmds/prompt_pwd.html

https://github.com/fish-shell/fish-shell/blob/master/share/functions/prompt_pwd.fish

Bashで実現する

上記の prompt_pwd は Fish で記述されているため、これを愚直に Bash で書き直して PS1 に付与すれば同じ事は出来るはずであるが (たぶん...)、さすがに面倒なので Python3 のワンライナーで雑に作るとこうなる。.bashrc などに記述して、PS1 に付与すればよい。

.bashrc
export PS1='$(eval "__prompt_pwd") \$'

__prompt_pwd() {
  if [[ "$PWD" == "$HOME" ]]; then
    echo "~"
  elif [[ "$HOME" =~ $PWD ]]; then
    echo "$PWD"
  else
    python3 -c "import sys; dirs = sys.argv[1].split('/'); dir = ['/' + d[:1] for d in dirs[1:-1]]; print(dirs[0] + ''.join(dir) + '/' + dirs[-1])" "${PWD/#$HOME/~}"
  fi
}

すると、プロンプトはこんな感じになる。

~ $ cd ~/aaa/bbb/ccc/ddd/
~/a/b/c/ddd $

Discussion