Як виконати оператор python для кожного рядка?


11

У мене є наступний зразок коду, який змінює поточний рядок за допомогою оператора Python:

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

Як я можу виконати цей оператор для кожного рядка в поточному файлі?

Пов'язане: Як можна використовувати Python у Vim? при stackoverflow

Відповіді:


10

Ви можете використовувати pydoкоманду, доступну з Vim 7.4, інструкція описує, як вона працює краще, ніж я могла:

: [діапазон] pydo {body}

Виконайте функцію Python "def _vim_pydo (рядок, linenr): {body}" для кожного рядка в [діапазоні], при цьому аргументи функції встановлюються на текст кожного рядка по черзі, без відмітки <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

1
Він доступний з vim 7.4.
kenorb

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.