如何限制提示中的目录数量?

mic*_*ael 3 bash prompt

在我的 Mac OS X 10.6 上,我的提示设置为

PS1='\[\033[01;32m\][\w\[\033[00m\]\[\033[01;34m\]$(__git_ps1 " (%s)")\033[01;32m\]]\[\033[00m\]\$ '
Run Code Online (Sandbox Code Playgroud)

如何限制提示中的目录数量?的\w一部分?

这是因为当我深入目录树时,提示占据了终端的整个宽度。

Kar*_* S. 5

您可能已经在提示中使用了 git 分支名称的函数,这很好,所以只需对您的路径执行相同的操作:

# shorten a path in $1 to max of $2 characters, prepending a "..."
function __shortpath {
    if [[ ${#1} -gt $2 ]]; then
        len=$2+3
        echo "..."${1: -$len}
    else
        echo $1
    fi
}
PS1='\[\033[01;32m\][$(__shortpath "\w" 50)\[\033[00m\]\[\033[01;34m\]$(__git_ps1 " (%s)")\033[01;32m\]]\[\033[00m\]\$ '
Run Code Online (Sandbox Code Playgroud)

它将路径限制为最后 50 个字符。这是一个例子。您也可以考虑仅在斜线处切断,但这会使事情变得更加困难。

# drops first portion of a path $1 if length is greater than $2
function __droppath {
    if [[ ${#1} -gt $2 ]]; then
        p=$1
        while [ ${#p} -gt $2 ]; do
            p="/"$(echo "$p"|cut -d"/" -f3-)
        done
        echo "..."$p
    else
        echo $1
    fi
}
PS1='\[\033[01;32m\][$(__droppath "\w" 50)\[\033[00m\]\[\033[01;34m\]$(__git_ps1 " (%s)")\033[01;32m\]]\[\033[00m\]\$ '
Run Code Online (Sandbox Code Playgroud)

也许通过检查新长度是否短于旧长度(否则退出)或者新长度是否为 0 来保护 while 循环也是一个好主意,在这种情况下,您可以返回 $p 的最后一个值 - 或继续使用 __shortpath。


小智 5

你看过PROMPT_DIRTRIM(bash设置,检查man bash):

PROMPT_DIRTRIM

如果设置为大于零的数字,则该值用作扩展\w\W提示字符串转义时要保留的尾随目录组件的数量(请参阅下面的提示)。删除的字符将替换为省略号。