如何为每一行执行python语句?


10

我有以下示例代码,这些示例代码使用Python语句修改了当前行:

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

如何对当前文件中的每一行执行此语句?

相关:如何在Vim中使用Python?在stackoverflow

Answers:


10

您可以使用pydoVim 7.4以来的可用命令,该手册描述了它比我能更好地工作的方式:

:[range] pydo {body}

对[range]中的每一行执行Python函数“ def _vim_pydo(line,linenr):{body}”,并将函数参数依次设置为每一行的文本,且不带尾随<EOL>电话号码。该函数应返回一个字符串或无。如果返回一个字符串,它将成为当前回合中该行的文本。[range]的默认值是整个文件:“ 1,$”。

对于您的示例,您可以使用类似以下的命令:

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

linenr - 1位存在的原因是,其中的行vim.current.buffer的索引为0,但Vim开始从1开始对行进行计数。

令人高兴的是,您可以轻松定义一个自定义命令来在一系列行上执行Python代码:

command! -range=% BracketLines 
    \ <line1>,<line2>pydo vim.current.buffer[linenr - 1] = '[%s]' % line

1
自vim 7.4起可用。
kenorb 2015年

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.