在 MacOS 上使用 iTerm2 的 Zsh 带有一个小窗格和一个长提示:删除提示后 space

Zsh with iTerm2 on MacOS with a small pane and a long prompt : space after prompt removed

仍未找到解决方案:

我在 zsh 上遇到了不同的问题,这些问题在 MaOS Catalina/iTerm2 上是意料之外的。

I) 事实上,如果我将 iTerm2(只有一次终端)的大原始 window 分成 4 个窗格,而且,如果我有一个长提示,然后删除 end of prompt 和命令之间的第一个 space。

II) 其他异常行为:例如,如果我在此窗格中执行 ls 命令,并在 completion 请求后执行TAB,“ls”的第二个字母“s”被删除或另一个行为:之间没有更多的space ls 命令和完成建议的 directories/files。

为了说明和帮助您理解,下面是屏幕截图:

1) 将错误重现到右下方窗格的初始窗格:

2) 使用“ls”命令完成:光标在“ls”的第二个字母上,即“s

3) 完成示例,此处使用“ls”命令:命令“ls”和[之间不再有 space =196=] completionned 或 space 在最后一个紫色管道符号和命令 '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 '末尾的space,好像不被尊重

我知道我的问题肯定来自长提示(如果我将相同的命令“ls”应用到 $HOME 中,一切都工作正常,即完成不会删除任何 space.

这就是为什么我也尝试在 .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})达到第四深度,在 …… 符号之后,当前另一种定义颜色的目录(在我的例子中,%F{13}.

几乎当我输入 cd 命令时,我得到以下结果:

`|fab@astro|6:50|/Users/fab/……~|`

如您所见,我只想得到 :

`|fab@astro|6:50|~|`

即,使路径 /Users/fab/…… 消失到提示中,因为 ~/Users/fab/ 引用相同的东西。

更一般地说,我想用 ~ 替换总是 /Users/fab/,即对于我显示的所有提示。

如何解决?

REQUEST 4: 它仍然是提示和命令之间的 space 问题,当我进入一个小窗格时会干扰。我不知道如何防止这个 space 消失。 我有一个认真的轨迹:我已经意识到当提示显示在多行时会发生这种行为,因为窗格很小,所以提示不能包含在一行中,如下所示:

还有,我想修正“space removing”的这个错误。 我认为一种解决方案可能是截断我提示的第二部分(当前目录),以使其只包含一行(就像我在上面 [=156= 中指出的那样) ]REQUEST 2) 但如何实现呢?

仍然找不到解决方案:抱歉,我认为 zsh-5.8 可以解决这个问题,但实际上,从我上次的测试来看,情况并非如此。

关于请求 3,您可以显示您的 $HOME 吗? \w 或 \W 将始终如所述 here 将 $HOME 替换为 ~ (我猜你的 $HOME 可能未设置)...

或者,不是那么干净,但它可以解决问题,(如果 $HOME 设置正确),您可以尝试在其中添加类似这样的内容:

if [[ "${PWD}" == "${HOME}" ]] ; then printf \~; else echo -n ${PWD##*/}; fi

讨论 here

这也可以解决请求 4 的问题,假设您有一个超长的文件夹并且想稍微缩小它:

pwdvar="${PWD}"
len_pwd=${#pwdvar}
limit_char=50
letters_beg=10
letters_ignored=50
shortpwdvar=$(echo $pwdvar | cut -d '/' -f 5-)
if [[ len_pwd > limit_char  ]] ; then echo ${pwdvar} ; else echo "~/.../"${shortpwdvar::letters_beg}"..."${shortpwdvar:letters_ignored}; fi