在MacOS上带有小窗格和长提示的带iTerm2的Zsh:删除提示后的空格

在MacOS上带有小窗格和长提示的带iTerm2的Zsh:删除提示后的空格,zsh,prompt,iterm2,zshrc,zsh-completion,Zsh,Prompt,Iterm2,Zshrc,Zsh Completion,仍未找到解决方案: 我面临着zsh的不同问题,这在MaOS Catalina/iTerm2上是不可能的 I)事实上,例如,如果我将iTerm2的一个大原始窗口(仅一个终端)划分为4个窗格,而且如果我有一个长提示符,那么提示符结束和命令之间的第一个空格将被删除 II)其他语句行为:例如,如果我在此窗格中执行ls命令,并在请求完成后使用选项卡执行,“ls”的第二个字母“s”被删除,或者其他行为被删除:ls命令和完成建议的目录/文件之间没有更多的空间 以下是屏幕截图,以说明并帮助您理解: 1)我将bu

仍未找到解决方案:

我面临着
zsh
的不同问题,这在
MaOS Catalina/iTerm2
上是不可能的

I)事实上,例如,如果我将iTerm2的一个大原始窗口(仅一个终端)划分为4个窗格,而且如果我有一个长提示符,那么提示符结束和命令之间的第一个空格将被删除

II)其他语句行为:例如,如果我在此窗格中执行
ls
命令,并在请求
完成后使用
选项卡执行
,“
ls
”的第二个字母“
s
”被删除,或者其他行为被删除:
ls
命令和完成建议的目录/文件之间没有更多的空间

以下是屏幕截图,以说明并帮助您理解:

1)我将bug复制到右下角窗格中的初始窗格:

2)使用'
ls
'命令完成:光标位于'
ls
'的第二个字母上,即'
s
'

3)完成示例,此处使用“
ls
”命令:命令“
ls
”与已完成的目录/文件之间没有更多空间,或者最后一个紫色管道符号与命令“
ls
”之间的空间已删除

我想得到一些建议来解决问题2)3)。理想情况下,我希望保持长提示(由于当前目录的路径很长),并理解为什么我会有这些奇怪的行为

我的提示定义为
.zshrc

PS1='%F{magenta}|%F{green}%n@%F{cyan}%m%F{magenta}|%f%T%F{magenta}|%B%~%b%F{magenta}|%f '
您可以在提示符
|%f'
的末尾看到空格,这似乎没有得到遵守

我知道我的问题肯定来自于长提示(如果我在$HOME中应用相同的命令'
ls
),那么一切都正常,即完成不会删除任何空间

这就是为什么我还尝试在
.zshrc
(from)中使用此代码来截断路径:

###
# 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
但它什么也不做,路径保持不变

如果有人有相同类型的问题,这将是很好的告诉潜在的解决方案,以解决他们。此外,任何反馈也是欢迎的

更新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
 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_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)之间保留两种不同的颜色

顺便问一下,
$reset\u 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|~|`
i、 e,要使路径
/Users/fab/…..
消失到提示符中,因为
~
/Users/fab/
引用了相同的内容

更一般地说,我希望总是将
/Users/fab/
替换为
~
,即我显示的所有提示。

如何修复它

请求4:当我进入一个小窗格时,提示和命令之间仍然存在空间问题。我不知道如何防止这个空间消失。我有一个严重的问题:我意识到当提示显示在多行时会发生这种行为,因为窗格很小,所以mpt不能只包含在一行中,如下所示:

在这里,我也想纠正这个“
删除空间
”的错误。 我认为一种解决方案可能是截断提示符的第二部分(当前目录),使其仅包含一行(如我在上面的请求2中所述),但如何实现它呢


仍未找到解决方案:对不起,我相信zsh-5.8可以解决问题,但事实上,从我上次的测试来看,情况并非如此。

关于请求3,您是否可以显示您的$HOME?\w或\w将始终按照所述为~替换$HOME(我猜您的$HOME可能未设置)

交替