Ersetzen Sie die Auswahl durch die Ausgabe eines externen Befehls

10

Angenommen, ich habe eine Zeile in einer Datei mit XXXXeinem Platzhalter, den ich vwie folgt ausgewählt habe:

XXXX Some other text

Wie kann ich nur die XXXXmit der Ausgabe eines externen Befehls ändern , wie z date +%Y%m%d.

Ich bin so weit gekommen

:'<,'>!date +\%Y\%m\%d 

aber das ersetzte die ganze Linie.

muk.li.
quelle
Verwandte Frage zu stackoverflow: stackoverflow.com/q/8403599/…
Hotschke

Antworten:

15

Sie können den Text löschen und die Ausgabe eines Befehls einfügen, indem Sie CtrlR- =:

CTRL-R {0-9a-z"%#*+:.-=}                                        i_CTRL-R
                Insert the contents of a register.  Between typing CTRL-R and
                the second character, '"' will be displayed to indicate that
                you are expected to enter the name of a register.
 …
                                                        i_CTRL-R_=
                        '='     the expression register: you are prompted to
                                enter an expression (see expression)

Für den Ausdruck können Sie die system()Funktion verwenden, um externe Befehle auszuführen.

Nach der Auswahl des Textes, drücken c, dann <c-r>=und Verwendung system('date +%Y%m%d')als Ausdruck.

muru
quelle
1
Das fügt eine neue Zeile zwischen dem ersetzten Text und dem Rest der Zeile hinzu, nicht wahr?
muk.li
2
@ muk.li das ist ein Teil der Ausgabe von date. Wenn Sie so etwas versuchen system('printf %s foo'), bei dem keine nachfolgende Zeilenumbruch ausgegeben wird, werden Sie feststellen, dass es einen Unterschied gibt.
Muru
4
@ muk.li Wenn Sie nur das Datum im Text haben möchten, gibt es die strftimeFunktion, die Sie anstelle von verwenden können system('date …'). Die Formatzeichenfolge ist dieselbe.
Muru
2
Sie müssen den ausgewählten Text nicht löschen. Sie können "=system('date +%Y%m%d')pstattdessen die visuelle Auswahl verwenden.
Hauleth
5

Wenn Sie den Cursor auf eine solche Zeile setzen, können Sie:

  • 0 um den Cursor in die erste Spalte zu setzen.
  • f Space um den Cursor in das erste Leerzeichen zu setzen.
  • i Enter Esc die Linie teilen.
  • l um den Cursor eine Zeile nach oben zu bewegen.
  • :.!date +\%Y\%m\%d um den Befehl auszuführen.
  • J um die Linien wieder zu verbinden.

Von :h :visual_example:

Derzeit funktioniert der Befehl ":" nur in ganzen Zeilen. Wenn Sie einen Teil einer Zeile auswählen, wird die gesamte Zeile durch ":! Datum" ersetzt. Wenn Sie möchten, dass nur ein Teil der Linie ersetzt wird, müssen Sie eine Zuordnung dafür vornehmen. In einer zukünftigen Version funktioniert ":" möglicherweise in Teilzeilen.

Siehe auch :h visual-operatorsfür Details.

Aus diesem Kommentar: Sie können auch versuchen , die vis oder NrrwRgn Plugin. Beide sollten gut damit umgehen. (Danke @ christian-brabandt für den Tipp).

Jair López
quelle
2

Erstellen Sie eine temporäre Zuordnung für solche Ersetzungen. Zum Beispiel:

:vnoremap qq c<C-R>=system('wc -c | perl -pe chomp', @")<CR><ESC>

Im visuellen Modus können Sie dann Text auswählen, eingeben qqund dieser wird durch die Befehlsausgabe ersetzt. In diesem Beispiel wc -cwird Ihre Auswahl verarbeitet, die der @"Parameter ist. perl -pe chompwird benötigt, um einen nachgestellten Zeilenumbruch aus der Ausgabe zu entfernen.

Oleg Tsybulskyi
quelle
1
Beachten Sie, dass diese Lösung die Antwort von muru umhüllt. Das Erstellen einer Zuordnung für eine einmalige Verwendung ist möglicherweise nicht die effizienteste Methode.
Statox
1

Versuche dies:

:let @a = system('date +\%Y\%m\%d')[:-2]
:'<,'>g/XXXX/s/XXXX/\=@a/g
  • In der ersten Zeile wird die Ausgabe des dateBefehls in Register a gespeichert, wobei die abschließende neue Zeile entfernt wird.
  • Die zweite Zeile überprüft global Ihre Auswahl und markiert die Zeilen mit XXXX( g/XXXX/) und
  • Ersetzen Sie alle Instanzen von XXXXdurch den Inhalt von Register a ( s/XXXX/\=@a/g)

Siehe :h let-@und :h :globalsowie den Abschnitt "Unterliste" in:h list-index

Charles Jie
quelle
0

Plugin: Visual Block Commands (vis) von DrChip

Installation vis.vba.gzund Abhängigkeit cecutil.vba.gzin vim8 packpath

# shell brace expansion (bash >=3.0, zsh>=2.6)
$ mkdir -p ~/.vim/pack/manual/start/{vis,cecutil}
$ vim http://www.drchip.org/astronaut/vim/vbafiles/vis.vba.gz
:UseVimball ~/.vim/pack/manual/start/vis
:e http://www.drchip.org/astronaut/vim/vbafiles/cecutil.vba.gz
:UseVimball ~/.vim/pack/manual/start/cecutil

OP Beispiel wird

:'<,'>B !date +\%Y\%m\%d 
Hotschke
quelle