]> granicus.if.org Git - vim/commitdiff
patch 8.2.3384: cannot disable modeline for an individual file v8.2.3384
authorHu Jialun <hujialun@comp.nus.edu.sg>
Sat, 28 Aug 2021 18:42:50 +0000 (20:42 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 28 Aug 2021 18:42:50 +0000 (20:42 +0200)
Problem:    Cannot disable modeline for an individual file.
Solution:   Recognize "nomodeline" in a modeline. (Hu Jialun, closes #8798)

runtime/doc/options.txt
src/buffer.c
src/testdir/test_modeline.vim
src/version.c

index ebb408dd4971e30f6809eede2504e33712d57152..a181ecb0d89cf2ded6f61f997d4793a7d41d4387 100644 (file)
@@ -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
index bc3378a995237526db5cbe63035fbd43b7dee9f7..507eb012676a94ff3ff6f74121608c9607cdccb8 100644 (file)
@@ -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;
index 19c99b55ea1c121942f7ca49885fcd7641109f76..f28ad3e84f309912498f20a740295f7ea4afd707 100644 (file)
@@ -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
index a9c5b4cdfc5803d793a556b9fc37b6673bd7f5c0..d50d09829dc012f9e9d59aee8fd681d79b68750c 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3384,
 /**/
     3383,
 /**/