Существует ли стандартный способ изменить порядок вывода терминала, а именно:
~/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