Cách tốt hơn để đọc một dòng đầu vào của người dùng trong zsh? (ví dụ với zle?)


11

Zsh readvì một số lý do là tiếng vang ^Mthay vì chấp nhận chúng như <Enter>tổ hợp phím. (Nếu -dđược đặt, thì chúng được nhận dạng <Enter>là, nhưng vẫn lặp lại.) Nó cũng không hỗ trợ những điều cơ bản như phím xóa lùi.

Tôi có thể khắc phục điều này bằng cách hack / chạy 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

Nhưng tôi tự hỏi nếu có một cách sạch hơn.


Không thể xác nhận khi zshcài đặt 4.3.10 mới ; % read ahoạt động tốt ở đây.
dùng1686

Đây là sử dụng iterm trên OS X; readkhông hoạt động trên các máy Linux.
Nicholas Tung

Câu trả lời:


19

Để nhập một dòng văn bản thoải mái dưới zsh, sử dụng vared. Sử dụng varedthay vì readgọi zle , tương đương với việc truyền -evào bash để gọi đường dẫn.

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

Hành vi bạn mô tả với đơn giản readtrông giống như một thiết bị đầu cuối được cấu hình sai chứ không phải là vấn đề vỏ. Chạy stty -ađể hiển thị cài đặt thiết bị đầu cuối của bạn và đảm bảo rằng nó eolđược đặt thành ^Meraseđược đặt thành những gì Backspacekhóa của bạn gửi. Tùy thuộc vào hệ điều hành và cách thiết lập và trên thiết bị đầu cuối, Backspacegửi ^Hhoặc ^?. Cài đặt backspace thường bị sai do một số tệp cấu hình cố gắng đặt thủ công, vì vậy điều đầu tiên bạn nên làm là theo dõi và xóa bất kỳ cấu hình sai nào như vậy. Nếu bạn không tìm thấy, hãy xem lại cài đặt của trình giả lập thiết bị đầu cuối của bạn để kiểm tra xem nó không được đặt ở chế độ tương thích lịch sử nào đó. Nếu vẫn thất bại, hãy thêm một cái gì đó như thế này vào ~/.zshrc:

if [[ $(ps -o comm= $PPID) = iterm ]]; then
  stty erase '^?'
fi

1
vared -p 'Bạn muốn làm gì?:' -c tmp
zzapper

Thật tuyệt! Không biết về varednội dung. Hóa ra, zshzletrang người đàn ông chắc chắn có giá trị ít nhất là lướt qua.
ratijas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.