VIM命令插入带参数的多行文本

时间:2019-07-17 11:12:00

标签: python function vim

新的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

1 个答案:

答案 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插件都不过分。