Jak wykonać instrukcję Python dla każdej linii?

11

Mam następujący przykładowy kod, który modyfikuje bieżący wiersz za pomocą instrukcji Python:

:py import vim; vim.current.line="["+vim.current.line+"]"

Jak mogę wykonać tę instrukcję dla każdej linii w bieżącym pliku?

Powiązane: Jak używać Pythona w Vimie? przy przepełnieniu stosu

kenorb
źródło

Odpowiedzi:

10

Możesz użyć pydopolecenia dostępnego od Vima 7.4, w podręczniku opisz, jak działa lepiej niż ja:

: [range] pydo {body}

Wykonaj funkcję Pythona „def _vim_pydo (line, linenr): {body}” dla każdej linii w [zakresie], z argumentami funkcji ustawionymi kolejno na tekst każdej linii, bez końcowego <EOL>, i bieżącego numer kolejki. Funkcja powinna zwrócić ciąg lub Brak. Jeśli ciąg zostanie zwrócony, staje się tekstem wiersza w bieżącej turze. Domyślnie [zakres] to cały plik: „1, $”.

Na przykład możesz użyć polecenia takiego jak:

:python import vim
:pydo vim.current.buffer[linenr - 1] = '[%s]' % line

linenr - 1Bit jest tam, ponieważ linie vim.current.buffersą 0-indeksowane ale Vim zacząć liczyć od 1 linii.

Zaletą jest to, że możesz łatwo zdefiniować niestandardowe polecenie do wykonywania kodu Pythona w szeregu wierszy:

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line
toro2k
źródło
1
Jest dostępny od wersji 7.4.
kenorb
7

Możesz pobrać bieżący bufor vim.current.buffer, który jest iterowalny; możesz użyć forpętli, aby uzyskać każdą linię.

Możesz zmienić linie, przypisując do nich; łącząc to, otrzymujemy:

:py from vim import *
:py for i, line in enumerate(current.buffer): current.buffer[i] = '[%s]' % line

Zobacz także :help python-buffer.

Martin Tournoij
źródło