Завершение Ctrl-n занимает много времени для «сканирования включенного файла»

15

Я совершенствую свои навыки работы с vim и играю с завершением, используя команду Ctrl-n. Я программирую на Perl. Когда я нахожусь в режиме вставки и нажимаю Ctrl-n, я получаю сообщение, что это «Сканирование включенного файла» внизу терминала, и похоже, что оно сканирует файлы в каталогах дистрибутива perl. Это может занять несколько секунд, прежде чем закончится. Похоже, он делает это с пакетами, которые я включил, которые закомментированы:

#use Moose;

Поэтому я должен удалить эти строки, чтобы эта функция имела какое-либо значение. Я что-то пропустил?

Я использую плагин поддержки Perl.

StevieD
источник
Я попробовал что-то подобное в .vimrc, но это произвело эффект:let g:ctrlp_custom_ignore = { 'dir': '^/usr/' } let g:ctrln_custom_ignore = { 'dir': '^/usr/' }
StevieD

Ответы:

13

По умолчанию, когда вы нажимаете C-nили C-p, Vim просматривает различные источники, чтобы найти кандидатов, которые будут заполнять меню завершения.

Эти источники могут быть сконфигурированы с локальной 'complete'опцией буфера .

Значением этой опции является список флагов через запятую. Каждый флаг имеет свое значение, описанное в :h 'cpt:

.   scan the current buffer ('wrapscan' is ignored)
w   scan buffers from other windows
b   scan other loaded buffers that are in the buffer list
u   scan the unloaded buffers that are in the buffer list
U   scan the buffers that are not in the buffer list
k   scan the files given with the 'dictionary' option
kspell  use the currently active spell checking |spell|
k{dict} scan the file {dict}.  Several "k" flags can be given, patterns are valid too.  For example:  
        :set cpt=k/usr/dict/*,k~/spanish
s   scan the files given with the 'thesaurus' option
s{tsr}  scan the file {tsr}.  Several "s" flags can be given, patterns are valid too.
i   scan current and included files
d   scan current and included files for defined name or macro |i_CTRL-X_CTRL-D|
]   tag completion
t   same as "]"

По умолчанию его значение равно .,w,b,u,t,i:

   1. the current buffer
   2. buffers in other windows
   3. other loaded buffers
   4. unloaded buffers
   5. tags
   6. included files

Если вы обнаружите, что сканирование включенных файлов занимает слишком много времени, вы можете попробовать убрать iфлажок из 'cpt'опции.

Если вы хотите удалить его из глобального значения, чтобы по умолчанию влиять на все буферы, вы должны написать vimrc:

setglobal complete-=i

Если вы хотите сделать то же самое, но только для perlфайлов, вы можете установить autocmd внутри вашего vimrc:

augroup PerlSettings
    autocmd!
    autocmd FileType perl setlocal complete-=i
augroup END

Или, лучше, вы можете создать плагин типа файла, например ~/.vim/after/ftplugin/perl.vim, в котором вы просто напишите:

setlocal complete-=i

Чтобы проверить, какие текущие глобальные и локальные значения вашего 'complete'параметра и где они были установлены в последний раз, вы можете использовать эти команды:

verbose setglobal complete?
verbose setlocal complete?

Или короче:

verb setg cpt?
verb setl cpt?

Если единственным источником, который вас интересует, является текущий буфер, то вместо использования C-nвы можете использовать C-x C-n. Смотрите :h i_^x^nдля получения дополнительной информации.

user9433424
источник
1
Есть ли способ исключить ключевые слова в файлах по определенным путям?
StevieD
Vim документирует 'complete'упоминание «включенных файлов», но не ссылается на подробности о том, что это значит. Итак, читай :he include-search. Там вы можете видеть, что 'include'опция определяет, что это значит, и 'path'используется для поиска. Они полезны для более точной настройки, чем просто включение / выключение всей функции.
JWD