
身為攻城獅,cd時間太長總是很困擾?來看看更不浪費生命的作法吧!

原文來自工程師 Oliver Lacan 的 部落格文章 ,由 INSIDE 轉載編譯。
在命令行中切換目錄是最常用的操作,很少有比一遍又一遍地重複鍵入「cd ls cd ls cd ls ……」更令人沮喪的事情了。身為一個每天都會在命令列(Command Line Shell)上輸入指令的工程師,很容易在不同的目錄(directories)間移動的時候不小心就花費了大量的時間...... 尤其是當不時就會造訪同一個目錄的時候。與其不斷地使用 cd 或使用 alias 一個個建立快捷,本文將分享一個更好的方法給您。
常見的切換方式大概是長這樣:
cd ~/Development
ls # 看一下資料夾裡面有什麼...
cd project
# 走錯地方了, 沒關係回到上一層就好...
cd ..
# 開始工作囉...
mkdir new_project
cd new_project
cd ../project
也許當你更有經驗的時候,你知道該如何使用 Tab 鍵來幫助你更快地打完完整的目錄名稱。所以實際上所打出來的指令可能是長下面這個樣子:
cd ~/Dev<TAB>
ls # 看一下下一層要去哪...
cd pro<TAB>
cd ..
mkdir new_project
cd new<TAB>
cd ../pro<TAB>
如此一來就已經節省了大約 20 個需要輸入的字元了,真是值得開心!順帶一提,我們也可以使用 cd !$ 來幫助我們快速移動到 mkdir 剛剛創建的資料夾。(cd !$ 的意思是將上一個指令的參數作為輸入);或是我們還記得 Development/ 下面有哪些資料夾,知道 project/ 就是包含在裡面,所以也不用再使用 ls 來事先看一下要移動的路徑。
但問題是,我們並不像電腦一樣可以完全記得目錄下所有的分支,所以通常還是會不小心花費太多的時間...... 該怎麼辦呢?
瞧瞧這個好了:
j d
j p
<span class="nb">cd</span> ..
<span class="nb">mkdir </span>new_project
<span class="nb">cd </span>new<TAB>
j p
這個辦法最明顯的地方就是我們將所有需要打的字元又減少到了 18 個以下,卻又可以達到跟一開始同樣的目的地!比較難看出來的事情是,j d (或是 j dev, j develop)指令會帶我們到 ~/Development/ 這個目錄;而 j p 指令可以帶我們從檔案系統中的任何一個位置到 ~/Development/project 這個地方。小小的改動累積起來所省下的時間,絕對會比你想像中還要更加可觀!
cd
/usr/local/lib/something/log/
j p
pwd
~/Development/project
這一切究竟是怎麼辦到的呢?答案是:AutoJump
AutoJump 是一個能幫助你快速在命令行的目錄間飛越的神秘魔法。官方對這個工具的說法是:「一個能更便捷地在檔案系統中引導你的方法」(A faster way to navigate your filesystem)然而這個說法事實上並不太公平....... 這句話完全低估了 AutoJump 對開發過程中顯著的幫助!我自己估計,這幾乎要省下了我一整年打字的時間了!
Autojump 是怎麼運作的?
以下這個指令:
j project
/Users/olivierlacan/Development/project
和下面這個指令能達到的效果是完全一樣的:
j p
/Users/olivierlacan/Development/project
為什麼呢?這是因為 AutoJump 能記得所有你使用 cd 指令或它內含的 j 指令所移動進去的目錄。更重要的是, AutoJump 能夠做到模糊檢索(顧名思義是針對資料庫中的文件內容進行近似字串比對),這意味著它能夠查找所有你曾經造訪過、且包含你所提供的相同字串的目錄名稱,甚至就算你只提供一個字母也可以查找。
但如果我們有兩個開頭都是 p 的目錄呢?好玩的地方來了。第一次你輸入 cd directory_name 時,AutoJump 會載入到該目錄的絕對路徑,並分配一個權重給它──10.0。
所以如果我們這麼輸入:
cd /var
將可以在接著的 j -s 指令中看到以下資訊(s 代表統計的 stats):
10.0: /var
如果我們再度拜訪 /var 呢?來看看權重會變成什麼樣子:
14.1: /var
我們重複拜訪的目錄,其權重即會隨著我們的拜訪的次數不斷增加。在我本身的案例中,你可以很容易地猜到我最常造訪的前五名目錄:
j <span class="nt">-s</span> <span class="o">(</span>...<span class="o">)</span> 234.7: /Users/olivierlacan/Development/cs/campus 262.7: /Users/olivierlacan/Development/rubyheroes/rubyheroes.com 417.4: /Users/olivierlacan/Development/perso/orientation 874.1: /Users/olivierlacan/Development/cs/CodeSchool ________________________________________ 10810: total weight 198: number of entries 0.00: current directory weight data: /Users/olivierlacan/Library/autojump/autojump.txt
CodeSchool
))和第四個目錄(campus
)都有著相同的開頭 c
,AutoJump 會怎麼決定去哪一個地方呢?很明顯的道理,根據目錄的權重。既然 campus
的權重較低, AutoJump 會先選擇帶我們到 CodeSchool
這個目錄。然而,如果我再度重複鍵入 j c
指令,AutoJump 就會帶我到權重第二高、且符合字母 c
的目錄。j c
/Users/olivierlacan/Development/cs/CodeSchool
j c
/Users/olivierlacan/Development/cs/campus
如果你不喜歡在不清楚的情況下根據 AutoJump 的設定到處亂飛,它也可以讓你看到那些目錄和你所提供的字母字串是相匹配的:
j c<TAB><TAB><TAB>
$ j c__
c__1__/Users/olivierlacan/Development/cs/CodeSchool
c__2__/Users/olivierlacan/Development/cs/campus
c__3__/Users/olivierlacan/Development/perso/keep-a-changelog
c__4__/Users/olivierlacan/Development/perso/olivierlacan.com
$ j c__4
/Users/olivierlacan/Development/perso/olivierlacan.com
當列完一串帶有編號的目錄項目,AutoJump 能夠事先幫你填好 j c__ 指令,然後讓你輸入你想去的目錄的編號。
其他進階功能
- jc (child) 指令能跳到到指定目錄的子目錄
- jo (open) 使用系統工具(Mac Finder, Windows Explorer, GNOME, etc.)打開目錄,類似 Mac OS terminal 下的 open 命令
- j -i 指令能增加你目前所在的目錄權重
- j -d 指令能幫你降低目前所在的目錄權重
- j --purge 指令會清除掉所有 AutoJump 所記錄的權重,讓你能重新開始記錄。
如何安裝 AutoJump
AutoJump 是一個能夠支援大部分命令列包括 bash、zsh、fish 的實用工具,因此你可以透過許多 Linux package managers 來安裝 AutoJump。對於 MacOS 來說,我十分推薦 Homebrew 的 brew install autojump 這個不能再簡單的安裝方式,只要再記得輸入以下指令、以便將 AutoJump 載入 .bash_profile 或是 .zshrc :
[ -f /usr/local/etc/profile.d/autojump.sh ] && . /usr/local/etc/profile.d/autojump.sh
這道指令會幫你確認 AutoJump 是否安裝完成,同時簡單地載入你的命令列。
如果你不介意麻煩,也可以從 git repository 中將它 clone 下來並 手動進行安裝步驟 。相信我,AutoJump 會是你使用過最簡單便捷的開發工具之一,至少這幾年來說我一次都沒有遇到 bug。