新的VIM用户。我正在尝试使我的类定义的创建python属性更容易。我想说的是我输入的内容
:pyp x
然后VIM将自动填充光标所在的位置
@property
def x(self):
return self.x
@property.setter
def x(self,val):
self._x = val
或更抽象地输入
:pyp <property_name>
VIM填充
@property
def <property_name>(self):
return self.<property_name>
@property.setter
def <property_name>(self,val):
self._<property_name> = val
我看过一些关于函数,宏的文章和Wiki,但是我不确定如何使用它,甚至不确定查找什么,因为我是全新的VIM用户,还不到一周的时间。
我尝试在[.vimrc]中以[this] [1]为例,但是我什至无法使它正常工作。
编辑:
所以我当前正在尝试的代码是
function! PythonProperty(prop_name)
let cur_line = line('.')
let num_spaces = indent('.')
let spaces = repeat(' ',num_spaces)
let lines = [ spaces."@property",
\ spaces."def ".prop_name."(self):",
\ spaces." return self.".property,
\ spaces."@property.setter",
\ spaces."def".prop_name."(self,val)",
\ spaces." self._".prop_name." = val" ]
call append(cur_line,lines)
endfunction
and I am getting the errors
E121:未定义的变量:prop_name
I am typing
`:call PythonProperty("x")`
[1]: https://vi.stackexchange.com/questions/9644/how-to-use-a-variable-in-the-expression-of-a-normal-command
答案 0 :(得分:2)
E121:未定义的变量:prop_name
在VimScript中,变量具有作用域。函数参数的范围为a:
,而函数内部的默认值为l:
(局部变量)。因此,该错误意味着尚未定义l:prop_name
。
现在我该怎么做:
function! s:insert_pyp(property)
let l:indent = repeat(' ', indent('.'))
let l:text = [
\ '@property',
\ 'def <TMPL>(self):',
\ ' return self.<TMPL>',
\ '@property.setter',
\ ' def <TMPL>(self,val):',
\ ' self._<TMPL> = val'
\ ]
call map(l:text, {k, v -> l:indent . substitute(v, '\C<TMPL>', a:property, 'g')})
call append('.', l:text)
endfunction
command! -nargs=1 Pyp :call <SID>insert_pyp(<q-args>)
或者,我们可以模拟实际的按键操作(请注意,我们不再需要在模板中放入缩进;希望当前缓冲区具有set ft=python
):
function! s:insert_pyp2(property)
let l:text = [
\ '@property',
\ 'def <TMPL>(self):',
\ 'return self.<TMPL>',
\ '@property.setter',
\ 'def <TMPL>(self,val):',
\ 'self._<TMPL> = val'
\ ]
execute "normal! o" . substitute(join(l:text, "\n"), '\C<TMPL>', a:property, 'g') . "\<Esc>"
endfunction
command! -nargs=1 Pyp2 :call <SID>insert_pyp2(<q-args>)
很难甚至不可能获得插件
我建议您在YouTube上观看此video。实际上,许多Vim插件都不过分。