終端下工作最煩躁的就是路徑切換壤蚜,每天不停的 cd
掺栅,就像在泥里走路砸喻,今天給大家介紹一個好用的工具:z.lua ,用熟后路徑切換就像是終端里溜冰撬即。
z.lua 是一個會學(xué)習(xí)你使用習(xí)慣的 cd
命令花沉,它會跟蹤你在 shell 下訪問過的路徑坟比,通過一套稱為 Frecent 的機制(源自 Mozilla)本姥,經(jīng)過一段簡短的學(xué)習(xí)之后,z.lua
會幫你跳轉(zhuǎn)到所有匹配正則關(guān)鍵字的路徑里 Frecent 值最高的那條路徑去焦辅。
正則將按順序進行匹配博杖,"z foo bar" 可以匹配到 /foo/bar ,但是不能匹配 /bar/foo筷登。
特性說明:
- 性能比 z.sh 快三倍剃根,比 fasd / autojump 快十倍以上。
- 支持
Posix Shell
:bash
,zsh
,sh
,ash
,ksh
,busybox
等等前方。 - 支持
Fish Shell
狈醉,Power Shell
和Windows cmd
。 - 增強匹配算法惠险,更準確的帶你去到你想去的地方苗傅。
- 交互選擇模式,如有多個匹配結(jié)果班巩,
cd
前允許你進行選擇渣慕。 - 支持
fzf
(可選)進行可視化結(jié)果篩選或者補全。 - 快速回到父目錄抱慌,代替反復(fù) “cd ../../.." 逊桦。
- 高性能,地占用抑进,為不同 Shell 提供統(tǒng)一的使用體驗强经。
- 兼容
lua
5.1, 5.2 和 5.3 以上版本,兼容LuaJit
寺渗。 - 自包含且無額外依賴匿情,單個
z.lua
文件完成所有工作兰迫。
軟件安裝:
將下面對應(yīng)語句添加到你的 .bashrc
/ .zshrc
或者對應(yīng) shell 的 rc 腳本末尾:
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 初始化
然后重新登陸,即可使用码秉。
基本使用:
cd 到一個包含 foo 的目錄:
z foo
cd 到一個以 foo 結(jié)尾的目錄:
z foo$
對長路徑使用多個關(guān)鍵字進行匹配:
假設(shè)路徑歷史數(shù)據(jù)庫(~/.zlua)中有兩條記錄:
10 /home/user/work/inbox
30 /home/user/mail/inbox
"z in"
將會跳轉(zhuǎn)到 /home/user/mail/inbox
因為它有更高的權(quán)重,同時你可以傳遞更多參數(shù)給 z.lua 來更加精確的指明鸡号,如 "z w in"
則會讓你跳到 /home/user/work/inbox
转砖。
交互選擇:
使用 -i 參數(shù)進行跳轉(zhuǎn)時, 如果有多個匹配結(jié)果,那么 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
府蔗。如果你不輸入任何東西直接按回車,那么將會直接退出而不進行任何跳轉(zhuǎn)汞窗。
PS:交互選擇同時支持 "-I" 參數(shù)(大寫 i)姓赤,讓你可以使用 fzf 在多項結(jié)果進行快速選擇(如果系統(tǒng)里面安裝了的話)。
快速回到父目錄:
-b
選項可快速回到父目錄仲吏,避免重復(fù)輸入 cd ../../..
不铆,先把 z -b
別名成 zb
:
- (沒有參數(shù)):cd 到項目根目錄,即跳轉(zhuǎn)到父目錄中包含 (.git/.svn/.hg) 的地方裹唆。
- (單個參數(shù)):cd 到最近一級以關(guān)鍵字開頭的父目錄中誓斥。
- (兩個參數(shù)):對當前目錄進行字符串替換,然后 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
打開環(huán)境變量 $_ZL_ECHO
(用來顯示跳轉(zhuǎn)結(jié)果)后劳坑,可以搭配其他工具,在目標目錄內(nèi)執(zhí)行命令成畦,而并不需要改變當前工作目錄(比如:ls `zb git`
)距芬。
環(huán)境變量 $_ZL_ROOT_MARKERS
是個逗號分隔的列表,用來識別項目根目錄循帐,可改成:
export _ZL_ROOT_MARKERS=".git,.svn,.hg,.root,package.json"
這樣在用 zb
時框仔,可以回到包含 .root
文件,或者 package.json
文件的父目錄拄养。
Bonus:zb ..
相當于 cd ..
存和,zb ...
相當于 cd ../..
,而 zb ....
相當于 cd ../../..
等等衷旅。 最后 zb ..20
等同于調(diào)用 cd ..
二十次捐腿。
MRU
z.lua
提供 dirstack
讓你更便捷的訪問最近剛剛?cè)ミ^的目錄,而不需要輸入任何關(guān)鍵字柿顶。這個方法叫做 dirstack
茄袖,它記錄著最近你剛剛?cè)ミ^的 10 條最新路徑,然后是用 z -
嘁锯,z --
和 z -{num}
來操作:
# 顯示當前的 dir stack
$ z --
0 /home/skywind/work/match/memory-match
1 /home/skywind/.local/etc
2 /home/skywind/software/vifm-0.9.1
3 /home/skywind/work
4 /home/skywind/work/match
# cd 到棧里 2 號路徑
$ z -2
=> cd /home/skywind/software/vifm-0.9.1
# 彈出棧頂 (cd 到上一次的老路徑)宪祥,和 "z -0" 相同
$ z -
=> cd -
這個 dirstack
是根據(jù) z.lua 的路徑歷史數(shù)據(jù)計算的出來的聂薪,和具體的 shell 或者操作系統(tǒng)無關(guān)。你退出再登陸不會丟失這些路徑歷史蝗羊,不同的 shell 之間也可以共享同一份記錄藏澳。
此外,還能通過前面提到的 -I
和 -t
參數(shù)組和耀找,使用 fzf 選擇最近去過的地方:
alias zh='z -I -t .'
首先定義個新的別名 zh
(回到歷史路徑的意思)翔悠,我們用 -t
參數(shù)告訴 z.lua
按時間戳為權(quán)重排序,同時 -I
啟用 fzf 進行搜索野芒,最后句號代表任意路徑蓄愁。
當我們在命令行里輸入 zh 時,就可用 fzf 進行歷史路徑操作了:
skywind@weilin0:~$ zh
> {CURSOR} < 306/306
> -4 /home/skywind/.autojump/bin
-5773 /home/skywind/.local/etc
-7882 /home/skywind/.autojump
-11603 /home/skywind/github/vim
-11635 /home/skywind/github
-40466 /home/skywind/.vim/vim
-40588 /usr/share/wcd
-40591 /usr/share
-40811 /home/skywind/bin
第一列為上次訪問距今多少秒狞悲,第二列是目錄名撮抓。你可以試著敲幾個字母,用 fzf 的字符串模糊匹配進行定位摇锋,或者用光標鍵的上和下(CTRL+J/K 也可以)來上下移動丹拯,最后按回車 cd 過去,或者 ESC 放棄荸恕。
常用技巧:
推薦一些常用別名咽笼,放在你的配置文件中:
alias zz='z -c' # 嚴格匹配當前路徑的子路徑
alias zi='z -i' # 使用交互式選擇模式
alias zf='z -I' # 使用 fzf 對多個結(jié)果進行選擇
alias zb='z -b' # 快速回到父目錄
z.lua 可以方便的導(dǎo)入 z.sh 的數(shù)據(jù)(他們格式相同):
cat ~/.z >> ~/.zlua
還可以導(dǎo)入 autojump 的數(shù)據(jù):
FN="$HOME/.local/share/autojump/autojump.txt"
awk -F '\t' '{print $2 "|" $1 "|" 0}' $FN >> ~/.zlua
用戶評價:
“我喜歡它的原理,我在命令行下面的行為十分有規(guī)律戚炫,并且我十分懶惰剑刑,懶得管理和維護一套書簽或者路徑別名∷簦“
“總之施掏,z.lua 做到了它所宣稱的目標。如果你需要快速的在目錄間切換茅糜,它可能是最好的選擇七芭。“
”我終于可以在自己的樹莓派1上使用 autojump 類似的功能了蔑赘,而不用像以前傳統(tǒng) autojump 那樣每次打開終端都要等待 30 秒狸驳。”
更多內(nèi)容缩赛,參考項目文檔: