【问题标题】:Prompt Expansion ZSH Remove Hostname if entire PROMPT is too long如果整个 PROMPT 太长,则提示扩展 ZSH 删除主机名
【发布时间】:2022-01-12 03:28:55
【问题描述】:

目前,我的zshrc 看起来像这样

setopt prompt_subst # real time reevaluation of prompt
zmodload zsh/mathfunc # int function
function widthHelper() { echo $(( int(${COLUMNS:-80}) * ${1}/100)) } # calc $1% of prompt
outWidth='$(widthHelper 40)'
inWidth='$(widthHelper 90)'
export PROMPT="%F{cyan}%${outWidth}<◀︎<%f" # truncation based on terminal width
PROMPT+="%(l." # inner truncation group
PROMPT+="%F{cyan}%8>‣>%n%>>%f" # username truncated
PROMPT+="%-${inWidth}(l. %F{blue}%5>‣>%m%>>%f.) " # hostname truncated
PROMPT+=".)" # end truncation
PROMPT+="%F{magenta}%1~%f%<< " # pwd 1 depth
PROMPT+="%# " # privilege group

influenced by this questionmy other question

目前正在按预期工作

  1. 它将主机名和用户名截断为常量值
  2. 它会根据widthHelper() 动态截断整个 PROMPT,这使我可以调整终端大小并动态截断 PROMPT

目前,我有这条线工作,但不是以预期的方式

PROMPT+="%-${inWidth}(l. %F{blue}%5>‣>%m%>>%f.) " # hostname truncated

我想要什么

我想让主机名的显示依赖于整个PROMPT的长度,而只依赖于当前终端的宽度COLUMNS.

即如果我输入一个名称很长的目录开始截断整个提示之前,我希望主机名消失。但我确实希望两者都按此顺序发生

  1. 主机名会消失(这种情况会发生,但不取决于PROMPT 的长度,而是取决于整个终端的宽度,COLUMNS
  2. 整个提示将开始在左侧截断(目前有效

示例

如果我在 ~ 目录中,然后移动到具有长名称 ~/abcdefghijklmnopqrstuvwxyzabcd 的目录中,我希望主机名消失,但发生的情况是我的提示首先被截断。

william‣ wmbp‣ ~ %                                                                          
william‣ wmbp‣ ~ % cd abcdefghijklmnopqrstuvwxyzabcd                                        
◀︎m‣ wmbp‣ abcdefghijklmnopqrstuvwxyzabcd %                                                  

我想要什么

william‣ wmbp‣ ~ %                                                                          
william‣ wmbp‣ ~ % cd abcdefghijklmnopqrstuvwxyzabcd                                        
william‣ abcdefghijklmnopqrstuvwxyzabcd %                                                  

如果我可以让# hostname truncated 行依赖于PROMPT 长度,那么我可以解决这个问题。

tldr

如何根据我当前的PROMPT 的持续时间来删除我的PROMPT 的一部分。

【问题讨论】:

    标签: linux macos terminal zshrc ps1


    【解决方案1】:

    好的,所以我解决了自己的问题,但首先我不得不说这个问题有缺陷,因为我将提示的长度控制在终端窗口的固定百分比上。所以,我不能指望提示会这样做

    william‣ wmbp‣ ~ %                                                                          
    william‣ wmbp‣ ~ % cd abcdefghijklmnopqrstuvwxyzabcd                                        
    william‣ abcdefghijklmnopqrstuvwxyzabcd %
    

    但我能做的是期望终端这样做

    william‣ wmbp‣ Desktop %
    william‣ wmbp‣ Desktop % cd abcdefghijk
    william‣ abcdefghijk %
    

    因为% 从一行到下一行对齐。

    我得到这个解决方案的方法是在我的 zshrc 中使用它

    LENGTH_OF_USERNAME=8
    LENGTH_OF_HOSTNAME=5
    # calc $1% of prompt
    function termWidthPercentHelper() { echo $(( int(${COLUMNS:-80}) * ${1}/100)) }
    function hostNameInPromptHelper() {
        # if you are in the home directory or if you are in a directory with a name
        # that has a length which is less than $1% of the terminal's width
        if [[ ${PWD##*/} == ${HOME##*/} ]] || [[ ${#PWD##*/} -lt $(termWidthPercentHelper $1) ]] then
            echo "%F{blue}%${LENGTH_OF_HOSTNAME}>‣>%m%>>%f "
        fi
    }
    PROMPT_PERCENTAGE='$(termWidthPercentHelper 30)'
    HOST_NAME_IN_PROMPT='$(hostNameInPromptHelper 9)'
    # left prompt
    export PROMPT="%F{cyan}%${PROMPT_PERCENTAGE}<◀︎<%f" # truncation based on terminal width
    PROMPT+='%(l.' # inner truncation group
    PROMPT+="%F{cyan}%${LENGTH_OF_USERNAME}>‣>%n%>>%f " # username truncated
    PROMPT+="${HOST_NAME_IN_PROMPT}"
    PROMPT+='.)' # end truncation
    PROMPT+='%F{magenta}%1~%f%<< ' # pwd 1 depth
    PROMPT+='%# ' # privilege group
    

    我用函数调用PROMPT+="${HOST_NAME_IN_PROMPT}" 替换了旧行PROMPT+="%-${inWidth}(l. %F{blue}%5&gt;‣&gt;%m%&gt;&gt;%f.) " # hostname truncated。这样我就可以检查当前目录的长度,然后显示主机名,或者如果当前目录太长则不显示主机名。

    帮助我找到这个解决方案的事情

    1. [[ ${PWD##*/} == ${HOME##*/} ]] 如果您在主目录中,则返回 true
    2. ${#PWD##*/}gives the length of the present working directory without calling a subprocess

    结论

    如果我想将整个提示保持在我的终端屏幕的某个百分比上,如之前命名的 widthHelper 函数调用所示,我想做的事情是不可能的。

    如果我输入一个长名称的目录,我的终端将不会显示我的PROMPT 的一部分(参见上面hostNameInPromptHelper 的定义)。我还调整了作为提示的屏幕百分比的值(即PROMPT_PERCENTAGE='$(termWidthPercentHelper 30)')和为我的屏幕百分比设置的值,在我不显示主机名之前目录名称的长度可以占用(即HOST_NAME_IN_PROMPT='$(hostNameInPromptHelper 9)')。这些值对我有用,但如果您可能想要调整这些值直到您喜欢您的提示。

    来源

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 2011-06-11
      • 2013-12-30
      • 1970-01-01
      相关资源
      最近更新 更多