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

Vim language: send current word to CtrlP

我知道怎么用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 }' | awk -F\' '{print }'"
    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
<C-P><C-\>w

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

map <F6> <C-P><C-\>w

在函数中:

exe "normal \<C-P>" . expand('<cword>')

为此,您不会使用 <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>
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 语法)

CtrlP 和类似插件的全部意义在于提供一个替代命令行,您可以在其中键入时优化搜索。

如果您不需要模糊搜索并且您已经有了光标下的文件名...为​​什么不简单地使用内置 gf?

-- 编辑--

在下面的 gif 中:

  • 我用gf跳到/path/not/knowable/BlaBlaClassName.php
  • 我用 <C-^> 跳回到上一个缓冲区(与你的问题无关),
  • 由于使用 ctags.[=34= 生成的 tags 文件,我再次使用 <C-]> 跳转到 /path/not/knowable/BlaBlaClassName.php 中的 BlaBlaClassName 声明]