diff options
-rw-r--r-- | runtime/doc/options.txt | 9 | ||||
-rw-r--r-- | src/nvim/buffer.c | 9 | ||||
-rw-r--r-- | src/nvim/testdir/test_modeline.vim | 10 |
3 files changed, 24 insertions, 4 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 90ba3b86d9..1a703129d6 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -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 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* 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 diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 81f8b9073e..55db72aa16 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -5261,15 +5261,16 @@ void do_modelines(int flags) } entered++; - for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count && lnum <= nmlines; - lnum++) { + for (lnum = 1; curbuf->b_p_ml && lnum <= curbuf->b_ml.ml_line_count + && lnum <= nmlines; lnum++) { if (chk_modeline(lnum, flags) == FAIL) { nmlines = 0; } } - for (lnum = curbuf->b_ml.ml_line_count; lnum > 0 && lnum > nmlines - && lnum > curbuf->b_ml.ml_line_count - nmlines; lnum--) { + for (lnum = curbuf->b_ml.ml_line_count; curbuf->b_p_ml && lnum > 0 + && lnum > nmlines && lnum > curbuf->b_ml.ml_line_count - nmlines; + lnum--) { if (chk_modeline(lnum, flags) == FAIL) { nmlines = 0; } diff --git a/src/nvim/testdir/test_modeline.vim b/src/nvim/testdir/test_modeline.vim index 9bdada616c..b3fe79f545 100644 --- a/src/nvim/testdir/test_modeline.vim +++ b/src/nvim/testdir/test_modeline.vim @@ -280,3 +280,13 @@ func Test_modeline_fails_modelineexpr() call s:modeline_fails('tabline', 'tabline=Something()', 'E992:') call s:modeline_fails('titlestring', 'titlestring=Something()', 'E992:') 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 |