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>)