xref: /vim-8.2.3635/runtime/ftplugin/clojure.vim (revision cb03397a)
1" Vim filetype plugin file
2" Language:     Clojure
3" Author:       Meikel Brandmeyer <[email protected]>
4"
5" Maintainer:   Sung Pae <[email protected]>
6" URL:          https://github.com/guns/vim-clojure-static
7" License:      Same as Vim
8" Last Change:  18 July 2016
9
10if exists("b:did_ftplugin")
11	finish
12endif
13let b:did_ftplugin = 1
14
15let s:cpo_save = &cpo
16set cpo&vim
17
18let b:undo_ftplugin = 'setlocal iskeyword< define< formatoptions< comments< commentstring< lispwords<'
19
20setlocal iskeyword+=?,-,*,!,+,/,=,<,>,.,:,$
21
22" There will be false positives, but this is better than missing the whole set
23" of user-defined def* definitions.
24setlocal define=\\v[(/]def(ault)@!\\S*
25
26" Remove 't' from 'formatoptions' to avoid auto-wrapping code.
27setlocal formatoptions-=t
28
29" Lisp comments are routinely nested (e.g. ;;; SECTION HEADING)
30setlocal comments=n:;
31setlocal commentstring=;\ %s
32
33" Specially indented symbols from clojure.core and clojure.test.
34"
35" Clojure symbols are indented in the defn style when they:
36"
37"   * Define vars and anonymous functions
38"   * Create new lexical scopes or scopes with altered environments
39"   * Create conditional branches from a predicate function or value
40"
41" The arglists for these functions are generally in the form of [x & body];
42" Functions that accept a flat list of forms do not treat the first argument
43" specially and hence are not indented specially.
44"
45" -*- LISPWORDS -*-
46" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-011/clj/src/vim_clojure_static/generate.clj
47setlocal lispwords=as->,binding,bound-fn,case,catch,cond->,cond->>,condp,def,definline,definterface,defmacro,defmethod,defmulti,defn,defn-,defonce,defprotocol,defrecord,defstruct,deftest,deftest-,deftype,doseq,dotimes,doto,extend,extend-protocol,extend-type,fn,for,if,if-let,if-not,if-some,let,letfn,locking,loop,ns,proxy,reify,set-test,testing,when,when-first,when-let,when-not,when-some,while,with-bindings,with-in-str,with-local-vars,with-open,with-precision,with-redefs,with-redefs-fn,with-test
48
49" Provide insert mode completions for special forms and clojure.core. As
50" 'omnifunc' is set by popular Clojure REPL client plugins, we also set
51" 'completefunc' so that the user has some form of completion available when
52" 'omnifunc' is set and no REPL connection exists.
53for s:setting in ['omnifunc', 'completefunc']
54	if exists('&' . s:setting) && empty(eval('&' . s:setting))
55		execute 'setlocal ' . s:setting . '=clojurecomplete#Complete'
56		let b:undo_ftplugin .= ' | setlocal ' . s:setting . '<'
57	endif
58endfor
59
60" Take all directories of the CLOJURE_SOURCE_DIRS environment variable
61" and add them to the path option.
62"
63" This is a legacy option for VimClojure users.
64if exists('$CLOJURE_SOURCE_DIRS')
65	for s:dir in split($CLOJURE_SOURCE_DIRS, (has("win32") || has("win64")) ? ';' : ':')
66		let s:dir = fnameescape(s:dir)
67		" Whitespace escaping for Windows
68		let s:dir = substitute(s:dir, '\', '\\\\', 'g')
69		let s:dir = substitute(s:dir, '\ ', '\\ ', 'g')
70		execute "setlocal path+=" . s:dir . "/**"
71	endfor
72	let b:undo_ftplugin .= ' | setlocal path<'
73endif
74
75" Skip brackets in ignored syntax regions when using the % command
76if exists('loaded_matchit')
77	let b:match_words = &matchpairs
78	let b:match_skip = 's:comment\|string\|regex\|character'
79	let b:undo_ftplugin .= ' | unlet! b:match_words b:match_skip'
80endif
81
82" Win32 can filter files in the browse dialog
83if has("gui_win32") && !exists("b:browsefilter")
84	let b:browsefilter = "Clojure Source Files (*.clj)\t*.clj\n" .
85	                   \ "ClojureScript Source Files (*.cljs)\t*.cljs\n" .
86	                   \ "Java Source Files (*.java)\t*.java\n" .
87	                   \ "All Files (*.*)\t*.*\n"
88	let b:undo_ftplugin .= ' | unlet! b:browsefilter'
89endif
90
91let &cpo = s:cpo_save
92
93unlet! s:cpo_save s:setting s:dir
94
95" vim:sts=8:sw=8:ts=8:noet
96