Làm thế nào để thực sự hủy liên kết TẤT CẢ các keybind toàn cầu?


8

Tôi vừa mới thử

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

nhưng việc phát hành C-hbvẫn cho thấy hàng tấn tào lao, đặc biệt là trong phần 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
...             ...

và còn rất nhiều điều nữa sẽ đến

Tôi muốn thoát khỏi những điều này hoàn toàn. Làm thế nào tôi có thể làm điều đó trong một cuộc gọi chức năng đơn giản? Tôi muốn giải pháp là xóa sổ hoàn toàn, thay vì một vòng lặp đang thiết lập tất cả các bản đồ này nil. Cảm ơn bạn trước.

LƯU Ý: Xin vui lòng, không có câu trả lời giảng dạy hoặc nhận xét spam nào như "Các phím này rất cần thiết cho năng suất, đừng làm vậy!" . Tôi có lớp mô phỏng tùy chỉnh cao để chỉnh sửa văn bản phương thức ở đây, vì vậy tôi hoàn toàn không cần các ràng buộc mặc định này.


Tôi tò mò. Có gì sai evil-modekhi bạn phải viết lớp chỉnh sửa phương thức của riêng mình?
Từ Đô

@Tu Do, nó là evil-mode, nhưng một số chức năng cấp cao nhất của nó: toán tử, đối tượng văn bản và một số lệnh đã được viết lại hoặc mở rộng bằng cách nào đó. Các ràng buộc mặc định của nó cũng hoàn toàn bị xóa sổ và sắp xếp lại trên bàn phím ngay từ đầu. Điều này tuy nhiên không có gì để làm với câu hỏi.
Alexander Shukaev

Tôi chỉ hỏi về sự tò mò. Nhưng cảm ơn.
Từ Đô

Bạn có thể nên sử dụng một sơ đồ phím không thưa thớt được tạo bằng make-keymap.
tarsius

Câu trả lời:


16

Lấy từ Hướng dẫn Lisp của Emacs (xem Kiểm soát bản đồ hoạt động ):

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

Để trích dẫn hướng dẫn: "Việc thay đổi sơ đồ toàn cầu là rất bất thường." Lưu ý an toàn: Đảm bảo bạn có thể lưu bộ đệm và thoát sạch Emacs sau đó bằng một sơ đồ khác, nếu không bạn sẽ phải giết nó mà không thay đổi đã lưu.


Bạn là đàn ông!
Alexander Shukaev

6

Mặc dù thông tin sau đây không phải là câu trả lời trực tiếp cho câu hỏi (vì nó đã được trả lời bởi @wasamasa), tôi vẫn tin rằng đó là một bổ sung thiết yếu cho câu trả lời. Vấn đề là sau khi ban hành

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

người ta thực sự xóa sạch hoàn toàn phần Bindings toàn cầu , và do đó, người ta thậm chí không thể gõ văn bản nữa! Trong phần lớn các trường hợp, một khóa học sẽ muốn khôi phục khả năng nhập văn bản vì nó là điều cần thiết cho bất kỳ trình soạn thảo văn bản nào. Vì vậy, đây là một cách để làm điều đó:

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

Để các bạn tin rằng mã Lisp Emacs này là một cách chính xác để làm điều đó, tôi sẽ cung cấp nguồn mà tôi đã sử dụng để sản xuất nó. Theo mặc định, khả năng nhập văn bản với trang mã ASCII 8 bit hiện tại được triển khai trong cmds.cđơn vị dịch mã của mã nguồn 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");

Như bạn có thể thấy, mã Lisp của Emacs ở trên là bản sao chính xác của mã C này, ngoại trừ một dòng bổ sung:

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

Xem xét nó là một cảnh báo, nhưng dòng này là quan trọng để có! Mặt khác, chỉ có 7 bit của trang mã ASCII hiện tại sẽ có sẵn (bất kể thực tế là chúng tôi đã khởi tạo tất cả 8 bit).


3
Điều này có vẻ phức tạp quá mức. Tại sao không sao chép các self-insert-commandràng buộc từ sơ đồ toàn cầu hiện tại? (setq my-global-map (make-keymap)) (substitute-key-definition 'self-insert-command 'self-insert-command my-global-map global-map)
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles, tôi không thấy những gì bạn thấy phức tạp trong 3 vòng, nhưng cứ thoải mái đi theo cách của bạn nếu bạn đã thử nghiệm nó. Ngoài ra, bài đăng này có nhiều giá trị giáo dục, để những người xóa sổ global-mapngay lập tức biết vấn đề họ sẽ gặp phải là gì và công thức để giải quyết nó là gì. Họ có thể sẽ học được điều gì đó mới về ASCII nói chung và / hoặc cách nó được triển khai trong Emacs nói riêng.
Alexander Shukaev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.