2011-09-26 27 views

Trả lời

11

Tôi không nghĩ rằng bạn có thể cấu hình Emacs để nó nào đó cho tất cả các lệnh. Tuy nhiên, bạn có thể thực hiện chức năng này trong chính các lệnh. Đây là những gì được thực hiện cho C-x e. Dưới đây là một macro tôi chỉ viết (hướng dẫn bởi độ nét tiêu chuẩn của kmacro-call-macro trong GNU Emacs 23.1.1) mà làm cho nó dễ dàng để thêm chức năng này vào các lệnh của riêng bạn:

(defmacro with-easy-repeat (&rest body) 
    "Execute BODY and repeat while the user presses the last key." 
    (declare (indent 0)) 
    `(let* ((repeat-key (and (> (length (this-single-command-keys)) 1) 
          last-input-event)) 
      (repeat-key-str (format-kbd-macro (vector repeat-key) nil))) 
    ,@body 
    (while repeat-key 
     (message "(Type %s to repeat)" repeat-key-str) 
     (let ((event (read-event))) 
     (clear-this-command-keys t) 
     (if (equal event repeat-key) 
      (progn ,@body 
        (setq last-input-event nil)) 
      (setq repeat-key nil) 
      (push last-input-event unread-command-events)))))) 

Đây là cách bạn sử dụng nó:

(defun hello-world() 
    (interactive) 
    (with-easy-repeat 
    (insert "Hello, World!\n"))) 

(global-set-key (kbd "C-c x y z") 'hello-world) 

Bây giờ bạn có thể gõ Cc xyzzz để chèn Hello, World! ba lần.

+0

Hoạt động hoàn hảo. Cảm ơn bạn! – TheEzEzz

+4

Xem thêm gói 'lặp lại 'của Emacs. –

+0

@event_jr Đẹp !! Cảm ơn vì tiền hỗ trợ. –

1

No. Trình tự "ctrl-d ctrl-j" là nội dung được gắn với chuỗi "Xin chào!" Emacs liên kết chuỗi với toàn bộ chuỗi đã cho. Dưới đây là một số thông tin tốt về chủ đề này:

http://xahlee.org/emacs/keyboard_shortcuts.html

Mặt khác, nếu bạn muốn chỉ ba trường hợp của "Hello", bạn thể xác định rằng chuỗi C-d C-j C-d C-j C-d C-j như "Hello Hello! Xin chào! ", Nhưng sẽ ngắn hơn nếu chỉ định nghĩa một chuỗi đơn giản hơn cho chuỗi bạn muốn.

+0

gì nếu tôi gắn một chức năng để 'C-d' gắn kết "Xin chào!" thành 'C-j'. Sau đó, mỗi lần tôi nhấn phím 'C-j', tôi nhận được" Xin chào! ". Ngoài ra, tôi sẽ cần một số cách để lắng nghe khi phím 'd' được phát hành, để tôi có thể unbind" Xin chào! " từ 'C-j'. Điều đó có khả thi không? – TheEzEzz

+0

Nếu bạn định làm điều đó, tại sao không chỉ liên kết C-j với "Hello!" ? –

+0

Bởi vì tôi muốn điều gì đó khác xảy ra khi tôi nhấn 'C-s C-j'. – TheEzEzz

4

Nếu bạn đang tìm kiếm một cái gì đó chung chung hoạt động trên tất cả các lệnh, tôi không thể thấy nó hoạt động như thế nào - làm thế nào emacs biết nếu bạn đang bắt đầu một lệnh mới hoặc muốn lặp lại trước đó. Một ví dụ tốt hơn sẽ là "C-c h", nếu bạn gõ "h" sau đó, nên emacs lặp lại lệnh hoặc chèn một h?

Điều đó nói rằng, các emacs đã có cơ chế cho điều này - đối số chung.

Hãy thử dãy phím này:

C-u 3 C-d C-j 

Đó là bấm phím thậm chí ít hơn so với C-d C-j C-j C-j C-j

+0

Ví dụ đồ chơi của tôi có lẽ quá đồ chơi-ey. Tôi đang cố gắng để remap JKLI là phím điều hướng của tôi, để 'C-J' di chuyển con trỏ sang trái,' C-L' phải, 'C-I' lên,' C-K' xuống và cứ thế. Tôi muốn ghi đè hành vi này để nếu 'd' được nhấn thì' C-J' xóa bên trái, 'C-L' xóa phải, v.v. – TheEzEzz

2

Hãy thử một cái gì đó như thế này:

(global-set-key (kbd "C-c C-j") (lambda() 
            (interactive) 
            (insert "Hello!") 
            (message "Type j to print Hello!") 
            (while (equal (read-event) ?j) 
            (insert "Hello!")) 
            (push last-input-event unread-command-events))) 

Idea lấy từ kmacro-call-macro

+0

Tôi cho rằng bạn nên đẩy lùi sự kiện cuối cùng kết thúc vòng lặp while, để không bị mất phím bấm đó. Xem câu trả lời của Daniel Brockman, mặc dù tôi không thích sự rõ ràng của câu trả lời này. – tripleee

+0

Có, bạn nói đúng, cảm ơn bạn đã chỉnh sửa –

0

tôi sử dụng tất cả các thời gian. Bạn sẽ cần thư viện repeat.el (một phần của GNU Emacs) để sử dụng nó.

 
    (defun make-repeatable (command) 
     "Repeat COMMAND." 
     (let ((repeat-message-function 'ignore)) 
     (setq last-repeatable-command command) 
     (repeat nil))) 

    (defun my-hello() 
     "Single `hello'." 
     (interactive) 
     (insert "HELLO!")) 

    (defun my-hello-repeat() 
     (interactive) 
     (require 'repeat) 
     (make-repeatable 'my-hello)) 

Bây giờ ràng buộc my-hello-repeat:

(toàn cầu-thiết-key (kbd "") 'my-hello-repeat)

Bây giờ chỉ cần giữ phím nhà chìa khóa để lặp lại Hello !.

Tôi sử dụng kỹ thuật tương tự này trong nhiều thư viện, bao gồm Bookmark+, thing-cmdswide-n.

0

smartrep là tất cả các bạn muốn

(require 'smartrep) 

(defvar ctl-d-map (make-keymap)) ;; create C-d map 
(define-key global-map "\C-d" ctl-d-map) 


(smartrep-define-key 
    global-map "C-d" 
    '(("C-j" . (insert "hello")))) 
Các vấn đề liên quan