Моя терминальная тема была такой,
Но я думал, что приглашение потратило столько времени. И позже мне пришла в голову мысль, что я могу очищать подсказку каждый раз, когда запускаю команду. Я использовал Bash, одним из решений является использование preexec_invoke_exec
функции.
Я использую следующую команду для очистки последних символов приглашения:
echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"
Так что терминал очень чистый, вот так,
Но теперь моя проблема в том, что возникнет проблема, если я захочу использовать несколько команд в одной строке , скажем, при использовании for i in ...
.
Вот полная версия функции в моем .bashrc,
preexec () { echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"; echo -n "$1"; echo -ne " \033[37;2m["; echo -n "$2"; echo -ne "]\033[0m\n"; }
preexec_invoke_exec () {
[ -n "$COMP_LINE" ] && return # do nothing if completing
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
local this_pwd=`pwd`;
preexec "$this_command" "$this_pwd"
}
trap 'preexec_invoke_exec' DEBUG
zsh
...for i in $(seq 1 10); do ls; done
с его функцией, вывод итерационных команд, так сказать, «проглатывается». Таким образом, OP захотел обезопасить поведение, включив эту подсказку. Причина, по которой я поддерживаю это, - интерес к осведомленности в оболочке, удобство использования, обратная связь и переносимость. Ссылка, которую я поместил в своем предыдущем комментарии, ведет к сообщению о суперпользователе - они столкнулись с проблемой приписывания этого фрагмента, так что это прототип, который эмулирует встроенную функциональность zsh (что я считаю интересным) в форме функции прерывания Вот.Ответы:
Сначала
preexec_invoke_exec
нужно изменить, чтобы предотвратить многократное выполнениеpreexec
. Также измените,preexec
чтобы учесть фактическое количество строк в$PS1
:Для
preexec
повторного запускаDONTCLEANPROMPT
должен быть либо не установлен, либо установлен на''
. Это делается с помощью командыPROMPT_COMMAND
, которая запускается непосредственно перед выдачей основного приглашения. Поэтомуpreexec
будет выполняться один и только один раз для каждой командной строки.источник
for
цикла! Спасибо! Есть еще одно неудобство. Что происходит, если вы выполняетеls
команду и у вас есть вывод, а затем другойls
, вы увидите, что последняя строка предыдущего вывода стирается ... у вас есть идея, как решить эту проблему?prexec
на печать"\033[1A\033[K\033[31;1m$ \033[0m"
, то есть только один\033[1A\033[K
(переместите 1 строку вверх, удалите до конца строки) вместо двух.