Wiederholen Sie die letzte Texteinfügung

10

In Vim können Sie drücken ., um die letzte Änderung zu wiederholen, einschließlich des Einfügens von Text.

In Emacs wird C-x znur der letzte Befehl wiederholt. Ich bin mir bewusst, dass hier Makros verwendet werden können, aber mehr als oft stelle ich fest, dass ich denselben Text zu spät erneut einfügen muss. Wenn ich es nur noch einmal einfügen muss , ist es sinnlos, ein Makro zu definieren.

F: Gibt es eine Möglichkeit, das Einfügen von Text in Emacs zu wiederholen?

ooi
quelle
1
Was ist der "Text", den Sie wiederholen möchten? Technisch gesehen ist die letzte Einfügung nur das letzte Zeichen, was wahrscheinlich nicht das ist, wonach Sie suchen. Wie würden Sie eine "Texteinfügung" für Ihren Zweck definieren? Die Klärung kann Ihnen auch dabei helfen, Wege zu finden, dies zu erreichen.
T. Verron
Hmm gute Frage - wie man diese letzte kontinuierliche Pufferänderung definiert . Vielleicht eine Pufferänderung zwischen zwei Punktbewegungen, die nicht das Ergebnis einer Pufferänderung ( C-f, Suche usw.) sind? Wenn das Sinn macht ...
ooi
Klären Sie mit einem Rezept, was Sie wollen. Es gibt viele Arten des "Einfügens" (Möglichkeiten zum Einfügen von Text). Fügen Sie interaktiv ein? Wenn das so ist, wie?
Drew
Interaktiv. Aber im Idealfall wäre es egal wie oder was. Es ist, als hätte ich vergessen, ein Makro zu definieren . In diesem Fall ist das Problem, wann das ist. Vielleicht könnte ein Haken verwendet werden.
ooi
2
Wie definieren Sie "letzte Einfügung" in Emacs? Wie weit in der Geschichte sollten wir gehen, da es keinen Bearbeitungs- / Befehlsmodusschalter wie in vi gibt? Normalerweise wähle ich einfach "die letzte Einfügung" aus ( C-spacebewege den Cursor, um M-wzu kopieren) und C-yfüge dann so oft wie nötig ein.
Alain

Antworten:

7

dot-modeist ein "Nebenmodus zum Wiederholen von Eingaben oder Befehlen" und kann das tun, was Sie brauchen. Grundsätzlich werden nur die letzten Einfügungen / Löschungen wiederholt, die Sie ausführen. Es ist ziemlich ähnlich wie .in Vi (m).

Bill Benedetto
quelle
2
Was macht es?
Malabarba
1
Willkommen bei Emacs.SE. Im Moment ist Ihre Antwort näher an einem Kommentar als an einer Antwort. Könnten Sie es bitte bearbeiten, um zu erklären, was es dot-modetut und wie es die Funktionalität bietet, die OP zu erhalten versucht?
Dan
7

Es ist, als hätte ich vergessen, ein Makro zu definieren

Sie könnten dafür kmacro-edit-lossage( C-x C-k l) verwenden: Sie können Ihre 300 letzten Tastenanschläge (einschließlich einfacher Einfügungen) anzeigen und als Makro bearbeiten.

Zur einfachen Verwendung suchen Sie einfach den Anfang der Einfügung, die Sie wiederholen möchten, löschen den gesamten Text von "Makro:" bis zu diesem Punkt und drücken C-c C-c. Jetzt haben Sie ein Makro, mit dem Sie dieselben Aktionen ausführen können, als hätten Sie nicht vergessen, es überhaupt aufzuzeichnen.

Leider schlägt dies fehl, wenn die letzten 300 Tastenanschläge Mausklicks enthalten.

Bearbeiten: Der folgende Code ändert es so, dass nur die Tasten nach dem letzten Mausereignis erhalten bleiben.

(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
quelle
Ich scrolle oft mit der Maus, es wäre cool zu sehen, wie man diese aus dem Makro entfernt.
ooi
Wow, dieser Befehl wäre nützlich, wenn er nicht vollständig fehlschlagen würde, wenn die letzten 300 Mausklicks enthalten wären. Vielleicht schließen Sie die Klicks einfach nicht ein und lassen Sie den Benutzer wissen, anstatt sich nur zu weigern, zu arbeiten.
Kindermädchen
@nanny Ich habe ein Elisp hinzugefügt, um einen (imo) besseren Fallback zu ermöglichen, als nur mit einer Fehlermeldung zu scheitern: Mit dieser Funktion werden nur die Tasten nach dem letzten Mausereignis beibehalten. Das vollständige Löschen der Mausereignisse sollte ebenfalls möglich sein, aber das Ergebnis des Makros wäre etwas unvorhersehbar.
T. Verron
@ooi Keine Ahnung, ob Sie durch den vorherigen Kommentar automatisch einen Ping erhalten haben. Hier ist also auch Ihr Ping.
T. Verron
Danke, ich habe an der gleichen Sache gearbeitet. Ich denke, es könnte möglich sein, die Argumente von zu filtern edmacro-fix-menu-commands. Es wird ein optionales Argument benötigt, das die Mausereignisse ignorieren kann. Aber ich weiß nicht genug über das Beratungssystem, um es zum Laufen zu bringen.
Kindermädchen
4

Ich denke, dabbrev-expandFunktion könnte den Trick machen. Angenommen, Sie haben bereits einige Wörter eingegeben: Emacs, Emotion, Emoji, ... Wenn Sie das nächste Mal ein Wort eingeben, das mit 'em' beginnt, können Sie M-/drücken, und Emacs schlägt Ihnen vor, eines der bereits eingefügten Wörter einzufügen von 'em' beginnen. Schlagen Sie weiter M-/und Emacs zeigen Ihnen "Emoji", dann "Emotion", dann ...

Möglicherweise möchten Sie auch den Befehl zum Wiederholen eines komplexen Befehls verwenden . Das beliebte Beispiel ist: Sie möchten den Befehl query-replacein vielen verschiedenen Puffern wiederholen und dabei immer dieselben Argumente verwenden. Ersetzen Sie "pitt" durch "patt".

Sie führen es einmal aus, wechseln in ein anderes Fenster und geben ein C-x ESC ESC, um es erneut auszuführen.

Und zum Schluss kann ich das wiederholte Einfügen vorschlagen ? Diese el-Datei hilft Ihnen beim Einfügen mithilfe einer Logik. Es ist eher so, als würde man die letzte Einfügung wiederholen, aber für jede Iteration ändern sich die Argumente.

Dieses Beispiel finden Sie in der el- Datei:

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

Ich hoffe das wird helfen.

Nsukami _
quelle
1
Vielleicht können Sie ein wenig erweitern ...
T. Verron
@ T.Verron Done :)
Nsukami _
1
Repeat-Complex-Befehl ist wie repeat(was das OP erwähnt), nicht wirklich nützlich für Texteinfügungen. Repeat-insertmuss vor dem Einfügen des Textes wie bei einem Makro bedacht werden. Ist dabbrev-expandaber eine schöne Idee!
T. Verron