mirror of
https://github.com/neovim/neovim.git
synced 2025-09-05 19:08:15 +00:00
vim-patch:9.1.1607: :apple command detected as :append (#35237)
Problem: :apple command detected as :append (dai475694450) Solution: Disallow to define a custom command with lower-case letter, correctly detect :insert/:change/:append ex commands (Hirohito Higashi). fixes: vim/vim#17893 closes: vim/vim#17930efd83d441b
Co-authored-by: Hirohito Higashi <h.east.727@gmail.com> (cherry picked from commite7dfbf1343
)
This commit is contained in:

committed by
github-actions[bot]
![github-actions[bot]](/assets/img/avatar_default.png)
parent
e299430ff5
commit
ced4eed733
@@ -2408,19 +2408,14 @@ static int get_function_body(exarg_T *eap, garray_T *newlines, char *line_arg_in
|
||||
}
|
||||
|
||||
// Check for ":append", ":change", ":insert".
|
||||
p = skip_range(p, NULL);
|
||||
if ((p[0] == 'a' && (!ASCII_ISALPHA(p[1]) || p[1] == 'p'))
|
||||
|| (p[0] == 'c'
|
||||
&& (!ASCII_ISALPHA(p[1])
|
||||
|| (p[1] == 'h' && (!ASCII_ISALPHA(p[2])
|
||||
|| (p[2] == 'a'
|
||||
&& (strncmp(&p[3], "nge", 3) != 0
|
||||
|| !ASCII_ISALPHA(p[6])))))))
|
||||
|| (p[0] == 'i'
|
||||
&& (!ASCII_ISALPHA(p[1]) || (p[1] == 'n'
|
||||
&& (!ASCII_ISALPHA(p[2])
|
||||
|| (p[2] == 's')))))) {
|
||||
char *const tp = p = skip_range(p, NULL);
|
||||
if ((checkforcmd(&p, "append", 1)
|
||||
|| checkforcmd(&p, "change", 1)
|
||||
|| checkforcmd(&p, "insert", 1))
|
||||
&& (*p == '!' || *p == '|' || ascii_iswhite_nl_or_nul(*p))) {
|
||||
skip_until = xmemdupz(".", 1);
|
||||
} else {
|
||||
p = tp;
|
||||
}
|
||||
|
||||
// heredoc: Check for ":python <<EOF", ":lua <<EOF", etc.
|
||||
|
@@ -6813,6 +6813,52 @@ func Test_script_lines()
|
||||
catch
|
||||
call assert_exception('Vim(function):E1145: Missing heredoc end marker: .')
|
||||
endtry
|
||||
|
||||
" More test for :append, :change, :insert
|
||||
let cmds = ["append", "change", "insert"]
|
||||
let suffixes = ["", "!", "|", "|xyz", " "]
|
||||
|
||||
for c in cmds
|
||||
" Single character (with some accepted trailing characters)
|
||||
for s in suffixes
|
||||
let cmd = c[:0] .. s
|
||||
let line = ["func LinesCheck()", cmd, "", "endfunc", "call LinesCheck()"]
|
||||
call writefile(line, 'Xfunc', 'D')
|
||||
call assert_fails('source Xfunc', 'E1145: Missing heredoc end marker: .', $'"{cmd}"')
|
||||
endfor
|
||||
|
||||
" Unnecessary arguments
|
||||
let cmd = c[:2] .. " end"
|
||||
let line[1] = cmd
|
||||
call writefile(line, 'Xfunc', 'D')
|
||||
call assert_fails('source Xfunc', 'E488: Trailing characters: end:', $'"{cmd}"')
|
||||
|
||||
" Extra characters at the end (i.e., other commands)
|
||||
let cmd = c .. "x"
|
||||
let line[1] = cmd
|
||||
call writefile(line, 'Xfunc', 'D')
|
||||
call assert_fails('source Xfunc', 'E492: Not an editor command:', $'"{cmd}"')
|
||||
endfor
|
||||
|
||||
let line =<< trim END
|
||||
func AppendCheck()
|
||||
apple
|
||||
endfunc
|
||||
call AppendCheck()
|
||||
END
|
||||
call writefile(line, 'Xfunc', 'D')
|
||||
call assert_fails('source Xfunc', 'E492: Not an editor command: apple')
|
||||
|
||||
let line =<< trim END
|
||||
func AppendCheck()
|
||||
command! apple :echo "hello apple"
|
||||
apple
|
||||
endfunc
|
||||
call AppendCheck()
|
||||
END
|
||||
call writefile(line, 'Xfunc', 'D')
|
||||
call assert_fails('source Xfunc', 'E183: User defined commands must start with an uppercase letter')
|
||||
|
||||
endfunc
|
||||
|
||||
"-------------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user