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 空格加 tab,連子命令和核心提示一併顯示出來了,當然歷史補全也還在,任君選擇。

ip-link-suggests

不得不說,這種提示夠方便,日常工作能提升不少效率。

  • 速度快,一切拖慢運行速度的東西都會讓人生厭。

原生 fish 自帶的功能,足夠應付日常各種操作,根本不需要 Oh My Zsh 等加持,裸奔更健康。

  • 配置簡單

輸入 fish_config

1➜  ~ fish_config
2Web config started at file:///tmp/web_config22yhky5b.html
3If that doesn't work, try opening http://localhost:8000/af9321754796589c755386f704c81785/
4Hit ENTER to stop.

在默認瀏覽器彈出的 web 頁面上即可配置 colorsprompt

fish-config

輸入 help

1➜  ~ help
2help: Help is being displayed in 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 腳本。

部分 shell 腳本無法直接運行,一般遇到這種狀況我會運行 bash 命令,臨時切換。

沒辦法,大部分系統自帶的 shell 都是 bash。

其它不方便的地方目前還沒有發現。

總之,我個人認爲,fish shell 很適合在私人電腦上使用,快捷方便,使用幾個月後,暫時是不會切會 zsh 了。

3. 使用 atuin 管理 shell 歷史

atuin 這個項目很早前我體驗過一次,一開始貌似步子邁大了。主要是它默認接管向上鍵,這一點很難適應。

至於怎麼安裝使用 atuin,這裏不寫,網上教程很多,也很簡單。

我不用它的雲同步功能,這年頭不可能把 history 記錄交給第三方存儲,雖然說加密安全,誰也看不到,個人數據還是掌控在自己手上比較好。

不開啓雲同步,默認數據是存在 SQLite 裏面的,數據結構如下所示:

atuin-history

裏面記錄了什麼時候、執行了什麼命令、退出狀態碼、工作目錄、主機名等。

可以導入其它 shell 的歷史記錄,重複導入會不會去重,沒有測試。

 1➜  ~ atuin import zsh
 2        Atuin
 3======================
 4          🌍
 5       🐘🐘🐘🐘
 6          🐢
 7======================
 8Importing history...
 9Importing history from zsh
10Import complete!
11➜  ~ atuin import bash
12        Atuin
13======================
14          🌍
15       🐘🐘🐘🐘
16          🐢
17======================
18Importing history...
19Importing history from bash
20Import complete!

導入其它各種 shell 的歷史記錄,相當於擁有了一個便攜 history 數據庫。

1➜  ~ file ~/.local/share/atuin/history.db
2/home/mephisto/.local/share/atuin/history.db: SQLite 3.x database, last written using SQLite version 3038002, writer version 2, read version 2, file counter 72, database pages 966, cookie 0x4, schema 4, UTF-8, version-valid-for 72

只要保存好這個數據庫文件,假設買了個新電腦,都可以找回 history 記錄,真是業界良心啊。

4. fish 下解除 atuin 的方向鍵綁定

不知道其它人感覺怎麼樣,反正我個人傾向於使用 shell 的方向鍵功能,atuin 搜索綁定 ctrl + r就好。畢竟不管是 zsh 還是 fish,搜索還是沒有 atuin 強大的。

fish 下面解除方向的盤綁定(Disable up arrow)設置:

 1➜  fish pwd
 2/home/mephisto/.config/fish
 3➜  fish cat config.fish
 4if status is-interactive
 5    # Commands to run in interactive sessions can go here
 6   set -gx ATUIN_NOBIND "true"
 7   atuin init fish | source
 8   bind \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
 5    set -gx ATUIN_HISTORY_ID (atuin history start "$argv[1]")
 6end
 7
 8function _atuin_postexec --on-event fish_postexec
 9    set s $status
10    if test -n "$ATUIN_HISTORY_ID"
11        RUST_LOG=error atuin history end $ATUIN_HISTORY_ID --exit $s &
12        disown
13    end
14end
15
16function _atuin_search
17    set h (RUST_LOG=error atuin search -i (commandline -b) 3>&1 1>&2 2>&3)
18    commandline -f repaint
19    if test -n "$h"
20        commandline -r $h
21    end
22end
23
24if test -z $ATUIN_NOBIND
25    bind \cr _atuin_search
26    bind -k up _atuin_search
27    bind \eOA _atuin_search
28    bind \e\[A _atuin_search
29
30    if bind -M insert > /dev/null 2>&1
31        bind -M insert \cr _atuin_search
32        bind -M insert -k up _atuin_search
33        bind -M insert \eOA _atuin_search
34        bind -M insert \e\[A _atuin_search
35    end
36end

檢測變量 ATUIN_NOBIND 爲字符串 “ture”,長度不爲 0

-z STRING Returns true if the length of STRING is zero.

if 裏面的各種操作不會綁定,自然就是執行你自己的設定了。

這樣一番配置後,既可以使用默認的方向鍵功能,不至於跨度過大,又能集中管理 history,使用更加高級的 autin 搜索功能(ctrl + r觸發),不錯的。

atuin 圖示:

atuin-search

更多 atuin 的功能,可以查看它的文檔。

最後修改於: Tuesday, January 30, 2024

相關文章:

翻譯: