3
14
2017
22

我的 zsh 提示符

本文来自依云's Blog,转载请注明。

这是我用了多年的 zsh 提示符。

My zsh prompt

右提示符比较简单,先说。

首先,这个右提示符是 zsh 才支持的,不是 hack 左提示符来的哦。

我的右提示符显示的是(提示符打印出来时的)时间。在有后台任务时,会在左边以黄色显示出后台任务的数量,增加些许后台默默工作的进程的存在感啦。

截图中可以看到,只有最后一行才显示了右提示符(以至于我截图都得 hack 一下)。我使用了setopt transient_rprompt,这样 zsh 会清掉旧的右提示符,就不会影响复制了。以前每次复制时都带上一堆空格然后几个时间,折行之后根本没法看,后来才发现体贴的 zsh 已经有这么个选择了。

另外,在输入命令到右提示符时,右提示符会自动消失,以免和命令混淆。都说了很体贴的哦~

左边,是一个两行的提示符。之所以做成两行,是为了保持命令的起始位置不会因为提示符的长度变化而变化,每次输入新命令的时候,光标都在同一列,易读好找。我就不明白,那些坚持 bash 默认提示符的人是怎么坚持下来的,用着用着不知道自己光标去哪里了……对了,zsh 在输出提示符时,会保证它从终端最左边那一列开始输出。如果上一行不完整,zsh 会打印一个反色的「%」来表示(截图里 ^C 那里就有一个)。

蓝色「>>> 」是学 Python 的,但是使用了蓝色以免和 Python 混淆。如果是 root 用户,则显示红色的「### 」以警示。这个比较刺眼,所以就尽量不用 root 跑 shell 啦。

第一行开头是命令序号,就是历史记录里有多少条命令。每执行一条命令它就会加一,空行或者 Ctrl-C 放弃的不算。其实没什么用的样子。

然后是一个用于标识不同机器的名字。比如这里 lilywork 表示我正在我的工作机上。我家里那个系统里不会显示这个。这个信息可以通过ZSH_PS_HOST变量来设置,比如一般可以设置成$(hostname)。GitLab 之前的提示符里大概没有这个吧。

再就是最后一条命令的状态码($?)。如果命令成功就不显示,否则显示一个红色的数字,以提示上条命令出错了。所以说了嘛,我没法理解坚持使用 bash 及其默认提示符的人……

然后是缩短过的当前目录。~tmp是我的临时目录,有名字(hash -d tmp=....)的。但是它不会缩短中间路径的名字,反正我在它下边写命令,不用担心路径太长。不过我不建议深入探索 nodejs 的模块树,显示好几行的路径并不好看的。

最后一项又是可选的,git 当前分支。这个功能是我自己写的,不是 zsh 自带的那个,是异步显示的哦~忙着干活呢,不能在这种小事上浪费时间、中断思绪嘛。并且还可以通过设置来排除一些目录,比如访问特别慢的远程目录,比如已经死掉很久的 Wuala。

显示的信息不多,也一点都不华丽,但十分有用呢。

介绍完毕,提示符的定义我这里就不写啦。代码都在这里:https://github.com/lilydjwg/dotzsh

Category: shell | Tags: zsh linux | Read Count: 15982
SpicyCat 说:
Mar 14, 2017 07:08:19 PM

佩服完全手写zsh配置文件的人。
我等凡人就用 oh-my-zsh 好了。
先star下repo

smallville 说:
Mar 15, 2017 10:48:37 AM

很实用哦,就用你的配置了。

Tisoga 说:
Mar 17, 2017 10:03:38 AM

用 >>> 总有一种在 Python 解释器里敲命令的错觉……

yinflying 说:
Mar 19, 2017 07:26:29 PM

zsh哈,我也正在用。但是现在还体验不到zsh和bash有什么区别。
不过两个插件觉得挺好,autojump和zsh-autosuggestions...

liuf 说:
Mar 23, 2017 07:16:45 AM

怎么能让两行的提示符在屏幕滚动的时候永远显示呢?

Avatar_small
依云 说:
Mar 23, 2017 09:50:44 AM

滚动是终端的功能,因此这种功能需要终端去做。

荒野无灯 说:
Mar 26, 2017 04:15:46 PM

佩服完全手写zsh配置文件的人。
我之前用 oh my zsh, 后面发现了这货(https://github.com/zsh-users/antigen)
类似的好像还有prezto,不过我没时间去试。

Avatar_small
依云 说:
Mar 26, 2017 05:59:27 PM

好像很不错的样子。不过好像可以用的插件并不多啊。也许 zsh 需要个 registry 来放插件了。

bwangel 说:
Mar 28, 2017 07:12:23 PM

依云姐姐,我能直接使用你的zsh配置吗,原来用oh-my-zsh卡的让我受不了。。。。

Avatar_small
依云 说:
Mar 28, 2017 08:35:41 PM

能啊。我的配置应该没有会坑到不熟悉的人的配置,不过你要注意一下我自己的 alias 和 function 什么的。当然还有几个键绑定。

我的 zsh 配置和 vim 配置都是针对启动速度优化过的哦~

bwangel 说:
Mar 29, 2017 05:52:43 PM

嗯,用起来感觉飞起,谢谢你的分享。

还有个小问题,我想在命令提示符中显示我的pyenv所使用的环境(`pyenv version`命令获取到),这个实现起来应该和你的那个显示git branch的函数思路差不多吧。

我看到了应该是`_setup_current_branch_async`那个函数实现的,不过我对zsh代码还不是太熟悉,您能不能简要地讲一下实现思路啊,非常感谢。

Avatar_small
依云 说:
Mar 29, 2017 08:28:12 PM

就是开个 coproc 跑命令,然后在它输出的时候更新变量。你去看 zle 的 -F 选项的功能。

smallville 说:
Apr 09, 2017 07:51:40 PM

美中不足是命令历史纪录做的不够好,好多曾经输入的命令都记不住。这点不上oh-my-zsh。

Avatar_small
依云 说:
Apr 09, 2017 08:25:05 PM

咦不会吧?我从来没有遇到过近期输入的命令找不到的情况呢。
你的命令是首字母空格了吗?

smallville 说:
Apr 09, 2017 08:46:28 PM

不是首字母空格啊,正常的命令,不是偶然记不了的。比如开一个screen,在里面用过的命令都记不住。重启后也记不起这个命令。
而oh-my-zsh是在screen中用过的命令,Ctrl+A+C新开一个窗口后马上就可以用上箭头翻查这个命令了。
对于懒人,Ctrrl+R翻查命令历史纪录太重要了,呜呜。

Avatar_small
依云 说:
Apr 10, 2017 09:30:51 AM

你 setopt SHARE_HISTORY 吧。我不用这个是因为两个原因:

1. 损耗硬盘、I/O忙时会卡
2. 打断了一个 shell 会话的命令执行顺序,在翻历史时有很大的不确定性

smallville 说:
Apr 10, 2017 11:58:16 AM

明白,thanks

丁丁 说:
Nov 13, 2017 09:20:34 AM

我的zsh提示符也想用两行显示,但一直没弄成,用 \n 没用;下面是我的:
PROMPT="%F{green}%j%n@ %d %B>>>:%b%{$reset_color%}"
第二行只显示 >>>: ,方便你说的找到命令起始位置,baidu了好久没找到办法,你那个github代码看不太懂,帮我看下,我这个要怎么改能灵?

Avatar_small
依云 说:
Nov 13, 2017 05:52:23 PM

直接换行就可以了。shell 的字符串是可以多行的。

丁丁 说:
Nov 14, 2017 09:56:34 AM

果然,我直接换行就行了~
这么简单,我当时怎么就没试一下,好笨~

谢先!

Spirit 说:
Dec 19, 2019 08:07:44 PM

学到了好多用法,点赞!!最近从oh-my-zsh转到zimfw~


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com