功能已经存在VIM

时间:2015-07-27 21:37:25

标签: vim

我在/.vim/ftplugin/python.vim文件中定义了一个函数。问题是,每次打开.py文件时,我都会获得E122: Function MyFunction already exists, add ! to replace it

我知道如果我添加!,那么它将覆盖该函数(这不是问题),但这意味着它将每次都替换它,并且它是一个无用的(并且不是很干净)补充动作。

我猜这个问题来自每次打开新.py文件时反复获取的Python配置文件。

如何告诉VIM只提供一次?

3 个答案:

答案 0 :(得分:4)

我建议将该功能放在自动加载目录中。 (阅读:help autoload它可以很好地解释这是如何工作的)。快速版本如下。

编辑文件~/.vim/autoload/ftplugin/python.vim并在那里添加您的功能。自动加载后的所有内容都是功能签名的一部分。 (而不是/在目录之间使用#并且不使用.vim来保存文件名directory(s)#file#FunctionName

function ftplugin#python#MyFunction()
    ...
endfunction

第一次使用时,vim会自动加载此函数。

在filetype插件中,您只需创建必要的映射和命令。

command -buffer MyFunction call ftplugin#python#MyFunction()
nnoremap <buffer> <leader>m :call ftplugin#python#MyFunction()<CR>

并在第一次调用时自动加载该函数。加载ftplugin的其他缓冲区不会遇到重新定义问题。

答案 1 :(得分:2)

单向:在文件末尾定义一个变量,检查它在开头是否存在(类似于c include guard):

&nbsp;

另一种方式(如果您拥有此功能):直接检查其定义是否存在:

if exists('g:my_python')
  finish
endif

fun MyFunction
  ...
endfun

" ... other stuff

let g:my_python = 1

答案 2 :(得分:0)

如果您使用ultisnips插件,那么插入以下代码段将是很棒的选择:

snippet guard "add guard to functions" b
if !exists('*`!p
try:
    func_name = re.search('\S+\s+(\S+)\(', snip.v.text.splitlines()[0]).group(1)
except AttributeError:
    func_name = ''
snip.rv = func_name
`')
    ${VISUAL}
endif
${0:jump here <C-j>}
endsnippet

它允许我们使用vip选择一个函数,触发guard代码段并进行修复 毫不费力的任何功能。在引用的帖子中,您可以看到有关上面代码的完整解释

它来自对vim @stackexchange的讨论。其实我已经知道!exists这件事,所以我试图创建一个代码片段以使我的代码片段更聪明。