在工做中常會遇到程序員用着系統的 terminal 艱難的敲擊着 bash shell 的命令。這種原始的方式可能會致使工做效率下降。html
對於終端的選擇,每一個人的習慣不同,沒法要求保持一致,可是我覺着,最基礎最經常使用的終端功能的配置,最好仍是在團隊裏推廣一下,能夠必定程度提升那些用着默認 terminal 的大神們的效率(PS: 據說有些大神使用記事本寫代碼,這類不在考慮之中)。可是這類配置又比較零散,因此趁着週末寫一個我自身經常使用的 Shell 工做環境的總結吧,本文以MacOS爲例,對於Linux系統,在文章最後列舉了一些差別。本文適合想要提升一些終端使用效率的同窗們。git
首先須要安裝 iTerm2,下載地址:iTerm2 Download,建議下載 Stable Release 版本。程序員
安裝完成後,打開 iTerm2 -> Preferences,就能夠根據本身的使用習慣進行一些偏好設置了,因爲可配置的選項太多,這裏不作一一列舉,只對我本身設定的一些選項進行簡單的介紹。(注意下載的不一樣版本的 iTerm2 的默認配置有可能有細微差異)github
對於 General 選項卡,目前還沒遇到修改的需求。shell
對於 Appearence 選項卡,我改動了 Tabs 的一些設置,以下圖:vim
改動較多的就是 Profiles 選項卡了,Profiles 主要是與顯示外觀有關的配置,在左側能夠新建多個 profile 配置,這裏我只採用了 Default。windows
每一個 Profile 的右邊有多個配置選項:General、Colors、Text、Window、Terminal、Session、Keys、Advanced:瀏覽器
General:在下方有個 "Working Directory" 的配置,這個是當你每次打開 shell 時默認進入的工做目錄,能夠根據本身的工做習慣進行配置。因爲我常常工做在 home 的 Work 目錄中,因此我勾選了 "Directory" 選項,並設置了 Work 目錄。bash
Colors:這個地方須要根據習慣本身調整配置。想一想之後經常使用的 Shell 的樣子就是這裏決定的,仍是值得花時間去根據本身喜愛進行配置。因爲我我的使用 Emacs 做爲經常使用編輯器,並且 emacs 一直在用 Solarized light 主題,因此我再右下角的 "Color Presets" 裏面選擇了 "Solarized light" 主題。字體、背景顏色均可以在 Solarized light 的基礎上進行微調。服務器
此外,在 Colors 選項卡中,有個 "Cursor Guide" 選項,這個選項能夠高亮當前光標所在行,更方便的找到光標位置,有須要的能夠打開。不過這裏有一個快捷鍵 "Command+/" 能夠直接定位到光標位置,很好用,因此我沒有打開 "Cursor Guide"。
Window:能夠配置透明度、模糊效果和窗口大小等,看我的感覺吧。
其餘配置沒有修改,因此這裏再也不列舉了。
Keys:綁定的一些快捷鍵,這裏我只添加了一個全局的快捷鍵 "HotKey -> Show/Hide all windows with a system-wide hotkey",並設置爲了 Command+Control+i。這樣在任何應用中,只要觸發了該快捷鍵,iTerm2 會當即回到第一窗口的位置,再次觸發會隱藏 iTerm2。
此外提一個強烈些的建議:將 MacBook 上的 CapsLock 鍵位和左下角的 Control 鍵互換,互換方法在 "System Preferences -> Keyboard -> Keyboard -> Modifier Keys",仍不清楚的上網搜一下。這樣替換的好處是:
MacOS 上面的基本全部可編輯的地方,Control+f、Control+b 表明前進、後退一個字符,Control+k 表示刪除當前行光標位置以後的內容,Control+d表示刪除前面的字符。
此外,MacOS 系統中絕大部分編輯器中還可使用 Control+n、Control+p 來進行上一行下一行移動,例如 Xcode、Sublime Text、系統文本編輯器等。固然,若是你使用 Emacs,相信對這個鍵位的修改更沒有疑問了。
Arrangements:這個暫時沒有用到。
Pointer:鼠標和手勢的一些操做,對此沒有關注,有興趣可本身看一下。
Advanced:更多的可自定義配置,參數衆多,若是你想戒掉王者榮耀,能夠嘗試將各個參數弄清楚(PS:意義不大,不建議這麼幹,仍是玩王者吧)。
iTerms 的有些快捷鍵不用掌握,由於後面章節會介紹更好用的工具。這裏只列舉了幾個經常使用操做。
Shift+Command+h —> 用於彈出粘貼歷史窗口。
Command+f —> 當前 tab 中搜索
按住 Command 鍵時有一些簡單的操做:
oh-my-zsh 絕對是加強 shell 的一個神器,它提供了完整的插件體系,能夠根據工做需求選用不一樣的插件。
經過 wget:
sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
複製代碼
經過 curl:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
複製代碼
關於 oh-my-zsh 的配置均在 $home 目錄下的 .zshrc 文件中,如需修改配置可以使用文本編輯器打開編輯(如 emacs、vim 等),修改完成後從新登陸 shell 或者執行 "source ~/.zshrc" 便可生效。
主題:
打開 .zshrc 文件後,ZSH_THEME="robbyrussell" 這一行就是主題的配置,我採用了默認配置 robbyrussell。
oh-my-zsh 的主題配置主要是一些提示字符串格式、時間值、權限、git 版本管理時顯示的格式等信息。目前我還不清楚 oh-my-zsh 的主題對 iTerm2 的顯示外觀(背景色、字體等)有何影響,由於我換了幾個 ZSH_THEME 後只是提示字符串等信息的變化,沒有發現背景色、字體等外觀受到影響。若是有知道的,麻煩留個言,也讓我學習下。
插件:
打開 .zshrc 文件後,plugins=(git) 這一行是 oh-my-zsh 集成的插件列表,我安裝的 oh-my-zsh 版本默認只使用了 git 插件。咱們能夠在這個列表中添加 ~/.oh-my-zsh/plugins 目錄下 oh-my-zsh 已經提供的插件。
關於插件,我使用了 git, zsh-syntax-highlighting, autojump 插件,.zshrc 文件配置爲:
plugins=(git
zsh-syntax-highlighting
autojump)
複製代碼
git: 有很方便的使用命令行 git 工具的快捷綁定,例如 git checkout master 能夠直接使用 gco master,關於全部的快捷綁定,能夠打開 ~/.oh-my-zsh/plugins/git/git.plugin.zsh 文件查看全部的 alias。建議掌握幾個最經常使用的命令快捷綁定:gco/gst/gaa/gcmsg/glgg/gl/gp/gd/gba。
zsh-syntax-highlighting: 該插件能夠幫助咱們再輸入命令時是否有誤。例如,我在命令行中只輸入 'v' 字符時,因爲 shell 中沒有這個命令,因此這個 'v' 字符顯示爲紅色,可是當我再輸入 'im' 後,'vim' 這幾個字符就變成了綠色,表示 shell 中有這個命令。該插件並非 oh-my-zsh 自帶的插件,安裝方法見下文的「自定義插件」。
autojump: 方便的跳轉到某個目錄,zsh 能夠記錄已經訪問過的目錄,使用 autojump 能夠輸入 "j 想要跳轉的目錄" 直接進入到目錄,autojump 也支持輸入 "j" 後再輸入目錄關鍵字符,使用 補全目錄。
後續若是有新發現的好用的插件,我也會更新該文檔,方便參考。
自定義插件:
oh-my-zsh 包含一個完備的插件體系,不僅可使用默認已打包的插件,也可使用自定義插件:咱們以 zsh-syntax-highlighting 插件爲例簡述一下如何爲 oh-my-zsh 添加自定義的插件。
其餘從網絡上下載的插件使用方法與 zsh-syntax-highlighting 相似,固然有能力也能夠本身寫插件。
關於 powerline
相信不少人都看到過別人的 Shell 有以下圖這種樣式:
powerline 實際上是一種加強提示信息的展示方式,能夠在 vim、emacs、shell 等多個場景下使用,以前也用過 powerline,但通過長期使用後,覺着 powerline 在 shell 中的優勢並不明顯,因此目前我已經棄用了。若是有興趣,可按照:iTerm2 Oh-my-zsh 配置與 agnoster 主題配置 一文中的方法進行配置。
有一點須要注意,在以前的印象中,若是須要使用 powerline,iTerm2 的背景色不能有透明度,記得是由於 powerline 的三角不支持透明。有興趣的能夠驗證下,並留個言告訴個人記憶是否正確。
一些經常使用的快捷鍵:
在 ~/.zshrc 最後一行加入:
alias lm="ls -al"
alias rm='trash'
alias cl='clear'
複製代碼
lm 是爲了顯示當前目錄全部文件(包含隱藏文件),rm 關聯到 trash 是爲了防止不當心使用了 "rm -rf xxx", cl 是清屏操做。
經常使用快捷鍵會隨着個人使用體驗進行更新。
使用 Homebrew 進行安裝:$ brew install MacVim
其實 MacOS 系統是自帶 Vim 編輯器的,可是因爲系統自帶通常版本較低,因此這裏安裝一個 MacVim,其也有 GUI 能夠用。
我平常使用的編輯器是 Emacs,遺憾的是 Emacs 其實並不如 Vim 那麼的適合在終端使用,Vim 能夠說是跟 Shell 聯繫最緊密的編輯器,因此掌握 Vim 的一些基礎操做仍是必須的。
因爲如今我從事 iOS 開發工做,使用 Shell 的只是處理一些平常工做,並不會使用其進行代碼編寫。因此掌握 Vim 的一些基礎操做就足夠了。這一部分 Vim 黨請略過,不過我相信 Vim 黨也基本都已經有本身的完整的 shell 配置。
這裏推薦 github 上一個 star 比較多的 vim 配置:k-vim。 安裝過程在 github 中有詳細文檔,這裏就再也不贅述。我對 k-vim 的某些默認配置進行了修改:
$home/.vimrc 中的 "set background=dark",我改爲了 light(由於個人 iTerm 配置的 light 主題)。
231 行到 244 行與 relativenumber 有關的都被我註釋掉了,由於我不太習慣相對行號。
此外,在 Shell 中使用 MacVim 要使用 "mvim -v" 命令,爲了方便在 Shell 中使用 MacVim,在 ~/.zshrc 最後爲 "mvim -v" 命令添加一個別名:
alias vim="mvim -v"
複製代碼
上面提到我目前經常使用編輯器是 Emacs,可是個人 Emacs(Spacemacs) 使用的是 vim 快捷鍵,由於 vim 的快捷鍵確實很是通用,並且效率高。(PS: 使用 Xcode 的可以發現,Xcode 的快捷鍵其實更像 Emacs) Vim 的一些基礎操做仍是但願儘可能可以掌握,例如 Vim 的集中模式,hjkl、e、b、0、$、dd、:w、:wq、:q、i、Esc、Control+[、o、O、v 等。
本文不是一篇 Vim 的介紹和教程,這裏提到 Vim 只是爲了可以在 Shell 中方便的編輯文件。若是不是專門使用 Vim 寫代碼,掌握基礎技能就夠用了(例如簡單修改一個文件)。 若是但願能有一個本身順手的長期使用的編輯器,建議能夠深刻學習下 Vim,固然 Emacs 也是不錯的選擇。(我習慣於 Emacs,一方面是因爲熟悉 Scheme 語言,與Emacs Lisp 同屬 Lisp 語言,可以自定義配置和編寫插件,另外 Spacemacs 的出現下降了 Emacs 的學習成本,有興趣能夠嘗試)。
Tmux 是一個終端複用軟件,BSD 協議發佈。通常用於在一個命令行窗口中訪問多個命令行會話,或者在一個命令行終端中同時使用多個程序。
你是否曾經開過一大堆的 Terminal?有沒有把它們都保存下來的衝動?Tmux 的 Session 就是作這件事情的。只要沒有關機,即便 iTerm/Terminal/Konsole 意外關閉也不要緊,Session 能夠徹底恢復。即便關機了其實也能夠恢復,可是要配置,由於個人Mac關機不多,並且平常工做不多有鏈接服務器的需求,因此沒有這類需求。
Tmux 讓咱們能夠隨時退出或者進入任何一個 Session。每一個 Session 有若干個 Window,每一個 Window 又能夠分紅多個窗格(Pane)。有了 Session 的概念, Tmux 就能夠隔離工做環境,好比爲處理第一項工做相關的會話建立一個work0,爲處理第二項工做的會話建立一個 work1,爲我的 hack 建立一個personalhack,而後咱們就能夠經過 session 的切換來切換咱們的工做環境,咱們能夠就置身於單個工做環境了,達到了工做環境隔離的效果。這個功能嘗試使用一下會有驚喜。
Tmux 是本文的重點介紹內容。
brew install tmux
複製代碼
tmux 中經常使用的有四個概念:
tmux 中的快捷鍵操做由一個 prefix 開啓,即按下 prefix 鍵位後,鬆開,再去按另外一個快捷鍵。默認的 prefix 鍵位是 Control+b,考慮到下面兩個緣由,我將其改成了 Control+空格。
Control+b 按起來並不順手,並且 Mac OSX 系統中,Control+b 一般表明返回到上一個字符位置,若是使用 Control+b 做爲 prefix,若是須要返回到上一個字符位置,則須要按兩次 Control+b。
網上大部分教程提示將 Control+b 修改成 Control+a,可是因爲 Control+a 在 MacOSX 中表示回到當前行的起始位置,若是使用 Control+a 做爲 prefix,咱們須要按兩次 Control+a 才能回到行首,也不太方便。因此我這裏修改成了 Control+Space。
配置方法:在 ~/.tmux.conf 文件(若是沒有須要本身建立)中加入下面語句:
#設置前綴爲 Ctrl + Space
set -g prefix C-Space
#解除 Ctrl+b 與前綴的對應關係
unbind C-b
複製代碼
tmux 會話(session)操做
tmux 窗口(window)操做
tmux 中的一個會話能夠有多個窗口,各個窗口能夠互不影響。
tmux 面板(pane)操做
tmux 中的每一個窗口均可以打開多個面板,一個窗口的面板會同時展現在窗口中。下面是一些經常使用操做,在下一節介紹了 tmux 插件後會使操做更方便。
修改 prefix 按鍵:上面已經介紹過了。
開啓鼠標操做:
#開啓鼠標操做
set -g mouse on
複製代碼
開啓鼠標操做可使用鼠標切換面板,而且一個比較使用的功能 copy/paste 功能:
按住 alt 鍵(Option鍵),按住鼠標左鍵,移動鼠標以選中部分文本,鬆開鼠標左鍵後,選中的文本就複製到了系統的剪切板,能夠在其餘應用中粘貼。
此外,若是在鬆開鼠標左鍵後,點擊鼠標中鍵(不要放開 alt 鍵),則選中的文本會自動粘貼到當前面板中的輸入處,同時,系統剪切板也是能夠用的。
從新加載 tmux 配置快捷鍵:
#在 tmux 中使用 prefix + r 從新加載配置
bind r source-file ~/.tmux.conf \; display-message "Config reloaded"
複製代碼
修改完成後,可使用 "prefix+:" 進入命令行模式,而後使用 "source ~/.tmux.conf" 生效新的配置,以後再次生效新配置就能夠直接使用 "prefix+r" 快捷綁定了。
修改面板和窗口起始編號(默認均爲 0):
#窗口和麪板的起始編號爲 1
set -g base-index 1
setw -g pane-base-index 1
複製代碼
啓用 256 色(這個應該默認就是支持的):
#使 tmux 顯示 256 色
set -g default-terminal "screen-256color"
複製代碼
安裝 TPM(Tmux Plugin Manager):
clone TPM 項目:
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
複製代碼
~/.tmux.conf 底部添加:
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
複製代碼
重載 tmux 配置文件
使用 TPM 安裝插件的方法:
該插件提供了一些便利的 pane 操做:
安裝該插件後,每次點擊了 prefix 按鍵後,底部的狀態欄會顯示一個狀態,詳細請參考其 github 說明文檔。之由於我安裝了這個,是由於有時候命令不起做用時,我能夠清晰看到是否是 prefix 沒有成功觸發。
複製粘貼:
首先安裝一個 tmux 插件 tmux-yank ,該插件可讓 tmux 複製和粘貼系統剪切板。安裝說明請參考項目的 README 說明。
在 ~/.tmux.conf 文件中添加一下代碼(個人 tmux 版本是 2.5,若是是之前的版本,命令可能不同):
#複製操做
set-window-option -g mode-keys vi
bind-key -T copy-mode-vi 'v' send-keys -X begin-selection
bind-key -T copy-mode-vi 'V' send-keys -X select-line
bind-key -T copy-mode-vi 'r' send-keys -X rectangle-toggle
bind-key -T copy-mode-vi 'y' send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"
複製代碼
在 tmux 會話中,使用 "prefix+r" 從新加載 ~/.tmux.conf,而後咱們能夠作以下操做:
"prefix+[" 進入 tmux 複製模式,使用 vim 快捷鍵移動光標到須要複製的文本起始位置,點擊 "v" 開始複製,繼續使用 vim 快捷鍵移動光標到須要複製的文本末尾位置,按下 "y" 後,退出 tmux 複製模式,而且複製了已選文本,這時,使用 "Command+v" 就能夠將已複製文本粘貼了。而且,在其餘應用也是可使用 "Command+v" 進行粘貼的。
fzf 提供命令行中的模糊搜索,絕對算得上是 shell 的一個大殺器,誰用誰知道。安裝方法可參考 github README,使用 homebrew 安裝很是簡單。
fzf 提供對 tmux 和 vim 的支持,因此與本文所述的環境結合度很是高。下面看一下我常常用到的功能:
在 tmux 中搜索文件和目錄:
只需按下快捷鍵 Control+t 便可(不須要 tmux 中的 prefix 鍵),就會在當前的窗口中出現一個交互式的輸入行,下方是搜索本目錄的子目錄和文件匹配到的結果,以下圖:
可使用 Control+n 和 Control+p 上下選擇搜索結果,點擊 Enter 會將該行內容輸入到 tmux 的命令輸入行中,使用 Control+g 退出 fzf 搜索模式。fzf 的搜索是模糊搜索,很是方便,另外能夠看到 Control 鍵是很是的經常使用,這也是上面建議將鍵盤左下角的 Control 和 Capslock 鍵互換的緣由。
在 tmux 中索索歷史命令:
使用快捷鍵 Control+r (不須要 tmux 中的 prefix 鍵)。效果同上,只不過彈出的列表是歷史命令。再也不詳述。
支持部分 shell 命令的參數補全:
上面介紹的幾個工具涉及到了多個配置文件,爲了統一管理配置文件,建議集中管理並引入 git 進行版本控制。
vim 的配置文件是 ~/.vimrc,zsh 的配置文件是 ~/.zshrc,tmux 的配置文件是 ~/.tmux.conf,fzf 的配置文件 ~/.fzf.zsh。這裏將幾個文件放入到 ~/Dotfiles/ 目錄中,併爲該目錄引入 git 版本控制,而後在 $home 目錄下爲三個文件建立與文件相同名字的符號連接。最後,直接修改由 git 管理的 Dotfiles 中的文件便可。
本文中介紹的 iTerm2 和 MacVim 應該是隻適用於 MacOS,對於 Linux 系統能夠採用系統終端,而後安裝 zsh,vim(有的系統只有vi,而沒有vim,須要安裝)。其他的例如 oh-my-zsh,tmux,fzf等功能,Linux 也是可使用的。
最後再推薦一個工具 Moom ,用着很是舒服,尤爲是在筆記本電腦這種屏幕大小有限的環境下。具體使用方法這裏就不介紹了,請參考 OS X 是了不得的操做系統:窗口控制應用 Moom 體驗詳解。
關於 Shell 環境的配置先介紹這麼多,有更好用的插件或配置我會更新上來。一眼看過去貌似命令比較多,不過我的覺着這些命令都不須要死記硬背,只要你堅持用上兩週,我想基本能記個差很少了吧。通過我長期使用的體驗,iTerm二、zsh、oh-my-zsh、vim 和 Tmux 的組合確實可以有效提升工做效率。
但願全部程序員都能掌握一部分命令行的操做,而且有一個本身用的習慣的 Shell 環境。