Skip to content

Instantly share code, notes, and snippets.

@paul356
Last active November 7, 2022 14:35
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save paul356/4bf7f77898a717e1d2bb to your computer and use it in GitHub Desktop.
Save paul356/4bf7f77898a717e1d2bb to your computer and use it in GitHub Desktop.
Add Clojure support to exuberant ctags and vim-tagbar

ctags

Add the following to ~/.ctags (thanks, xzj / clojure.ctags):

--langdef=Clojure
--langmap=Clojure:.clj
--langmap=Clojure:+.cljs
--langmap=Clojure:+.cljx
--regex-clojure=/\([ \t]*create-ns[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/n,namespace/
--regex-clojure=/\([ \t]*def[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/d,definition/
--regex-clojure=/\([ \t]*defn[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/f,function/
--regex-clojure=/\([ \t]*defn-[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/p,private function/
--regex-clojure=/\([ \t]*defmacro[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/m,macro/
--regex-clojure=/\([ \t]*definline[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/i,inline/
--regex-clojure=/\([ \t]*defmulti[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/a,multimethod definition/
--regex-clojure=/\([ \t]*defmethod[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/b,multimethod instance/
--regex-clojure=/\([ \t]*defonce[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/c,definition (once)/
--regex-clojure=/\([ \t]*defstruct[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/s,struct/
--regex-clojure=/\([ \t]*intern[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/v,intern/
--regex-clojure=/\([ \t]*ns[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/n,namespace/

vim-taglist

Add this line to your .vimrc and taglist will support Clojure:

let tlist_clojure_settings = 'Clojure;f:function'

vim-tagbar

Fork vladh/tagbar or change autoload/tagbar.vim as per this diff:

diff --git a/autoload/tagbar.vim b/autoload/tagbar.vim
index 2b555c3..07fdcb4 100644
--- a/autoload/tagbar.vim
+++ b/autoload/tagbar.vim
@@ -277,6 +277,24 @@ function! s:InitTypes() abort
         \ {'short' : 's', 'long' : 'sections',          'fold' : 0, 'stl' : 1}
     \ ]
     let s:known_types.cobol = type_cobol
+    " Clojure {{{3
+    let type_clojure = s:TypeInfo.New()
+    let type_clojure.ctagstype = 'clojure'
+    let type_clojure.kinds     = [
+        \ {'short' : 'n', 'long' : 'namespace',                'fold' : 0, 'stl' : 1},
+        \ {'short' : 'd', 'long' : 'definition',               'fold' : 0, 'stl' : 1},
+        \ {'short' : 'f', 'long' : 'function',                 'fold' : 0, 'stl' : 1},
+        \ {'short' : 'p', 'long' : 'private function',         'fold' : 0, 'stl' : 1},
+        \ {'short' : 'm', 'long' : 'macro',                    'fold' : 0, 'stl' : 1},
+        \ {'short' : 'i', 'long' : 'inline',                   'fold' : 0, 'stl' : 1},
+        \ {'short' : 'a', 'long' : 'multimethod definition',   'fold' : 0, 'stl' : 1},
+        \ {'short' : 'b', 'long' : 'multimethod instance',     'fold' : 0, 'stl' : 1},
+        \ {'short' : 'c', 'long' : 'definition (once)',        'fold' : 0, 'stl' : 1},
+        \ {'short' : 's', 'long' : 'struct',                   'fold' : 0, 'stl' : 1},
+        \ {'short' : 'v', 'long' : 'intern',                   'fold' : 0, 'stl' : 1},
+        \ {'short' : 'n', 'long' : 'namespace',                'fold' : 0, 'stl' : 1}
+    \ ]
+    let s:known_types.clojure = type_clojure
     " DOS Batch {{{3
     let type_dosbatch = s:TypeInfo.New()
     let type_dosbatch.ctagstype = 'dosbatch'
@@ -447,7 +465,6 @@ function! s:InitTypes() abort
         \ {'short' : 'f', 'long' : 'functions', 'fold' : 0, 'stl' : 1}
     \ ]
     let s:known_types.lisp = type_lisp
-    let s:known_types.clojure = type_lisp
     " Lua {{{3
     let type_lua = s:TypeInfo.New()
     let type_lua.ctagstype = 'lua'
@TiLogic
Copy link

TiLogic commented Nov 7, 2022

Thanks for this!
It might be helpful to add: --langmap=Clojure:+.cljc and --langmap=Clojure:+.cljd (for ClojureDart).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment