Vim语言:将当前单词发送到CtrlP

6

我知道如何使用CtrlP。我输入ctrl+p,然后开始输入文件名等等。但是,作为一个非常懒的开发者,我希望能够直接发送当前单词到CtrlP。我知道如何获取当前单词:

let l:currentWord = expand('<cword>')

在Vim语言中,我如何将l:currentWord发送到CtrlP?
map <F6>  :call ComposerKnowWhereCurrentFileIs()<CR>
function! ComposerKnowWhereCurrentFileIs()
    let l:currentWord = expand('<cword>')
    let l:command = "grep " . l:currentWord . " ../path/to/composer -R | awk '{print $6}' | awk -F\\' '{print $2}'"
    let l:commandFileFound = l:command . ' | wc -l'
    let l:numberOfResults = system(l:commandFileFound)
    if l:numberOfResults == 1
        let l:fileName = system(l:command)
        let l:openFileCommand = 'tabe /path/to/project' . l:fileName
        exec l:openFileCommand
    else
        echo "Too many files :-( - use CtrlP ;-) "
    endif
endfunction

映射 <F6> 为 <C-P><C->w - lollo
我可以在函数内部进行映射吗? - sensorario
你为什么想在函数内部这样做? - lollo
因为该函数执行了很多操作(在此问题中已删除)。在某些情况下,我不需要调用CtrlP:在这种情况下,我要求composer查找当前单词的文件路径。但这不是本问题的情况=) - sensorario
4个回答

14
<C-P><C-\>w

参见:h ctrlp-mappings。 您可以映射此组合:

map <F6> <C-P><C-\>w
在一个函数中:
exe "normal \<C-P>" . expand('<cword>')

1
我不需要重新映射。 - sensorario

4
CtrlP和类似插件的整个意义在于提供另一种命令行,您可以在其中在输入时细化搜索。
如果您不需要模糊搜索并且已经将文件名放在光标下方...为什么不直接使用内置的gf
--编辑--
在下面的gif中:
- 我使用gf跳转到/path/not/knowable/BlaBlaClassName.php, - 然后用<C-^>回到上一个缓冲区(与您的问题无关), - 最后再次使用<C-]>跳转到/path/not/knowable/BlaBlaClassName.phpBlaBlaClassName的声明,这得益于使用ctags生成的tags文件。 gf

好的,如果我在BlaBlaClassName上,gf如何打开位于/path/not/knowable/SomeFileName.php中的文件? - sensorario
Aniway:问题是“在VimL中将当前单词发送到CtrlP”。 - sensorario
2
如果你将 BlaBlaClassName 输入 CtrlP,它建议的与 /path/not/knowable/SomeFileName.php 完全无关的可能性非常小。但是,使用正确的设置,在 BlaBlaClassName 上按下 gf 将立即打开 /path/not/knowable/BlaBlaClassName.php。请参见我的编辑。话虽如此,如果你在 bar 文件中有一个 foo 类,那么你比折腾 CtrlP 更重要的问题更多。 - romainl
然后使用ctags。CtrlP对于您的使用情况完全无用。 - romainl
项目太大了。Composer 知道文件在哪里。 - sensorario
1
使用ctags/cscope/GNU global/phpctags是处理这种情况的正确方式。您可能想了解Effortless Ctags with Git或像Gutentags这样的插件。 - Peter Rincker

3
function! LazyP()
  let g:ctrlp_default_input = expand('<cword>')
  CtrlP
  let g:ctrlp_default_input = ''
endfunction
command! LazyP call LazyP()
nnoremap <C-P> :LazyP<CR>

(这可能可以简化,但我对vim语法不熟悉)


我在发布到这里之前,在我的.vimrc中尝试了那段代码片段,它能够完成任务。 - Régis B.
好的,我没有在CtrlP中重新映射<c-p>。 - sensorario

1
为此,您不会使用<C-P>映射,而是使用:CtrlP命令,因为它需要参数。
要构建将当前单词传递给命令的映射,有两种方法。要么直接将当前单词插入到命令行中(通过:help c_CTRL-R_CTRL-W),
:nnoremap <Leader>p :CtrlP <C-r><C-p><CR>

或者,为了使用expand(),通过:execute构建Ex命令:

:nnoremap <Leader>p :execute 'CtrlP' expand('<cword>')<CR>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接