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.


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.


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

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 "=
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.