8

最近Emacs24にアップグレードしましたが、その結果、多くのカスタムキーバインディングが壊れました。

細かいマニュアルによると、 EmacsにファンクションキーとASCII制御コードとの混同をやめさせることができます(たとえば、さまざまなもの、または、などを持っC-mRETバインドすることが可能です)。これは常にEmacsでの私の大きなペットであり、そのような貴重な「第1レベル」のキーボードショートカットは、私がすでにキーボードに専用のキーを持っているものに無駄になっています。私の場合、geditを模倣してキーバインドを「最新化」するために、それらをさまざまなものにバインドしたいと思います。Emacs23では、これは美しく機能していました。C-iTAB

(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にアップグレードしました、そしてそれはちょっと壊れました。C-mそれは確かにあることをし、別のことをするという意味でまだ「機能」しますRETが、問題は、リターンキーがターミナルモードまたはミニバッファで正しく動作しなくなることです。入力したコマンドをアクティブにする代わりに、どちらの場合も、リターンキーを押すとカーソルが次の行に移動し、ミニバッファーまたはターミナルに入力したコマンドをアクティブにする方法がなくなります。

皮肉なことに、Emacs24は削除の動作に多くの変更を導入し、それらが切り離されたプロセスでC-d、期待される動作にバインドし直す必要なしDELに実際に安全にバインドできるようになりました。他の何かにバインドされている間、私のリターンキーの同様の「それはうまくいく」動作。C-dDELC-m

したがって、この問題に対する2つの可能な解決策を想像することができます。次のようになります。

(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)

しかし、私はこのシナリオで私を助けるような変数や関数を知りません。

モードフックを使用してターミナルモードとミニバッファモードで正しいバインディングを復元しようとして何度か失敗しましたが、何も機能しないようです。ヘルプ!

ありがとう。

4

2 に答える 2

5

これはうまくいくようです:

(add-hook 'find-file-hook
          (lambda ()
            (local-set-key (kbd "C-m") 'comment-or-uncomment-region)
            (local-set-key (kbd "<return>") 'newline-and-indent)))

ここでの考え方は、リターンキーをグローバルにいじくり回す代わりに(ターミナルバッファーとミニバッファーバッファーを壊すものです)、これらのキーバインディングはバッファーごとにのみ設定します。ただし、上のファイルを表すすべてのバッファーに対して無条件に設定します。ディスク。

ファイルを開くたびに実行する必要があるため、少し非効率的ですが、「修正」するために考えられるすべてのモードを考える必要がない限り、ターミナル/ミニバッファなどのモードが壊れることはありません。そもそも。

于 2012-09-11T19:26:10.730 に答える
3

これらの「姉妹キー」がEmacsでデフォルトで処理される方法は、(ファンクションキーマップを介して)特殊キー(、、tabなどreturn)を同等のASCIIにリダイレクトし、ASCIIバージョンにのみキーバインディングを追加することです。したがって、非ASCIIバージョンに次のような新しい意味を簡単に追加できます。

(global-set-key [return] 'my-new-command)

しかし、あなたの場合は、return変更中に以前と同じように動作させるという逆のことをしたいと思いますC-m。これを行うために私が考えることができる最も信頼できる方法(ほとんどのメジャー/マイナーモードバインディングで機能するという意味で信頼できる)は、次のC-mように、早期に無条件に新しいイベントに再マップすることです。

(define-key input-decode-map [?\C-m] [C-m])
(define-key input-decode-map [?\C-i] [C-i])

これは、の処理に影響を与えません。また、return適用tabinput-decode-mapれる前function-key-map、つまり、これらのキーがASCII制御キーに変換される前に適用されます。したがって、次のことができます。

(global-set-key [C-m] 'my-new-command)
(global-set-key [C-i] 'my-newer-command)

欠点は、これがのバインディングだけでなく、現在はとしてのみ機能C-iするバインディングにも適用されることです(これは、問題がない場合もありますが、ニーモニックが少ない場合もあります)。C-c C-iC-c TAB

もう1つの欠点は、のバインディングがある場合、バインディングに到達するために使用できないことtabです。ただし、以下を追加することで、これら2つの問題を修正できます。tabC-i

(define-key function-key-map [C-i] [?\C-i])
(define-key function-key-map [C-m] [?\C-m])

これにより、新しいイベントを使用するバインディングがない場合に、新しいC-iイベントが通常の状態に戻ります。C-i

于 2012-09-12T17:42:25.017 に答える