Mac终端终极解决方案一揽子计划

12,818 阅读6分钟

前言

大家好,我是Kira

作为前端猴子,在开发的时候,不可避免使用到终端命令行进行一些操作。但是原生的终端软件十分简陋,不仅不好看,还不好用。

今天就给大家带来我自己Mac终端的终极解决方案:iTerm2 + Zsh + tmux + Powerline


iTerm2

logo2x.jpg

iTerm2是Mac的一款终端模拟器,和原生Terminal相比,它有很多优点和功能。

  • 好看!
  • 多用户profile配置,自定义空间非常大也很方便
  • 多Tab
  • 设置半透明(可以一边开发一边观察前端效果)
  • 热键呼出(这个很牛逼,不管你当前在什么软件下工作,甚至是全屏的工作空间,都可以直接呼出终端)
  • 自动填充、搜索、终端内图片显示等等(不过个人觉得用得不多,很多与本解决方案中其他软件提供的功能重复)

配置项

大部分采用默认配置即可,下面列出一些实用配置。

Profiles

Profiles选项下可以配置不同的配置文件,以便不同的用户或者不同的情境下使用不同的成套配置。

  • Profiles -> Window

    Window, 顾名思义,关于窗口的配置。

    image.png

    • Style: 窗口大小和位置

    • Screen: 热键呼出时窗口出现的位置(哪个屏幕)

    • Space: 热键有效的工作空间(强烈建议All Spaces)

    其他配置诸如是否透明、窗口大小(行数/列数)、背景图等等按自己喜好来就行。

  • Profiles -> Keys

    Keys, 热键配置。

    image.png

    打开A hot opens a dedicated window with this profile.选项。

    如果想要配置呼出窗口的热键,点击下面的按钮自己随心配。

其他(To-Do)

等用到的时候再慢慢研究吧,咱这初级用户暂时用不上。列个To-Do。


Zsh

color_vertical_icon.png

Zsh是操作系统命令行工具(说是语言也可以)里的佼佼者。它1990年发布的时候就既吸收了ksh在命令式可编程脚本语言上的良好逻辑设计,又吸收了tcsh丝滑般的交互体验,集众家之长。

我们作为只在程序开发中使用终端做打包、版本控制等简单操作的轻度使用者,最看重的,是Zsh完善的插件机制以及良好的生态。这可以让我们DIY自己想要的交互、主题等等。

我们可以在~/.zshrc中编写一些脚本以配置自己的Zsh。

oh-my-zsh

68747470733a2f2f6f686d797a73682e73332e616d617a6f6e6177732e636f6d2f6f6d7a2d616e73692d6769746875622e706e67.png

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-logo-large.png

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字段:

image.png

(顺便展示了一下我配成的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字体。

image.png

git命令输出问题

就在安装了这一整套东西之后,我的git命令输出的信息突然从英文变成了中文,还夹杂着些许乱码,在~/.zshrc中做如下修改:

...

export LESSCHARSET=utf-8

alias git='LANG=en_GB git'

# 前面两行最好放在上面,谁知道放在下面又会出现什么奇怪的问题呢?
source $ZSH/oh-my-zsh.sh

...

然后重载zsh配置文件即可。


结语

咱们的Mac终端就配置完成啦!欢迎大家私信交流。


image.png

基神镇楼


One More Thing...

介绍一个好玩的命令行小工具:The Fuck

这个小工具可以对你上次输错的命令进行纠错。

Mac下利用homebrew进行安装:

brew install thefuck

你可以给它配置你想要的别名:

eval $(thefuck --alias {你喜欢的别名})

重启终端。

example.gif