返回首页 - Notes - 2015

给 ctags 添加对 Elixir 的支持


背景概述

ctags 官方已经许久未更新了,截至本文写作时止,最后一次更新在 2009-07-09,所以很多新出的语言都没能得到支持

现在 Github 上有一个 fork 出来的项目叫 universal-ctags,它拾起了对 ctags 的更新,但是很遗憾,Elixir 也暂未得到支持


自己动手丰衣足食

好在 ctags 支持一个自定义的配置文件,名为 .ctags,可以在这里书写规则实现对未知编程语言的解析

下面是针对 Elixir 的配置

--langdef=Elixir
--langmap=Elixir:.ex.exs
--regex-Elixir=/^[ \t]*def(p?)[ \t]+([a-z_][a-zA-Z0-9_?!]*)/\2/f,functions,functions (def ...)/
--regex-Elixir=/^[ \t]*defcallback[ \t]+([a-z_][a-zA-Z0-9_?!]*)/\1/c,callbacks,callbacks (defcallback ...)/
--regex-Elixir=/^[ \t]*defdelegate[ \t]+([a-z_][a-zA-Z0-9_?!]*)/\1/d,delegates,delegates (defdelegate ...)/
--regex-Elixir=/^[ \t]*defexception[ \t]+([A-Z][a-zA-Z0-9_]*\.)*([A-Z][a-zA-Z0-9_?!]*)/\2/e,exceptions,exceptions (defexception ...)/
--regex-Elixir=/^[ \t]*defimpl[ \t]+([A-Z][a-zA-Z0-9_]*\.)*([A-Z][a-zA-Z0-9_?!]*)/\2/i,implementations,implementations (defimpl ...)/
--regex-Elixir=/^[ \t]*defmacro(p?)[ \t]+([a-z_][a-zA-Z0-9_?!]*)\(/\2/a,macros,macros (defmacro ...)/
--regex-Elixir=/^[ \t]*defmacro(p?)[ \t]+([a-zA-Z0-9_?!]+)?[ \t]+([^ \tA-Za-z0-9_]+)[ \t]*[a-zA-Z0-9_!?!]/\3/o,operators,operators (e.g. "defmacro a <<< b")/
--regex-Elixir=/^[ \t]*defmodule[ \t]+([A-Z][a-zA-Z0-9_]*\.)*([A-Z][a-zA-Z0-9_?!]*)/\2/m,modules,modules (defmodule ...)/
--regex-Elixir=/^[ \t]*defprotocol[ \t]+([A-Z][a-zA-Z0-9_]*\.)*([A-Z][a-zA-Z0-9_?!]*)/\2/p,protocols,protocols (defprotocol...)/
--regex-Elixir=/^[ \t]*Record\.defrecord[ \t]+:([a-zA-Z0-9_]+)/\1/r,records,records (defrecord...)/

把上述内容保存到文本文件,并命名为 .ctagsMacOSXLinux 放置到自己的家目录下即可;Windows 下得先设置个名为 HOMEPATH 的环境变量,然后将 .ctags 放置到该环境变量所指路径下

打开命令行,执行 ctags --list-languages,在输出的信息中能找到 Elixir 则说明配置成功


怎么可能少得了Vim

Vim 里面即时浏览代码结构,首推 tagbar 插件,这里就不介绍怎么安装、怎么使用了,下面是添加对 Elixir 的支持,将其写在 .vimrc 中即可

let g:tagbar_type_elixir = {'ctagstype': 'elixir', 'kinds': ['f:functions:0:0', 'c:callbacks:0:0', 'd:delegates:0:0', 'e:exceptions:0:0', 'i:implementations:0:0', 'a:macros:0:0', 'o:operators:0:0', 'm:modules:0:0', 'p:protocols:0:0', 'r:records:0:0'], 'sro': '.', 'kind2scope': {'m': 'modules'}, 'scope2kind': {'modules': 'm'}}

date:2015-08-06