Wie kann ich eine visuelle Auswahl von Vimscript erstellen?

11

Wenn ich ein paar Zeilen Vimscript habe, die ich testen möchte, bevor ich mein Vimrc einfüge, ist es möglich, sie visuell auszuwählen und dann als Quelle zu verwenden?

Ich habe versucht

  • Treffen Sie eine visuelle Auswahl v, dann Bewegungen, um eine Auswahl zu treffen usw. Dann
  • :'<,'>so

Aber vim gibt einen Fehler

Keine Reichweite erlaubt

ebenfalls

:'<,'>w | so

gibt

Benutzen ! Teilpuffer schreiben

Wie kann ich visuell ausgewähltes Vimscript beziehen?

the_velour_fog
quelle

Antworten:

11

In der Befehlszeile drücken, <C-u>dann @*eingeben und eingeben.

<C-u>löscht den visuellen Bereich '<,'>, der automatisch eingefügt wurde, wenn ein Text visuell ausgewählt ist.

:@*führt den Inhalt des *Registers aus, der alles enthält, was gerade visuell ausgewählt ist.

Selbst wenn sich der ausgewählte / hervorgehobene Text in Ihrem Webbrowser befindet (Firefox, Chrome, ...), funktioniert er. Über das *Register können Sie direkt in vim darauf zugreifen.


Wenn Ihr Text in einem VIM-Puffer ausgewählt ist, besteht eine andere Lösung darin, ihn in ein benanntes Register zu kopieren, z. B. in ein Register durch Eingabe "ay.

Geben Sie dann in der Befehlszeile Folgendes ein <C-r>aund geben Sie ein.
Ctrl+ rgibt Ihnen eine Art Eingabeaufforderung, die durch das Zeichen dargestellt wird "(für weitere Informationen lesen Sie :h c_Ctrl-r).
Wenn Sie an dieser neuen Eingabeaufforderung den Namen eines Registers angeben, wird dessen Inhalt in die Befehlszeile eingefügt, wo Sie ihn vor der Ausführung bearbeiten können.


Außerdem , wenn Sie kopieren einen Text ohne ein Register zu spezifizieren, wird es aus dem ungenannten Register zugänglich sein " .

Angenommen, Sie haben eine Zeile mit Vimscript in einer Datei und möchten diese schnell als Quelle bereitstellen. Sie können sie kopieren Yund dann in der Befehlszeile mit: :<C-r>"als Quelle eingeben und eingeben.

Wenn Sie diese letzte Lösung verwenden, gibt es nur ein Problem, dessen Sie sich bewusst sein müssen.
Wenn Sie in der Befehlszeile ein seltsames Zeichen wie dieses sehen ^M, ist dies die Caret-Notation des Wagenrücklaufs. Sie sollten es löschen, sonst wird wahrscheinlich eine Fehlermeldung angezeigt.

Zusammenfassend können Sie:

  1. Kopieren Sie Ihre Vimscript-Zeile mit Y
  2. Wechseln Sie mit in den Befehlsmodus mit :
  3. Drücken Sie <C-r>, um die Eingabeaufforderung des Registers aufzurufen
  4. Geben Sie ein ", um das unbenannte Register aufzurufen
  5. Drücken Sie die Rücktaste, um das ^MZeichen zu löschen
  6. und drücken Sie die Eingabetaste.
saginaw
quelle
1
Süss! : D funktioniert gut - ich war noch nie auf das @*gestoßen, danke!
the_velour_fog
Ich bin froh, dass es dir geholfen hat. Ich habe die Antwort bearbeitet, um eine andere Lösung vorzuschlagen.
Saginaw
1
Schön, ich habe versucht, Ihren Vorschlag, : <C-r>a es zu verwenden, hat auch gut funktioniert :) Ich denke, vim hat die ^M's als Zeilenrückgabe gelesen - und jede als eigene Zeile / Befehl ausgeführt?
the_velour_fog
Das ist eine gute Frage, ehrlich gesagt weiß ich es nicht. Wenn ich dieses Zeichen nicht lösche, habe ich normalerweise Fehler. Ich bin froh, dass es bei Ihnen fehlerfrei funktioniert hat. Vielleicht erklärt uns jemand mit mehr Wissen zu diesem Thema, wie vim mit solchen Sonderzeichen umgeht.
Saginaw
2

Ich mache es tatsächlich ein bisschen anders, ich nehme nur die Änderungen in meinem vimrc vor und beziehe es jedes Mal neu, wenn ich es schreibe. (Ich habe einen kaskadierenden Satz von vimrc-Dateien, sodass ich eine davon ändern kann.)

if $MYVIMRC != ''
    autocmd BufWritePost    *vimrc      source $MYVIMRC
endif
Dash-Tom-Bang
quelle
2

Direkter auf die Frage als auf meine andere Antwort könnten Sie eine Zuordnung definieren nnoremap, die so aussieht ( für keine Auswahl führen Sie einfach die aktuelle Zeile aus; vnoremapwenn der visuelle Modus aktiv ist):

nnoremap <F2> :execute getline(".")<CR>
vnoremap <F2> :<C-u>for line in getline("'<", "'>") \| execute line \| endfor<CR>

In beiden Fällen ist die "aktuelle Zeile" :executed, sodass Sie in der visuellen Version :executeeine Zeile nach der anderen durch die visuelle Auswahl führen.

Wie in einer anderen Antwort angegeben, <C-u>löscht das die Bereichsspezifikation, die bei der :Eingabe in der Befehlszeile angezeigt wird. Die |Zeichen müssen maskiert werden, da sie sonst als Ende des vnoremapBefehls interpretiert werden .

Dies könnte auch in eine Funktion umgewandelt werden, um einige der Fluchtgymnastik loszuwerden, aber es scheint mir zu diesem Zeitpunkt kein großer Gewinn zu sein. Es wäre im Grunde die vnoremap, die in mehrere Zeilen erweitert und callmit einem Bereich bearbeitet wird oder nicht, abhängig vom [nv] Mapping-Modus.

Dash-Tom-Bang
quelle
Oh, die Zuordnung im visuellen Modus führt ganze Linien aus. Wenn Sie also block- oder zeichenweise arbeiten, werden die Start- und Endpunkte innerhalb der Linien ignoriert.
Dash-Tom-Bang