From eaac0958256f2fb3b0fa9d20790bc38ed9eb3005 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 15 Oct 2022 19:25:51 +0800 Subject: vim-patch:partial:9.0.0737: Lisp word only recognized when a space follows Problem: Lisp word only recognized when a space follows. Solution: Also match a word at the end of a line. Rename the test. Use a compiled function to avoid backslashes. https://github.com/vim/vim/commit/d26c5805bcbd630dab0478c2d22503a6e32a83c1 Keep the old Test_lisp_indent(). --- src/nvim/indent.c | 2 +- src/nvim/testdir/test_alot.vim | 1 - src/nvim/testdir/test_lispindent.vim | 103 +++++++++++++++++++++++++++++++++++ src/nvim/testdir/test_lispwords.vim | 98 --------------------------------- 4 files changed, 104 insertions(+), 100 deletions(-) create mode 100644 src/nvim/testdir/test_lispindent.vim delete mode 100644 src/nvim/testdir/test_lispwords.vim (limited to 'src') diff --git a/src/nvim/indent.c b/src/nvim/indent.c index 0f7a5a8e44..74249777d6 100644 --- 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 index a83ef50abc..a3d240f27e 100644 --- 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 new file mode 100644 index 0000000000..d4cab6d17e --- /dev/null +++ b/src/nvim/testdir/test_lispindent.vim @@ -0,0 +1,103 @@ +" 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 "" (html-file ,dest))', + \ ',@body', + \ '(princ "")))' + \ ]) + 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 "" (html-file ,dest))', + \ ' ,@body', + \ ' (princ "")))', + \ '' + \ ], 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_lisp_indent_works() + " This was reading beyond the end of the line + new + exe "norm a\tü(\=" + 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 deleted file mode 100644 index 4144fb0521..0000000000 --- a/src/nvim/testdir/test_lispwords.vim +++ /dev/null @@ -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 "" (html-file ,dest))', - \ ',@body', - \ '(princ "")))' - \ ]) - 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 "" (html-file ,dest))', - \ ' ,@body', - \ ' (princ "")))', - \ '' - \ ], 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ü(\=" - set lisp - norm == - bwipe! -endfunc - -" vim: shiftwidth=2 sts=2 expandtab -- cgit From 32ced1f08fd551770b4f4a0fd69dfe2d36c417b6 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 15 Oct 2022 19:42:38 +0800 Subject: vim-patch:9.0.0754: 'indentexpr' overrules lisp indenting in one situation Problem: 'indentexpr' overrules lisp indenting in one situation. Solution: Add "else" to keep the lisp indent. (issue vim/vim#11327) https://github.com/vim/vim/commit/a79b35b5781ae770334cec781d17fec3875f8108 --- src/nvim/change.c | 8 +++----- src/nvim/testdir/test_lispindent.vim | 11 +++++++++++ 2 files changed, 14 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/nvim/change.c b/src/nvim/change.c index c9e57ab88f..c6f9e9f5c2 100644 --- 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/testdir/test_lispindent.vim b/src/nvim/testdir/test_lispindent.vim index d4cab6d17e..8987f67a80 100644 --- a/src/nvim/testdir/test_lispindent.vim +++ b/src/nvim/testdir/test_lispindent.vim @@ -91,6 +91,17 @@ func Test_lispindent_negative() call assert_equal(-1, lispindent(-1)) endfunc +func Test_lispindent_with_indentexpr() + enew + setl ai lisp nocin indentexpr=11 + exe "normal a(x\1\2)\" + 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 -- cgit