轉自 http://11ten.gitcafe.io/book-a/iTerm2/index.html
iTerm2的主要特點:
- 開源免費。
- 兼容性比默認Terminal更好。對於經常要遠程使用的情況下,默認的Terminal在使用vi時經常出現不兼容的問題,而iTerm2在這方面顯然做的更好。
- 快捷鍵豐富。
⌘ + 數字
: 切換標簽頁。⌘ + 方向鍵
按方向切換標簽頁。 ⌘ + enter
: 切換全屏⌘ + f
: 查找。支持正則。其中查找的內容會被自動復制。省去了再去⌘+c的步驟。同樣,鼠標去選中的內容也會自動復制,也可以鼠標中鍵直接粘貼。一般在使用時,鍵入搜索關鍵詞,然后用shift-tab
或者tab
左右自動補全,option + enter
則自動將搜索結果鍵入,並且復制到剪貼板。⌘ + d
: 垂直分屏,⌘ + shift + d
: 水平分屏。使用⌘ + ]
和⌘ + [
在最近使用的分屏直接切換.而⌘ + opt + 方向鍵
切換到指定位置的分屏。⌘ + t
:新的標簽頁⌘ + w
:關閉當前標簽頁⌘ + ;
:自動補全歷史命令。如圖:自動補全
⌘ + shift + h
: 剪貼板歷史,如圖:剪貼板歷史
ctrl + u
: 清空當前行。這里要注意,mac默認的ctrl+u為清楚當前光標至行首的內容,在iTerm2中則直接清除本行。iTerm2 也支持其他常用的操作命令,這里順帶講下,因為這些命令都是mac下非常常用也很好用的:ctrl + a
: 到行首
ctrl + e
: 行末ctrl + f/b
: 前進后退,相當於左右方向鍵,但是顯然比移開手按方向鍵更快ctrl + p
: 上一條命令,相當於方向鍵上ctrl + r
: 搜索命令歷史,這個大家都應該很熟悉了ctrl + d
: 刪除當前字符ctrl + h
: 刪除之前的字符ctrl + w
: 刪除光標前的單詞ctrl + k
: 刪除到文本末尾ctrl + t
: 交換光標處文本⌘ + —/+/0
: 調整字體大小⌘ + r
:清屏,其實是滾到新的一屏,並沒有清空。ctrl + l 也可以做到。- 更多實用功能:Exposé 標簽 按
⌘ + opt + e
打開Exposé,並支持搜索。如圖:Exposé
- 全局呼出快捷鍵。如圖: 呼出快捷鍵
⌘ + /
: 找到當前光標位置,有時會很有用。shift + ⌘ + s
: 保存當前窗口快照。⌘ + opt + b
: 快照回放。很有意思的功能,你可以對你的操作根據時間軸進行回放。可以拖動下方的時間軸,也可以按左右方向鍵。如圖:快照回放
- 支持256色。方便配置vi配色。但是在某些遠超服務器上不支持256色,則只要在Prefences->Profiles->Terminal里設置為xterm。
zsh
zsh作為bash的替代品,自然很多人要問:why zsh? 在Zsh Workshop 有個長長的功能列表,用來回答這個問題。這里講下我選擇zsh的原因,當然,也是介紹zsh強大的功能。
- 兼容bash。這使得切換到zsh沒有任何成本。
- OS X默認的bash版本實在是太老了啊……
- 拼寫糾正。你總會不小心打錯命令。這時,zsh會進行自動拼寫糾正,如圖:
更強大的補全。
- 連按兩次tab會列出所有的補全列表並直接開始選擇。如圖:
- 並且可以用方向鍵來選擇,但是對我這種很少用方向鍵的人來說只能猛敲tab了么,不是,zsh支持使用
<ctrl-n/p/f/b>
來選擇,perfect! - 命令選項補全。有多少人依然記不住tar的命令選項?中槍的去抄20遍……在zsh中只需要鍵入
tar - <tab>
就會列出所有的選項和幫助說明。用了zsh之后man
少用了好多…… - 命令參數補全。zsh 對命令的參數補全也很強大。鍵入
kill <tab>
就會列出所有的進程名和對應的進程號。如圖:
這還不夠,試試鍵入kill sbin <tab>
,如圖所示:
-
- 自動為sbin這個進程名補全了進程號。kill進程再也不用兩步操作了。
- 更智能的歷史命令。在用
<ctrl-p>
或者方向上鍵
查找歷史命令時,zsh支持限制查找。比如,輸入ls
然后再按方向上鍵,則只會查找用過的ls命令。而此時使用<ctrl-p>
則會仍然按之前的方式查找,忽略ls
。 - 多個終端會話共享歷史記錄。經常有多個窗口,tab,tmux的多個session,panel。這些命令歷史不能共享實在是很糟糕的回憶。但是有了zsh之后,這些確實成了回憶了,所有的命令歷史都可以共享。
- 更智能的
cd
。首先你甚至不需要再輸入cd了,直接輸入路徑即可。第二,在你知道路徑的情況下,比如/usr/local/bin
你可以輸入cd /u/l/b
然后按<Tab>
進行補全快速輸入。這顯然不夠,zsh還支持路徑替換,如果你其實想進入的是/usr/local/bin
,不再需要../
了,直接在當前輸入cd bin share
即可,則bin
會替換為share
。在之后我會介紹z和autojumper,目錄跳轉會更方便。 - 更強大的alias。zsh不僅支持普通的alias,例如:
alias ls ='ls --color=auto'
。zsh還支持后綴alias,即以什么命令打開特定的后綴名文件。例如alias -s js=mvim
,輸入hello.js
,會以vim打開該文件,而不在需要vim hello.js
。 - 通配符搜索。這也是我最愛的功能之一。之前講過由於命令補全少用了很多
man
命令,而這個功能讓我少用了很多find
命令。 一般的通配符搜索無非是ls -l *.log
,如圖:
在zsh中可以做到遞歸的通配符搜索。使用**/
來遞歸搜索,如圖
- 是不是在很多場景下可以取代
find
?
以上都是我感覺遷移到zsh之后非常實用的功能。要想從頭開始了解和學習zsh,可以訪問A User’s Guide to the Z-Shell。不過大家都很忙,從頭開始自己學習和配置會很累。所以現在說到zsh,不得不提的就是oh-my-zsh,oh-my-zsh是一個開源的zsh配置管理框架,提供了大量實用的功能,主題等。現在基本都是標配了吧。如圖是我在用的默認zsh主題robbyrussell
,如圖
可以發它能自動顯示當前所在的git分支以及當前本地狀態(黃色的小叉表示本地有更新未提交)。
當然zsh也不是完美無缺。在我使用過程中有兩點不是很舒服: 1. 自動糾正並不總是那么智能。如圖:
但是可以對這些命令使用alias 加上nocorrect
前綴,如:
alias rake deploy='nocorrect rake deploy'
- 一些符號是zsh中保留的,使用需要轉義,如圖:
下面講下zsh和oh-my-zsh的安裝。
使用brew來安裝zsh
brew install zsh
設置zsh為默認
在/etc/shells
文件末尾添加
/usr/local/bin/zsh
執行:
chsh -s /usr/local/bin/zsh
最后記得將~/.bash_prorile
或者~/.profile
等配置拷貝到~/.zshrc中。
安裝oh-my-zsh
自動安裝:
curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
可以選擇自己喜歡的主題。只需要修改~/.zshrc
文件中的ZSH_THEME
即可。
z和autojump
z和autojump的功能類似,前者是簡單的shell腳本實現,后者由python實現,功能都是可以方便自動匹配到你最多使用的目錄並跳轉。我在用的是z,如圖
,我在根目錄輸入z github
可以自動跳轉到我常用的notice501.github.com
這個目錄,也就是本博客的工程目錄。超級方便的工具。autojump用法類似,命令為j
而不是z
兩者的安裝方式:
z
git clone git@github.com:rupa/z.git
而后將z.sh放入環境變量即可。
autojump
autojump可以直接使用brew安裝
brew install autojump
iTerm2 與 zsh + tmux 配合使用的一些心得
tmux是什么
tmux 是什么?我們先來看看官網的解釋:
tmux is a terminal multiplexer
What is a terminal multiplexer? It lets you switch easily between several programs in one terminal, detach them (they keep running in the background) and reattach them to a different terminal. And do a lot more.
簡單來說就是一個終端多開工具,能讓你同時運行多個終端會話,在這些會話之間隨意切換。
特色功能
終端會話多開
平常在終端的使用過程中,一次只能運行一個會話。 當然你也可以通過終端程序的多開標簽頁來解決,但是使用了tmux,你就可以在一個終端中同時運行多個會話,只需開啟一個終端。終端會話多開
會話的分離(detach)與連接(attach)
我們在使用終端的過程中,總會遇到過類似場景:
- 用終端運行了一個測試代碼的HTTP服務(如rails、django),想要關閉終端程序窗口,但又不想讓服務停掉
- 用ssh連接到服務器,正在編輯文件或修改配置,突然斷網了,網絡重新連通后再連接上服務器,又要重新進入剛才的工作目錄、找到要編輯的文件、找到剛才修改的那一行……
- 在公司用ssh連接到服務器,打開了多個文件,回家后想繼續干活,但是還要再憑記憶把文件逐一打開
使用tmux會話的分離與連接就可以輕松解決以上問題,分離(detach)可以使終端會話在后台運行,連接(attach)可以重新打開在后台運行的會話,也可以多個終端連接同一會話。這些都會在后續詳細描述。
tmux是什么 http://t.cn/Rv6DnPb 平常在終端的使用過程中,一次只能運行一個會話。 當然你也可以通過終端程序的多開標簽頁來解決,但是使用了tmux,你就可以在一個終端中同時運行多個會話,只需開啟一個終端。
安裝
tmux 的安裝比較簡單,以下分別介紹 linux、Mac、FreeBSD、Windows系統下的安裝方法
linux
linux 用戶只要使用系統自帶的包管理器來安裝就行了
Debian 系
$ sudo apt-get install tmux
紅帽系
$ sudo yum install tmux
Arch Linux
$ pacman -S tmux
Mac
Mac 用戶可以通過 Homebrew 或 Macports 來進行安裝
Homebrew
$ brew install tmux
Macports
$ sudo port install tmux
FreeBSD
FreeBSD可以使用自帶的port進行安裝
$ cd /usr/ports/sysutil/tmux
$ make install clean
Windows
Windows下可以使用 cygwin 來安裝 cygwin,cygwin是圖形安裝界面,請確保在 Select Packages 界面出現時,選中 tmux 即可。
最后,為了確保 tmux 正確安裝,可以在命令行里輸入以下命令,來查看 tmux 的版本號
$ tmux -V
注意是大寫的V
如果出現類似以下字符串,就已經安裝成功了
tmux 1.8
目前最新版本為 1.9a,隨后的章節將使用 1.8 版本做解說,請確保你安裝的 tmux 版本要在 1.8 或以上,以免缺少某些必要的功能。
會話
上一節我們已經將 tmux 安裝好了,現在就可以通過以下命令來啟動它:
$ tmux
啟動之后,可以看到命令行最底部多了一條綠色的狀態條,上面顯示了一些信息,比如計算機名和時間等。 要退出 tmux,可以輸入exit
回車或者按下組合鍵 [Ctrl+d]
。
其實剛才我們啟動 tmux 之后,它已經自動創建了一個會話(Session),會話是 tmux 的最主要的功能,接下來我們將介紹會話的一些功能。
新建會話
啟動 tmux 會自動創建會話,但並沒有為會話命名。為了以后使用方便,我們來創建一個自己命名的會話,命令如下:
$ tmux new-session -s <會話名稱>
現在我們來創建一個會話,取名為 dev
,命令為:
$ tmux new-session -s dev
創建完成之后,可以看到底部狀態條左邊標示出了當前的會話名為 dev
。
這個命令還有一個縮寫版本, new-session
縮寫成 new
,也就是上述命令可以簡寫成:
$ tmux new -s dev
新建會話還可以帶上一個初始命令:
$ tmux new -s <會話名稱> 初始命令
比如創建一個名為 monitor 的會話,初始命令為 top :
$ tmux new -s monitor top
可以看到會話創建后,會自動運行 top 命令。但是一旦退出 top 程序 (按 [q]
),會話也會自動退出,所以在實際應用中,初始命令幾乎不會用到。
分離會話(detach)
之前已經說過,退出 tmux 可以使用 exit
命令或者 [Ctrl+d]
組合鍵,退出 tmux 會把會話結束掉,就像平常關閉終端程序一樣。但是在實際應用中,可能你並不希望這樣,因為有些程序是要保持運行的,例如 rails 的測試服務、telnet連接遠程服務器等等。
這時候分離會話就可以派上用場了,分離后的會話並不會把運行中的程序結束掉,而是會保持運行,你還可以稍后重新連接上這些會話。
分離會話之前,我們先來啟動一個需要保持運行的程序,這里用 python 2.x 的 SimpleHTTPServer 為例, 當然你也可以選擇啟動 rails 或 django 的測試服務、telnet 連接或者更簡單的 top 命令。
先在之前創建的會話中運行一下命令來啟動一個簡單的 HTTP 服務:
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
這時候 HTTP 服務已經運行起來了,接下來就要做分離會話的操作了,快捷鍵是:
[Ctrl+b]
[d]
也就是先按下組合鍵 [Ctrl+b]
然后再接着按 [d]
。d 代表了 detach,而 [Ctrl+b]
是一個命令前綴(官方稱之為 prefix),這個命令前綴是告訴終端程序,接下來的命令是針對 tmux 使用的。在之后的描述中,都將采用 [前綴]
來代替 tmux 的命令前綴。
可以看到,在按下快捷鍵之后,tmux 已經退出並回到平常的終端中,並帶着 [detached] 字樣的提示。
這時候可以在瀏覽器訪問一下剛才啟動的 HTTP 服務 http://localhost:8000,確實可以正常訪問,證明剛才的程序還在保持運行中,並沒有被結束,甚至你還可以把整個終端程序關閉。
可能有人會很不習慣這個默認的命令前綴,包括我自己在內,因為 [Ctrl+b]
是一個 Emacs 或 Vim 的快捷鍵,甚至是命令行本身的快捷鍵。在 Emacs 或者命令行中,它是后退一個字符的操作;而在 Vim 中,它是一個向上翻頁的操作。不過不用擔心,先忍耐忍耐,稍后的章節將講述如何配置 tmux,那時就可以擺脫快捷鍵沖突的困擾了。
連接會話(attach)
被分離的會話,還可以重新連接上,就讓我們來實踐一下,命令為:
$ tmux attach-session -t <目標會話名>
簡寫為
$ tmux attach -t <目標會話名>
或
$ tmux a -t <目標會話名>
之前我們創建的會話名叫 dev ,所以命令就可以這樣寫:
$ tmux a -t dev
因為我們只創建了一個會話,所以可以忽略 -t 的參數,直接寫成:
$ tmux a
如果不指定目標會話名,tmux 將會連接你上次使用的會話。連接上 dev 會話之后,可以看到程序還在運行中,而且終端里顯示的內容跟會話分離前沒什么兩樣,只是多了幾行 HTTP 請求的日志。
這時候,你還可以在多個終端,甚至是多台電腦通過 ssh 連接上同一個會話,可以實現共同操作,非常強大,具體的感受可以自己體會。
接下來我們多創建幾個 tmux 會話,在這之前先把當前會話分離掉:
- 分離當前會話:
[前綴]
d
- 新建一個名為 edit 的會話:
$ tmux new -s edit
- 分離 edit 會話:
[前綴]
d
- 新建一個名為 telnet 的會話:
$ tmux new -s telnet
- 分離 telnet 會話:
[前綴]
d
現在,會話已經足夠多了,接下來登場的就是列出所有會話的命令:
$ tmux list-sessions
可以簡寫成
$ tmux ls
屏幕上將會顯示出所有創建的會話,比如:
dev: 1 windows (created Tue Jun 10 15:10:32 2014) [80x24]
edit: 1 windows (created Tue Jun 10 16:26:20 2014) [80x24]
telnet: 1 windows (created Tue Jun 10 16:26:53 2014) [80x24]
這時候連接會話的 -t 參數就派上用場了,你可以選擇連接到哪一個會話。
如果沒有創建會話或者會話都全已退出,那么列出所有會話的命令將會提示一個 failed to connect to server 的信息,可以看得出來 tmux 是有運行一個服務的,這個服務管理着所有的會話,並讓他們持續運行。
小結
通過創建多會話,以及分離/連接的功能,還能實現多終端連接同一會話,已經完全可以輕松應付許多平常很以實現的功能。在下一章節中,我們將討論 tmux 里窗口(Window)的功能。
窗口
上一章節介紹了 tmux 的會話,接下來就要講到 tmux 中窗口的使用。
其實當你新建一個會話的時候,tmux 已經自動給你在新會話中自動創建了一個窗口(Window),窗口的編號從0開始,名稱則默認為 當前工作目錄 或者 當前運行的程序 ,都顯示在下方的狀態條中。如下圖所示,我將工作目錄切換到了 ~/Documents
,窗口0的名稱也隨之變換。
我們也可以在創建會話的時候附上 -n
參數,來給窗口制定一個名稱
$ tmux new -n <窗口名>
-n
參數可以和之前介紹過的 -s
參數一同使用,現在我們來創建一個名為 demo的新會話,新建窗口取名為worldcup 吧。
$ tmux new -s demo -n worldcup
[注意] 裝了 oh-my-zsh 的話,自定義窗口名不起作用,無論如何設置或更改窗口名,敲入命令之后窗口名都會變成當前工作目錄或者當前運行的程序,希望新版本能修復這個問題
新建窗口
新建窗口比較簡單,只要執行以下組合鍵即可。
[前綴]
c
c 代表了 create ,一個會話可以創建多個窗口,但是為了窗口之間切換的方便,建議將窗口個數保持在個位數。
切換窗口
切換窗口有好幾種方式,我們先來說說最常用的兩種。
上一個窗口(previous): [前綴]
p
下一個窗口(next): [前綴]
n
使用這兩種方式,就可以在所有窗口中按順序切換。如果在第一個窗口執行上一個窗口的操作,則會跳轉到最后一個窗口,同樣的在最后一個窗口執行下一個窗口的操作,則會跳到第一個。
當然每個窗口都有一個編號,你也可以通過以下簡單的操作,來跳轉到制定編號的窗口。
跳轉到指定窗口: [前綴]
0-9的數字
由於這個指令只能在 0-9 號的窗口之間跳轉,所以建議窗口個數保持在個位數。
但是如果窗口個數實在太多,還可以用以下方法來呼出窗口列表,用上下鍵就可以進行選擇,然后回車。
窗口列表: [前綴]
w
更改窗口名稱
更改窗口名稱也比較簡單,首先要先切換到需要修改的窗口下,執行以下操作,就可以進行修改了。
更改窗口名稱: [前綴]
,
這時,底部的狀態條會變成黃色,只要輸入想要取的名字,回車即可。
關閉窗口
當窗口不再需要時,也可以進行關閉,以下是操作指令。
關閉窗口: [前綴]
&
這個命令確實不太好用,還要用到 Shift
鍵,但是別着急,講到自定義配置的時候,就可以對默認的組合鍵進行更改了。關閉窗口之前,狀態條也會有黃色的確認提示,輸入 y
確認或者 n
取消。
當會話中所有的窗口都關閉之后,會話也會隨着退出。
小結
本章講述了 tmux 中如何使用窗口,窗口是會話的子元素,當然窗口還能再分,也就是下一章講述的面板。
窗格
上一章已經介紹了 tmux 里的窗口,窗口也可以再分,也就是接下來要說的窗格(pane)。我們已經知道,tmux 下可以有多個會話,會話下又可以有多個窗口,那么同樣,窗口下還可以有多個窗格,其結構如下。
tmux
├── 會話a
│ ├── 窗口a
│ │ ├── 窗格a
│ │ └── 窗格b
│ └── 窗口b
│ └── 窗格c
└── 會話b
├── 窗口c
│ └── 窗格d
└── 窗口d
└── 窗格e
切分窗格
一個窗口可以切分成多個窗格,主要的切分方法有兩種,垂直切分和水平切分。
垂直切分(把窗口垂直切分成左右兩等分): [前綴]
%
垂直切分
水平切分(把窗口水平切分成上下兩等分): [前綴]
"
水平切分
以上兩種切分方法還可以混合使用,比如先進行水平切分再進行垂直切分,我們會得到類似以下的3個窗格。
切換工作窗格
把窗口切分成多個窗格以后,就需要在各個窗格直接進行切換,以便對不同的窗格進行不同的操作。
窗格切換: [前綴]
o
這個指令會在當前窗口的所有窗格中輪流切換,如果窗格比較少的情況下,非常實用。但是如果窗格太多,就比較麻煩了,可以用以下指令來制定切換的方向,自己體會一下吧。
按制定方向切換窗格: [前綴]
方向鍵
更改窗格布局
tmux 有五個默認的窗格布局,可以滿足基本的工作需要。
- 水平平分(even-horizontal)
- 垂直平分(even-vertical)
- 主窗格最大化,其他窗格水平平分(main-horizontal)
- 主窗格最大化,其他窗格垂直平分(main-vertical)
- 平鋪,窗格均等分(tiled)
以下操作指令,可以在這五個默認的窗格布局之中輪流切換。
更換窗格布局: [前綴]
空格
小結
到本章為止,tmux 最基本的操作已經講述完,在接下來的章節中,要給大家介紹一下 tmux 的命令(command)