VIM + Python - "gd"命令无法正常工作
我刚开始用VIM来编写Python程序,遇到了一些问题,希望有人能帮我解决。
“gd”这个命令应该能带我去当前函数中变量第一次被定义或使用的地方。根据我的理解,这个命令的效果就像先按“[[”跳到函数的顶部,然后再搜索变量名。
但是问题是,当我在Python函数中使用这个命令时,VIM却找到的是整个文件中变量第一次出现的地方。
有人知道为什么会这样吗?或者我该怎么解决这个问题?
2 个回答
2
我在我的Vim配置中没有重新定义varname,它运行得很好,不过我的Vim是用Python编译的。也许这就是问题所在?
你安装的是7.x版本的VIM吗?并且是支持Python的?要检查这一点,可以在VIM中输入 :python print “hello, world”
。如果你看到类似 E319: 抱歉,这个命令在这个版本中不可用
的错误信息,那就该换个新版本了。
3
我觉得问题出在Vim对函数的处理方式上。从[[
的文档来看:
*[[*
[[ [count] sections backward or to the previous '{' in
the first column. |exclusive|
Note that |exclusive-linewise| often applies.
除非某个地方专门为Python文件定义了一个部分(我不太相信这是可能的,因为它们应该是两个字母的nroff部分),否则它会假设第一列应该有一个左大括号,而这对Python文件来说并不相关。
我建议你在Vim的邮件列表上问问,看看有没有插件或者解决方法可以用。或者,你可以定义一个这样的映射:
nmap gd :let varname = '\<<C-R><C-W>\>'<CR>?\<def\><CR>/<C-R>=varname<CR><CR>
用一个函数来做会更优雅,但这只是一个快速的解决办法,应该能奏效。它把gd
映射到一个函数,这个函数会把变量'varname'设置为光标所在的单词,然后向后搜索'定义',再向前搜索变量:
:let varname = " Variable setting
'\< " String start and word boundary
<C-R><C-W> " Ctrl-R, Ctrl-W: pull in the word under the cursor
\>' " Word boundary and string end
<CR> " Enter - finish this command
? " Search backwards for...
\<def\> " def but not undefined etc (using word boundaries)
<CR> " Enter - Perform search
/ " Now search forward
<C-R>= " Pull in something from an expression
varname<CR> " The expression is 'varname', so pull in the contents of varname
<CR> " Enter - perform search