[英]Emacs keybinding changes between Emacs 23 and Emacs 24
我最近升級到了Emacs24,由於它,我的一些自定義鍵綁定被破壞了。
根據精細的手冊,可以使Emacs停止將功能鍵與其ASCII控制代碼混淆(例如,可以將Cm
和RET
綁定到不同的東西,或Ci
和TAB
,等等)。 這一直是我用Emacs的一個大小的煩惱,這種有價值的“第一級”鍵盤快捷鍵浪費在我已經在鍵盤上有專用鍵的東西上。 在我的例子中,我希望將它們綁定到不同的東西,通過模仿gedit來“現代化”鍵綁定。 在Emacs23中,這很漂亮:
(global-set-key (kbd "C-i") 'goto-line)
(global-set-key (kbd "C-m") 'comment-or-uncomment-region)
(global-set-key (kbd "C-d") 'kill-whole-line)
;; Fix some stuff broken by the above
(global-set-key [delete] 'delete-char)
(global-set-key (kbd "TAB") 'indent-for-tab-command)
(global-set-key (kbd "RET") 'newline)
然后,我升級到Emacs24,它破了,有點。 它仍然“工作”,因為Cm
肯定會做一件事,而RET
會做另一件事,但問題是返回鍵在終端模式或迷你緩沖器中不再正常運行。 在兩種情況下,返回鍵只是將光標向下移動到下一行,而不是激活我輸入的命令而不是激活我輸入迷你緩沖區或終端的命令。
具有諷刺意味的是,Emacs24對刪除行為進行了很多更改,並且在此過程中它們將Cd
與DEL
分離,因此實際上現在可以安全地將Cd
綁定到某些東西而無需將DEL
綁定回預期的行為,因此它會很棒如果我可以為我的返回鍵實現類似的“它只是工作”行為,而Cm
則綁定到別的東西。
所以,我可以設想兩個可能的解決方案來解決這個問題。 一個可能看起來像這樣:
(global-set-key (kbd "C-m") 'comment-or-uncomment-region)
(global-set-key (kbd "RET") 'do-what-i-expect-the-return-key-to-do-in-any-mode)
或者,這樣的事情會更好:
(setq decouple-ascii-control-codes-from-function-keys t)
但我不知道任何這樣的變量或函數可以幫助我在這種情況下。
我已經做了幾次嘗試使用模式掛鈎在終端和迷你緩沖模式下恢復正確綁定的嘗試失敗,但我似乎無法得到任何工作。 救命!
謝謝。
這似乎有效:
(add-hook 'find-file-hook
(lambda ()
(local-set-key (kbd "C-m") 'comment-or-uncomment-region)
(local-set-key (kbd "<return>") 'newline-and-indent)))
這里的想法是,不是全局修改返回鍵(這是破壞終端和迷你緩沖區緩沖區),我們只在每個緩沖區的基礎上設置這些鍵綁定,除了我們無條件地為表示文件的所有緩沖區。磁盤。
它有點低效,每次打開文件時都要運行,但是因為我不必考慮每種可能的“修復”模式,所以它很好,它根本不會破壞終端/迷你緩沖/等模式第一名。
默認情況下,在Emacs中處理這些“姐妹鍵”的方法是將特殊鍵(如tab
和return
)重定向(通過function-key-map)到它們的ASCII等價物,然后只將鍵綁定添加到ASCII版本。 因此,您可以輕松地為非ASCII版本添加新的含義
(global-set-key [return] 'my-new-command)
但在你的情況下,你想要做的相反是讓return
以前一樣的行為,同時改變Cm
。 我能想到的最可靠的方法(在大多數主要/次要模式綁定應該可行的意義上可靠)是將Cm
早期和無條件地重新映射到某個新事件,如:
(define-key input-decode-map [?\C-m] [C-m])
(define-key input-decode-map [?\C-i] [C-i])
這不會影響return
和tab
的處理,因為input-decode-map
是在function-key-map
之前應用的,即在將這些鍵轉換為ASCII控制鍵之前。 所以你可以這樣做:
(global-set-key [C-m] 'my-new-command)
(global-set-key [C-i] 'my-newer-command)
一個缺點是,這不僅適用於Ci
綁定,也適用於Cc Ci
綁定, Cc Ci
現在只能用作Cc TAB
(有時候會很好,但偶爾可能會少於助記符)。
另一個缺點是,如果tab
有綁定,則tab
不可用於達到Ci
綁定。 但我們可以通過添加以下內容來解決這兩個問題:
(define-key function-key-map [C-i] [?\C-i])
(define-key function-key-map [C-m] [?\C-m])
如果沒有使用新事件的綁定,它會將新的Ci
事件重新轉換為普通Ci
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.