【感謝@CuGBabyBeaR 的熱心翻譯。如果其他朋友也有不錯的原創或譯文,可以嘗試提交到伯樂線上。】
和很多人一樣,我也是在電腦前度過一天的大部分時間。為了提高效率(並且不讓我的身體有太多的抱怨),我試著建立一個優化的環境。例如,我使用Vim寫程式碼,使用Vimperator瀏覽網頁,使用 i3 視窗管理器。其他日常事情就是檔案系統導航(從一個目錄切換到另一個目錄——譯者注)。我更喜歡使用命令列來,但是一遍又一遍的輸入 cd ~/some/very/deep/often-used/directory 變得很麻煩。
像autojump、z 和 fasd 這樣的自動工具,通過提供一個指向你常用資料夾的快捷方式來處理這個問題。就我個人來說,我希望有一個更加手動的方法,我將這個方法向大家分享。我發現用這個方法後,效率有很大的提高,並且希望你們也能提高效率。
使用符號連結跳轉
實際上這個手工解決方案總結起來是在一個隱藏資料夾下(例如 ~/.marks)儲存符號連結.這裡有4個shell函式:jump, mark, unmark, 和marks:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
export MARKPATH=$HOME/.marks function jump { cd -P "$MARKPATH/$1" 2>/dev/null || echo "No such mark: $1" } function mark { mkdir -p "$MARKPATH"; ln -s "$(pwd)" "$MARKPATH/$1" } function unmark { rm -i "$MARKPATH/$1" } function marks { ls -l "$MARKPATH" | sed 's/ / /g' | cut -d' ' -f9- | sed 's/ -/\t-/g' && echo } |
將它們放在你的.zshrc或.bashrc 檔案,你就可以開始跳轉了(Mac OS X使用者需要一個稍微有些不同的makes函式版本,請見下方)。我也把這轉換成了一個叫做jump的oh-my-zsh外掛,但是這玩意目前還在pull-request。為了新增一個新書籤,cd到目錄然後使用一個你喜歡的名字標記上它。
1 2 |
$ cd ~/some/very/deep/often-used/directory $ mark deep |
這段文字將在目錄~/.marks中新增一個叫做deep的符號連結。跳轉到這個目錄,在檔案系統中的任何地方輸入以下命令。
1 |
$ jump deep |
移除標籤(即符號連結),輸入:
1 |
$ unmark deep |
你可以通過輸入如下指令來瀏覽所有的標籤
1 2 3 4 |
$ marks deep -> /home/johndoe/some/very/deep/often-used/directory foo -> /usr/bin/foo/bar |
沒了
新增tab補齊
為了給jump和unmark函式新增Tab補齊,新增如下程式碼到.zshrc中(感謝tiziano88):
1 2 3 4 5 6 |
function _completemarks { reply=($(ls $MARKPATH)) } compctl -K _completemarks jump compctl -K _completemarks unmark |
或者新增如下程式碼到.bashrc中(感謝microcolonel)
1 2 3 4 5 6 7 8 |
_completemarks() { local curw=${COMP_WORDS[COMP_CWORD]} local wordlist=$(find $MARKPATH -type l -printf "%f\n") COMPREPLY=($(compgen -W '${wordlist[@]}' -- "$curw")) return 0 } complete -F _completemarks jump unmark |
現在如果你輸入jump或者unmark 然後回車,你會看見一個所有可用的標籤.碉堡了!
給Mac OS X>使用者:
如guygurari指出的,Mac OS X使用者需要一個稍微有些不同的makes函式版本:
1 2 3 |
function marks { \ls -l "$MARKPATH" | tail -n +2 | sed 's/ / /g' | cut -d' ' -f9- | awk -F ' -> ' '{printf "%-10s -> %s\n", $1, $2}' } |
如果你喜歡我所講的東西,你可能想在Twitter上follow我。
譯者注:
此功能Windows下也可以實現。做4個批處理 :jump.bat、mark.bat、unmark.bat、marks.bat。每個BAT的內容如下:
jump.bat:
1 2 3 4 5 6 7 |
@echo off set MARKPATH=%~dp0.marks if [%1]==[] goto err if not exist "%MARKPATH%/%1" (echo "No such mark: %1") else cd "%MARKPATH%/%1" :err echo Type a mark, please. |
mark.bat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@echo off set MARKPATH=%~dp0.marks set TAR=%cd% if not exist %MARKPATH% ( goto makedir ) else ( goto makelink ) :makedir md %MARKPATH% attrib +h %MARKPATH% goto makelink :makelink cd %MARKPATH% mklink /j %1 %TAR% cd %TAR% |
unmark.bat
1 2 3 |
@echo off set MARKPATH=%~dp0.marks rd %MARKPATH%\%1 |
marks.bat
1 2 3 4 |
@echo off set MARKPATH=%~dp0.marks echo mark list: dir /b %MARKPATH% |
將4個BAT都放在系統環境變數%PATH%中任意一個目錄下,或者將bat檔案所在目錄新增進%PATH%中就行了。因為Window在vista/win7在引入這個功能,因此只能在vista/win7以上的系統中使用。還有一點不一樣的是,連結檔案儲存在bat檔案所在目錄下的.marks隱藏資料夾下,而不是某個系統資料夾,這樣在刪除的時候也不用亂找了。
使用的時候和上述描述一樣,使用如下命令:
跳轉:
1 2 3 4 |
jump markname mark markname unmark markname marks |
就是marks的功能就沒有那麼強了…