Выходной терминал

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?

rudolph9
источник
Это смутило бы меня, но я приветствую ваши усилия. Основным уроком Linux / Unix / Open Source является то, что один размер не подходит всем.
Брюс Эдигер
Я думаю, что это невозможно вообще, если вы не измените исходный код оболочки (например bash).
Ренан
5
Вам нужно взломать больше, чем просто оболочку. Терминалы прокручивались таким образом, так как они были электромеханическими. По крайней мере, я бы сказал, что вам нужно взломать эмулятор терминала, возможно, также оболочку.
Алексиос
Это на самом деле противоречит интуиции. Вы заметили стрелку клавиши ВВОД? Он указывает на строку ниже, а не выше.
Дрезенде
Есть ли способ получить предметы, выведенные из терминала, моя мысль - создать какую-то обертку, которая будет захватывать каждый из этих выходных элементов, обрабатывать каждый из них подобно тому, как размещаются твиты с самыми новыми всегда появляющимися сверху и вставка подсказки ввода в верхней части интерфейса 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 .

Tommy Jollyboat
источник
6

К сожалению, это будет довольно сложно. Протокол между приложениями и терминалом OS-X является вариантом протокола управления терминалом VT100 / ANSI , в частности протокола XTerm .

Это включает в себя множество предположений о положении экрана и т. Д., Которые было бы сложно переназначить в мир, где дисплей был перевернут.

Хуже того, все, что получает ваш эмулятор терминала, это строка команд типа «поставить этот символ в эту позицию». Не делается различий между командной строкой и выводом запускаемой ею команды, поэтому вы не можете сделать что-то одно для обеих частей - по крайней мере, без взаимодействия с оболочкой внизу.

Оболочка и программы предполагают, что экран движется вверх - новые данные внизу и продолжают вниз.

Вы можете, по крайней мере теоретически, изменить свой эмулятор терминала так, чтобы он отображал строки в обратном порядке - сначала «нижняя» строка и т. Д. Вплоть до «верхней» строки в нижней части экрана.

Однако это изменило бы порядок строк в выводе команды, поэтому остальная часть содержимого также выскочила бы назад. Если вы хотите, чтобы команды (например, ls, cat) выполнялись «вниз», но подсказывали «вверх», жизнь сложнее.

Я не знаю никакого программного обеспечения, которое реализует это. (... но посмотрите комментарий JdeBD к этому для ссылки на один.) :)

Даниэль Питтман
источник
Я делаю. (-:
JdeBP
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
ryanpcmcquen
источник
1
Это немного глючит (например, с табуляции автозаполнения и истории), но это очень хорошая демонстрация того, что этот интерфейс может чувствовать, если он был реализован должным образом. Я думаю, что для этого важно - помочь людям узнать, хотят они этого или нет!
scipilot