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
声明]
我知道怎么用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
声明]