Tôi chỉ đi đến câu hỏi (1).
Vấn đề của bạn là TỪ KHÓA. Tôi trích dẫn từ zshzle (1):
Khi ZLE đang đọc một lệnh từ thiết bị đầu cuối, nó có thể đọc một chuỗi được ràng buộc với một số lệnh và cũng là tiền tố của một chuỗi ràng buộc dài hơn. Trong trường hợp này, ZLE sẽ đợi một thời gian nhất định để xem nếu có nhiều ký tự được nhập và nếu không (hoặc chúng không khớp với bất kỳ chuỗi nào nữa), nó sẽ thực hiện liên kết. Thời gian chờ này được xác định bởi tham số KEYTIMEOUT; mặc định của nó là 0,4 giây. Không có thời gian chờ nếu chuỗi tiền tố không bị ràng buộc với lệnh.
0,4 giây đó là độ trễ bạn gặp phải sau khi nhấn ESC. Cách khắc phục là đặt KEYTIMEOUT xuống 0,01s trong một trong các tệp khởi động shell:
export KEYTIMEOUT=1
Thật không may, điều này có tác dụng kích thích: Những thứ khác bắt đầu sai
Đầu tiên, bây giờ có một vấn đề trong chế độ lệnh vi: Nhập ESC làm cho con trỏ bị treo, và sau đó bất kỳ ký tự nào bạn nhập tiếp theo sẽ bị nuốt. Điều này là do ESC không bị ràng buộc với bất cứ điều gì theo mặc định trong chế độ lệnh vi, tuy nhiên vẫn có các widget đa ký tự bắt đầu bằng ESC (phím con trỏ!). Vì vậy, khi bạn nhấn ESC, ZLE đợi nhân vật tiếp theo và sau đó tiêu thụ nó.
Cách khắc phục là liên kết ESC với một cái gì đó trong chế độ lệnh, do đó đảm bảo rằng thứ gì đó được chuyển đến ZLE sau $ KEYTIMEOUT centiseconds. Bây giờ chúng ta có thể giữ các ràng buộc bắt đầu với ESC trong chế độ lệnh mà không có các hiệu ứng xấu này. Tôi liên kết ESC với ký tự chuông mà tôi thấy thậm chí ít xâm phạm hơn so với tự chèn (và vỏ của tôi bị tắt tiếng):
bindkey -sM vicmd '^[' '^G'
Cập nhật 2017:
Kể từ đó, tôi đã tìm thấy một giải pháp tốt hơn để ràng buộc ESC - undefined-key
widget. Tôi không chắc liệu tiện ích này có sẵn trong zsh hay không khi tôi viết câu trả lời này.
bindkey -M vicmd '^[' undefined-key
Vấn đề tiếp theo: Theo mặc định, có một số tiện ích hai phím bắt đầu bằng ^ X ở chế độ chèn vi; những thứ này trở nên không sử dụng được nếu $ KEYTIMEOUT được đặt hoàn toàn. Những gì tôi làm là hủy liên kết ^ X ở chế độ chèn vi (theo mặc định là tự chèn); điều này cho phép các vật dụng hai phím đó tiếp tục hoạt động.
bindkey -rM viins '^X'
Bạn mất liên kết để tự chèn, nhưng bạn có thể liên kết nó với một cái gì đó khác tất nhiên. (Tôi không, vì tôi không có sử dụng cho nó.)
Vấn đề cuối cùng (tôi đã tìm thấy cho đến nay): Có một số tổ hợp phím mặc định còn lại mà chúng tôi "mất" do đặt $ KEYTIMEOUT xuống, để wit: những người bắt đầu với ESC ở chế độ chèn vi không phải là phím con trỏ. Cá nhân tôi bắt buộc họ bắt đầu với ^ X thay vào đó:
bindkey -M viins '^X,' _history-complete-newer \
'^X/' _history-complete-older \
'^X`' _bash_complete-word
Cập nhật 2018:
Hóa ra toàn bộ phần trên (sau Cập nhật 2017 2017) không nhất thiết phải có. Có thể đặt khóa META tương đương với ESC trong ánh xạ bàn phím bằng cách sử dụng:
bindkey -mv
Do đó, không thể hủy liên kết ^ X và truy cập các tổ hợp phím bắt đầu trong ESC bằng cách nhấn META làm người lãnh đạo thay thế (ALT hoặc OPT trên bàn phím hiện đại).
Nếu bạn có quyền truy cập vào cuốn sách Từ Bash đến Z Shell của Kiddle và cộng sự, thì sự tương đương của ESC và META trong các phím bấm được thảo luận trong thanh bên Chương 4 trên trang 78.
i
hai lần để quay lại chế độ chèn, tôi rất khuyến nghị cách khắc phục này !