2016-09-21 106 views
1

在閱讀「編寫GNU Emacs擴展」(O'Reilly手冊)的第一章後,我對emacs中鍵和鍵綁定之間的區別有些困惑。Emacs:鍵盤和鍵之間的關係

本章首先指出,在某些emacs版本中,按鍵退格鍵和DEL鍵調用幫助菜單而不是刪除。換句話說,它們調用由C-h調用的內容。

本章繼續介紹如何使用Lisp代碼更改此行爲。這是通過將鍵擊C-h綁定到刪除命令來完成的。

這對我有點困惑。在我看來,DEL,Backspace和C-h是三種不同的擊鍵(前兩種由單個鍵組成)。

爲什麼重映射C-h會影響DEL和Backspace的功能?

我本來以爲會改變backspace的作用,例如,您會將backspace重新映射到另一個命令,而不是按鍵C-h。

回答

3

除非由低級密鑰驅動程序重新映射,否則Backspace密鑰的作用是發送數字代碼爲8的字符,在某些操作系統中,該代碼與通過按Control-h生成的代碼完全相同。你可以通過簡單地在unix(或linux)shell上寫任何東西來驗證這個事實,然後按Backspace和Control-h:它們都具有刪除前一個字符的效果,因爲帶有數字代碼8的字符被操作解釋系統作爲控制字符BS,退格鍵,用於刪除最後打印的字符或疊印它(請參閱wikipedia)。類似地,Control-J等價於返回鍵等。 同一維基百科頁面將DEL描述爲「最初打算是被忽略的字符,但現在在某些系統中用於擦除字符」。

因此,當您爲擊鍵指定一個命令時,實際上是將一個命令分配給一個字符代碼,並且如果兩個或更多個鍵生成相同的代碼,按下它們即可調用相同的命令。

+0

我明白了,這很有道理!後續問題:在一些emacs版本中,RETURN調用新行和縮進,而C-J只調用新行。怎樣才能將兩個不同的命令分配給 - 就像你聲稱的那樣 - 本質上是相同的字符代碼? – nsimplex

+0

如果它們生成相同的字符代碼,我認爲這是不可能的,除非您在操作系統級別以其他方式重新映射它們。 – Renzo

+1

另請注意,在終端中運行Emacs並將其作爲GUI應用程序運行時,在Emacs接收的關鍵代碼方面存在顯着差異。 GUI Emacs有機會區分在終端中難以區分的許多關鍵序列。 – phils

0

@Renzo回答了你的問題,關於這些密鑰是如何相關的,以及如何綁定一個似乎會影響另一個。以下是有關此特定情況下發生的更多信息。

請參閱Emacs手冊,節點DEL Does Not Delete

在那裏,你會看到這一點,下面的問題/混淆的解釋:

要解決該問題在每一個Emacs會話,把下面的 行之一到您的初始化文件(*注初始化文件::)。對於第一 情況下如上所述,在BACKSPACE轉發刪除而不是向後,使用 這條線使BACKSPACE充當DEL:

(normal-erase-is-backspace-mode 0) 

對於其它兩種情況下,使用此行:

(normal-erase-is-backspace-mode 1) 

另一種解決每個Emacs會話問題的方法是: 定製變量normal-erase-is-backspace:值t 指定BS或BACKSPACE爲DEL的模式,並指定nil 另一種模式。 *注意容易定製::。

另請參閱GNU Emacs FAQ question about Backspace invoking help。在那裏,你會看到,除了信息類似於上面,關於信息如何在UNIX上重新映射DEL - 使用此:

stty erase '^?' 

WRT C-jRET(在這個問題沒有提及,但在提到@ Renzo的回答):在Emacs 24.4中,Emacs的默認行爲在大多數編程模式下都發生了變化。

與該版本開始,electric--indent-mode默認情況下,這意味着RET插入一個換行字符和縮進的,而只是C-j插入一個換行字符接通。在發佈之前,這些鍵具有相反的行爲。如果你喜歡舊的行爲,那麼這樣做,關閉electric-indent-mode

(when (fboundp 'electric-indent-mode) 
    (electric-indent-mode -1)) ; Use classic `C-j' and `RET'.