Lassen Sie mich ein Tastatur-Makro definieren: Ich gebe ein C-x (, gehe dann zum Anfang mit M-<und M-%tippe, um einige Vorkommen von foo durch Balken abzufragen und zu ersetzen . Von 3 gefundenen Vorkommen ersetze ich nur die letzten 2, speichere dann mit C-x C-sund beende das kbd-Makro mit C-x ). Gut gemacht!!
Wenn ich jetzt das kbd-Makro in einem anderen Puffer ausführe, werde ich nicht gefragt, ob ich foo durch bar ersetzen möchte. Es werden genau meine vorherigen Nein-Ja-Ja-Antworten reproduziert und das 2. und 3. Vorkommen ersetzt! Es wird nicht nach dem 4. oder 5. Vorkommen gefragt (dieser 2. Puffer enthält mehr Foo s) !! Dies habe ich nicht erwartet, als ich das Makro definiert habe. Ich wollte, dass es anruft query-replace
und ich seine Fragen beantworten kann ...
Nebenfrage: Findest du das nicht falsch? [Ich kann M-x edit-last-kbd-macro
und sehe, was aufgezeichnet ist und verstehe die Logik von allem, aber ich finde das immer noch falsch.]
Echte Frage: Was hätte ich verwenden können, anstatt query-replace
mein kbd-Makro wie erwartet zum Laufen zu bringen?
M-%
- und gibt sie genau wieder. Ich habe noch nie ein Makro mit interaktiven Teilen gesehen und würde es auch nicht erwarten. An dieser Stelle ist es wahrscheinlich besser, eine normale interaktive Elisp-Funktion zu schreiben.start-kbd-macro-dwim
.Antworten:
Emacs-Makros geben alles wieder, was der Benutzer im Verlauf des Makros eingibt, es sei denn, sie entkommen dem Makro. Der Weg, um einem laufenden Makro zu entkommen, ist mit C-x q
kbd-macro-query
.Insbesondere glaube ich, dass Sie eine rekursive Bearbeitung eingeben müssen, die einen Befehl im Minibuffer auffordern kann, bevor Sie das Makro fortsetzen.
Ich denke, Sie möchten Ihre definieren,
query-replace
wenn Sie das Makro aufrufen.Beim nächsten Mal
kmacro-end-or-call-macro
springt es zum Anfang des Puffers und gibt eine rekursive Bearbeitung ein, in der Sie aufrufen könnenquery-replace
. Wenn Sie dann die rekursive Bearbeitung beenden, C-M-cwird das Makro von diesem Punkt aus fortgesetzt.Wenn Sie nach einem alternativen Argument fragen möchten
query-replace
, ist es möglicherweise sinnvoll, eine einfache interaktive Wrapper-Funktion zu schreiben,query-replace
anstatt eine rekursive Bearbeitung zu verwenden.quelle
query-replace
. Es scheint nicht einmal so, als würde dies dasFROM-STRING
oder rettenTO-STRING
.Dies scheint nicht gut für ein Tastaturmakro zu passen, da Sie nach Benutzereingaben fragen möchten. Vermutlich möchten Sie ein Makro aufzeichnen, da dies
query-replace
häufig beabsichtigt ist. Wenn Sie das Tastaturmakro nicht dazu bringen können, das zu tun, wonach Sie suchen, können Sie eine Tastenkombination für Ihren spezifischen Aufrufquery-replace
wie folgt erstellen :Sie können dies entweder zu Ihrer Init-Datei hinzufügen und es steht Ihnen beim nächsten Start von Emacs zur Verfügung, oder Sie können es für eine Probefahrt nehmen, indem Sie es in den
*scratch*
Puffer einfügen und ausführenM-x eval-buffer
. Es ist gebunden anC-c q
, aber das kann leicht geändert werden, was Sie wollen.quelle