# HG changeset patch # User Bram Moolenaar # Date 1665661506 -7200 # Node ID 4edfa418f8ba90738aca1cac16fd8d9380156b79 # Parent 4dca94c98241039307d674de846e8d2288b29acd patch 9.0.0737: Lisp word only recognized when a space follows Commit: https://github.com/vim/vim/commit/d26c5805bcbd630dab0478c2d22503a6e32a83c1 Author: Bram Moolenaar Date: Thu Oct 13 12:30:08 2022 +0100 patch 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. diff --git a/src/indent.c b/src/indent.c --- a/src/indent.c +++ b/src/indent.c @@ -1952,7 +1952,7 @@ lisp_match(char_u *p) { (void)copy_option_part(&word, buf, LSIZE, ","); len = (int)STRLEN(buf); - if (STRNCMP(buf, p, len) == 0 && p[len] == ' ') + if (STRNCMP(buf, p, len) == 0 && IS_WHITE_OR_NUL(p[len])) return TRUE; } return FALSE; diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -182,7 +182,7 @@ NEW_TESTS = \ test_largefile \ test_let \ test_lineending \ - test_lispwords \ + test_lispindent \ test_listchars \ test_listdict \ test_listener \ @@ -427,6 +427,7 @@ NEW_TESTS_RES = \ test_langmap.res \ test_let.res \ test_lineending.res \ + test_lispindent.res \ test_listchars.res \ test_listdict.res \ test_listener.res \ diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim --- a/src/testdir/test_alot.vim +++ b/src/testdir/test_alot.vim @@ -16,7 +16,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/testdir/test_cpoptions.vim b/src/testdir/test_cpoptions.vim --- a/src/testdir/test_cpoptions.vim +++ b/src/testdir/test_cpoptions.vim @@ -422,7 +422,7 @@ func Test_cpo_O() let &cpo = save_cpo endfunc -" Test for the 'p' flag in 'cpo' is in the test_lispwords.vim file. +" Test for the 'p' flag in 'cpo' is in the test_lispindent.vim file. " Test for the 'P' flag in 'cpo' (appending to a file sets the current file " name) diff --git a/src/testdir/test_lispindent.vim b/src/testdir/test_lispindent.vim new file mode 100644 --- /dev/null +++ b/src/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 + +def Test_lisp_indent() + enew! + + 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 "")))' + ]) + assert_equal(7, lispindent(2)) + assert_equal(5, 6->lispindent()) + assert_fails('lispindent(-1)', 'E966: Invalid line number: -1') + + set lisp + set lispwords& + var save_copt = &cpoptions + set cpoptions+=p + normal 1G=G + + 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! + &cpoptions = save_copt + set nolisp +enddef + +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/testdir/test_lispwords.vim b/src/testdir/test_lispwords.vim deleted file mode 100644 --- a/src/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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 737, +/**/ 736, /**/ 735,