Python:如何使用VIM.current.range生成的范围对象 函数!切() python3

Python:如何使用VIM.current.range生成的范围对象 函数!切() python3,python,vim,Python,Vim,如果您想在函数中自己处理range,那么在声明/定义函数时应该添加range参数:h函数范围示例,然后您可以在函数中通过a:firstline和a:lastline获取范围信息。例如: function! Cut() python3 << EOF import vim cw = vim.current.window pos = cw.cursor cr = vim.current.range x = cr.end - cr.start vim.command('y') vim.c

如果您想在函数中自己处理
range
,那么在声明/定义函数时应该添加
range
参数
:h函数范围示例
,然后您可以在函数中通过
a:firstline和a:lastline
获取范围信息。例如:

function! Cut()
python3 << EOF
import vim
cw = vim.current.window
pos = cw.cursor

cr = vim.current.range
x = cr.end - cr.start

vim.command('y')
vim.command(':normal! gv')

print(cr)
print(cr.start)
print(x)

while x:
    vim.command('d')
    x -= 1
EOF
endfunction



I get:
<range ... (10:10)>
9
0
<range ... (11:11)>
10
0
so on..
通过这种方式,将范围传递给函数一次。但是,如果您这样做,就像您所做的那样:

function Foo() range
    let start = a:firstline
...
endfunction
然后做一个
1,10call Foo()
,您将看到10个
Foo
将被打印(回显)。是的,对于每一行,你的函数都被调用了


这是基本规则,无论您是用python还是vimscript实现。

范围对象属性是:r.第一行的开始索引进入缓冲区r.最后一行的结束索引进入缓冲区buffer@Vek.M1234我的意思是,问题出在vim
func Cut()
上,而不是python代码中。你需要
func Cut()range
你读过我回答中提到的帮助文档吗?是的,我读过,并尝试过:func Cut()range。在身体内部,我试图从python中访问:firstline,它可以工作,但非常笨拙。我不能使用Python提供的range对象,而不是使用start=int(vim.eval('a:firstline'))函数!切断()范围空谈然后cr=vim.current.range start=cr.start-stop=cr.stop x=stop-start不启动work@Vek.M1234在python中,阅读
a:first/lastline
来完成您的工作。
range
参数允许您自己处理范围,而不是默认方式:“对于范围中的每一行,调用您的函数”
function Foo()
    echo "foo"
endfunction