Ripeti l'ultimo inserimento di testo


10

In Vim puoi premere .per ripetere l'ultima modifica, incluso l'inserimento di testo.

Mentre in Emacs C-x zripete solo l'ultimo comando. Sono consapevole che le macro possono essere utilizzate qui, ma più spesso mi rendo conto che devo reinserire lo stesso testo troppo tardi. Quando devo reinserirlo solo un'altra volta , definire una macro non ha senso.

D: C'è un modo per ripetere l'inserimento di testo all'interno di Emacs?


1
Qual è il "testo" che vuoi ripetere? Tecnicamente parlando, l'ultimo inserimento è solo l'ultimo personaggio, che probabilmente non è quello che stai cercando. Quindi, come definiresti un "inserimento di testo" per il tuo scopo? Chiarirlo può anche aiutarti a trovare modi per raggiungerlo.
T. Verron,

Hmm buona domanda - come definire l' ultima modifica continua del buffer . Forse una modifica del buffer tra mosse a due punti che non sono il risultato di una modifica del buffer ( C-f, ricerca, ecc.)? Se questo ha un senso ...
ooi,

Chiarisci cosa vuoi con una ricetta. Esistono molti tipi di "inserimento" (modi per inserire testo). Stai inserendo in modo interattivo? Se é cosi, come?
Estratto il

In modo interattivo. Ma idealmente non importa come o cosa. È come se avessi dimenticato di iniziare a definire una macro . Nel qual caso il problema è quando è quello. Forse un po 'di gancio potrebbe essere usato.
ooi,

2
Come si definisce "ultimo inserimento" in Emacs? Dal momento che non esiste un interruttore di modifica / modalità di comando come in vi, quanto lontano nella storia dovremmo andare? Di solito seleziono solo "l'ultimo inserto" ( C-space, muovo il cursore, M-wper copiare) e poi C-yper incollare tutte le volte che è necessario.
Alain,

Risposte:


7

dot-modeè una "modalità secondaria per ripetere la digitazione o i comandi" e può fare ciò di cui hai bisogno. Fondamentalmente ripete solo gli ultimi inserimenti / cancellazioni che fai. È abbastanza simile a .Vi (m).


2
Che cosa fa fare?
Malabarba,

1
Benvenuto in Emacs.SE. In questo momento, la tua risposta è più vicina a un commento che a una risposta. Potresti modificarlo per spiegare cosa dot-modefa e come fornisce le funzionalità che OP sta cercando di ottenere?
Dan

7

È come se avessi dimenticato di iniziare a definire una macro

Potresti usare kmacro-edit-lossage( C-x C-k l) per questo: ti permette di visualizzare i tuoi ultimi 300 tasti (inclusi semplici inserimenti) e modificarli come macro.

Per un semplice utilizzo, è sufficiente individuare l'inizio dell'inserimento che si desidera ripetere, eliminare tutto il testo da "Macro:" a quel punto e premere C-c C-c. Ora hai una macro che puoi usare per eseguire le stesse azioni, come se non ti dimenticassi di registrarla in primo luogo.

Purtroppo, questo fallisce se gli ultimi 300 tasti includono clic del mouse.

Modifica: il codice seguente lo modifica in modo che vengano conservati solo i tasti dopo l'ultimo evento del mouse.

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)

Scorro spesso con il mouse, sarebbe bello vedere come rimuovere quelli dalla macro.
ooi,

Caspita, questo comando sarebbe utile se non fallisse completamente se gli ultimi 300 inclusi clic del mouse. Forse non includere i clic e informare l'utente invece di rifiutare di lavorare.
Tata

@nanny Ho aggiunto un po 'di elisp per abilitare un fallback (imo) migliore rispetto al semplice errore con un messaggio di errore: con questa funzione, verranno conservati solo i tasti dopo l'ultimo evento del mouse. Anche eliminare completamente gli eventi del mouse dovrebbe essere possibile, ma il risultato della macro sarebbe alquanto imprevedibile.
T. Verron,

@ooi Nessuna idea se il commento precedente ti ha inviato automaticamente il ping, quindi ecco anche il tuo ping.
T. Verron,

Grazie, stavo lavorando alla stessa cosa. Penso che potrebbe essere possibile filtrare gli argomenti di edmacro-fix-menu-commands. Prende un argomento opzionale che può ignorare gli eventi del mouse. Ma non conosco abbastanza il sistema di consulenza per farlo funzionare.
Tata

4

Penso che la dabbrev-expandfunzione potrebbe fare il trucco. Supponiamo che tu abbia già digitato alcune parole: emacs, emozione, emoji, ... La prossima volta che digiti una parola che inizia con 'em', puoi M-/premere ed emacs ti proporrà di inserire una delle parole già inserite a cominciare da 'em'. Continua a colpire M-/ed emacs ti mostrerà 'emoji', quindi 'emozione, quindi ...

Puoi anche dare un'occhiata a repeat-complex-command . L'esempio popolare è: si desidera ripetere il comando query-replacein molti buffer diversi usando sempre gli stessi argomenti, sostituire "pitt" con "patt".

Lo esegui una volta, vai in un'altra finestra e digita C-x ESC ESCper eseguirlo di nuovo.

E per finire, posso suggerire di ripetere l'inserimento ? Questo file el ti aiuterà a fare l'inserimento, usando un qualche tipo di logica. È più simile a "raccogliere nuovamente l'ultimo inserimento, ma per ogni iterazione, gli argomenti cambieranno.

Questo esempio può essere trovato nel file el :

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

Spero che possa essere d'aiuto.


1
Forse puoi espandere un po '...
T. Verron il

@ T.Verron Done :)
Nsukami _

1
Il comando di ripetizione complessa è simile repeat(menzionato dall'OP), non molto utile per gli inserimenti di testo. Repeat-insertdeve essere pensato prima di inserire il testo, proprio come una macro. Ma dabbrev-expandè una bella idea!
T. Verron,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.