为什么 UltiSnips 无法识别我自己的代码片段?

Why UltiSnips does not recognize my own snippets?

目前我在Vim中使用YouCompleteMe,然后我安装了UltiSnipsvim-snippets 与 vundler。 UltiSnipsYouCompleteMe 兼容并且可以正常工作;但是,当我定义自己的代码段时,问题就来了,因为这些代码段无法识别。

我怀疑问题出在我使用 UltiSnipsEdit 函数时,因为它在我的主目录中创建了 UltiSnips 文件夹,而不是在 .vim 文件夹中。例如,当我使用 R 脚本并使用 UltiSnipsEdit 时,它会在 /home/UltiSnips 中创建 r.snippets 文件。然后我定义了一个片段来测试:

snippet test "Testing snip for R." 
# snipp is working
endsnippet

保存文件后,该片段不会出现在 YouCompleteMe 的列表中,也不会用 :UltiSnipsExpandTrigger 展开(在我的例子中是 <c-l>)。

let g:UltiSnipsSnippetDirectories=[$HOME.'/.vim/UltiSnips'] 添加到 .vimrc 文件使其工作。

假设您必须访问目录:

  • ~/.vim/snips : 为你自己的片段
  • ~/.vim/bundle/vim-snippets/UltiSnips/ :对于 vim-片段

涉及两个变量:

  • g:UltiSnipsSnippetsDir :您自己的代码片段的目录
  • g:UltiSnipsSnippetDirectories : 用于片段的目录列表

在您的 .vimrc g:UltiSnipsSnippetDirectories 中没有定义这些变量的情况下,设置为 UltiSnips(没有路径)。显然,只列出最终目录的名称而不是完整路径就足够了。

let g:UltiSnipsSnippetsDir="~/.vim/snips"
let g:UltiSnipsSnippetDirectories=["snips", "UltiSnips"]

我是新手 UltiSnipes 用户,遇到了同样的问题。它记录在官方文档中(参见 here 并搜索 UltiSnips-snippet-search-path)。

为了给你一个简短实用的解决方案,我自己的代码片段文件夹是 ~/.vim/myUltiSnips,我将以下行添加到我的 .vimrc

let g:UltiSnipsSnippetsDir="~/.vim/myUltiSnips"
let g:UltiSnipsSnippetDirectories = ['myUltiSnips']

所以(在第一行)你用绝对路径声明你的片段目录,然后(在第二行)将它添加到 UltiSnips 搜索的目录,但这次使用相对于 Vim 的路径的运行时路径。

NOTA BENE 我的配置适合我,但是,我不使用 vim-snippets

来自官方文档:

Snippet definition files are stored in snippet directories. A snippet directory must be a subdirectory of a directory defined in the 'runtimepath' option.

g:UltiSnipsSnippetsDir defines the directory private snippet definition files are stored in.

g:UltiSnipsSnippetDirectories defines the directories for looking for snippets. Do not mix up this variable with previous one.

2018年6月写的,行为有点奇怪。首先,您必须将自定义代码段的目录添加到 .vimrc,因此我在 ~/.vim/UltiSnips 中创建了一个并将此行添加到我的 .vimrc:

让g:UltiSnipsSnippetDirectories=['~/.vim/UltiSnips', 'UltiSnips']

但这仍然不起作用,因为 UltiSnips 坚持将任何内容保存到 ~/UltiSnips 的基本目录中,然后又找不到它们了!!!因此,在为 python 文件创建片段后,我使用 vim 命令保存了片段文件:

:另存为 ~/.vim/UltiSnips/python.snippets

这会将片段保存在正确的目录中,UltiSnips 可以找到该片段,然后将任何片段保存到正确目录中文件类型的正确文件中(并在需要时找到它)。

我已阅读文档,但在那里找不到此行为。顺便说一句,它对 NVIM 来说是一样的,我使用了一个目录 ~/.config/nvim/UltiSnips.

我正在使用带有 UltiSnips 和 deoplete 的 Neovim 作为我的补全引擎。以下设置均在 Windows 10(nvim 版本 0.3.4)和 Linux(CentOS 7,nvim 版本 0.4.0)上进行了测试。

UltiSnips 的文档解释了如何搜索片段(参见 :h UltiSnips-how-snippets-are-loaded)。但是仍然 crystal 不清楚如何配置以便 UltiSnips 可以找到我们的自定义代码段。

来自 UltiSnips 的文档:

UltiSnips will search each 'runtimepath' directory for the subdirectory names defined in g:UltiSnipsSnippetDirectories in the order they are defined. For example, if you keep your snippets in ~/.vim/mycoolsnippetsand you want to make use of the UltiSnips snippets that come with other plugins, add the following to your vimrc file.

let g:UltiSnipsSnippetDirectories=["UltiSnips", "mycoolsnippets"]

上面的描述既提供了信息又令人困惑,因为它是为 Vim 用户而不是 Neovim 用户编写的。因此,如果您按照上面的示例进行操作,您会发现自定义代码段无法用于自动完成。

在下文中,我将写下适用于 Neovim 的内容。

首先,打开nvim并使用命令:echo &runtimepath。此命令将打印 Neovim 搜索的所有运行时路径。根据文档,您的自定义代码片段目录应放在这些运行时路径之一下。在我的 Windows 机器上,输出如下(为简洁起见省略了完整输出):

C:\Users\Administrator\AppData\Local\nvim,C:\Users\Administrator\AppData\Local\nvim\plugged\deoplete.nvim,C:\Users\Administrator\AppData\Local\nvim\plugged\deoplete-jedi,C:\Users\Administrator\AppData\Local\nvim\plugged\neco-vim,.....

在我的 Linux 机器上,输出如下(省略完整输出):

/home/haojiedong/.config/nvim,/home/haojiedong/.local/share/nvim/plugged/deoplete.nvim/,/home/haojiedong/.local/share/nvim/plugged/deoplete-jedi/,/home/haojiedong/.local/share/nvim/plugged/jedi-vim/,.....

不同的运行时路径以逗号分隔。 Windows 和 Linux 配置自定义代码段的步骤相同。所以在后面的部分,我将只关注Linux,因为它更受欢迎。

Linux 上的一个运行时路径是 /home/haojiedong/.config/nvim。我们选择这个目录并创建一个名为 my_snippets 的文件夹。然后我们在文件夹 my_snippets 下创建一个名为 markdown.snippets 的文件。将以下代码段添加到 markdown.snippets:

snippet kbd "Keyboard tag"
<kbd>${1:KEY}</kbd> [=10=]
endsnippet

这将为降价文件类型创建一个名为 kbd 的片段。

第三步,我们在init.vim中添加如下设置:

" `my_snippets` is the directory we created before
let g:UltiSnipsSnippetDirectories=["UltiSnips", "my_snippets"]

现在,打开一个 markdown 文件并开始输入 kbd,您应该能够看到 kbd 自动完成项:

我使用的补全引擎是deoplete,US意味着这个补全项目来自UltiSnips。