Điều này là do thiết bị đầu cuối chuyển các sự kiện X thành các chuỗi thoát như sau:
<F1> -> ^[OP
<F2> -> ^[OQ
<F3> -> ^[OR
<F4> -> ^[OS
<F5> -> ^[[15~
<F6> -> ^[[17~
và như vậy ( ^[
là một nhân vật thoát). Trong một số thiết bị đầu cuối, vim có thể nhận được các chuỗi này từ cơ sở dữ liệu terminfo, nhưng đôi khi cơ sở dữ liệu terminfo không khớp với các ký tự thực sự gửi hoặc không chứa key_f*
các mục. Trong trường hợp này, nhấn <F1>
sẽ dẫn đến thoát (thoát khỏi chế độ hiện tại trừ khi ở chế độ bình thường), O
(ở chế độ bình thường: tạo một dòng mới trước dòng con trỏ và vào chế độ chèn) và một số ký tự được chèn trên dòng mới (và cho <F5>-...
Phím ~
là lệnh đảo ngược trường hợp). Bạn có thể sửa nó bằng cách đưa vào vimrc một cái gì đó như thế
" Condition should identify terminal in question so "
" that it won't change anything for terminals without this problem "
if !has("gui_running") && $TERM is "xterm"
for [key, code] in [["<F1>", "\eOP"],
\["<F2>", "\eOQ"],
\["<F5>", "\e[15~"],
\]
execute "set" key."=".code
endfor
endif
Nếu mã của bạn khác với mã mà tôi đã sử dụng làm ví dụ, hãy sử dụng <C-v><F1>
(trong chế độ chèn hoặc dòng lệnh) để lấy nội dung mà thiết bị đầu cuối của bạn đang gửi (thêm thông tin :h i_CTRL-V
).