簡體   English   中英

奇怪的Emacs鍵綁定行為

[英]Strange Emacs keybinding behavior

我始終對Emacs遇到這個奇怪的問題,我確實想找到一個解決方案,但找不到任何解決方案。 默認情況下,鍵映射ESC ESC ESC(三個轉義)被映射到鍵盤轉義退出,效果很好,但是,如果我只按ESC的兩種類型,然后按箭頭鍵,它將在我一直有的文字中插入特殊字符重做刪除以擺脫。 換句話說,我得到這種行為:

ESC ESC up-> OA

ESC ESC向下-> OB

ESC ESC右-> OC

ESC ESC左-> OD

當我使用\\ CH K查找這些鍵已映射到哪些功能時,向我顯示ESC ESC ESC ESC映射到keyboad-escape-quit。

有誰能解決這個煩人的鍵綁定問題? 請注意,我在終端中使用Emacs。

謝謝

箭頭鍵生成轉義序列。 例如,如果您啟動cat並按下向上箭頭,您將在屏幕上看到以下內容:

$ cat
^[[A

即,逃生,開括號, A (視終端而定)。

這意味着如果您按ESC ESC鍵 ,Emacs會看到ESC ESC ESC [A並做出相應的反應(退出鍵盤,然后插入[A )。

因此,Emacs的行為與文檔相同。

如果要禁用鍵綁定,可以執行

(define-key esc-map (kbd "<ESC><ESC>") nil)

IMO,這不是一個很好的解決方案,但不是災難,因為您始終可以使用Cg

Sam已經描述了問題,但是對於一般的解決方案,您基本上需要教Emacs區分響應於您擊中“轉義鍵”的Esc與作為“轉義序列”的一部分而收到的ESC的區別。 當然,通常這是無法完成的,但實際上,您可以檢查時間:如果ESC后面有一點空閑時間,則可能是“轉義鍵”,否則可能是“轉義序列”。

VI模擬器(例如,Viper或Evil)使用此技巧:

(defvar viper-fast-keyseq-timeout 200)

(defun viper--tty-ESC-filter (map)
  (if (and (equal (this-single-command-keys) [?\e])
           (sit-for (/ viper-fast-keyseq-timeout 1000.0)))
      [escape] map))

(defun viper--lookup-key (map key)
  (catch 'found
    (map-keymap (lambda (k b) (if (equal key k) (throw 'found b))) map)))

(defun viper-catch-tty-ESC ()
  "Setup key mappings of current terminal to turn a tty's ESC into `escape'."
  (when (memq (terminal-live-p (frame-terminal)) '(t pc))
    (let ((esc-binding (viper--lookup-key input-decode-map ?\e)))
      (define-key input-decode-map
        [?\e] `(menu-item "" ,esc-binding :filter viper--tty-ESC-filter)))))

如果調用viper-catch-tty-ESC ,它將設置解碼,以便現在按下轉義鍵將生成escape事件(而不是ESC事件)。 如果沒有用於escape的綁定,這將自動映射回ESC ,這要歸功於function-key-map的綁定(這在GUI模式下使用,其中轉義鍵確實發送了escape事件)。

請注意,這不能解決您的問題:“ ESC ESC up”仍將插入“ OA”。 問題在於,Emacs的鍵盤翻譯仍會看到“ ESC ESC ESC OA”(前兩個以回旋的方式出現在escape和退回的位置)。 因此,為最終解決該問題,您還需要刪除“ ESC ESC ESC”綁定,並將其替換為僅由新的escape事件觸發的綁定:

(global-unset-key [?\e ?\e ?\e])
(global-set-key [?\e ?\e escape] 'keyboard-escape-quit)

注意:這都是棘手的事情。 我對相應的代碼非常熟悉,但是由於無法預料到某些交互,我在編寫此答案時的前兩次嘗試均失敗了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM