automatiza o título das janelas de tela do gnu

0

(got one possible solution on stack overflow : https://stackoverflow.com/a/51769020/9497573)

editado para ser mais preciso

Eu tento tornar o título das minhas janelas na tela automaticamente igual ao caminho do diretório de trabalho PLUS o processo em execução se houver um ( por exemplo: npm start ou vim file.js )

para esse propósito, adicionei essas linhas no meu .zshrc :

precmd () {
  local action = action_to_define
  if [[ $TERM == screen* ]]; then
    printf -Pn '\ek%~ $action\e\'
  fi
}

enviar (de alguma forma) o caminho como título para a tela (veja resposta de Stéphane Chazelas )

e a variável action imprimiria o programa em execução se ele existir

Eu tentei local action= $(history | tail -1 | sed 's#[0-9 ]*##') | grep vim porque isso seleciona o prompt do último comando no histórico (assim como history !! faria se a opção !! fosse reconhecida, o que não é por algum motivo ...)

e local action= $(ps -lr | tail -1 | sed 's#^.*:...##') porque isso seleciona o comando do processo em execução

mas não funciona, como se o processo não tivesse sido capturado nem por history ou ps ... talvez precmd fosse executado antes que a ação fosse lançada, então tentei outras funções como preexec ou zshaddhistory sem sorte ...

como posso capturar o processo em execução para colocá-lo no título?

primeira pergunta publicada

Eu encontrei isto: Tela GNU: mudança de nome de nova janela O que dá uma maneira de fazer algo próximo, modificando o arquivo .zshrc, e fonte a explicação com esta seção do manual da tela:

no entanto ele mostra apenas a pasta, não o arquivo, e eu não entendo uma única palavra do que é exlained, então não posso me adaptar à minha necessidade: que não é imprimir apenas o diretório, mas também o arquivo de trabalho

minha compreensão do script do arquivo .zshrc até agora:

precmd () {
  local tmp='%~'
  local HPWD=${(%)tmp}
  if [[ $TERM == screen* ]]; then
    printf '\ek%s\e\' $HPWD
  fi
}

- precmd () é uma função que é executada antes de cada prompt (também pode ser chpwd () ) (src: link )

- local significa que a variável tem um escopo local (src: link )

- tmp='%~' tmp é uma variável igual à string '% ~' que se refere ao diretório $ HOME (mas por que decompor a próxima variável com essa?)

- HPWD=${(%)tmp} HPWD é uma variável, tem algo a ver com pwd (print working directory), e é igual a algo com a variável anterior dentro, mas eu não sei qual é o significado de um sinal de dólar antes de algo entre colchetes

- if [[ $TERM == screen* ]]; then printf se a tela do software estiver em execução e, em seguida, imprimir

- '\ek%s\e\' sem ideia ...

(e como é que esse ecrã está a ouvir este script?)

    
por hugogogo 23.07.2018 / 19:15

1 resposta

1

Isso é ${(flag)tmp} onde (flag) são sinalizadores de expansão de parâmetro (consulte info zsh 'flags, parameter expansion' . O sinalizador de expansão do parâmetro % ativa a expansão do prompt após a expansão do a variável $tmp .

%~ na expansão de prompts se expande para os diretórios de trabalho atuais, mas com itens como /home/you foram substituídos por ~ .

Note que você não precisa da variável temporária, você pode fazer ${(%):-%~} ou até mais simples:

print -Pn '\ek%~\e\'

Onde a opção -P de print também ativa a expansão de prompt (consulte info zsh print ).

Observe que, em vez de usar precmd , você também pode adicionar essa string diretamente ao seu prompt:

PROMPT=$'%{\ek%~\e\%}$ '

␛kTITLE␛\ é uma seqüência de escape reconhecida pela tela GNU para definir o título. Veja info screen -n 'Dynamic Titles' para detalhes.

    
por 23.07.2018 / 23:56