Saída do terminal pushdown

Saída do terminal pushdown

Existe uma maneira padrão de reverter a ordem de saída de uma saída terminal, ou seja:

~/Developer $ command0 
-bash: comman0: command not found 
~/Developer $ command2 
-bash: command2: command not found 
~/Developer $ command3 
-bash: command3: command not found 
~/Developer $ 

seria exibido como:

~/Developer $ 
-bash: command3: command not found 
~/Developer $ command3 
-bash: command2: command not found 
~/Developer $ command2 
-bash: comman0: command not found 
~/Developer $ comman0

Acho que sempre ter seu prompt na parte inferior é contra-intuitivo. Uma maneira mais eficaz de apresentar a saída seria inverter a ordem de saída. Como posso implementar isso? Especificamente, onde é definida a parte de saída do programa do terminal OSX?

Responder1

No bash, isso exibirá o prompt/comando atual na parte superior e sua saída abaixo, mas sem rolagem ou comandos anteriores:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1'

Esta função colocará os comandos anteriores abaixo, mas você terá que canalizar cada comando para ela individualmente. Infelizmente, exec > >(f)não posso ajudar com isso, pois redireciona todo o bash, não comandos individuais. Aqui está a função:

f () { tee ~/.STDIN | wc -l | xargs expr 1 + | xargs tput il && cat ~/.STDIN; }

Em seguida, execute todos os comandos como:

command args |f

Ele salva a saída, cria um número de linhas em branco igual ao comprimento + 1 e, em seguida, coloca a saída de volta. Você pode marcar uma linha no final que exibirá um prompt falso ou uma regra horizontal, se desejar. Por exemplo

printf '%*s' $COLUMNS | tr ' ' _;

Como uma alternativa ruim, mas automática, para toda essa coisa de função, podemos adicionar um comando ao final do nosso $PROMPT_COMMAND anterior que limpa 11 linhas um tanto arbitrárias:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1; tput il 11'

Você também pode usar tput -Spara evitar múltiplas chamadas binárias.


Eu peguei o $PROMPT_COMMANDdehttps://github.com/swirepe/alwaysontop.

Responder2

Infelizmente, isso será bastante difícil. O protocolo entre os aplicativos e o terminal OS-X é uma variante doVT100/ANSIprotocolo de controle de terminal, especificamente oXtermoprotocolo.

Isso inclui um monte de suposições sobre a posição da tela, etc., que seriam um desafio para remapear para um mundo onde a exibição fosse invertida.

Pior ainda, tudo o que o seu emulador de terminal obtém é uma sequência de comandos do tipo "coloque este caracter nesta posição". Não há distinção entre o prompt de comando e a saída de um comando executado por ele, então você não pode fazer nada para ambas as partes - pelo menos, não sem a cooperação do shell abaixo.

O shell e os programas assumem que a tela sobe - novos dados na parte inferior e continua descendo para sempre.

Você poderia, pelo menos teoricamente, modificar seu emulador de terminal para exibir as linhas na ordem inversa - a linha "inferior" primeiro e assim por diante até a linha "superior" na parte inferior da tela.

Isso inverteria a ordem das linhas na saída do comando, de modo que o restante do conteúdo também apareceria ao contrário. Se você quiser que os comandos (por exemplo: ls, cat) sejam executados "para baixo", mas os prompts para moverem "para cima", a vida será mais difícil.

Não conheço nenhum software que implemente isso. (...mas veja o comentário do JdeBD sobre isso para obter um link para um.) :)

Responder3

Embora isso não reverta exatamente a saída, manterá seu prompt no topo:

https://github.com/swirepe/alwaysontop

Para usá-lo execute:

git clone https://github.com/swirepe/alwaysontop.git
cd alwaysontop/
source alwaysontop.sh

Se você decidir que gosta, basta colocá-lo em seu .bash_profile com algo como:

echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile

informação relacionada