綁定箭頭鍵並不那麼簡單。
首先,箭頭鍵不是單個字符;他們是字符序列。每個箭頭鍵發送的精確字符序列將取決於你的終端仿真器,但如果你使用的是Linux與xterm類似的終端模擬器,你可能會發現,方向鍵發送序列:
- ↑ ESC[甲
- ↓ ESC[乙
- → ESC[Ç
- ← ESC[d
(你可以在由托馬斯·迪基保持useful compendium of control sequences更多信息。請注意,CSI
是「控制序列啓動子」ESC[)。
要綁定這些序列,您需要使用rl_bind_keyseq
,指定readline樣式的「keyseq」(請參閱man readline
;搜索keyseq
)。例如,要右箭頭結合於函數時,你可以調用:
rl_bind_keyseq("\\e[C", right_arrow_function);
初始readline的綁定包括用於所有標準鍵綁定,使用各種不同的可能的密鑰對keyseq映射的情況下,所述終端仿真器正在使用其他仿真。
您可能認爲使用rl_bind_key
綁定轉義鍵(0x1B)會覆蓋該鍵序列(因爲它以轉義開頭),但這不是readline的工作原理。
Readline使用鏈接的鍵盤映射的鍵綁定多字符序列,其中序列中的每個鍵依次綁定到下一個鍵盤映射。確切的機制並不重要 - readline會處理它 - 但你需要知道綁定鍵綁定的前綴是不可能的,因爲前綴將綁定到子鍵映射,子鍵鍵映射綁定優先於任何其他類型的綁定。
因此,任何嘗試重新綁定綁定keyseq的前綴將失敗沒有任何錯誤指示; rl_bind_key
(或rl_bind_keyseq
)將返回0,即使綁定沒有效果。因此,對所有可能的8位字符進行循環試圖綁定ESC,並且對rl_bind_key
的調用將會成功,但轉義鍵仍將綁定到子鍵映射。 (我個人覺得缺乏一個錯誤返回刺激性的,那將是很好的得到一個錯誤指示。)
當rl_command_function
被調用時,順便說一下,在key
參數將包含的代碼在最後的關鍵序列。 (這是由於它是實際保存綁定信息的最後一個鍵,因此在相應的子鍵映射中)。對於箭頭鍵來說,這是正確的,但是對於綁定大量鍵(包括PageUp和PageDown ,其碼序列具有形式ESC[p
〜其中p
是一些(可能是多位)數識別的關鍵,但在所有的序列的最後一個字符是〜。
這是一個很好的答案!我很驚訝沒有更多的文件。非常感謝! –
@rici這真是一個很好的答案!我幾乎整天都在尋找這個東西......我會試試這個 – hrushi