Выходной клеммный разъем Pushdown

Выходной клеммный разъем Pushdown

Существует ли стандартный способ изменить порядок вывода терминала, а именно:

~/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?

решение1

В 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.

решение2

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

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

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

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

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

Это изменило бы порядок строк в выводе команды, так что остальной контент тоже выскочил бы в обратном порядке. Если вы хотите, чтобы команды (например: ls, cat) запускались "вниз", а подсказки двигались "вверх", жизнь становится сложнее.

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

решение3

Хотя это не полностью изменит вывод, но ваше приглашение останется наверху:

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

Связанный контент