设置具有长路径的 Xterm 的标题

设置具有长路径的 Xterm 的标题

我的 .profile 中有以下代码:

case $TERM in
    xterm*)
        HOST=`hostname`
        PS1='^[]0;${USER}@${HOST}: ${PWD}^Gksh$ '
        ;;
    *)
        PS1='ksh$ '
        ;;
esac

除非路径太长,否则这种方法效果很好。是否有其他方法可以做类似的事情,但是当路径很长时,它会显示.../<end of the path>以便它可以工作?

答案1

这里有两种选择,具体取决于您的最终目标。

只显示尾随目录元素

PS1='^[]0;${USER}@${HOST}: ${PWD##*/}^Gksh$ '

这只是将##参数替换引入到现有的 PS1 中,以便贪婪地删除字符直到最后的正斜杠。PWD无论长度如何,这都会缩短PS1 提示字符串的部分。

仅缩短长 PWD 字符串

完全公开,我从这个 Stack Overflow 问题的答案之一中得到了这个“骨头”:

如何在 KornShell 中自定义显示提示以显示主机名和当前目录?

...然后进行相应修改。简而言之,它是cd内部函数的别名。该函数模拟原始cd行为,但随后进行一些字符串“数学”以确定新的 PS1 提示符。我从字面上理解了你的问题,所以如果你不想在长目录名称前添加“...”前缀,请从该P=...行中删除该字符串,并删除+3它上面的数学行中的 。

function _cd {
   directory=$1
   pattern=$2

   # First cd to the directory
   if [ "$pattern" ]
   then
       \cd "$directory" "$pattern"
   elif [ "$directory" ]
   then
       \cd "$directory"
   else
       \cd
   fi

   # set this value to taste
   MAXLEN=20
   LEN=${#PWD}
   P=$PWD
   # if PWD is "too" long, trim it
   if [ $LEN -gt $MAXLEN ]
   then
     # the 3 is for the literal "..."
     START=$(( LEN - MAXLEN + 3 ))
     P="..."$(echo $PWD | cut -c ${START}-)
   fi
   PS1="^[]0;${USER}@${HOST}: $P^Gksh\$ "
}

alias cd="_cd"

当然,当我写这篇文章时,我想到了第三个选项——使用别名/内部函数代码,但不是cut使用字符串,而是使用##其中的参数替换来剥离目录元素,如第一个示例中所示。

答案2

我发现的最好方法是在 PS1 环境变量上使用 ksh93 规则函数:

# set ksh prompt and xterm title
_PSX='$( p="${PWD/~(El)${HOME}/\~}"
     printf "%s@%s:%s" "${LOGNAME}" "$(hostname -s)" "${p}"
)'

function PS1.get
{
    .sh.value="ESC]0;${_PSX}^G${_PSX}$ " 
}

相关内容