如何配置ctags以使用CSS,SCSS,HTML?

时间:2015-11-11 09:28:37

标签: vim ctags exuberant-ctags

我已经在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/

项目结构:

enter image description here

无论在何处(static/index.htmlstatic/css/main.scssstatic/css/components/set.scss),我都会尝试跳转到定义&#34;使用]^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">..会在行的开头投掷。

3 个答案:

答案 0 :(得分:4)

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

当您在HTML文档中的类名称上按<C-]>时,Vim会查找确切的类名,例如foo-bar,但由于您只有.foo-bar,因此无法找到它。 {1}}文件中的{1}}。那是因为Vim做了整个单词&#34;默认搜索。

此特定问题的解决方案是将标记留在标记之外:

tags

答案 1 :(得分:1)

]<C-D>动作适用于宏定义,由Vim的内部文件搜索和'define'选项提供支持。它没有使用标签数据库,主要用于C / C ++宏。你想要的是等同于:tag命令(显然对你有用)。这是<C-]>(或<C-LeftMouse>);您可以直接在:help :tag下找到它。

答案 2 :(得分:0)

似乎我找到了解决方案,感谢@romainl和@IngoKarkat提示,从regexp中排除点。因此,如果您未尝试使用HTML,CSS,SCSS Ctags,请执行以下步骤。

  • 下载latest version并摘录
  • 进入解压缩的文件夹并运行:./configure && make && sudo make install。现在通过运行ctags --help
  • 检查是否正确安装了ctags
  • 创建~/.ctags文件并将代码放在那里(见下文)
  • 将行set tags+=tags;$HOME添加到~/.vimrc,然后运行:so ~/.vimrc以更新选项。 tags+=tags;$HOME表示从当前文件夹到您的主目录递归搜索tags文件。如果你更喜欢另一个
  • 进入项目文件夹并运行ctags -R .。它创建ctags文件,该文件是找到的定义的索引(数据库)。
  • 现在转到vim vim .并检查:tag ^D是否有可用的标签(按CTRL-D)
  • 现在,您可以按b]CTRL-]CTRL-T列出标签,转到定义,返回上一个位置。

  • (可选)您可以运行ctags -R -f .tags来生成隐藏文件,而不是默认的tags名称。别忘了将set tags+=tags;$HOME更改为set tags+=.tags;$HOME

  • (可选)如果要更快地更新索引,请将nmap <leader><leader> :!ctags -R -f .tags<CR>添加到.vimrc。在:pwd执行此操作时跟踪您的父目录,以便不使用tags文件污染每个项目文件夹。

~/.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:+.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:.sass
--langmap=scss:+.scss
--regex-scss=/^[ \t]*@mixin ([A-Za-z0-9_-]+)/\1/m,mixin,mixins/
--regex-scss=/^[ \t]*@function ([A-Za-z0-9_-]+)/\1/f,function,functions/
--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/