vim-patch:8.2.3384: cannot disable modeline for an individual file

Problem:    Cannot disable modeline for an individual file.
Solution:   Recognize "nomodeline" in a modeline. (Hu Jialun, closes vim/vim#8798)
9dcd349ca8

Cherry-pick missing modeline for test_modeline.vim (heh) from v8.2.1432.
This commit is contained in:
Sean Dewar 2021-09-06 18:05:05 +01:00
parent e8e2f73c3a
commit b3a97c56b6
No known key found for this signature in database
GPG Key ID: 08CC2C83AD41B581
3 changed files with 24 additions and 4 deletions

View File

@ -435,6 +435,15 @@ chance that a normal word like "lex:" is caught. There is one exception:
version 3.0). Using "ex:" at the start of the line will be ignored (this version 3.0). Using "ex:" at the start of the line will be ignored (this
could be short for "example:"). could be short for "example:").
If the modeline is disabled within a modeline, subsequent modelines will be
ignored. This is to allow turning off modeline on a per-file basis. This is
useful when a line looks like a modeline but isn't. For example, it would be
good to start a YAML file containing strings like "vim:" with
# vim: nomodeline ~
so as to avoid modeline misdetection. Following options on the same line
after modeline deactivation, if any, are still evaluated (but you would
normally not have any).
*modeline-local* *modeline-local*
The options are set like with ":setlocal": The new value only applies to the The options are set like with ":setlocal": The new value only applies to the
buffer and window that contain the file. Although it's possible to set global buffer and window that contain the file. Although it's possible to set global

View File

@ -5261,15 +5261,16 @@ void do_modelines(int flags)
} }
entered++; entered++;
for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count && lnum <= nmlines; for (lnum = 1; curbuf->b_p_ml && lnum <= curbuf->b_ml.ml_line_count
lnum++) { && lnum <= nmlines; lnum++) {
if (chk_modeline(lnum, flags) == FAIL) { if (chk_modeline(lnum, flags) == FAIL) {
nmlines = 0; nmlines = 0;
} }
} }
for (lnum = curbuf->b_ml.ml_line_count; lnum > 0 && lnum > nmlines for (lnum = curbuf->b_ml.ml_line_count; curbuf->b_p_ml && lnum > 0
&& lnum > curbuf->b_ml.ml_line_count - nmlines; lnum--) { && lnum > nmlines && lnum > curbuf->b_ml.ml_line_count - nmlines;
lnum--) {
if (chk_modeline(lnum, flags) == FAIL) { if (chk_modeline(lnum, flags) == FAIL) {
nmlines = 0; nmlines = 0;
} }

View File

@ -280,3 +280,13 @@ func Test_modeline_fails_modelineexpr()
call s:modeline_fails('tabline', 'tabline=Something()', 'E992:') call s:modeline_fails('tabline', 'tabline=Something()', 'E992:')
call s:modeline_fails('titlestring', 'titlestring=Something()', 'E992:') call s:modeline_fails('titlestring', 'titlestring=Something()', 'E992:')
endfunc endfunc
func Test_modeline_disable()
set modeline
call writefile(['vim: sw=2', 'vim: nomodeline', 'vim: sw=3'], 'Xmodeline_disable')
edit Xmodeline_disable
call assert_equal(2, &sw)
call delete('Xmodeline_disable')
endfunc
" vim: shiftwidth=2 sts=2 expandtab