xref: /vim-8.2.3635/src/testdir/test_indent.vim (revision 818ff25c)
1bd7206e0SBram Moolenaar" Test for various indent options
2bd7206e0SBram Moolenaar
3bd7206e0SBram Moolenaarfunc Test_preserveindent()
4bd7206e0SBram Moolenaar  new
5bd7206e0SBram Moolenaar  " Test for autoindent copying indent from the previous line
6bd7206e0SBram Moolenaar  setlocal autoindent
7bd7206e0SBram Moolenaar  call setline(1, [repeat(' ', 16) .. 'line1'])
8bd7206e0SBram Moolenaar  call feedkeys("A\nline2", 'xt')
9bd7206e0SBram Moolenaar  call assert_equal("\t\tline2", getline(2))
10bd7206e0SBram Moolenaar  setlocal autoindent&
11bd7206e0SBram Moolenaar
12bd7206e0SBram Moolenaar  " Test for using CTRL-T with and without 'preserveindent'
13bd7206e0SBram Moolenaar  set shiftwidth=4
14bd7206e0SBram Moolenaar  call cursor(1, 1)
15bd7206e0SBram Moolenaar  call setline(1, "    \t    ")
16bd7206e0SBram Moolenaar  call feedkeys("Al\<C-T>", 'xt')
17bd7206e0SBram Moolenaar  call assert_equal("\t\tl", getline(1))
18bd7206e0SBram Moolenaar  set preserveindent
19bd7206e0SBram Moolenaar  call setline(1, "    \t    ")
20bd7206e0SBram Moolenaar  call feedkeys("Al\<C-T>", 'xt')
21bd7206e0SBram Moolenaar  call assert_equal("    \t    \tl", getline(1))
22bd7206e0SBram Moolenaar  set pi& sw&
23bd7206e0SBram Moolenaar
24bd7206e0SBram Moolenaar  " Test for using CTRL-T with 'expandtab' and 'preserveindent'
25bd7206e0SBram Moolenaar  call cursor(1, 1)
26bd7206e0SBram Moolenaar  call setline(1, "\t    \t")
27bd7206e0SBram Moolenaar  set shiftwidth=4 expandtab preserveindent
28bd7206e0SBram Moolenaar  call feedkeys("Al\<C-T>", 'xt')
29bd7206e0SBram Moolenaar  call assert_equal("\t    \t    l", getline(1))
30bd7206e0SBram Moolenaar  set sw& et& pi&
31bd7206e0SBram Moolenaar
32bd7206e0SBram Moolenaar  close!
33bd7206e0SBram Moolenaarendfunc
34bd7206e0SBram Moolenaar
35bd7206e0SBram Moolenaar" Test for indent()
36bd7206e0SBram Moolenaarfunc Test_indent_func()
37bd7206e0SBram Moolenaar  call assert_equal(-1, indent(-1))
38bd7206e0SBram Moolenaar  new
39bd7206e0SBram Moolenaar  call setline(1, "\tabc")
40bd7206e0SBram Moolenaar  call assert_equal(8, indent(1))
41bd7206e0SBram Moolenaar  call setline(1, "    abc")
42bd7206e0SBram Moolenaar  call assert_equal(4, indent(1))
43bd7206e0SBram Moolenaar  call setline(1, "    \t    abc")
44bd7206e0SBram Moolenaar  call assert_equal(12, indent(1))
45bd7206e0SBram Moolenaar  close!
46bd7206e0SBram Moolenaarendfunc
47bd7206e0SBram Moolenaar
48bd7206e0SBram Moolenaar" Test for reindenting a line using the '=' operator
49bd7206e0SBram Moolenaarfunc Test_reindent()
50bd7206e0SBram Moolenaar  new
51bd7206e0SBram Moolenaar  call setline(1, 'abc')
52bd7206e0SBram Moolenaar  set nomodifiable
53bd7206e0SBram Moolenaar  call assert_fails('normal ==', 'E21:')
54bd7206e0SBram Moolenaar  set modifiable
55bd7206e0SBram Moolenaar
56bd7206e0SBram Moolenaar  call setline(1, ['foo', 'bar'])
57bd7206e0SBram Moolenaar  call feedkeys('ggVG=', 'xt')
58bd7206e0SBram Moolenaar  call assert_equal(['foo', 'bar'], getline(1, 2))
59bd7206e0SBram Moolenaar  close!
60bd7206e0SBram Moolenaarendfunc
61bd7206e0SBram Moolenaar
62bd7206e0SBram Moolenaar" Test for shifting a line with a preprocessor directive ('#')
63bd7206e0SBram Moolenaarfunc Test_preproc_indent()
64bd7206e0SBram Moolenaar  new
65bd7206e0SBram Moolenaar  set sw=4
66bd7206e0SBram Moolenaar  call setline(1, '#define FOO 1')
67bd7206e0SBram Moolenaar  normal >>
68bd7206e0SBram Moolenaar  call assert_equal('    #define FOO 1', getline(1))
69bd7206e0SBram Moolenaar
70bd7206e0SBram Moolenaar  " with 'smartindent'
71bd7206e0SBram Moolenaar  call setline(1, '#define FOO 1')
72bd7206e0SBram Moolenaar  set smartindent
73bd7206e0SBram Moolenaar  normal >>
74bd7206e0SBram Moolenaar  call assert_equal('#define FOO 1', getline(1))
75bd7206e0SBram Moolenaar  set smartindent&
76bd7206e0SBram Moolenaar
77bd7206e0SBram Moolenaar  " with 'cindent'
78bd7206e0SBram Moolenaar  set cindent
79bd7206e0SBram Moolenaar  normal >>
80bd7206e0SBram Moolenaar  call assert_equal('#define FOO 1', getline(1))
81bd7206e0SBram Moolenaar  set cindent&
82bd7206e0SBram Moolenaar
83bd7206e0SBram Moolenaar  close!
84bd7206e0SBram Moolenaarendfunc
85bd7206e0SBram Moolenaar
86bd7206e0SBram Moolenaar" Test for 'copyindent'
87bd7206e0SBram Moolenaarfunc Test_copyindent()
88bd7206e0SBram Moolenaar  new
89bd7206e0SBram Moolenaar  set shiftwidth=4 autoindent expandtab copyindent
90bd7206e0SBram Moolenaar  call setline(1, "    \t    abc")
91bd7206e0SBram Moolenaar  call feedkeys("ol", 'xt')
92bd7206e0SBram Moolenaar  call assert_equal("    \t    l", getline(2))
93bd7206e0SBram Moolenaar  set noexpandtab
94bd7206e0SBram Moolenaar  call setline(1, "    \t    abc")
95bd7206e0SBram Moolenaar  call feedkeys("ol", 'xt')
96bd7206e0SBram Moolenaar  call assert_equal("    \t    l", getline(2))
97bd7206e0SBram Moolenaar  set sw& ai& et& ci&
98bd7206e0SBram Moolenaar  close!
99bd7206e0SBram Moolenaarendfunc
100bd7206e0SBram Moolenaar
101f5f1e10dSBram Moolenaar" Test for changing multiple lines with lisp indent
102f5f1e10dSBram Moolenaarfunc Test_lisp_indent_change_multiline()
103f5f1e10dSBram Moolenaar  new
104f5f1e10dSBram Moolenaar  setlocal lisp autoindent
105f5f1e10dSBram Moolenaar  call setline(1, ['(if a', '  (if b', '    (return 5)))'])
106f5f1e10dSBram Moolenaar  normal! jc2j(return 4))
107f5f1e10dSBram Moolenaar  call assert_equal('  (return 4))', getline(2))
108f5f1e10dSBram Moolenaar  close!
109f5f1e10dSBram Moolenaarendfunc
110f5f1e10dSBram Moolenaar
111f5f1e10dSBram Moolenaarfunc Test_lisp_indent()
112f5f1e10dSBram Moolenaar  new
113f5f1e10dSBram Moolenaar  setlocal lisp autoindent
114f5f1e10dSBram Moolenaar  call setline(1, ['(if a', '  ;; comment', '  \ abc', '', '  " str1\', '  " st\b', '  (return 5)'])
115f5f1e10dSBram Moolenaar  normal! jo;; comment
116f5f1e10dSBram Moolenaar  normal! jo\ abc
117f5f1e10dSBram Moolenaar  normal! jo;; ret
118f5f1e10dSBram Moolenaar  normal! jostr1"
119f5f1e10dSBram Moolenaar  normal! jostr2"
120f5f1e10dSBram Moolenaar  call assert_equal(['  ;; comment', '  ;; comment', '  \ abc', '  \ abc', '', '  ;; ret', '  " str1\', '  str1"', '  " st\b', '  str2"'], getline(2, 11))
121f5f1e10dSBram Moolenaar  close!
122f5f1e10dSBram Moolenaarendfunc
123f5f1e10dSBram Moolenaar
124f5f1e10dSBram Moolenaar" Test for setting the 'indentexpr' from a modeline
125f5f1e10dSBram Moolenaarfunc Test_modeline_indent_expr()
126f5f1e10dSBram Moolenaar  let modeline = &modeline
127f5f1e10dSBram Moolenaar  set modeline
128f5f1e10dSBram Moolenaar  func GetIndent()
129f5f1e10dSBram Moolenaar    return line('.') * 2
130f5f1e10dSBram Moolenaar  endfunc
131f5f1e10dSBram Moolenaar  call writefile(['# vim: indentexpr=GetIndent()'], 'Xfile.txt')
132f5f1e10dSBram Moolenaar  set modelineexpr
133f5f1e10dSBram Moolenaar  new Xfile.txt
134f5f1e10dSBram Moolenaar  call assert_equal('GetIndent()', &indentexpr)
135f5f1e10dSBram Moolenaar  exe "normal Oa\nb\n"
136f5f1e10dSBram Moolenaar  call assert_equal(['  a', '    b'], getline(1, 2))
13795e59a35SBram Moolenaar
138f5f1e10dSBram Moolenaar  set modelineexpr&
139f5f1e10dSBram Moolenaar  delfunc GetIndent
140f5f1e10dSBram Moolenaar  let &modeline = modeline
141f5f1e10dSBram Moolenaar  close!
14295e59a35SBram Moolenaar  call delete('Xfile.txt')
143f5f1e10dSBram Moolenaarendfunc
144f5f1e10dSBram Moolenaar
145*818ff25cSChristian Brabandtfunc Test_indent_func_with_gq()
146*818ff25cSChristian Brabandt
147*818ff25cSChristian Brabandt  function GetTeXIndent()
148*818ff25cSChristian Brabandt    " Sample indent expression for TeX files
149*818ff25cSChristian Brabandt    let lnum = prevnonblank(v:lnum - 1)
150*818ff25cSChristian Brabandt    " At the start of the file use zero indent.
151*818ff25cSChristian Brabandt    if lnum == 0
152*818ff25cSChristian Brabandt      return 0
153*818ff25cSChristian Brabandt    endif
154*818ff25cSChristian Brabandt    let line = getline(lnum)
155*818ff25cSChristian Brabandt    let ind = indent(lnum)
156*818ff25cSChristian Brabandt    " Add a 'shiftwidth' after beginning of environments.
157*818ff25cSChristian Brabandt    if line =~ '\\begin{center}'
158*818ff25cSChristian Brabandt      let ind = ind + shiftwidth()
159*818ff25cSChristian Brabandt    endif
160*818ff25cSChristian Brabandt    return ind
161*818ff25cSChristian Brabandt  endfunction
162*818ff25cSChristian Brabandt
163*818ff25cSChristian Brabandt  new
164*818ff25cSChristian Brabandt  setl et sw=2 sts=2 ts=2 tw=50 indentexpr=GetTeXIndent()
165*818ff25cSChristian Brabandt  put =[  '\documentclass{article}', '', '\begin{document}', '',
166*818ff25cSChristian Brabandt        \ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce ut enim non',
167*818ff25cSChristian Brabandt        \ 'libero efficitur aliquet. Maecenas metus justo, facilisis convallis blandit',
168*818ff25cSChristian Brabandt        \ 'non, semper eu urna. Suspendisse diam diam, iaculis faucibus lorem eu,',
169*818ff25cSChristian Brabandt        \ 'fringilla condimentum lectus. Quisque euismod diam at convallis vulputate.',
170*818ff25cSChristian Brabandt        \ 'Pellentesque laoreet tortor sit amet mauris euismod ornare. Sed varius',
171*818ff25cSChristian Brabandt        \ 'bibendum orci vel vehicula. Pellentesque tempor, ipsum et auctor accumsan,',
172*818ff25cSChristian Brabandt        \ 'metus lectus ultrices odio, sed elementum mi ante at arcu.', '', '\begin{center}', '',
173*818ff25cSChristian Brabandt        \ 'Proin nec risus consequat nunc dapibus consectetur. Mauris lacinia est a augue',
174*818ff25cSChristian Brabandt        \ 'tristique accumsan. Morbi pretium, felis molestie eleifend condimentum, arcu',
175*818ff25cSChristian Brabandt        \ 'ipsum congue nisl, quis euismod purus libero in ante. Donec id semper purus.',
176*818ff25cSChristian Brabandt        \ 'Suspendisse eget aliquam nunc. Maecenas fringilla mauris vitae maximus',
177*818ff25cSChristian Brabandt        \ 'condimentum. Cras a quam in mi dictum eleifend at a lorem. Sed convallis',
178*818ff25cSChristian Brabandt        \ 'ante a commodo facilisis. Nam suscipit vulputate odio, vel dapibus nisl',
179*818ff25cSChristian Brabandt        \ 'dignissim facilisis. Vestibulum ante ipsum primis in faucibus orci luctus et',
180*818ff25cSChristian Brabandt        \ 'ultrices posuere cubilia curae;', '', '']
181*818ff25cSChristian Brabandt  1d_
182*818ff25cSChristian Brabandt  call cursor(5, 1)
183*818ff25cSChristian Brabandt  ka
184*818ff25cSChristian Brabandt  call cursor(15, 1)
185*818ff25cSChristian Brabandt  kb
186*818ff25cSChristian Brabandt  norm! 'agqap
187*818ff25cSChristian Brabandt  norm! 'bgqap
188*818ff25cSChristian Brabandt  let expected = [ '\documentclass{article}', '', '\begin{document}', '',
189*818ff25cSChristian Brabandt        \ 'Lorem ipsum dolor sit amet, consectetur adipiscing',
190*818ff25cSChristian Brabandt        \ 'elit. Fusce ut enim non libero efficitur aliquet.',
191*818ff25cSChristian Brabandt        \ 'Maecenas metus justo, facilisis convallis blandit',
192*818ff25cSChristian Brabandt        \ 'non, semper eu urna. Suspendisse diam diam,',
193*818ff25cSChristian Brabandt        \ 'iaculis faucibus lorem eu, fringilla condimentum',
194*818ff25cSChristian Brabandt        \ 'lectus. Quisque euismod diam at convallis',
195*818ff25cSChristian Brabandt        \ 'vulputate.  Pellentesque laoreet tortor sit amet',
196*818ff25cSChristian Brabandt        \ 'mauris euismod ornare. Sed varius bibendum orci',
197*818ff25cSChristian Brabandt        \ 'vel vehicula. Pellentesque tempor, ipsum et auctor',
198*818ff25cSChristian Brabandt        \ 'accumsan, metus lectus ultrices odio, sed',
199*818ff25cSChristian Brabandt        \ 'elementum mi ante at arcu.', '', '\begin{center}', '',
200*818ff25cSChristian Brabandt        \ '  Proin nec risus consequat nunc dapibus',
201*818ff25cSChristian Brabandt        \ '  consectetur. Mauris lacinia est a augue',
202*818ff25cSChristian Brabandt        \ '  tristique accumsan. Morbi pretium, felis',
203*818ff25cSChristian Brabandt        \ '  molestie eleifend condimentum, arcu ipsum congue',
204*818ff25cSChristian Brabandt        \ '  nisl, quis euismod purus libero in ante. Donec',
205*818ff25cSChristian Brabandt        \ '  id semper purus.  Suspendisse eget aliquam nunc.',
206*818ff25cSChristian Brabandt        \ '  Maecenas fringilla mauris vitae maximus',
207*818ff25cSChristian Brabandt        \ '  condimentum. Cras a quam in mi dictum eleifend',
208*818ff25cSChristian Brabandt        \ '  at a lorem. Sed convallis ante a commodo',
209*818ff25cSChristian Brabandt        \ '  facilisis. Nam suscipit vulputate odio, vel',
210*818ff25cSChristian Brabandt        \ '  dapibus nisl dignissim facilisis. Vestibulum',
211*818ff25cSChristian Brabandt        \ '  ante ipsum primis in faucibus orci luctus et',
212*818ff25cSChristian Brabandt        \ '  ultrices posuere cubilia curae;', '', '']
213*818ff25cSChristian Brabandt  call assert_equal(expected, getline(1, '$'))
214*818ff25cSChristian Brabandt
215*818ff25cSChristian Brabandt  bwipe!
216*818ff25cSChristian Brabandt  delmark ab
217*818ff25cSChristian Brabandt  delfunction GetTeXIndent
218*818ff25cSChristian Brabandtendfu
219*818ff25cSChristian Brabandt
220bd7206e0SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
221