Bersihkan baris prompt lama di bash untuk menghemat ruang gulir

11

Tema terminal saya dulu seperti ini,

terminal mereka sebelumnya

Tetapi saya pikir bisikan itu membuang banyak ruang. Dan kemudian saya mendapat ide bahwa saya bisa membersihkan prompt setiap kali saya menjalankan perintah. Saya menggunakan bash, salah satu solusinya adalah menggunakan preexec_invoke_execfungsi.

Saya menggunakan perintah berikut untuk membersihkan karakter prompt terakhir:

echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"

Sehingga terminal sangat bersih, seperti ini,

masukkan deskripsi gambar di sini

Tapi sekarang masalah saya adalah, akan ada masalah jika saya ingin menggunakan perintah multi dalam satu baris , katakanlah, ketika saya gunakan for i in ....

Ini adalah versi lengkap dari fungsi di .bashrc saya,

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
Libin Wen
sumber
Glyph Lefkowitz zsh trick - bagus!
2
Solusi mudah dimulai dengan zsh...
Gilles 'SO- stop being evil'
Saya melewatkan pertanyaan Anda di sana ...
David Hoelzer
@ Davidvider Nah jika Anda lakukan for i in $(seq 1 10); do ls; donedengan fungsinya, output dari perintah iterasi akan "ditelan" sehingga untuk berbicara. Jadi OP ingin membersihkan perilaku sambil mengaktifkan prompt itu. Alasan mengapa saya mendukung hal ini adalah minat untuk kesadaran akan shell, kegunaan, umpan balik, dan portabilitas. Tautan yang saya berikan pada komentar saya sebelumnya mengarah ke pos pada pengguna super - mereka pergi ke masalah menghubungkan potongan ini, jadi itu adalah prototipe yang mengemulasi fungsionalitas zsh asli (yang menurut saya menarik), dalam bentuk fungsi perangkap sini.

Jawaban:

3

Pertama preexec_invoke_execharus dimodifikasi untuk mencegah beberapa eksekusi preexec. Juga, modifikasi preexecuntuk memperhitungkan jumlah baris aktual di $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'

Agar preexecdapat dijalankan kembali, DONTCLEANPROMPTharus disetel atau disetel ke ''. Ini dilakukan dengan PROMPT_COMMAND, yang dijalankan sesaat sebelum perintah utama dikeluarkan. Karena itu preexecakan dijalankan sekali dan hanya sekali untuk setiap baris perintah.

Adaephon
sumber
Solusi Anda menyelesaikan masalah dengan forloop! Terima kasih! Ada ketidaknyamanan lebih lanjut. Apa yang terjadi adalah bahwa jika Anda melakukan lspada perintah dan Anda memiliki output, maka Anda melakukan yang lain ls, Anda akan melihat bahwa baris terakhir dari output sebelumnya terhapus ... apakah Anda punya ide bagaimana menyelesaikannya?
1
Anda mungkin menggunakan prompt dengan hanya satu baris. Ubah gema pertama prexecmenjadi cetak "\033[1A\033[K\033[31;1m$ \033[0m", yaitu hanya satu \033[1A\033[K(pindahkan 1 baris ke atas, hapus sampai akhir baris) alih-alih dua.
Adaephon
Sempurna! Terima kasih banyak atas solusi Anda dan meluangkan waktu untuk menjelaskannya. Ini memecahkan masalah OP dan memperdebatkan solusinya lebih jauh. Jadikan itu bisa digunakan untuk semua orang! Bersulang!