Tôi không có sẵn máy Mac để kiểm tra câu trả lời này, nhưng thỉnh thoảng tôi gặp vấn đề này trong XTerm trong Linux và (giả sử iTerm2 tôn trọng các mã kiểm soát tương tự) bạn có thể thấy cách khắc phục dưới đây hữu ích.
Chạy lệnh shell sau bên trong terminal khi bạn gặp sự cố:
printf "\e[?1004l"
(Lưu ý rằng ký tự cuối cùng có chữ 'ell' viết thường.)
Chuỗi điều khiển ANSI này giống như chuỗi được liệt kê trong câu trả lời của Thomas Dickey, nhưng nó tắt tính năng này (thay vì bật). Nó sẽ giải quyết vấn đề của bạn trong tất cả các ứng dụng, không chỉ Vim, bằng cách ngăn chặn các ký tự xảy ra.
Trên Linux tôi có thể chứng minh chuỗi điều khiển này hoạt động với các bước sau:
- Chạy
xterm
và kích hoạt tính năng bằng cách chạy printf "\e[?1004h"
trong nó.
- Chạy
xeyes
hoặc một số ứng dụng GUI khác từ cùng đó . (Vì một số lý do, hiệu ứng này không xảy ra với tôi cho đến khi XTerm trong câu hỏi khởi chạy một ứng dụng. Có ai biết tại sao không?)
- Liên tục chuyển trọng tâm vào và ra khỏi Xterm gốc (ví dụ: bằng cách nhấp vào cửa sổ) và xem
^[[O
và ^[[I
được "nhập" vào Xterm gốc.
- Bây giờ hãy đóng Xeyes, quay trở lại Xterm gốc và chạy
printf "\e[?1004l"
(để tắt tính năng này, như được mô tả trong bản sửa lỗi ở trên).
- Lặp lại các bước " chạy
xeyes
, chuyển trọng tâm " ở trên, nhưng lần này không thấy ký tự nào được nhập trong thiết bị đầu cuối.
Cá nhân tôi chỉ thấy vấn đề này nếu tôi vô tình đổ đầu ra nhị phân vào thiết bị đầu cuối, nhưng nếu bạn gặp phải nó thường xuyên hơn, bạn có thể muốn thêm nó printf
vào tập lệnh khởi động tương tác của shell (ví dụ ~/.bashrc
). Dường như không có bất kỳ tác hại nào (ít nhất là dưới Xterm) khi gửi mã điều khiển nếu tính năng này đã bị vô hiệu hóa, vì vậy nó sẽ an toàn ngay cả khi đôi khi bạn chỉ gặp vấn đề này.
Nếu bạn lo lắng về trình bao của mình luôn tạo ra đầu ra đó, có lẽ vì đôi khi bạn sử dụng nó ở những nơi không xử lý tốt các mã kiểm soát đó hoặc nếu vấn đề đôi khi được kích hoạt sau khi trình bao khởi động, thì bạn có thể muốn đặt lên một bí danh (ví dụ với alias focusfix='printf "\e[?1004l"'
) để thuận tiện hơn khi chạy thủ công.