oh-my-zsh一些實用小技巧
2014-09-28 09:48:56

聽說有一個zsh shell framework叫oh-my-zsh超級好用的,它包括了一系列plugin與theme,於是就裝來試試,結果就回不去了。安裝的方式也很簡單,按照README的步驟安裝即可。

設定rvm

安裝完後,如果有用rvm,要記得將rvm的設定複製到.zshrc,如下所示:

PATH=$PATH:$HOME/.rvm/bin
[[ -s "$HOME/.rvm/scripts/rvm"]] && source "$HOME/.rvm/script/rvm"

一些方便的技巧

cd可以省略

使用shell最常做的動作的就是用cd切換目錄,在zsh中只輸入路徑按下[Enter],就相當於cd到輸入的目錄。

ex-app $ app/views/home[Enter]
ex-app/app/views/home $

跳回上層目錄

通常要跳回上一層,我們會用cd ..,跳回上兩層是cd ../..,跳回上三層是cd ../../..,可是..打久了也是很煩人的。在zsh中,cd ../..可以用cd ...(..後多一個.),cd ../../..可以用cd ....(..後多二個.)。

路徑模糊搜尋

任何需要路徑的地方都可以使用模糊搜尋,再按[Tab]自動補完完整的路徑。

$ vim a/vi/home/dex[Tab]
$ vim app/views/home/index.html.erb

回到前一個路徑

另一個很常用的就是cd -,但一般的shell只能跳回前一個路徑。在zsh中,輸入cd -再按下[Tab],會列出前幾次的路徑,選擇對應的號碼就可以跳到對應的路徑。

$ cd app[Enter]
app $

app $ cd views/home[Enter]
app/views/home $

app/views/home $ cd -[Tab]
1 -- /app/
2 -- /

app/views/home $ cd -[2][Enter]
1 -- /app/
2 -- /
$

前次指令的搜尋

當要執行之前執行過的指令,我們通常用history來查詢,再用!加上歷史記錄代碼來執行。在zsh中,可以在!後加上指令的關鍵字進行搜尋,再按[Enter]就會切換成之前的指令。

$ !mys[Enter]
$ mysql -uex_dev -pex_dev ex_dev[Up]
$ mysql -uex_test -pex_test ex_test

如果不是你想要的指令,可以再按[Up/Down]切到一下個符合搜尋的指令。

另一種是直接按[Ctrl]+[r],再輸入關鍵字搜尋。如果不是你想要的指令,可以再按[Ctrl]+[r]切到一下個符合搜尋的指令。

用process的名稱來kill

通常要kill一個process,我們都要先找出對應的PID,再用kill PID來砍掉它。在zsh中,可以直接在kill後面接process的名稱,再按[Tab]就會切換成對應的PID。

$ kill pow[Tab]
$ kill 33785

用*列出多個檔案

在zsh中,可以用*當做萬用字元將多個符合條件的檔案路徑一起找出來。

$ ls **/*user*[Tab]
$ ls app/models/user.rb db/migrate/20140104024658_create_users.rb spec/factories/users.rb spec/models/user_spec.rb app/controllers/users app/views/users
$ ls **/*user*[Enter]
app/models/user.rb
db/migrate/20140104024658_create_users.rb
spec/factories/users.rb
spec/models/user_spec.rb

app/controllers/users:
sessions_controller.rb

app/views/users:
sessions

[builtin] Zmv

mv的超級強化版,可以做到批次改名。

設定:zsh預設並沒有載入zmv這個module,必須下指令autoload -U zmv才可以使用它。你可以將這段指令加到你的.zshrc中。

最常用的方式是使用(*)搭配$1,$2等變數,舉個例子,如果我們有下面三個檔案:

pic01-001.png
pic02-002.png
pic03-003.png

我們想將pic換成fig-換成_,也就是改成下面的檔名

fig01_001.png
fig02_002.png
fig03_003.png

用zmv只要下面一行就搞定了,超簡單的吧。

zmv 'pic(*)-(*)' 'fig$1_$2'

另外如果只想看更改名稱的結果,但不要真的更改名稱,可以加上參數-n。更多例子可以參考:zmv

Plugin

oh-my-zsh的plugin只能說是繁族不及備載,大部分的plugin,例如:git與rails都會幫你內建快捷指令,節省很多打指令的時間。不過快捷鍵這種東西,不會用就是不會用,但會用就是覺得不能沒有它,所以還是要去了解才能會去用它。另一方面,如果常用git的人不會使用gc來取代git commitgst來取代git status,這樣顯然還不夠專業啊。oh-my-zsh的plugin都放在plugin目錄之中。有興趣的話可以看看plugin的原始碼,也可以趁機學習一下怎麼寫出屬於自己的plugin。這裡我列出一些有趣的plugin。

設定

要加入一個plugin很簡單,只要在.zshrc中的plugin設定值中加入plugin的檔名即可,不過要記得重啟你的terminal。

Jump

Jump plugin最主要的功能就是在shell中加入路徑書籤。

  • mark 書籤名稱將目前所在目錄加上書籤。
  • unmark 書籤名稱刪除書籤。
  • marks列出目前所有的書籤。
  • jump 書籤名稱跳至書籤對應的目錄。

Pow

加了一些控制pow的快捷指令。

  • 在rails app的目錄下,用kapow執行touch tmp/restart.txt,也就是重啟pow server。
  • 在rails app的目錄下,用powit執行將app掛載到pow下執行。