Zsh 配置笔记

!NOTE\] 笔记说明 这篇笔记主要记录了我在使用 Zsh 这款 Shell 的过程中所记录的一些心得与体会。它将会被存储在我个人的 [计算机专业笔记库](https://github.com/owlman/CS_Studynotes) 中,以便日后查阅。

Zsh 简介

Z shell(以下简称 Zsh)是保罗·弗斯塔德(Paul Falstad)于 1990 年在普林斯顿大学求学时编写的、一款可用作交互式登录的 Shell。Zsh 对 Bourne shell做出了大量改进,同时加入了 Bashkshtcsh 的某些功能。

2019 年,由于新版本的 Bash v5 将开源授权改成了 GPLv3 协议,而 Apple 公司一贯避免在系统组件中引入 GPLv3 软件。于是自从那时起,macOS 系统上的预置 Shell 就已从 Bash 改为了 Zsh。另外,Kali Linux 也使用 Zsh 作为预置 Shell。其主要特性包括:

  • 提供可编程的命令行补全功能,该功能可帮助用户键入常用命令选项及参数;
  • 提供可编程的命令行界面,包括将提示行信息显示在屏幕右侧,以及自动隐藏过长指令等功能;
  • 提供可与任意 Shell 共享的命令行历史记录;
  • 可在不借助外部程序的情况下实现文件的查找;
  • 改进了针对变量/数组的处理方式;
  • 允许在单缓冲区内编辑多行命令;
  • 支持针对命令的拼写检查;
  • 支持多种兼容模式(例如,Zsh 可在运行为/bin/sh的情况下伪装成 Bourne shell)
  • 支持以加载模块的方式引入额外的功能,包括支持 Unix 域套接字控制、FTP 客户端等;
  • 提供有where命令,该命令的使用方法与which命令类似,但返回的是指定指令在$PATH中的全部位置,而不是它当前最优先匹配的位置;
  • 允许用户为指定目录设置别名,例如,用户可以为/usr/bin设置别名/u,这样在输入/u时,Zsh 会自动将其替换为/usr/bin

安装步骤

在安装之前,我希望读者确定自己是在类 UNIX 系统下,因为 Zsh 是在类 UNIX 系统下运行的 Shell 程序,如果您使用的是 Windows 系统,推荐使用 Windows Subsystem for Linux(WSL)。下面书归正传,Zsh 在每个操作系统中的安装方式并不完全相同,下面是其在几种常见 Linux/UNIX 系统下的安装命令:

bash 复制代码
# macOS 系统下的安装命令:
brew install zsh

# ubuntu/debian 系统下的安装命令:
sudo apt install zsh

# CentOS 系统下的安装命令:
sudo yum install zsh

# ArchLinux/Manjaro 系统下的安装命令:
sudo pacman -S zsh

如果您使用的是上述操作系统之一,在执行完相应的安装命令之后,就可以使用cat /etc/shells命令查看当前系统可以用的 Shell 了。然后,只要在该命令返回的结果中看到/bin/zsh,就说明 Zsh 已经安装好了,如图 1 所示。

图 1:当前可用的 Shell

接下来,我们可以使用chsh -s /bin/zsh命令将 Zsh 设置为系统默认 Shell 了。如果到目前为止的操作一切顺利,现在只需要重新启动一个 Shell 会话(通常是一个命令行终端窗口),就会看到 Zsh 的初始配置了,如图 2 所示。

图 2:Zsh 的配置引导界面

在上述界面中,如果我们输入q会直接退出配置引导,下一次运行 zsh 时会再次进入配置引导。如果输入0,也会退出配置引导,但是会在当前用户目录生成一个空白的文件.zshrc(路径为~/.zshrc),并且不会再进入配置引导界面。换言之,Zsh 会不会在启动时进入配置引导界面取决于当前用户目录下是否存在.zshrc文件,该文件是 Zsh 的默认配置文件,人们可以使用 vim 编辑器打开它并进行源码级别的手动配置。而如果我们在这里输入1,就会开始进行一系列自定义的配置。但通常情况下,考虑到.zshrc文件中各项配置的复杂性,我们在这里并不推荐读者直接进行手动配置,使用 Oh-My-Zsh 来进行配置会是更好的选择。

Oh-My-Zsh

Oh-My-Zsh 是一款 Zsh 的配置管理工具,它提供了丰富的主题和插件,可以极大地美化命令行界面,并提高工作效率。我们需要这项工具的原因在于:原生的 Zsh 虽然很强大,但存在着以下几个配置成本方面的问题:

  • 稍复杂的配置就需要使用编码的方式修改.zshrc文件;
  • 命令的自动补全和提示需要手动调教;
  • 引入第三方主题与插件的相关配置就更为复杂了。

而 Oh-My-Zsh 的作用就是把这些复杂的配置一次性打包好,确保开箱即用,它相对于 Bash、原生 Zsh 的优势如表 1 所示:

项目 Bash 原生 Zsh Oh My Zsh
自动补全 基础 非常强
配置难度
插件系统
主题 基本无 大量现成
上手速度 最快

表 1:Bash、原生 Zsh 与 Oh My Zsh 的对比

在了解 Oh-My-Zsh 的基本信息以及所能发挥的功能之后,我们现在就来演示一下它的安装步骤:

  • 在安装 Oh-My-Zsh 之前,需要确保本地已经安装了 Git,关于 Git 的安装与配置步骤,读者可参考我在《[[Git 使用笔记]]》中的记录;

  • 打开 Zsh 终端窗口,并在用户目录下使用 curl 或 wget 命令下载 Oh-My-Zsh 的安装脚本,并执行它:

    bash 复制代码
    # 使用 curl 下载脚本并安装:
    sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
    
    # 使用 wget 下载脚本并安装:
    sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
  • 在执行上述命令过程中,我们需要同意 Oh-My-Zsh 使用自身的配置模板覆盖已有的.zshrc文件,如图 3 所示(由于我已完成配置,不便截图,此处引用来自网络的截图):

    图 3:Oh-My-Zsh 的安装过程

待安装顺利完成之后,用户的home目录下会出现一个名为.oh-my-zsh的目录,该目录中存储的就是 Oh-My-Zsh 框架本身,及其主题和插件的实现代码。下面,我们从功能插件、外观配置与快捷命令三个方面来介绍基于 Oh-My-Zsh 配置 Zsh 的主要方法。

功能插件

Oh-My-Zsh 的核心竞争力主要来自于它所提供的那套极具开放性的,高度可定制的插件系统,这让我们可以根据自己的喜好进行选择和配置,打造一个富有个性的命令行终端界面。下面是我个人常用的一些插件及其相关介绍:

插件 功能 使用说明
z 可实现智能目录跳转。 z <目录名> (该目录需历史记录中出现过)
git 可用gagc等快捷命令。 gc -m "commit message"
extract 提供x压缩包解压命令。 x file_name.tar.gz
web-search 可实现网页搜索。 google <搜索内容>baidu <搜索内容>
you-should-use 命令行错误提示功能。 在命令输入错误时,会给出正确的命令提示。
zsh-completions 命令行自动补齐功能。 在输入命令时按Tab键会自动补齐。
zsh-autosuggestions 命令行自动提示功能。 在输入命令时会自动给出提示。
zsh-syntax-highlighting 命令行语法高亮功能。 在输入命令时会根据语法高亮。

在 Oh-My-Zsh 中安装和启用插件通常可按照以下三个步骤来进行(如果是自带插件,则可跳过第一步):

  1. 如果我们要启用的不是 Oh-My-Zsh 的内置插件,那该插件通常会在 Github 上有独立的仓库,人们需要先使用git clone命令将其下载到 Oh-My-Zsh 安装目录下的custom/plugins目录中(而内置插件则已存在于 Oh-My-Zsh 安装目录下的plugins目录中,无需下载),例如,我们现在要启用的是zsh-autosuggestions插件,这是一个第三方插件,这就需要先执行以下命令,将其下载到 Oh-My-Zsh 安装目录下的custom/plugins目录中:

    bash 复制代码
    git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
  2. 使用 vim 这样的文本编辑器打开.zshrc文件,并在其中找到plugins字段,并将要启用的插件名称添加到该字段中(该字段的值是一个用空白符分隔的字符串),例如,如果我们现在要启用的插件包括zgitextractweb-searchyou-should-usezsh-completionszsh-autosuggestionszsh-syntax-highlighting,那么.zshrc文件中plugins字段的值就该被设置如下:

    bash 复制代码
    plugins=(
        z 
        git
        extract
        web-search
        you-should-use 
        zsh-completions 
        zsh-autosuggestions 
        zsh-syntax-highlighting 
        zsh-history-substring-search
    )
  3. 保存并关闭.zshrc文件,然后执行source ~/.zshrcomz reload命令使配置生效。例如,图 4 所示的是启用extract插件之后,使用x命令解压文件的效果:

    图 4:extract 插件的效果

外观配置

在 Oh-My-Zsh 中,我们可以通过一种被称之为"主题"的特殊插件来配置 Zsh 界面所呈现的外观,目的是通过各种特定的颜色和提示信息让命令行界面的易用性和美观性达到一个平衡。Oh-My-Zsh 内置了大量的主题,它们都被存放在 Oh-My-Zsh 安装目录下的themes目录中(也可以前往 Oh-My-Zsh 官方文档查看),如图 5 所示:

图 5:Oh-My-Zsh 内置的主题

如果我们想启用上述任意一个 Oh-My-Zsh 的内置主题,就只需将.zshrc文件中的ZSH_THEME变量值修改为该主题的名称即可,例如,假设现在要启用的是agnoster主题,我们就只需要执行以下步骤:

  • 先使用 vim 这样的文本编辑器打开.zshrc文件;

  • 找到ZSH_THEME变量,并将它的值设置如下即可:

    bash 复制代码
    ZSH_THEME="agnoster" # 默认主题为 robbyrussell
  • 保存并关闭.zshrc文件,然后执行source ~/.zshrc命令使配置生效,其效果如图 6 所示:

    图 6:agnoster 主题的效果

当然,除了上述内置主题之外,我们还可以选择安装其他开源的主题,例如,powerlevel10k就是一个非常受欢迎的,功能强大的主题,它提供了丰富的配置选项,可以让我们打造出各种个性化的命令行界面,其安装与配置步骤如下:

  1. 使用git clone命令将主题下载到 Oh-My-Zsh 安装目录下的custom/themes目录中:

    bash 复制代码
    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
  2. 使用 vim 这样的文本编辑器打开.zshrc文件,并在其中找到ZSH_THEME变量,并将它的值设置为我们刚刚下载的主题名称即可:

    bash 复制代码
    ZSH_THEME="powerlevel10k/powerlevel10k"
  3. 保存并关闭.zshrc文件,然后执行source ~/.zshrcomz reload命令使配置生效。在该主题配置首次生效时会启动一个配置向导(之后也可以通过执行p10k configure命令来启动该向导),引导我们完成主题的配置,如图 7 所示:

    图 7:powerlevel10k 主题的配置向导

  4. 接下来,我们只需要根据上述配置向导的提示,按照自己的喜欢一步一步地做出选择,就可以完成主题的配置,我个人的配置效果如图 8 所示:

    图 8:powerlevel10k 主题的配置效果

快捷命令

对于类似于进入某个特定工作目录的常用命令,Zsh 提供了一种被称为 alias 的机制,让我们可以为其设置一个快捷命令。例如,~/working/notes目录是我们每次写笔记时要打开的目录,如果我们想使用 Zsh 的 alias 机制为cd ~/working/notes命令设置一个快捷命令,就可以使用 vim 编辑器打开在.zshrc文件,并在其中恰当的位置上添加如下配置:

bash 复制代码
alias cd-notes="cd ~/working/notes"

配置完成后,我们就可以使用cd-notes这个快捷命令命令来执行进入~/working/notes目录了。当然,除了手动配置的 Zsh alias 之外,在安装了Oh-My-Zsh 之后,我们还可以使用该框架所内置的一系列常用的 alias。例如在启用了git插件之后,我们就可以使用它提供的 alias 来执行 git 相关操作了,具体命令列表可查阅 Oh-My-Zsh 官方提供的 git 插件文档

相关推荐
課代表2 天前
API 与 SDK:概念、关系与应用
microsoft·接口·api·sdk·开发工具·模块化·开放式
yinmaisoft2 天前
JNPF 权限管理 yyds!菜单 / 流程 / 打印权限一键配,层级授权不头疼
前端·人工智能·低代码·开发工具
Tiam-20162 天前
开发办公工具
git·编辑器·开发工具·敏捷开发
XLYcmy4 天前
高级密码猜测生成器AdvancedPasswordGenerator密码生成器程序详细分析
开发语言·python·算法·网络安全·开发工具·源代码·口令安全
卜锦元9 天前
nvm常用命令(nodejs)
macos·编辑器·nodejs·开发工具
leo_23212 天前
需求&需求书--SMP(软件制作平台)语言基础知识之十五
开发工具·需求·smp(软件制作平台)·应用系统
Aevget14 天前
「Java EE开发指南」如何在MyEclipse中开发EJB 2 Session Bean?(三)
java·ide·java-ee·开发工具·myeclipse
leo_23214 天前
从开发语言角度来谈谈SMP(中)--SMP(软件制作平台)语言基础知识之十三
开发语言·开发工具·smp(软件制作平台)·应用系统