Почему 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
автозаполнение элемента:
Движок завершения, который я использую, deoplete и US
означает, что этот предмет завершения от UltiSnips.