Bagaimana cara benar-benar melepaskan ikatan SEMUA gantungan kunci global?

8

Saya baru saja mencoba

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

tetapi mengeluarkan C-hbmasih menunjukkan banyak omong kosong, terutama di bagian Global Bindings :

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
...             ...

dan masih banyak lagi yang akan datang.

Saya ingin menyingkirkan ini sepenuhnya. Bagaimana saya bisa melakukan itu dalam satu panggilan fungsi sederhana? Saya ingin solusi menjadi penghapusan total, daripada loop yang mengatur semua peta ini nil. Terima kasih sebelumnya.

CATATAN: Tolong, tidak ada jawaban pengajaran atau komentar spam seperti "Kunci ini penting untuk produktivitas, jangan lakukan itu!" . Saya memiliki layer emulasi yang sangat khusus untuk mengedit teks modal di sini, jadi saya tidak memerlukan binding default ini sama sekali.

Alexander Shukaev
sumber
Saya penasaran. Apa yang salah dengan evil-modeitu Anda harus menulis layer pengeditan modal Anda sendiri?
Tu Do
@Tu Do, memang evil-mode, tetapi beberapa fungsi tingkat atas: operator, objek teks, dan beberapa perintah ditulis ulang atau diperluas. Binding default-nya juga benar-benar terhapus dan disusun ulang di keyboard sejak awal. Namun ini tidak ada hubungannya dengan pertanyaan.
Alexander Shukaev
Saya hanya ingin tahu. Tapi terima kasih.
Tu Do
Anda mungkin harus menggunakan keymap non-sparse yang dibuat dengan make-keymap.
tarsius

Jawaban:

16

Diambil dari Manual Emacs Lisp (lihat Mengontrol Peta Aktif ):

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

Mengutip manual: "Sangat tidak biasa untuk mengubah keymap global.". Catatan keamanan: Pastikan Anda dapat menyimpan buffer dan keluar dengan bersih dari Emacs setelahnya dengan keymap yang berbeda, jika tidak Anda harus membunuhnya tanpa perubahan yang disimpan.

wasamasa
sumber
Kamulah orangnya!
Alexander Shukaev
6

Meskipun informasi berikut ini bukan jawaban langsung untuk pertanyaan (karena sudah dijawab oleh @wasamasa), saya masih percaya bahwa ini adalah tambahan penting untuk jawabannya. Intinya adalah setelah menerbitkan

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

satu memang menghapus bagian Global Bindings sepenuhnya, dan sebagai akibatnya, seseorang bahkan tidak bisa mengetik teks lagi! Dalam sebagian besar kasus, salah satu tentu saja ingin mengembalikan kemampuan untuk mengetik teks karena itu penting untuk editor teks apa pun. Jadi, inilah satu-satunya cara untuk melakukan itu:

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

Supaya kalian percaya bahwa kode Emacs Lisp ini adalah cara yang benar untuk melakukannya, saya akan memberikan sumber yang saya gunakan untuk memproduksinya. Secara default, kemampuan mengetik teks dengan halaman kode ASCII 8-bit saat ini diimplementasikan dalam cmds.cunit terjemahan kode sumber 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");

Seperti yang Anda lihat, kode Emacs Lisp di atas adalah replikasi tepat dari kode C ini, kecuali untuk satu baris tambahan:

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

Anggap itu peringatan, tetapi kalimat ini penting untuk dimiliki! Kalau tidak, hanya 7-bit dari halaman kode ASCII saat ini akan tersedia (terlepas dari kenyataan bahwa kami telah menginisialisasi semua 8-bit).

Alexander Shukaev
sumber
3
Ini tampaknya terlalu rumit. Mengapa tidak menyalin self-insert-commandbinding dari keymap global saat ini? (setq my-global-map (make-keymap)) (substitute-key-definition 'self-insert-command 'self-insert-command my-global-map global-map)
Gilles 'SANGAT berhenti menjadi jahat'
1
@Gilles, saya tidak melihat apa yang Anda temukan kompleks dalam 3 loop, tetapi merasa bebas untuk pergi jalan Anda jika Anda sudah mengujinya. Juga, pos ini lebih merupakan nilai pendidikan, sehingga orang-orang yang musnah global-mapsegera tahu masalah apa yang akan mereka hadapi dan apa resep untuk menyelesaikannya. Mereka mungkin akan mempelajari sesuatu yang baru tentang ASCII secara umum dan / atau bagaimana penerapannya di Emacs secara khusus.
Alexander Shukaev