Vim

如何在 gnome-terminal 的 xterm 中修復 vim 中的移位功能鍵?

  • March 28, 2016

當我按下<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

引用自:https://unix.stackexchange.com/questions/58361