「Fish」の版間の差分
(→入出力: 同期) |
(→ヒントとテクニック: 同期) |
||
97行目: | 97行目: | ||
==ヒントとテクニック== |
==ヒントとテクニック== |
||
+ | === コマンド置換 === |
||
− | === fish をデフォルトシェルに設定しない === |
||
+ | ''fish'' は Bash スタイルの履歴置換 (例:{{ic|sudo !!}}) を実装していません。開発者は [https://fishshell.com/docs/current/faq.html#why-doesn-t-history-substitution-etc-work fish faq] で、代わりにインタラクティブな履歴呼び出しインターフェースを使用するよう推奨しています: {{ic|Up}} 矢印は過去の行全体を呼び出し、{{ic|Alt+Up}} は個々の引数を呼び出します。(または {{ic|Alt+.}}) は個々の引数を呼び出し、{{ic|Alt+s}} は既存の行の前に {{ic|sudo}} を追加します。 |
||
− | Arch ではシェルスクリプトは [[Bash]] を使って書かれており、fish と完全な互換性がありません。fish をデフォルトシェルに設定しないことで、起動時に実行される Bash スクリプトで環境変数を正しく設定できます。また、fish などの Bash 非互換のターミナルを使った場合に起こる問題を避けられます。デフォルトシェルを fish に設定するとスクリプトエラーが発生します。以下では fish をデフォルトシェルに設定しないで使用する方法を説明しています。 |
||
+ | しかし、いくつかの回避策が [https://github.com/fish-shell/fish-shell/wiki/Bash-Style-Command-Substitution-and-Chaining-(!!-!$) fish wiki] に記述されています。完全な履歴置換はできませんが、いくつかの関数は {{ic|!!!}} を直前のコマンドに、{{ic|!$}} を直前の最終引数に置き換えます。 |
||
− | ==== .bashrc から fish を起動する ==== |
||
− | |||
− | デフォルトシェルを Bash のままにしておいて {{ic|exec fish}} という行を[[Bash#設定ファイル|シェルの設定ファイル]] (例: {{ic|.bashrc}}) に追加してください。これで Bash が {{ic|/etc/profile}} や {{ic|/etc/profile.d}} のファイルを正しく読み込んでくれます。''fish'' は bash のプロセスを置き換えるため、''fish'' を終了するとターミナルも終了します。ローカルマシンだけでなく SSH サーバーでも使える方法のため、以下で説明する方法よりも汎用的です。 |
||
− | |||
− | {{Tip|上記のように設定する場合、{{ic|bash --norc}} を使うことで {{ic|~/.bashrc}} に書かれているコマンドを実行することなく Bash を開くことができます。普通に Bash を起動すると即座に Fish に戻ってしまいます。}} |
||
− | |||
− | ==== ターミナルエミュレータのオプションを使用する ==== |
||
− | |||
− | fish を起動するコマンドラインオプションを使用してターミナルエミュレータを開くという方法もあります。大抵のターミナルでは {{ic|-e}} スイッチを使います。例えば fish を使用して gnome-terminal を開くには、ショートカットを以下のように変更してください: |
||
− | |||
− | gnome-terminal -e fish |
||
− | |||
− | シェルの設定をサポートしていない LilyTerm などの軽量ターミナルエミュレータでは以下のように設定してください: |
||
− | |||
− | SHELL=/usr/bin/fish lilyterm |
||
− | |||
− | ターミナルの設定からターミナルのデフォルトシェルを fish に設定できたり、ターミナルエミュレータにプロファイル機能がある場合、ターミナルプロファイルで設定できることがあります。 |
||
− | |||
− | どちらにしてもターミナルエミュレータを開いたら、fish が起動するようになります。 |
||
− | |||
− | ==== ターミナルマルチプレクサのオプションを使用する ==== |
||
− | |||
− | [[tmux]] で起動するシェルを fish に設定するには、以下を {{ic|~/.tmux.conf}} に記述してください: |
||
− | |||
− | set-option -g default-shell "/usr/bin/fish" |
||
− | |||
− | ''tmux'' を起動すると fish が立ち上がるようになります。 |
||
− | |||
− | === fish をデフォルトシェルに設定する === |
||
− | |||
− | fish をデフォルトシェルとして設定した場合、パスが正しく設定されていないことに気づくでしょう。{{ic|~/.config/fish/config.fish}} ファイルにセクションを追加してログイン時にパスを適切に設定することができます。ログインシェルの場合だけ実行される {{ic|.profile}} や {{ic|.bash_profile}} と同じです。 |
||
− | |||
− | {{bc| |
||
− | if status --is-login |
||
− | set PATH $PATH /usr/bin /sbin |
||
− | end |
||
− | }} |
||
− | |||
− | {{Note|{{ic|$MOZ_PLUGIN_PATH}} など、他の環境変数も手動で追加する必要があります。fish をデフォルトシェルとしてシームレスに使えるようにするには骨が折れる作業量になります。[[#fish をデフォルトシェルに設定しない|fish をデフォルトシェルに設定しない]]方が簡単です。}} |
||
=== グリーティングを無効化 === |
=== グリーティングを無効化 === |
||
166行目: | 128行目: | ||
</nowiki>}} |
</nowiki>}} |
||
− | === |
+ | === プロンプトに git の状態を表示する === |
+ | git ディレクトリにいるときに、fish にブランチやダーティの状態を表示させたい場合は、以下の {{ic|fish_prompt}} 関数を定義するとよいでしょう。 |
||
− | [https://github.com/nojhan/liquidprompt Liquidprompt] は Bash と Zsh 用に作られたフル機能の人気のあるアダプティブプロンプトですが fish に対応する予定はありません [https://github.com/nojhan/liquidprompt/pull/230]。[https://github.com/wesbarnett/fish-lp fish-lp プロジェクト] は fish で Liquidprompt を実装しています。 |
||
+ | {{hc|~/.config/fish/functions/fish_prompt.fish| |
||
− | === プロンプトに git の状態を表示する === |
||
+ | function fish_prompt |
||
+ | set -l last_status $status |
||
+ | if not set -q __fish_git_prompt_show_informative_status |
||
− | カレントディレクトリが git ディレクトリの場合に fish でブランチなどの状態を表示するには、以下を {{ic|~/.config/fish/config.fish}} に追加します: |
||
+ | set -g __fish_git_prompt_show_informative_status 1 |
||
− | {{bc|<nowiki> |
||
+ | end |
||
− | # fish git prompt |
||
+ | if not set -q __fish_git_prompt_color_branch |
||
− | set __fish_git_prompt_showdirtystate 'yes' |
||
+ | set -g __fish_git_prompt_color_branch brmagenta |
||
− | set __fish_git_prompt_showstashstate 'yes' |
||
+ | end |
||
− | set __fish_git_prompt_showupstream 'yes' |
||
+ | if not set -q __fish_git_prompt_showupstream |
||
− | set __fish_git_prompt_color_branch yellow |
||
+ | set -g __fish_git_prompt_showupstream "informative" |
||
+ | end |
||
+ | if not set -q __fish_git_prompt_showdirtystate |
||
+ | set -g __fish_git_prompt_showdirtystate "yes" |
||
+ | end |
||
+ | if not set -q __fish_git_prompt_color_stagedstate |
||
+ | set -g __fish_git_prompt_color_stagedstate yellow |
||
+ | end |
||
+ | if not set -q __fish_git_prompt_color_invalidstate |
||
+ | set -g __fish_git_prompt_color_invalidstate red |
||
+ | end |
||
+ | if not set -q __fish_git_prompt_color_cleanstate |
||
+ | set -g __fish_git_prompt_color_cleanstate brgreen |
||
+ | end |
||
+ | printf '%s%s %s%s%s%s ' (set_color $fish_color_host) (prompt_hostname) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal) (__fish_git_prompt) |
||
− | # Status Chars |
||
+ | |||
− | set __fish_git_prompt_char_dirtystate '⚡' |
||
+ | if not test $last_status -eq 0 |
||
− | set __fish_git_prompt_char_stagedstate '→' |
||
+ | set_color $fish_color_error |
||
− | set __fish_git_prompt_char_stashstate '↩' |
||
+ | end |
||
− | set __fish_git_prompt_char_upstream_ahead '↑' |
||
+ | echo -n '$ ' |
||
− | set __fish_git_prompt_char_upstream_behind '↓' |
||
+ | set_color normal |
||
− | |||
− | function fish_prompt |
||
− | set last_status $status |
||
− | set_color $fish_color_cwd |
||
− | printf '%s' (prompt_pwd) |
||
− | set_color normal |
||
− | printf '%s ' (__fish_git_prompt) |
||
− | set_color normal |
||
end |
end |
||
+ | }} |
||
− | </nowiki>}} |
||
+ | |||
+ | しかし、これは現在では非推奨となっています。[https://github.com/fish-shell/fish-shell/blob/master/share/functions/__fish_git_prompt.fish fish-shell git] を参照してください。代わりに、[https://mariuszs.github.io/blog/2013/informative_git_prompt.html Informative Git Prompt] が fish に組み込まれ、必要であれば fish_config から起動できるようになりました。 |
||
=== SSH のプロンプトでホスト名に色を付ける === |
=== SSH のプロンプトでホスト名に色を付ける === |
2023年2月20日 (月) 06:31時点における版
fish (friendly interactive shell) は主に対話的に使用することを意図されたユーザフレンドリーなコマンドラインシェルです。
インストール
fish パッケージをインストールしてください。開発版は fish-gitAUR パッケージでインストールできます。
fish をデフォルトシェルにしたい場合は、シェル#デフォルトシェルを変更するを見てください。ただし、fish はデフォルトシェルにしないことを推奨します。
インストールしたら fish
を実行することで fish シェルが起動します。
ドキュメントは fish から help
を実行することでウェブブラウザが開いて確認できます。fish の構文は他のシェルと異なっているので、最低でも "Syntax overview" セクションを読むことを推奨します。
システムへの統合
fish をデフォルトのユーザーシェルとするのか、つまりログイン時に直接 fish に入るのか、それとも現在のデフォルトシェルの子プロセスとしてインタラクティブシェルモードで使用するのか、ここでは後者を Bash と仮定しています。この2つの設定について詳しく説明します。
- デフォルトシェル として使用される fish: このモードでは、fish の機能とそのスクリプト言語に関する基本的な理解が必要です。ユーザーの現在の初期化スクリプトと環境変数を新しい fish 環境に移行する必要があります。このモードでシステムを設定するには、fish をデフォルトのシェルとして設定する に従ってください。
- インタラクティブシェルオンリー: このモードでは、Bash の初期化スクリプトは通常通り実行され、fish はターミナルに接続された対話型モードで Bash の上で実行されるため、混乱が少ないモードです。このモードで fish を設定するには、fish をインタラクティブシェルとして設定する に従ってください。
fish をデフォルトのシェルとして設定する
fish をデフォルトのユーザーシェルとして設定することに決めた場合、最初のステップは、この特定のユーザーのシェルを /usr/bin/fish
に設定することです。これは、コマンドラインシェル#デフォルトシェルを変更する の説明に従って行うことができます。
次のステップは、様々な Bash の初期化スクリプト、すなわち /etc/profile
, ~/.bash_profile
, /etc/bash.bashrc
, ~/.bashrc
で行われる現在必要な動作と設定を、fish フレームワークに移植するものです。
特に、環境変数 $PATH
の内容は、一度 fish に直接ログインして確認し、自分の必要性に応じて調整することが必要です。fish では、$PATH
は グローバル環境変数 として定義されています。すべての機能にわたって グローバル なスコープを持ち、再起動すると失われ、子プロセスにエクスポートされる 環境変数 となります。パスに場所を追加する推奨方法は、config.fish
から fish_add_path コマンドを呼び出す方法です。例えば
$ fish_add_path -p /first/path /second/path /third/one
これら 3つの場所がパスの先頭に追加されます。
fish をインタラクティブシェルとして設定する
fish をシステム全体またはユーザーのデフォルトとして設定しないと、起動時に現在の Bash スクリプトを実行できます。これにより、現在のユーザーの環境変数が変更されず、Bash の子として実行される fish にエクスポートされます。以下は、fish をデフォルトのシェルとして設定せずにインタラクティブシェルモードで実行するいくつかの方法です。
.bashrc を変更して fish にドロップするようにします
デフォルトのシェルを Bash にして、 exec fish
という行を .bashrc
などの適切な Bash#設定ファイル に追加するだけでよいのです。これにより、Bash は /etc/profile
と /etc/profile.d
にあるすべてのファイルを適切にソースするようになります。fish は Bash のプロセスを置き換えるので、fish を終了すると端末も終了します。以下のオプションと比較すると、これはローカルマシンでも SSH サーバでも動作するため、最も普遍的な解決策と言えます。
ターミナルエミュレータでオプションを使用する
もうひとつの方法は、fish を実行するコマンドラインオプションを指定してターミナルエミュレータを開くことです。ほとんどのターミナルでは、これは -e
スイッチなので、たとえば fish を使って gnome-terminal を開くには、ショートカットを変更してください。
gnome-terminal -e fish
lilyterm-gitAUR など、シェルの設定をサポートしていない端末エミュレーターでは、次のようになります。
SHELL=/usr/bin/fish lilyterm
また、ターミナルによっては、ターミナル設定またはターミナルプロファイルで fish をデフォルトのシェルとして設定できる場合があります。
ターミナルマルチプレクサでオプションを使用する
tmux で開始されたシェルとして fish を設定するには、これを ~/.tmux.conf
に入れます:
set-option -g default-shell "/usr/bin/fish"
tmux を実行するたびに、fish にドロップされます。
設定
fish のユーザー設定ファイルは ~/.config/fish/config.fish
に存在しています。.bashrc
と同じように、ターミナルが開かれる時に実行/定義するコマンド、関数を追加します。
ウェブインターフェイス
fish のプロンプトとターミナルの色はウェブインターフェイスで対話的に設定できます:
fish_config
選択した設定は、個人用の設定ファイルに書き込まれます。また、定義された関数と履歴を表示することができます。
コマンド補完
fish は man ページから自動補完を生成できます。~/.config/fish/generated_completions/
に補完が書き込まれており、以下を呼び出すことによって生成することができます:
fish_update_completions
また、独自の補完を ~/.config/fish/completions/
に定義できます。/usr/share/fish/completions/
でいくつかの例を見ることができます。
fish の開発元のポリシーが、上流の tarball に存在する補完を全て含めるというものなので pacman, pacman-key, makepkg, cower, pbget, pacmatic などの Arch Linux 固有のコマンドの文脈に沿った補完も fish に含まれています。メモリ管理が賢いために、リソースに悪影響を与えることはありません。
ヒントとテクニック
コマンド置換
fish は Bash スタイルの履歴置換 (例:sudo !!
) を実装していません。開発者は fish faq で、代わりにインタラクティブな履歴呼び出しインターフェースを使用するよう推奨しています: Up
矢印は過去の行全体を呼び出し、Alt+Up
は個々の引数を呼び出します。(または Alt+.
) は個々の引数を呼び出し、Alt+s
は既存の行の前に sudo
を追加します。
しかし、いくつかの回避策が fish wiki に記述されています。完全な履歴置換はできませんが、いくつかの関数は !!!
を直前のコマンドに、!$
を直前の最終引数に置き換えます。
グリーティングを無効化
デフォルトでは、fish は起動時にグリーティングメッセージを表示します。無効にするには、fish の設定ファイルに set fish_greeting
と追加してください。
su で fish を起動する
su で Bash が起動する場合、fish の設定ファイルに以下の関数を定義します:
function su /bin/su --shell=/usr/bin/fish $argv end
ログイン時に X を起動
以下を ~/.config/fish/config.fish
の最後に追加してください:
# Start X at login if status --is-login if test -z "$DISPLAY" -a $XDG_VTNR = 1 exec startx -- -keeptty end end
プロンプトに git の状態を表示する
git ディレクトリにいるときに、fish にブランチやダーティの状態を表示させたい場合は、以下の fish_prompt
関数を定義するとよいでしょう。
~/.config/fish/functions/fish_prompt.fish
function fish_prompt set -l last_status $status if not set -q __fish_git_prompt_show_informative_status set -g __fish_git_prompt_show_informative_status 1 end if not set -q __fish_git_prompt_color_branch set -g __fish_git_prompt_color_branch brmagenta end if not set -q __fish_git_prompt_showupstream set -g __fish_git_prompt_showupstream "informative" end if not set -q __fish_git_prompt_showdirtystate set -g __fish_git_prompt_showdirtystate "yes" end if not set -q __fish_git_prompt_color_stagedstate set -g __fish_git_prompt_color_stagedstate yellow end if not set -q __fish_git_prompt_color_invalidstate set -g __fish_git_prompt_color_invalidstate red end if not set -q __fish_git_prompt_color_cleanstate set -g __fish_git_prompt_color_cleanstate brgreen end printf '%s%s %s%s%s%s ' (set_color $fish_color_host) (prompt_hostname) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal) (__fish_git_prompt) if not test $last_status -eq 0 set_color $fish_color_error end echo -n '$ ' set_color normal end
しかし、これは現在では非推奨となっています。fish-shell git を参照してください。代わりに、Informative Git Prompt が fish に組み込まれ、必要であれば fish_config から起動できるようになりました。
SSH のプロンプトでホスト名に色を付ける
SSH 経由で接続するたびにプロンプトでホスト名を動的に色付けするには、fish_prompt 関数または fish 設定ファイルのいずれかに次の行を追加します。ここでは赤色を使用しています。
~/.config/fish/functions/fish_prompt.fish
... if set -q SSH_TTY set -g fish_color_host brred end ...
ssh-agent の評価
fish では適切な変数が設定されていないため eval (ssh-agent)
を実行するとエラーが生成されます。この問題を解決するには、csh 風のオプションである -c
を使ってください:
$ eval (ssh-agent -c)
"command not found" フック
pkgfile には "command not found" フックが含まれており、認識できないコマンドを入力したときに自動的に公式リポジトリが検索されます。pkgfile をインストールすると自動的にフックが実行されるようになっています。
ジョブリストからプロセスを削除する
fish を終了するとバックグラウンドで実行されているジョブは全て fish によって終了されます。fish の終了後もジョブを実行し続けるには disown
を使ってください。例えば、以下のコマンドは firefox
をバックグラウンドで起動してからプロセスとの関係を断ち切ります:
$ firefox & $ disown
fish のプロセスが終了しても firefox が閉じられることはありません。詳しくは fish で disown(1) の man ページを見てください。
一時的なエイリアスを永続化する
fish シェルを開いて以下のようにコマンドを実行することで簡単に永続的なエイリアスを作成することができます。
$ alias lsl "ls -l" $ funcsave lsl
fish バージョン3.0 以降では、エイリアス --save(-s) オプションをサポートしています。
$ alias -s lsl "ls-l"
これは関数を作成します。
function lsl ls -l $argv end
fish のシェル関数としてエイリアスが設定されます。シェル関数を確認・編集したい場合、fish_config
を使って作成されるウェブ設定ページの Function ページから全ての関数を閲覧できます。
詳細については、 alias - create a function — fish-shell
トラブルシューティング
履歴置換
Fish は履歴置換 (例: sudo !!
) を実装しておらず、fish の開発者は 実装する予定もない と発言しています。しかしながら、履歴置換は多くのユーザーにとって必要不可欠な機能です。Reddit ユーザーの crossroads1112 が履歴置換の機能を再現した関数を作成しています (ただし構文は異なっています)。関数は github にあり、使い方はコメントとして書いてあります。オリジナルの構文に近づけた フォークバージョン も存在し、ヘルパー関数でコマンドを指定すれば command !!
が使えます。
command !!
を使用できるようにする方法は Fish の github wiki にもあります。bind_bang
関数で !!
をコマンド履歴の最後のコマンドに展開する例が載っています。こちらの github issue も参照してください。
参照
- http://fishshell.com/ - ホームページ
- http://fishshell.com/docs/current/index.html - ドキュメント
- http://hyperpolyglot.org/unix-shells - シェル文法の対応表