编辑您的 PROMPT 变量很好,但也许您只是想更改所有提示主题的 zsh 行为,而无需进入并修改每一个
%# 在您的主题中。
% 在源代码中是硬编码的。但编辑起来非常简单。
您可以在源代码 (github) 的 prompt.c 文件中找到有问题的行,特别是当前第 734 行。
有问题的代码是:
case '#':
addbufspc(1);
*bv->bp++ = privasserted() ? '#' : '%';
break;
您所要做的就是将% 更改为您想要的任何字符,可能是$,构建程序并替换您的zsh 安装。
这可能是一种痛苦。您还可以修补当前的二进制文件以替换您想要的任何字符。
您只需将单个字节从 0x25 (%) 更改为 0x24 ($)。
问题是,很难在 zsh 二进制文件中找到它!
在我的情况下(Ubuntu 20.04,zsh 5.8)我发现了这个:
$ objdump -D zsh | less
8af87: e8 84 e4 01 00 callq a9410 <privasserted@@Base>
8af8c: 4c 8b 2d fd 49 05 00 mov 0x549fd(%rip),%r13 # df990 <keyboardhackchar@@Base+0x210>
8af93: 0f b6 74 24 10 movzbl 0x10(%rsp),%esi
8af98: 85 c0 test %eax,%eax
8af9a: b8 25 00 00 00 mov $0x25,%eax
8af9f: 0f 44 f0 cmove %eax,%esi
8afa2: 49 8b 45 18 mov 0x18(%r13),%rax
8afa6: 48 8d 50 01 lea 0x1(%rax),%rdx
坦率地说,我什至不确定这里的大多数指令是做什么的,但很容易看出0x8af9a 的指令是罪魁祸首。使用十六进制编辑器(ghex),我用 0x24 替换了那里的 0x25,现在 zsh 显示 $ 提示!
这比下载 zsh 源代码并重新编译要容易,但我花了一段时间才找到正确的修补指令。二进制文件中似乎没有很多 privasserted 调用实例,因此您可能可以一一检查所有这些实例,看看哪一个适合。
希望对您有所帮助!我是 bash 用户,% 让我非常恼火,所以我拒绝尝试 zsh。现在我可以试一试。