@@ -40,7 +40,7 @@ if exists("*searchpairpos")
40
40
endif
41
41
42
42
if ! exists (' g:clojure_special_indent_words' )
43
- let g: clojure_special_indent_words = ' deftype,defrecord,reify,proxy,extend-type,extend-protocol'
43
+ let g: clojure_special_indent_words = ' deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn '
44
44
endif
45
45
46
46
if ! exists (' g:clojure_align_multiline_strings' )
@@ -169,7 +169,39 @@ if exists("*searchpairpos")
169
169
170
170
call search (' \S' , ' W' )
171
171
let w = s: strip_namespace_and_macro_chars (s: current_word ())
172
+
172
173
if g: clojure_special_indent_words = ~# ' \V\<' . w . ' \>'
174
+
175
+ " `letfn` is a special-special-case.
176
+ if w == # ' letfn'
177
+ " Earlier code left the cursor at:
178
+ " (letfn [...] ...)
179
+ " ^
180
+
181
+ " Search and get coordinates of first `[`
182
+ " (letfn [...] ...)
183
+ " ^
184
+ call search (' [' , ' W' )
185
+ let pos = getcurpos ()
186
+ let letfn_bracket = [pos[1 ], pos[2 ]]
187
+
188
+ " Move cursor to start of the form this function was
189
+ " initially called on. Grab the coordinates of the
190
+ " closest outer `[`.
191
+ call cursor (a: position )
192
+ let outer_bracket = s: match_pairs (' \[' , ' \]' , 0 )
193
+
194
+ " Undo cursor traversal
195
+ call cursor (next_paren)
196
+ call search (' \S' , ' W' )
197
+
198
+ " If the located square brackets are not the same,
199
+ " don't use special-case formatting.
200
+ if outer_bracket != letfn_bracket
201
+ return 0
202
+ endif
203
+ endif
204
+
173
205
return 1
174
206
endif
175
207
0 commit comments