какую функцию vim вызывает для завершения с помощью ctrl-n - PullRequest
3 голосов
/ 22 февраля 2012

Мой vim выдает неприятные ошибки в 50% случаев, когда я использую ctrl-n для завершения

E854: слишком длинный путь для завершения

Я действительно хочу переназначить это и вызвать его с опцией: silent, чтобы подавить ошибку, но я не знаю, какая функция обеспечивает завершение, поэтому я не могу переназначить ее.

Итак, мой вопрос: где я могу точно узнать, что вызывает C-N, когда он вызывается в режиме вставки

Решение:

Как уже упоминалось в комментарии к моему принятому ответу, я нашел способ обойти это. На основании инструкций по созданию собственного vim здесь: brilliantcorners.org/2011/02/building-vim-on-osx-snow-leopard

Я нашел каталог с исходным кодом для E854, и он появляется только в 1 файле. Если вы откроете этот файл, то увидите, что на него ссылаются только дважды. Я просто удалил эти сообщения об ошибках и собрал vim

Это не решает проблему, но это тот же эффект, что и игнорирование. Теперь он отлично работает и не выдает никаких ошибок, надеюсь, кому-то еще с этой проблемой поможет это.

Ответы [ 3 ]

2 голосов
/ 27 февраля 2012

У меня была такая проблема. Оказывается, он взорвался, потому что текущий ruby.vim, который распространяется с Vim, вызывает устаревший Gem.all_load_paths, что приводит к неприятной ошибке в вашей переменной пути. Проверьте https://github.com/rubygems/rubygems/issues/161 и https://groups.google.com/forum/#!msg/vim_dev/wrouKpIDraU/xLxUuMT3_6QJ для исправления:)

2 голосов
/ 23 февраля 2012

В режиме insert , <C-n> обычно дополняет слова содержимым ваших буферов.Я не знаю, как это работает внутри, но он может жаловаться на длину пути связанного файла буфера.

Но я не могу найти ссылку на E854 в :help Vim, что может быть нормальным, еслионо исходит от плагина, которого у меня нет.

Вы можете:

  • попробовать :verbose imap <c-n> найти его источник или
  • найти справку по тегуE854, :help E854 или
  • поищите в справке по запросу E854, :helpgrep E854 или
  • grep для E854 в папке ~/.vim, $ grep -r E854 ~/.vim.
1 голос
/ 23 февраля 2012

Моя копия исходного кода vim (полученная в некоторый момент с использованием Mercurial и hg clone https://vim.googlecode.com/hg/) обнаруживает, что ошибка выдается только в одном месте во внутренней функции vim_findfile_init():

static char_u e_pathtoolong[] = N_("E854: path too long for completion");

...


/*
 * copy wc_path and add restricts to the '**' wildcard.
 * The octet after a '**' is used as a (binary) counter.
 * So '**3' is transposed to '**^C' ('^C' is ASCII value 3)
 * or '**76' is transposed to '**N'( 'N' is ASCII value 76).
 * For EBCDIC you get different character values.
 * If no restrict is given after '**' the default is used.
 * Due to this technique the path looks awful if you print it as a
 * string.
 */
len = 0;
while (*wc_part != NUL)
{
    if (len + 5 >= MAXPATHL)
    {
        EMSG(_(e_pathtoolong));
        break;
    }

...

Похоже, что он выполняет расширение с произвольной глубиной. Если бы мне пришлось сделать дикий удар, я бы сказал, что у вас есть путь где-то в файловой системе, который имеет круглую символьную ссылку (скажем, c -> a), так что вы в конечном итоге делаете завершение пути и получаете / foo / bar / a / b / c / a / b / c / a / b / c / a / b / c / ..... и предел достигнут.

Редактировать

Поцарапайте эту последнюю теорию; основываясь на фактическом чтении кода, похоже, что он пытается найти файл тега и взрывается. Можете ли вы опубликовать, что вы получаете, когда вы делаете :set tags?

Редактировать 2

Вздох, уже поздно ... Вот ответ, который вы изначально хотели получить, который я только что нашел: do :help completefunc и :help completion-functions. completefunc - это тот, который вам нужен, если я (наконец) пойму ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...