0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

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.
This commit is contained in:
Bram Moolenaar
2022-10-13 12:30:08 +01:00
parent f8412c9d7c
commit d26c5805bc
7 changed files with 109 additions and 102 deletions

View File

@@ -1952,7 +1952,7 @@ lisp_match(char_u *p)
{ {
(void)copy_option_part(&word, buf, LSIZE, ","); (void)copy_option_part(&word, buf, LSIZE, ",");
len = (int)STRLEN(buf); 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 TRUE;
} }
return FALSE; return FALSE;

View File

@@ -182,7 +182,7 @@ NEW_TESTS = \
test_largefile \ test_largefile \
test_let \ test_let \
test_lineending \ test_lineending \
test_lispwords \ test_lispindent \
test_listchars \ test_listchars \
test_listdict \ test_listdict \
test_listener \ test_listener \
@@ -427,6 +427,7 @@ NEW_TESTS_RES = \
test_langmap.res \ test_langmap.res \
test_let.res \ test_let.res \
test_lineending.res \ test_lineending.res \
test_lispindent.res \
test_listchars.res \ test_listchars.res \
test_listdict.res \ test_listdict.res \
test_listener.res \ test_listener.res \

View File

@@ -16,7 +16,6 @@ source test_fnamemodify.vim
source test_ga.vim source test_ga.vim
source test_glob2regpat.vim source test_glob2regpat.vim
source test_global.vim source test_global.vim
source test_lispwords.vim
source test_move.vim source test_move.vim
source test_put.vim source test_put.vim
source test_reltime.vim source test_reltime.vim

View File

@@ -422,7 +422,7 @@ func Test_cpo_O()
let &cpo = save_cpo let &cpo = save_cpo
endfunc 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 " Test for the 'P' flag in 'cpo' (appending to a file sets the current file
" name) " name)

View File

@@ -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 "<a href=\"~A\">" (html-file ,dest))',
',@body',
'(princ "</a>")))'
])
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 "<a href=\"~A\">" (html-file ,dest))',
' ,@body',
' (princ "</a>")))',
''
], 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ü(\<CR>="
set lisp
norm ==
bwipe!
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@@ -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

View File

@@ -699,6 +699,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
737,
/**/ /**/
736, 736,
/**/ /**/