In einer Vimscript-Funktion muss ich einer Variablen l:matched
nach dem Aufruf einen passenden String zuweisen search()
und frage mich, ob es einen kürzeren Weg gibt als den, den ich gerade mache:
let l:pattern = '\v^Foo: \zs.*'
let l:line = search(l:pattern)
let l:line_text = getline(l:line)
let l:matched = matchstr(l:line, l:pattern)
Im Idealfall möchte ich so etwas
let l:matched = search_text(l:pattern)
ohne Rückgriff auf getline()
. Gibt es eine solche vim-Funktion, die ich anscheinend nicht finden kann?
l:
Namespace-Deklaration verzichten können .:let @/="pattern" | norm! ygn
und den Inhalt in Register 0 verfügbar haben.Antworten:
Da sich der Cursor auf dem ersten Buchstaben der Übereinstimmung befindet, könnten Sie wahrscheinlich
:normal! y$
nach der Suche eine ausführen und den Registerinhalt in Ihrer lokalen Variablen abrufen.Ein anderer Ansatz, von dem ich denke, dass er hier sehr gut funktionieren würde, wäre die Verwendung
:substitute
mit dern
Flagge (dh ohne tatsächliche Ersetzung):... und was du so nennst:
Das macht praktisch
ActOn
eine Rückruffunktion - es wird für jedes Match ausgewertet.quelle
:s
mit einem Sub-n
Replace -Ausdruck und dem Flag ist nur ab Vim 7.3.627+ verfügbar. Andernfalls müssen Sie eine tatsächliche Ersetzung vornehmen (da dies den Puffer als geändert markiert). Sie möchten wahrscheinlich auch das Suchregister speichern und wiederherstellen@/
oder verwenden:keeppatterns
.keeppaterns
->keeppatterns
. Es ist eineE488: Trailing characters
Ursache , die ziemlich schwierig ist, auf die Ursache zurückzugehen. Vielen Dank!