Sự khác nhau giữa cài đặt các phím chế độ chính bằng một cái móc so với việc thêm chúng vào bản đồ chế độ


13

Giả sử rằng tôi đã tải xuống một chế độ chính được gọi magical-modevà nó có sơ đồ ma thuật riêng được gọi magical-mode-map. Chế độ này cũng cung cấp một hook magical-mode-hookđược chạy mỗi lần magical-modetrở thành chế độ chính của bộ đệm. Bây giờ tôi muốn sửa đổi tệp init của mình để thêm một vài ràng buộc khóa tùy chỉnh để sử dụng trong chế độ đó.

Dường như có (ít nhất) hai cách để thiết lập các ràng buộc khóa tùy chỉnh cho magical-mode. Một cái mà tôi thấy phổ biến nhất là đây:

(defun my-magical-keys ()
  (local-set-key (kbd "C-i") 'previous-line)
  (local-set-key (kbd "C-k") 'next-line)
  (local-set-key (kbd "C-j") 'backward-char)
  (local-set-key (kbd "C-l") 'forward-char))
(add-hook 'magical-mode-hook 'my-magical-keys)

Nhưng cũng có thể làm theo cách này:

(define-key magical-mode-map (kbd "C-i") 'previous-line)
(define-key magical-mode-map (kbd "C-k") 'next-line)
(define-key magical-mode-map (kbd "C-j") 'backward-char)
(define-key magical-mode-map (kbd "C-l") 'forward-char)

Phương pháp thứ hai thực sự có vẻ sạch hơn đối với tôi. Có bất kỳ lợi thế để làm điều này một cách so với cách khác?


Tôi sử dụng các phím tương tự cho các lệnh di chuyển cơ bản. Được cảnh báo: đây là một trận chiến khó khăn và bạn có thể muốn tìm hiểu thêm một chút về các ràng buộc chính trước khi bạn bắt đầu làm điều này.
tarsius

@tarsius Một trận chiến khó khăn thực sự. Tôi đã đi xuống con đường đó trước đây, nhưng bây giờ tôi đã trở lại tốt ol ' C-nC-p. Ví dụ chỉ là mã giả. Tôi muốn đưa ra một số chế độ ví dụ rất đơn giản và các ràng buộc ví dụ, chính xác để các ràng buộc đó không bị phân tâm khỏi mục đích thực tế của câu hỏi.
nispio

Câu trả lời:


15

Cách tiếp cận thứ hai là thích hợp hơn vì nó sửa đổi sơ đồ bàn phím của chế độ chỉ một lần.

Nếu bạn thực hiện bằng cách sử dụng hook của chế độ thì nó sẽ được gọi mỗi khi chế độ đó được bật trong một số bộ đệm. Làm như vậy một lần nữa thường sẽ không thực sự có hiệu lực vì các khóa chỉ bị ràng buộc một lần nữa với những gì chúng đã bị ràng buộc. Các keymap chế độ chính là "cục bộ" cho chế độ chính chứ không phải các bộ đệm riêng lẻ sử dụng chế độ đó, vì vậy nếu bạn thay đổi một ràng buộc trong một trong những bộ đệm này bằng cách sử dụng local-set-keythì điều đó sẽ ảnh hưởng đến tất cả các bộ đệm có cùng chế độ chính.

local-set-keychủ yếu được dự định sẽ được sử dụng như một lệnh. Khi bạn đã xác định rằng bạn muốn thực hiện một số thay đổi liên tục, hãy sử dụng define-keyvới sơ đồ phím chế độ làm đối số đầu tiên.

Nếu bạn sử dụng một cái móc để sửa đổi sơ đồ bàn phím nhiều lần thì điều đó có thể mâu thuẫn với mục đích sử dụng local-set-key. Giả sử bạn đã sử dụng M-x local-set-key RET C-i fancy-previous-line RETvì bạn muốn dùng thử biến thể đó previous-line. Nếu bây giờ bạn mở một bộ đệm mới sử dụng cùng chế độ chính, thì hook sẽ chạy lại và ghi đè lên liên kết tạm thời của bạn, trong tất cả các bộ đệm sử dụng chế độ chính đó, bao gồm cả bộ đệm mà bạn đã sử dụng trước đó local-set-key.


Tôi thích câu trả lời này nhưng nếu chế độ được tự động tải thì sao?
kể lại

2
Bạn có thể trì hoãn tải bất kỳ mã nào cho đến khi một số thư viện đã được tải : (eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...)).
tarsius

4

Sử dụng (define-key my-magical-mode-map …)là cách bình thường.

Khi bạn sử dụng một cái móc và local-set-key, các phím được thêm vào mỗi khi bạn vào chế độ My Magical trong một số bộ đệm. Điều này thật kỳ lạ vì local-set-keyảnh hưởng đến tất cả các bộ đệm trong cùng một chế độ (nói chung hơn, tất cả các bộ đệm sử dụng cùng một sơ đồ bàn phím). Vì vậy, nếu bạn đã thực hiện bất kỳ thay đổi nào đối với sơ đồ bàn phím, chúng sẽ bị ghi đè mỗi khi bạn vào chế độ Phép thuật của tôi trong bộ đệm.

Phương pháp thứ hai cũng có thể gây nhầm lẫn nếu bạn tùy chỉnh sơ đồ bàn phím ở những nơi khác nhau. Các hook được thực hiện theo thứ tự ngược từ thứ tự chúng được thêm vào và cho đến lần đầu tiên chúng được thực thi, bạn sẽ không thấy bất kỳ dấu vết nào về các tùy chỉnh của mình.


2

Bạn rõ ràng không hỏi về việc xác định sơ đồ bàn phím chế độ chính mà là về mã người dùng để thêm hoặc thay đổi một vài tổ hợp phím trong sơ đồ bàn phím chế độ chính hiện có . Bạn nói "tùy chỉnh", gợi ý này, nhưng chúng tôi cũng có thể làm cho nó rõ ràng.

Để chắc chắn, những gì bạn nói bạn thấy phổ biến nhất cho điều này không phải là những gì thường được sử dụng để xác định một sơ đồ phím chế độ chính. Nó không phải là những gì bạn tìm thấy trong mã nguồn Emacs, ví dụ. Và nó không phải là những gì được khuyến nghị trong hướng dẫn Elisp (nút Major Mode Conventions).

Chỉ muốn giải quyết vấn đề đó, rõ ràng cho người khác: bạn thường không muốn sử dụng móc chế độ để xác định bản đồ chế độ chính.


Đối với câu hỏi của bạn về các tùy chỉnh khóa người dùng -

Trong mọi trường hợp không phải local-set-keylà bạn nên sử dụng trong một hook chế độ. Chỉ cần sử dụng define-keyvới sơ đồ phím chế độ chính, chính xác như trong ví dụ đầu tiên của bạn. @tarsius đã giải thích điều này tốt.

Ngoài ra, câu trả lời là: nó tạo ra rất ít sự khác biệt, nói chung , cho dù bạn liên kết các phím (sử dụng define-keyvới bản đồ chế độ) một lần và mãi mãi hay bạn sử dụng móc để liên kết chúng mỗi khi bạn vào chế độ.

Nhưng nó có thể tạo ra sự khác biệt nếu các ràng buộc trong bản đồ thay đổi - ví dụ, bằng cách bạn tải một số mã khác thay đổi chúng. Trong trường hợp đó, đặt các liên kết trên móc chế độ chính đảm bảo rằng khi chế độ được nhập, các liên kết sẽ được thiết lập. Đó là, nó đảm bảo rằng chúng sẽ được thực hiện, nhưng nó không đảm bảo rằng không có gì khác thay đổi chúng sau đó (ví dụ: một chức năng khác trên cùng một hook, được gọi sau đó). Hãy nhớ rằng bạn có ít quyền kiểm soát đối với những gì được chạy trên một hook và khi nào - trừ khi, tất nhiên, bạn chắc chắn rằng chỉ có mã của riêng bạn gây rối với nó.

Đó là sự khác biệt duy nhất về hiệu quả, mà tôi có thể nghĩ đến. Để bạn quyết định khi bạn coi sự khác biệt đó là một lợi thế của cách này hay cách khác. FWIW, nhìn vào mã của riêng tôi, tôi không nghĩ mình từng ràng buộc các khóa trên móc chế độ.


Cảm ơn. Tôi đã sửa đổi câu hỏi để hy vọng làm rõ sự thật rằng tôi không tạo chế độ chính, chỉ cần thêm các ràng buộc chính của riêng tôi vào và chế độ chính hiện có .
nispio

0

Việc đặt tên của bạn hơi khó hiểu (tôi nghĩ bạn nên loại bỏ mytrong phần thứ hai của câu hỏi).

Dù sao, giả sử my-magical-keyslà một chức năng tùy biến của người dùng magical-mode, tôi thấy một lợi thế rõ ràng. Nó rất dễ dàng để loại bỏ (bằng remove-hook) hook trong một lần duy nhất.

Ưu điểm thứ hai là các chức năng có nghĩa là gì. Tôi có nghĩa là họ có thể tái sử dụng. bạn có thể móc chúng sang các chế độ khác.

Biên tập:

Như @tarsius đã chỉ ra, loại bỏ hook sẽ không khôi phục hành vi ban đầu và biến chức năng thành chế độ nhỏ có thể tốt hơn.


Tôi đang tùy chỉnh một chế độ chính giả định được gọi là my-magical-mode. Tuy nhiên, nếu việc sử dụng my-tiền tố gây nhầm lẫn, tôi chắc chắn có thể chỉnh sửa câu hỏi.
nispio

Vâng, điều đó sẽ tốt hơn, thông thường (ít nhất như tôi thấy trong tự nhiên) my-được thêm vào cho các chức năng của người dùng.
kindahero

1
Đã đồng ý. Tôi chỉ áp dụng my-để không ai nghĩ rằng tôi đang hỏi cách cấu hình một chế độ thực được gọi magical-mode(nếu nó tồn tại).
nispio

1
Không, loại bỏ các móc sẽ không khôi phục các ràng buộc cũ. Ít nhất là cho đến khi Emacs được khởi động lại, và sau đó tôi không thấy phải bình luận chỉ một dòng thay vì bốn như một cải tiến lớn như vậy.
tarsius

2
Đối với lợi thế thứ hai mà bạn đề cập: ở đây, tốt hơn là tạo một chế độ nhỏ có thể được kích hoạt cho các chế độ chính khác nhau và / hoặc chỉ một số bộ đệm sử dụng một chế độ chính cụ thể.
tarsius
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.