aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Dewar <seandewar@users.noreply.github.com>2021-09-06 18:05:05 +0100
committerSean Dewar <seandewar@users.noreply.github.com>2021-09-10 15:35:18 +0100
commitb3a97c56b659f7b9bf1c021d654b3df0236171c7 (patch)
tree07f0efd7785496b905d2b9231354fedbd805f28e
parente8e2f73c3a4dfbbaa2cdd4a3e585fac6b4ba88b6 (diff)
downloadrneovim-b3a97c56b659f7b9bf1c021d654b3df0236171c7.tar.gz
rneovim-b3a97c56b659f7b9bf1c021d654b3df0236171c7.tar.bz2
rneovim-b3a97c56b659f7b9bf1c021d654b3df0236171c7.zip
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) https://github.com/vim/vim/commit/9dcd349ca85e1df1abd1cbf1c29c0f1574b70bf8 Cherry-pick missing modeline for test_modeline.vim (heh) from v8.2.1432.
-rw-r--r--runtime/doc/options.txt9
-rw-r--r--src/nvim/buffer.c9
-rw-r--r--src/nvim/testdir/test_modeline.vim10
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