【问题标题】:what function does vim call for completion with ctrl-nvim 用 ctrl-n 调用什么函数来完成
【发布时间】:2012-03-13 04:36:34
【问题描述】:

当我使用 ctrl-n 完成时,我的 vim 有 50% 的时间会抛出令人讨厌的错误

E854:路径太长,无法完成

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

所以我的问题是,在插入模式下调用 C-N 时,我在哪里可以准确找到它所调用的内容

解决方案:

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

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

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

【问题讨论】:

    标签: vim


    【解决方案1】:

    我遇到过类似的问题。事实证明它正在爆炸,因为与 Vim 一起分发的当前 ruby.vim 调用了一个已弃用的 Gem.all_load_paths,这会在你的路径变量中产​​生一个令人讨厌的错误。查看https://github.com/rubygems/rubygems/issues/161https://groups.google.com/forum/#!msg/vim_dev/wrouKpIDraU/xLxUuMT3_6QJ 进行修复:)

    【讨论】:

      【解决方案2】:

      我的 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

      唉,太晚了...这是我刚刚找到的你最初想要的答案:做:help completefunc:help completion-functionscompletefunc 是你想要的,如果我(最终)理解你的问题的话。

      【讨论】:

      • 这让我找到了解决方案。我不知道任何 c 代码,但只有 2 个地方会抛出错误 E854,在将它们都删除并重新编译后它可以工作。我仍然不知道是什么导致了错误,但至少这样我已经达到了与沉默相同的效果。我关注了这个博客brilliantcorners.org/2011/02/building-vim-on-osx-snow-leopard 从源代码构建vim
      【解决方案3】:

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

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

      你可以:

      • 尝试:verbose imap <c-n> 定位其来源或
      • 在帮助中搜索标签E854:help E854
      • 在帮助中搜索E854:helpgrep E854
      • grep for E854 在您的 ~/.vim 文件夹中,$ grep -r E854 ~/.vim

      【讨论】:

      • 它不是来自插件,你可能有一个较旧的 vim。 markmail.org/message/w6yj35zjsnlslyic
      • 是的,2010 年的 7.3,已经很老了。但是提问者并没有说明他使用的是哪个版本……
      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多