Definindo o título para o Xterm com caminhos longos

3

Eu tenho o seguinte código no meu .profile:

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

Isso funciona bem, a menos que o caminho seja longo demais. Existe uma maneira alternativa de fazer algo semelhante, mas quando os caminhos são longos, exibe .../<end of the path> para que funcione?

    
por Ed Heal 16.07.2015 / 15:40

2 respostas

2

Aqui estão duas alternativas, dependendo do seu objetivo final.

Mostrar apenas o elemento de diretório à direita

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

Isso simplesmente introduz a substituição do parâmetro ## em seu PS1 existente, a fim de eliminar personagens avidamente até a barra final. Isso encurtará a parte PWD da string de prompt do PS1, independentemente do tamanho.

Apenas encurte strings PWD longas

Divulgação completa, recebi os "ossos" disso de uma das respostas a essa pergunta sobre estouro de pilha:

Como exibir um prompt personalizado no KornShell para mostrar o nome do host e o diretório atual?

... então modificou de acordo. Em suma, aliases cd a uma função interna. Essa função emula o comportamento original de cd , mas faz alguma string "matemática" para determinar o novo prompt do PS1. Eu fiz sua pergunta literalmente, então se você não quiser "..." prefixando os nomes de diretório longos, remova essa string da linha P=... e também remova a +3 na linha matemática acima dela.

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"

Claro, enquanto escrevo isso, uma terceira opção vem à mente - para usar o código alias / internal-function, mas em vez de cut ing o string, use a substituição do parâmetro ## nele para tira os elementos do diretório como no primeiro exemplo.

    
por 18.07.2015 / 03:25
0

A melhor maneira que encontrei é usar uma função de disciplina ksh93 na variável ambiental PS1:

# 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}$ " 
}
    
por 16.06.2016 / 03:09

Tags