Почему UltiSnips не распознает мои собственные фрагменты?

В настоящее время я использую YouCompleteMe в Vim, затем я установил UltiSnips и vim-snippets с помощью vundler. UltiSnips и YouCompleteMe совместимы и работают правильно; однако проблема возникает, когда я определяю свой собственный фрагмент, потому что они не распознаются.

Я подозреваю, что проблема возникает, когда я использую функцию UltiSnipsEdit, потому что она создает папку UltiSnips в моем домашнем каталоге, а не внутри папки .vim. Например, когда я работаю со сценариями R и использую UltiSnipsEdit, он создает файл r.snippets внутри /home/UltiSnips. Затем я определяю фрагмент только для проверки:

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

После сохранения файла фрагмент не появляется в списке YouCompleteMe и не расширяется с помощью :UltiSnipsExpandTrigger (в моем случае <c-l>).


person Erick Chacon    schedule 29.05.2016    source источник
comment
Используйте трекер ошибок плагина.   -  person romainl    schedule 29.05.2016
comment
Вы пытались включить свой домашний путь или любой другой путь в эту переменную g:UltiSnipsSnippetDirectories? я думаю, что это занимает   -  person SibiCoder    schedule 29.05.2016
comment
@SibiCoder Я пытался, let g:UltiSnipsSnippetDirectories=[$HOME.'/.vim/UltiSnips']. Однако это не рекомендуется при использовании сторонних подключаемых модулей в качестве фрагментов vim. После этого он вообще перестанет работать.   -  person Erick Chacon    schedule 29.05.2016
comment
@romainl Я не уверен, проблема ли это в самом плагине или связана с настройками.   -  person Erick Chacon    schedule 29.05.2016
comment
@Эрик Чакон A snippet directory must be a subdirectory of a directory defined in the 'runtimepath' option. The variable g:UltiSnipsSnippetDirectories defines a list of names used for snippet directories. Итак, почему бы вам не попробовать добавить свой домашний путь в путь выполнения? Удалите значение, которое вы установили в g:UltiSnipsSnippetDirectories ранее   -  person SibiCoder    schedule 29.05.2016
comment
@SibiCoder После чистой установки UltiSnips и vim-snippets с помощью vundler и добавления let g:UltiSnipsSnippetDirectories=[$HOME.'/.vim/UltiSnips'] все заработало .   -  person Erick Chacon    schedule 29.05.2016
comment
@SibiCoder Спасибо, добавление домашнего пути к пути выполнения в файле .vimrc также работает. Однако недостатком является то, что это очень широкая папка, в которой плагину придется искать по сравнению с конкретной папкой вроде ~/.vim/UltiSnips.   -  person Erick Chacon    schedule 29.05.2016
comment
Если вы создаете или редактируете свои фрагменты, вам необходимо перезагрузить UltiSnips, чтобы они стали доступны. UltiSnips автоматически делает это ТОЛЬКО для текущего экземпляра vim. Чтобы принудительно перезагрузить, попробуйте :call UltiSnips#RefreshSnippets()   -  person JESii    schedule 14.11.2018


Ответы (5)


Добавление let g:UltiSnipsSnippetDirectories=[$HOME.'/.vim/UltiSnips'] в файл .vimrc заставляет его работать.

person Erick Chacon    schedule 29.05.2016

Я новичок в UltiSnipes, и у меня такая же проблема. Это описано в официальной документации (см. здесь и выполните поиск для UltiSnips-snippet-search-path).

Чтобы дать вам краткое и прагматичное решение, моя собственная папка фрагментов ~/.vim/myUltiSnips, и я добавил следующие строки в свой .vimrc

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

Таким образом, (в первой строке) вы объявляете директорию фрагментов с абсолютным путем, а затем (во второй строке) добавляете ее к директориям, которые ищет UltiSnips, но на этот раз используя путь относительно пути выполнения Vim.

NOTA BENE Моя конфигурация работает для меня, но я не использую vim-snippets .

Из официальных документов:

Файлы определения фрагментов хранятся в каталогах фрагментов. Каталог фрагмента должен быть подкаталогом каталога, определенного в опции runtimepath.

g:UltiSnipsSnippetsDir определяет каталог, в котором хранятся файлы определения частного фрагмента.

g:UltiSnipsSnippetDirectories определяет каталоги для поиска фрагментов. Не путайте эту переменную с предыдущей.

person Gianluca Casati    schedule 14.04.2017

Допустим, у вас есть каталоги:

  • ~/.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"]
person way218    schedule 21.08.2016

Написано в июне 2018 года, поведение немного странное. Во-первых, вам нужно добавить каталог для ваших пользовательских фрагментов в .vimrc, поэтому я создал его в ~/.vim/UltiSnips и добавил эту строку в свой .vimrc:

пусть g:UltiSnipsSnippetDirectories=['~/.vim/UltiSnips', 'UltiSnips']

Но это все еще не работает, потому что UltiSnips настаивает на сохранении чего-либо в базовом каталоге ~/UltiSnips, а затем не может найти их снова!!! Итак, после создания фрагмента для файла Python я сохранил файл фрагмента с помощью команды vim:

:saveas ~/.vim/UltiSnips/python.snippets

Это сохраняет фрагмент в правильном каталоге, UltiSnips может найти фрагмент, а затем сохраняет любые фрагменты в правильный файл для типа файла в правильном каталоге (и находит его при необходимости).

Я прочитал документы, и я не могу найти там это поведение. Кстати, это работает так же для NVIM, и я использовал каталог ~/.config/nvim/UltiSnips.

person prasutagus    schedule 10.07.2018

Я использую Neovim с UltiSnips и deoplete в качестве механизма завершения. Следующие настройки протестированы как в Windows 10 (версия nvim 0.3.4), так и в Linux (CentOS 7, версия nvim 0.4.0).

В документации UltiSnips объясняется, как осуществляется поиск фрагментов (см. :h UltiSnips-how-snippets-are-loaded). Но до сих пор не совсем понятно, как настроить так, чтобы UltiSnips мог найти наши пользовательские фрагменты.

Из документации UltiSnips:

UltiSnips будет искать в каждом каталоге runtimepath имена подкаталогов, определенные в g:UltiSnipsSnippetDirectories, в том порядке, в котором они определены. Например, если вы храните свои фрагменты в ~/.vim/mycoolsnippets и хотите использовать фрагменты UltiSnips, поставляемые с другими плагинами, добавьте следующее в свой файл vimrc.

пусть 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. Затем мы создаем файл с именем markdown.snippets в папке my_snippets. Добавьте следующий фрагмент в markdown.snippets:

snippet kbd "Keyboard tag"
<kbd>${1:KEY}</kbd> $0
endsnippet

Это создаст фрагмент с именем kbd для типа файла уценки.

На третьем шаге мы добавляем следующую настройку в init.vim:

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

Теперь откройте файл уценки и начните вводить kbd, и вы сможете увидеть элемент автозаполнения kbd:

quicker_8e6e6e5f-adbf-491c-aeb6-5e6d66f2bf42.png

Механизм завершения, который я использую, — это deoplete, а US означает, что этот элемент завершения принадлежит UltiSnips.

person jdhao    schedule 28.03.2019