Wie beende ich die Aufnahme in der Befehlszeile?

18

Wenn ich ein Makro mit aufzeichne qund fertig bin, kann ich Folgendes eingeben:

  • q um die Aufnahme zu beenden, wenn ich mich im normalen oder visuellen Modus befinde.
  • <c-o>q um die Aufnahme zu beenden, wenn ich mich im Einfügemodus befinde.
  • ..

    Wie stoppe ich die Aufzeichnung, wenn mein Makro im Befehlsmodus endet?

iago-lito
quelle
Was ist Ihr Anwendungsfall dafür? Ich bin wirklich nur neugierig :)
PhilippFrank
2
@PhilippFrank Ich werde häufig dasselbe Muster in verschiedenen Textblöcken suchen und durch ein anderes ersetzen. Mit einem solchen Makro kann das Auswählen des Blocks, das Schreiben des tatsächlichen Suchmusters und das Platzieren des Cursors auf der richtigen Position zum Eingeben der Ersetzungskette automatisch erfolgen. Wenn ich es spiele, wählt es den Block aus, wechselt in den Befehlsmodus, tippt :'<,'>s/toBeReplaced//gund setzt dann den Cursor zwischen die beiden, //sodass ich nur noch tippen muss newString<cr>und fertig bin. :)
iago-lito
Es ist also wie ein Makro mit einem Parameter. Sehr schöne Idee, danke!
PhilippFrank
@PhilippFrank irgendwie, ja. Ich freu mich, dass es dir gefällt. :)
iago-lito

Antworten:

11

Eine andere Lösung ist, wenn Sie sich im Befehlszeilenmodus befinden Ctrl-fund drücken q, um die Aufnahme zu stoppen.

Ctrl-fErmöglicht das Öffnen des Befehlszeilenfensters, in dem Sie den Befehl im normalen Modus bearbeiten können. Verwenden Sie einfach die Eingabetaste, um den Befehl zu bestätigen.


Deshalb, nachdem Sie etwas hinzugefügt haben:

cnoremap <c-q> <c-f>i<c-o>q

In Ihrem .vimrckönnen Sie verwenden <c-q>, um die Aufzeichnung eines Makros im Befehlsmodus zu beenden.


Florent

florent
quelle
Sie müssen das <Cf> -Zeichen ( ^F) noch vom Ende des Makros entfernen , oder? Zumindest sehe ich das so.
VanLaser
Fast dort! Wirklich nützlich (ich wusste nicht über das Befehlszeilenfenster, aber es ist großartig), aber .. aargh! Es scheint, als würde beim Öffnen dieses Fensters im Einfügemodus der ausgewählte Bereich verloren gehen. Kann der Befehl, den Sie über das Befehlszeilenfenster starten, in einem ausgewählten Bereich ausgeführt werden?
iago-lito
@VanLaser Nein, da Sie den Befehl in das Befehlszeilenfenster eingeben können. Ihr Makro sieht so aus, qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qund die Aufnahme wurde tatsächlich angehalten, während Sie den Befehlsteil eingegeben haben. So verwenden Sie das Makro: @qFINISHYOURCOMMAND<cr>und fertig: Sie müssen es nicht bearbeiten. Leider scheint dies im visuellen Modus nicht zu funktionieren (oder es verliert die Auswahl) .. oder habe ich etwas verpasst?
iago-lito
Ah, richtig :) Übrigens, ich könnte einen visuellen Bereich auswählen und dann tun @qund der Bereich wurde beim Befehlsstart hinzugefügt '<,'>- solange das Makro mit :... begann
VanLaser
@ lago-lito Eigentlich sieht es so aus, als würde der angegebene Bereich (dh '<,'>) bei der Bestätigung des Befehls immer noch mit der Auswahl übereinstimmen, auch wenn Sie Ihre Auswahl nicht sehen .
fflorent
17

Ein Weg, es zu tun:

  • starte dein Makro wie gewohnt (zB qq... andere Zeichen)
  • Wenn Sie den cmdline-Modus erreichen, schreiben Sie alle gewünschten Zeichen
  • Sie möchten das Makro hier beenden. Hit , ESCum aus cmdline-Modus, qdas Makro zu beenden.
  • Entfernen Sie das ESCaus Ihrem qRegister (*): Sie können es in einen Puffer einfügen, das ^[Zeichen entfernen , das gesamte Material erneut auswählen (zeichenweise) und es zurückziehen, um es zu registrieren q.
  • Das ist es: führen Sie Ihre Makro: @q.

Grundsätzlich "nachbearbeiten" Sie Ihr Makro ein wenig, da es in einem Register gespeichert ist :)

(*) Ein schneller Weg, um das letzte Zeichen aus einem im Register gespeicherten Makro zu entfernen, qwäre:

:let @q = @q[:-2]
VanLaser
quelle
Haha! Dies war bisher tatsächlich mein Hack = D. Gibt es nicht einen "kanonischen" Weg, dies zu tun? (auch schneller )
iago-lito
Ich kenne keinen, aber ich verwende Makros nicht zu oft (ich bevorzuge es, stattdessen kleine Funktionen zu schreiben). Makros fühlen sich für mich zu kryptisch an, wenn ich sie mir danach ansehe.
VanLaser
@VanLaser: könntest du :let @q = @q[:-2]bitte ein bisschen mehr Details über die Leitung geben ? Vor allem wie funktioniert das [:-2]? :-)
statox
Es "schneidet" und arbeitet mit Listen und Strings (wie ich oben zugreife / setze @q). Einige Beispiele hier
VanLaser
@ VanLaser sie sehen wirklich kryptisch aus. Es gibt jedoch nützliche Informationen für das Wiederholen anspruchsvoller kleiner Dinge, die Sie in ganz bestimmten Fällen tun müssen. Sie kennen diese Art von Problemen, die nur einmal auftreten und nur einige Minuten andauern. Es ist einfach wunderbar, mit ihnen umzugehen, indem Sie Makros im laufenden Betrieb erstellen und ohne eine dedizierte Funktion schreiben und debuggen zu müssen. ^ ^
iago-lito
3

Nachdem Sie Ihren Kommentar zum Anwendungsfall gelesen haben, können Sie anscheinend eine Tastenzuordnung anstelle eines Makros verwenden.

Ich habe diese Zeile in meinem .vimrc (weiß nicht mehr, wo ich sie gefunden habe):

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

Dies hat einen ähnlichen Effekt wie der von Ihnen beschriebene Anwendungsfall. Sie müssen lediglich die Ersetzung eingeben und die Eingabetaste drücken. In diesem Fall werden jedoch alle Vorkommen des Wortes ersetzt, das sich unter Ihrem Cursor befand .

Um nur innerhalb des aktuellen Blocks zu ersetzen, sollte meiner Meinung nach Folgendes funktionieren:

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

Natürlich können Sie es jedem gewünschten Schlüssel zuordnen.

Was das Obige bewirkt: Markieren Sie die aktuelle Position mit dem unbenannten Marker, wählen Sie den aktuellen Block visuell aus, verlassen Sie den visuellen Modus und setzen Sie den Cursor wieder auf die gespeicherte Position (die visuellen Auswahlmarkierungen sind noch gesetzt), wechseln Sie in den Befehlsmodus und geben Sie den Ersatzbefehl ein , Einfügen des Wortes unter dem Cursor <C-r><C-w>und Positionieren des Cursors, um die Ersetzung einzugeben.

Dhakimian
quelle
Ja, das habe ich auch. In meinem speziellen Anwendungsfall ist das toBeReplacedMuster jedoch nicht so einfach wie "das Wort unter dem Cursor", weshalb ich ein kleines, spezifisches Makro benötige, das ich unterwegs erstellen kann. Und dann nochmal: zu spezifisch für eine Karte: \
Trotzdem vielen
2
Legen Sie das Muster möglicherweise in ein Register und passen Sie dann die obige Zuordnung an, um den Registerinhalt automatisch als toBeReplacedTeil zu erhalten (anstelle des aktuellen Wortes unter dem Cursor, was einschränkender ist).
VanLaser
1
@VanLaser Richtig, das würde ein allgemeines Mapping ermöglichen und es auch viel einfacher machen: va{:s/<C-r>0//g<Left><Left>Mit diesem können Sie jedes benötigte Muster vorab abziehen und dann einfach die zugeordnete Taste drücken, um dieses Muster durch etwas in der aktuellen zu ersetzen Block.
Dhakimian