我有以下示例代码,这些示例代码使用Python语句修改了当前行:
:py import vim; vim.current.line="["+vim.current.line+"]"
如何对当前文件中的每一行执行此语句?
相关:如何在Vim中使用Python?在stackoverflow
我有以下示例代码,这些示例代码使用Python语句修改了当前行:
:py import vim; vim.current.line="["+vim.current.line+"]"
如何对当前文件中的每一行执行此语句?
相关:如何在Vim中使用Python?在stackoverflow
Answers:
您可以使用pydo
Vim 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
您可以使用来获得当前缓冲区vim.current.buffer
,该缓冲区是可迭代的;您可以使用for
循环来获取每一行。
您可以通过分配给它们来更改行。综上所述,我们得到:
:py from vim import *
:py for i, line in enumerate(current.buffer): current.buffer[i] = '[%s]' % line
另请参阅:help python-buffer
。