2012-07-30 100 views
2

假设我正在编写一些PHP代码,我想出了一个函数调用,我知道它在此文件中定义了它。我想创建一个映射,以便它自动查找'function <WORD_UNDER_CURSOR>'在Vim中创建自定义映射以搜索函数定义

我设法做到了这一点,使用nmap <Leader>8 /function <C-r><C-w><CR>,但问题是,我的搜索包装是关闭的(我想这样),所以有一半的时间我结束了屏幕错误到达结束,必须按N自己向上看。我试图追加一个Nn到映射的末尾(nmap <Leader>8 /function <C-r><C-w><CR>Nn),但它不起作用。我不知道为什么!事实上,我在<CR>之后放置的东西似乎没有任何效果。

你们可以给我一些建议并向我解释吗?我发现Vim映射文档真的很难找到你想要的东西。例如,我仍然不知道<C-r><C-w>是什么!

+0

顶在前面加上'gg'您的映射,从文件的开头搜索的方式。你熟悉'#'和'*',它们已经非常接近你想要的了。 – Thor 2012-07-30 23:09:51

+0

我强烈建议你尝试优秀的插件[Tagbar](http://majutsushi.github.com/tagbar/)。它适用于各种文件格式,可能是您真正需要的解决方案。 – Zotov 2012-07-31 14:09:59

+0

@Thor我已经尝试过使用gg,但光标后面的单词成为文件的第一个单词:)。是的,我熟悉*和#,但他们不直接带我去函数定义,在大文件上(我正在处理一些真实的大文件),这可能是一个问题。 – polvoazul 2012-07-31 16:59:37

回答

0

我收集了所有的答案,上述意见和帮助文件的信息,并编译这个答案没有人直接回答。我找到了两种解决方案:

1- 我们可以将yiw这个词复制到光标下,然后gg到文件的顶部。最后,我们搜索“function <C-r>"这意味着,来自注册表的功能空间内容”(上一次翻译)。副作用:如果找不到任何东西,您现在位于文件的顶部,会混淆寄存器。: -/

nmap <Leader>8 yiwgg /function <C-r>"<CR> 

2- 我个人的创作,这是原始命令的问题修正:

nmap <Leader>8 /function <C-r><C-w><CR> Nn 

没有工作,因为/命令被扔一个“未找到错误',这终止了映射的其余部分。因此,我们可以找到一种方法,忽略错误(这是我找也没有找到),或使用:

:nmap <Leader>8 :call search('function <C-r><C-w>','w')<CR> 

注意“W”标志,这意味着环绕!寻找:help search


附加功能:

3-完美世界right_way_to_do_it: 使用gD如果您的文件组织或CTAGS。

为了好奇,我用<Leader>8因为*上的8 :)

1

要向前搜索,请使用/并向后搜索,然后使用?。因此,只需在您现有的地图中使用?而不是/

<C-r><C-w>是emacs符号为^R^W。我不知道在vi实现中emacs表达法正在做什么,但它在那里。 :help ^R^W虽然工作。它只是在光标下插入单词。

+0

你不明白,我需要搜索fowards&backwards,因为我不知道函数def可能在哪里。不过,在^ R^W上,我会看看这个帮助(我现在不在我的漂亮Linux上)。 – polvoazul 2012-07-31 17:02:13

+0

在这种情况下,我会使用'gg'的想法。您需要首先在光标下拉出单词。怎么样'yawgg/' – 2012-07-31 18:34:28

1

Vim可以通过gd原生地实现,这意味着“去定义”,这不仅限于功能。见:help gd


<C-r><C-w>符号用于遍布Vim的文档中的地方,或多或少谈到Vim的时候写一个组合的标准方式。 Emacs的标准符号是C-r C-w,没有<>

类型:help有关使用文档的快速提示和:help key-notation以获取有关按键/组合问题的更多详细信息以及...键符号。

在你的情况下,​​或:help <c-r>_<c-w>(注意下划线)会帮助你。

0

下面是基于:grep的映射是应该做你想要的(见here更多)什么:

map <buffer> <F3> :grep 'function.*<C-r><C-w>' %<CR><CR>