以优雅的方式使用终端

可能因为以前玩 Linux 的缘故, 看终端很顺眼, 我个人是比较喜欢用终端搞事情的装起逼来也显得比较高端, 但 OS X 自带的终端有很多东西不是特别的好用, 正巧前段时间看了池老师的终极 shell, 于是闲下来折腾一下自己的 Shell

Shell 交互当然有缺点, 比如看起来很难懂啦、全是文字不够直观啦、不美观啦等等, 今天要讲的就是如何让它看上去和用上更优雅. 其实 Shell 也有很多优点, 比如它可以和内核直接进行交互, 省去了很多性能在 GUI 界面上的浪费, 因为 GUI 界面与内核交互, 中间很多时候也是要通过 Shell, 只不过没让你看见, 所以说, 真正干活的是 Kernel, GUI 就是为了让你直观的理解与观察

下面开始正题


OS X 本身提供了很多 Shell, 默认的是 bash, 我们可以通过

1
cat /etc/shells

进行查看系统提供了哪些 Shell

1
2
3
4
5
6
7
8
9
10
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

需要说明的是, 世界上不止这几种 Shell, 存在着很多小众的 Shell, 之所以小众, 可能是因为开发它的人目标性很强, 并不通用, 可能也并未想让它通用, 以上这几种是 OS X 中内置的 Shell

OS X 中系统默认提供的是bash, 我们可以通过

1
echo $SHELL


1
2
echo $0
#注: 这个用法不是所有 Shell 都支持

来查看当前的 Shell

但其实, bash 并不是最强大的 Shell, 最强大的是 zsh, 它可以兼容 bash, 并且提供了很多 bash 没有的特性和功能, 但其本身配置相当复杂, 所以用的人很少, 鉴于其优秀的特性于是有个叫 robbyrussell 的哥们开发出了oh-my-zsh, 这个就厉害了, 而且配置容易了很多

首先

囿于 OS X 本身提供的 Terminal 太简单, 可定制项太少, 达不到定制的要求, 所以呢, 我们先去安装一个更好用的终端模拟器: iTerm2, 安装方式有很多, 你点这里直接下载zip压缩包, 解压后拖进 Applications 里可以, 使用 homebrew

1
brew install iterm2

也可以, 或者在终端中使用 wget

1
wget https://github.com/gnachman/iTerm2/archive/v2.0.0.20141103.zip

也可以, whatever you want…总之, 你开心就好了

其次

iTerm2 默认提供的是 Dark 主题, 本身还是蛮不错的, 不过我觉得太单调了点儿, 于是我自己配置了好久, 但无奈都不太理想, 恰巧正好在 GitHub 上发现了这么一款, 很符合我的胃口 Lucario , 我自己在它原有的基础稍稍修改了一些颜色, 看上去还不错

之后我们需要切换到 zsh

1
chsh -s /bin/zsh

再次

我们安装更简单的 oh-my-zsh, 当然和 iterm2 一样, 安装方式也有很多, 你可以去 GitHub 下载源码, 通过执行tools文件夹中的 install.sh 来安装, 也可以通过 brew install oh-my-zsh 来安装, 或者

1
wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

都一样, 接着拷贝 oh-my-zsh 配置文件

1
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

配置

关于主题

oh-my-zsh 的配置基本都集中在~/.zshrc这个文件内, vim 打开之

1
vi ~/.zshrc

oh-my-zsh 默认提供的是 robbyrussell 这个主题, 说明一下, 这是 zsh的主题, 也就是 Shell 的主题, 区别于 iTerm2的配色方案, 这两个是不同的东西, iTerm2相当于衣服一样, 包裹着 Shell

我没有使用自带的主题 没错, 我就是这么喜欢与众不同, 我使用的我根据 ys.zsh-theme 这个主题自己定义的, 修改了 Prompt 的一些东西, 下面是我的 zsh-theme 主题配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# VCS
ONEOFAI_VCS_PROMPT_PREFIX1=" %{$fg[white]%}on%{$reset_color%} "
ONEOFAI_VCS_PROMPT_PREFIX2=":%{$fg[cyan]%}"
ONEOFAI_VCS_PROMPT_SUFFIX="%{$reset_color%}"
ONEOFAI_VCS_PROMPT_DIRTY=" %{$fg[red]%}x"
ONEOFAI_VCS_PROMPT_CLEAN=" %{$fg[green]%}o"

# Git info
local git_info='$(git_prompt_info)'
ZSH_THEME_GIT_PROMPT_PREFIX="${ONEOFAI_VCS_PROMPT_PREFIX1}git${ONEOFAI_VCS_PROMPT_PREFIX2}"
ZSH_THEME_GIT_PROMPT_SUFFIX="$ONEOFAI_VCS_PROMPT_SUFFIX"
ZSH_THEME_GIT_PROMPT_DIRTY="$ONEOFAI_VCS_PROMPT_DIRTY"
ZSH_THEME_GIT_PROMPT_CLEAN="$ONEOFAI_VCS_PROMPT_CLEAN"

# HG info
local hg_info='$(oneofai_hg_prompt_info)'
oneofai_hg_prompt_info() {
# make sure this is a hg dir
if [ -d '.hg' ]; then
echo -n "${ONEOFAI_VCS_PROMPT_PREFIX1}hg${ONEOFAI_VCS_PROMPT_PREFIX2}"
echo -n $(hg branch 2>/dev/null)
if [ -n "$(hg status 2>/dev/null)" ]; then
echo -n "$ONEOFAI_VCS_PROMPT_DIRTY"
else
echo -n "$ONEOFAI_VCS_PROMPT_CLEAN"
fi
echo -n "$ONEOFAI_VCS_PROMPT_SUFFIX"
fi
}

local exit_code="%(?,,C:%{$fg[red]%}%?%{$reset_color%}) "

# Prompt format:
#
# PRIVILEGES USER @ MACHINE in DIRECTORY on git:BRANCH STATE [TIME] C:LAST_EXIT_CODE
# $ COMMAND
# For example:
#
# % oneofai in ~/.oh-my-zsh on git:master x > [17:30]
#

ONEOFAI_SHORT_DATE_FORMAT="["$(date "+%H:%M")"]"
PROMPT="%(#,%{$bg[yellow]%}%{$fg[black]%}%n%{$reset_color%},%{$fg[cyan]%}%n) \
%{$fg[white]%}in \
%{$terminfo[bold]$fg[yellow]%}%~%{$reset_color%}\
${hg_info}\
${git_info}\
%{$terminfo[bold]$fg[red]%} > %{$reset_color%}"

RPROMPT="%{$fg[blue]%}$ONEOFAI_SHORT_DATE_FORMAT"

如果你想修改主题呢, 可以去oh-my-zsh Themes看下, 这里都是 iTerm2 本身内置的一些主题, 路径在 ~/.oh-my-zsh/theme 下, 然后挑选一个自己喜欢的, 如果觉得这里没有你中意的, 也可以去这里 oh-my-zsh External-themes 自己下载之后放到 ~/.oh-my-zsh/theme 下, 然后把 ~/.zshrcZSH_THEME 改为你想用的主题的名字

1
ZSH_THEME="主题名字"

当然你也可以像我一样, 自己定义一款属于你自己的主题 😊, 不要被上边那一大段吓到, 其实就是 Shell 的脚本

关于插件

oh-my-zsh 本身提供了很多插件可供选择, 但是很多默认都没有启用, 你可以自己启用, 下图是我自己的插件列表

其中 aliasextractgitautojumpzsh-syntax-highlighting, 我这几个插件是比较常用的, 我分别解释一下

alias :自动设置别名, 比如l=ls -lahla= ls -ah=history
extract :可以使用 x 命令自动解压像 .tar.tar.gz.zip等文件, 不需要再多余的指令
git :当你处于一个 git 受控的目录下时,Shell 会明确显示 gitbranch, 另外还对 git 很多命令进行了简化,例如 ga=git addgd=git diff
autojump :是自动跳转的插件, 它可以让你快速的跳转刚刚访问的目录, 例如j projects 它会快速跳转到刚刚访问的路径中带有projects字样的目录,这个插件需要手动安装, 你可以通过 brew install autojump进行安装, zsh 本身没有内置
zsh-syntax-highlighting :是命令语法高亮的插件, 如果输入的命令正确, 它默认会以绿色显示, 错误以红色显示

关于环境变量

oh-my-zsh 本身在安装的时候会自动读取当前环境变量进行设置, 如果你觉得还不够呢, 可以自己追加, 下图是我的环境变量

zsh 不仅仅可以设置别名, 还可以针对文件类型设置对应的打开程序, 例如

1
alias -s html=atom

alias -s html=atom 意为当你在终端中直接输入扩展名为.html的文件名字的时候, 比如 index.html, 它会直接用 Atom 这个应用打开, 非常方便

以上这些都是基本配置, 基本平常使用就无大碍了, 下边说一些zshiterm技巧性的东西

技巧

关于 iTerm

  • 在 iTerm 的 Preferences - Keys - Hotkey - Hotkey toggles a dedicated window with profile: 设置一个用户热键呼出的 profile, 即可通过快捷键从屏幕边缘呼出, 并且还可以设置呼出的样式, 从上边从下边从左从右, 任君选择, 很是炫酷
  • ⌘ + 左键单击 :可以打开文件, 文件夹和链接
  • ⌘ + t :新建标签页(这应该是OS X下几乎所有软件的默认 keymap)
  • ⌘ + 数字 & ⌘ + 方向键 : 切换标签页
  • ⌘ + d :左右分屏
  • ⇧ + ⌘ + d :上下分屏
  • ⌘ + / :显示光标位置
  • 快捷键有很多啦, 想了解的话可以去看下 iTerm 的设置, 里边都有标出
  • 另外, 它的 Show Tips of the Day 很有意思

关于 zsh

  • 可以省略 cd 命令
  • 连续按 tab 可以直接选择文件及文件夹
  • kill 会自动列出所有进程, 也可以用 kill aria2 , 它会列出 aria2 的 PID
  • 输入一个命令, 按方向键上下翻,可以列出你所使用这个命令的历史记录, 例如brew + , 可以查看你使用 brew开头的所有命令, 很是好用
  • 输入 d, 可列出你在这个会话里访问的目录列表, 比如你在当前 /WorkSpace 访问了另一个文件夹下/Downloads目录, 它会记录下来, 输入列表前的序号,即可直接跳转
  • l **/* 可以递归显示当前目录下的文件及目录
  • 使用 colored-man-pages 这个插件可以以彩色方式来查看 man页面

代理

我个人使用的是 shadowsocks , httpsocks5 两种方式都用

想要 iTerm2 走代理的话, 只需要在 ~/.zshrc 中添加如下命令即可

或者直接在终端中输入

1
2
export https_proxy=http://127.0.0.1:9090 #9090 换成你自己的代理端口
export http_proxy=http://127.0.0.1:9090 #ss 默认是1080

0%