Item2 + zsh


轉自 http://11ten.gitcafe.io/book-a/iTerm2/index.html

iTerm2的主要特點:

  1. 開源免費。
  2. 兼容性比默認Terminal更好。對於經常要遠程使用的情況下,默認的Terminal在使用vi時經常出現不兼容的問題,而iTerm2在這方面顯然做的更好。
  3. 快捷鍵豐富。⌘ + 數字: 切換標簽頁。 ⌘ + 方向鍵 按方向切換標簽頁。
  4. ⌘ + enter: 切換全屏
  5. ⌘ + f: 查找。支持正則。其中查找的內容會被自動復制。省去了再去⌘+c的步驟。同樣,鼠標去選中的內容也會自動復制,也可以鼠標中鍵直接粘貼。一般在使用時,鍵入搜索關鍵詞,然后用shift-tab或者tab左右自動補全,option + enter則自動將搜索結果鍵入,並且復制到剪貼板。
  6. ⌘ + d: 垂直分屏,⌘ + shift + d: 水平分屏。使用⌘ + ]⌘ + [在最近使用的分屏直接切換.而⌘ + opt + 方向鍵切換到指定位置的分屏。
  7. ⌘ + t :新的標簽頁
  8. ⌘ + w :關閉當前標簽頁
  9. ⌘ + ;:自動補全歷史命令。如圖:自動補全

  • ⌘ + shift + h: 剪貼板歷史,如圖:剪貼板歷史

ctrl + u: 清空當前行。這里要注意,mac默認的ctrl+u為清楚當前光標至行首的內容,在iTerm2中則直接清除本行。iTerm2 也支持其他常用的操作命令,這里順帶講下,因為這些命令都是mac下非常常用也很好用的:ctrl + a: 到行首

  1. ctrl + e: 行末
  2. ctrl + f/b: 前進后退,相當於左右方向鍵,但是顯然比移開手按方向鍵更快
  3. ctrl + p: 上一條命令,相當於方向鍵上
  4. ctrl + r: 搜索命令歷史,這個大家都應該很熟悉了
  5. ctrl + d: 刪除當前字符
  6. ctrl + h: 刪除之前的字符
  7. ctrl + w: 刪除光標前的單詞
  8. ctrl + k: 刪除到文本末尾
  9. ctrl + t: 交換光標處文本⌘ + —/+/0: 調整字體大小
  10. ⌘ + r:清屏,其實是滾到新的一屏,並沒有清空。ctrl + l 也可以做到。
  11. 更多實用功能: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強大的功能。

  1. 兼容bash。這使得切換到zsh沒有任何成本。
  2. OS X默認的bash版本實在是太老了啊……
  3. 拼寫糾正。你總會不小心打錯命令。這時,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進程再也不用兩步操作了。
  1. 更智能的歷史命令。在用<ctrl-p>或者方向上鍵查找歷史命令時,zsh支持限制查找。比如,輸入ls然后再按方向上鍵,則只會查找用過的ls命令。而此時使用<ctrl-p>則會仍然按之前的方式查找,忽略ls
  2. 多個終端會話共享歷史記錄。經常有多個窗口,tab,tmux的多個session,panel。這些命令歷史不能共享實在是很糟糕的回憶。但是有了zsh之后,這些確實成了回憶了,所有的命令歷史都可以共享。
  3. 更智能的cd。首先你甚至不需要再輸入cd了,直接輸入路徑即可。第二,在你知道路徑的情況下,比如/usr/local/bin你可以輸入cd /u/l/b然后按<Tab>進行補全快速輸入。這顯然不夠,zsh還支持路徑替換,如果你其實想進入的是/usr/local/bin,不再需要../ 了,直接在當前輸入cd bin share即可,則bin會替換為share。在之后我會介紹z和autojumper,目錄跳轉會更方便。
  4. 更強大的alias。zsh不僅支持普通的alias,例如:alias ls ='ls --color=auto'。zsh還支持后綴alias,即以什么命令打開特定的后綴名文件。例如alias -s js=mvim,輸入hello.js,會以vim打開該文件,而不在需要vim hello.js
  5. 通配符搜索。這也是我最愛的功能之一。之前講過由於命令補全少用了很多man命令,而這個功能讓我少用了很多find命令。 一般的通配符搜索無非是ls -l *.log,如圖:

在zsh中可以做到遞歸的通配符搜索。使用**/來遞歸搜索,如圖

  1. 是不是在很多場景下可以取代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'

  1. 一些符號是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

zautojump的功能類似,前者是簡單的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 會話,在這之前先把當前會話分離掉:

  1. 分離當前會話: [前綴] d
  2. 新建一個名為 edit 的會話: $ tmux new -s edit
  3. 分離 edit 會話: [前綴] d
  4. 新建一個名為 telnet 的會話: $ tmux new -s telnet
  5. 分離 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 有五個默認的窗格布局,可以滿足基本的工作需要。

  1. 水平平分(even-horizontal)
  2. 垂直平分(even-vertical)
  3. 主窗格最大化,其他窗格水平平分(main-horizontal)
  4. 主窗格最大化,其他窗格垂直平分(main-vertical)
  5. 平鋪,窗格均等分(tiled)

以下操作指令,可以在這五個默認的窗格布局之中輪流切換。

更換窗格布局: [前綴] 空格

小結

到本章為止,tmux 最基本的操作已經講述完,在接下來的章節中,要給大家介紹一下 tmux 的命令(command)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM