Fishシェルでターミナルのタイトルをプロジェクトルートからの相対パスっぽくする

by
カテゴリ:

Fishシェルを使いだしてから半年以上が経過しました。重厚な設定をしなくてもそれなりに使えて、起動も十分高速なことから、愛用しています。たまにBashコマンドのコピペしたい時はbash -c '...'するなり一時的にbashを起動すればいいので特に困ってもいません。

2024-5-27 fish使い始めた

ところでFishシェルはfish_title関数を設定しておくと、コマンドの実行前・後に関数が自動的に評価され、ターミナルのタイトルを更新できます。仮想端末ウィンドウのタイトルバーやタブバーの中身を動的に変更できる便利な関数です。

fish_title - define the terminal’s title
https://fishshell.com/docs/current/cmds/fish_title.html

カレントディレクトリの名前を表示してくれれば十分なケースが多いのですが、モノリポの場合など、プロジェクト内で作業ディレクトリを変更する場合には、プロジェクトルートからの相対パスが欲しくなるので、自前で実装してみました。

素朴にはこんな感じ。

# `config.fish`に書いてもいいが、
# ~/.config/private_fish/functions/fish_title.fish
# に記述しておくと、遅延ロードされる
function fish_title
  set -l wd
  if set -l gwd (git rev-parse --show-toplevel 2> /dev/null)
    set -l n (dirname "xx$gwd" | string length) # add extra characters to generate start index
    set wd (string sub --start $n $PWD)
  else
    set wd (basename $PWD)
  end

  echo -- $wd
end

実用しているfish_titleはもう少し工夫しています。

set -l _fish_title_pwd
set -l _fish_title_wd

function fish_title
  if not set -q INSIDE_EMACS; or string match -vq '*,term:*' -- $INSIDE_EMACS
    set -l ssh
    set -q SSH_TTY
    and set ssh "["(prompt_hostname | string sub -l 10 | string collect)"]"

    if test "$_fish_title_pwd" != "$PWD"
      set _fish_title_pwd $PWD
      if set -l gwd (git rev-parse --show-toplevel 2> /dev/null)
        set -l n (dirname "xx$gwd" | string length) # add extra characters to generate start index
        set _fish_title_wd (string sub --start $n $PWD)
      else
        set _fish_title_wd (basename $PWD)
      end
    end

    echo -- $ssh $_fish_title_wd
  end
end

ENJOY!