Uscita terminale pushdown


15

Esiste un modo standard per invertire l'ordine di uscita di un'uscita terminale, ovvero:

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

sarebbe visualizzato come:

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

Sento che avere sempre il tuo prompt in fondo è contro intuitivo, un modo più efficace di presentare l'output sarebbe quello di invertire l'ordine di output. Come potrei fare per implementarlo? In particolare, dove è stata definita la parte di output del programma terminale OSX?


Questo mi confonderebbe, ma apprezzo i tuoi sforzi. Una delle principali lezioni di Linux / Unix / Open Source è che One Size non si adatta a tutti.
Bruce Ediger,

Penso che questo non sia affatto possibile se non si modifica il codice sorgente della shell (ad es bash.).
Renan,

5
Dovresti hackerare più di una semplice shell. I terminali scorrevano in questo modo da quando erano elettromeccanici. Per lo meno, direi che dovresti hackerare un emulatore di terminale, forse anche una shell.
Alexios,

Questo è in realtà contro intuitivo. Hai notato la freccia del tasto INVIO? Punta alla linea in basso, non in alto.
dresende,

C'è un modo per afferrare gli oggetti in uscita da un terminale, il mio pensiero è quello di creare una sorta di wrapper che afferri ciascuno di questi elementi in uscita, li tratti ciascuno in modo simile a come i tweet sono pubblicati con il più recente sempre visualizzato in cima e incollare il prompt di input nella parte superiore dell'interfaccia utente del wrapper.
rudolph9,

Risposte:


6

In bash questo mostrerà il prompt / comando corrente in alto e il suo output in basso, ma senza scorrimento o comandi precedenti:

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

Questa funzione inserisce i comandi precedenti di seguito, ma è necessario reindirizzare singolarmente tutti i comandi. Sfortunatamente, exec > >(f)non posso farci niente poiché reindirizza l'intero comando bash, non i singoli comandi. Ecco la funzione:

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

Quindi eseguire ogni comando come:

command args |f

Salva l'output, crea un numero di righe vuote pari alla lunghezza + 1, quindi reinserisce l'output. È possibile taggare una riga alla fine che visualizzerà un prompt falso o una regola orizzontale, se lo si desidera. Per esempio

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

Come un'alternativa schifosa ma automatica a tutta questa funzione, possiamo aggiungere un comando alla fine della nostra precedente $ PROMPT_COMMAND che cancella 11 righe in qualche modo arbitrarie:

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

È inoltre possibile utilizzare tput -Sper evitare più chiamate binarie.


Ho preso il $PROMPT_COMMANDda https://github.com/swirepe/alwaysontop .


6

Sfortunatamente, questo sarà abbastanza difficile. Il protocollo tra le applicazioni e il terminale OS-X è una variante del protocollo di controllo del terminale VT100 / ANSI , in particolare il protocollo XTerm .

Ciò include una serie di ipotesi sulla posizione dello schermo, ecc., Che sarebbe difficile rimappare in un mondo in cui il display è stato invertito.

Ancora peggio, tutto ciò che l'emulatore di terminale ottiene è una stringa di comandi di tipo "metti questo personaggio in questa posizione". Non viene fatta alcuna distinzione tra il prompt dei comandi e l'output di un comando eseguito da esso, quindi non è possibile eseguire alcuna operazione per entrambe le parti, almeno non senza la collaborazione della shell sottostante.

La shell e i programmi presumono che lo schermo proceda verso l'alto - nuovi dati nella parte inferiore e proseguano verso il basso per sempre.

Almeno in teoria potresti avere l'emulatore di terminale modificato in modo da visualizzare le linee in ordine inverso: prima la linea "inferiore", e così via fino alla linea "superiore" nella parte inferiore dello schermo.

Ciò invertirebbe l'ordine delle righe nell'output del comando, quindi anche il resto del contenuto uscirà all'indietro. Se vuoi che i comandi (es: ls, cat) corrano "giù" ma ti chiedono di spostare "su" la vita è più difficile.

Non conosco alcun software che lo implementa. (... ma vedi il commento di JdeBD a questo per un link ad uno.) :)



5

Anche se questo non annullerà esattamente l'output, manterrà il tuo prompt in alto:

https://github.com/swirepe/alwaysontop

Per usarlo eseguire:

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

Se decidi che ti piace, procuralo nel tuo .bash_profile con qualcosa del tipo:

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

1
Questo è un po 'difettoso (ad esempio con il completamento automatico delle tabulazioni e la cronologia) ma è un'ottima dimostrazione di come potrebbe essere l'interfaccia utente se implementata correttamente. Penso che sia prezioso per questo - aiutare le persone a sapere se lo vorrebbero o no!
scipilot,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.