前言
大家好,我是Kira。
作为前端猴子,在开发的时候,不可避免使用到终端命令行进行一些操作。但是原生的终端软件十分简陋,不仅不好看,还不好用。
今天就给大家带来我自己Mac终端的终极解决方案:iTerm2 + Zsh + tmux + Powerline。
iTerm2
iTerm2是Mac的一款终端模拟器,和原生Terminal相比,它有很多优点和功能。
- 好看!
- 多用户profile配置,自定义空间非常大也很方便
- 多Tab
- 设置半透明(可以一边开发一边观察前端效果)
- 热键呼出(这个很牛逼,不管你当前在什么软件下工作,甚至是全屏的工作空间,都可以直接呼出终端)
- 自动填充、搜索、终端内图片显示等等(不过个人觉得用得不多,很多与本解决方案中其他软件提供的功能重复)
配置项
大部分采用默认配置即可,下面列出一些实用配置。
Profiles
Profiles选项下可以配置不同的配置文件,以便不同的用户或者不同的情境下使用不同的成套配置。
-
Profiles -> Window
Window, 顾名思义,关于窗口的配置。
-
Style: 窗口大小和位置
-
Screen: 热键呼出时窗口出现的位置(哪个屏幕)
-
Space: 热键有效的工作空间
(强烈建议All Spaces)
其他配置诸如是否透明、窗口大小(行数/列数)、背景图等等按自己喜好来就行。
-
-
Profiles -> Keys
Keys, 热键配置。
打开
A hot opens a dedicated window with this profile.选项。如果想要配置呼出窗口的热键,点击下面的按钮自己随心配。
其他(To-Do)
等用到的时候再慢慢研究吧,咱这初级用户暂时用不上。列个To-Do。
Zsh
Zsh是操作系统命令行工具(说是语言也可以)里的佼佼者。它1990年发布的时候就既吸收了ksh在命令式可编程脚本语言上的良好逻辑设计,又吸收了tcsh丝滑般的交互体验,集众家之长。
我们作为只在程序开发中使用终端做打包、版本控制等简单操作的轻度使用者,最看重的,是Zsh完善的插件机制以及良好的生态。这可以让我们DIY自己想要的交互、主题等等。
我们可以在~/.zshrc中编写一些脚本以配置自己的Zsh。
oh-my-zsh
oh-my-zsh是Zsh生态中一款153k Stars的配置管理框架。
它能干啥?
- 协助我们DIY自己的Zsh theme
- Plugins机制帮助拓展Zsh功能(包括但不限于一些工具的Tab键autocomplete)
安装
curl、wget以及一些其他类似的安装工具都可以,以curl为例:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Tips 国内因为一些众所周知的原因,在安装的时候可能无法连接,我们可以访问IPAddress,搜索raw.githubusercontent.com,拿到ip地址后,修改电脑的hosts文件,把对应关系加上去,如下(ip地址不一定准确,请自行查询):
185.199.108.133 raw.githubusercontent.com
然后我们就可以顺利安装啦。
Notice 安装完之后,原本的.zshrc会重命名为.zshrc.pre-oh-my-zsh,我们可以在安装之后把内容复制到新的.zshrc中。
使用
在~/.zshrc中添加如下内容:
export ZSH=$HOME/.oh-my-zsh
plugins=(
# 这里填上你想要使用的插件
git
)
source $ZSH/oh-my-zsh.sh
重启终端软件,或者执行:
source ~/.zshrc
然后就可以快乐地使用oh-my-zsh啦!
Plugins
oh-my-zsh的丰富插件,使得我们的shell可以得到极大的扩展。所有内置的插件都放在~/.oh-my-zsh/plugins里了。
这里介绍几个常用的插件吧。
-
git
提供了常规git命令的自动填充,还有很多有用的alias和functions,比如ga => git add等等。
-
macos
提供了很多终端操作MacOS的命令,比如showfiles/hidefiles来显示/隐藏在系统中被隐藏的文件等等。
-
iterm2
提供了一些终端操作iTerm2的命令,配合上一节推荐的iTerm2可以使某些场景下操作更有效率。
其他各位去plugins文件夹自己探索吧,每个插件都有readme。
主题
后续我们介绍Powerline的使用,不在此赘述直接在oh-my-zsh下配置主题的方法。
tmux
tmux是一个终端复用器。它有两大主要功能:终端复用和窗口会话分离。
-
终端复用
tmux可以复用终端客户端窗口。在一个客户端窗口下,可以创建多个tmux窗口。在一个tmux窗口下,可以创建多个面板,并且自由排布。
-
窗口会话分离
要知道这是个啥功能,首先要知道什么是
会话。当我们打开终端客户端,在里面使用命令行与计算机产生临时的交互,这就叫一次会话。重要的是,正常情况下,会话和窗口是绑定在一起的:窗口打开,会话就开始了;窗口关闭,会话就over了。所以蛋疼的情况来了:你要在一次会话里完成一个复杂的任务,结果干到一半,窗口噶了。当你慌忙重新打开窗口的时候,之前干活儿的记录包括干到哪儿了就完全丢了,甚至跑到一半的程序也随着窗口一起噶了,这时你会大叫一声f**k。这就相当于,你在写论文,没保存,突然电脑崩了,你刚写的一万字没了。
而tmux可以做到将会话与窗口分离,将会话运行在电脑后台。就算你的窗口遇到问题突然关闭,你重新打开的时候,依然可以通过命令找到之前的会话并且重新接入。
安装
大部分包管理器可以直接安装,以Mac下homebrew为例:
brew install tmux
或者你可以从git上直接下载源代码,然后执行脚本编译安装,具体参考tmux的github主页。
使用
tmux的使用方法相当简单,基本基于命令和快捷键,由于快捷键可以自由配置,这里仅讲述命令方式。
启动/退出
启动和退出是两个很简单的命令,如下:
# 启动
tmux
# 退出(关闭一个tmux窗口)
# 注意:如果当前窗口是tmux会话中唯一的窗口,则自动关闭会话
exit
会话管理
tmux可以新建、分离、查看、接入、关闭、切换、重命名会话,具体命令如下:
# 新建会话
# 谨慎尝试tmux嵌套
tmux new -s <session-name>
# 可以省略-s部分,如果省略,则tmux自动从0开始为会话编号
# 分离会话
tmux detach
# 查看会话列表
tmux list-session
# 或者使用缩略命令
tmux ls
# 接入会话
tmux attach -t <session-name>
# 关闭会话
tmux kill-session -t <session-name>
# 切换会话
tmux switch -t <session-name>
# 重命名会话
tmux rename-session -t <old-session-name> <new-session-name>
窗口管理
tmux可以新建、切换、重命名窗口,具体命令如下:
# 新建窗口
tmux new-window -n <window-name>
# 可以省略-n部分,如果省略,则tmux自动从0开始为窗口编号
# 切换窗口
tmux select-window -t <window-name>
# 重命名当前窗口
tmux rename-window <new-window-name>
面板管理
tmux可以在窗口中分隔出多个面板并且排布它们,具体命令如下:
# 划分上下面板
tmux split-window
# 划分左右面板
tmux split-window -h
# 将光标移动到上/下/左/右的面板中
tmux select-pane -U/D/L/R
# 交换面板的位置(上或左移/下或右移)
tmux swap-pane -U/D
其他命令
tmux提供了列出所有命令的命令:
# 列出所有tmux命令及其参数
tmux list-commands
有其他需要的命令都可以去查到,或者可以参考tmux manual page。
配置
tmux支持各种自定义配置,配置写在~/.tmux.conf。
状态栏
tmux底部有一个状态栏,一般左侧显示会话和窗口信息,右边显示系统信息,可以自定义:
# status bar
# 背景色
set -g status-bg blue
# 窗口信息格式
set-option -gw window-status-format "#I:#W#F "
# 当前窗口信息格式
set-option -gw window-status-current-format "#I:#{=-20:pane_current_path}#F "
# 右侧信息格式化
set -g status-right "%H:%M:%S %m/%d/%Y %a "
# 状态刷新间隔(单位:秒)
set -g status-interval 1
快捷键
-
前缀键
tmux有丰富的快捷键来提供快速的命令操作,而大部分快捷键都需要使用前缀键唤起。默认是
Ctrl+b,比如分离会话的快捷键是Ctrl+b d,就需要先同时按下Ctrl和b,然后松掉,再按下d,就可以分离会话了。前缀键是可以配置的,如下:
# 设置前缀键 set -g prefix C-a # 解绑默认前缀键 unbind C-b -
窗口和面板
窗口和面板的快捷键绑定,使用
bind-key命令,这个命令有几个常用选项:-T: 设置key-table,如果不加这个参数,则默认绑定到prefix key table,就是需要使用前缀唤起快捷键。
-n: 等同于
-T root,绑定到root key table,无需任何多余操作,就可以使用快捷键。比如bind-key -n M-1,就是直接按下Meta(alt)和1键就可以触发快捷键功能。我的快捷键配置,供大家参考一下:
# window bind-key t new-window # 新建窗口 bind-key w confirm-before -p "kill-window #W? (y/n)" kill-window # 关闭窗口前确认 bind-key & choose-window # 选择窗口 bind-key -n C-v split-window -v \; select-layout even-vertical # 纵向切割窗口 bind-key -n C-h split-window -h \; select-layout even-horizontal # 水平切割窗口 # panel bind-key -T prefix x kill-pane # 关闭面板 # 选择面板布局 bind-key -n M-1 select-layout even-horizontal bind-key -n M-2 select-layout even-vertical bind-key -n M-3 select-layout main-horizontal bind-key -n M-4 select-layout main-vertical bind-key -n M-5 select-layout tiled -
其他快捷键
tmux还有一些其他功能,比如时钟模式、reload配置文件等,我自己是按照下面的绑定的:
# system bind-key -T prefix c clock-mode # easy config reload bind-key -T prefix r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded"
Powerline
Powerline是一个状态栏插件,它支持shell、vim、tmux等等。你可以自定义状态栏显示内容、颜色等等。这里我们只讲shell下Powerline的配置。
安装
推荐使用pip/pip3安装,如下:
pip install powerline-status
安装完毕后,可以查看安装信息:
pip show powerline-status
找到你的Powerline程序地址,一般来说在~/Library/Python/3.9/bin,取决于你的Python装在哪儿。
在你的~/.zshrc中添加如下两行:
export PATH={你的powerline程序所在目录}:$PATH
. {powerline_root}/bindings/zsh/powerline.zsh
注意:以上代码中{powerline_root}是指,通过pip show powerline-status命令输出的内容的Location字段下的powerline文件夹。
随后:
source ~/.zshrc
Powerline启动!
配置
说配置之前,我们得关注几个东西:主题、配色和segments。
-
segments
这是Powerline statusline每个小节显示的内容。想要显示啥随你定。
-
主题
一整套完整的segments以及其他的配置组成的方案。
-
配色
这个不用解释了吧。
配置文件都放在{powerline_root}/config_files里了。
config.json
这个文件规定了Powerline采用什么主题和什么配色。我们只在shell中使用,所以我们只关注其中的shell字段:
(顺便展示了一下我配成的iTerm2+tmux)
一般来说这里不用改,除非你想要仅在左侧展示Powerline statusline。我们直接进对应配置文件进行修改就可以了。
当然,备份是个好习惯,当你把文件改噶了的时候,方便你恢复过来。
colors.json
这个文件枚举了颜色名称和编号的对应关系,之后可以用上。
themes
关于主题的配置,都在这个文件夹了。
-
powerline.json
包含了所有主题统一使用的一些通用配置,比如间隔符用哪个字符、segments函数的参数等等,基本使用默认配置就可以了。
-
shell
这是我们需要重点关注的文件夹,关于shell下Powerline的主题配置都放在这里面了。
__main__.json枚举了shell所有主题通用的公共配置。如果我们采用的是default主题,那我们只需要关注default.json就可以了。
{ "segments": { "left": [ { "function": "powerline.segments.common.env.user", "priority": 30 }, { "function": "powerline.segments.shell.cwd", "priority": 10 }, ], "right": [ { "function": "powerline.segments.common.vcs.stash", "priority": 50 }, { "function": "powerline.segments.common.vcs.branch", "priority": 40 } ] } }显而易见,这里配置了default主题显示哪些字段。left和right分别表示左右显示的字段参数。所有支持的函数都可以在{powerline_root}/segments里找到,不过需要耐心、耐心、耐心,如果没有,抄我的就好了。
至于continuation.json和select.json是干嘛的,我也没研究明白,不过我暂时不需要用到。
colorschemes
这里放了所有配色的配置文件。就不需要细讲了,看文件名和字段名就能看明白。
扩展
Powerline怎么都好,但是对于git状态显示的支持却差强人意,因此我挖到了一个宝藏扩展:powerline-gitstatus。它丰富了Powerline的git状态展示segments。
安装
pip install powerline-gitstatus
配置
抄作业吧铁子们:
把下面这段配色配置并入{powerline_root}/config_files/colorschemes/default.json:
{
"groups": {
"gitstatus": { "fg": "gray10", "bg": "gray4", "attrs": [] },
"gitstatus_branch_clean": { "fg": "gray10", "bg": "gray4", "attrs": [] },
"gitstatus_branch_dirty": { "fg": "gray10", "bg": "gray4", "attrs": [] },
"gitstatus_branch_detached": { "fg": "mediumpurple", "bg": "gray2", "attrs": [] },
"gitstatus_tag": { "fg": "gray10", "bg": "darkcyan", "attrs": ["bold"] },
"gitstatus_behind": { "fg": "gray10", "bg": "gray2", "attrs": ["bold"] },
"gitstatus_ahead": { "fg": "gray10", "bg": "gray2", "attrs": ["bold"] },
"gitstatus_staged": { "fg": "gray10", "bg": "green", "attrs": ["bold"] },
"gitstatus_unmerged": { "fg": "gray10", "bg": "brightred", "attrs": [] },
"gitstatus_changed": { "fg": "gray10", "bg": "mediumorange", "attrs": ["bold"] },
"gitstatus_untracked": { "fg": "gray10", "bg": "darkestred", "attrs": ["bold"] },
"gitstatus:divider": { "fg": "gray10", "bg": "gray4", "attrs": [] }
}
}
把下面这段segments配置并入{powerline_root}/config_files/themes/shell/default.json中的left字段:
{
"function": "powerline_gitstatus.gitstatus",
"priority": 40
}
把下面这段格式化配置并入{powerline_root}/config_files/themes/shell/__main__.json:
{
"segment_data": {
"gitstatus": {
"args": {
"formats": {
"branch": "",
"tag": "★ {}",
"behind": "⬇ {}",
"ahead": "⬆ {}",
"staged": "● {}",
"unmerged": "✖ {}",
"changed": "{}",
"untracked": "… {}",
"stashed": ""
}
}
}
}
}
奇怪的问题
到这里,我们Mac的终端就成为一个美丽又能干的姑娘了。
可是,纵使姑娘再合心意,也有可能会出一些奇怪的问题。
Powerline乱码问题
Powerline中有些间隔符需要特殊字体的支持,因此我们要安装Powerline字体(Powerline fonts):
从github上直接clone这个项目,然后在根目录下执行install.sh脚本即可。
随后,打开我们的iTerm2配置,找到Profiles -> Text,把Use built-in Powerline glyphs勾选上,然后在下面Font选项中选择你喜欢的Powerline字体。
git命令输出问题
就在安装了这一整套东西之后,我的git命令输出的信息突然从英文变成了中文,还夹杂着些许乱码,在~/.zshrc中做如下修改:
...
export LESSCHARSET=utf-8
alias git='LANG=en_GB git'
# 前面两行最好放在上面,谁知道放在下面又会出现什么奇怪的问题呢?
source $ZSH/oh-my-zsh.sh
...
然后重载zsh配置文件即可。
结语
咱们的Mac终端就配置完成啦!欢迎大家私信交流。
基神镇楼
One More Thing...
介绍一个好玩的命令行小工具:The Fuck。
这个小工具可以对你上次输错的命令进行纠错。
Mac下利用homebrew进行安装:
brew install thefuck
你可以给它配置你想要的别名:
eval $(thefuck --alias {你喜欢的别名})
重启终端。