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.