当我使用ctrl-n完成时,我的vim会在50%的时间内抛出令人讨厌的错误
E854:路径太长,无法完成
我真的想重新映射它,并使用:silent选项调用它来抑制错误,但我不知道哪个函数提供了完成,所以我无法重新映射它。
所以我的问题是在哪里可以找到C-N在插入模式下调用的确切内容
解决方案:
正如在我接受的答案的评论中所提到的,我找到了解决这个问题的方法。根据有关建立自己的vim的说明:brilliantcorners.org/2011/02/building-vim-on-osx-snow-leopard
我为E854找到了源目录,它只出现在1个文件中。如果您打开该文件,您会看到它只被引用两次。我刚删除了那些错误调用并构建了vim
这并不能解决实际问题,但它与忽略效果相同。它现在运行良好,并没有抛出任何错误,我希望有这个问题的其他人得到帮助。
答案 0 :(得分:2)
在 insert 模式下,<C-n>
通常会使用缓冲区的内容完成单词。我不知道它在内部是如何工作的,但它可能会抱怨缓冲区的相关文件的路径长度。
但我无法在Vim的E854
中找到:help
的引用,如果它来自我没有的插件,则可能是正常的。
你可以:
:verbose imap <c-n>
找到其来源或E854
,:help E854
或E854
,:helpgrep E854
或E854
文件夹~/.vim
$ grep -r E854 ~/.vim
中的{grep}。答案 1 :(得分:2)
我有类似这样的问题。事实证明它正在爆炸,因为与Vim一起分发的当前ruby.vim
调用了一个弃用的Gem.all_load_paths
,这会在你的路径变量中产生一个令人讨厌的错误。查看https://github.com/rubygems/rubygems/issues/161和https://groups.google.com/forum/#!msg/vim_dev/wrouKpIDraU/xLxUuMT3_6QJ以获得修复:)
答案 2 :(得分:1)
我的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 - &gt; a),所以你最终做了路径完成并得到/ foo / bar / a / b / c / a / b / c / a / b / c / a / b / c / .....并且限制受到限制。
修改强>
抓住最后的理论;基于实际阅读代码,它看起来像是在试图找到一个标签文件并炸毁。你可以发表:set tags
时得到的结果吗?
修改2
叹息,已经很晚了......以下是我刚才找到的答案::help completefunc
和:help completion-functions
。 completefunc
是你想要的,如果我(最终)理解你的问题。