【发布时间】:2020-07-25 20:36:06
【问题描述】:
仍未找到解决方案:
zsh 遇到了不同的问题,MaOS Catalina/iTerm2 上不会出现这些问题。
I) 确实,如果我将例如 iTerm2 的一个大原始窗口(只有一个终端)分成 4 个窗格,而且,如果我有一个长提示,那么 @ 之间的第一个空格987654336@ 并删除该命令。
II) 其他 stange 行为:例如,如果我在此窗格中执行 ls 命令,并在请求 completion 和 TAB 后执行,则第二个字母 '@ 'ls' 的 987654340@' 被删除或其他行为:ls 命令与完成建议的目录/文件之间没有更多空间。
为了说明和帮助您理解,以下是屏幕截图:
1) 我将错误重现到右下窗格的初始窗格:
2) 使用“ls”命令完成:光标在“ls”的第二个字母上,即“s”
3) 完成示例,此处使用“ls”命令:命令“ls”和已完成的目录/文件之间没有空格,或者在最后一个紫色管道符号和命令之间没有空格'ls' 已移除。
我想获得一些建议来解决问题2)和3)。理想情况下,我想保留我的长提示(由于当前目录的 PATH 很长)并理解为什么我会出现这些奇怪的行为。
我的提示定义为.zshrc:
PS1='%F{magenta}|%F{green}%n@%F{cyan}%m%F{magenta}|%f%T%F{magenta}|%B%~%b%F{magenta}|%f '
可以看到提示符|%f '末尾的空格,好像不尊重
我知道我的问题肯定来自长提示(如果我将相同的命令 'ls' 应用到 $HOME 中,一切工作正常,即完成不会删除任何空间。
这就是为什么我也尝试在.zshrc(来自http://aperiodic.net/phil/prompt/)中使用此代码来截断PATH:
###
# Truncate the path if it's too long.
PR_FILLBAR=""
PR_PWDLEN=""
local promptsize=${#${(%):---(%n@%m:%l)---()--}}
local pwdsize=${#${(%):-%~}}
if [[ "$promptsize + $pwdsize" -gt $TERMWIDTH ]]; then
((PR_PWDLEN=$TERMWIDTH - $promptsize))
else
PR_FILLBAR="\${(l.(($TERMWIDTH - ($promptsize + $pwdsize)))..${PR_HBAR}.)}"
fi
但它什么也没做,PATH 保持不变...
如果有人遇到过相同类型的问题,这会很好地告诉潜在的解决方案来解决这些问题。此外,也欢迎任何反馈。
更新 1:我会得到更好的结果,因为我会改进它,即我希望 zsh 自动截断一个长目录名称,并在之前固定一个限制。
在此之前,我向您展示我想要获得的结果:
下图使用的 PS1 是用 :
PS1='%F{magenta}|%F{green}%n@%F{cyan}%m%F{magenta}|%f%T%F{magenta}|%F{75}%-2d~/.../%F{13}%1~%F{magenta}| '
第三行的结果:
请求 1:
这对我来说是第一个有趣的结果,因为我希望当前目录单独具有与我想要截断的上述路径不同的颜色。
如您所见,问题仍然存在,即目录
Travail_3_Alain_Injection_des_Biais_Spectro_dans_XSAF_avec_GCph+WL+XC_et_rajout_dun_Prior_dans_la_matrice_de_Fisher_de_SpecSAF_15_JANVIER_2020
非常非常长。
请求 2:
所以,我知道这可能很难实现,但是对于给定数量的固定最大字符,是否有可能将完整路径的所有组件(我的意思是上面的每个目录)截断到另一个组件上我们在目录的开头和结尾之间应用了截断?
例如目录
Travail_3_Alain_Injection_des_Biais_Spectro_dans_XSAF_avec_GCph+WL+XC_et_rajout_dun_Prior_dans_la_matrice_de_Fisher_de_SpecSAF_15_JANVIER_2020
会变成:
Travail_3_...SpecSAF_15_JANVIER_2020
我想在完整路径(截断,当前目录除外,颜色为 75)和当前目录(我上面最后一个结果中的颜色 13)之间保留 2 种不同的颜色。
顺便问一下,$reset_color 函数是什么:必须使用它吗?
更新 2:我暂时设置了以下提示:
PS1='%F{13}|%F{green}%n@%F{cyan}%m%F{13}|%f%T%F{13}|%F{75}%-4d/…… %F{13}%1~%F{13}|%F{15} '
它给出了以下渲染:
如您所见,我可以在提示的第一部分显示多达第四(%~4d)深度的目录。在第一部分之后,我显示当前目录(%1~)。
请求 3:
这几乎是我想要得到的结果:首先以定义的颜色(此处为%F{75})将父目录的深度达到第四个深度,然后在……symbol 之后,以另一种定义的颜色(在我的情况下,%F{13}。
几乎自从我输入cd 命令后,我得到以下结果:
`|fab@astro|6:50|/Users/fab/……~|`
如你所见,我只想得到:
`|fab@astro|6:50|~|`
即,使路径 /Users/fab/…… 消失到提示中,因为 ~ 和 /Users/fab/ 引用了同一件事。
更一般地说,我想将 /Users/fab/ 替换为 ~,即我显示的所有提示。
如何解决?
REQUEST 4:当我进入一个小窗格时,提示符和命令之间的空间问题仍然存在。我不知道如何防止这个空间消失。 我有一个严重的跟踪:我意识到当提示显示在多行时会发生这种行为,因为窗格很小,因此提示不能包含在一行中,如下所示:
还有,我想纠正这个“space removing”的错误。
我认为一种解决方案可能是截断提示的第二部分(当前目录),以使其仅包含一行(就像我在上面的 REQUEST 2 strong>) 但是如何实现呢?
解决方案仍未找到:抱歉,我相信 zsh-5.8 可以解决问题,但实际上,从我上次的测试来看,情况并非如此。
【问题讨论】:
-
PR_FILLBAR不是一个特殊的zsh变量;PS1必须以某种方式使用它。如果您进一步向下看该页面,它用于定义PROMPT(zsh的别名为PS1)。 -
根据您的提示,我怀疑
zsh本身在处理该长度的路径时存在错误。出于好奇,如果将%~替换为%1~之类的东西,会告诉zsh仅显示当前工作目录的最后一个目录组件,您是否会遇到同样的问题? -
@chepner 。是的,我的问题仍然是用
%1~替换%~。我一直在研究,我将很快添加更新。谢谢 -
@chepner 我添加了一个 UPDATE2 来向您展示当前的进度和剩余的问题。
标签: zsh prompt iterm2 zshrc zsh-completion