【问题标题】:Zsh with iTerm2 on MacOS with a small pane and a long prompt : space after prompt removed在 MacOS 上使用 iTerm2 的 Zsh 带有一个小窗格和一个长提示:提示删除后的空格
【发布时间】:2020-07-25 20:36:06
【问题描述】:

仍未找到解决方案:

zsh 遇到了不同的问题,MaOS Catalina/iTerm2 上不会出现这些问题。

I) 确实,如果我将例如 iTerm2 的一个大原始窗口(只有一个终端)分成 4 个窗格,而且,如果我有一个长提示,那么 @ 之间的第一个空格987654336@ 并删除该命令。

II) 其他 stange 行为:例如,如果我在此窗格中执行 ls 命令,并在请求 completionTAB 后执行,则第二个字母 '@ '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 必须以某种方式使用它。如果您进一步向下看该页面,它用于定义PROMPTzsh 的别名为PS1)。
  • 根据您的提示,我怀疑zsh 本身在处理该长度的路径时存在错误。出于好奇,如果将%~ 替换为%1~ 之类的东西,会告诉zsh 仅显示当前工作目录的最后一个目录组件,您是否会遇到同样的问题?
  • @chepner 。是的,我的问题仍然是用%1~ 替换%~。我一直在研究,我将很快添加更新。谢谢
  • @chepner 我添加了一个 UPDATE2 来向您展示当前的进度和剩余的问题。

标签: zsh prompt iterm2 zshrc zsh-completion


【解决方案1】:

关于请求 3,您能出示您的 $HOME 吗? \w 或 \W 将始终替换 $HOME 为 ~ 如所述here (我猜你的 $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

【讨论】:

    猜你喜欢
    • 2012-07-31
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2022-07-07
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多