我在/.vim/ftplugin/python.vim
文件中定义了一个函数。问题是,每次打开.py
文件时,我都会获得E122: Function MyFunction already exists, add ! to replace it
。
我知道如果我添加!
,那么它将覆盖该函数(这不是问题),但这意味着它将每次都替换它,并且它是一个无用的(并且不是很干净)补充动作。
我猜这个问题来自每次打开新.py
文件时反复获取的Python配置文件。
如何告诉VIM只提供一次?
答案 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):
另一种方式(如果您拥有此功能):直接检查其定义是否存在:
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
这件事,所以我试图创建一个代码片段以使我的代码片段更聪明。