summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHu Jialun <hujialun@comp.nus.edu.sg>2021-08-28 20:42:50 +0200
committerBram Moolenaar <Bram@vim.org>2021-08-28 20:42:50 +0200
commit9dcd349ca85e1df1abd1cbf1c29c0f1574b70bf8 (patch)
treea3b5f55b7ab7d58e173349c318906c77583f7691
parent9aecf79c45da5593e4d8c0de1b2d212edc4765ce (diff)
patch 8.2.3384: cannot disable modeline for an individual filev8.2.3384
Problem: Cannot disable modeline for an individual file. Solution: Recognize "nomodeline" in a modeline. (Hu Jialun, closes #8798)
-rw-r--r--runtime/doc/options.txt9
-rw-r--r--src/buffer.c4
-rw-r--r--src/testdir/test_modeline.vim8
-rw-r--r--src/version.c2
4 files changed, 21 insertions, 2 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index ebb408dd49..a181ecb0d8 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -541,6 +541,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/buffer.c b/src/buffer.c
index bc3378a995..507eb01267 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -5446,12 +5446,12 @@ do_modelines(int flags)
return;
++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 <= nmlines;
++lnum)
if (chk_modeline(lnum, flags) == FAIL)
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 > nmlines
&& lnum > curbuf->b_ml.ml_line_count - nmlines; --lnum)
if (chk_modeline(lnum, flags) == FAIL)
nmlines = 0;
diff --git a/src/testdir/test_modeline.vim b/src/testdir/test_modeline.vim
index 19c99b55ea..f28ad3e84f 100644
--- a/src/testdir/test_modeline.vim
+++ b/src/testdir/test_modeline.vim
@@ -360,4 +360,12 @@ func Test_modeline_diff_buffer()
bw
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
diff --git a/src/version.c b/src/version.c
index a9c5b4cdfc..d50d09829d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3384,
+/**/
3383,
/**/
3382,