Я уже прочитал много сообщений в блогах и ответов на stackoverflow, но, похоже, я делаю что-то не так, потому что у меня все еще есть ошибка E388: Couldn't find definition
. Что я сделал:
- Загрузите ctags отсюда http://ctags.sourceforge.net/
- Установите его:
./configure && make install
- Установите
tags+=tags;$HOME
в моем файле.vimrc
- Добавьте несколько строк в
~/.ctags
(см. ниже) - Сделайте
ctags -R .
в корне проекта и получите несколько предупреждений (см. ниже) - Проверьте классы
:tag .<C-D>
, что дает мне большой список классов (это радует)
Предупреждения:
ctags: Warning: regcomp ([A-Za-z0-9._$]+)[ t]*[:=][ t]*{: Unmatched \{
ctags: Warning: regcomp ([A-Za-z0-9._$()]+)[ t]*[:=][ t]*function[ t]*(: Unmatched ( or \(
ctags: Warning: regcomp ([A-Za-z0-9._$]+)[ t]*[:=][ t]*[: Invalid regular expression
ctags: Warning: cannot open source file "static/img/touch/packages" : No such file or directory
Мой файл ~/.ctags
выглядит следующим образом:
--exclude=*.min.js
--exclude=*.min.css
--exclude=*.map
--exclude=.backup
--exclude=.sass-cache
--exclude=vendors
--exclude=.git
--langdef=css
--langmap=css:.css
--langmap=css:+.sass
--langmap=css:+.styl
--langmap=css:+.less
--regex-css=/^[ \t]*\.([A-Za-z0-9_-]+)/.\1/c,class,classes/
--regex-css=/^[ \t]*#([A-Za-z0-9_-]+)/#\1/i,id,ids/
--regex-css=/^[ \t]*(([A-Za-z0-9_-]+[ \t\n,]+)+)\{/\1/t,tag,tags/
--regex-css=/^[ \t]*@media\s+([A-Za-z0-9_-]+)/\1/m,media,medias/
--langdef=scss
--langmap=scss:.scss
--regex-scss=/^[ \t]*@mixin ([A-Za-z0-9_-]+)/\1/m,mixin,mixins/
--regex-scss=/^[ \t]*\$([A-Za-z0-9_-]+)/\1/v,variable,variables/
--regex-scss=/^([A-Za-z0-9_-]*)*(\.[A-Za-z0-9_-]+) *[,{]/\2/c,class,classes/
--regex-scss=/^[ \t]+(\.[A-Za-z0-9_-]+) *[,{]/\1/c,class,classes/
--regex-scss=/^(.*)*\#([A-Za-z0-9_-]+) *[,{]/\2/i,id,ids/
--regex-scss=/^[ \t]*#([A-Za-z0-9_-]+)/\1/i,id,ids/
--regex-scss=/(^([A-Za-z0-9_-])*([A-Za-z0-9_-]+)) *[,|\{]/\1/t,tag,tags/
--regex-scss=/(^([^\/\/])*)[ \t]+([A-Za-z0-9_-]+)) *[,|\{]/\3/t,tag,tags/
--regex-scss=/(^(.*, *)([A-Za-z0-9_-]+)) *[,|\{]/\3/t,tag,tags/
--regex-scss=/(^[ \t]+([A-Za-z0-9_-]+)) *[,|\{]/\1/t,tag,tags/
--regex-scss=/^[ \t]*@media\s+([A-Za-z0-9_-]+)/\1/d,media,media/
--regex-html=/id="([A-Za-z0-9_-]+)"/\1/i,id,ids/
--regex-html=/class="([A-Za-z0-9_-]+)"/\1/c,class,classes/
--langdef=js
--langmap=js:.js
--regex-js=/([A-Za-z0-9._$]+)[ t]*[:=][ t]*{/1/,object/
--regex-js=/([A-Za-z0-9._$()]+)[ t]*[:=][ t]*function[ t]*(/1/,function/
--regex-js=/function[ t]+([A-Za-z0-9._$]+)[ t]*(([^)]))/1/,function/
--regex-js=/([A-Za-z0-9._$]+)[ t]*[:=][ t]*[/1/,array/
--regex-js=/([^= ]+)[ t]*=[ t]*[^"]'[^']*/1/,string/
--regex-js=/([^= ]+)[ t]*=[ t]*[^']"[^"]*/1/,string/
Структура проекта:
Где бы (static/index.html
, static/css/main.scss
или static/css/components/set.scss
) я ни пытался перейти к определению, используя ]^D
, я всегда получаю E388: Couldn't find definition
. Что случается?
ОБНОВЛЕНИЕ
<C-]>
нажимается в начале _col-2
имени:
- в случае
<div class="_col-2">..
даетE426: Tag not found: _col
. Похоже, vim неправильно определяет имя класса. - в случае
.class { @extend ._col-2; }
дает то же самое.
Как предлагает @romainl, после добавления set iskeyword+=-
в .vimrc
, чтобы тире было частью ключевого слова, нажатие на <div class="_col-2">..
бросает меня в начало строки.
ctags
1970-х давно умер. Exuberantctags
не такой уж классический и не так давно умер, но все же мертв. Универсальныйctags
— это форк Exuberantctags
, который активно поддерживается. Помимо прочего, он устранил некоторые давние проблемы в Exuberantctags
и добавил поддержку большего количества языков. Насколько я могу судить, единственная регрессия — это случайное использование engrish в различных документах. :) - person Sato Katsura   schedule 11.11.2015