vim - 如何配置 ctags 以使用 CSS、SCSS、HTML?

标签 vim ctags exuberant-ctags

我已经在 stackoverflow 上阅读了很多博客文章和答案,但似乎我做错了什么,因为我仍然有 E388: Couldn't find definition错误。我做了什么:

  • 从此处下载 ctag http://ctags.sourceforge.net/
  • 安装方式:./configure && make install
  • 设置tags+=tags;$HOME在我的.vimrc文件
  • 将一些行添加到 ~/.ctags 中(见下文)
  • ctags -R .在项目根目录中并收到一些警告(见下文)
  • 通过:tag .<C-D>查看类(class)这给了我一个很大的类列表(我喜欢)

警告:

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/

项目结构:

enter image description here

无论在哪里( static/index.htmlstatic/css/main.scssstatic/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">..把我扔到了行首。

最佳答案

关于E426: Tag not found: txal-center

您的 .ctags 中的这些行将索引.foo-bar带前导点 — 在 *.scss 中文件:

--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/

当您按<C-]>时对于 HTML 文档中的类名,Vim 会查找确切的类名,例如 foo-bar ,但它找不到它,因为你只有 .foo-bar在你的tags文件。这是因为 Vim 默认进行“全字”搜索。

此特定问题的解决方案是将点从标记中删除:

--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/

关于vim - 如何配置 ctags 以使用 CSS、SCSS、HTML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647614/

相关文章:

ubuntu - Vim 复制到系统剪贴板有效但不能粘贴到同一终端

eclipse - Vim 中的源代码面包屑

c++ - 如何让代码完成在 Sublime Text 3 中为 c++ 工作?

压缩多行 C 函数原型(prototype)

c++ - 让 vim 的 YouCompleteMe 插件识别 exuberant-ctags

vim - 你在 Vim 中使用哪些自定义键绑定(bind)?

javascript - Vim jshint 错误 "bad line breaking before ' ,'"

javascript - 在 Vim 中键入函数定义

emacs - 带有 emacs 的通用 ctags