Вихід терміналу віджимання


16

Чи є стандартний спосіб змінити порядок виводу термінального виходу, тобто:

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

відображатиметься як:

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

Я відчуваю, що завжди ваш запит внизу є протилежним інтуїтивно зрозумілим, більш ефективним способом подання результату було б змінити вихідний порядок. Як я можу йти про це? Зокрема, де визначена частина вихідної програми терміналу OSX?


Це мене бентежить, але я аплодую вашим зусиллям. Щодо основних Linuxsons / unix / з відкритим кодом, те, що один розмір не підходить усім.
Брюс Едігер

Я думаю, що це взагалі неможливо, якщо ви не зміните вихідний код оболонки (наприклад bash).
Ренан

5
Вам потрібно буде зламати більше, ніж просто оболонку. Термінали прокручуються таким чином, оскільки вони були електромеханічними. Принаймні, я б сказав, що вам потрібно зламати термінальний емулятор, можливо, також оболонку.
Олексій

Це насправді протилежне інтуїтивному. Ви помітили стрілку клавіші ENTER? Він вказує на рядок нижче, а не вгорі.
dresende

Чи є спосіб захопити елементи, поставлені з терміналу, я думав створити якусь обгортку, яка захоплює кожен з цих вихідних елементів, розглядає кожен з них аналогічно тому, як твіти розміщуються з найновішими завжди на початку і дотримуючись підказку введення у верхній частині інтерфейсу Wrapper.
rudolph9

Відповіді:


6

У bash це буде відображати поточну підказку / команду вгорі, а її результат внизу, але без прокрутки або попередніх команд:

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

Ця функція дозволить поставити попередні команди нижче, але вам потрібно передавати кожну команду окремо. На жаль, exec > >(f)не вдається допомогти з цим, оскільки він перенаправляє весь bash, а не окремі команди. Ось функція:

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

Потім запустіть кожну команду, як:

command args |f

Він зберігає вихід, створює кількість порожніх рядків, рівних довжині + 1, а потім повертає висновок назад. Ви можете позначити рядок на кінці, який відображатиме підроблений запит або горизонтальне правило, якщо вам це подобається. Напр

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

Як дерьма, але автоматична альтернатива всій цій функції, ми можемо додати команду до кінця нашої попередньої $ PROMPT_COMMAND, яка очищає дещо довільні 11 рядків:

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

Ви також можете використовувати, tput -Sщоб уникнути декількох двійкових дзвінків.


Я отримав це $PROMPT_COMMANDз https://github.com/swirepe/alwaysontop .


6

На жаль, це буде досить складно. Протокол між програмами та терміналом OS-X є варіантом протоколу управління терміналом VT100 / ANSI , зокрема протоколом XTerm .

Це включає в себе купу припущень щодо положення екрана тощо, які будуть складними для перепланування в світ, де дисплей був перевернутий.

Ще гірше, що ваш термінальний емулятор отримує рядок команд типу "поставити цього символу в цю позицію". Не робиться різниці між командним рядком та виведенням команди, яку він виконує, тому ви не можете зробити одне для обох частин - принаймні, не без співпраці з оболонкою під ним.

Оболонка та програми припускають, що екран просувається вгору - нові дані внизу і продовжуються вниз назавжди.

Можна, принаймні теоретично, змінити емулятор терміналу таким чином, щоб він відображав рядки у зворотному порядку - спочатку "нижній" рядок тощо, аж до рядка "верхній" у нижній частині екрана.

Це, однак, змінило б порядок рядків у виведенні команд, тому решта вмісту теж вискочила б назад. Якщо ви хотіли, щоб команди (наприклад: ls, cat) бігали "вниз", але запропонувати рухатися "вгору" життя важче.

Я не знаю жодного програмного забезпечення, яке це реалізує. (... але дивіться коментар JdeBD до цього посилання на одне.) :)



6

Хоча це не буде точно зворотним результатом, він буде тримати ваш рядок у верхній частині:

https://github.com/swirepe/alwaysontop

Щоб використовувати його, виконайте:

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

Якщо ви вирішите, що вам це сподобається, просто надсилайте його у свій .bash_profile з чимось на зразок:

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

1
Це дещо баггі (наприклад, із автоматичним заповненням вкладок та історією), але це дуже хороша демонстрація того, як може виглядати цей інтерфейс, якщо він був належним чином реалізований. Я думаю, що для цього важливо - допомогти людям дізнатися, хотіли б вони це чи ні!
науковець
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.