vim使用ctrl-n调用什么函数来完成

vim使用ctrl-n调用什么函数来完成,vim,Vim,当我使用ctrl-n完成时,我的vim有50%的时间抛出严重错误 E854:路径太长,无法完成 我真的想重新映射它,并使用:silent选项调用它以抑制错误,但是我不知道什么函数提供了完成,所以我不能重新映射它 所以我的问题是,在插入模式下调用C-N时,我在哪里可以找到它到底调用了什么 解决方案: 正如在对我的公认答案的评论中提到的,我找到了一个解决这个问题的方法。根据此处关于构建自己的vim的说明:brilliantcorners.org/2011/02/building-vim-on-osx

当我使用ctrl-n完成时,我的vim有50%的时间抛出严重错误

E854:路径太长,无法完成

我真的想重新映射它,并使用:silent选项调用它以抑制错误,但是我不知道什么函数提供了完成,所以我不能重新映射它

所以我的问题是,在插入模式下调用C-N时,我在哪里可以找到它到底调用了什么

解决方案:

正如在对我的公认答案的评论中提到的,我找到了一个解决这个问题的方法。根据此处关于构建自己的vim的说明:brilliantcorners.org/2011/02/building-vim-on-osx-snow-leopard

我为E854搜索了源目录,它只出现在一个文件中。如果打开该文件,您会看到它只被引用了两次。我刚刚删除了那些错误调用并构建了vim

这并不能解决任何实际问题,但其效果与忽略相同。它现在工作得很好,不会抛出任何错误,我希望其他有此问题的人都能从中得到帮助。

在插入模式下,
通常使用缓冲区的内容完成单词。我不知道它在内部是如何工作的,但它可能会抱怨缓冲区相关文件的路径长度

但是我在Vim的
:help
中找不到对
E854
的引用,如果它来自我没有的插件,这可能是正常的

你可以:

  • 请尝试
    :详细imap
    以查找其来源或位置
  • 在帮助中搜索标签
    E854
    :帮助E854
  • 在帮助中搜索sting
    E854
    :helpgrep E854
  • grep for
    E854
    ~/.vim
    文件夹中,
    $grep-r E854~/.vim

我的vim源代码副本(使用Mercurial和
hg克隆在某个时候获得https://vim.googlecode.com/hg/
)在内部函数
vim_findfile_init()中查找仅在一个位置抛出的错误。

所以它看起来像是在做任意深度的通配符扩展。如果我不得不冒险的话,我会说文件系统中的某个地方有一个路径,它有一个循环符号链接(比如c->a),所以你最终完成了路径补全,得到了/foo/bar/a/b/c/a/b/c/c/a/b/c/。。。。。然后极限就达到了

编辑

划掉最后一个理论;根据实际读取的代码,它看起来像是在试图找到一个标记文件,然后爆炸。你能把你做的事情贴出来吗?
:设置标签

编辑2


唉,太晚了。。。这是我刚刚找到的您最初想要的答案:do
:help completefunc
:help completion函数
completefunc
是您想要的,如果我(最终)理解了您的问题。

我遇到过类似的问题。原来是因为当前与vim一起分发的
ruby.vim
调用了一个不推荐的
Gem.all\u load\u path
,这会在path变量中产生严重错误。检查并获得修复:)

它不是来自插件,您可能有一个旧的vim。是的,从2010年起为7.3,这已经很老了。但是询问者没有说明他使用的是哪个版本,所以……这让我找到了一个解决方案。我不知道任何c代码,但只有两个地方会抛出错误E854,在删除它们并重新编译后,它会正常工作。我仍然不知道是什么原因导致了这个错误,但至少通过这种方式,我达到了沉默的目的。我跟随这个博客从源代码构建vim
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;
    }

...