Saída do Terminal de Empilhamento

15

Existe uma maneira padrão de reverter a ordem de saída de uma saída do 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

Eu sinto que sempre ter sua solicitação na parte inferior é contra-intuitiva, uma maneira mais eficaz de apresentar a saída seria inverter a ordem de saída. Como posso implementar isso? Especificamente em que parte da saída do programa do terminal OSX foi definida?

rudolph9
fonte
Isso me confundiria, mas aplaudo seus esforços. Uma das principais lições do linux / unix / código aberto é que o tamanho único não serve para todos.
precisa
Eu acho que isso não é possível, a menos que você altere o código fonte do shell (por exemplo bash).
Renan
5
Você precisaria hackear mais do que apenas o shell. Os terminais têm rolado dessa maneira desde que eram eletromecânicos. No mínimo, eu diria que você precisaria invadir um emulador de terminal, talvez também um shell.
Alexios
Isso é realmente contra-intuitivo. Você notou a seta da tecla ENTER? Aponta para a linha abaixo, não acima.
dresende
Existe uma maneira de pegar os itens de saída de um terminal, meu pensamento é criar algum tipo de invólucro que agarra cada um desses itens de saída, trata cada um deles de maneira semelhante à maneira como os tweets são postados com o mais novo sempre aparecendo no topo e colando o prompt de entrada na parte superior da interface do usuário do Wrapper.
Rudolph9

Respostas:

6

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á comandos anteriores abaixo, mas você precisará canalizar todos os comandos individualmente. Infelizmente, exec > >(f)não posso ajudar com isso, pois ele 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 iguais ao comprimento + 1 e coloca a saída novamente. Você pode marcar uma linha no final que exibirá um prompt falso ou regra horizontal, se desejar. Por exemplo

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

Como uma alternativa ruim, mas automática, para toda essa função, podemos adicionar um comando ao final de 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 várias chamadas binárias.


Eu tenho a $PROMPT_COMMANDpartir https://github.com/swirepe/alwaysontop .

Tommy Jollyboat
fonte
6

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

Isso inclui um monte de suposições sobre a posição da tela, etc., que seriam difíceis de remapear para um mundo em que a exibição foi revertida.

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

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

Você poderia, pelo menos teoricamente, modificar o 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 reverteria a ordem das linhas na saída do comando, portanto, o restante do conteúdo também retornaria. Se você deseja que os comandos (por exemplo, sl, cat) sejam executados "abaixo", mas solicite a subida, a vida é 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.) :)

Daniel Pittman
fonte
Eu faço. (-:
JdeBP 27/08/18
5

Embora isso não inverta exatamente a saída, ele 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 fonte-lo no seu .bash_profile com algo como:

echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile
ryanpcmcquen
fonte
1
Isso é um pouco complicado (por exemplo, com preenchimento automático de guias e histórico), mas é uma demonstração muito boa de como seria essa interface do usuário se ela fosse implementada corretamente. Eu acho que é valioso por isso - ajudar as pessoas a saber se elas querem ou não!
usar o seguinte código