Como eu faço o título da janela do Xterm alternar entre o comando atual em execução e o caminho atual?

4

Eu quero definir o título da janela do Xterm para alternar entre dois estados:

  • Quando um comando está em execução, mostre o nome do comando (por exemplo, "menos")
  • Quando nenhum comando está em execução, mostre o caminho atual (por exemplo, "src")

Eu posso criar um título de janela do Xterm com o caminho atual com:

$ export PROMPT_COMMAND='echo -ne "3]0;'basename ${PWD}'
$ trap 'echo -ne "3]0;$BASH_COMMAND
$ export PROMPT_COMMAND='echo -ne "3]0;'basename ${PWD}'
$ trap 'echo -ne "3]0;$BASH_COMMAND%pre%7"' DEBUG
7"'
7"' DEBUG
7"'

E posso mostrar o comando de execução atual adicionando um trap declaração para .bashrc :

%pre%

Mas não consigo alternar automaticamente entre os dois. É possível?

EDITAR: @ terdon mostra uma solução que funciona em um xterm regular, isso é legal! Mas eu não mencionei que eu uso o MacOSX Terminal.app. Isso mostra ainda mostra "bash" em vez do caminho atual quando nenhum comando está sendo executado. Com um pouco de mexer Eu descobri como resolver isso .

    
por neu242 20.09.2013 / 10:34

2 respostas

1

Percebi que o MacOSX Terminal.app não lê. bashrc . Com alguma ajuda em como extrair a primeira palavra de uma string e um pouco de ajustes, eu ajustei @ excelente resposta do Terdon adicionando o seguinte ao .bash_profile :

trap 'echo -ne "3]0;${BASH_COMMAND%% *}
trap 'echo -ne "3]0;${BASH_COMMAND%% *}%pre%7"' DEBUG

function show_name { 
    if [[ -n "$BASH_COMMAND" ]]; then
      echo -en "3]0;'basename ${PWD}'%pre%7"
    fi 
}
export PROMPT_COMMAND='show_name'
7"' DEBUG function show_name { if [[ -n "$BASH_COMMAND" ]]; then echo -en "3]0;'basename ${PWD}'%pre%7" fi } export PROMPT_COMMAND='show_name'

Voila! Funciona como um encanto.

    
por 24.09.2013 / 09:31
2

Você pode fazer isso se usar uma função que verifique se $BASH_COMMAND está definido e imprime sua CWD, se não estiver. Adicione estas linhas ao seu ~/.bashrc :

trap 'echo -ne "3]0;$BASH_COMMAND
case $TERM in
    xterm*)
      preexec () {
        print -Pn "\e]0;$*\a"
      }
    ;;
esac
7"' DEBUG function show_name(){ if [[ -n "$BASH_COMMAND" ]]; then echo -en "3]0;'pwd'
trap 'echo -ne "3]0;$BASH_COMMAND
case $TERM in
    xterm*)
      preexec () {
        print -Pn "\e]0;$*\a"
      }
    ;;
esac
7"' DEBUG function show_name(){ if [[ -n "$BASH_COMMAND" ]]; then echo -en "3]0;'pwd'%pre%7"; else echo -en "3]0;$BASH_COMMAND%pre%7"; fi } export PROMPT_COMMAND='show_name'
7"; else echo -en "3]0;$BASH_COMMAND%pre%7"; fi } export PROMPT_COMMAND='show_name'

Isso fará com que o nome do seu terminal seja o comando atualmente em execução (se houver um) ou seu diretório atual, se não houver. Tenha em mente que isso resultará em um terminal ligeiramente esquizofrênico se você executar um loop longo que executa um comando várias vezes. Experimente com while true; do echo foo; done , por exemplo.

Se você estiver usando zsh , isso é muito mais fácil de alcançar ( fonte ) e ele é compatível loops corretamente:

%pre%     
por 21.09.2013 / 19:52