如何使ctags + scss发挥得很好

时间:2012-05-23 16:28:23

标签: css vim sass ctags

更新 此问题已被修改,以反映下面非常有用的评论和答案。我已经接受了答案,但完整的功能到目前为止还没有。

.ctags的内容(在〜/中)

-R
--exclude=.git
--exclude=log 
--verbose=yes
--langdef=scss
--langmap=scss:.scss
--regex-scss=/^[ \t]*([^\t {][^{]{1,100})(\t| )*\{/| \1/d,definition/
--regex-scss=/^[@]mixin ([^ (]+).*/\1/m,mixing/

当我将光标放在目标下时,vim说E426 tag not found: tag_name

考虑以下模式:

footer{
 .wrapper{
  .general-info{
   .footer-links{
     a{@include ticker($bg, $white);}
    }
   }
  }
 }

在目录中的单独文件(modules.scss)中,我有ticker的定义:

@mixin ticker($color, $bg-color) {
 color: $color;
 background-color: $bg-color;
}

当我将光标放在目标下时,vim仍然会说E426 tag not found: tag_name

ctags不会将ticker mixin编入索引。但是我可以使用ctags直接从SCSS gem中查找方法(例如变暗)。

1 个答案:

答案 0 :(得分:5)

在使用ctags时,在最后\之前添加{不会发出警告。 我不知道所生成的标签是否会产生预期的结果,因为我不懂语言。

结果将是:

--langdef=scss
--langmap=scss:.scss
--regex-scss=/^[ \t]*([^\t {][^{]{1,100})(\t| )*\{/| \1/d,definition/

更新:就像我上面提到的,我不懂语言,所以很难检查标签的实际定义。 我在线查看,以下代码在某些网页中列为scss。 假设您想要获得的标签是混合后的单词。

@mixin table-scaffolding {      
  th {                          
    text-align: center;         
    font-weight: bold;          
  }                             
  td, th { padding: 2px; }      
}                               

@mixin left($dist) {            
  float: left;                  
  margin-left: $dist;           
}                               

#data {                         
  @include left(10px);          
  @include table-scaffolding;   
}                               

然后使用以下内容:

--langdef=scss
--langmap=scss:.scss
--regex-scss=/^[ \t]*([^\t {][^{]{1,100})(\t| )*\{/| \1/d,definition/
--regex-scss=/^[@]mixin ([^ (]+).*/\1/m,mixin/
--regex-scss=/^[@]function ([^ (]+).*/\1/f,function/

您获得了两个新标记lefttable-scaffolding。 因此,如果我在数据命中left内的单词ctrl+]中,它会跳转到定义数据的行。 您必须小心另一个关键字,因为它在单词中有-。因此,如果您在桌上并按ctrl+],您将得到相同的错误标签。要实现此目的,您必须在.vimrc

中添加以下内容
set iskeyword+=-

您应该能够将上述内容概括为您需要的其他标记,或者甚至构建一个通用正则表达式来处理所有标记,就像您最初的意思一样。

如果你发布一个特定的例子,说明你试图使用的文件是什么样的,以及你想要获得的标签是什么,我相信我或其他人能够帮助找出一个表达式