utils 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: