oh-my-zsh让你的终端体验起飞!

4,525 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

作为一名前端开发者,不知道大家是否都想要一个属于自己的终端,一个完全由自己定制,根据自己的需求来使用的终端?

我相信大部分人都有这样的想法的,但是每次一准备开始配置,看到那么多繁杂的配置项,就望而却步了,心想“算了算了,下次再配置吧”

不用等下次,这次就带你一次性配置完!相信只要读完本篇文章,你也能够打造出一个只属于你的终端!

1. 安装oh-my-zsh

官网推荐的安装方式

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

直接使用官网的方式安装oh-my-zsh会遇到下面的问题 image.png 这是因为linux没有翻墙导致的,要么挂代理翻墙,要么在能翻墙的主机上将curl的这个脚本下载下来,然后再传给linux执行这个脚本即可

1.1 WSL2挂代理

如果你和我一样使用的是WSL2的话,可以使用下面这种方式使用windows的代理

1. 获取windows DNS地址

WSL2会使用windows的网关作为DNS服务器的地址,设置代理的思路就是通过网关访问到windwos,然后将代理设置为windows网关上的代理软件的端口即可 通过下面这个命令可以获取到linuxDNS服务器地址

cat /etc/resolv.conf

2. 设置linux代理

linux的系统代理是通过一个环境变量 -- ALL_PROXY来配置的,上面我们已经拿到了windows的网关ip,那么接下来只需要设置一个以该ip为主机名,再拼接上代理软件开放的端口的ALL_PROXY环境变量即可

export ALL_PROXY=http://ip_addr:proxy_port

3. 编写成脚本

可以将上述过程用脚本描述出来

#!/bin/bash

hostIp=$(cat /etc/resolv.conf | grep "nameserver" | cut -f 2 -d " ")
export ALL_PROXY="http://$hostIp:10809"

关闭代理也很简单,将ALL_PROXY环境变量删除即可,也可以编写成一个脚本

#!/bin/bash

unset ALL_PROXY

4. 将脚本放到方便的地方让所有用户可以使用

将上述脚本放到/etc/proxy-utils目录下,要开启代理就执行:

source /etc/proxy-utils/start-proxy

要关闭代理则执行

source /etc/proxy-utils/stop-proxy

非常的方便!


2. 主题

安装完oh-my-zsh后就会在用户目录下生成一个.oh-my-zsh的目录,里面的themes目录就是当前已安装的主题 image.png 这么多主题却不知道它们都长啥样对吧?一个个应用后再查看又太麻烦,可以到官网主题展示查看每款主题的效果,总有一款深得你心~ 可以直接编辑用户目录下的.zshrc,配置ZSH_THEME配置项为想用的主题名,然后source ~/.zshrc即可让主题生效 如果上面这些自带主题你都不喜欢的话,还有更多主题可以使用,但是由于这些是第三方主题,所以需要额外安装使用,每款主题都会说明安装方式的,自行查看即可


3. 插件

zsh有各种各样丰富的插件,能够极大程度上提高我们的终端体验! 在.zshrc中的plugins配置插件数组即可让插件生效 用()包裹的就是数组,数组中每一个元素通过空白符分隔(如空格、tab、换行符)

3.1 vi-mode

这个插件能够让你的zsh使用起来就像在用vim一样,拥有大部分vim的特性,比如:

  • 默认是insert模式,可以按下escctrl [进入normal模式,使用h进行左移,l进行右移,使用k回到上一条命令,j回到下一条命令
  • 任何模式下ctrl p可以查看上一条命令
  • 任何模式下ctrl n可以查看下一条命令
  • /搜索历史命令
  • normal模式下输入vv可以进入vim编写当前输入的命令

其他的移动删除等操作就和vim一致了,安装该插件很简单,在.zshrcplugins数组中配置即可

光标随模式切换

刚安装完vi-mode的时候你会发现,无论进入什么模式,光标都是一个方块,不一会儿就会容易忘记自己当前是在哪个模式里(虽然可以配置命令行输入处的右边的提示符来判断,但是我个人觉得用处不大,很少会往右边看) 如果能够在normal模式下是方块光标,而insert模式下变成我们都习惯的竖线光标的话,就可以完美解决这个问题了,那么这一点能否办到呢? 肯定可以啦!只需要在.zshrc中配置如下选项

VI_MODE_RESET_PROMPT_ON_MODE_CHANGE=true
VI_MODE_SET_CURSOR=true

这样就会在normal模式下以方格显示光标,而insert模式下以竖线显示光标,能够让我们很直观地直到自己当前处于什么模式下 光标随模式切换.gif

按键映射jk回到normal模式

由于jk连续字符一般用不上,而且又很方便我们的手指按到,所以可以将jk映射成回到normal模式,修改.zshrc,添加如下配置

bindkey -M viins 'jk' vi-cmd-mode
KEYTIMEOUT=25

如果不设置KEYTIMEOUT,使用的时候会明显感觉到按下jk后会延迟一段时间才进入normal模式,将延迟设置为25即可解决


3.2 z - jump around

这个命令可以记录你的历史访问目录,当你需要跳转回历史访问过的目录的时候,直接输入z [目录名]即可,目录名不需要完整填写,可以是一部分,就像下面这样: image.png


3.3 history-substring-search

该插件能够记录你的历史命令,当你输入历史命令的前缀时,按下上下方向键可以匹配当前输入的命令为前缀的历史命令 该插件的安装方式不同于前面介绍的插件,直接在plugins数组中配置是不行的 因为它是一个custom plugin,需要被放到.oh-my-zsh目录的custom/plugins目录中 所以我们需要先将它的源码克隆到~/.oh-my-zsh/custom/plugins目录,然后再配置history-substring-search.zshrcplugins数组中即可

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

按键映射与vi-mode体验统一

默认情况下是使用上下方向键翻看历史记录,这样太不方便了,所以我们可以修改一下按键映射,让它和之前配置的vi-mode插件的使用体验统一

  • k映射到history-substring-search-up,触发该插件的上翻历史记录
  • j映射到history-substring-search-down,触发该插件的下翻历史记录
bindkey -M vicmd 'k' history-substring-search-up
bindkey -M vicmd 'j' history-substring-search-down

3.4 autosuggestions

It suggests commands as you type based on history and completions.

能够基于历史命令给你提示补全信息,由于也是一个custom plugin,所以需要额外将其源码克隆到.oh-my-zsh/custom/plugins目录下才能配置生效

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

然后到.zshrcplugins数组中加上zsh-autosuggestions即可 image.png 可以看到效果就像这样,此时按下右方向键即可补全,但是按下右方向键右手需要移动一段距离,不太方便,可以映射成ctrl space来完成补全 修改.zshrc

bindkey '^ ' autosuggest-accept

3.5 zsh-syntax-highlighting

这个插件能够让你在执行命令之前就直到当前命令是否有可能报错,比如命令不存在时,输入完该命令还没按下回车就会看到它是红色高亮显示的,而如果命令存在则会以绿色高亮显示 同样,它也是一个custom plugin,所以老套路了

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

然后将zsh-syntax-highlighting添加到plugins数组中即可 image.png 可以看到现在有高亮提示了


3.6 dirhistory

从名字就可以看出来,这个插件能够记录我们的访问目录历史,它最多能够保留30条历史记录 当需要查看访问目录历史的时候,输入dirs -v或者d即可 image.png 我首先进入了~家目录,又切换到了/usr,然后进入到/usr/share最后进入到/usr/share/doc 这时候按下d就可以看到它记录过的目录历史 当前我所在目录是/usr/share/doc,按下alt ←会让我回到上一条目录历史,也就是/usr/share,再按下alt ←会回到/usr依此类推 同理,当前我回到了/usr,那么按下alt →会回到/usr/share,再按下会回到/usr/share/doc 当前我在/usr/share/doc,按下alt ↑会进入到当前所在目录的父目录,也就是/usr/share 当前我在/usr/share,按下alt ↓会进入到当前目录的第一个子目录,由于我的系统的/usr/share的第一个子目录是GConf,所以按下后我会进入到/usr/share/GConf 这意味着无论你在什么目录下,你都可以扔掉**cd ..**的方式回到上一级目录了,直接**alt ↑**就可以搞定!


4. 和root用户共享zsh配置

当你花了老半天配置了半天的主题和各种插件后,突然有一天不得不进入到root用户中进行一些操作的时候,却发现进来之后,一切都是最原始的一样子,是那么的难用,那么的不习惯的时候,那得多么崩溃 因为之前配置的东西全都是在别的用户中配置的,只会对当时配置的用户生效,当你切换用户的时候,就需要重新配置了 那肯定不乐意了,折腾了老半天又要我重新折腾这不搞笑呢嘛,别急,可以通过软链接(符号链接)的方式解决这个问题 通过软链接的方式,将当前用户的.zshrc.oh-my-zsh软链接到root用户的家目录中

ln -s $HOME/.zshrc /root/.zshrc
ln -s $HOME/.oh-my-zsh /root/.oh-my-zsh

还需要在.zshrc开头写入

ZSH_DISABLE_COMPFIX="true"

这个配置项能够跳过安全检查,否则在root用户下会出现安全警告,如果担心这个安全警告会对你的系统造成什么影响的话那就老老实实重新配置一遍,或者直接把原来配置好的用户家目录下的.zshrc.oh-my-zsh赋值到root用户中