Mac/Linux下配置iTerm2+zsh+powerline美化终端窗口

Mac/Linux下配置iTerm2+zsh+powerline美化终端窗口

一、Mac/Linux支持哪些shell?

不管是在macOS还是Linux/Unix,默认使用的shell都是bash,但实际上,macOS/Linux/Unix有很多种shell可以用,如zsh、csh、ksh、fish、tcsh等等,默认支持的shell可以查看/etc/shells文件:

cat /etc/shells

二、为什么要使用zsh?

zsh是很多Mac用户喜欢使用的一个shell,我没有具体了解它相比bash有哪些优势,但就使用的体会来说,比bash好的几个地方是:

  • 1)按tab键跳转更智能,看,我输入cd后,直接按tab,或者输入想要进的文件夹按tab,它就会自动显示出匹配的目录,并且还可以通过按tab键/上下左右键来选中:
    ScreenFlow.gif
  • 2)目录和文件都有颜色,很方便看出哪个是目录,哪个是文件
  • 3)样式好看,而且可以自己选择不同的主题样式
  • 4)如果当前目录是支持git的,还可以显示git当前是在哪个分支
    Xnip2018-11-07_13-18-49.png
  • 5)回删更方便,按command+w(macOS)或ctrl+w(Linux)可一段一段的回删(如果bash的话,是直接整段回删的,不能一节一节的删除)
    section-del-back.gif

三、怎样安装配置zsh?

1、安装zsh

对于Mac,系统本身就自带zsh,在/bin/zsh下,所以无需要安装。
对于Linux,如果是最小化安装的系统,有可能没有zsh,这时你直接使用以下命令安装就可以:
CentOS:

sudo yum -y install zsh

对于Debian系列Linux(如Debian、Ubuntu)

sudo apt -y install zsh

2、安装Oh My Zsh

由于自己配置zsh比较复杂,所以已经有人写好了配置zsh的工具,这个工具叫 Oh My Zsh,执行下面的命令即可安装(执行该命令必须先安装git: yum -y install git):

#国外服务器用这个安装
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

#国内服务器如果用上边的命令安装不了,可以用gitee同步的仓库来安装
sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)"

由于这属于个性化配置,所以普通用户和超级用户各都要自装一遍,由于Mac一般不直接使用超级用户,而是通过sudo -s进入超级用户,所以Mac一般情况一只需要普通用户装一遍即可(因为sudo -s进入超级用户后执行环境还是原来的用户),如果你需要用susudo -i切换到超级用户,那么mac的超级用户也要再安装一遍,至于Mac到底怎样才算是超级用户,有几种切换到超级用户的方法,请认真看完以下两篇文章:
Mac开启root用户及切换到root用户的方法
Linux为普通用户设置sudo权限及通过sudo切换到root

如果是centos,你有可能遇到这个报错:

Cloning Oh My Zsh...
正克隆到 '/root/.oh-my-zsh'...
fatal: unable to access 'https://github.com/robbyrussell/oh-my-zsh.git/': Peer reports incompatible or unsupported protocol version.
Error: git clone of oh-my-zsh repo failed

如果遇到上述报错,请执行以下命令更新后,再重新安装:

yum update -y nss curl libcurl

安装好之后,光标应该是变成这样(可以换其他样式,往下看):
Xnip2018-11-07_13-13-40.png

其实所谓的安装,是下载了 Oh My Zsh 到你的家目录,执行cd ~即可进入家目录,Oh My Zsh就在.oh-my-zsh目录中,注意,由于点开头的文件是隐藏的,如果要用ls显示的话,需要用-a选项来显示ls -la ~ | grep oh
Xnip2018-11-07_14-37-58.png

但其实除了下载,它还自动执行了shell切换,即使用chsh命令执行了chsh -s /bin/zsh,用于把默认shell设置为zsh,所以网上很多教程说要执行chsh -s /bin/zsh,其实我实际测试,并不需要,因为安装Oh My Zsh的时候它已经帮我们执行了,用echo $SHELL即可检测你当前是什么shell,正常的话应该输出:

/bin/zsh

如果不是zsh,或者你退出再进再检测,发现不是zsh,那就执行一次chsh -s /bin/zsh命令切换到zsh就行,其实该命令就是修改/etc/passwd中用户对应的默认shell,比如以下就是root用户在/etc/passwd文件中的内容,它的最后一段/usr/bin/zsh就是登录该用户后默认执行的shell

root:x:0:0:root:/root:/usr/bin/zsh

3、配置Oh My Zsh

注意,由于已经切换成了zsh,所以对于以前开机启动的配置文件~/.bashrc/etc/bashrc等这些文件,都要换成~/.zshrc/etc/zshrc

对于Mac由于是使用普通用户安装的,当用切换到超级用户时,会报以下错误(Linux由于是普通用户和超级用户各自安装一遍,不会出现这个问题):

[oh-my-zsh] Insecure completion-dependent directories detected:
drwxr-xr-x   16 bruce  staff   512 11  5 01:46 /Users/bruce/.oh-my-zsh
drwxr-xr-x  257 bruce  staff  8224 11  5 00:20 /Users/bruce/.oh-my-zsh/plugins
drwxr-xr-x    4 bruce  staff   128 11  5 00:20 /Users/bruce/.oh-my-zsh/plugins/git
drwxr-xr-x    3 bruce  admin    96 11  4 22:14 /usr/local/share/zsh
drwxr-xr-x    4 bruce  admin   128 11  4 22:31 /usr/local/share/zsh/site-functions
lrwxr-xr-x    1 bruce  admin    39 11  4 22:31 /usr/local/share/zsh/site-functions/_brew -> ../../../Homebrew/completions/zsh/_brew
lrwxr-xr-x    1 bruce  admin    44 11  4 22:31 /usr/local/share/zsh/site-functions/_brew_cask -> ../../../Homebrew/completions/zsh/_brew_cask

[oh-my-zsh] For safety, we will not load completions from these directories until
[oh-my-zsh] you fix their permissions and ownership and restart zsh.
[oh-my-zsh] See the above list for directories with group or other writability.

[oh-my-zsh] To fix your permissions you can do so by disabling
[oh-my-zsh] the write permission of "group" and "others" and making sure that the
[oh-my-zsh] owner of these directories is either root or your current user.
[oh-my-zsh] The following command may help:
[oh-my-zsh]     compaudit | xargs chmod g-w,o-w

[oh-my-zsh] If the above didn't help or you want to skip the verification of
[oh-my-zsh] insecure directories you can set the variable ZSH_DISABLE_COMPFIX to
[oh-my-zsh] "true" before oh-my-zsh is sourced in your zshrc file.

从报错倒数第二行可以看出,我们在~/.zshrc中添加ZSH_DISABLE_COMPFIX=true即可解决这个错误,我把它加在这个位置:
Xnip2018-11-05_02-16-55.png
位置不一定要加在这,只要加在source $ZSH/oh-my-zsh.sh之前即可。
注意,修改.zshrc文件后,要用source ~/.zshrc重新加载该配置文件才能生效。

如果是Linux普通用户和root用户都要安装的话,一般是重复安装,普通用户装一遍,root用户装一遍,但root用户也可以不安装,直接把普通用户的.zshrc复制一份到root用户的根目录即可,但因为是root用户加载使用普通用户的配置,所以也需要设置ZSH_DISABLE_COMPFIX=true,否则进入的时候会报错,并且不会加载该配置。

4、配置zsh主题

~/.zshrc文件中,ZSH_THEME="robbyrussell"这一行即是设置主题的,robbyrussell就是主题名称,你可以把它换成别的名称,怎么知道有哪些名称可以换呢?执行命令ls -l ~/.oh-my-zsh/themes出来的都是主题,但要注意主题名称不包括.zsh-theme后缀,至于每个主题的样式是怎样的,你可以查看该项目的WIKI Oh My Zsh Themes 注意设置后用source ~/.zshrc重新加载一下。

debian系统如果出现类似这样的错误

zsh (xxxx):12: character not in range

请运行以下命令并选择en_US.UTF8(空格选择,上下键移动,回车确定),然后重启服务器即可解决

sudo dpkg-reconfigure locales

5、修改zsh主题

比如我用agnoster主题(需要安装powerline字体,往下看)的时候,觉得前面这个“用户名@主机”太长了,主机没必要显示,因为肯定是本机,如果登录了其他远程机器,主题就由那个远程机决定了,跟本机没关系,所以我想要把@Bruces-MacBook-Pro去掉,并且修改一下背景颜色(黑色太难看了):
Xnip2018-11-08_15-12-45.png

agnoster.zsh-theme复制一份再改个名字,我改成了agnoster-custom.zsh-theme,在.zshrc里引用的时候,引用自定义的那个就好:

cp agnoster.zsh-theme agnoster-custom.zsh-theme

修改前:
Xnip2018-11-08_16-25-14.png
修改后:
Xnip2018-11-08_16-24-42.png
zsh语法手册:https://wiki.archlinux.org/index.php/zsh

解释一下:001、white、”%B%n%b”分别是三个参数,按顺序分别表示:背景色、前景色(文字颜色)、文字。%n表示当前用户名(比如切换到root,%n就是root),%n被大写的%B和小写的%b包起来,表示加粗(Bold粗体):

prompt_segment 001 white "%B%n%b"

另外,其实Oh-My-Zsh是有个自定义目录的~/.oh-my-zsh/custom,该目录下有“themes”和“plugins”两个目录,建议自定义的文件放到这里好点,当然你要放在原themes目录也可以。

后记:后来我还是觉得有个主机名好点,又修改了一下,有两种,大家可以直接下载使用:
样式一:点击下载
Xnip2019-03-17_13-24-22.jpg

样式二:点击下载
Xnip2019-03-17_13-16-26.jpg

前面说的背景色、前景色,既可以用颜色英文单词表示,也可以用数字表示,使用以下命令来显示色值表(安装oh-my-zsh后才会有这两个命令):
显示背景色:

spectrum_bls

显示前景色:

spectrum_ls

256种颜色色值表,左侧的数字即为颜色值,共256种(0—255),故颜色值最大为255。(完整图请看好用的vim配置文章的最后,或者你自己执行命令来显示也一样)
Xnip2018-11-08_16-56-01.png

当然也可以直接查看我这张色值图(每个格子左下角的三位数即为色值,而中间的是16进制色值,我们要填的是3位数的色值,16进制色值只是标明是什么颜色):
Xterm_256color_chart.svg

6、omz命令的使用

其实安装OhMyZsh后是有一个omz命令的(就是OhMyZsh的三个首字母),执行omz即可查看帮助

Usage: omz <command> [options]

Available commands:

  help                Print this help message
  changelog           Print the changelog
  plugin <command>    Manage plugins
  pr     <command>    Manage Oh My Zsh Pull Requests
  reload              Reload the current zsh session
  theme  <command>    Manage themes
  update              Update Oh My Zsh
  version             Show the version

我们主要用plugin(插件)和theme(主题),运行omz plugin即可查看它的用法

Usage: omz plugin <command> [options]

Available commands:

  disable <plugin> Disable plugin(s)
  enable <plugin>  Enable plugin(s)
  info <plugin>    Get information of a plugin
  list             List all available Oh My Zsh plugins
  load <plugin>    Load plugin(s)

同理,运行omz theme即可查看它的用法

Usage: omz theme <command> [options]

Available commands:

  list            List all available Oh My Zsh themes
  set <theme>     Set a theme in your .zshrc file
  use <theme>     Load a theme

四、配置powerline

1、什么是powerline?

Powerline官网
powerline,power是强大的意思,line在这里指statusline(状态行/状态栏),合起来就是强大的状态栏,意思就是能让一些程序,比如vim/zsh/bash/tmux等状态栏变的更好看。

先放一个vim使用powerline后的演示,可以看到vim底部多了一个状态栏,当vim在命令模式时,显示NORMAL,在插入模式时显示INSERT,当vim在替换模式(按大写R进入)时,显示REPLACE,另外我还忘了演示按v进入可视化操作的时候,会显示VISUAL,并且还有文件名,当前系统编码等:

powerline-vim.gif

zsh使用powerline的演示,主要是不同用户颜色不一样,然后如果是git目录会显示当前分支(其实git是否有文件可以add,commit等等都会显示不同的状态的):

powerline-zsh.gif

注意:安装powerline后,vim和zsh都可以设置powerline支持,但也可以单独设置,比如我只想让vim使用powerline,而zsh不使用,这是可以的,因为zsh本身也有很多样式,未必没有powerline好看,这个看不同人喜欢的风格。

2、安装powerline

powerline其实就是用python写的一些脚本,所以所谓的安装,就是把它的这些脚本文件下载下来放到随便一个你想放的位置即可。

为了避免多用户使用多份powerline,我们把powerline脚本放在/usr/local下,就像我们安装软件也放在那下边一样。

powerline是开源的,代码就在github上,所以我们直接把它clone下来即可:

git clone https://github.com/powerline/powerline.git /usr/local/powerline

注意,网上很多用pip安装的,其实是一样的,最后也是下载这个github上的powerline而已,并且安装的目录会不一样。
如何更新:由于是用git下载的,所以以后偶尔到/usr/local/powerline目录下git pull一下即可更新。

我们刚刚从git下载到/usr/local的powerline的/usr/local/powerline/scripts目录中有一些命令会被powerline脚本调用的:

├── powerline-config
├── powerline-daemon
├── powerline-lint
├── powerline-release.py
└── powerline-render

我们要把这些命令要添加到环境变量中(添加到你的.bashrc.zshrc中,最后要source一下):

export PATH=/usr/local/powerline/scripts:$PATH

3、安装powerline字体

如果是服务器,可以略过这一步,字体只给有界面的系统用,如果你用的是linux桌面系统比如CentOS或Fodera或Ubuntu等等,才要做这一步
因为powerline会使用一些特殊符号来表示一些状态(比如目录箭头,git库状态等等),所以需要安装它提供的特殊的字体(其实就是普通字体加上了对powerline特殊符号的支持)。

因为Linux的系统字体是放在/usr/share/fonts目录中的,我们要支持powerline的特殊符号,按道理,把字体文件丢进该目录,然后重建字体缓存即可,实际上也可以这么做。但由于使用powerline是个性化设置,我们一般会把它放在用户的家目录中(这就意味着不同用户各自都要有一份字体在自己的家目录中)。

powerline的字体,也是在github上开源的,我们要安装,就要先把它下载下来(随便下载到哪个文件夹都行,反正安装好后就没用了,安装好后是要把它删除掉的):

git clone https://github.com/powerline/fonts.git

然后进入字体目录:

cd fonts

运行安装字体工具(其实所谓安装,对于linux,就是把它拷贝到用户家目录下的.local/share/fonts目录下而已(fonts目录默认不存在,是安装的时候它自动创建的),对于mac,就是把它拷贝到~/Library/Fonts/目录中):

./install.sh

安装好之后,就可以把刚才下载的字体删除了,因为“安装”这个操作已经把字体拷贝到~/.local/share/fonts(linux)或~/Library/Fonts/(mac)目录下了。

然后我们还要把一个特殊字体PowerlineSymbols.otf字体也下载到用户自定义字体目录中,从名字上看,它是用于支持一些符号的字体,但实际上在设置字体的时候又找不到这个字体,所以我也不是很清楚,官方文档是要把它跟github上的那组字体放在一起的:

对于Linux:

wget -O ~/.local/share/fonts/PowerlineSymbols.otf https://github.com/powerline/powerline/raw/develop/font/PowerlineSymbols.otf

对于mac:

wget -O ~/Library/Fonts/PowerlineSymbols.otf https://github.com/powerline/powerline/raw/develop/font/PowerlineSymbols.otf

然后把字体文件对应的配置文件下载到字体配置文件目录中(这一步mac不用做,Linux要做):

wget -O /etc/fonts/conf.d/10-powerline-symbols.conf https://github.com/powerline/powerline/raw/develop/font/10-powerline-symbols.conf

强制刷新字体缓存(这一步mac不用做,Linux要做):

fc-cache -vf ~/.local/share/fonts/

fc-cache命令不存在?你需要安装fontconfig

yum -y install fontconfig

3、使用powerline

zsh使用powerline风格:
在.zshrc文件末尾引用powerline.zsh(前面我们是把powerline放在/usr/local下,所以powerline.zsh就在那里),引用方式是开头一个英文句点,然后空格隔开,然后是powerline.zsh的路径(不管你用pip安装还是自已git clone下来都是一样的道理):

. /usr/local/powerline/powerline/bindings/zsh/powerline.zsh

注意,如果你是bash shell,那么也是有bash shell支持的(目录结构是相似的,自己找找就找的到),powerline不只是支持zsh,它还支持bash,fish等等。

然后执行source ~/.zshrc加载配置文件,加载完,效果就出来了:
Xnip2018-11-07_14-14-18.png

然后我们在iterm2的偏好设置里把字体换成powerline的字体(我觉得Roboto Mono for Powerline最好看,你也可以试试其他的,只要powerline结尾的都可以)
Xnip2018-11-07_14-57-24.png

切换字体后的效果(可以看到?号已经没了),注意,在.zshrc里引用powerline后,powerline风格将替代zsh的主题风格,也就是说你现在去改zsh的主题,不管你怎么改主题都不会变了,因为已经被powerline替代了,而powerline又只有这一种风格(你可以改配置,但感觉也改不了太多):
Xnip2018-11-07_13-12-27.png

由于使用了powerline,Mac系统自带的『终端』也一样会有?号出现,虽然我平时都用iTerm2,但是终端的字体我也会改一下:
Xnip2018-11-07_14-53-12.png

由于启用powerline后,就无法修改主题,如果你觉得powerline那种主题不好看,也可以把.zshrc里引入powerline的语句前面加个#号注释掉,然后换一个你喜欢的zsh主题,其中agnoster是一个比较多人用的powerline风格的主题。

vim使用powerline风格:
对于mac,如果你用brew安装过vim,那么要先把它卸载了(默认的vim不支持使用powerline):

brew uninstall --force vim

然后重新安装macvim(使用的时候还是用vim,完全一样使用的):

brew install macvim

然后在.bashrc.zshrc里添加以下命令(相当于把/usr/local/bin/目录下的所有命令都添加到环境变量,这样brew安装的vim就能覆盖系统自带的vim)

export PATH=/usr/local/bin:$PATH

然后记得source一下

# 如果你没安装过zsh
source ~/.bashrc
# 如果你安装了zsh
source ~/.zshrc

然后用以下命令检查一下它是否支持python:

vim --version | grep +python

只要出现python的,就说明支持python,就可以用powerline(因为powerline是python写的),否则就要重装支持python的vim了:

Xnip2019-01-27_17-01-14.jpg

对于Linux也一样,比如Debian默认的安装方式apt install vim安装的vim是不支持python的,只能卸载了手动编译(centos yum安装的默认是支持的)

先卸载原来的vim

sudo apt remove vim vim-runtime gvim vim-tiny vim-common vim-gui-common vim-nox

然后安装python-dev

# 对应python2.7
apt install python-dev
# 对应python3.5
apt install python3.5-dev

需要安装,不然下边的编译会报错

checking for tgetent()... configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.
sudo apt install libncurses5-dev

下载vim源码

git clone https://github.com/vim/vim.git

编译vim

cd vim
./configure --with-features=huge \
            --enable-multibyte \
            --enable-rubyinterp=yes \
            --enable-pythoninterp=yes \
            --with-python-config-dir=/usr/lib/python2.7/config \ 
            --enable-python3interp=yes \
            --with-python3-config-dir=/usr/lib/python3.5/config \
            --enable-perlinterp=yes \
            --enable-luainterp=yes \
            --enable-gui=gtk2 \
            --enable-cscope \
            --prefix=/usr/local

# 如果是vim8的话,需要这一句,注意你的未必是vim82,你的版本可能更新
make VIMRUNTIMEDIR=/usr/local/share/vim/vim82
sudo make install

这里需要注意的是:对于debian系统来说,是不能同时支持python2和python3的。所以上面的配置项中,--enable-pythoninterp--enable-python3interp只能开启一个。同时需要注意的是把配置路径替换为自己系统中的。

另外/usr/lib/python2.7/config这个目录默认是没有的,要安装前边提到的python3.5-devpython-dev才有的,而且目录名字也不是config,而是类似config-3.5m-x86_64-linux-gnu这样的,具体以你的系统的为准。

以上适用于其他debian系的系统,比如ubuntu。

安装完成之后,再次测试是否生效:

vim --version | grep +python

确定了vim支持python后,我们往vim配置文件.vimrc里加一句配置即可在vim中使用powerline:

set rtp+=/usr/local/powerline/powerline/bindings/vim

注意这个路径不用死记,你只要记得前面下载下来的powerline里面还有一个叫powerline的文件夹,然后powerline文件夹里又有一个叫bindings的文件夹(绑定的意思),我们要加载的东西,全部在这里面呢,看,除了vim和zsh,还有很多其他的:

Xnip2019-01-27_17-12-56.jpg

注意我们用的时候只要写到bindings下的某个目录即可,比如vim目录。

但这样还没完,你这样加,还是看不到vim有什么变化,还需要在刚刚那句后面加这个配置:

set laststatus=2

添加完全后,保存退出,然后用vim随便打开一个文件,就能看到vim的状态栏了:

Xnip2019-01-27_17-17-41.jpg

注:vim还有另一个插件叫vim-airline,与powerline类似但功能更强大。

五、使用iTerm2预设配色(Mac专用)

注意:这个调色不一定要做,只是个性化设置,你喜欢那些颜色就设置,不喜欢就不设置(保持默认纯黑色)。

下载并解压iTerm2预设配色(主要用于改变iTerm2的文字和背景颜色等,当然你也可以自己调):https://iterm2colorschemes.com

打开iTerm2,按cmd+i打开首选项,点击ColorsColor Presetsimport,然后进入刚刚解压好的文件夹中的schemes文件夹,全选,导入,然后你就可以再次点Color Presets→选择你喜欢的配色。
Xnip2018-11-08_14-19-01.png

最终我只在vim中使用了powerline,而没有在zsh中使用powerline(当然powerline字体是必须装的),而是使用了自已修改过的agnoster主题,因为powerline也只有一种风格,而我又不知道怎么自定义。

ScreenFlow12.gif

六、安装zsh-syntax-highlighting

安装 zsh-syntax-highlighting 后可以区分命令是否存在,敲命令的时候,存在的命令会显示绿色,不存在的命令会显示红色,这样很方便区分:
syntax-highlighting_optimized.gif

zsh-syntax-highlighting github地址:zsh-syntax-highlighting

zsh-syntax-highlightingclone下来放到~/.oh-my-zsh/custom/plugins/中,或者直接用下面这句写好的,执行这句就直接clone到~/.oh-my-zsh/custom/plugins/中了。

git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

这里解释一下${ZSH_CUSTOM:-~/.oh-my-zsh/custom},这个可以简化成${var:-string},分割一下分别是:${}var:-(减号,另有+号用法)、string,var是变量,-(减号)代表当var为空时,用string替换整个${var:-string},否则用var的值替换整个${var:-string},当减号改为加号,即${var:+string}时,则反过来,+代表var不为空时,用sring替换整个${var:+string},如果var为空时,则用var替换整个${var:+string},也就意味着这么写,如果var为空,那么就代表整个${var:+string}为空。现在我们套入,var即为ZSH_CUSTOM,string为~/.oh-my-zsh/custom,则意味着如果ZSH_CUSTOM不为空,那么整个${ZSH_CUSTOM:-~/.oh-my-zsh/custom}就是ZSH_CUSTOM的值,否则如果ZSH_CUSTOM为空,那么整个${ZSH_CUSTOM:-~/.oh-my-zsh/custom}的值为~/.oh-my-zsh/custom,更多请参考:shell中的括号(小括号,中括号,大括号)

然后在~/.zshrc中的plugins里添加一下(每个插件名之间用空格隔开):

plugins=(
  git zsh-syntax-highlighting
)

退出重新进,或者新开一个tab重新进即有效果。它的效果主要表现在,如果一个命令没有的话它是红色的,有的话会变绿色,另外它会有个下划线,目前就知道这个效果。

七、安装zsh-autosuggestions

先来看看安装zsh-autosuggestions后的效果:
zsh-autosuggestions demo.gif

安装方法与安装zsh-syntax-highlighting完全一样,只不过插件名字不同而已。

先从github上下载到/.oh-my-zsh/custom/plugins目录中(这就是所谓的“安装”):

git clone https://github.com/zsh-users/zsh-autosuggestions.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

然后在你的~/.zshrrc文件的plugins中,添加一个zsh-autosuggestions即可(与原来的项用空格隔开):

plugins=(
  git zsh-syntax-highlighting zsh-autosuggestions
)

最后读取一下新修改的.zshrc文件:

source ~/.zshrc

安装后,在你打命令的前几个字母后,即可以灰色(或其它颜色)自动显示该命令可能是哪个命令,如果你认为显示出来的是你想要的,那么你可以直接按方向键直接采用。自动提示,基本上是根据你输入过的历史来提示的。

注意1:自动提示并非“自动输入”(虽然看起来像是已经输入了),所以你必须按右方向键才能自动输入提示的内容。

注意2:可以echo $TERM看看输出的是否为xterm-256color,如果不是,那请运行以下语句,该语句会在~/.zshrc中添加一句export TERM=xterm-256color

echo "export TERM=xterm-256color" >> ~/.zshrc   #声明终端类型

另外,刚才说到,自动提示的颜色是灰色或其它颜色,以下是设置提示颜色为灰色的命令:

echo "ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=247'" >> ~/.zshrc #设置建议命令的文字颜色

fg=后面的数字就代表颜色值,至于什么数字代表什么颜色,请查看下表(每个格子左下角的三位数字就是颜色值,前面的0可以不写):
Xterm_256color_chart.svg

最后,别忘了读取一下修改后的.zshrc文件才会让配置生效:

source ~/.zshrc

八、zsh安装autojump支持

autojump可用于快速跳转到某个常用的目录:
autojump-demo_optimized.gif
这样,对于常用的又特别深的目录,只需要简单的敲几个字母即可直接跳转过去,减少了很多不必要的输入。

安装autojump

对于macOS:

brew install autojump

CentOS:

sudo yum -y install autojump

Debian/Ubuntu:

sudo apt-get install autojump

如果Linux无法用yum/apt安装autojump,请手动下载安装(下载到家目录即可):

#国内服务器从gitee中下载
git clone https://gitee.com/mirror-github/autojump.git ~

#国外服务器从github中下载
git clone https://github.com/wting/autojump.git ~

#进入下载好的autojump目录
cd ~/autojump/

#运行安装(因为是python的,所以要先安装python)
./install.py

配置zsh支持autojump

ohmyzsh有一个autojump的插件:

~/.oh-my-zsh/plugins/autojump/autojump.plugin.zsh

要配置zsh支持autojump,我们只需要启用这个插件即可,在.zshrc的plugins里加上autojump就行(多个插件空格隔开):

plugins=(
  git zsh-syntax-highlighting zsh-autosuggestions autojump
)

然后,对于macOS,直接source一下~/.zshrc即可:

source ~/.zshrc

但对于centos(其他linux应该也一样),则还需要安装autojump-zsh(如果你前面是手动安装的autojump,则不用这一步,因为手动安装它会自动执行这一步):

sudo yum -y install autojump-zsh
#国内服务器yum安装可能失败,如果安装失败,就用这个命令
curl -fsSL https://gitee.com/mirror-github/autojump/raw/master/bin/autojump.zsh > /usr/share/autojump/autojump.zsh

然后再source:

source ~/.zshrc

centos安装的autojump-zsh,实际上是往/usr/share/autojump目录中增加了一个autojump.zsh文件,在Linux中该目录默认只有autojump.bash,这是bash用的,不适合zsh,所以我们才需要安装适合zsh用的“autojump-zsh”。

zsh加载autojump的顺序

  1. .zshrc加载了source $ZSH/oh-my-zsh.sh
  2. $ZSH/oh-my-zsh.sh加载了autojump的zsh插件:
~/.oh-my-zsh/plugins/autojump/autojump.plugin.zsh
  1. Linux:autojump.plugin.zsh加载了/etc/profile.d/autojump.sh
    Mac:autojump.plugin.zsh加载了/usr/local/etc/autojump.sh
  2. Linux:autojump.sh加载了/usr/share/autojump/autojump.zsh
    Mac:autojump.sh加载了/usr/local/Cellar/autojump/22.5.1/share/autojump
  3. autojump.zsh调用了系统中的autojump命令,并且autojump.zsh中有一个叫j()的函数,正是因为有这个函数,所以我们在使用autojump的时候,可以直接用j来表示,这并不需要用alias来设置。其实不止有j()函数,还有jc()/jo()/jco(),这些命令都可以在终端直接使用,至于是什么意思可以网上查查。

autojump基本用法

前面用的j命令其实就相当于autojump命令的alias,就相当于我们在~/.zshrc中设置了alias j = autojump,autojump本身是一个独立工具,与zsh和ohmyzsh都没有必然的关系,也就是说,你用bash,一样可以用autojump,也可以自己把autojump设置简写为j,只不过我们现在用了ohmyzsh,就顺便用它来使用autojump而已。

j -h:查看autojump的用法。

autojump的原理是自动存储你平时用cd命令进入过的目录,并对它们自动进行排序,用j -s可以查看当前已存储的目录(第一列数字是排序权重,从小到大排):

33.2:   /usr/local/var/mysql
44.7:   /Library
53.9:   /Users/bruce/www/personal/PicUploader
56.6:   /Users/bruce/PicUploaderHelper-macOS
57.4:   /Users/bruce/Downloads
________________________________________

2758:    total weight
191:     number of entries
57.45:   current directory weight

data:    /Users/bruce/Library/autojump/autojump.txt

j 关键字:从已存储的目录列表中搜索关键字所指定的目录(关键字不区分大小写),如果未匹配到就不会转到到任何目录,如果匹配到了多个,那就会跳转到权限最大的那个目录里。

不在autojump数据库中的目录,你可以用j -a 目录绝对路径手动添加目录到autojump数据库中。

j -i(increase)增加当前目录的权重,也可指定增加多少j -i 整数(不过我测试了这个增加步长好像并不是按指定的数字增加的,我也不知道为什么);
j -d(decrease)减小当前目录的权重,也可指定减小多少j -d 整数

j --purge 清除autojump数据库中不存在的目录(比如目录已经被你删除了)

安装zsh-abbr

我们都知道,alias命令可以定义一个命令的别名,比如

alias ll="ls -l"
alias gco="git checkout"

定义了以上别名,我们就可以用ll命令代替ls -l,用gco代替git checkout,但是这种用法有两个缺点:

  • 1、用久了别名,自己可能连原始命令都给忘了;
  • 2、如果你在博客写文章或者录视频教程发到B站等等,用这种别名命令,很多基础不好的朋友可能都看不懂为什么是这么写的。

为了解决以上两个问题,fish shell引入了abbr功能,而zsh的使用者因为看到fish有这个功能,觉得很不错,于是也开发了让zsh也支持abbr功能的插件:zsh-abbr

abbr是abbreviation(意思是“缩写”),它也类似alias能用短名称代替长名称,但不同的是,只要你敲了短名再按一下空格(或回车),它马上会把短名称还原为原始的长名称,这样即不怕自己用久了缩写忘了原始命令,也不怕写的文章和录的视频有人看不懂缩写的意思。


安装zsh-abbr:按照zsh安装自定义插件的惯例,只需要把zsh-abbr的github项目clone到oh-my-zsh自定义插件目录(~/.oh-my-zsh/custom/plugins/)

git clone https://github.com/olets/zsh-abbr.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-abbr

然后在~/.zshrc中的以下位置添加一下自定义插件目录名称

plugins=(
  git zsh-syntax-highlighting zsh-autosuggestions autojump zsh-abbr
)

最后source一下,让添加的配置生效

source ~/.zshrc

zsh-abbr常用命令

# 查看abbr命令帮助手册
abbr --help
abbr help

# 添加一个abbr,添加后直接生效,无需source载,以下两个命令等效
abbr add ll="ls -l"
abbr a ll="ls -l"

# 列出当前已设置的abbr,以下两个命令等效
abbr list
abbr

# 删除一个abbr,以下两个命令等效
abbr erase <缩写名>
abbr e <缩写名>

# 重命名一个abbr,以下两个命令等效
abbr rename <旧名> <新名>
abbr r <旧名> <新名>

其它命令请看文档:zsh-abbr v4

打赏
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

6 评论
内联反馈
查看所有评论
Dingding
2 年 前

好文!收藏了,谢谢博主分享

小栗子
小栗子
4 年 前

写得好详细啊,都是干货,good

j!n
j!n
4 年 前

帅气

6
0
希望看到您的想法,请您发表评论x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

Mac/Linux下配置iTerm2+zsh+powerline美化终端窗口