終端仿真器如何處理 Shift+FKeys?
這個問題的靈感來自vi.SE 上的另一個問題。在那裡,OP在裡面執行時
Shift
+組合鍵存在問題。該組合鍵永遠不會起作用,因為終端仿真器沒有正確傳遞它(至少從我設法調試的情況來看)。F8``vim``urxvt``vim
我對
F
終端模擬器如何處理密鑰沒有很好的理解。在
urxvt
- 當我按
Shift
+時F8
~
回顯。- 當我按下
F7
(或任何其他 F 鍵)~
時也會回顯。在
vim
裡面urxvt
- 當我按
Shift
+時F8
,我得到~~
.- 當我按
Shift
+時F7
,我得到~
.- 當我按
Shift
+時F6
,我得到~~~
.另一方面
xterm
:
- 當我按
Shift
+時F8
;2~
回顯。- 當我按下
F8
(或任何其他 F 鍵)時,只會~
回顯。我不明白為什麼我會得到這個輸出。
為了進一步調試,我確實執行
xev
並得到了以下結果:為了
F8
KeyPress event, serial 29, synthetic NO, window 0x2000001, root 0x7e, subw 0x0, time 17730758, (431,256), root:(432,275), state 0x0, keycode 74 (keysym 0xffc5, F8), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False
對於左
Shift
KeyPress event, serial 32, synthetic NO, window 0x2000001, root 0x7e, subw 0x0, time 17733031, (431,256), root:(432,275), state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False
而對於正確的
Shift
KeyPress event, serial 32, synthetic NO, window 0x2000001, root 0x7e, subw 0x0, time 17733372, (431,256), root:(432,275), state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False
然而,我完全沒有看到那裡有什麼奇怪的地方。
終端仿真器如何處理這些鍵(F 鍵)?終端仿真器從什麼接收
x11
?以及他們如何將其進一步傳遞給在其中執行的程序?我一直認為 F 鍵只是
Esc
加數字的組合。現在我發現我錯了。附錄
F 鍵沒有
Shift
在vim
裡面很好用urxvt
。如果我做::map <f8> :echo "yay"<CR>
當我按下 時,我確實正確地得到了“耶”的迴聲
F8
。
終端和應用程序之間的介面發送字節,而不是密鑰。可列印字元被解釋為與終端字元編碼對應的字節序列。功能鍵被編碼為轉義序列。這些轉義序列有共同的約定,但它們並不完全標準化。
有關更一般的背景,請參閱鍵盤輸入和文本輸出如何工作?. 有關更多資訊,另請參閱[我在控制台登錄螢幕上按向上箭頭時得到 ^[A 是否有任何原因?和鍵綁定表?
所有功能鍵轉義序列都以轉義字元開頭,其中大多數以
~
. Vim 根據其編譯時設置和終端上的資訊辨識許多轉義序列。如果 Vim 不能辨識轉義序列,它會忽略它,但 Vim 不知道轉義序列有多長(它不假設最後一個字元是 a~
,情況並非總是如此)。通常在~
Vim 辨識的部分之後會有一個雜散,有時更多。在 shell 或 Vim 的插入模式下,您可以通過先按
Ctrl
+來準確查看終端發送的內容。V
你可以讓 Vim 知道對應於轉義序列的功能鍵
:set
,例如:set <S-F8>=^[[19;2~
(用
^[
您的終端實際發送的內容替換之後的部分)。