Почему 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> в моем случае).

4 ответа

Решение

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

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

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

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

Поэтому (в первом ряду) вы объявляете, что у вас есть сниппеты dir с абсолютным путем, а затем (во втором ряду) добавляете их в каталоги, которые ищет UltiSnips, но этот thime использует путь относительно пути выполнения Vim.

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

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

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

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

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

Допустим, вы должны каталоги:

  • ~ /.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"]

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

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

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

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

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

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

Я использую 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.

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\ подключен \deoplete.nvim,C:\Users\Administrator\AppData\Local\nvim\ подключен \deoplete-джедая C:\Users\Administrator\AppData\Local\nvim\ подключен \ Неко-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.

Другие вопросы по тегам