すべてのグローバルキーバインドを本当にバインド解除するにはどうすればよいですか?


8

試したところです

(set 'global-map (make-sparse-keymap))

しかし、発行するとC-hb、特にグローバルバインディングセクションで、依然として大量のがらくたが表示されます。

Global Bindings:
key             binding
---             -------

C-@             set-mark-command
C-a             move-beginning-of-line
C-b             backward-char
C-d             delete-char
C-e             move-end-of-line
C-f             forward-char
C-g             keyboard-quit
C-h             help-command
TAB             indent-for-tab-command
C-k             kill-line
C-l             recenter-top-bottom
RET             newline
C-n             next-line
C-o             open-line
...             ...

そして、これからもっとたくさんあります。

これらを完全に取り除きたいと思います。どうすれば1つの単純な関数呼び出しでそれを実行できますか?これらのすべてのマップをに設定するループではなく、完全にワイプアウトする解決策を求めていますnil。前もって感謝します。

注:「これらのキーは生産性のために不可欠です。それを行わないでください!」のような回答やスパムコメントを教えないでください。。ここにはモーダルテキスト編集用に高度にカスタマイズされたエミュレーションレイヤーがあるので、これらのデフォルトバインディングはまったく必要ありません。


私は興味がある。evil-mode独自のモーダル編集レイヤーを作成する必要があるということの何が問題になっていますか?
Tu Do

@Tu Do、そうですがevil-mode、そのトップレベルの機能の一部:演算子、テキストオブジェクト、一部のコマンドは、なんらかの方法で書き直されたり拡張されたりしています。そのデフォルトのバインディングも完全に一掃され、キーボード全体で最初から再配置されました。ただし、これは問題とは関係ありません。
Alexander Shukaev 2014年

私はただ好奇心を求めていました。しかし、ありがとう。
Tu Do

で作成された非スパースキーマップを使用する必要がありmake-keymapます。
tarsius 2014年

回答:


16

Emacs Lispマニュアルから引用(アクティブマップの制御を参照):

(use-global-map (make-sparse-keymap))

マニュアルを引用するには:「グローバルキーマップを変更することは非常にまれです。」安全上の注意:バッファーを保存し、後で別のキーマップでEmacsを完全に終了できることを確認してください。そうしないと、変更を保存せずに強制終了する必要があります。


あなたは男です!
Alexander Shukaev 2014年

6

以下の情報は質問に対する直接の回答ではありませんが(@wasamasaによって既に回答されているため)、回答への必須の追加であると私はまだ信じています。ポイントは発行後

(use-global-map (make-sparse-keymap))

実際、グローバルバインディングセクションは完全に消去され、その結果、テキストを入力することできなくなります。圧倒的多数のケースでは、当然ながら、テキストを入力する機能は、いずれのテキストエディタにとっても不可欠であるため、復元したいと考えるでしょう。したがって、これを行う1つの方法を次に示します。

(global-set-key [t] #'self-insert-command)
(let ((c ?\s))
  (while (< c ?\d)
    (global-set-key (vector c) #'self-insert-command)
    (setq c (1+ c)))
  (when (eq system-type 'ms-dos)
    (setq c 128)
    (while (< c 160)
      (global-set-key (vector c) #'self-insert-command)
      (setq c (1+ c))))
  (setq c 160)
  (while (< c 256)
    (global-set-key (vector c) #'self-insert-command)
    (setq c (1+ c))))

このEmacs Lispコードがそれを行う正しい方法であると皆さんが信じるように、私はそれを作成するために使用したソースを提供します。デフォルトでは、現在の8ビットASCIIコードページでテキストを入力する機能cmds.cは、Emacs Cソースコードの翻訳単位に実装されています。

  for (n = 040; n < 0177; n++)
    initial_define_key (global_map, n, "self-insert-command");
#ifdef MSDOS
  for (n = 0200; n < 0240; n++)
    initial_define_key (global_map, n, "self-insert-command");
#endif
  for (n = 0240; n < 0400; n++)
    initial_define_key (global_map, n, "self-insert-command");

ご覧のとおり、上記のEmacs Lispコードは、このCコードを正確に複製したものですが、次の1行が追加されています。

(global-set-key [t] #'self-insert-command)

注意点ですが、この行は重要です。それ以外の場合は、現在のASCIIコードページの7ビットしか使用できません(8ビットをすべて初期化したという事実に関係なく)。


3
これは過度に複雑に見えます。self-insert-command現在のグローバルキーマップからバインディングをコピーしませんか?(setq my-global-map (make-keymap)) (substitute-key-definition 'self-insert-command 'self-insert-command my-global-map global-map)
Gilles「SO-悪をやめる」14年

1
@ギレス、3つのループで複雑に感じることはわかりませんが、すでにテスト済みの場合は自由に進んでください。また、この投稿はより教育的な価値があるため、一掃する人global-mapは、直面する問題とそれを解決するためのレシピをすぐに知ることができます。彼らはおそらく一般的にASCIIについて何か新しいことを学ぶでしょう、そして/またはそれが特にEmacsでどのように実装されているか。
Alexander Shukaev 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.