Vim
如何在 gnome-terminal 的 xterm 中修復 vim 中的移位功能鍵?
當我按下
<s-f2>
鍵執行nnoremap <s-f2> :set number!
映射時,Vim 會在 (O
) 上方打開其“插入”模式並鍵入1;2Q
字元串。為了看到整個終端鍵碼——沒有被“普通”模式吃掉一半——我<c-v><s-f2>
在“插入”模式下點擊並得到^[O1;2Q
,字元在^[
哪裡<esc>
。即使閱讀了“在終端 Vim 中映射快速鍵碼”,我也不明白為什麼
^[O1;2Q
終端鍵碼沒有映射到<s-f1>
Vim 程式碼。因此,我在~/.vimrc
文件中定義了以下函式:function! s:Mod_fix_shift_fkey() let a=0 let b='PQRS' while a < 4 exec 'set <s-f' . (a + 1) . ">=\eO1;2" . b[a] let a+=1 endwhile endfunction
通過呼叫它,我修復了從
<s-f1>
to轉移的功能鍵,<s-f4>
並且綁定到的映射<s-f2>
突然起作用。有人可以解釋嗎?
此外,我還必須將已移動的功能鍵從以下位置修復
<s-f5>
為<s-f12>
:"... let a=5 let b='1517181920212324' let c=0 while a < 16 exec 'set <s-f' . a . ">=\e[" . b[c : c + 1] . ';2~' let a+=1 let c+=2 endwhile "...
從
<c-s-f1>
to<c-s-f4>
和<c-s-f5>
to<c-s-f12>
控制轉移的功能鍵,如:" ... exec 'map <esc>O1;6' . b[a] ' <c-s-f' . (a + 1) . '>' " ... exec 'map <esc>[' . b[c : c + 1] . ';6~ <c-s-f' . a . '>' " ...
你可以使用特殊的萬用字元語法
:set <Key>
來讓 Vim 自動辨識xterm風格的修改鍵:if &term =~ '^gnome' execute "set <xUp>=\e[1;*A" execute "set <xDown>=\e[1;*B" execute "set <xRight>=\e[1;*C" execute "set <xLeft>=\e[1;*D" execute "set <xHome>=\e[1;*H" execute "set <xEnd>=\e[1;*F" execute "set <PageUp>=\e[5;*~" execute "set <PageDown>=\e[6;*~" execute "set <F1>=\eOP" execute "set <F2>=\eOQ" execute "set <F3>=\eOR" execute "set <F4>=\eOS" execute "set <xF1>=\eO1;*P" execute "set <xF2>=\eO1;*Q" execute "set <xF3>=\eO1;*R" execute "set <xF4>=\eO1;*S" execute "set <F5>=\e[15;*~" execute "set <F6>=\e[17;*~" execute "set <F7>=\e[18;*~" execute "set <F8>=\e[19;*~" execute "set <F9>=\e[20;*~" execute "set <F10>=\e[21;*~" execute "set <F11>=\e[23;*~" execute "set <F12>=\e[24;*~" endif
見
:help xterm-function-keys
和:help xterm-modifier-keys
。