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,35 @@
1
+
2
+ " Source the standard indentation file, since we only want to adjust the
3
+ " default indentation.
4
+ sou $VIMRUNTIME/indent/html.vim
5
+
6
+ " Set the default indentation to be that of the standard indent file.
7
+ let b:defaultIndentExpr = &indentexpr
8
+
9
+ " Use IndentAnything
10
+ setlocal indentexpr=IndentAnything()
11
+
12
+ " Echo info about indentations
13
+ let b:indent_anything_echo = 1
14
+
15
+ "
16
+ " Adjust the default indentation for comments. Set the comments for html to
17
+ " look like this:
18
+ "
19
+ " <!--
20
+ " - comment here
21
+ " -->
22
+ "
23
+ setl comments=sr:<!--,m:-,e:-->
24
+ let b:blockCommentStartRE = '<!--'
25
+ let b:blockCommentMiddleRE = '-'
26
+ let b:blockCommentEndRE = '-->'
27
+ let b:blockCommentMiddleExtra = 3
28
+
29
+ " Specify the syntax names for html comments and strings
30
+ let b:blockCommentRE = 'htmlComment'
31
+ let b:commentRE = b:blockCommentRE
32
+
33
+ let b:stringRE = 'htmlString'
34
+ let b:singleQuoteStringRE = b:stringRE
35
+ let b:doubleQuoteStringRE = b:stringRE
@@ -0,0 +1,77 @@
1
+ " Vim indent file
2
+ " Language: eRuby
3
+ " Maintainer: Tim Pope <vimNOSPAM@tpope.info>
4
+ " URL: http://vim-ruby.rubyforge.org
5
+ " Anon CVS: See above site
6
+ " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
7
+
8
+ if exists("b:did_indent")
9
+ finish
10
+ endif
11
+
12
+ runtime! indent/ruby.vim
13
+ unlet! b:did_indent
14
+ setlocal indentexpr=
15
+
16
+ if exists("b:eruby_subtype")
17
+ exe "runtime! indent/".b:eruby_subtype.".vim"
18
+ else
19
+ runtime! indent/html.vim
20
+ endif
21
+ unlet! b:did_indent
22
+
23
+ if &l:indentexpr == ''
24
+ if &l:cindent
25
+ let &l:indentexpr = 'cindent(v:lnum)'
26
+ else
27
+ let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))'
28
+ endif
29
+ endif
30
+ let b:eruby_subtype_indentexpr = &l:indentexpr
31
+
32
+ let b:did_indent = 1
33
+
34
+ setlocal indentexpr=GetErubyIndent()
35
+ setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=else,=elsif,=rescue,=ensure,=when
36
+
37
+ " Only define the function once.
38
+ if exists("*GetErubyIndent")
39
+ finish
40
+ endif
41
+
42
+ function! GetErubyIndent(...)
43
+ if a:0 && a:1 == '.'
44
+ let v:lnum = line('.')
45
+ elseif a:0 && a:1 =~ '^\d'
46
+ let v:lnum = a:1
47
+ endif
48
+ let vcol = col('.')
49
+ call cursor(v:lnum,1)
50
+ let inruby = searchpair('<%','','%>','W')
51
+ call cursor(v:lnum,vcol)
52
+ if inruby && getline(v:lnum) !~ '^<%\|^\s*-\=%>'
53
+ let ind = GetRubyIndent()
54
+ else
55
+ exe "let ind = ".b:eruby_subtype_indentexpr
56
+ endif
57
+ let lnum = prevnonblank(v:lnum-1)
58
+ let line = getline(lnum)
59
+ let cline = getline(v:lnum)
60
+ if cline =~# '<%-\=\s*\%(}\|end\|else\|\%(ensure\|rescue\|elsif\|when\).\{-\}\)\s*\%(-\=%>\|$\)'
61
+ let ind = ind - &sw
62
+ endif
63
+ if line =~# '\%({\|\<do\)\%(\s*|[^|]*|\)\=\s*-\=%>'
64
+ let ind = ind + &sw
65
+ elseif line =~# '<%-\=\s*\%(module\|class\|def\|if\|for\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue\)\>.*%>'
66
+ let ind = ind + &sw
67
+ endif
68
+ if line =~# '^\s*<%[=#-]\=\s*$' && cline !~# '^\s*end\>'
69
+ let ind = ind + &sw
70
+ endif
71
+ if cline =~# '^\s*-\=%>\s*$'
72
+ let ind = ind - &sw
73
+ endif
74
+ return ind
75
+ endfunction
76
+
77
+ " vim:set sw=2 sts=2 ts=8 noet:
@@ -0,0 +1,116 @@
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
+ " Script:
18
+ "
19
+ " Javascript Indentation
20
+ "
21
+ " Version: 1.1.2
22
+ "
23
+ " Description:
24
+ "
25
+ " Indentation for Javascript. This script uses the IndentAnything plugin.
26
+ "
27
+ "
28
+ " Installation:
29
+ "
30
+ " Place this file in your home directory under ~/.vim/indent/, or replace
31
+ " the system indent/javascript.vim file to affect all users.
32
+ "
33
+ " Maintainer: Tye Z. <zdro@yahoo.com>
34
+ "
35
+ "
36
+ " History:
37
+ "
38
+ " 1.1.1 - Added license
39
+ " 1.1.2 - Added indentation for [...] pairs
40
+ " 1.1.3 - Fixed silly syntax error
41
+ "
42
+ "
43
+
44
+ let IndentAnything_Dbg = 0
45
+ let IndentAnything_Dbg = 1
46
+
47
+ " Only load this indent file when no other was loaded.
48
+ if exists("b:did_indent") && ! IndentAnything_Dbg
49
+ finish
50
+ endif
51
+
52
+ let b:did_indent = 1
53
+
54
+ setlocal indentexpr=IndentAnything()
55
+ setlocal indentkeys+=0),0},),;
56
+
57
+ " Only define the function once.
58
+ if exists("*IndentAnything") && ! IndentAnything_Dbg
59
+ finish
60
+ endif
61
+
62
+ setlocal indentexpr=IndentAnything()
63
+
64
+ """ BEGIN IndentAnything specification
65
+
66
+ "
67
+ " Syntax name REs for comments and strings.
68
+ "
69
+ let b:commentRE = 'javaScript\(Line\)\?Comment'
70
+ let b:lineCommentRE = 'javaScriptLineComment'
71
+ let b:blockCommentRE = 'javaScriptComment'
72
+ let b:stringRE = 'javaScriptString\(S\|D\)'
73
+ let b:singleQuoteStringRE = 'javaScriptStringS'
74
+ let b:doubleQuoteStringRE = 'javaScriptStringD'
75
+
76
+
77
+ "
78
+ " Setup for C-style comment indentation.
79
+ "
80
+ let b:blockCommentStartRE = '/\*'
81
+ let b:blockCommentMiddleRE = '\*'
82
+ let b:blockCommentEndRE = '\*/'
83
+ let b:blockCommentMiddleExtra = 1
84
+
85
+ "
86
+ " Indent another level for each non-closed paren/'(' , bracket/'[', and
87
+ " brace/'{' on the previous line.
88
+
89
+ let b:indentTrios = [
90
+ \ [ '(', '', ')' ],
91
+ \ [ '{', '\(default:\|case.*:\)', '}' ],
92
+ \ [ '\[', '', '\]' ]
93
+ \]
94
+
95
+
96
+ "
97
+ " Line continuations. Lines that are continued on the next line are
98
+ " if/for/while statements that are NOT followed by a '{' block and operators
99
+ " at the end of a line.
100
+ "
101
+ let b:lineContList = [
102
+ \ { 'pattern' : '^\s*\(if\|for\|while\)\s*(.*)\s*\(\(//.*\)\|/\*.*\*/\s*\)\?\_$\(\_s*{\)\@!' },
103
+ \ { 'pattern' : '^\s*else' . '\s*\(\(//.*\)\|/\*.*\*/\s*\)\?\_$\(\_s*{\)\@!' },
104
+ \ { 'pattern' : '\(+\|=\|+=\|-=\)\s*\(\(//.*\)\|/\*.*\*/\s*\)\?$' }
105
+ \]
106
+
107
+ "
108
+ " If a continued line and its continuation can have line-comments between
109
+ " them, then this should be true. For example,
110
+ "
111
+ " if (x)
112
+ " // comment here
113
+ " statement
114
+ "
115
+ let b:contTraversesLineComments = 1
116
+
@@ -0,0 +1,377 @@
1
+ " Vim indent file
2
+ " Language: Ruby
3
+ " Maintainer: Nikolai Weibull <now at bitwi.se>
4
+ " URL: http://vim-ruby.rubyforge.org
5
+ " Anon CVS: See above site
6
+ " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
7
+
8
+ " 0. Initialization {{{1
9
+ " =================
10
+
11
+ " Only load this indent file when no other was loaded.
12
+ if exists("b:did_indent")
13
+ finish
14
+ endif
15
+ let b:did_indent = 1
16
+
17
+ setlocal nosmartindent
18
+
19
+ " Now, set up our indentation expression and keys that trigger it.
20
+ setlocal indentexpr=GetRubyIndent()
21
+ setlocal indentkeys=0{,0},0),0],!^F,o,O,e
22
+ setlocal indentkeys+==end,=elsif,=when,=ensure,=rescue,==begin,==end
23
+
24
+ " Only define the function once.
25
+ if exists("*GetRubyIndent")
26
+ finish
27
+ endif
28
+
29
+ let s:cpo_save = &cpo
30
+ set cpo&vim
31
+
32
+ " 1. Variables {{{1
33
+ " ============
34
+
35
+ " Regex of syntax group names that are or delimit string or are comments.
36
+ let s:syng_strcom = '\<ruby\%(String\|StringEscape\|ASCIICode' .
37
+ \ '\|Interpolation\|NoInterpolation\|Comment\|Documentation\)\>'
38
+
39
+ " Regex of syntax group names that are strings.
40
+ let s:syng_string =
41
+ \ '\<ruby\%(String\|Interpolation\|NoInterpolation\|StringEscape\)\>'
42
+
43
+ " Regex of syntax group names that are strings or documentation.
44
+ let s:syng_stringdoc =
45
+ \'\<ruby\%(String\|Interpolation\|NoInterpolation\|StringEscape\|Documentation\)\>'
46
+
47
+ " Expression used to check whether we should skip a match with searchpair().
48
+ let s:skip_expr =
49
+ \ "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'"
50
+
51
+ " Regex used for words that, at the start of a line, add a level of indent.
52
+ let s:ruby_indent_keywords = '^\s*\zs\<\%(module\|class\|def\|if\|for' .
53
+ \ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure' .
54
+ \ '\|rescue\)\>' .
55
+ \ '\|\%([*+/,=-]\|<<\|>>\|:\s\)\s*\zs' .
56
+ \ '\<\%(if\|for\|while\|until\|case\|unless\|begin\)\>'
57
+
58
+ " Regex used for words that, at the start of a line, remove a level of indent.
59
+ let s:ruby_deindent_keywords =
60
+ \ '^\s*\zs\<\%(ensure\|else\|rescue\|elsif\|when\|end\)\>'
61
+
62
+ " Regex that defines the start-match for the 'end' keyword.
63
+ "let s:end_start_regex = '\%(^\|[^.]\)\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\|begin\|do\)\>'
64
+ " TODO: the do here should be restricted somewhat (only at end of line)?
65
+ let s:end_start_regex = '^\s*\zs\<\%(module\|class\|def\|if\|for' .
66
+ \ '\|while\|until\|case\|unless\|begin\)\>' .
67
+ \ '\|\%([*+/,=-]\|<<\|>>\|:\s\)\s*\zs' .
68
+ \ '\<\%(if\|for\|while\|until\|case\|unless\|begin\)\>' .
69
+ \ '\|\<do\>'
70
+
71
+ " Regex that defines the middle-match for the 'end' keyword.
72
+ let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue\>\|when\|elsif\)\>'
73
+
74
+ " Regex that defines the end-match for the 'end' keyword.
75
+ let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end\>'
76
+
77
+ " Expression used for searchpair() call for finding match for 'end' keyword.
78
+ let s:end_skip_expr = s:skip_expr .
79
+ \ ' || (expand("<cword>") == "do"' .
80
+ \ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\)\\>")'
81
+
82
+ " Regex that defines continuation lines, not including (, {, or [.
83
+ let s:continuation_regex = '\%([\\*+/.,:]\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
84
+
85
+ " Regex that defines continuation lines.
86
+ " TODO: this needs to deal with if ...: and so on
87
+ let s:continuation_regex2 =
88
+ \ '\%([\\*+/.,:({[]\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
89
+
90
+ " Regex that defines blocks.
91
+ let s:block_regex =
92
+ \ '\%(\<do\>\|{\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=\s*\%(#.*\)\=$'
93
+
94
+ " 2. Auxiliary Functions {{{1
95
+ " ======================
96
+
97
+ " Check if the character at lnum:col is inside a string, comment, or is ascii.
98
+ function s:IsInStringOrComment(lnum, col)
99
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
100
+ endfunction
101
+
102
+ " Check if the character at lnum:col is inside a string.
103
+ function s:IsInString(lnum, col)
104
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string
105
+ endfunction
106
+
107
+ " Check if the character at lnum:col is inside a string or documentation.
108
+ function s:IsInStringOrDocumentation(lnum, col)
109
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_stringdoc
110
+ endfunction
111
+
112
+ " Find line above 'lnum' that isn't empty, in a comment, or in a string.
113
+ function s:PrevNonBlankNonString(lnum)
114
+ let in_block = 0
115
+ let lnum = prevnonblank(a:lnum)
116
+ while lnum > 0
117
+ " Go in and out of blocks comments as necessary.
118
+ " If the line isn't empty (with opt. comment) or in a string, end search.
119
+ let line = getline(lnum)
120
+ if line =~ '^=begin$'
121
+ if in_block
122
+ let in_block = 0
123
+ else
124
+ break
125
+ endif
126
+ elseif !in_block && line =~ '^=end$'
127
+ let in_block = 1
128
+ elseif !in_block && line !~ '^\s*#.*$' && !(s:IsInStringOrComment(lnum, 1)
129
+ \ && s:IsInStringOrComment(lnum, strlen(line)))
130
+ break
131
+ endif
132
+ let lnum = prevnonblank(lnum - 1)
133
+ endwhile
134
+ return lnum
135
+ endfunction
136
+
137
+ " Find line above 'lnum' that started the continuation 'lnum' may be part of.
138
+ function s:GetMSL(lnum)
139
+ " Start on the line we're at and use its indent.
140
+ let msl = a:lnum
141
+ let lnum = s:PrevNonBlankNonString(a:lnum - 1)
142
+ while lnum > 0
143
+ " If we have a continuation line, or we're in a string, use line as MSL.
144
+ " Otherwise, terminate search as we have found our MSL already.
145
+ let line = getline(lnum)
146
+ let col = match(line, s:continuation_regex2) + 1
147
+ if (col > 0 && !s:IsInStringOrComment(lnum, col))
148
+ \ || s:IsInString(lnum, strlen(line))
149
+ let msl = lnum
150
+ else
151
+ break
152
+ endif
153
+ let lnum = s:PrevNonBlankNonString(lnum - 1)
154
+ endwhile
155
+ return msl
156
+ endfunction
157
+
158
+ " Check if line 'lnum' has more opening brackets than closing ones.
159
+ function s:LineHasOpeningBrackets(lnum)
160
+ let open_0 = 0
161
+ let open_2 = 0
162
+ let open_4 = 0
163
+ let line = getline(a:lnum)
164
+ let pos = match(line, '[][(){}]', 0)
165
+ while pos != -1
166
+ if !s:IsInStringOrComment(a:lnum, pos + 1)
167
+ let idx = stridx('(){}[]', line[pos])
168
+ if idx % 2 == 0
169
+ let open_{idx} = open_{idx} + 1
170
+ else
171
+ let open_{idx - 1} = open_{idx - 1} - 1
172
+ endif
173
+ endif
174
+ let pos = match(line, '[][(){}]', pos + 1)
175
+ endwhile
176
+ return (open_0 > 0) . (open_2 > 0) . (open_4 > 0)
177
+ endfunction
178
+
179
+ function s:Match(lnum, regex)
180
+ let col = match(getline(a:lnum), a:regex) + 1
181
+ return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0
182
+ endfunction
183
+
184
+ function s:MatchLast(lnum, regex)
185
+ let line = getline(a:lnum)
186
+ let col = match(line, '.*\zs' . a:regex)
187
+ while col != -1 && s:IsInStringOrComment(a:lnum, col)
188
+ let line = strpart(line, 0, col)
189
+ let col = match(line, '.*' . a:regex)
190
+ endwhile
191
+ return col + 1
192
+ endfunction
193
+
194
+ " 3. GetRubyIndent Function {{{1
195
+ " =========================
196
+
197
+ function GetRubyIndent()
198
+ " 3.1. Setup {{{2
199
+ " ----------
200
+
201
+ " Set up variables for restoring position in file. Could use v:lnum here.
202
+ let vcol = col('.')
203
+
204
+ " 3.2. Work on the current line {{{2
205
+ " -----------------------------
206
+
207
+ " Get the current line.
208
+ let line = getline(v:lnum)
209
+ let ind = -1
210
+
211
+ " If we got a closing bracket on an empty line, find its match and indent
212
+ " according to it. For parentheses we indent to its column - 1, for the
213
+ " others we indent to the containing line's MSL's level. Return -1 if fail.
214
+ let col = matchend(line, '^\s*[]})]')
215
+ if col > 0 && !s:IsInStringOrComment(v:lnum, col)
216
+ call cursor(v:lnum, col)
217
+ let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2)
218
+ if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0
219
+ if line[col-1]==')' && col('.') != col('$') - 1
220
+ let ind = virtcol('.')-1
221
+ else
222
+ let ind = indent(s:GetMSL(line('.')))
223
+ endif
224
+ endif
225
+ return ind
226
+ endif
227
+
228
+ " If we have a =begin or =end set indent to first column.
229
+ if match(line, '^\s*\%(=begin\|=end\)$') != -1
230
+ return 0
231
+ endif
232
+
233
+ " If we have a deindenting keyword, find its match and indent to its level.
234
+ " TODO: this is messy
235
+ if s:Match(v:lnum, s:ruby_deindent_keywords)
236
+ call cursor(v:lnum, 1)
237
+ if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
238
+ \ s:end_skip_expr) > 0
239
+ let line = getline('.')
240
+ if strpart(line, 0, col('.') - 1) =~ '=\s*$' &&
241
+ \ strpart(line, col('.') - 1, 2) !~ 'do'
242
+ let ind = virtcol('.') - 1
243
+ else
244
+ let ind = indent('.')
245
+ endif
246
+ endif
247
+ return ind
248
+ endif
249
+
250
+ " If we are in a multi-line string or line-comment, don't do anything to it.
251
+ if s:IsInStringOrDocumentation(v:lnum, matchend(line, '^\s*') + 1)
252
+ return indent('.')
253
+ endif
254
+
255
+ " 3.3. Work on the previous line. {{{2
256
+ " -------------------------------
257
+
258
+ " Find a non-blank, non-multi-line string line above the current line.
259
+ let lnum = s:PrevNonBlankNonString(v:lnum - 1)
260
+
261
+ " If the line is empty and inside a string, use the previous line.
262
+ if line =~ '^\s*$' && lnum != prevnonblank(v:lnum - 1)
263
+ return indent(prevnonblank(v:lnum))
264
+ endif
265
+
266
+ " At the start of the file use zero indent.
267
+ if lnum == 0
268
+ return 0
269
+ endif
270
+
271
+ " Set up variables for current line.
272
+ let line = getline(lnum)
273
+ let ind = indent(lnum)
274
+
275
+ " If the previous line ended with a block opening, add a level of indent.
276
+ if s:Match(lnum, s:block_regex)
277
+ return indent(s:GetMSL(lnum)) + &sw
278
+ endif
279
+
280
+ " If the previous line contained an opening bracket, and we are still in it,
281
+ " add indent depending on the bracket type.
282
+ if line =~ '[[({]'
283
+ let counts = s:LineHasOpeningBrackets(lnum)
284
+ if counts[0] == '1' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
285
+ if col('.') + 1 == col('$')
286
+ return ind + &sw
287
+ else
288
+ return virtcol('.')
289
+ endif
290
+ elseif counts[1] == '1' || counts[2] == '1'
291
+ return ind + &sw
292
+ else
293
+ call cursor(v:lnum, vcol)
294
+ end
295
+ endif
296
+
297
+ " If the previous line ended with an "end", match that "end"s beginning's
298
+ " indent.
299
+ let col = s:Match(lnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$')
300
+ if col > 0
301
+ call cursor(lnum, col)
302
+ if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW',
303
+ \ s:end_skip_expr) > 0
304
+ let n = line('.')
305
+ let ind = indent('.')
306
+ let msl = s:GetMSL(n)
307
+ if msl != n
308
+ let ind = indent(msl)
309
+ end
310
+ return ind
311
+ endif
312
+ end
313
+
314
+ let col = s:Match(lnum, s:ruby_indent_keywords)
315
+ if col > 0
316
+ call cursor(lnum, col)
317
+ let ind = virtcol('.') - 1 + &sw
318
+ " let ind = indent(lnum) + &sw
319
+ " TODO: make this better (we need to count them) (or, if a searchpair
320
+ " fails, we know that something is lacking an end and thus we indent a
321
+ " level
322
+ if s:Match(lnum, s:end_end_regex)
323
+ let ind = indent('.')
324
+ endif
325
+ return ind
326
+ endif
327
+
328
+ " 3.4. Work on the MSL line. {{{2
329
+ " --------------------------
330
+
331
+ " Set up variables to use and search for MSL to the previous line.
332
+ let p_lnum = lnum
333
+ let lnum = s:GetMSL(lnum)
334
+
335
+ " If the previous line wasn't a MSL and is continuation return its indent.
336
+ " TODO: the || s:IsInString() thing worries me a bit.
337
+ if p_lnum != lnum
338
+ if s:Match(p_lnum,s:continuation_regex)||s:IsInString(p_lnum,strlen(line))
339
+ return ind
340
+ endif
341
+ endif
342
+
343
+ " Set up more variables, now that we know we wasn't continuation bound.
344
+ let line = getline(lnum)
345
+ let msl_ind = indent(lnum)
346
+
347
+ " If the MSL line had an indenting keyword in it, add a level of indent.
348
+ " TODO: this does not take into account contrived things such as
349
+ " module Foo; class Bar; end
350
+ if s:Match(lnum, s:ruby_indent_keywords)
351
+ let ind = msl_ind + &sw
352
+ if s:Match(lnum, s:end_end_regex)
353
+ let ind = ind - &sw
354
+ endif
355
+ return ind
356
+ endif
357
+
358
+ " If the previous line ended with [*+/.-=], indent one extra level.
359
+ if s:Match(lnum, s:continuation_regex)
360
+ if lnum == p_lnum
361
+ let ind = msl_ind + &sw
362
+ else
363
+ let ind = msl_ind
364
+ endif
365
+ endif
366
+
367
+ " }}}2
368
+
369
+ return ind
370
+ endfunction
371
+
372
+ " }}}1
373
+
374
+ let &cpo = s:cpo_save
375
+ unlet s:cpo_save
376
+
377
+ " vim:set sw=2 sts=2 ts=8 noet: