Wciśnij wyjście terminala

16

Czy istnieje standardowy sposób odwrócenia kolejności wyjściowej danych wyjściowych terminala, tj .:

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

będzie wyświetlany jako:

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

Wydaje mi się, że zawsze wyświetlenie monitu na dole jest sprzeczne z intuicją, co jest bardziej skutecznym sposobem prezentacji wyjścia, aby odwrócić kolejność wyjściową. Jak mogę to zrobić? W szczególności, gdzie zdefiniowano część wyjściową programu terminalowego OSX?

rudolph9
źródło
To by mnie pomyliło, ale pochwalam twoje wysiłki. Jedną z głównych lekcji linux / unix / open source jest to, że jeden rozmiar nie pasuje do wszystkich.
Bruce Ediger,
Myślę, że nie jest to w ogóle możliwe, chyba że zmienisz kod źródłowy powłoki (np bash.).
Renan,
5
Musisz zhakować coś więcej niż tylko skorupę. Terminale przewijają się w ten sposób, ponieważ są elektromechaniczne. Przynajmniej powiedziałbym, że będziesz musiał zhakować emulator terminala, może także powłokę.
Alexios
Jest to w rzeczywistości sprzeczne z intuicją. Czy zauważyłeś strzałkę klawisza ENTER? Wskazuje linię poniżej, a nie powyżej.
dresende,
Czy istnieje sposób na pobranie elementów wyjściowych umieszczonych z terminala, moim pomysłem jest stworzenie pewnego rodzaju opakowania, które chwyta każdy z tych wyjściowych elementów, traktuje każdy z nich podobnie do tego, w jaki sposób tweety są publikowane z najnowszą zawsze wyświetlaną na górze i przyklejanie monitu o wprowadzenie w górnej części interfejsu użytkownika opakowania.
rudolph9

Odpowiedzi:

6

W bash wyświetli to bieżące polecenie / polecenie u góry, a jego wynik poniżej, ale bez przewijania lub poprzednich poleceń:

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

Ta funkcja umieści poprzednie polecenia poniżej, ale musisz przypisać do nich każde polecenie osobno. Niestety, exec > >(f)nic na to nie poradzę, ponieważ przekierowuje cały bash, a nie poszczególne polecenia. Oto funkcja:

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

Następnie uruchom każde polecenie, takie jak:

command args |f

Zapisuje dane wyjściowe, tworzy liczbę pustych linii równych długości + 1, a następnie ponownie umieszcza dane wyjściowe. Możesz oznaczyć linię na końcu, która wyświetli fałszywy monit lub regułę poziomą, jeśli chcesz. Na przykład

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

Jako bzdura, ale automatyczna alternatywa dla tej całej funkcji, możemy dodać polecenie na końcu naszego wcześniejszego $ PROMPT_COMMAND, który usuwa nieco dowolne 11 linii:

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

Możesz także użyć, tput -Saby uniknąć wielu połączeń binarnych.


Mam $PROMPT_COMMANDod https://github.com/swirepe/alwaysontop .

Tommy Jollyboat
źródło
6

Niestety będzie to dość trudne. Protokół między aplikacjami a terminalem OS-X jest odmianą protokołu kontroli terminala VT100 / ANSI , w szczególności protokołu XTerm .

Obejmuje to szereg założeń dotyczących położenia ekranu itp., Których mapowanie do świata, w którym wyświetlanie zostało odwrócone, byłoby trudne.

Co gorsza, wszystko, co dostaje emulator terminala, to ciąg poleceń typu „postaw ten znak w tej pozycji”. Nie ma rozróżnienia między wierszem polecenia a wynikiem działania uruchomionego przez niego polecenia, więc nie można zrobić jednej rzeczy dla obu części - przynajmniej nie bez współpracy powłoki poniżej.

Powłoka i programy zakładają, że ekran przesuwa się w górę - nowe dane na dole i przenosi w dół na zawsze.

Mógłbyś, przynajmniej teoretycznie, zmodyfikować emulator terminala, tak aby wyświetlał linie w odwrotnej kolejności - najpierw „dolna” linia, i tak dalej, aż do „górnej” linii na dole ekranu.

Spowodowałoby to jednak odwrócenie kolejności wierszy w danych wyjściowych polecenia, więc reszta treści również wyskakowałaby do tyłu. Jeśli chcesz, aby polecenia (np. Ls, cat) były uruchamiane „w dół”, ale monit o przeniesienie „w górę”, życie jest trudniejsze.

Nie znam żadnego oprogramowania, które to implementuje. (... ale zobacz komentarz JdeBD do tego linku do jednego.) :)

Daniel Pittman
źródło
Ja robię. (-:
JdeBP
6

Chociaż nie będzie to dokładnie odwracało danych wyjściowych, zachowa monit na górze:

https://github.com/swirepe/alwaysontop

Aby go użyć, uruchom:

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

Jeśli uznasz, że Ci się podoba, po prostu pobierz go w pliku .bash_profile za pomocą czegoś takiego:

echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile
ryanpcmcquen
źródło
1
Jest to nieco błędne (np. Z funkcją autouzupełniania tabulatorów i historią), ale jest to bardzo dobra wersja demonstracyjna tego, jak mógłby wyglądać ten interfejs użytkownika, gdyby został poprawnie zaimplementowany. Myślę, że to jest cenne - aby pomóc ludziom wiedzieć, czy tego chcą, czy nie!
scipilot 27.04.17