FishとAtuinの使い方

何年も前に、fish shellに関する記事を読みました。長年zshとOh My Zshを使ってきたので、とてもスムーズに動作し、乗り換える気にはなれませんでした。ある日、ふとfishを試してみようと思い立ちました。数ヶ月使っていますが、なかなか良いです。

これはあくまで個人的な意見です。

1. メリット

  • 補完機能と候補表示機能はzshよりも強力です。私はfishをほぼネイティブで使用しており、追加設定は一切していません。表示されるプロンプトはAIによるもののように感じることもあります。

ディレクトリに移動してコマンドを実行すると、常に正しいプロンプトが表示されます。

以下に示すように、Wineのソースディレクトリに移動して再コンパイルの準備をしています。ドットを入力すると、完全なコマンド名が表示されます。Ctrl+Fまたは右矢印キーを押すと、コマンドが自動的に補完されます。

fish-suggests

例えば、「ip」と入力してスペースキーを押し、「Tab」キーを押すと、「ip」コマンドのサブオプションがポップアップ表示されます。正直なところ、「ip」コマンドは最近かなり複雑で、私はもう覚えられないほど年老いて体も弱っているので、このようなプロンプトは本当に助かります。

ip-suggests

それだけではありません!次に、「ip link」と入力してスペースキーとタブキーを押します。サブコマンドとコアプロンプトが同時に表示されます。もちろん、履歴補完機能も引き続き利用できるので、好きなものを選択できます。

ip-link-suggests

このようなプロンプトは非常に便利で、日々の仕事の効率を大幅に向上させてくれると断言できます。

  • 高速です。動作を遅くするものは何でも面倒です。

ネイティブfishの組み込み機能は、日常的な運用には十分すぎるほどです。Oh My Zshのような追加機能は必要ありません。素の状態から実行する方がはるかに安全です。

  • シンプルな設定

fish_configと入力してください。

1➜ ~ fish_config
2Web config started at file:///tmp/web_config22yhky5b.html
3それでもうまくいかない場合は、http://localhost:8000/af9321754796589c755386f704c81785/ を開いてみてください。
4ENTERキーを押して停止してください。

デフォルトのブラウザに表示されるWebページで、色、プロンプト、その他の設定を行います。

fish-config

help と入力してください。

1➜ ~ help
2ヘルプ: xdg-open でヘルプが表示されています。

ブラウザに file:///usr/share/doc/fish/index.html が表示され、オフラインドキュメントが表示されます。

fish-doc-offline

2. デメリット

  • 互換性が低い

例えば、Python 仮想環境をアクティブ化するには、次のように実行する必要があります。

1➜ google-api-python-client . .venv/bin/activate.fish
2(.venv) ➜ google-api-python-client

activate.fish スクリプトが付属しているので、それほど面倒ではないようです。

一部のシェルスクリプトは直接実行できません。このような場合、私は通常 bash コマンドを実行して一時的に切り替えます。

他に方法はありません。ほとんどのシステムでは bash がデフォルトのシェルとして付属しています。

今のところ、他に不便な点は見当たりません。

要するに、個人的には fish シェルは個人使用に非常に適していると思います。高速で便利です。数ヶ月使用した後、しばらくは zsh に切り替えるつもりはありません。

3. Atuin を使ったシェル履歴の管理

少し前に Atuin プロジェクトを試してみましたが、最初は大きな進歩だと思いました。主な問題は、デフォルトで上矢印キーが優先されてしまうことで、これに慣れるのが難しかったです。

Atuin のインストール方法と使い方については、ここでは詳しく説明しません。オンラインで簡単なチュートリアルが数多く見つかります。

私はクラウド同期機能は使用していません。最近は履歴をサードパーティに保存するのは不可能です。暗号化は安全で誰にも見られないものの、個人データは自分で管理する方が賢明です。

クラウド同期がない場合、デフォルトのデータはSQLiteに保存されます。データ構造は次のとおりです。

atuin-history

実行時間、実行コマンド、終了ステータス、作業ディレクトリ、ホスト名などが記録されます。

他のシェルから履歴をインポートすることもできますが、繰り返しインポートした場合に重複が削除されるかどうかはテストしていません。

 1➜ ~ atuin import zsh
 2Atuin
 3=======================
 4🌍
 5🐘🐘🐘🐘
 6🐢
 7=========================
 8履歴をインポートしています...
 9zshから履歴をインポートしています
10インポート完了!
11➜ ~ atuin import bash
12Atuin
13=======================
14🌍
15🐘🐘🐘🐘
16🐢
17=========================
18履歴をインポートしています...
19bash から履歴をインポートしています
20インポート完了!

他のシェルをインポートします。これは、ポータブルな履歴データベースを持つようなものです。

1➜ ~ ファイル ~/.local/share/atuin/history.db
2/home/mephisto/.local/share/atuin/history.db: SQLite 3.x データベース、最終書き込み時 SQLite バージョン 3038002、書き込みバージョン 2、読み取りバージョン 2、ファイルカウンタ 72、データベースページ 966、Cookie 0x4、スキーマ 4、UTF-8、バージョン有効期間 72

このデータベースファイルを保存しておけば、新しいコンピュータを購入しても履歴を取得できます。これは業界における真に良心的な取り組みです。

4. fish での atuin の矢印キーのバインド解除

他の人の意見は分かりませんが、個人的にはシェルの矢印キーを使用し、atuin の検索キーを Ctrl + R にバインドするのが好きです。結局のところ、zsh も fish も atuin のような強力な検索機能を備えていないからです。

fish で上矢印キーのバインドを無効にしてみましょう。

 1➜ fish pwd
 2/home/mephisto/.config/fish
 3➜ fish cat config.fish
 4if status is-interactive
 5# 対話型セッションで実行するコマンドはここに記述できます
 6set -gx ATUIN_NOBIND "true"
 7atuin init fish | source
 8bind \cr _atuin_search
 9end
10
11function fish_greeting
12end

この設定にはドキュメントが必要です。公式ドキュメントには zsh の例しか記載されていません。

なぜ動作するのでしょうか?最後の部分をご覧ください:

 1➜ ~ atuin init fish
 2set -gx ATUIN_SESSION (atuin uuid)
 3
 4function _atuin_preexec --on-event fish_preexec
 5set -gx ATUIN_HISTORY_ID (atuin history start "$argv[1]")
 6end
 7
 8function _atuin_postexec --on-event fish_postexec
 9set s $status
10if test -n "$ATUIN_HISTORY_ID"
11RUST_LOG=error atuin history end $ATUIN_HISTORY_ID --exit $s &
12disown
13end
14end
15
16function_atuin_search
17set h (RUST_LOG=error atuin search -i (commandline -b) 3>&1 1>&2 2>&3)
18commandline -f repaint
19if test -n "$h"
20コマンドライン -r $h
21end
22end
23
24if test -z $ATUIN_NOBIND
25bind \cr _atuin_search
26bind -k up _atuin_search
27bind \eOA _atuin_search
28bind \e\[A _atuin_search
29
30if bind -M insert > /dev/null 2>&1
31bind -M insert \cr _atuin_search
32bind -M insert -k up _atuin_search
33bind -M insert \eOA _atuin_search
34bind -M insert \e\[A _atuin_search
35end
36end

変数 ATUIN_NOBIND に文字列 "true" が含まれており、長さが 0 でないことを確認します。

-z STRING STRING の長さが 0 の場合、true を返します。

if 文内の様々な演算はバインドされないため、設定が実行されます。

この設定により、デフォルトの矢印キー機能を過度に大きな範囲で使用せずに使用できるだけでなく、履歴を一元管理し、より高度な atuin 検索機能(Ctrl + R を押すことで起動)も使用できます。非常に便利です。

Atuin アイコン:

atuin-search

atuin の機能の詳細については、ドキュメントをご覧ください。

最終更新日: Saturday, October 25, 2025

翻訳: