Como imprimir as dimensões do xterm na barra de título?

4

É possível imprimir as dimensões do xterm na barra de título? Gostaria de algo simples como WxH , que é atualizado sempre que o terminal é redimensionado.

    
por Antoine 14.06.2015 / 14:06

2 respostas

6

Você pode obter as dimensões do xterm através das variáveis ambientais $COLUMNS e $LINES . Pode então definir o título através de determinados códigos de escape documentados, p. Bash Prompt HOWTO . Aqui está um comando único para definir o título:

# The title text is the stuff between ; and \a
printf "\e]0;${COLUMNS}x${LINES}\a"

Eu não sei se existe uma maneira de atualizar o título quando a janela é redimensionada. Você pode capturar o sinal SIGWINCH, que o xterm envia quando o tamanho do terminal muda. Se você usa o Bash, coloque isso no seu ~/.bashrc :

function update_title {
    printf "\e]0;${COLUMNS}x${LINES}\a"
}

trap -- update_title SIGWINCH

Aviso: Tenho a sensação de que pode haver algumas interações estranhas causadas por essa solução. Se você perceber que alguns aplicativos de terminal estão se comportando mal ao redimensionar a janela, tente desabilitar a interceptação acima e veja se o problema persiste.

    
por 14.06.2015 / 14:31
0

Este não é um recurso interno do xterm.

Se você estiver executando um shell interativo nesse terminal, poderá fazê-lo atualizar o título da janela toda vez que exibir um prompt. Com todos os shells populares, as variáveis COLUMNS e LINES são atualizadas para refletir as dimensões atuais do terminal. Você pode colocar as seqüências de escape para definir o título da janela como parte do seu prompt (você precisará dizer ao seu shell que a seqüência de escape tem largura zero, caso contrário o shell ficará confuso sobre a posição do cursor), ou você pode Organize para imprimir a string antes de exibir um prompt. No bash, para definir o título da janela para o diretório atual seguido pelo tamanho da janela, você pode usar algo como

set_term_title () {
  printf '\[3]2;%s %dx%d
set_term_title () {
  printf '\[3]2;%s %dx%d
trap set_term_title SIGWINCH
7\]' $PWD $LINES $COLUMNS } precmd+=set_term_title
7\]' "$PWD" "$LINES" "$COLUMNS" } PROMPT_COMMAND="$PROMPT_COMMAND set_term_title"

No zsh:

(
  title="$(xdotool getwindowname "$windowid")"
  eval "$(xdotool getwindowgeometry --shell)"
  title="${title% *} ${WIDTH}x${HEIGHT}"
  xdotool set_window --name "$title" "$windowid"
)

Se a janela for redimensionada enquanto o shell estiver exibindo um prompt, o shell receberá um sinal SIGWINCH . Adicione um manipulador para esse sinal.

set_term_title () {
  printf '\[3]2;%s %dx%d
set_term_title () {
  printf '\[3]2;%s %dx%d
trap set_term_title SIGWINCH
7\]' $PWD $LINES $COLUMNS } precmd+=set_term_title
7\]' "$PWD" "$LINES" "$COLUMNS" } PROMPT_COMMAND="$PROMPT_COMMAND set_term_title"

Se a janela for redimensionada enquanto um comando estiver sendo executado, o título só será atualizado na próxima vez que o shell exibir um prompt. Somente o processo de primeiro plano recebe um sinal nesse caso, portanto, o shell nunca descobre, ele só pode consultar informações atualizadas quando o comando é finalizado ou suspenso e o shell retoma a execução.

Se você quiser que o título seja atualizado independentemente do que está sendo executado no terminal, será necessário conectar algum componente externo. Um gerenciador de janelas chique deve ser capaz de fazer isso - mas a maioria não consegue. No peixe-serra, você pode ajustar rewrite-window-title para adicionar as dimensões da janela em vez de aplicar uma transformação baseada em expressões regulares.

Você pode usar xdotool para obter as informações e alterar o título:

(
  title="$(xdotool getwindowname "$windowid")"
  eval "$(xdotool getwindowgeometry --shell)"
  title="${title% *} ${WIDTH}x${HEIGHT}"
  xdotool set_window --name "$title" "$windowid"
)

Observe que xdotool getwindowgeometry retorna dimensões em pixels, não em caracteres. Não sei como reagir a uma janela que está sendo redimensionada sem a colaboração do gerenciador de janelas.

    
por 15.06.2015 / 00:15