Làm thế nào để loại bỏ các ràng buộc với khóa tiền tố ESC


9

Tôi muốn sử dụng ESCchìa khóa thay vì C-gcho keyboard-quit. Cách tiếp cận ngây thơ của tôi chỉ để làm

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

không hoạt động. ESCvẫn là một khóa tiền tố và nhấn nó không gọi keyboard-quit.


1
Bạn có thể quan tâm đến chủ đề liên quan này - Tôi đã sử dụng giải pháp đó trong khoảng một năm cho đến khi tôi quen với Cg và ESC-ESC-ESC: Cách sử dụng <esc> (có điều kiện) làm khóa sửa đổi stackoverflow.com/a/20036348/ 2112489 Câu trả lời bởi Stefan ở chỗ chủ đề liên quan là khái niệm tương tự được sử dụng bởi các universal-argumentvới universal-argument-map.
luật

Câu trả lời:


7

Bạn có thể làm (define-key key-translation-map (kbd "ESC") (kbd "C-g")). Tôi đã làm như vậy một thời gian dài trước đây và không có vấn đề.

Chỉnh sửa để cải thiện câu trả lời theo các ý kiến:

Nếu bạn muốn giữ ESCchức năng chính, bạn có thể làm

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

Một điều cần lưu ý là nếu Emacs bị treo bạn vẫn phải sử dụng C-gchìa khóa vì một số lý do, nhưng điều đó hiếm khi xảy ra.


1
@EmacsUser Ngay cả khi tôi không bao giờ nhấn ESC khi sử dụng emacs?
Geier

1
@EmacsUser: Vậy sao? Đến bây giờ, tôi không bao giờ nhấn ESC một lần, nói gì đến hai hoặc ba lần. Tôi sẽ không bỏ lỡ nó.
Geier

2
@EmacsUser Tôi không nói rằng đây là câu trả lời đúng và tôi muốn sử dụng nó, tôi chỉ muốn hiểu những gì sai với nó. Toàn bộ "trong tương lai, bạn sẽ không thể nhấn ESC hai lần" hoàn toàn không ảnh hưởng đến tôi. Nếu bạn nói với tôi trong những điều kiện tôi có thể đi vào một vòng lặp vô tận với điều này và tại sao, điều đó sẽ thực sự sâu sắc.
Geier

1
@Geier Tôi đã sử dụng bản ánh xạ này trong một thời gian dài và chưa bao giờ gặp phải bất kỳ vấn đề nào với nó. Điều duy nhất là nếu emacs bị treo, bạn phải nhấn C-gđể gỡ rối nó, việc ESCánh xạ lại không hoạt động trong trường hợp này.
clemera

1
@EmacsUser Tôi chưa bao giờ gặp trường hợp sử dụng ESCvì vậy điều này không làm phiền tôi. Nhưng nếu bạn cần nó, bạn có thể thực hiện một bản dịch khác, ví dụ(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))
clemera

8

Lời khuyên của tôi sẽ là để lại ESCmột mình, bởi vì đó là một chìa khóa đặc biệt.

Theo mặc định, Emacs sử dụng ESC(ASCII 27) làm meta-prefix-key. Từ Cẩm nang Elisp:

'esc-map' là sơ đồ toàn cầu cho khóa tiền tố. Do đó, các định nghĩa toàn cầu của tất cả các ký tự meta thực sự được tìm thấy ở đây. Bản đồ này cũng là định nghĩa chức năng của 'Tiền tố ESC'.

Thay vào đó, các ký tự meta được coi cho mục đích tra cứu khóa là chuỗi hai ký tự, đầu tiên là ESC (hoặc bất cứ thứ gì hiện là giá trị của 'meta-prefix-char'). Do đó, khóa 'M-a' được thể hiện bên trong là 'ESC a' và ràng buộc toàn cầu của nó được tìm thấy tại vị trí 'a' trong 'esc-map'.

Vì vậy, để sử dụng ESC cho một cái gì đó khác, bạn sẽ cần phải đặt meta-pefix-keythành một cái gì đó khác, và cũng ràng buộc một số khóa khác ESC-prefix. Cũng có thể có những thay đổi khác - tôi chưa bao giờ thử điều này.

Để biết thêm về meta-prefix-char, hãy xem Chức năng tra cứu khóa trong hướng dẫn Elisp.


1
+1. Đừng không loại bỏ các ràng buộc của ESC. Ràng buộc một chìa khóa khác để keyboard-quit, nếu bạn muốn. Và lưu ý rằng ESC ESC ESCđã cung cấp cho bạn hành vi thoát mà bạn muốn - xem hướng dẫn sử dụng Emacs, Thoát khỏi nút .
vẽ

2
Đặt meta-prefix-charthành niltrên OSX sẽ không vô hiệu hóa nó thành khóa tiền tố - nó sẽ chỉ tách nó khỏi khóa meta. Trên OSX với phiên bản đồ họa của Emacs, tôi muốn tách khóa thoát khỏi khóa meta - Tôi đặt (setq meta-prefix-char nil)ngay từ đầu khởi tạo để tất cả các thư viện được tải sau đó hiểu rằng đó là điều tôi muốn. Điều này cho tôi khả năng sử dụng khóa meta làm khóa tiền tố và khóa thoát làm khóa tiền tố. Các esc-mapđược xác định ở cấp mã C-nguồn trong keymap.c. Nó có nghĩa là được sử dụng như một khóa tiền tố.
luật

@lawlist Thú vị - vậy thì bạn có ánh xạ meta thành esc-maptiền tố để duy trì các ràng buộc M- mặc định không?
glucas

Tôi nghĩ rằng đây là cài đặt có liên quan trên OSX : (setq ns-alternate-modifier 'meta), làm cho meta phím alt bên trái trên bàn phím Apple. Tôi thích sử dụng phím alt bên phải để tạo các ký tự unicode bằng cài đặt mặc định của OSX: (setq ns-right-alternate-modifier 'none)- để chèn các ký tự tiếng Tây Ban Nha, ký hiệu đoạn văn, v.v. Khi xây dựng --with-ns, cả hai phím alt trái và phải đều được đặt thành meta. Cài đặt mặc định liên kết khóa thoát với khóa meta trên OSX bằng cách sử dụng meta-prefix-char, 27như bạn đã nêu.
luật

5
Sử dụng emacs, họ nói. Nó mở rộng, họ nói. Bạn không cần phải điều chỉnh nó, nó sẽ điều chỉnh theo bạn, họ nói. Đó là, nó chỉ điều chỉnh cho bạn nếu bạn muốn thoát khỏi một tình huống bằng cách nhấn ESC ba lần. Bởi vì ai đó trong quá khứ nghĩ rằng ESC là một phím không nghe thấy (chỉ ở góc trên cùng bên trái của mỗi bàn phím) mà anh ta nên buộc nó bằng phím Meta :-(.
Geier

1

Câu trả lời đáng yêu ở đây: https://superuser.com/a/945245/624661

Trích dẫn:

Bạn có thể sử dụng điều này trong tệp init Emacs của bạn:

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

Bạn muốn liên kết [escape], không (kbd "ESC"), như các ràng buộc được tham chiếu bởi Ole show. Trong kho, điều này sẽ chỉ hoạt động nếu emacs khung trong một hệ thống cửa sổ. Tôi nghĩ rằng điều này đáng giá một chút giải thích.

(kdb "ESC")thực sự có nghĩa là ký tự điều khiển ASCII ESCvà như glucas đã đề cập, bạn chắc chắn không muốn ánh xạ lại cái này. Nhưng Esckhông phải là ASCII ESC: nó là biểu tượng escape, ít nhất là trong môi trường đồ họa. Làm thế nào nó xảy ra mà ràng buộc (kbd "ESC")ảnh hưởng Escsau đó? Điều này xảy ra bởi vì emacs dịch escapesang ESC nếu không có ràng buộc có sẵn choescape . Loại dự phòng nếu bạn muốn (được thực hiện bằng phương tiện local-function-key-mapnếu bạn quan tâm đến những điều đó).

Do đó, khi bạn ràng buộc [escape], bạn an toàn và không phải lo lắng ESC; ngoài các ràng buộc của riêng bạn, bạn chỉ cần gia tăng các keymap để nói ESCkhi nào chúng có nghĩa [escape].

Hmm ... tốt, gần như vậy. Tại sao những bản đồ này không được sử dụng [escape]lần đầu tiên? Bởi vì điều này sẽ không làm việc trong một thiết bị đầu cuối. Nếu bạn muốn Esccông việc của mình trên một thiết bị như vậy, ít nhất bạn sẽ phải tùy chỉnh thiết bị đầu cuối của mình trước đó.

Câu chuyện về thiết bị đầu cuối được báo cáo trong một bài khác: Làm thế nào để ràng buộc C- [thật? . Những gì bạn phải làm là yêu cầu thiết bị đầu cuối gửi một số chuỗi tùy chỉnh khi Escđược nhấn, sau đó ánh xạ chuỗi này đến [escape]ở giai đoạn đầu vào trong emacs (the input-decode-map).

Hi vọng điêu nay co ich.

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.