Terminal

如何將 emacs 配置為正確接受 Shift 和 Alt 游標組合?

  • July 10, 2017

emacs在終端中使用 org-modeShiftAlt游標組合作為字元輸入,如2A,2B3A。我注意到vim終端也顯示這種行為。

是否可以設置一些終端設置來改變這種行為,或者是 emacs 和 vim 本身的設置?

遵循 Gilles 的建議:

終端仿真器是KDE Konsole。根據給出的一些建議,我進入菜單並Settings->Configure Shortcuts禁用了和Shift+Left選項的使用。Shift+Right``Previous Tab``Next Tab

Emacs

Shift+Left -> ^[2D

Shift+Right -> ^[2D

Alt+Left -> ^[3D

Alt+Right -> ^[3C

維姆

Shift+Left -> ^[[1;2D

Shift+Right -> ^[[1;2C

Alt+Left -> ^[[1;3D

Alt+Right -> ^[[1;3C

它是應用程序本身的設置,與終端相結合。

Xterm 模仿的 DEC VT 行為將擴展鍵事件作為帶有參數的控制序列發送。許多幼稚的程序無法正確解碼這些,因為他們錯誤地認為鍵盤控制序列是沒有參數的簡單控制序列。他們中的一些人太天真了,他們甚至沒有正確地尋找中間和最終字元。他們最終只解碼了控制序列的一部分,並將其餘部分視為普通輸入,從而產生了奇怪的現象,例如您所看到的。

vim 能夠正確解碼此類鍵盤序列,以及如何確保它正確解碼在xterm-modifier-keys其線上幫助部分中進行了說明。

nvim 也是,儘管它不需要像 vim 那樣設置 termcap 變數。

不同的是,這樣的應用程序要求終端認為它處於應用程序游標鍵模式應用程序鍵盤模式。通常,終端處於普通游標鍵模式普通鍵盤模式。這些應用程序通過將控制序列列印到終端來告訴終端在持續時間內切換模式。

終端描述(假設您TERM的設置為“xterm”)提供了必要的資訊(例如參見**xterm+pcfkeys**條目之前的註釋)。

自 1999 年以來的xterm (以及它的模仿者 konsole 和 gnome-terminal,幾年後開始——請參閱xterm 常見問題解答)使用 shift-、control-、alt- 和元修飾符提供了一組擴展的功能鍵:

向功能鍵添加參數以指示是否設置了 shift、control 或 alt。這些程式碼基於對帶有 PC 鍵盤的 DEC VT510 的描述

xterm 是否“模仿”DEC VT 當然是有爭議的:當時沒有免費的手冊,所以“描述”是通過電子郵件在幾行文本中完成的。期待一些變化。

最初的行為在 2002年發生了改變,使 xterm 發送一個數字作為第二個參數來告知使用了哪些修飾符(在“1”之後,emacs 可能會將其解釋為重複計數)。

引用 konsole 的 vim 和 emacs 範例的後續內容很有趣:

  • 兩者都是termcap應用程序,這意味著(儘管詳細資訊已在terminfo描述中提供了 10 多年,但這些程序實際上都沒有使用終端描述,因為引用這些功能的名稱不是(並且可能永遠不會)將)在 termcap 文件中找到。
  • 這兩個程序都有一些解決方法,例如,vim 的xterm-shifted-keysxterm-modifier-keysxterm-codes的文件。對於 emacs,文件不是那麼簡潔(例如鍵盤映射的討論),但它有助於閱讀原始碼,例如lisp/term/xterm.el
  • 有趣的是,emacs 的迴聲與 vim 的迴聲不同,前者類似於舊的/過時的行為。它不僅已經過時,而且複制了它的 konsole 和 gnome-terminal 開發人員,十多年來都沒有費心去關注 xterm 的更改(導致大量錯誤報告)。emacs 的解決方法可能是由此產生的結果。

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