Очистіть старі рядки підказок у bash, щоб заощадити місце прокрутки


11

Моя тема терміналу раніше була такою,

термінал їх раніше

Але я думав, що підказка витрачає стільки місця. А згодом у мене з’явилося уявлення, що я можу прибирати підказку кожного разу, коли виконую команду. Я використовував 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 трюк Glyph Lefkowitz - приємно!

2
Найпростіше рішення починається з zsh
Жил "SO - перестань бути злим"

Я пропустив ваше запитання там ...
David Hoelzer

@DavidHoelzer Добре, якщо ви займаєтесь for i in $(seq 1 10); do ls; doneйого функцією, вихід команд ітерації стає «проковтнутим», так би мовити. Тож ОП хотіла санітувати поведінку, вмикаючи це. Причиною, чому я підтримую це, є інтерес до обізнаності в оболонці, зручності використання, зворотного зв'язку та портативності. Посилання, яке я виклав у своєму попередньому коментарі, веде до публікації про суперпользователя - вони вирішили приписати цей фрагмент, тому це прототип, який імітує нативну функціональність zsh (що, на мою думку, цікаве), у вигляді функції пастки тут.

Відповіді:


3

Спочатку preexec_invoke_execслід змінити, щоб запобігти багаторазовому виконанню preexec. Також змініть, preexecщоб врахувати фактичну кількість рядків у $PS1:

preexec () { 
    # delete old prompt; one "\e[1A\e[K" per line of $PS1
    for (( i=0, l=$(echo -e $PS1 | wc -l) ; i < l ; i++ ))
    do             
        echo -ne "\e[1A\e[K"
    done
    # replacement for prompt
    echo -ne "\e[31;1m$ \e[0m"
    echo -n "$1"
    echo -ne "  \e[37;2m["
    echo -n "$2"
    echo -e "]\e[0m"
}

preexec_invoke_exec () {
    [ -n "$DONTCLEANPROMPT" ] && return
    DONTCLEANPROMPT=x
    [ -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

PROMPT_COMMAND='unset DONTCLEANPROMPT'

Для того, preexecщоб запустити його знову, DONTCLEANPROMPTйого слід або зняти, або встановити на ''. Це робиться за допомогою PROMPT_COMMAND, який запускається безпосередньо перед видачею первинного запиту. Тому preexecбуде запускатися один раз і лише один раз для кожного командного рядка.


Ваше рішення вирішує проблему з forциклом! Дякую! Подальша незручність є. Що трапляється так, що якщо ви виконаєте lsкоманду і у вас є вихід, ви зробите інший ls, ви побачите, що останній рядок попереднього виводу стирається ... чи маєте ви уявлення, як це вирішити?

1
Ви, ймовірно, використовуєте підказку лише з одним рядком. Змініть перший відлуння prexecна друк "\033[1A\033[K\033[31;1m$ \033[0m", тобто лише одне \033[1A\033[K(перемістіть 1 рядок вгору, видаліть до кінця рядка) замість двох.
Adaephon

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