Tema terminal saya dulu seperti ini,
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_exec
fungsi.
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,
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
zsh
...for i in $(seq 1 10); do ls; done
dengan 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:
Pertama
preexec_invoke_exec
harus dimodifikasi untuk mencegah beberapa eksekusipreexec
. Juga, modifikasipreexec
untuk memperhitungkan jumlah baris aktual di$PS1
:Agar
preexec
dapat dijalankan kembali,DONTCLEANPROMPT
harus disetel atau disetel ke''
. Ini dilakukan denganPROMPT_COMMAND
, yang dijalankan sesaat sebelum perintah utama dikeluarkan. Karena itupreexec
akan dijalankan sekali dan hanya sekali untuk setiap baris perintah.sumber
for
loop! Terima kasih! Ada ketidaknyamanan lebih lanjut. Apa yang terjadi adalah bahwa jika Anda melakukanls
pada perintah dan Anda memiliki output, maka Anda melakukan yang lainls
, Anda akan melihat bahwa baris terakhir dari output sebelumnya terhapus ... apakah Anda punya ide bagaimana menyelesaikannya?prexec
menjadi 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.