发布于 2026-01-06 2 阅读
0

自定义你的 shell 自定义你的 shell 由 Mux 呈现的 DEV 全球展示挑战赛:展示你的项目!

定制你的外壳

定制你的外壳

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

原文发布于我的博客

本文是 Balthazar Rouberol 和Etienne Brodu (他们曾是室友、朋友和同事)自出版书籍项目的一部分,旨在赋能新一代开发者。我们目前正在努力完成这个项目!

如果您对本项目感兴趣,欢迎加入邮件列表

目录

定制你的外壳

程序员们常常会
花费数小时调整和定制终端和 shell,添加或编写新的插件,这一切都是为了追求
“完美环境”并提高工作效率。而另一些人则恰恰相反
,他们完全避免调整 shell,以确保
在每台机器上都能获得相同的体验。

就我个人而言,我倾向于尽可能地使用个性化的操作系统外壳
。我觉得现在不同电脑之间的文件共享
问题已经很普遍了,而且个性化工作环境带来的好处实在太大,所以我很乐意付出 在电脑之间同步配置这点
小小的代价。

在本章中,我们将深入了解 shell 以及如何配置
终端环境以使其更符合您需求。请注意,
部分建议仅代表个人喜好,可能并不
适用于您。我们鼓励您自行探索并找到最
适合自己的方法,但我们希望至少能为您指明正确的方向。

我应该使用哪个终端?

首先,如果您是终端新手,可能还没
意识到终端程序有很多种。macOS 预装了
Terminal,大多数 Linux 发行版预装
了 xterm、Gnome-terminal 或 Konsole,此外还有大量
其他终端程序可供选择。


我认为在选择“合适”的终端应用程序方面,并没有一个绝对正确且毋庸置疑的答案。
你问不同的人,可能会得到不同的答案。话虽如此,我至少可以分享一下
我个人的推荐和偏好。


无论你最终使用哪个终端,我认为根据自己的喜好和偏好进行配置都至关重要。作为一名程序员,你
可能会花费大量时间在终端上,为了让你
感到高效且充满掌控感,终端必须能够满足你的需求

终结者

如果你使用的是 Linux 系统,我个人更喜欢 Terminator 1而不是
默认选项。它有几个我觉得很有用的功能:

  • 标签页系统,允许您在同一个窗口中打开多个终端标签页
  • 网格系统,允许您在同一标签页中拥有多个终端。

我可以在同一个标​​签页的多个窗格中工作,每个项目也可以使用一个标签页。
我可以在同一个标​​签页的多个窗格中工作,每个项目也可以使用一个标签页。

以下是我认为最有用的终结技快捷键:

捷径 行动
Ctrl——ShiftE 将屏幕垂直分割
Ctrl——ShiftO 水平分割屏幕
Ctrl——ShiftT 打开新标签页
Ctrl-PageUp 切换到下一个标签页
Ctrl-PageDown 切换到上一个标签页
Ctrl-N 打开新窗口
Ctrl——Shift+ 放大
Ctrl——Shift- 缩小
Ctrl-D 关闭当前终端

iTerm2

就 macOS 而言,我觉得默认终端(就叫
Terminal)很难用。macOS
编程社区普遍接受的终端是 iTerm2 2。它不仅具备上面提到的所有
功能,还有更多(真的很多)其他功能!

iTerm2 的外观与 Terminator 类似,但功能要强大得多。
iTerm2 的外观与 Terminator 类似,但功能要强大得多。

我觉得 iTerm2 最实用的键盘快捷键是:

捷径 行动
Cmd-D 将屏幕垂直分割
Cmd——ShiftD 水平分割屏幕
Cmd-T 打开新标签页
Cmd——Shift+ 放大
Cmd——Shift- 缩小
Cmd-N 打开新窗口
Cmd-D 关闭当前终端

以下章节将介绍一些我个人
觉得方便的非默认 iTerm2 设置。再次强调,这些只是我的个人偏好,并非
强制性要求。您可以根据自己的需要随意忽略它们。

打开文件快捷方式

iTerm2 的一个我很喜欢的功能是,只需
Cmd按住鼠标左键并点击文件路径或 URL,即可
使用默认的关联程序打开资源。例如,它会
在浏览器中打开 URL,用预览程序打开本地 PDF 文件,
用你常用的文本编辑器打开文本文件等等。

启用此功能后,您将能够通过终端使用图形应用程序打开文件。
启用此功能后,您将能够通过终端使用图形应用程序打开文件。

新终端位置直观。


我对 iTerm2 做的另一个调整是更改了新终端默认打开的工作目录。我想要的是……

  • 在我的主目录中打开一个新的终端窗口
  • 在我的主目录中打开一个新的终端标签页
  • 在上一个会话的目录中打开一个新的终端分屏窗口


我这样做是因为我经常发现,当我想在同一个项目中运行多个命令时,需要拆分当前选项卡,而每次拆分窗格时,我都必须进入项目目录
cd

通过这些设置,我减少了使用 `cd` 和 `endraw` 命令进入项目目录所花费的时间。首选项 > 配置文件 > 常规 > 工作目录 > 高级配置 > 编辑
通过这些设置,我减少了进入项目目录所花费的时间cd。首选项 > 配置文件 > 常规 > 工作目录 > 高级配置 > 编辑

我应该使用哪种字体?

使用自己喜欢的字体至关重要。如果你经常
在终端上阅读和写作,那么最好使用一种让
你感觉舒适的字体。

我个人非常喜欢 Fira Code 3字体,无论是在文本编辑器
还是终端中。它不仅看起来赏心悦目,还
包含一系列连字,可以将多个字符组合在一起,
例如将“ !&”和“& =”合并为一个字符,从而让您更轻松地阅读
代码和解码符号。

渲染字符连字示例
渲染字符连字示例

请注意,并非所有终端都支持带连字的字体。例如,
iTerm2 支持,但 Terminator 不支持。

注:虽然我个人偏爱 Fira Code 字体,但还有其他一些设计精良
、包含连字功能的字体,例如 JetBrains Mono。4

我应该用哪个外壳?

我们之前已经暗示过:bash它并非唯一的 shell。
您可以自由使用其他 shell,例如zshfish
nushell等等。就像终端一样,“好”的终端
实际上​​取决于您对“好”的定义。如果您非常在意
在每台机器上使用相同的 shell,那么bash可能
适合您。它自 1989 年以来一直存在,稳定、成熟,并且是几乎所有
UNIX 系统的 默认 shell

在撰写本书的过程中,我惊讶地发现, Z-shell zsh(或者说它
本身)并非“末代”产品,它
早在1990年就已发布,仅仅比第一个稳定版的bash晚一年!
你可以期待它在稳定性、成熟度甚至语法方面(很大程度上
,除了配置方面)与bash不相上下。

我个人认为,zsh它最大的亮点在于提供了强大的默认
自动补全体验以及更多配置选项。由于它与的语法
zsh兼容,我建议您尝试使用 它们,直到您觉得其中一个用起来更顺手为止。bash

fish6 shell进行了彻底的变革bashzsh
提供了一种不兼容但“简单明了”的语法、一个极其
强大的命令建议系统和一个交互式配置
向导。

如果你刚开始使用 shell,我个人
建议你坚持使用bashor zsh,等你更有信心后再尝试其他
shell,看看它们能带来什么价值。

更改默认 shell

chsh`change shell` (代表change shell )命令允许您更改
默认 shell。

例如

# Switching to bash by default
$ chsh -s /bin/bash
Enter fullscreen mode Exit fullscreen mode
# Switching to zsh by default
$ chsh -s /bin/zsh
Enter fullscreen mode Exit fullscreen mode

运行此命令后chsh,您打开的任何新终端窗口都将运行您的
新默认 shell。

配置你的 shell

到目前为止,我们看到的每个示例都是
直接在 shell 中定义环境变量、别名和函数。但是,如果我们
关闭该 shell,所有这些更改都会被撤销,
下次打开新 shell 时就必须重新开始。幸运的是,所有
这些设置都可以保存在配置文件中。将
别名、环境变量和函数添加到该文件中,可以确保
每次打开新 shell 时它们都会被导入。

这些文件通常位于您的主目录中,并以
.bashrcbash 和.zshrczsh 命名。

$ cat ~/.zshrc
export EDITOR=vim
export PATH=$HOME/bin

alias ls='ls -G'
alias ..='cd ..'
alias ...='cd ../..'
alias filesize='ls --size --human-readable -1'

function mkcd {
    local target=$1
    mkdir -p $target
    cd $target
}
Enter fullscreen mode Exit fullscreen mode

在向 shell 配置文件添加任何内容后,您需要运行`shell install`
source ~/.zshrc(或 ` source ~/.bashrcshell install`,具体取决于您使用的 shell)。
source内置命令 `shell install` 会读取并执行
当前 shell 环境中指定参数文件中的命令。换句话说,运行 `shell install`
source ~/.<file>会使 shell 重新加载其配置。

`--run` rc代表运行命令。实际上,当你source运行
配置文件时,你会运行其中包含的命令。`--run` 的微妙之处
在于,它会在当前sourceshell中执行参数脚本,这意味着任何通过 `--source` 执行的命令都会对 当前运行的 shell产生副作用。

如果你总是记不住某个命令的选项,或者总是
需要输入一组命令,我建议你
在 shell 配置文件中定义别名和函数。它们能让
你每天都感觉效率更高,尤其是在别名
和工具能够抽象化复杂命令的情况下。

注:上一章结尾给出了一些别名和函数的实际示例
。您可以随意将它们添加到您的 shell 配置文件中。

配置您的提示符

配置提示符
是 让 shell 尽可能为你服务的一个很好的方法,它
可以为你提供有用的上下文信息,例如时间、上
一个命令是否成功、当前工作目录……虽然它们可以为你提供上下文和信息,但当 你复制粘贴命令及其相关输出时,
这些上下文信息也会传递给任何人。

配置提示符是通过更改环境变量的值来完成的PS1

$ export PS1="MY COOL PROMPT $"
MY COOL PROMPT $
Enter fullscreen mode Exit fullscreen mode

我想我们都同意,MY COOL PROMPT目前的提示信息不够详尽
,所以我们来修改一下,让提示符发挥作用。由于和 的提示符
配置略有不同,我们将 分两部分分别讨论这两种情况。bashzsh

配置你的 bash 提示符

环境PS1变量可以通过混合使用
常规字符和特殊字符来定义。常规字符会直接
显示,而反斜杠转义的特殊字符则会在显示
时由 bash 解析并替换为 对应的值。最常用的特殊字符定义如下PS1

特点 意义
\h 主机名直到第一个点为止
\t 当前时间,采用 24 小时制 HH:MM:SS 格式。
\u 当前用户的用户名
\w 当前工作目录($HOME渲染为~
\W 当前工作目录的基本名称($HOME渲染为~
\n 新行

每次显示提示时都会对这些特殊字符进行评估,以确保您始终获得最新的上下文。

注意:PROMPTING本手册的这一部分包含了 反斜杠转义的特殊字符bash的完整列表。

示例

$ export PS1='\u@\h \W $'
br@morenika ~ $
Enter fullscreen mode Exit fullscreen mode
$ export PS1='[\t] \u@\h \W $'
[13:33:55] br@morenika ~ $
Enter fullscreen mode Exit fullscreen mode
$ export PS1='[\t \u@\h:\w]\n>>> '
[13:57:55 br@morenika:~/code]
>>>
Enter fullscreen mode Exit fullscreen mode

注意:您可以使用 ezprompt 7等在线工具来尝试不同的
配置,直到找到您喜欢的配置为止。

最终PS1确定的值应该保存并导出到
配置.bashrc文件中。

配置 zsh 提示符

zshbash与提示符配置相比,它提供了更多选项
。两者都PS1可以PROMPT设置环境变量
以达到相同的效果,如果您觉得这种方式PROMPT更明确的话。

zsh 的特殊字符不使用反斜杠转义,而是
以逗号 (,) 开头%,称为提示序列。最常用的提示序列
详见此处。

顺序 意义
%m 主机名直到第一个点为止
%* 当前时间,采用 24 小时制 HH:MM:SS 格式。
%n 当前用户的用户名
%~ 当前工作目录($HOME渲染为~
%1~ 当前工作目录的基本名称($HOME渲染为~
%? 最后执行的命令的退出状态
%% A%
$'\n' 新行
%B (%b) 开始(停止)粗体字体模式
%F (%f) 如果终端支持,则使用指定的前景色开始(或停止)

注意:
您可以在 zsh 文档8中找到完整的提示序列列表

示例

$ export PROMPT='%n@%m %~ $ '
br@morenika ~/code $
Enter fullscreen mode Exit fullscreen mode
$ export PROMPT='[%*] %n@%m %~ $ '
[23:38] br@morenika ~/code $
Enter fullscreen mode Exit fullscreen mode
$ export PROMPT="[%* %n@%m %~]"$'\n'">>> "
[23:41 br@morenika ~/code/izk]
>>>
Enter fullscreen mode Exit fullscreen mode
$ export PROMPT="[%* %n@%m %1~]"$'\n'"%% "
[23:41 br@morenika izk]
%
Enter fullscreen mode Exit fullscreen mode

zsh它更进一步,允许您通过环境变量定义
右侧提示符的内容, 其语法与.RPROMPT
PROMPT

例子

$ export PROMPT='%~ $ '; export RPROMPT='%*'
~/code $                                              21:04:00
Enter fullscreen mode Exit fullscreen mode

注意:为确保您的更改能够持久保存,PROMPT应将RPROMPT
导出到您的.zshrc配置文件中。

添加颜色

添加颜色是美化提示符并提供
视觉上下文的好方法。您可以使用颜色来指示您是否
以超级用户权限运行、上一个命令是成功还是
失败,或者只是以不同的方式为提示符的每个部分
(用户名、主机名等)着色,使其更易于
理解。

为你的 bash 提示符添加颜色

Bash 允许您使用 3 位 ANSI 9代码来设置提示符元素的样式,这些
代码定义了与潜在效果关联的区域、前景色
和背景色。

每种效果、背景色或前景色都有一个对应的代码,
如下表所示。这些参数的组合
称为“选择图形渲染”
它以分号 (;) 分隔的代码列表形式给出。

影响 ANSI 代码
普通的 0
大胆的 1
头晕的 2
斜体 3
强调 4
划掉 9
背景颜色 ANSI 代码
红色的 41
绿色的 42
棕色的 43
蓝色的 44
紫色的 45
青色 46
白色的 47
亮黑色 100
鲜红色 101
亮绿色 102
亮棕色 103
亮蓝色 104
亮紫色 105
亮青色 106
亮白色 107
前景色 ANSI 代码
黑色的 30
红色的 31
绿色的 32
棕色的 33
蓝色的 34
紫色的 35
青色 36
白色的 37
亮黑色 90
鲜红色 91
亮绿色 92
亮棕色 93
亮蓝色 94
亮紫色 95
亮青色 96
亮白色 97

SGR 示例

  • 蓝色文字:34
  • 粗体绿色文字:1;32
  • 白色背景上的紫色文字:35;47
  • 醒目的红色文字,亮青色背景:1;31;106
  • 绿色背景上的粗体棕色文字,带有删除线1;9;33;42

要在 bash 提示符中定义彩色区域,请使用以下
(虽然不太美观)语法:

\e[<SGR>mTEXT\e[m
Enter fullscreen mode Exit fullscreen mode

示例

$ export PS1='[\t] \u@\h \W \e[32m$\e[m '
Enter fullscreen mode Exit fullscreen mode

原始的 `$` 结束符现在以绿色显示。
现在标志$牌显示为绿色

$ export PS1='\e[31m\u\e[m@\e[32m\h\e[m \e[36m\W\e[m $ '
Enter fullscreen mode Exit fullscreen mode

用户名以红色显示,主机名以绿色显示,路径以青色显示。
用户名以红色显示,主机名以绿色显示,路径以青色显示。

色彩搭配

注意一下,ANSI 代码只对应一个颜色名称。这是因为终端
需要自行解释并将该颜色名称渲染成 实际的颜色,这意味着相同的提示符配置 在两个不同的终端上可能会呈现不同的颜色。

将 ANSI 颜色名称映射到实际的key="rgb">RGB颜色是通过所谓的 调色板完成
的。

以下是两种不同的配色方案,以及相关的渲染提示,两者都使用了与前面示例中
相同的值PS1

流行的 Solarized Dark 配色方案
流行的 Solarized Dark 配色方案

粉彩色(深色背景)配色方案
粉彩色(深色背景)配色方案

如您所见,即使底层提示符 配置完全相同,这两个提示符看起来也与上一个屏幕截图中的提示符截然不同。这意味着,即使使用 16 种颜色 可能
让人觉得有限制,但实际上您可以将这些颜色映射到任何您喜欢的颜色。ANSI 颜色系统只是限制了提示符中 最多只能使用 16 种不同的颜色。




注意,我建议您查看
mbadolato/iTerm2-Color-Schemes10项目,该项目展示了流行的调色板
,并提供了配置文件,使您可以
在许多终端应用程序中使用它们(而不仅仅是 iTerm2,尽管
它的名称暗示了这一点)。

最多可显示 256 种颜色

随着计算机最终开始配备 256 色显卡,
引入了 8 位 ANSI 代码方案,允许用户在其终端上渲染 256 种
颜色,而不是 16 种。

8 位 ANSI 代码语法中, 0 到 255 之间 的每个值\e[38;5;n对应的颜色 如下表11所示
n

8 位 ANSI 代码允许您渲染超过最初 16 种可用颜色的颜色。
8 位 ANSI 代码允许您渲染超过最初 16 种可用颜色的颜色。

示例

# Using 256-bit ANSI codes
$ TIME="[\e[38;5;33m\t\e[m]"  # blue
$ USERNAME="\e[38;5;200m\u\e[m"  # pink
$ HOSTNAME="\e[38;5;139m\h\e[m"  # purple
$ WORKDIR="\W"  # no color
$ DOLLAR="\e[38;5;41m$\e[m"  # green
$ export PS1="${TIME} ${USERNAME}@${HOSTNAME} ${PTH} ${DOLLAR} "
Enter fullscreen mode Exit fullscreen mode

这些ANSI代码确实很难辨认,但它们的颜色很漂亮。
这些ANSI代码确实很难辨认,但它们的颜色很漂亮。

注意:并非所有终端都支持 256 色,但大多数现代终端
应该都支持。目前,GNOME Terminal、Konsole、Terminator、XFCE4
Terminal、iTerm2、Terminal (macOS) 和 tmux 都支持 256 色。

与 3 位 ANSI 代码相反,8 位代码对
配色方案的变化不敏感,如下例所示,这两个示例都重复使用了key="fig:256col-prompt">上一个屏幕截图
相同的配置PS1

颜色保持不变
颜色保持不变

为 zsh 提示符添加颜色

我们在上一节中解释的所有内容仍然适用
zsh:您可以完全使用 3 位或 8 位 ANSI 颜色代码。但是,zsh
它也为您提供了一种更简单易读的颜色系统:

  • 每种颜色都可以表示为blackredgreenyellowblue或,或者0 到 255 之间的数字magentacyanwhite
  • %F{color}Text%f:将Text前景色更改为color
  • %K{color}Text%k:将Text背景颜色更改为color
  • %BText%bText:以粗体显示
  • %UText%u:下划线Text

例子

当前工作目录以蓝色显示,美元符号以粗体粉色显示。
当前工作目录以蓝色显示,美元符号以粗体粉色显示。

在提示符中显示动态数据

我们可以使提示符显示动态上下文,从而提供更多
信息。为此,我们可以将一个函数作为环境变量的一部分执行。每次 渲染提示符PS1
时,shell 都会调用该函数。

其理念是,在提示中尽可能多地包含信息
,但仅在必要时才使用。

在 bash 中显示动态数据

假设我们想将$提示符的颜色设置为:如果
上一个命令执行成功,则显示为绿色;如果执行失败,则显示为红色。我们可以将这个
逻辑封装到以下colorized_promptbash 函数中,并通过将 `--no-command` 添加 到环境变量中,使其
在每次PS1渲染提示符时都执行。$(colorized_prompt)

语法$(colorized_prompt)表示“调用colorize_prompt函数”,它将被展开为函数的输出(它打印的内容),其中将包含用于为提示符着色的 ASCII 颜色代码。

function colorized_prompt {
    if [[ $? ]]; then
        printf "\e[32m$\e[m"
    else
        printf "\e[31m$\e[m"
    fi

}
export PS1='[\t] \W $(colorized_prompt) '
Enter fullscreen mode Exit fullscreen mode

`note` $?是一个特殊的 bash 参数,它会展开显示先前执行的命令的退出状态。通常情况下,如果命令执行成功,则退出状态为 0;任何其他退出状态都表示执行错误。

$ pwd
/home/br
$ echo $?
0
$ cmdnotfound
bash: cmdnotfound: command not found
echo $?
127
Enter fullscreen mode Exit fullscreen mode

因此,该语法if [[ $? ]]; then翻译过来就是“如果上一个命令
执行成功,那么……”。

命令成功后提示符为绿色,命令失败后提示符为红色。
命令成功后提示符为绿色,命令失败后提示符为红色。

在 zsh 中显示动态数据


动态数据可以通过在渲染时执行函数的方式注入到提示符中,这与在 Bash 中的方式相同。zsh此外,它还提供了
三元条件语句,即
根据条件计算出不同值的表达式,以达到
相同的目的。三元条件语句的语法如下。

%(<condition>.<success value>.<failure value>)
Enter fullscreen mode Exit fullscreen mode

如果条件为真,则表达式的计算结果为
成功值;反之,如果条件为假,则
表达式的计算结果为失败值。

你可以把三元条件语句理解为“如果条件成立,则执行,否则执行”。这
实际上是一种常见的模式,称为三元表达式,
在许多编程语言中都会遇到。

以下是提供的实用内置条件列表zsh

健康)状况 意义
n? 如果前一个命令以退出状态n退出,则为 True。
nd 如果该月的日期等于 n,则为真。
nw 如果星期几等于 n(星期日 = 0),则为真。
! 如果 shell 以超级用户权限(作为root用户)运行,则为真。

示例

$ export PROMPT='%F{%(0?.green.red)}$ %f'
Enter fullscreen mode Exit fullscreen mode

如果上一条命令成功,则显示绿色美元符号;如果失败,则显示红色美元符号。
如果上一条命令成功,则显示绿色美元符号;如果失败,则显示红色美元符号。

$ export PROMPT='%* %1~ %(!.#.$) '
Enter fullscreen mode Exit fullscreen mode

如果您以普通用户身份运行,则显示美元符号;如果您以超级用户身份运行,则显示井号。
如果您以普通用户身份运行,则显示美元符号;如果您以超级用户身份运行,则显示井号。

注意:完整的三元条件列表可在 zsh
文档12中找到。

在提示中添加表情符号

现代终端支持非ASCII字符,例如表情符号。与
颜色一样,它们可以非常方便地以
节省空间的方式传递信息。

例如,在写作那本书的过程中,我会
在提示信息中显示总字数,以此激励自己。
不过,只有当我位于
项目根目录时,字数统计才会显示,这符合“只在必要时显示上下文”的原则

Shell配置框架

到目前为止,我们已经了解了如何通过添加颜色、
上下文和动态计算的信息来定制提示符。虽然你
当然可以花几个小时进行“完美”的自定义(相信我,我经历
过……),但你也可以走另一条路,利用其他
人的工作成果,使用 shell 配置key="framework">framework

这些框架为您提供丰富的提示主题、
助手、选项、额外的命令自动完成、插件,并且
由世界各地的开发者社区定期更新。

时至今日,最著名的zsh配置框架仍然是 Oh My
Zsh 13和 Prezto 14。虽然我们不能完全将zshzsh 的成功归功于
它们(Oh My Zsh 大约在 2010 年首次发布,比 zsh 的首次发布晚了 20 年),但它们无疑 在过去几年中
推动了社区的采用15

比较与 zsh 和 Oh My Zsh 相关的 Google Trends
比较与 zsh 和 Oh My Zsh 相关的 Google Trends

我们将向您介绍 Oh My Zsh 的基本概念,但之后的
探索、选择以及您喜欢的主题和插件
(甚至完全不使用它们)都将由您自己决定!毕竟,这是您的开发
环境,因此,一切由您做主。

Note bash有一个类似的框架,其灵感来自 Oh My Zsh,名为
bash-it. 16我们不会详细介绍它,但
如果您不想使用zsh但仍然想使用
配置框架,我们鼓励您了解一下它。

我的天啊

引用官方网站的话:

Oh My Zsh 是一个令人愉悦的开源社区驱动型框架,用于
管理您的 Zsh 配置。它捆绑了数千个
实用函数、辅助工具、插件、主题,以及一些
让您惊艳的功能……

要安装它,请在 shell 中运行以下命令,该命令将下载
安装脚本,并在您的计算机上运行它。

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

脚本运行完毕后,您应该会看到一条消息,提示Oh My Zsh 已安装,并且 应该通过更改位于以下位置的配置来启用
插件、主题和选项
~/.zshrc

在此之前,让我们检查一下环境变量,看看 Oh My
Zsh 是如何配置自身的。

$ printenv | grep ZSH
ZSH=/home/br/.oh-my-zsh
Enter fullscreen mode Exit fullscreen mode

ZSH环境变量指向 Oh My Zsh 的安装
目录。该框架还注入了其他几个变量,
用于定义特定的配置值。

$ set | grep ZSH
ZSH=/home/br/.oh-my-zsh
ZSH_ARGZERO=zsh
ZSH_CACHE_DIR=/home/br/.oh-my-zsh/cache
ZSH_COMPDUMP=/home/br/.zcompdump-morenika-5.7.1
ZSH_CUSTOM=/home/br/.oh-my-zsh/custom
ZSH_EVAL_CONTEXT=toplevel
ZSH_NAME=zsh
ZSH_PATCHLEVEL=zsh-5.7.1-0-g8b89d0d
ZSH_SPECTRUM_TEXT='Arma virumque cano Troiae qui primus ab oris'
ZSH_SUBSHELL=1
ZSH_THEME=robbyrussell
ZSH_VERSION=5.7.1
Enter fullscreen mode Exit fullscreen mode

选择一个主题

我们可以看到默认主题是robbyrussell(Robby Russell 17
是 Oh My Zsh 的创建者)。所有可用主题的完整列表以及屏幕截图可
在网上查看18 。

您也可以运行以下命令来获取列表,因为所有
主题都在 中定义$ZSH/themes

$ ls -1 $ZSH/themes | sed 's/.zsh-theme//'
3den
adben
af-magic
afowler
...
Enter fullscreen mode Exit fullscreen mode

我建议你浏览一下主题维基,或者直接
从之前的命令输出中随机选择一个主题,~/.zshrc
然后修改配置文件中的变量值ZSH_THEME
再运行source ~/.zshrc命令重新加载。这样你就能获得一个全新的
shell 主题了!

您可以反复尝试,直到找到适合您的主题。如果您
对内置主题都不满意,也可以
浏览外部主题 wiki 19。如果您找到喜欢的外部主题
,请下载其对应的.zsh-theme文件,并将其放置在 `<path>` 目录下
$ZSH/themes,然后编辑 `<path>`~/.zshrcZSH_THEME
相应地更新 `<path>`。

注意:如果您想使用我们在该章中介绍的一些技巧进一步个性化主题
,我建议您克隆该主题并维护一个
单独的版本,因为您的调整可能会在下次主题
更新时被覆盖。

ZSH_CUSTOM将环境变量导出到$ZSH/custom,然后运行
以下命令。

$ mkdir -p $ZSH/custom/themes
$ cp $ZSH/themes/$ZSH_THEME.zsh-theme $ZSH/custom/themes/$ZSH_THEME-custom.zsh-theme
Enter fullscreen mode Exit fullscreen mode

然后添加ZSH_THEME=<old zsh theme>-custom到你的~/.zshrc

有用的配置选项

Oh My Zsh 提供了一些可以通过编辑启用或禁用的选项
~/.zshrc。我建议您查看这些选项并选择要
启用的功能。以下是一些个人建议。

自动指令纠错

zsh 可以在检测到输入错误的命令时提供命令更正建议。
要启用自动命令更正,请将其添加
ENABLE_AUTO_CORRECTION='true'~/.zshrc.

$ sl
zsh: correct 'sl' to 'ls' [nyae]? y
Android                bin   Desktop    Downloads  Firefox_wallpaper.png  Pictures
AndroidStudioProjects  code  Documents  Dropbox    Music                  Videos
Enter fullscreen mode Exit fullscreen mode

四个选项分别是:

  • n(否):运行输入错误的命令
  • y(是):运行建议的命令
  • a(中止):停止并什么也不做
  • e(编辑):请在重新运行命令前对其进行编辑。

注意zsh 的自动纠错功能有时可能过于积极,并非
每个人都喜欢20。如果您反复遇到某个
命令被自动纠错的情况(例如,git status错误地被自动更正为git stats),
您可以通过在命令前加上前缀来定义别名
nocorrect

alias git status='nocorrect git status'
Enter fullscreen mode Exit fullscreen mode
Oh My Zsh 自动更新

为了确保您定期获得新的插件和错误修复,Oh My Zsh 可以
自动定期更新。为此,请
在以下位置设置选项~/.zshrc

  • DISABLE_UPDATE_PROMPT=true更新 Oh My Zsh 时未请求确认
  • UPDATE_ZSH_DAYS=30每 30 天更新一次 Oh My Zsh

添加插件

Oh My Zsh 自带超过 250 个插件,每个插件都
为一组特定的
命令定义别名或改进自动补全功能。请参阅 Oh My Zsh wiki 页面21查看
可用插件的完整列表。要启用某个插件,请将其名称添加到
plugins列表中~/.zshrc,然后运行source ~/.zshrc

例子

- plugins=(git)
+ plugins=(git python)
Enter fullscreen mode Exit fullscreen mode

如果您经常使用插件维基页面中列出的命令,那么您
应该尝试启用相关的插件!不过,我建议
启用以下通用插件。

  • common-aliases22:常用别名集合,默认情况下未启用,因为它们可能会更改某些用户定义的别名。
  • colored-man-pages:给man页面着色

彩色手册页更容易阅读!
彩色手册页更容易阅读!

  • extract定义一个extract别名,该别名可以提取任何类型的压缩文件(.zip、.tar.gz、.bzip 等)23

以下插件并非默认提供,但我发现它们非常
有用,因此建议您安装并试用一下。

  • zsh-autosuggestions24:模拟fish自动建议功能,在您输入命令时提供建议,无需使用Ctrl`-`R键查看 shell 历史记录。您可以按回车键接受任何建议,也可以继续输入忽略。

我刚输入了 `ls` 和 `endraw` 命令,就立即得到了补全建议。
我刚输入内容ls,就立刻得到了一个自动补全建议。

建议已采纳!
建议已采纳!

  • zsh-syntax-highlighting25:在 zsh 命令行中提供语法高亮显示。它还会将您输入的命令名称以绿色显示(如果找到),以红色显示(如果不存在)。

raw `ls` endraw 是一个有效的命令
ls是一个有效的命令

原始的 `cmdnotfound` endraw 不是
cmdnotfound不是

卸载 Oh My Zsh

如果您觉得 Oh My Zsh 不适合您,可以通过
运行uninstall_oh_my_zsh相应函数将其卸载。您的先前配置
将被恢复。

概括

我坚信,学习如何配置和个性化自己
的 shell 是成为一名开发者的重要组成部分。我甚至
认为这是一种仪式。就我个人而言,它帮助我克服了
终端近乎神秘的印象,让我能够真正掌控它。

配置 shell 可能永远无法真正完成。你是否
经常重复执行冗长的命令?那就把它设为别名。如果
别名不够用,或者命令需要参数,那就改写成 shell
函数。你是否经常不知道
自己当前运行在哪个分支、项目或配置文件上?那就把它添加到提示符里。如果
提示符看起来有点拥挤,你可以尝试
使用颜色和表情符号来简化它。

自己制作工具并定制 shell 是一种投资,但这
也是软件开发人员的必备技能,它
能让你更快、更高效地完成更多工作,并让你在 shell 中感觉更加得心应手
。而且,这本身也很有趣!

更进一步

4.1:查看终端的首选项,尝试更改
配色方案,或将 ANSI 颜色重新映射到不同的 RGB 颜色。

4.2:尝试不同的字体,例如Source Code Pro
Fira Code ProInconsolata,然后选择你 最喜欢的Jetbrains Mono字体。

4.3:探索您的终端偏好设置,并尝试
不同的设置。

4.4
:尝试更改 提示信息中不同部分的颜色

《面向有志成为软件开发者的必备工具与实践》是由巴尔塔扎·鲁贝罗尔和艾蒂安·布罗杜(他们曾是室友、朋友和同事)自费出版的一本书,旨在赋能新一代开发者。我们目前正在努力创作中!

本书将帮助你搭建高效的开发环境,并熟悉各种工具和实践方法。这些工具和方法,连同你选择的编程语言,将极大地促进你作为软件开发人员的成长。本书涵盖的主题包括:掌握终端操作、配置和高效使用 shell、代码版本控制基础知识git、SQL 基础知识、工具(例如Makesrcjq和正则表达式)、网络基础知识以及软件工程和协作最佳实践。

如果您对本项目感兴趣,欢迎加入邮件列表


  1. https://gnometerminator.blogspot.com/p/introduction.html  

  2. https://iterm2.com/  

  3. https://github.com/tonsky/FiraCode  

  4. https://www.jetbrains.com/lp/mono/  

  5. https://www.theverge.com/2019/6/4/18651872/apple-macos-catalina-zsh-bash-shell-replacement-features  

  6. https://fishshell.com  

  7. http://ezprompt.net  

  8. http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html  

  9. https://en.wikipedia.org/wiki/ANSI_escape_code  

  10. https://github.com/mbadolato/iTerm2-Color-Schemes  

  11. 来源:https ://en.wikipedia.org/wiki/ANSI_escape_code#Colors  

  12. http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Conditional-Substrings-in-Prompts  

  13. https://ohmyz.sh  

  14. https://github.com/sorin-ionescu/prezto  

  15. 来源:
    https://trends.google.com/trends/explore? date=all&q=oh%20my%20zsh,%2Fm%  2F0nrgk ↩

  16. https://github.com/Bash-it/bash-it  

  17. https://github.com/robbyrussell  

  18. https://github.com/ohmyzsh/ohmyzsh/wiki/Themes  

  19. https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes  

  20. https://github.com/ohmyzsh/ohmyzsh/issues/534  

  21. https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins  

  22. https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#common-aliases  

  23. https://www.xkcd.com/1168/  

  24. https://github.com/zsh-users/zsh-autosuggestions/blob/master/INSTALL.md  

  25. https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md  

文章来源:https://dev.to/brouberol/customizing-your-shell-31hf