utils 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. data/Rakefile +68 -0
  2. data/VERSION +1 -0
  3. data/bin/chroot-exec +12 -0
  4. data/bin/chroot-libs +18 -0
  5. data/bin/classify +37 -0
  6. data/bin/discover +137 -0
  7. data/bin/edit +74 -0
  8. data/bin/errf +32 -0
  9. data/bin/git-empty +8 -0
  10. data/bin/myex +90 -0
  11. data/bin/number_files +26 -0
  12. data/bin/same_files +37 -0
  13. data/bin/search +205 -0
  14. data/bin/sedit +3 -0
  15. data/bin/sshscreen +68 -0
  16. data/bin/term +21 -0
  17. data/bin/unquarantine_apps +8 -0
  18. data/bin/untest +17 -0
  19. data/bin/utils-install-config +10 -0
  20. data/bin/vacuum_firefox_sqlite +22 -0
  21. data/bin/xmp +74 -0
  22. data/lib/utils.rb +8 -0
  23. data/lib/utils/config.rb +23 -0
  24. data/lib/utils/config/gdb/asm +179 -0
  25. data/lib/utils/config/gdb/ruby +528 -0
  26. data/lib/utils/config/gdbinit +8 -0
  27. data/lib/utils/config/irbrc +455 -0
  28. data/lib/utils/config/rdebugrc +2 -0
  29. data/lib/utils/config/screenrc +143 -0
  30. data/lib/utils/config/vim/autoload/Align.vim +1029 -0
  31. data/lib/utils/config/vim/autoload/AlignMaps.vim +330 -0
  32. data/lib/utils/config/vim/autoload/rails.vim +4744 -0
  33. data/lib/utils/config/vim/autoload/rubycomplete.vim +801 -0
  34. data/lib/utils/config/vim/autoload/sqlcomplete.vim +741 -0
  35. data/lib/utils/config/vim/autoload/vimball.vim +750 -0
  36. data/lib/utils/config/vim/colors/flori.vim +113 -0
  37. data/lib/utils/config/vim/compiler/eruby.vim +40 -0
  38. data/lib/utils/config/vim/compiler/ruby.vim +67 -0
  39. data/lib/utils/config/vim/compiler/rubyunit.vim +34 -0
  40. data/lib/utils/config/vim/ftdetect/ragel.vim +2 -0
  41. data/lib/utils/config/vim/ftdetect/ruby.vim +17 -0
  42. data/lib/utils/config/vim/ftplugin/eruby.vim +100 -0
  43. data/lib/utils/config/vim/ftplugin/ruby.vim +260 -0
  44. data/lib/utils/config/vim/ftplugin/xml.vim +941 -0
  45. data/lib/utils/config/vim/indent/IndentAnything_html.vim +35 -0
  46. data/lib/utils/config/vim/indent/eruby.vim +77 -0
  47. data/lib/utils/config/vim/indent/javascript.vim +116 -0
  48. data/lib/utils/config/vim/indent/ruby.vim +377 -0
  49. data/lib/utils/config/vim/plugin/AlignMapsPlugin.vim +242 -0
  50. data/lib/utils/config/vim/plugin/AlignPlugin.vim +41 -0
  51. data/lib/utils/config/vim/plugin/Decho.vim +592 -0
  52. data/lib/utils/config/vim/plugin/IndentAnything.vim +675 -0
  53. data/lib/utils/config/vim/plugin/bufexplorer.vim +1144 -0
  54. data/lib/utils/config/vim/plugin/cecutil.vim +482 -0
  55. data/lib/utils/config/vim/plugin/fugitive.vim +1703 -0
  56. data/lib/utils/config/vim/plugin/lusty-explorer.vim +1509 -0
  57. data/lib/utils/config/vim/plugin/rails.vim +340 -0
  58. data/lib/utils/config/vim/plugin/rubyextra.vim +193 -0
  59. data/lib/utils/config/vim/plugin/surround.vim +628 -0
  60. data/lib/utils/config/vim/plugin/taglist.vim +4546 -0
  61. data/lib/utils/config/vim/plugin/test/IndentAnything/test.js +131 -0
  62. data/lib/utils/config/vim/plugin/vimballPlugin.vim +40 -0
  63. data/lib/utils/config/vim/syntax/Decho.vim +101 -0
  64. data/lib/utils/config/vim/syntax/eruby.vim +73 -0
  65. data/lib/utils/config/vim/syntax/javascript.vim +246 -0
  66. data/lib/utils/config/vim/syntax/ragel.vim +165 -0
  67. data/lib/utils/config/vim/syntax/ruby.vim +367 -0
  68. data/lib/utils/config/vimrc +461 -0
  69. data/lib/utils/file.rb +49 -0
  70. data/lib/utils/find.rb +54 -0
  71. data/lib/utils/md5.rb +23 -0
  72. data/lib/utils/patterns.rb +34 -0
  73. data/lib/utils/version.rb +8 -0
  74. data/utils.gemspec +33 -0
  75. metadata +183 -0
@@ -0,0 +1,675 @@
1
+ "
2
+ " Copyright 2006 Tye Zdrojewski
3
+ "
4
+ " Licensed under the Apache License, Version 2.0 (the "License"); you may not
5
+ " use this file except in compliance with the License. You may obtain a copy of
6
+ " the License at
7
+ "
8
+ " http://www.apache.org/licenses/LICENSE-2.0
9
+ "
10
+ " Unless required by applicable law or agreed to in writing, software distributed
11
+ " under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
+ " CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
+ " specific language governing permissions and limitations under the License.
14
+ "
15
+ "
16
+ "
17
+ " Plugin:
18
+ "
19
+ " Indent Anything
20
+ "
21
+ " Version: 1.2.2
22
+ "
23
+ " Description:
24
+ "
25
+ " This is an indentation script that calculates the indent level based
26
+ " on begin/end syntax pairs and line-continuation patterns. It allows one
27
+ " to create an indent script without writing any code, taking it's
28
+ " instruction from configurable values.
29
+ "
30
+ " Included with this script is Javascript indentation, an example that
31
+ " explains the configurable values.
32
+ "
33
+ "
34
+ " Installation:
35
+ "
36
+ " Place this file in your home directory under ~/.vim/indent/, or replace
37
+ " the system indent/javascript.vim file to affect all users.
38
+ "
39
+ " Maintainer: Tye Z. <zdro@yahoo.com>
40
+ "
41
+ " Customization:
42
+ "
43
+ " The only thing that can really be customized at this point is whether or
44
+ " not a line is echoed explaining the indentation result. To turn this on,
45
+ " set the following variable like so:
46
+ "
47
+ " let b:indent_anything_echo = 1
48
+ "
49
+ "
50
+ " History:
51
+ "
52
+ " 1.2 - made some functions script-local to prevent naming collisions
53
+ " - fixed some broken indentation in the middle of a block comment,
54
+ " which showed up in Javascript indentation.
55
+ "
56
+ " 1.2.2 - Fixed a bug causing the line after a single-line block comment to
57
+ " always have an indent of '0' (i.e. the line after /* comment */).
58
+ " - Added Apache 2 license
59
+ "
60
+ "
61
+
62
+ let s:supportedVimVersion = 700
63
+
64
+ if version < s:supportedVimVersion
65
+ echoerr "IndentAnything only supported for Vim " . s:supportedVimVersion . " and up."
66
+ finish
67
+ endif
68
+
69
+
70
+ "
71
+ " Initialize everything needed by this script. Only set those values that are
72
+ " not set already.
73
+ "
74
+ function! IndentAnythingInit()
75
+ let b:IndentAnythingInitialized = 1
76
+ " Start with a regular expression that will never match. Matching
77
+ " will influence behavior, which the defaults should not do.
78
+ let s:nonMatcher = '[x]\&[^x]'
79
+ if !exists('b:commentRE')
80
+ let b:commentRE = s:nonMatcher
81
+ endif
82
+ if !exists('b:lineCommentRE')
83
+ let b:lineCommentRE = s:nonMatcher
84
+ endif
85
+ if !exists('b:blockCommentRE')
86
+ let b:blockCommentRE = s:nonMatcher
87
+ endif
88
+ if !exists('b:stringRE')
89
+ let b:stringRE = s:nonMatcher
90
+ endif
91
+ if !exists('b:singleQuoteStringRE')
92
+ let b:singleQuoteStringRE = s:nonMatcher
93
+ endif
94
+ if !exists('b:doubleQuoteStringRE')
95
+ let b:doubleQuoteStringRE = s:nonMatcher
96
+ endif
97
+
98
+ if !exists('b:blockCommentStartRE')
99
+ let b:blockCommentStartRE = s:nonMatcher
100
+ endif
101
+ if !exists('b:blockCommentMiddleRE')
102
+ let b:blockCommentMiddleRE = s:nonMatcher
103
+ endif
104
+ if !exists('b:blockCommentEndRE')
105
+ let b:blockCommentEndRE = s:nonMatcher
106
+ endif
107
+ if !exists('b:blockCommentMiddleExtra')
108
+ let b:blockCommentMiddleExtra = 0
109
+ endif
110
+
111
+ if !exists('b:indentTrios')
112
+ let b:indentTrios = []
113
+ endif
114
+ if !exists('b:lineContList')
115
+ let b:lineContList = []
116
+ endif
117
+
118
+ if !exists('b:contTraversesLineComments')
119
+ let b:contTraversesLineComments = 1
120
+ endif
121
+
122
+ if !exists('b:indent_anything_echo')
123
+ let b:indent_anything_echo = 0
124
+ endif
125
+ endfunction
126
+
127
+ function! SynHere()
128
+ return synIDattr(synID(line('.'), col('.'), 1), "name")
129
+ endfunction
130
+ "
131
+ " Returns true if the cursor is currently inside a comment or a string
132
+ "
133
+ function! InCommentOrString()
134
+ let syn = synIDattr(synID(line("."), col("."), 1), "name")
135
+ if syn =~ b:commentRE || syn =~ b:stringRE
136
+ return 1
137
+ endif
138
+ return 0
139
+ endfunction
140
+
141
+ "
142
+ " Returns true if the given line is a comment line (b:lineCommentRE)
143
+ "
144
+ function! IsLineComment(linenum)
145
+ let cursor = getpos('.')
146
+ exec a:linenum
147
+ normal ^
148
+ let l:iscomment = 0
149
+ let l:syn = synIDattr(synID(line('.'), col('.'), 1), "name")
150
+ if l:syn =~ b:lineCommentRE " b:commentRE || l:syn =~ b:stringRE
151
+ let l:iscomment = 1
152
+ endif
153
+ call setpos('.', cursor)
154
+ return l:iscomment
155
+ endfunction
156
+
157
+ "
158
+ " Returns true if the given line is a comment line (b:lineCommentRE)
159
+ "
160
+ function! IsComment(linenum)
161
+ let cursor = getpos('.')
162
+ exec a:linenum
163
+ normal ^
164
+ let l:iscomment = 0
165
+ let l:syn = synIDattr(synID(line('.'), col('.'), 1), "name")
166
+ if l:syn =~ b:commentRE " b:commentRE || l:syn =~ b:stringRE
167
+ let l:iscomment = 1
168
+ endif
169
+ call setpos('.', cursor)
170
+ return l:iscomment
171
+ endfunction
172
+
173
+ "
174
+ " Returns true if the given line is a comment line (b:lineCommentRE)
175
+ "
176
+ function! IsBlockComment(linenum)
177
+ let cursor = getpos('.')
178
+ exec a:linenum
179
+ normal ^
180
+ let l:iscomment = 0
181
+ let l:syn = synIDattr(synID(line('.'), col('.'), 1), "name")
182
+ if l:syn =~ b:blockCommentRE " b:commentRE || l:syn =~ b:stringRE
183
+ let l:iscomment = 1
184
+ endif
185
+ call setpos('.', cursor)
186
+ return l:iscomment
187
+ endfunction
188
+
189
+ "
190
+ " Get the first line at or on the given line that is not blank and is not a
191
+ " comment line.
192
+ "
193
+ function! GetPrevNonBlankNonComment(begin)
194
+ let cursor = getpos('.')
195
+
196
+ let l:prevbegin = a:begin
197
+ while 1
198
+ let l:lnum = prevnonblank(l:prevbegin)
199
+ if l:lnum == 0
200
+ return 0
201
+ endif
202
+
203
+ "if IsLineComment(l:lnum)
204
+ if IsComment(l:lnum)
205
+ let l:prevbegin -= 1
206
+ continue
207
+ endif
208
+
209
+ break
210
+ endwhile
211
+
212
+ " Restore original cursor location
213
+ call setpos('.', cursor)
214
+ return l:lnum
215
+ endfunction
216
+
217
+ "
218
+ " This does all the work. Does indentation for:
219
+ "
220
+ " - All pairs defined in b:indentTrios
221
+ " - All line continuations in b:lineContList
222
+ " - Block comments
223
+ "
224
+ function! IndentAnything()
225
+
226
+ if !exists('b:IndentAnythingInitialized')
227
+ call IndentAnythingInit()
228
+ endif
229
+
230
+ let adj = 0 " Adjustment
231
+
232
+ let g:lastindent = ""
233
+ let b:hardindent = -1
234
+ let currlnum = v:lnum
235
+ let currlnum = line('.')
236
+ let currline = getline(currlnum)
237
+ let lastline = ''
238
+ let prevline = ''
239
+
240
+ " Find non-blank lines above the current line.
241
+ let lastlnum = prevnonblank(currlnum - 1)
242
+ let prevlnum = prevnonblank(lastlnum - 1)
243
+ if lastlnum != 0
244
+ let lastline = getline(lastlnum)
245
+ endif
246
+ if prevlnum != 0
247
+ let prevline = getline(prevlnum)
248
+ endif
249
+ if b:contTraversesLineComments
250
+ let lastcodelnum = GetPrevNonBlankNonComment(currlnum - 1)
251
+ let prevcodelnum = GetPrevNonBlankNonComment(lastcodelnum - 1)
252
+ if lastcodelnum !=0
253
+ let lastcodeline = getline(lastcodelnum)
254
+ endif
255
+ endif
256
+
257
+ " Start from the first char on the line. Vim doesn't seem to consistently
258
+ " place the cursor there before calling the indent routines.
259
+ call cursor(0, 1)
260
+ call search('\S', 'W')
261
+
262
+ let l:cur = getpos('.')
263
+
264
+ "
265
+ " Call indentation adjustment functions.
266
+ "
267
+
268
+ "
269
+ " Block comments
270
+ "
271
+ let l:BlockCommentAdj = 0
272
+ let l:BlockCommentAdj += s:GetBlockCommentIndent(currlnum, lastlnum)
273
+ let adj += l:BlockCommentAdj
274
+
275
+ "
276
+ " Pairs
277
+ "
278
+ let b:lastclosed = { 'at' : 0 }
279
+ let b:pairadj = 0
280
+ if !l:BlockCommentAdj
281
+ " If we're not in the middle of a block comment (because we haven't
282
+ " made any adjustments for that), then process block indentation.
283
+ for trio in b:indentTrios
284
+ let b:pairadj += s:GetPairIndent(currline, lastline, lastlnum,
285
+ \ trio[0], trio[1], trio[2])
286
+ endfor
287
+ endif
288
+ let adj += b:pairadj
289
+
290
+ "
291
+ " Line continuations
292
+ "
293
+ let contadj = 0
294
+ let isBlockCommentStart = currline =~ '^\s*' . b:blockCommentStartRE
295
+ let isBlockCommentMid = (IsBlockComment(currlnum) && !isBlockCommentStart)
296
+ if !isBlockCommentMid
297
+ " If the current line is not the middle of a block comment, then
298
+ " process line continuations.
299
+ for ContRule in b:lineContList
300
+ if b:contTraversesLineComments "&& !isBlockCommentStart
301
+ let contadj = s:GetContIndent(ContRule, currline, lastcodeline, lastcodelnum, prevcodelnum)
302
+ else
303
+ let contadj = s:GetContIndent(ContRule, currline, lastline, lastlnum, prevlnum)
304
+ endif
305
+ " This is for line continuation patterns, of which there can be only
306
+ " one per line to indicate continuation
307
+ if contadj
308
+ break
309
+ endif
310
+ endfor
311
+ let adj += contadj
312
+ endif
313
+
314
+
315
+ "
316
+ " Find the previous indent to which we will add the adjustment
317
+ "
318
+ let prevind = indent(lastlnum)
319
+
320
+ if l:BlockCommentAdj
321
+ let g:lastindent .= " indent (prevblockcomment: " . prevind . " at " . lastcodelnum . ") "
322
+ elseif contadj && b:contTraversesLineComments
323
+ " If we have adjusted for line continuation, then use the indentation
324
+ " for the previous code line
325
+ let prevind = indent(lastcodelnum)
326
+ let g:lastindent .= " indent (prevcode: " . prevind . " at " . lastcodelnum . ") "
327
+
328
+ elseif (isBlockCommentStart || !IsBlockComment(currlnum)) && IsBlockComment(lastlnum)
329
+ " If this is the first line after a block comment, then add the
330
+ " adjustment to the line where the block comment started.
331
+ let prevind = s:GetPostBlockCommentIndent(lastlnum)
332
+ let g:lastindent .= " indent (prevblock: " . prevind . " at " . lastlnum . ") "
333
+
334
+ elseif exists("b:defaultIndentExpr")
335
+ let g:lastindent .= " using defaultIndentExpr (" . b:defaultIndentExpr . ") "
336
+ exec "let prevind = " . b:defaultIndentExpr
337
+ else
338
+ " Default to adjusting the previous line's indent.
339
+ let g:lastindent .= " indent (prev: " . prevind . " at " . lastlnum . ") "
340
+ endif
341
+
342
+ " Just in case there is no previous indent.
343
+ let prevind = (prevind == -1 ? 0 : prevind)
344
+
345
+ if b:indent_anything_echo
346
+ echom g:lastindent
347
+ endif
348
+
349
+ call setpos('.', l:cur)
350
+
351
+ return adj + prevind
352
+
353
+ endfunction
354
+
355
+ "
356
+ " Get the adjustment for the second line of a block comment. The second line
357
+ " will be aligned under the start of the block, even if it is not at the
358
+ " beginning of the line. Extra adjustment (b:blockCommentMiddleExtra) will
359
+ " be added.
360
+ "
361
+ function! s:GetBlockCommentIndent(CurrLNum, LastLNum)
362
+ let l:cursor = getpos('.')
363
+ let l:adj = 0
364
+ if a:LastLNum == searchpair(b:blockCommentStartRE, '', b:blockCommentEndRE, 'bWr')
365
+ \ && a:LastLNum > 0
366
+ let l:adj = col('.') + b:blockCommentMiddleExtra
367
+ normal ^
368
+ let l:adj -= col('.')
369
+ endif
370
+ call setpos('.', l:cursor)
371
+ return l:adj
372
+ endfunction
373
+
374
+ function! s:GetPostBlockCommentIndent(LastLNum)
375
+
376
+ let l:cursor = getpos('.')
377
+ let l:ind = 0
378
+ let l:comment_start_lnum = 0;
379
+
380
+ " Find beginning of block comment containing the start of line LastLNum
381
+ exec a:LastLNum
382
+ normal ^
383
+ let l:comment_start_lnum = searchpair(
384
+ \ b:blockCommentStartRE, b:blockCommentMiddleRE, b:blockCommentEndRE, 'bWr')
385
+
386
+ " Assume that the LastLNum is a block comment. If the comment both
387
+ " started and stopped on LastLNum, then searchpair will return 0. In that
388
+ " case, we just want to return the indent of LastLNum itself.
389
+ if 0 == l:comment_start_lnum
390
+ let l:comment_start_lnum = a:LastLNum
391
+ endif
392
+
393
+ let l:ind = indent(l:comment_start_lnum)
394
+
395
+ if 1 || l:ind != 0 && b:indent_anything_echo
396
+ let g:lastindent = g:lastindent .
397
+ \ "GetPostBlockCommentIndent: " . l:ind
398
+ endif
399
+
400
+ call setpos('.', l:cursor)
401
+
402
+ "return l:ind
403
+ return l:ind > 0 ? l:ind : 0
404
+
405
+ endfunction
406
+
407
+ "
408
+ " Get additional indentation based on blocks of code, as defined by the Head
409
+ " and Tail patterns.
410
+ "
411
+ function! s:GetPairIndent(CurrLine, LastLine, LastLNum, Head, Mid, Tail)
412
+
413
+ let levels = 0
414
+ let adj = 0
415
+ let origcol = col(".")
416
+ let origline = line(".")
417
+
418
+
419
+ "
420
+ " How many levels were started on the last line? Search backwards for
421
+ " pair starters until we're not on the last nonblank. If the last line
422
+ " doesn't contain the pair-starter, then don't bother with searchpair();
423
+ " it's a performance bottleneck because (I think) it will always search
424
+ " all the way back until it finds a match or can't search any more.
425
+ "
426
+ "
427
+ if a:LastLine =~ a:Head
428
+ while 1
429
+ "
430
+ " Include the limit of the search to be the last line. BIG
431
+ " performance booster! That also means we only have to see *if*
432
+ " there was a match, and not worry about where it is.
433
+ "
434
+ "let pairstart = searchpair(a:Head, a:Mid, a:Tail, 'Wb')
435
+ "if pairstart == 0 || pairstart != a:LastLNum
436
+ let pairstart = searchpair(a:Head, a:Mid, a:Tail, 'Wb', '', a:LastLNum)
437
+ if pairstart == 0 "|| pairstart != a:LastLNum
438
+ break
439
+ endif
440
+ let syn = synIDattr(synID(line("."), col("."), 1), "name")
441
+ " Also continue on the off chance that we find the match on the
442
+ " current line. This shouldn't happen, but the pattern might
443
+ " start with whitespace.
444
+ if syn =~ b:commentRE || syn =~ b:stringRE || pairstart == origline
445
+ continue
446
+ endif
447
+ let levels += 1
448
+ endwhile
449
+ endif
450
+
451
+ " If we aren't within a level that was started on the last line, then
452
+ " check how many levels were closed on the last line.
453
+ "
454
+ if levels == 0
455
+
456
+ " Move to the beginning of the last line
457
+ call cursor(a:LastLNum,0)
458
+ normal ^
459
+
460
+ " If the line starts with an open, The close shouldn't be counted as
461
+ " such, because we're looking for closes that didn't start on this
462
+ " line.
463
+ if a:LastLine =~ '^\s*' . a:Head ||
464
+ \ (a:Mid != '' && a:LastLine =~ '^\s*' . a:Mid)
465
+ let levels = 1
466
+ endif
467
+
468
+ "
469
+ " Count the closes on the last line (i.e. LastLNum), stopping once
470
+ " we've hit comments. If the line doesn't even contain the end of the
471
+ " pair, don't bother with searchpair() (same aforementioned
472
+ " rationale).
473
+ "
474
+ if a:LastLine =~ a:Tail
475
+ while 1
476
+ "
477
+ " Include the limit of the search to be the last line. BIG
478
+ " performance booster! That also means we only have to see
479
+ " *if* there was a match, and not worry about where it is.
480
+ "
481
+ "let pairend = searchpair(a:Head, a:Mid, a:Tail, 'W')
482
+ "if pairend == 0 || a:LastLNum != pairend
483
+ "let pairend = searchpair(a:Head, a:Mid, a:Tail, 'W', '', a:LastLNum)
484
+ let pairend = searchpair(a:Head, a:Mid, a:Tail, 'W',
485
+ \'InCommentOrString()', a:LastLNum)
486
+ if pairend == 0 "|| a:LastLNum != pairend
487
+
488
+ " STARTS with a:Tail, since we already know the line
489
+ " matches it.
490
+ if b:lastclosed.at < col('.') && (
491
+ \ a:LastLine =~ '^\s*' . a:Tail
492
+ \ || (a:Mid != '' && a:LastLine =~ '^\s*' . a:Mid) )
493
+ let b:lastclosed = {
494
+ \ 'at' : col('.'),
495
+ \ 'head' : a:Head,
496
+ \ 'mid' : a:Mid,
497
+ \ 'tail' : a:Tail }
498
+ endif
499
+
500
+
501
+ break
502
+ endif
503
+ " This might not be needed with the expr included in the
504
+ " search call.
505
+ "let syn = synIDattr(synID(line("."), col("."), 1), "name")
506
+ "if syn =~ b:commentRE || syn =~ b:stringRE || syn == ''
507
+ " break
508
+ "endif
509
+ let levels -= 1
510
+
511
+ " Track the last close to try to match pairs that start on
512
+ " line continuations
513
+ if b:lastclosed.at < col('.')
514
+ let b:lastclosed = {
515
+ \ 'at' : col('.'),
516
+ \ 'head' : a:Head,
517
+ \ 'mid' : a:Mid,
518
+ \ 'tail' : a:Tail }
519
+ endif
520
+ endwhile
521
+ endif
522
+ endif
523
+
524
+ " This is redundant, as per above
525
+ " If the current line starts with a close, count it. It won't effect the
526
+ " indentation of the next line because it is the first thing on the line
527
+ " and won't be counted as a "close on the last line".
528
+ if a:CurrLine =~ '^\s*' . a:Tail
529
+ \ || (a:Mid != '' && a:CurrLine =~ '^\s*' . a:Mid)
530
+ let levels -= 1
531
+ endif
532
+
533
+ " Restore original cursor location
534
+ call cursor(origline, origcol)
535
+
536
+ let adj = &sw*levels
537
+ if adj != 0 && b:indent_anything_echo
538
+ let g:lastindent = g:lastindent .
539
+ \ "GetPairIndent(" . a:Head . "/" . b:lastclosed.at . "):" . adj . " "
540
+ endif
541
+
542
+ return adj
543
+
544
+ endfunction
545
+
546
+
547
+ function! s:GetContIndent(Rule, CurrLine, LastLine, LastLNum, PrevLNum)
548
+
549
+ let adj = 0
550
+ let origcol = col(".")
551
+ let origline = line(".")
552
+ let lastcont = 0
553
+ let prevcont = 0
554
+
555
+ let l:lastlnum = a:LastLNum
556
+ let l:prevlnum = a:PrevLNum
557
+
558
+ let l:preblockstart = -1
559
+
560
+ " Get the last matching line number. If the match occurs w/in a comment
561
+ " or string, then it's a non-match.
562
+ "
563
+ "let lastmatchlnum = search(a:Rule.pattern, 'Wb', a:PrevLNum)
564
+ let lastmatchlnum = search(a:Rule.pattern, 'Wb', a:LastLNum)
565
+ let syn = synIDattr(synID(line("."), col("."), 1), "name")
566
+
567
+ "if syn =~ b:commentRE || syn =~ b:stringRE
568
+ if syn =~ b:commentRE || syn =~ b:stringRE || b:lastclosed.at > 0
569
+ let lastmatchlnum = 0
570
+ endif
571
+
572
+ " Should be able to just search to the line....
573
+ " " Figure out the last and previous continuation status
574
+ " if lastmatchlnum && lastmatchlnum == a:LastLNum
575
+ " let lastcont = 1
576
+ " endif
577
+ if lastmatchlnum == a:LastLNum
578
+ let lastcont = 1
579
+ endif
580
+
581
+ " start checking at the start of the block that ended on the prev line
582
+ if b:lastclosed.at > 0
583
+ call cursor(a:LastLNum, b:lastclosed.at)
584
+ " TODO: add 'skip' to skip comments
585
+ let l:preblockstart = searchpair(b:lastclosed.head, b:lastclosed.mid, b:lastclosed.tail, 'bW')
586
+ let g:lastindent .= ' postpair ("' . b:lastclosed.head . '"): '
587
+ \ . l:preblockstart . '/' . col('.') . ' '
588
+
589
+ if b:contTraversesLineComments
590
+ let l:prevlnum = GetPrevNonBlankNonComment(line('.') - 1)
591
+ else
592
+ let l:prevlnum = prevnonblank(line('.') - 1)
593
+ endif
594
+ endif
595
+
596
+
597
+ " Get the previous matching line number. If the match occurs w/in a
598
+ " comment or string, then it's a non-match. Use the adjusted, local
599
+ " prevlnum as the limit of the search, since we don't care about matches
600
+ " beyond that.
601
+ let prevmatchlnum = search(a:Rule.pattern, 'Wb', l:prevlnum)
602
+
603
+
604
+ let syn = synIDattr(synID(line("."), col("."), 1), "name")
605
+ " Handle:
606
+ " if ()
607
+ " if () {
608
+ " this_line; // should not be reduced
609
+ "if syn =~ b:commentRE || syn =~ b:stringRE
610
+ if syn =~ b:commentRE || syn =~ b:stringRE
611
+ let prevmatchlnum = 0
612
+ endif
613
+
614
+ " Should be able to just search to the line....
615
+ " if ( lastmatchlnum && lastmatchlnum == a:PrevLNum )
616
+ " \ || ( prevmatchlnum && prevmatchlnum == l:prevlnum )
617
+ " let prevcont = 1
618
+ " endif
619
+ "
620
+ " If there is a previous line, it is a continued line, and we haven't
621
+ " already done a positive adjustment for a pair/block, then reduce.
622
+ " Don't undo a positive adjustment for a pair because the previous line
623
+ " was a continued line. That will happen after the end of the block.
624
+ "if prevmatchlnum == l:prevlnum && b:pairadj <= 0
625
+ if l:prevlnum && prevmatchlnum == l:prevlnum && b:pairadj <= 0
626
+ let prevcont = 1
627
+ endif
628
+
629
+ "echom "lastcont: " . lastcont .
630
+ " \ ", prevcont: " . prevcont .
631
+ " \ ", lastmatchlnum: " . lastmatchlnum .
632
+ " \ ", prevmatchlnum: " . prevmatchlnum .
633
+ " \ ", lastlnum: " . a:LastLNum .
634
+ " \ ", PrevLNum: " . a:PrevLNum
635
+ let firstcont = (lastcont && !prevcont)
636
+ let firstcont = ((lastcont && !prevcont) || (lastcont && b:pairadj))
637
+
638
+ " If we are adjusting the current line for a pair, then don't count this
639
+ " line as a post-continuation line. The post continuation line will be
640
+ " after the close of said pair.
641
+ let postcont = (!lastcont && prevcont)
642
+ "let postcont = (!lastcont && prevcont && !b:pairadj )
643
+
644
+ let g:lastindent .= 'lastcont (' . lastcont . '), prevcont (' . prevcont . ') '
645
+
646
+
647
+ "if firstcont && a:CurrLine !~ '^\s*{'
648
+ if firstcont
649
+ if has_key(a:Rule, 'ignore') && a:CurrLine =~ a:Rule.ignore
650
+ let g:lastindent .= "(ignoring '" . a:Rule.ignore . "') "
651
+ else
652
+ let adj = adj + &sw
653
+ endif
654
+ "elseif postcont && a:LastLine !~ '^\s*{' "&& !b:pairadj
655
+ elseif postcont
656
+ if has_key(a:Rule, 'ignore') && a:LastLine =~ a:Rule.ignore
657
+ let g:lastindent .= "(ignoring '" . a:Rule.ignore . "') "
658
+ else
659
+ let adj = adj - &sw
660
+ endif
661
+ endif
662
+
663
+ call cursor(origline, origcol)
664
+
665
+ if adj != 0 && b:indent_anything_echo
666
+ let g:lastindent = g:lastindent .
667
+ \ "GetContIndent('" . a:Rule.pattern . "'):" . adj . " "
668
+ endif
669
+ return adj
670
+
671
+ endfunction
672
+
673
+
674
+
675
+