ESCプレフィックスキーへのバインディングを削除する方法


9

forのESC代わりにキーを使用したいのC-gですがkeyboard-quit。ちょうどするための私の素朴なアプローチ

(define-key global-map (kbd "ESC") 'keyboard-quit)

動作しません。ESCはまだプレフィックスキーであり、それを押しても呼び出されませんkeyboard-quit


1
この関連スレッドに興味があるかもしれません-CgとESC-ESC-ESCに慣れるまで約1年間このソリューションを使用しました: <escape>を(条件付きで)修飾キーとして使用する方法 stackoverflow.com/a/20036348/ 2112489 その関連スレッドでのStefanによる回答は、で使用されるのuniversal-argumentと同じ概念ですuniversal-argument-map
弁護士、2015

回答:


7

できます(define-key key-translation-map (kbd "ESC") (kbd "C-g"))。私はずっと前に同じことをしましたが、問題はありませんでした。

コメントに従って、回答を改善するために編集します。

ESC重要な機能を維持したい場合は、

(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))

注意すべきことの1つは、Emacsがハングした場合でもC-g、何らかの理由でキーを使用する必要があることですが、まれにしか発生しません。


1
@EmacsUser emacsの使用中にESCを一度もクリックしなかったとしても?
Geier

1
@EmacsUser:それで?今のところ、ESCを1回押すことはなく、2回または3回は言うまでもありません。見逃すことはありません。
Geier

2
@EmacsUserこれが正しい答えであり、それを使用したいと言っているのではありません。何が問題なのかを理解したいだけです。「将来的には、Escキーを2回押すことができなくなります」という全体的な影響はまったく受けません。どのような条件下で私がこれで無限ループに入る可能性があるのか​​、そしてその理由を教えてくれれば、それは本当に洞察に満ちたものになるでしょう。
Geier

1
@Geier私はこの再マッピングを長い間使用しており、問題は発生していません。唯一のことは、emacsがハングした場合、押すC-gとハングを解除する必要がありますESC。この場合、再マッピングは機能しません。
クレメラ2015

1
@EmacsUser私はユースケースを持っていなかったESCので、これは気になりませんでした。ただし、必要に応じて、別の翻訳を行うことができます。たとえば、(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))
クレメラ

8

ESCそれは特別な鍵なので、私は一人にしておくことをお勧めします。

デフォルトでは、EmacsはESC(ASCII 27)をとして使用しますmeta-prefix-key。Elispマニュアルから:

'esc-map'は、プレフィックスキーのグローバルキーマップです。したがって、すべてのメタ文字のグローバルな定義は実際にはここにあります。このマップは、「ESC-prefix」の関数定義でもあります。

そして

代わりに、メタ文字はキールックアップの目的で2文字のシーケンスと見なされます。最初の文字はESC(または現在「meta-prefix-char」の値であるもの)です。したがって、キー「M-a」は内部的に「ESC a」として表され、そのグローバルバインディングは「esc-map」の「a」のスロットにあります。

したがって、ESCを別のものに使用するには、別のものに設定meta-pefix-keyし、他のキーをにバインドする必要がありますESC-prefix。他にも必要な変更があるかもしれません-私はこれを試したことはありません。

詳細についてはmeta-prefix-char、参照キー探索のための機能を elispのマニュアルで。


1
+1。のバインディングを削除しないでくださいESC。必要keyboard-quitに応じて、別のキーをにバインドします。そしてESC ESC ESC、あなたが望むエスケープの振る舞いをすでに提供していることに注意してください-EmacsマニュアルのノードQuittingを参照してください。
2015

2
OSXでmeta-prefix-charto nilを設定しても、プレフィックスキーになること無効になりません。メタキーから分離されるだけです。グラフィカルバージョンのEmacsを備えたOSXでは、エスケープキーをメタキーから分離したい-私(setq meta-prefix-char nil)は初期化の最初に設定して、その後ロードされるすべてのライブラリがそれが私が望んでいることを理解できるようにします。これにより、メタキーをプレフィックスキーとして使用したり、エスケープキーをプレフィックスキーとして使用したりできます。esc-map内のCソースコードレベルで定義されていますkeymap.c。プレフィックスキーとして使用するためのものです。
弁護士

@lawlist興味深い-では、メタをesc-mapデフォルトのM-バインディングを維持するための接頭辞にマッピングしますか?
グルカ2015

これはOSXの関連設定だと思います:(setq ns-alternate-modifier 'meta)、これはメタをAppleキーボードの左Altキーにします。OSXのデフォルト設定を使用して、Unicode文字を作成するために右のAltキーを使用したい: (setq ns-right-alternate-modifier 'none)-スペイン語の文字、段落記号などを挿入する--with-ns。デフォルト設定の絆使用してOSX上のメタキーにエスケープキーmeta-prefix-charで、27あなたが述べたように。
弁護士、2015

5
emacsを使用すると彼らは言う。彼らは拡張可能だと彼らは言う。彼らはそれに適応する必要はない、それはあなたに適応すると彼らは言う。つまり、ESCを3回押して状況を回避したい場合にのみ調整されます。ESCはこれまでにないほどのキー(すべてのキーボードの左上隅にある)であると過去の誰かが考えたので、ESCをMetaキーと結び付けた方がよい
。– Geier

1

ここで素敵な答え:https : //superuser.com/a/945245/624661

引用:

これはEmacsのinitファイルで使用できます。

;;; esc always quits
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
(global-set-key [escape] 'keyboard-quit)

0

Oleが参照するバインディングとしてでは[escape]なく(kbd "ESC")、をバインドする必要があります。在庫がある場合、これはウィンドウシステムのemacsフレームの場合にのみ機能します。これは少し説明する価値があると思います。

(kdb "ESC")は、実際にはASCII制御文字を意味ESCし、グルカが述べたように、この文字を再マッピングしたくはありません。しかしEsc、ASCIIではありません。少なくともグラフィカル環境でESCは、シンボルescapeです。バインディングがそのときどのように(kbd "ESC")影響するのEscですか?これは、に使用できるバインディングがない場合に emacsがに変換さescapeれるために発生ESC escapeます。希望する場合のフォールバックの種類(これはlocal-function-key-map、そのようなことに関心がある場合に実装されます)。

したがって、バインドする[escape]ときは安全であり、心配する必要はありませんESC。あなた自身のバインディングとは別に、ESCそれらが意味するときに言うキーマップを追加する必要があります[escape]

うーん...まあ、ほとんど。これらのマップ[escape]が初めて使用されないのはなぜですか?これはターミナルでは機能しないためです。そのEscようなデバイスで作業したい場合は、少なくとも端末カスタマイズする必要があります

端末のストーリーは別の投稿で報告されています: C- [を実際にバインドする方法は?。あなたがしなければならないことは、Esc押されたときに何らかのカスタムシーケンスを送信するように端末に伝え、次にこのシーケンスを[escape]emacs(input-decode-map)の初期入力段階でマッピングすることです。

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.