hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

fish shellのprompt_pwdを少し改造する

イントロ

日々fish shellを使っているのですが、
プロントの表示を変更したくなりました。 ただ、単純には変更できなかったのでカスタマイズしてみました。 というお話です。

一般的なやり方

fish shell で プロンプト を変更する場合は以下のコマンドを打ちます。

fish_config

ブラウザが起動して設定を選択することでプロンプトを変更できます。
選択して好きな設定にできます。

fish.rubikitch.com

変更した点

例えば以下のディレクトリで作業していた場合

/Users/hotoolong/.ghq/github.com/hotoolong/translate.nvim

変更前のプロンプトの表示は以下になります。(私の設定の場合)

~/.g/g/h/translate.nvim (master|✔) $ 

これでもいいのですが、 現在作業しているディレクトリと親のディレクトリも省略しないで表示してほしいのです。

なぜなら、githubディレクトリ構造だとオーナー名/リポジトリ名 になっているため、 自分が作業しているディレクトリがどのリポジトリ配下のかというのいちいちチェックしたくなかったからです。

ということで
いろいろ調べてみたのですが、
デフォルトでは省略されている名称のサイズは変更可能なのですが、
ディレクトリだけ省略を変更するようなオプションは見受けられませんでした。

ちなみに 省略名称のサイズを3に変更したい場合はconfigに以下のように設定します。

set -g fish_prompt_pwd_dir_length = 3

こうすることで

~/.ghq/git/hot/translate.nvim (master|✔) $

というように表示されます。
これはこれで便利ですが、やはり親ディレクトリもフルで表示されてほしい。

プロンプトで表示しているディレクトリ情報は prompt_pwd で取得できます。
コードは以下にあります。

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

prompt_pwd の内容はfish_prompt_pwd_dir_length 以外の 変更できないようです。
そこで関数を上書きしてみました。

最後の処理が省略して表示している処理になります。

string replace -ar '(\.?[^/]{'"$fish_prompt_pwd_dir_length"'})[^/]*/' '$1/' $tmp

この処理を変更して

set -l folders (string split -rm2 / $tmp)
echo (string replace -ar '(\.?[^/]{'"$fish_prompt_pwd_dir_length"'})[^/]*/' '$1/' $folders[1]'/')$folders[2]'/'$folders[3]

として/の右2つ分を取得してそれ以前のデータは既存のように省略データにしてつなぎ合わせています。
こうすることで

~/.g/g/hotoolong/translate.nvim (master|✔) $

となりました。 これで少し作業が捗りそうです。