Điều gì gây ra hành vi
Khi bạn nhấn mũi tên trái, thiết bị đầu cuối của bạn sẽ gửi chuỗi thoát sau:
ESC O D
Điều này cũng có thể được ký hiệu là, ký hiệu ^[OD
ở đâu , đó là một cách khác để ghi chú hoặc nhập ký tự ESC. (Hãy thử nó trong chế độ chèn!)^[
Ctrl-[
Vim không nhận ra đây là một chuỗi thoát, và do đó, nó đang đối xử với những tổ hợp phím đó như thể bạn đã tự gõ chúng ra:
- Esc: Để chế độ chèn,
- O: Bắt đầu một dòng mới phía trên con trỏ và vào chế độ chèn,
- D: Nhập ký tự 'D'.
Bạn có thể xác nhận rằng đây là những gì thiết bị đầu cuối của bạn đang gửi bằng cách vào chế độ chèn và sau đó nhấn Ctrl-Vtheo sau là Leftmũi tên.
Có chuyện gì thế
Trình tự thoát có thể hết thời gian
Cách duy nhất mà Vim có thể phân biệt chuỗi thoát với ba ký tự được nhập thủ công là vào thời gian xảy ra giữa lúc nhận từng ký tự. Do đó, có thể trên các thiết bị đầu cuối chậm hoặc các hệ thống rất bận rộn có đủ độ trễ giữa mỗi ký tự mà Vim đang quyết định đó không phải là một chuỗi thoát và chỉ diễn giải các tổ hợp phím như được mô tả ở trên.
Điều này được mô tả trong :help vt100-cursor-keys
và hơn nữa :help timeout
- giải pháp được đề xuất là đặt một mức đủ lớn ttimeoutlen
, nhưng vô hiệu hóa hoàn toàn thời gian chờ bằng cách đặt cả hai notimeout
và nottimeout
cũng sẽ hoạt động.
Tuy nhiên, với thiết lập của bạn, điều này dường như không phải là vấn đề.
Vim không nhận ra chuỗi
Có nhiều khả năng vấn đề là Vim không nhận ra chuỗi thoát được gửi và do đó, diễn giải nó là tổ hợp phím. Bạn có thể kiểm tra điều này bằng lệnh sau:
:set <left>?
Trong một thiết lập làm việc với cấu hình thiết bị đầu cuối hiện tại của bạn, điều này sẽ cung cấp một trong các đầu ra sau:
t_kl <Left> ^[O*D
t_kl <Left> ^[OD
Nếu bạn thấy bất cứ điều gì khác 1 , thì Vim và thiết bị đầu cuối của bạn không hoàn toàn nói cùng một ngôn ngữ.
Cách chính xác để khắc phục điều này là sửa cấu hình thiết bị đầu cuối của bạn để cơ sở dữ liệu terminfo của bạn báo cáo các chuỗi thực sự được gửi khi bạn nhấn các phím mũi tên, nhưng làm như vậy có thể phức tạp. Một sửa chữa hơi khó khăn là thay đổi những gì thiết bị đầu cuối của bạn gửi để phù hợp với những gì Vim đang mong đợi. Tôi suy luận từ nhận xét của bạn rằng bạn đang sử dụng Mac Terminal.app mặc định: Bạn có thể thay đổi chuỗi thoát nào được gửi cho mỗi lần nhấn phím trong Tùy chọn → Cấu hình → Hồ sơ của bạn → Bàn phím.
Tuy nhiên, cách khắc phục dễ dàng nhất có lẽ là thông báo trực tiếp cho Vim những chuỗi thoát nào được mong đợi. Bạn có thể làm điều này bằng cách đặt các tùy chọn đầu cuối của nó, do đó:
set <up>=^[OA
set <down>=^[OB
set <right>=^[OC
set <left>=^[OD
Lưu ý rằng ^[
ở trên là một ESC
nhân vật theo nghĩa đen . Bạn không thể chỉ cần gõ ^theo sau [! Cách dễ nhất để nhập ánh xạ là nhập vd
set <left>=
và sau đó, vẫn ở chế độ chèn, nhấn Ctrl-Vtheo sau là leftmũi tên. Lưu ý rằng sau đó bạn đang đặt chuỗi thoát trực tiếp tới những gì Vim nhận được khi bạn nhấn phím mũi tên ... bằng cách gửi chuỗi đó!
1: Một khả năng có thể là trình tự CSI :^[[D