Язык Vim: отправить текущее слово в 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 $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
4 ответа
<C-P><C-\>w
Увидеть :h ctrlp-mappings
, Вы можете отобразить эту комбинацию:
map <F6> <C-P><C-\>w
В функции:
exe "normal \<C-P>" . expand('<cword>')
Весь смысл CtrlP и подобных плагинов состоит в том, чтобы предоставить альтернативную командную строку, где вы можете уточнить поиск по мере ввода.
Если вам не нужен нечеткий поиск и у вас уже есть имя файла под курсором... почему бы просто не использовать встроенный gf
?
-- редактировать --
В GIF ниже:
- Я прыгаю на
/path/not/knowable/BlaBlaClassName.php
сgf
, - Я возвращаюсь к предыдущему буферу с
<C-^>
(не имеет отношения к вашему вопросу), - Я прыгаю к декларации
BlaBlaClassName
в/path/not/knowable/BlaBlaClassName.php
снова с<C-]>
благодаряtags
файл, созданный сctags
,
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)
Для этого вы бы не использовали <C-P>
отображение, но :CtrlP
команда, так как она принимает параметры.
Чтобы построить отображение, которое передает текущее слово команде, есть два подхода. Либо напрямую вставить текущее слово в командную строку (через :help c_CTRL-R_CTRL-W
):
:nnoremap <Leader>p :CtrlP <C-r><C-p><CR>
Или, чтобы использовать expand()
, построить команду Ex через :execute
:
:nnoremap <Leader>p :execute 'CtrlP' expand('<cword>')<CR>