2011-09-26 7 views

risposta

11

Io non credo che si possa configurare Emacs in modo che lo fa che per tutti i comandi. Tuttavia, è possibile implementare questa funzionalità nei comandi stessi. Questo è ciò che viene fatto per C-xe. Ecco una macro che ho appena scritto (guidato dalla definizione standard di kmacro-call-macro in GNU Emacs 23.1.1) che lo rende facile per aggiungere questa funzionalità per i propri comandi:

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

Ecco come si usa iT:

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

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

Ora è possibile digitare Cc xyzzz inserire Hello, World! tre volte.

+0

Funziona perfettamente. Grazie! – TheEzEzz

+4

Vedi anche il pacchetto 'repeat' di Emacs. –

+0

@event_jr Bello !! Grazie per il consiglio. –

1

No. La sequenza "ctrl-d ctrl-j" è ciò che è associato alla stringa "Ciao!" Emacs lega la sequenza nel suo complesso alla stringa data. Ecco alcune utili informazioni sul tema:

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

D'altra parte, se si voleva solo tre istanze di "Ciao", si potrebbe definire quella sequenza C-d C-j C-d C-j C-d C-j come "Ciao Ciao! Ciao! ", Ma sarebbe più breve per definire una sequenza più semplice per la stringa desiderata.

+0

Che cosa succede se mi legano una funzione a 'C-d' che lega "Ciao!" a 'C-j'. Quindi ogni volta che premo 'C-j' ottengo" Ciao! ". Inoltre avrei bisogno di un modo per ascoltare quando viene rilasciato il tasto 'd', in modo che potessi smettere di" Ciao! " da 'C-j'. È possibile? – TheEzEzz

+0

Se hai intenzione di farlo, perché non legare semplicemente C-j a "Ciao!" ? –

+0

Perché voglio che succeda qualcosa di diverso quando premo 'C-s C-j'. – TheEzEzz

4

Se stai cercando qualcosa di generico che funzioni su tutti i comandi, non vedo come potrebbe funzionare - come farebbe Emacs se stai iniziando un nuovo comando o vuoi ripetere il precedente. Un esempio migliore sarebbe "C-c h", se si digita "h" dopo che, emacs dovrebbe ripetere il comando o inserire una h?

Detto questo, Emacs ha già un meccanismo per questo - l'argomento universale.

Prova questa sequenza di tasti:

C-u 3 C-d C-j 

E 'anche un numero inferiore di pressione dei tasti di C-D C-j C-j C-j C-j

+0

Il mio esempio di giocattolo era probabilmente troppo piccolo. Sto cercando di rimappare JKLI come tasti di navigazione, in modo che 'C-J' sposti il ​​cursore a sinistra,' C-L 'a destra, 'C-I' su,' C-K' in basso e così via. Vorrei sovrascrivere questo comportamento in modo che se viene premuto 'd', allora' C-J' cancella a sinistra, 'C-L' cancella a destra, ecc. – TheEzEzz

2

provare qualcosa di simile:

(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 preso da kmacro-call-macro

+0

Suppongo che dovresti respingere l'ultimo evento che termina il ciclo while, in modo da non perdere la pressione di quel tasto. Vedi la risposta di Daniel Brockman, anche se altrimenti mi piace la freschezza di questa risposta. – tripleee

+0

Sì, hai ragione, grazie per la correzione –

0

Io lo uso per tutto il tempo. Avrai bisogno della libreria repeat.el (parte di GNU Emacs) per usarla.

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

Ora legare my-hello-repeat:

(set-key-global (kbd "") 'my-ciao-repeat)

Ora basta tenere premuto il chiave casa per ripetere CIAO !.

Uso questa stessa tecnica in più librerie, tra cui Bookmark+, thing-cmds e wide-n.

0

smartrep è tutto quello che vuoi

(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")))) 
Problemi correlati