为什么 UltiSnips 无法识别我自己的代码片段?
Why UltiSnips does not recognize my own snippets?
目前我在Vim中使用YouCompleteMe,然后我安装了UltiSnips和vim-snippets 与 vundler。 UltiSnips 和 YouCompleteMe 兼容并且可以正常工作;但是,当我定义自己的代码段时,问题就来了,因为这些代码段无法识别。
我怀疑问题出在我使用 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/mycoolsnippets
and 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。
目前我在Vim中使用YouCompleteMe,然后我安装了UltiSnips和vim-snippets 与 vundler。 UltiSnips 和 YouCompleteMe 兼容并且可以正常工作;但是,当我定义自己的代码段时,问题就来了,因为这些代码段无法识别。
我怀疑问题出在我使用 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/mycoolsnippets
and 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。