Répéter la dernière insertion de texte

10

Dans Vim, vous pouvez appuyer sur .pour répéter la dernière modification, y compris l'insertion de texte.

Dans Emacs, C-x zrépète uniquement la dernière commande. Je suis conscient que les macros peuvent être utilisées ici, mais le plus souvent, je me rends compte que je dois réinsérer le même texte trop tard. Lorsque je dois la réinsérer une seule fois de plus , définir une macro est alors inutile.

Q: Existe - t-il un moyen de répéter l'insertion de texte à l'intérieur d'Emacs?

ooi
la source
1
Quel est le "texte" que vous souhaitez répéter? Techniquement parlant, la dernière insertion n'est que le dernier caractère, ce qui n'est probablement pas ce que vous recherchez. Alors, comment définiriez-vous une "insertion de texte" pour votre objectif? Le clarifier peut également vous aider à trouver des moyens d'y parvenir.
T. Verron
Hmm bonne question - comment définir cette dernière modification de tampon continue . Peut-être une modification de tampon entre deux déplacements de points qui ne sont pas le résultat d'une modification de tampon ( C-f, recherche, etc.)? Si cela a un sens ...
ooi
Clarifiez ce que vous voulez avec une recette. Il existe de nombreux types d'insertion (façons d'insérer du texte). Insérez-vous de manière interactive? Si c'est le cas, comment?
Drew
Interactivement. Mais idéalement, peu importe comment ou quoi. C'est comme si j'avais oublié de commencer à définir une macro . Dans ce cas, le problème est quand est-ce. Peut-être qu'un crochet pourrait être utilisé.
ooi
2
Comment définissez-vous la «dernière insertion» dans Emacs? Puisqu'il n'y a pas de commutateur de mode d'édition / commande comme dans vi, jusqu'où dans l'histoire devrions-nous aller? Je sélectionne généralement "le dernier insert" ( C-space, déplace le curseur, M-wpour copier), puis je C-ycolle autant de fois que nécessaire.
Alain

Réponses:

7

dot-modeest un "mode mineur pour répéter la saisie ou les commandes" et peut faire ce dont vous avez besoin. Il répète simplement les dernières insertions / suppressions que vous faites. C'est assez similaire à .Vi (m).

Bill Benedetto
la source
2
Que fait- il?
Malabarba du
1
Bienvenue sur Emacs.SE. En ce moment, votre réponse est plus proche d'un commentaire qu'une réponse. Pourriez-vous le modifier pour expliquer ce qu'il dot-modefait et comment il fournit les fonctionnalités que OP essaie d'obtenir?
Dan
7

C'est comme si j'avais oublié de commencer à définir une macro

Vous pouvez utiliser kmacro-edit-lossage( C-x C-k l) pour cela: il vous permet de visualiser vos 300 dernières frappes (y compris les insertions simples), et de les modifier sous forme de macro.

Pour une utilisation simple, il vous suffit de localiser le début de l'insertion que vous souhaitez répéter, de supprimer tout le texte de "Macro:" à ce point et d'appuyer sur C-c C-c. Vous disposez maintenant d'une macro que vous pouvez utiliser pour effectuer les mêmes actions, comme si vous n'aviez pas oublié de l'enregistrer en premier lieu.

Malheureusement, cela échoue si les 300 dernières frappes incluent des clics de souris.

Modifier: le code suivant le modifie afin que seules les clés après le dernier événement de souris soient conservées.

(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)
T. Verron
la source
Je fais souvent défiler à l'aide de la souris, ce serait cool de voir comment supprimer ceux de la macro.
ooi
Wow, cette commande serait utile si elle n'échouait pas complètement si les 300 derniers clics de souris inclus. Peut-être simplement ne pas inclure les clics et informer l'utilisateur au lieu de simplement refuser de travailler.
nounou
@nanny J'ai ajouté quelques éléments pour permettre une (imo) meilleure solution de repli que de simplement échouer avec un message d'erreur: avec cette fonction, seules les clés après le dernier événement de la souris seront conservées. La suppression complète des événements de la souris devrait également être possible, mais le résultat de la macro serait quelque peu imprévisible.
T. Verron
@ooi Aucune idée si vous avez été pingé automatiquement par le commentaire précédent, alors voici aussi votre ping.
T. Verron
Merci, je travaillais sur la même chose. Je pense qu'il peut être possible de filtrer les arguments de edmacro-fix-menu-commands. Il prend un argument facultatif qui peut ignorer les événements de la souris. Mais je ne connais pas assez le système de conseil pour le faire fonctionner.
nounou
4

Je pense que la dabbrev-expandfonction pourrait faire l'affaire. Supposons que vous ayez déjà tapé quelques mots: emacs, emotion, emoji, ... La prochaine fois que vous taperez un mot commençant par 'em', vous pourrez taper M-/et emacs vous proposera d'insérer l'un des mots déjà insérés commençant par 'em'. Continuez à frapper M-/et emacs vous montrera 'emoji', puis 'émotion, puis ...

Vous pouvez également consulter la commande repeat-complex-command . L'exemple populaire étant: vous voulez répéter la commande query-replacedans de nombreux tampons différents en utilisant toujours les mêmes arguments, remplacez «pitt» par «patt».

Vous l'exécutez une fois, accédez à une autre fenêtre et tapez C-x ESC ESCpour l'exécuter à nouveau.

Et pour terminer, puis-je suggérer de répéter l'insertion ? Ce fichier el vous aidera à faire l'insertion, en utilisant une sorte de logique. Cela ressemble plus à «répéter la dernière insertion, mais pour chaque itération, les arguments changeront.

Cet exemple se trouve dans le fichier 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)

J'espère que cela aidera.

Nsukami _
la source
1
Peut-être que vous pouvez développer un peu ...
T. Verron
@ T.Verron Done :)
Nsukami _
1
Répéter-complexe-commande est comme repeat(ce que l'OP mentionne), pas vraiment utile pour les insertions de texte. Repeat-insertdoit être pensé avant d'insérer le texte, tout comme une macro. Mais dabbrev-expandc'est une bonne idée!
T. Verron