Язык 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>
Другие вопросы по тегам