在工作中常会遇到程序员用着系统的 terminal 艰难的敲击着 bash shell 的命令。这种原始的方式可能会导致工作效率降低。
对于终端的选择,每个人的习惯不一样,无法要求保持一致,但是我觉着,最基础最常用的终端功能的配置,最好还是在团队里推广一下,可以一定程度提高那些用着默认 terminal 的大神们的效率(PS: 听说有些大神使用记事本写代码,这类不在考虑之中)。但是这类配置又比较零散,所以写一个我自身常用的 Shell 工作环境的总结吧,本文以MacOS为例,对于Linux系统,在文章最后列举了一些差异。本文适合想要提高一些终端使用效率的同学们。
首先需要安装 iTerm2,下载地址:iTerm2 Download,建议下载 Stable Release 版本。
安装完成后,打开 iTerm2 -> Preferences,就可以根据自己的使用习惯进行一些偏好设置了,由于可配置的选项太多,这里不做一一列举,只对我自己设定的一些选项进行简单的介绍。(注意下载的不同版本的 iTerm2 的默认配置有可能有细微差别)
对于 General 选项卡,目前还没遇到修改的需求。
对于 Appearence 选项卡,我改动了 Tabs 的一些设置,如下图:
(1) 将 "Tab bar location" 改为了 Top
(2) 将 "Theme" 改为了 Light(可以根据个人习惯进行选择)
改动较多的就是 Profiles 选项卡了,Profiles 主要是与显示外观有关的配置,在左侧可以新建多个 profile 配置,这里我只采用了 Default。
每个 Profile 的右边有多个配置选项:General、Colors、Text、Window、Terminal、Session、Keys、Advanced:
(1) General:在下方有个 "Working Directory" 的配置,这个是当你每次打开 shell 时默认进入的工作目录,可以根据自己的工作习惯进行配置。由于我经常工作在 home 的 Work 目录中,所以我勾选了 "Directory" 选项,并设置了 Work 目录。
(2) Colors:这个地方需要根据习惯自己调整配置。想想以后常用的 Shell 的样子就是这里决定的,还是值得花时间去根据自己喜好进行配置。由于我个人使用 Emacs 作为常用编辑器,而且 emacs 一直在用 Solarized light 主题,所以我再右下角的 "Color Presets" 里面选择了 "Solarized light" 主题。字体、背景颜色都可以在 Solarized light 的基础上进行微调。此外,在 Colors 选项卡中,有个 "Cursor Guide" 选项,这个选项可以高亮当前光标所在行,更方便的找到光标位置,有需要的可以打开。不过这里有一个快捷键 "Command+/" 可以直接定位到光标位置,很好用,所以我没有打开 "Cursor Guide"。
(3) Window:可以配置透明度、模糊效果和窗口大小等,看个人感受吧。
(4) 其他配置没有修改,所以这里不再列举了。
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",仍不清楚的上网搜一下。这样替换的好处是:
(1) MacOS 上面的基本所有可编辑的地方,Control+f、Control+b 代表前进、后退一个字符,Control+k 表示删除当前行光标位置之后的内容,Control+d表示删除前面的字符。
(2) 此外,MacOS 系统中绝大部分编辑器中还可以使用 Control+n、Control+p 来进行上一行下一行移动,例如 Xcode、Sublime Text、系统文本编辑器等。当然,如果你使用 Emacs,相信对这个键位的修改更没有疑问了。
Arrangements:这个暂时没有用到。
Pointer:鼠标和手势的一些操作,对此没有关注,有兴趣可自己看一下。
Advanced:更多的可自定义配置,参数众多,如果你想戒掉王者荣耀,可以尝试将各个参数弄清楚(PS:意义不大,不建议这么干,还是玩王者吧)。
iTerms 的有些快捷键不用掌握,因为后面章节会介绍更好用的工具。这里只列举了几个常用操作。
Shift+Command+h —> 用于弹出粘贴历史窗口。
Command+f —> 当前 tab 中搜索
按住 Command 键时有一些简单的操作:
(1) 可以拖拽选中的字符串;
(2) 点击 url —> 调用默认浏览器访问该网址;
(3) 点击文件 —> 调用默认程序打开文件;如果文件名是 filename:42,且默认文本编辑器是 Macvim、Textmate 或 BBEdit,将会直接打开到这一行;
(4) 点击文件夹 —> 在 finder 中打开该文件夹;
(5) 同时按住 option 键,可以以矩形选中,类似于 vim 中的 ctrl v 操作。
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)
(1) 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。
(2) zsh-syntax-highlighting: 该插件可以帮助我们再输入命令时是否有误。例如,我在命令行中只输入 'v' 字符时,由于 shell 中没有这个命令,所以这个 'v' 字符显示为红色,但是当我再输入 'im' 后,'vim' 这几个字符就变成了绿色,表示 shell 中有这个命令。该插件并不是 oh-my-zsh 自带的插件,安装方法见下文的“自定义插件”。
(3) autojump: 方便的跳转到某个目录,zsh 可以记录已经访问过的目录,使用 autojump 可以输入 "j 想要跳转的目录" 直接进入到目录,autojump 也支持输入 "j" 后再输入目录关键字符,使用 补全目录。
后续如果有新发现的好用的插件,我也会更新该文档,方便参考。
自定义插件:
oh-my-zsh 包含一个完备的插件体系,不只可以使用默认已打包的插件,也可以使用自定义插件:我们以 zsh-syntax-highlighting 插件为例简述一下如何为 oh-my-zsh 添加自定义的插件。
(1) 下载 zsh-syntax-highlighting 并解压。
(2) 将文件夹所有内容拷贝到 ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting 里面。
(3) 最后配置 ~/.zshrc 文件的 plugins=(git zsh-syntax-highlighting)
其他从网络上下载的插件使用方法与 zsh-syntax-highlighting 类似,当然有能力也可以自己写插件。
关于 powerline
相信很多人都看到过别人的 Shell 有如下图这种样式:
powerline 其实是一种增强提示信息的展现方式,可以在 vim、emacs、shell 等多个场景下使用,之前也用过 powerline,但经过长期使用后,觉着 powerline 在 shell 中的优点并不明显,所以目前我已经弃用了。如果有兴趣,可按照:iTerm2 Oh-my-zsh 配置与 agnoster 主题配置 一文中的方法进行配置。
有一点需要注意,在之前的印象中,如果需要使用 powerline,iTerm2 的背景色不能有透明度,记得是因为 powerline 的三角不支持透明。有兴趣的可以验证下,并留个言告诉我的记忆是否正确。
一些常用的快捷键:
(1) "d" 目录浏览和跳转:输入 d,就显示在会话里访问的目录列表,输入列表前的序号,即可以跳转,如下图:
(2) 在 ~/.zshrc 最后一行加入:
```
alias lm="ls -al"
alias rm='trash'
alias cl='clear'
```
lm 是为了显示当前目录所有文件(包含隐藏文件),rm 关联到 trash 是为了防止不小心使用了 "rm -rf xxx", cl 是清屏操作。
(3) 常用快捷键会随着我的使用体验进行更新。
使用 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 的某些默认配置进行了修改:
(1) $home/.vimrc 中的 "set background=dark",我改成了 light(因为我的 iTerm 配置的 light 主题)。
(2) 231 行到 244 行与 relativenumber 有关的都被我注释掉了,因为我不太习惯相对行号。
(3) 此外,在 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 中常用的有四个概念:
(1) server:服务器。输入 tmux 命令时就开启了一个服务器。
(2) session:会话。一个服务器可以包含多个会话。
(3) window:窗口。一个会话可以包含多个窗口。
(4) pane:面板。一个窗口可以包含多个面板。
tmux 中的快捷键操作由一个 prefix 开启,即按下 prefix 键位后,松开,再去按另一个快捷键。默认的 prefix 键位是 Control+b,考虑到下面两个原因,我将其改为了 Control+空格。
(1) Control+b 按起来并不顺手,而且 Mac OSX 系统中,Control+b 通常代表返回到上一个字符位置,如果使用 Control+b 作为 prefix,如果需要返回到上一个字符位置,则需要按两次 Control+b。
(2) 网上大部分教程提示将 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)操作
(1) 打开会话:在 iTerm2 Shell 中输入"tmux"后,就进入了一个新的 tmux 会话。
(2) 脱离当前会话:"prefix+d",这时会回到 Shell 中。
(3) 脱离指定会话:"prefix+D"
(4) 切换会话:"prefix+s",当有多个会话时,使用这个功能切换工作环境非常有用。
(5) 修改会话名字:"prefix+$"
(6) 进入命令行模式:"prefix+:",此时可输入支持的命令,例如 kill-server 关闭所有 tmux 会话, kill-session 关闭当前会话。
(7) 挂起会话:"prefix+C-z"
tmux 窗口(window)操作
tmux 中的一个会话可以有多个窗口,各个窗口可以互不影响。
(1) 每次打开一个会话会默认创建一个窗口
(2) 创建新窗口:"prefix+c"
(3) 关闭当前窗口:"prefix+&"
(4) 切换到指定数字窗口:"prefix+数字键 0-9"
(5) 切换到上一个窗口:"prefix+p"
(6) 切换到下一个窗口:"prefix+n"
(7) 通过窗口列表切换窗口:"prefix+w"
(8) 重命名窗口:"prefix+,"
(9) 修改当前窗口编号,相当于重新排序:"prefix+."
(10) 在所有窗口中查找关键词:"prefix+f"
tmux 面板(pane)操作
tmux 中的每个窗口都可以打开多个面板,一个窗口的面板会同时展示在窗口中。下面是一些常用操作,在下一节介绍了 tmux 插件后会使操作更方便。
(1) 关闭当前分屏:"prefix+x"
(2) 显示面板编号:"prefix+q"
(3) 最大化当前所在面板:"prefix+z",再次使用会复原当前面板大小。
(4) 将当前面板上下分屏:"prefix+""
(5) 将当前面板左右分屏:"prefix+%"
(6) 选择当前窗口中下一个面板:"prefix+o"
(7) 置换面板位置:"prefix+{" or "prefix+}" or "prefix+C-o" or "prefix+M-o"
修改 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):
(1) clone TPM 项目:
```
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
```
(2) ~/.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'
```
(3) 重载 tmux 配置文件
使用 TPM 安装插件的方法:
(1) 添加 .tmux.conf 文件中类似 set -g @plugin '…'这样的行,添加你想要的插件
(2) 在 tmux 环境中使用 "prefix+I" 安装插件(ls ~/.tmux/plugins/可以看到抓下来的插件)
(3) 如果要升级所有插件,敲 "prefix+U"
(4) 如果要干掉某个插件,先从~/.tmux.conf 中删掉对应的行,然后 "prefix+alt+u"。
该插件提供了一些便利的 pane 操作:
(1) 竖直分隔面板:"prefix+|"
(2) 水平分隔面板:"prefix+-"
(3) 跳转到左边的面板:"prefix+h" or "prefix+C-h"
(4) 跳转到上面的面板:"prefix+k" or "prefix+C-k"
(5) 跳转到下面的面板:"prefix+j" or "prefix+C-j"
(6) 跳转到右边的面板:"prefix+l" or "prefix+C-l"
安装该插件后,每次点击了 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 命令的参数补全:
(1) 输入:kill -9 ** 就会出现一个进程列表,输入进程 ID 即可杀死指定进程。
(2) 输入:vim ** 会出现一个当前目录下面文件的列表,可以输入文件名进行匹配。
(3) 还有一些其他命令,参考下 fzf 的说明文档吧,我常用的就这几种。
上面介绍的几个工具涉及到了多个配置文件,为了统一管理配置文件,建议集中管理并引入 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 环境的配置先介绍这么多,有更好用的插件或配置我会更新上来。一眼看过去貌似命令比较多,不过个人觉着这些命令都不需要死记硬背,只要你坚持用上两周,我想基本能记个差不多了吧。经过我长期使用的体验,iTerm2、zsh、oh-my-zsh、vim 和 Tmux 的组合确实能够有效提高工作效率。
希望所有程序员都能掌握一部分命令行的操作,并且有一个自己用的习惯的 Shell 环境。