別讓 cd 命令浪費你的時間

終端下工作最煩躁的就是路徑切換,沒有自動路徑切換的幫助,就像在泥裏走路,於是大家發明了各種 autojump / z / fasd 等工具來提升路徑切換的效率,今天向大家介紹一個更好用的工具:z.lua,用熟練了以後就像終端裏溜冰,路勁切換從此指哪打哪。

z.lua 是一個會學習你使用習慣的 cd 命令,它會跟蹤你在 shell 下訪問過的路徑,通過一套稱爲 Frecent 的機制(源自 Mozilla),經過一段簡短的學習之後,z.lua 會幫你跳轉到所有匹配正則關鍵字的路徑裏 Frecent 值最高的那條路徑去。

正則將按順序進行匹配,"z foo bar" 可以匹配到 /foo/bar ,但是不能匹配 /bar/foo。

特性說明:

  • 性能比 z.sh 快三倍,比 fasd / autojump 快十倍以上。
  • 支持 Posix Shell:bash, zsh, dash, sh, ash, busybox 等等。
  • 支持 Fish Shell,Power Shell 和 Windows cmd。
  • 使用增強匹配算法,更準確的帶你去到你想去的地方。
  • 低佔用,能夠僅在當前路徑改變時才更新數據庫(將 $_ZL_ADD_ONCE 設成 1)。
  • 交互選擇模式,如果有多個匹配結果的話,跳轉前允許你進行選擇。
  • 交互選擇模式,支持使用 fzf 進行可視化結果篩選(可選)。
  • 快速跳轉到父目錄,或者項目根目錄,代替反覆 “cd ../../.." 。
  • 爲不同的操作系統,不同的 Shell 程序提供統一的使用體驗。
  • 兼容 lua 5.1, 5.2 和 5.3 以上版本。
  • 自包含且無額外依賴,單個 z.lua 文件完成所有工作。

軟件安裝:

將下面對應語句添加到你的 .bashrc / .zshrc / .profile 或者對應 shell 的初始化腳本末尾:

eval "$(lua /path/to/z.lua --init bash enhanced once echo)"    # BASH 初始化
eval "$(lua /path/to/z.lua --init zsh enhanced once echo)"     # ZSH 初始化
eval "$(lua /path/to/z.lua --init posix enhanced once echo)"   # 其他 Posix Shell 初始化
source (lua /path/to/z.lua --init fish enhanced once echo | psub)  # Fish Shell 初始化
iex ($(lua /path/to/z.lua --init powershell enhanced once echo) -join "`n") # Power Shell 初始化

然後重新登陸,即可使用。

用戶評價:

“我喜歡它的原理,我在命令行下面的行爲十分有規律,並且我十分懶惰,懶得管理和維護一套書籤或者路徑別名。“

“總之,z.lua 做到了它所宣稱的目標。如果你需要快速的在目錄間切換,它可能是最好的選擇。“

”我終於可以在自己的樹莓派1上使用 autojump 類似的功能了,而不用像以前傳統 autojump 那樣每次打開終端都要等待 30 秒。”

基本使用:

cd 到一個包含 foo 的目錄:

z foo

cd 到一個以 foo 結尾的目錄:

z foo$

對長路徑使用多個關鍵字進行匹配:
假設路徑歷史數據庫(~/.zlua)中有兩條記錄:

    10   /home/user/work/inbox
    30   /home/user/mail/inbox

"z in" 將會跳轉到 /home/user/mail/inbox 因爲它有更高的權重,同時你可以傳遞更多參數給 z.lua 來更加精確的指明,如 "z w in" 則會讓你跳到 /home/user/work/inbox。

交互選擇:

使用 -i 參數進行跳轉時, 如果有多個匹配結果,那麼 z.lua 會給你顯示一個列表:

$ z -i soft
3: 0.25   /home/data/software
2: 3.75   /home/skywind/tmp/comma/software
1: 21     /home/skywind/software
> {光標位置}

然後你按照最前面的序號輸入你想要去的地方,比如輸入 3 就會進入 /home/data/software。如果你不輸入任何東西直接按回車,那麼將會直接退出而不進行任何跳轉。

PS:交互選擇同時支持 "-I" 參數(大寫 i),讓你可以使用 fzf 在多項結果進行快速選擇(如果系統裏面安裝了的話)。

快速回到父目錄:

"-b" 選項可快速回到某一級父目錄,避免重複輸入 "cd ../../..",一般把 "z -b" 別名成 "zb" 命令:

  • (沒有參數):cd 到項目根目錄,即跳轉到父目錄中包含 (.git/.svn/.hg) 的地方。
  • (單個參數):cd 到最近一級以關鍵字開頭的父目錄中。
  • (兩個參數):對當前目錄進行字符串替換,然後 cd 過去。

使用舉例:

# 一直向上退到項目根目錄(就是裏面有一個 .git 目錄的地方)
~/github/lorem/src/public$ zb
  => cd ~/github/lorem

# cd 到第一個以 g 開頭的父目錄
~/github/vimium/src/public$ zb g
  => cd ~/github

# 快速回到 site 目錄
~/github/demo/src/org/main/site/utils/file/reader/whatever$ zb si
  => cd ~/github/demo/src/org/main/site

# 將 jekyll 替換爲 ghost
~/github/jekyll/test$ zb jekyll ghost
  => cd ~/github/ghost/test

向後跳轉同樣也支持環境變量 $_ZL_ECHO(用來顯示跳轉結果),這樣爲搭配其他工具提供了可能性(並不需要改變當前工作目錄):

# 假設我們位於 ~/github/vim/src/libvterm
# 打開 $_ZL_ECHO 用於在每次跳轉後調用一次 pwd 顯示當前目錄
$ _ZL_ECHO=1

# 看看我項目根目錄(有 .git 那個)目錄裏有什麼?
$ ls -l `zb`
  => ls -l ~/github/vim

# 檢查 "<項目根目錄>/logs" 下面的日誌
$ tail -f `zb`/logs/error.log
  => tail -f ~/github/vim/logs/error.log

# 查看一下某一級父目錄裏有些啥
$ ls -l `zb git`
  => ls -l ~/github

Bonus:“zb ..” 相當於 “cd ..”,“zb ...” 相當於 “cd ../..”,而 “zb ....” 相當於 “cd ../../..” 等等。 最後 “zb ..20” 等同於調用 “cd ..” 二十次。

常用技巧:

推薦一些常用別名,放在你的配置文件中:

alias zc='z -c' # 嚴格匹配當前路徑的子路徑
alias zz='z -i' # 使用交互式選擇模式
alias zf='z -I' # 使用 fzf 對多個結果進行選擇
alias zb='z -b' # 快速回到父目錄

z.lua 可以方便的導入 z.sh 的數據(他們格式相同):

cat ~/.z >> ~/.zlua

還可以導入 autojump 的數據:

FN="$HOME/.local/share/autojump/autojump.txt"
awk -F '\t' '{print $2 "|" $1 "|" 0}' $FN >> ~/.zlua

更多內容,參考項目文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章