commit 0434f732a696248c24e111b558406f9534db6ca3
parent 1ba9d63d77fd8a3e7560188f608f89444c0ac3b8
Author: zeertzjq <zeertzjq@outlook.com>
Date: Sat, 15 Oct 2022 20:27:34 +0800
Merge pull request #20670 from zeertzjq/vim-9.0.0737
vim-patch:9.0.{partial:0737,0754}: lisp indent fixes
Diffstat:
5 files changed, 118 insertions(+), 105 deletions(-)
diff --git a/src/nvim/change.c b/src/nvim/change.c
@@ -1814,17 +1814,15 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment)
vreplace_mode = 0;
}
- // May do lisp indenting.
if (!p_paste
&& leader == NULL
&& curbuf->b_p_lisp
&& curbuf->b_p_ai) {
+ // do lisp indenting
fixthisline(get_lisp_indent);
ai_col = (colnr_T)getwhitecols_curline();
- }
-
- // May do indenting after opening a new line.
- if (do_cindent) {
+ } else if (do_cindent) {
+ // do 'cindent' or 'indentexpr' indenting
do_c_expr_indent();
ai_col = (colnr_T)getwhitecols_curline();
}
diff --git a/src/nvim/indent.c b/src/nvim/indent.c
@@ -1138,7 +1138,7 @@ static int lisp_match(char_u *p)
(void)copy_option_part(&word, (char *)buf, LSIZE, ",");
len = (int)STRLEN(buf);
- if ((STRNCMP(buf, p, len) == 0) && (p[len] == ' ')) {
+ if ((STRNCMP(buf, p, len) == 0) && ascii_iswhite_or_nul(p[len])) {
return true;
}
}
diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim
@@ -15,7 +15,6 @@ source test_fnamemodify.vim
source test_ga.vim
source test_glob2regpat.vim
source test_global.vim
-source test_lispwords.vim
source test_move.vim
source test_put.vim
source test_reltime.vim
diff --git a/src/nvim/testdir/test_lispindent.vim b/src/nvim/testdir/test_lispindent.vim
@@ -0,0 +1,114 @@
+" Tests for 'lispwords' settings being global-local.
+" And other lisp indent stuff.
+
+set nocompatible viminfo+=nviminfo
+
+func Test_global_local_lispwords()
+ setglobal lispwords=foo,bar,baz
+ setlocal lispwords-=foo | setlocal lispwords+=quux
+ call assert_equal('foo,bar,baz', &g:lispwords)
+ call assert_equal('bar,baz,quux', &l:lispwords)
+ call assert_equal('bar,baz,quux', &lispwords)
+
+ setlocal lispwords<
+ call assert_equal('foo,bar,baz', &g:lispwords)
+ call assert_equal('foo,bar,baz', &l:lispwords)
+ call assert_equal('foo,bar,baz', &lispwords)
+endfunc
+
+func Test_lisp_indent()
+ enew!
+
+ call append(0, [
+ \ '(defun html-file (base)',
+ \ '(format nil "~(~A~).html" base))',
+ \ '',
+ \ '(defmacro page (name title &rest body)',
+ \ '(let ((ti (gensym)))',
+ \ '`(with-open-file (*standard-output*',
+ \ '(html-file ,name)',
+ \ ':direction :output',
+ \ ':if-exists :supersede)',
+ \ '(let ((,ti ,title))',
+ \ '(as title ,ti)',
+ \ '(with center ',
+ \ '(as h2 (string-upcase ,ti)))',
+ \ '(brs 3)',
+ \ ',@body))))',
+ \ '',
+ \ ';;; Utilities for generating links',
+ \ '',
+ \ '(defmacro with-link (dest &rest body)',
+ \ '`(progn',
+ \ '(format t "<a href=\"~A\">" (html-file ,dest))',
+ \ ',@body',
+ \ '(princ "</a>")))'
+ \ ])
+ call assert_equal(7, lispindent(2))
+ call assert_equal(5, 6->lispindent())
+ call assert_equal(-1, lispindent(-1))
+
+ set lisp
+ set lispwords&
+ let save_copt = &cpoptions
+ set cpoptions+=p
+ normal 1G=G
+
+ call assert_equal([
+ \ '(defun html-file (base)',
+ \ ' (format nil "~(~A~).html" base))',
+ \ '',
+ \ '(defmacro page (name title &rest body)',
+ \ ' (let ((ti (gensym)))',
+ \ ' `(with-open-file (*standard-output*',
+ \ ' (html-file ,name)',
+ \ ' :direction :output',
+ \ ' :if-exists :supersede)',
+ \ ' (let ((,ti ,title))',
+ \ ' (as title ,ti)',
+ \ ' (with center ',
+ \ ' (as h2 (string-upcase ,ti)))',
+ \ ' (brs 3)',
+ \ ' ,@body))))',
+ \ '',
+ \ ';;; Utilities for generating links',
+ \ '',
+ \ '(defmacro with-link (dest &rest body)',
+ \ ' `(progn',
+ \ ' (format t "<a href=\"~A\">" (html-file ,dest))',
+ \ ' ,@body',
+ \ ' (princ "</a>")))',
+ \ ''
+ \ ], getline(1, "$"))
+
+ enew!
+ let &cpoptions=save_copt
+ set nolisp
+endfunc
+
+func Test_lispindent_negative()
+ " in legacy script there is no error
+ call assert_equal(-1, lispindent(-1))
+endfunc
+
+func Test_lispindent_with_indentexpr()
+ enew
+ setl ai lisp nocin indentexpr=11
+ exe "normal a(x\<CR>1\<CR>2)\<Esc>"
+ let expected = ['(x', ' 1', ' 2)']
+ call assert_equal(expected, getline(1, 3))
+ normal 1G=G
+ call assert_equal(expected, getline(1, 3))
+ bwipe!
+endfunc
+
+func Test_lisp_indent_works()
+ " This was reading beyond the end of the line
+ new
+ exe "norm a\tü(\<CR>="
+ set lisp
+ norm ==
+ bwipe!
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_lispwords.vim b/src/nvim/testdir/test_lispwords.vim
@@ -1,98 +0,0 @@
-" Tests for 'lispwords' settings being global-local.
-" And other lisp indent stuff.
-
-set nocompatible viminfo+=nviminfo
-
-func Test_global_local_lispwords()
- setglobal lispwords=foo,bar,baz
- setlocal lispwords-=foo | setlocal lispwords+=quux
- call assert_equal('foo,bar,baz', &g:lispwords)
- call assert_equal('bar,baz,quux', &l:lispwords)
- call assert_equal('bar,baz,quux', &lispwords)
-
- setlocal lispwords<
- call assert_equal('foo,bar,baz', &g:lispwords)
- call assert_equal('foo,bar,baz', &l:lispwords)
- call assert_equal('foo,bar,baz', &lispwords)
-endfunc
-
-func Test_lisp_indent()
- enew!
-
- call append(0, [
- \ '(defun html-file (base)',
- \ '(format nil "~(~A~).html" base))',
- \ '',
- \ '(defmacro page (name title &rest body)',
- \ '(let ((ti (gensym)))',
- \ '`(with-open-file (*standard-output*',
- \ '(html-file ,name)',
- \ ':direction :output',
- \ ':if-exists :supersede)',
- \ '(let ((,ti ,title))',
- \ '(as title ,ti)',
- \ '(with center ',
- \ '(as h2 (string-upcase ,ti)))',
- \ '(brs 3)',
- \ ',@body))))',
- \ '',
- \ ';;; Utilities for generating links',
- \ '',
- \ '(defmacro with-link (dest &rest body)',
- \ '`(progn',
- \ '(format t "<a href=\"~A\">" (html-file ,dest))',
- \ ',@body',
- \ '(princ "</a>")))'
- \ ])
- call assert_equal(7, lispindent(2))
- call assert_equal(5, 6->lispindent())
- call assert_equal(-1, lispindent(-1))
-
- set lisp
- set lispwords&
- let save_copt = &cpoptions
- set cpoptions+=p
- normal 1G=G
-
- call assert_equal([
- \ '(defun html-file (base)',
- \ ' (format nil "~(~A~).html" base))',
- \ '',
- \ '(defmacro page (name title &rest body)',
- \ ' (let ((ti (gensym)))',
- \ ' `(with-open-file (*standard-output*',
- \ ' (html-file ,name)',
- \ ' :direction :output',
- \ ' :if-exists :supersede)',
- \ ' (let ((,ti ,title))',
- \ ' (as title ,ti)',
- \ ' (with center ',
- \ ' (as h2 (string-upcase ,ti)))',
- \ ' (brs 3)',
- \ ' ,@body))))',
- \ '',
- \ ';;; Utilities for generating links',
- \ '',
- \ '(defmacro with-link (dest &rest body)',
- \ ' `(progn',
- \ ' (format t "<a href=\"~A\">" (html-file ,dest))',
- \ ' ,@body',
- \ ' (princ "</a>")))',
- \ ''
- \ ], getline(1, "$"))
-
- enew!
- let &cpoptions=save_copt
- set nolisp
-endfunc
-
-func Test_lisp_indent_works()
- " This was reading beyond the end of the line
- new
- exe "norm a\tü(\<CR>="
- set lisp
- norm ==
- bwipe!
-endfunc
-
-" vim: shiftwidth=2 sts=2 expandtab