Автодополнение VIm snipmate ‹TAB› не работает

Я впервые пытаюсь использовать snipmate с VIm 7.3 в ubuntu 12.04.

Моя .vimrc конфигурация:

" kill vi compatibility
set nocompatible               " be iMproved

" -------------------------------------
" ---------snipmate--------------------
" -------------------------------------
Bundle "MarcWeber/vim-addon-mw-utils"
Bundle "tomtom/tlib_vim"
Bundle "honza/vim-snippets"

Bundle "garbas/vim-snipmate"
" -------------------------------------
 filetype plugin on

Я считаю, что это все, что я хочу, за которым следует :BundleInstall.

Древовидная структура моего .vim/bundle такова

prayag@prayag:~$ tree -d .vim/bundle/
.vim/bundle/
|-- vim-colors-solarized
|   |-- autoload
|   |-- bitmaps
|   |-- colors
|   `-- doc
|-- vim-snipmate
|   |-- after
|   |   `-- plugin
|   |-- autoload
|   |-- doc
|   |-- ftplugin
|   |-- plugin
|   `-- syntax
|-- vim-snippets
|   |-- UltiSnips
|   |-- autoload
|   `-- snippets
|       |-- coffee
|       `-- javascript
`-- vundle
    |-- after
    |   |-- ftplugin
    |   `-- plugin
    |-- autoload
    |   `-- vundle
    |-- doc
    |-- ftplugin
    |-- plugin
    |-- syntax
    `-- test
        `-- files

139 directories

НО, когда я пробую некоторый код Java для тестирования фрагмента main,

$ vi App.java
main

После нажатия <TAB> выдает следующий результат/ошибку

main<Plug>snipMateNextOrTrigger

:verbose imap <Plug>snipMateNextOrTrigger дает мне

No mapping found

с разделом finish, прокомментированным в plugin/snipMate.vim, :verbose imap <Plug>snipMateNextOrTrigger дает мне следующую информацию,

i  <Plug>snipMateNextOrTrigger * <C-R>=snipMate#TriggerSnippet()<CR>
        Last set from ~/.vim/bundle/vim-snipmate/plugin/snipMate.vim

и При нажатии <TAB>

Error detected while processing /home/prayag/.vim/bundle/vundle/autoload/snipMate.vim:                                                                              
line   15:
E122: Function <SNR>84_RemoveSnippet already exists, add ! to replace it

Тот же результат/ошибка, которую я получаю со следующей конфигурацией в .vimrc,

:imap <C-J> <Plug>snipMateNextOrTrigger
:smap <C-J> <Plug>snipMateNextOrTrigger

Та же конфигурация отлично работала на другом компьютере с ubuntu 13.04.

Я должно быть делаю что-то не так, но не мог понять это.

использованная литература

Vim: плагин snipMate не запускает завершение фрагмента


person prayagupd    schedule 05.03.2014    source источник
comment
Что вам говорят :verbose map <TAB> и :verbose set cpo?? Отметьте :version для версии ‹size›, где ‹size› — это один из вариантов Tiny, Small, Big, Huge (возможно, я что-то упускаю).   -  person benjifisher    schedule 05.03.2014
comment
@benjifisher Привет, вот результат :verbose map <TAB> и т. д.   -  person prayagupd    schedule 06.03.2014
comment
Извините, я должен был спросить о :imap вместо :map. Вероятно, он покажет i <Tab> <Plug>snipMateNextOrTrigger. А как насчет :verbose imap <Plug>snipMateNextOrTrigger? Удивительно, что одна и та же конфигурация ведет себя по-разному на другой машине. У вас одна и та же версия snipMate на обоих? Если нет, возможно, один из них глючит.   -  person benjifisher    schedule 06.03.2014
comment
@benjifisher :verbose imap <Plug>snipMateNextOrTrigger дает мне No mapping found   -  person prayagupd    schedule 07.03.2014
comment
Это проблема. Файл github.com/garbas/vim-snipmate/blob/ master/plugin/snipMate.vim содержит строку inoremap <silent> <Plug>snipMateNextOrTrigger <C-R>=snipMate#TriggerSnippet()<CR>. Либо у вас нет этого файла, либо отсутствует эта строка, либо он не :sourced при запуске vim. Или, может быть, переменная loaded_snips определена где-то еще. Посмотрите на файл, отметьте :scriptnames сразу после запуска vim и найдите load_snips в других ваших файлах запуска. Я предполагаю, что есть и другие возможности, например :imapclear, но это маловероятно.   -  person benjifisher    schedule 07.03.2014
comment
@benjifisher :scriptnames дает мне ~/.vim/bundle/vim-snipmate/after/plugin/snipMate.vim загрузить. К сожалению, это не соответствует github.com/garbas. /vim-snipmate/blob/master/plugin/snipMate.vim   -  person prayagupd    schedule 10.03.2014
comment
У вас должны быть файлы с одинаковыми именами в after/plugin/ и plugin/ (оба относительно master/ в URL GitHub и относительно ~/.vim/bundle/vim-snipmate/ в вашей установке). Версия «после» сопоставляет <Tab> с чем-то, начинающимся с <Plug>, а версия без «после» сопоставляет это с чем-то другим; вторая карта, кажется, отсутствует.   -  person benjifisher    schedule 10.03.2014
comment
@benjifisher Хорошо, в ~/.vim/bundle/vim-snipmate/plugin/snipMate.vim есть файл vim, похожий на github. com/garbas/vim-snipmate/blob/master/plugin/snipMate.vim со строкой inoremap <silent> <Plug>snipMateNextOrTrigger <C-R>=snipMate#TriggerSnippet()<CR> .But ЗДЕСЬ мой after/plugin/snipMate.vim   -  person prayagupd    schedule 11.03.2014
comment
Я не вижу ничего плохого в файле в вашем каталоге after/plugin/, а вы? Я дал несколько вещей для проверки 4 комментария назад: теперь, когда вы знаете, что у вас есть нужный файл в каталоге plugin/, убедитесь, что он получен из :scriptnames. Если это так, то либо loaded_snips определено где-то еще (это легко проверить, закомментировав строку finish в плагине), либо сопоставление будет удалено позже.   -  person benjifisher    schedule 11.03.2014
comment
@бенджифишер Спасибо. После закомментирования строки finish в плагине закинул Error detected while processing /home/prayag/.vim/bundle/vundle/autoload/snipMate.vim. Я удалил этот файл вместе с vim-snipmate и переустановил. Работает нормально. Пожалуйста, оставьте свои комментарии в качестве ответа. \,,/   -  person prayagupd    schedule 12.03.2014
comment
Привет, @PrayagUpd, какую операционную систему ты использовал? Я думаю, что столкнулся с точно такой же проблемой на моем компьютере с Windows 8.2; однако, используя точно такой же набор пакетов и аналогичный vimrc, ключ <tab> должен был хорошо работать на моем Mac.   -  person llinfeng    schedule 22.03.2016


Ответы (1)


Прежде всего, я предлагаю вам удалить :set nocompatible из вашего файла vimrc. Vim автоматически сбрасывает параметр 'cp', если при запуске обнаруживает личный файл vimrc (не системный файл vimrc), и если вы когда-либо :source ~/.vimrc, это может привести к запутанным результатам.

Полным ответом на ваш вопрос будет очень большая блок-схема устранения неполадок. Это было бы хорошо, но я не собираюсь так усердно работать. Вот краткое изложение разговора, который у нас был в комментариях, чтобы диагностировать эту проблему.

У меня установлен snipMate, но когда я ввожу "main<Tab>" в режиме вставки, я получаю "main<Plug>snipMateNextOrTrigger".

Что вам говорят :verbose imap <Tab> и :verbose set cpo?? Проверьте :version для «‹size> version», где ‹size> — это Tiny, Small, Big, Huge (возможно, я что-то упускаю). (Проблема может заключаться в том, как отображается <Tab>, или вы можете быть в совместимом режиме, или ваша версия vim может не поддерживать карты или может не поддерживать нотацию <Tab> в картах.)

":verbose imap <Tab>" показывает, что "<Tab>" сопоставляется с "<Plug>snipMateNextOrTrigger" в "~/.vim/bundle/vim-snipmate/after/plugin/snipMate.vim", а остальное выглядит правильно.

Как насчет :verbose imap <Plug>snipMateNextOrTrigger? (Кажется, проблема в том, что <Tab> чему-то сопоставляется; что-то должно быть переназначено, но это не так.)

":verbose imap <Plug>snipMateNextOrTrigger" выдает "Сопоставление не найдено".

Это проблема. Файл plugin/snipMate.vim содержит строку inoremap <silent> <Plug>snipMateNextOrTrigger <C-R>=snipMate#TriggerSnippet()<CR> . Либо у вас нет этого файла, либо отсутствует эта строка, либо он не имеет :sourced при запуске vim. Или, может быть, переменная loaded_snips определена где-то еще. Посмотрите на файл, отметьте :scriptnames сразу после запуска vim и найдите «loaded_snips» в других файлах запуска. Я предполагаю, что есть и другие возможности, например :imapclear, но это маловероятно.

Файл есть, и имеет правильную строку. (Сначала я посмотрел на «after/plugin/snipMate.vim» вместо «plugin/snipMate.vim».) Я проверил «:scriptnames», и он появился в списке. Я не проверял другие файлы, определяющие «loaded_snips», но закомментировал

if exists('loaded_snips') || &cp || version < 700
    finish
endif

и получил ошибку от "snipMate.vim" в другом каталоге. Я удалил этот файл, переустановил snipMate, и теперь он работает.

person benjifisher    schedule 13.03.2014
comment
Спасибо за этот ответ. Для меня проблема заключалась в том, что случайная, старая, неиспользуемая строка из моего vimrc переопределяла сопоставление вкладок. :verbose imap <Tab> обнаружил его, и его удаление позволило мне начать использовать - person Bryce Johnson; 09.08.2019