【发布时间】:2011-01-17 09:07:45
【问题描述】:
我开始使用 VIM 来编写 Python。我遇到了一些问题,希望有人可以帮助我解决这个问题。
“gd”命令应该将您带到当前函数中定义/使用变量的第一个位置。据我了解,这与执行“[[”到函数顶部,然后执行搜索变量名相同。
问题是,当我在 Python 函数中尝试此操作时,vim 会在整个文件中找到该变量的第一次出现。
关于为什么会发生这种情况/我该如何解决这个问题的任何想法?
【问题讨论】:
我开始使用 VIM 来编写 Python。我遇到了一些问题,希望有人可以帮助我解决这个问题。
“gd”命令应该将您带到当前函数中定义/使用变量的第一个位置。据我了解,这与执行“[[”到函数顶部,然后执行搜索变量名相同。
问题是,当我在 Python 函数中尝试此操作时,vim 会在整个文件中找到该变量的第一次出现。
关于为什么会发生这种情况/我该如何解决这个问题的任何想法?
【问题讨论】:
我认为问题在于 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”设置为保存光标所在的单词,向后搜索def,然后向前搜索变量:
: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
【讨论】:
[[ 在 Python 文件中工作是由于自定义映射,但 gd 是基于 [[ 的内置实现。
我没有在我的 Vim 配置中重新定义 varname,它工作得很好,但是我用 python 编译了 vim。
也许这就是问题所在?
您是否安装了 VIM 版本 7.x,并使用 Python 支持编译?要检查这一点,请输入 :python print “hello, world”
进入VIM。如果您看到类似的错误消息
E319: Sorry, the command is not available in this version,
那么是时候买一个新的了。
【讨论】:
:version 来检查 vim 中编译的内容并检查 python 标志是否存在。