Как выполнить оператор python для каждой строки?

10

У меня есть следующий пример кода, который изменяет текущую строку с помощью инструкции Python:

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

Как я могу выполнить эту инструкцию для каждой строки в текущем файле?

Связанный: Как вы можете использовать Python в Vim? в стеке потока

kenorb
источник

Ответы:

10

Вы можете использовать pydoкоманду, доступную начиная с Vim 7.4, руководство описывает, как она работает лучше, чем я:

: [range] pydo {body}

Выполните Python-функцию «def _vim_pydo (line, linenr): {body}» для каждой строки в [range], причем аргументы функции поочередно задаются для текста каждой строки, без завершающего <EOL> и текущего номер строчки. Функция должна возвращать строку или None. Если строка возвращается, она становится текстом строки в текущем повороте. По умолчанию для [range] используется весь файл: «1, $».

Для вашего примера вы можете использовать команду вроде:

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

linenr - 1Бит существует потому , что линии в vim.current.buffer0-индексированные , но Вим начинают считать строки от 1.

Приятно то, что вы можете легко определить пользовательскую команду для выполнения вашего кода Python в диапазоне строк:

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line
toro2k
источник
1
Это доступно с vim 7.4.
Кенорб
7

Вы можете получить текущий буфер с vim.current.buffer, который является итеративным; Вы можете использовать forцикл для получения каждой строки.

Вы можете изменить строки, назначив их; Итак, сложив это вместе, мы получим:

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

Также см :help python-buffer.

Мартин Турной
источник