Wie verwende ich einen variablen Inhalt als Argument für den Befehl vim?

12

Nehmen wir zum Beispiel an, ich hätte es getan

:let foo=pattern

und jetzt möchte ich ausführen, Ggrep patteraber Variable fooanstelle der Literalzeichenfolge verwenden patter.

:echo foo

Ausgänge pattern, aber

:Ggrep foo

sucht nur nach foo

AKTUALISIEREN:

Erstellen Sie eine Befehlsfolge und führen Sie sie dann aus: Die Ausführung ist keine Lösung, sondern ein Hack. Und es bricht mit nicht trivialen Variablenwerten.

Vitaly Kushner
quelle
Was ist Ggrep(Hauptstadt G?)?
Akira
Git Grep vom 'flüchtigen' Vim-Plugin
Vitaly Kushner
Beispielbefehl ist falsch. es sollte foo = 'pattern' sein. Sagen Sie das: Ausführen ist ein Hack ist völlig falsch. Das ist die Lösung: Sie möchten, dass vim den Befehl auswertet, bevor er ausgeführt wird
albfan

Antworten:

2

Es geht nicht um Variablen, aber vielleicht kann der Befehl vim abbreviate helfen. Versuchen Sie es über die Befehlszeile:

:abbreviate foo pattern

Dann

:Ggrep foo<space>

Es wird 'foo' zu Ihrem 'Muster' vervollständigen.

alexche8
quelle
Versuchen Sie nun zu rennen echo foo. Opps, echo patterndie keine Variable ist. Dies ist ein Hack und eine Fehlleitung.
Albfan
7

wie wäre es mit:

:execute ':grep ' . foo
Akira
quelle
Wie entkomme ich dem Inhalt von foo richtig? es könnte Sonderzeichen wie ", ', /, \ usw. enthalten
Vitaly Kushner
1
@Vitaly Kushner: Siehe ": help Flucht ()" und ": Hilfe fnameescape ()".
Garyjohn
Ich weiß Escape (), bin mir aber nicht sicher, welchen Charakteren ich entkommen soll
Vitaly Kushner
fnameescape () ist nicht gut, es ist kein Dateinamenargument, es ist eine Argument-zu-Plugin-Funktion. Angenommen, ich: lass foo = "aaa \" bbbb'cccc "
Vitaly Kushner
1
Ich ziehe mir auch darüber die Haare aus. Sie können nicht einen Befehl wie erteilen let xyz = tabpagenr()dann tabnext xyz. Die Skriptsprache von Vim ist ebenso fehlerhaft wie die modale Umgebung fehlerfrei.
Puk
2

Wenn Ihnen die :exeLösung nicht gefällt , können Sie den Inhalt einer Variablen mithilfe des =Ausdrucksregisters in die Befehlszeile "einlesen" . Geben Sie beispielsweise ein und drücken Sie :Ggrepdann Ctrl- rund geben Sie dann ein =foound drücken Sie Enter. Angenommen, die Variable fooenthält "Muster", sollte Ihre Befehlszeile nun wie folgt aussehen:

:Ggrep pattern

Dies hat den Vorteil, dass Sie den tatsächlich ausgeführten Befehl sehen und sogar ändern können, bevor Sie Enterein zweites Mal drücken .

Sehen:

:help "=
Heptit
quelle