Einen Ex-Modus-Befehl nach "Norm" fortsetzen?

8

Ich verwende oft extrem lange Makros, wenn ich mich mit wiederholten Bearbeitungen und Umgestaltungen befasse. Wann immer möglich, schreibe ich diese als Ex-Modus-Befehle, anstatt sie als Makros aufzuzeichnen, da sie auf diese Weise (mit dem Befehlsfenster) einfacher interaktiv bearbeitet werden können.

Manchmal muss ich jedoch ein paar Befehle im normalen Modus hinzufügen, z. B. um nur einen Teil einer Zeile und nicht eine ganze Zeile für die spätere Verwendung in meinem Makro zu ziehen oder um Text so auszurichten, wie ich es möchte.

Gibt es eine Möglichkeit, einen Befehl im Ex-Modus fortzusetzen, nachdem er normenthalten ist?

(Für ein aktuelles Beispiel der Art von Komplexität, von der ich spreche :)

:'a+s/\_^\s*\(\S*\)::\_[^>]*>\s*\("[^"]*"\)\s*;\_s*\_$/    "\1", \2,/ | m 'a- | norm f,50a ^[d44|

Gibt es eine Möglichkeit, am Ende mehr Text hinzuzufügen und als Ex-Modus-Befehl ausführen zu lassen?

Platzhalter
quelle
1
Möchten Sie verhindern, dass der :normalBefehl den Rest der Zeile belegt? Wenn ja, können Sie es in eine Zeichenfolge einschließen, die Sie mit dem folgenden :executeBefehl ausführen können : :exe 'norm f,50a ^[d44|' | other Ex command.
Saginaw
:executeÜbergibt die Zeichenfolge nur als Argument an :normal, sodass letztere nicht sieht, was in der Befehlszeile folgt, sodass Sie weitere Ex-Befehle hinzufügen können. Es gibt nur eine Sache , die man beachten muss, wenn die Zeichenfolge wie nicht wörtliche Steuerzeichen enthält \efür <Esc>Sie doppelte Anführungszeichen verwenden Vim zu ermöglichen , sie zu interpretieren, sonst Apostrophe die Interpretation von irgendetwas in der Zeichenfolge zu verhindern.
Saginaw

Antworten:

10

Wenn Sie eine Folge von Tastenanschlägen haben, die Sie im normalen Modus über die Befehlszeile ausführen möchten, können Sie den :normalBefehl verwenden.

Standardmäßig kann dem :normalBefehl jedoch kein anderer Befehl folgen, da in der Hilfe Folgendes angegeben ist:

    This command cannot be followed by another command,
    since any '|' is considered part of the command.

Wenn Sie also nachher einen weiteren Ex-Befehl hinzufügen möchten :normal, können Sie den gesamten :normalBefehl in eine Zeichenfolge einschließen und den :executeBefehl dann dazu bringen , diesen auszuführen. Es könnte etwas geben wie:

:exe 'norm {your keystrokes}' | Other Ex command

Im Gegensatz zu dem :normal, :executedas Rohr als Teil ihres Arguments nicht in Betracht ziehen. Es wird als Befehlsbeendigung betrachtet und nur das ausgeführt, was sich in der Zeichenfolge befindet.
:normalIn der Befehlszeile wird nicht angezeigt, was danach steht. Es wird nur angezeigt, was in der Zeichenfolge übrig bleibt.
Daher sollten Sie in der Lage sein, anschließend einen weiteren Ex-Befehl hinzuzufügen, ohne :normalihn im normalen Modus einzugeben.

Es ist nur eine kleine Sache , die man beachten muss:
wenn Sie Ihren String mit einfachen Anführungszeichen umgeben, Vim wird nichts darin interpretieren, was ein Problem sein kann , wenn Sie möchten , :normalSteuerzeichen treffen wie <Esc>, <CR>, <Tab>oder <C-V>von Sonderzeichen zu schreiben, jeweils: \e, \r, \tund \<C-V>.
Diese Sonderzeichen sind in beschrieben :help expr-quote.
In diesem Fall können Sie doppelte Zeichenfolgen anstelle von einfachen Anführungszeichen verwenden, um die Zeichenfolge zu umgeben, damit Vim sie korrekt interpretieren kann.
Wenn Ihre Steuerzeichen wörtlich sind (dh wenn Sie ihre Caret-Notation sehen: ^[für Escape, ^Mfür Enter, ^Ifür Tab, ^Vfür<C-V>) sollten Sie keine doppelten Anführungszeichen benötigen.

Wenn Sie ein Makro aufzeichnen, speichert dieses Ihre Steuerzeichen als wörtliche Zeichen. Es werden nicht die in beschriebenen Sonderzeichen verwendet :h expr-quote, sodass Sie keine doppelten Anführungszeichen benötigen sollten. Wenn Sie ein Makro bearbeiten möchten, indem Sie selbst ein Literal-Steuerzeichen hinzufügen, können Sie ihm ein Präfix voranstellen <C-V>(siehe :h i_ctrl-vweitere Informationen). Wenn Sie beispielsweise ein Literal-Escape in das Register einfügen möchten, in dem Ihr Makro gespeichert ist, oder in die Folge von Tastenanschlägen, an die als Argument übergeben wird, :normalkönnen Sie drücken <C-V><Esc>.

saginaw
quelle