Cara yang lebih baik untuk membaca garis input pengguna di zsh? (mis. dengan zle?)

11

Zsh's readuntuk beberapa alasan adalah gema ^Mbukannya menerima mereka sebagai <Enter>penekanan tombol. (Jika -ddisetel, maka mereka dikenali sebagai <Enter>milik, tetapi masih digaungkan.) Itu juga tidak mendukung dasar-dasar seperti tombol backspace.

Saya bisa menyiasati ini dengan meretas / menjalankan bash,

> a=$(bash -c 'read -e -p "What would you like to do?: " tmp; echo $tmp')
What would you like to do?: eat cake
> echo $a                                                                
eat cake

tapi saya bertanya-tanya apakah ada cara yang lebih bersih.

Nicholas Tung
sumber
Tidak dapat mengonfirmasi zshpemasangan 4.3.10 yang baru ; % read aberfungsi dengan baik di sini.
user1686
Ini menggunakan iterm pada OS X; readtidak bekerja pada mesin Linux.
Nicholas Tung

Jawaban:

19

Untuk memasukkan satu baris teks dengan nyaman di bawah zsh, gunakan vared. Menggunakan varedalih-alih readmemanggil zle , yang setara dengan meneruskan -ebash untuk memanggil readline.

vared -p 'What would you like to do?: ' -c tmp

Perilaku yang Anda jelaskan dengan polos lebih readterlihat seperti terminal yang tidak terkonfigurasi daripada masalah shell. Jalankan stty -auntuk menunjukkan pengaturan terminal Anda, dan pastikan bahwa eoldiatur ke ^Mdan erasediatur dengan apa yang Backspacedikirimkan kunci Anda . Bergantung pada sistem operasi dan bagaimana pengaturannya dan pada terminal, Backspacemengirimkan salah satu ^Hatau ^?. Pengaturan backspace biasanya salah karena beberapa file konfigurasi yang mencoba mengaturnya secara manual, jadi hal pertama yang harus Anda lakukan adalah melacak dan menghapus kesalahan konfigurasi tersebut. Jika Anda tidak menemukannya, tinjau pengaturan emulator terminal Anda untuk memastikannya tidak diatur ke mode kompatibilitas historis. Jika semuanya gagal, tambahkan sesuatu seperti ini ke ~/.zshrc:

if [[ $(ps -o comm= $PPID) = iterm ]]; then
  stty erase '^?'
fi
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
vared -p 'Apa yang ingin kamu lakukan ?:' -c tmp
zzapper
Keren abis! Tidak tahu tentang varedbuiltin. Ternyata, zshzlehalaman manual pasti layak setidaknya membaca sekilas.
ratijas