Terminal

終端仿真器如何處理 Shift+FKeys?

  • June 29, 2016

這個問題的靈感來自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 鍵沒有Shiftvim裡面很好用urxvt。如果我做:

:map <f8> :echo "yay"<CR>

當我按下 時,我確實正確地得到了“耶”的迴聲F8

終端和應用程序之間的介面發送字節,而不是密鑰。可列印字元被解釋為與終端字元編碼對應的字節序列。功能鍵被編碼為轉義序列。這些轉義序列有共同的約定,但它們並不完全標準化。

有關更一般的背景,請參閱鍵盤輸入和文本輸出如何工作?. 有關更多資訊,另請參閱[我在控制台登錄螢幕上按向上箭頭時得到 ^[A 是否有任何原因?鍵綁定表?

所有功能鍵轉義序列都以轉義字元開頭,其中大多數以~. Vim 根據其編譯時設置和終端上的資訊辨識許多轉義序列。如果 Vim 不能辨識轉義序列,它會忽略它,但 Vim 不知道轉義序列有多長(它不假設最後一個字元是 a ~,情況並非總是如此)。通常在~Vim 辨識的部分之後會有一個雜散,有時更多。

在 shell 或 Vim 的插入模式下,您可以通過先按Ctrl+來準確查看終端發送的內容。V

你可以讓 Vim 知道對應於轉義序列的功能鍵:set,例如

:set <S-F8>=^[[19;2~

(用^[您的終端實際發送的內容替換之後的部分)。

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