Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

実践編:関数・プロンプト・オートロード

fish の高速起動を支える関数のオートロード機構、プロンプトのカスタマイズ手法、およびエイリアスを進化させた略語機能(abbr)を解説します。

関数の定義と引数の扱い

fish における関数は function キーワードで定義し、end で閉じます。

関数に渡された引数は、すべて $argv というリスト変数に格納されます。Bash のような $1 や $2 ではなく、$argv[1] や $argv[2] としてアクセスします。

function greet
    set -l name $argv[1]
    if test -z "$name"
        set name "Guest"
    end
    echo "Hello, $name!"
end

# 呼び出し
greet Alice

$argv は通常のリストであるため、count $argv による引数の個数取得や、for arg in $argv による走査が容易に行えます。

オートロード機構(遅延読み込み)

Bash や Zsh では、設定ファイル(.bashrc 等)に多数の関数や設定を記述するほどシェルの起動時間が遅くなります。

fish では、起動時にすべての関数をメモリに読み込むことはしません。ディレクトリ ~/.config/fish/functions/ 配下に「関数名.fish」というファイル名で保存しておくと、そのコマンドが実際にターミナルで呼び出された瞬間に自動で読み込まれます。

この仕組みにより、何千もの自作関数やツールを定義していても、fish の起動速度は常にミリ秒単位の超高速を維持できます。

» funcsave コマンド

ターミナルで定義した関数を即座にオートロード用ファイルとして保存できます。

# 定義した関数を ~/.config/fish/functions/greet.fish に自動保存
funcsave greet

プロンプトのカスタマイズ

fish のプロンプトは、通常の関数(fish_prompt)として定義されています。

» 左プロンプト(fish_prompt)

ターミナルの左側に表示される基本プロンプトです。set_color コマンドで文字色を装飾し、set_color normal でリセットするのが標準的な作法です。

function fish_prompt
    set_color cyan
    echo -n (prompt_pwd)  # 短縮されたカレントディレクトリ
    set_color green
    echo -n " > "
    set_color normal
end

» 右プロンプト(fish_right_prompt)

画面の右端に時刻や Git ブランチ名などを表示できます。入力中のコマンドが右端に近づくと、文字が重ならないよう自動的に非表示になります。

function fish_right_prompt
    set_color 888888
    echo -n (date "+%H:%M:%S")
    set_color normal
end

エイリアス(alias)と略語(abbr)

fish には、コマンドの短縮入力手段として alias と abbr の2つが用意されています。

» alias

入力したコマンドを別のコマンドに置き換える従来の仕組みです。内部的には小さな関数として定義されます。

alias ll="ls -la"

» abbr(略語機能:fish 推奨)

fish で強く推奨されるのが「略語(Abbreviation)」機能です。ターミナルで略語を入力してスペースキーや Enter キーを押すと、入力行の上で即座に正式なコマンドへ自動展開 されます。

# Git コマンドの略語登録
abbr -a gco "git checkout"
abbr -a gp  "git push"
abbr -a gst "git status"

» abbr の優れたメリット

  • 履歴の透明性: コマンド履歴には展開後の完全なコマンド(git checkout 等)が保存されるため、後から履歴を検索しやすくなります。
  • 共同作業での安心感: 画面共有やペアプログラミング中に独自のエイリアスで他者を混乱させることがありません。
  • スクリプトへの転用: 画面に表示された通りのコマンドをそのままスクリプトに貼り付けて利用できます。