Terminal

為什麼在終端中執行的 Emacs 不能區分 Ctrl+;從 ”;”?

  • October 14, 2014

這個問題源於我之前關於 emacs beta的問題。簡而言之,我想綁定C-;到終端中的 Emacs 函式,但似乎有東西在它到達 Emacs 之前擷取了這個鍵:Emacs 認為我按下了;

明顯的嫌疑人是終端仿真器,但我已經檢查了其中的許多(xterm、gnome-terminal、終結器、術語),但它們都不起作用。很可能我可以排除視窗管理器,因為在 Emacs 的 GUI 版本中,該鍵C-;工作得很好。我還嘗試了兩種不同的 shell:bash 和 zsh,但同樣沒有成功。

我還能嘗試什麼?

也許您的困惑源於沒有使用實際的終端。當嚴肅的電腦有幾台直立式冰箱那麼大時,終端通過串列電纜與中央電腦通信,僅使用字元和字元。這些字元是一些標準化字元集的一部分,例如 ASCII 或 EBCDIC,但通常是 ASCII。ASCII 有 33 個控製字元,終端操作員通過按特殊鍵(例如 DEL)或按住 CTRL 鍵並按另一個鍵來發送它們。中央電腦只看到生成的控製字元;它不知道按什麼鍵來生成字元。

諸如 xterm 之類的終端仿真程序會模仿這種行為。終端仿真器提供了一種發送所有 33 個 ASCII 控製字元的方法,如果發送了這些字元,Emacs 將接收這些字元。但是 Emacs 就像上面描述的中央電腦——當你在終端仿真器下執行它時,它無法知道實際按下了哪些鍵。因此,如果您按下 CTRL 和分號,除非終端仿真程序已將這些按鍵映射到某個 ASCII 字元,否則 Emacs 將不知道已鍵入任何內容。

終端仿真器通常使用以下映射來生成控製字元†:

按鍵 ASCII
--------------------
逃生 27
刪除 127
退格鍵 8
CTRL+空格 0
CTRL+@ 0
CTRL+A 1
CTRL+B 2
CTRL+C 3
ETC...
CTRL+X 24
CTRL+Y 25
CTRL+Z 26
CTRL+[ 27
CTRL+\ 28
CTRL+] 29
CTRL+^ 30
CTRL+_ 31

注意 CTRL+; 沒有出現在該列表中。如果 CTRL+未映射到控製字元,終端通常只會發送分配給*鍵的可列印字元。*所以你的終端模擬器通過發送告訴你什麼;唯一的原因是當你按下 CTRL+; 時它不知道該怎麼做。

所有這些僅在您使用終端或終端仿真程序時適用。如果您在某些視窗系統下將 Emacs 作為本機應用程序執行,那麼 Emacs 可以完全訪問擊鍵事件而不僅僅是字元。因此,Emacs 可以看到您同時按下了 CTRL 和分號,並允許您為該按鍵對分配一個操作。

†終端通常具有功能鍵和箭頭鍵,它們還可以生成包含控製字元的字元序列。這些序列通常以 ASCII 程式碼 27 (ESCAPE) 開頭。

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