aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2018-02-03 11:58:44 +0100
committerJustin M. Keyes <justinkz@gmail.com>2018-02-11 19:03:26 +0100
commit16a416836464d64f3054aeb727c773ebe5ac7124 (patch)
treed7e864311f02ed253e46a796bca4cb45036866b2
parenta1ee06a0993ef8959cdcec61759b17aa68ee28bd (diff)
downloadrneovim-16a416836464d64f3054aeb727c773ebe5ac7124.tar.gz
rneovim-16a416836464d64f3054aeb727c773ebe5ac7124.tar.bz2
rneovim-16a416836464d64f3054aeb727c773ebe5ac7124.zip
vim-patch:8.0.0613: the conf filetype is used before ftdetect from packages
Problem: The conf filetype detection is done before ftdetect scripts from packages that are added later. Solution: Add the FALLBACK argument to :setfiletype. (closes vim/vim#1679, closes vim/vim#1693) https://github.com/vim/vim/commit/3e54569b17683318e0cb6693ab0024c2ad1e3e8f
-rw-r--r--runtime/filetype.vim31
-rw-r--r--src/nvim/ex_docmd.c15
-rw-r--r--src/nvim/testdir/test_alot.vim1
-rw-r--r--src/nvim/testdir/test_filetype.vim43
4 files changed, 80 insertions, 10 deletions
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index 76f76af345..90b4fdaa74 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -1183,14 +1183,21 @@ au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,*.md setf markdown
" Mason
au BufNewFile,BufRead *.mason,*.mhtml,*.comp setf mason
-" Matlab or Objective C
+" Mathematica, Matlab, Murphi or Objective C
au BufNewFile,BufRead *.m call s:FTm()
func! s:FTm()
let n = 1
- while n < 10
+ let saw_comment = 0 " Whether we've seen a multiline comment leader.
+ while n < 100
let line = getline(n)
- if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\|//\)'
+ if line =~ '^\s*/\*'
+ " /* ... */ is a comment in Objective C and Murphi, so we can't conclude
+ " it's either of them yet, but track this as a hint in case we don't see
+ " anything more definitive.
+ let saw_comment = 1
+ endif
+ if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|//\)'
setf objc
return
endif
@@ -1202,11 +1209,23 @@ func! s:FTm()
setf mma
return
endif
+ if line =~ '^\c\s*\(\(type\|var\)\>\|--\)'
+ setf murphi
+ return
+ endif
let n = n + 1
endwhile
- if exists("g:filetype_m")
+
+ if saw_comment
+ " We didn't see anything definitive, but this looks like either Objective C
+ " or Murphi based on the comment leader. Assume the former as it is more
+ " common.
+ setf objc
+ elseif exists("g:filetype_m")
+ " Use user specified default filetype for .m
exe "setf " . g:filetype_m
else
+ " Default is matlab
setf matlab
endif
endfunc
@@ -2792,12 +2811,12 @@ runtime! ftdetect/*.vim
" state.
augroup END
-" Generic configuration file (check this last, it's just guessing!)
+" Generic configuration file. Use FALLBACK, it's just guessing!
au filetypedetect BufNewFile,BufRead,StdinReadPost *
\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
\ && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#'
\ || getline(4) =~ '^#' || getline(5) =~ '^#') |
- \ setf conf |
+ \ setf FALLBACK conf |
\ endif
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index bd46c65c15..aebc395f56 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -9743,13 +9743,20 @@ void filetype_maybe_enable(void)
}
}
-/*
- * ":setfiletype {name}"
- */
+/// ":setfiletype [FALLBACK] {name}"
static void ex_setfiletype(exarg_T *eap)
{
if (!did_filetype) {
- set_option_value("filetype", 0L, (char *)eap->arg, OPT_LOCAL);
+ char_u *arg = eap->arg;
+
+ if (STRNCMP(arg, "FALLBACK ", 9) == 0) {
+ arg += 9;
+ }
+
+ set_option_value("filetype", 0L, (char *)arg, OPT_LOCAL);
+ if (arg != eap->arg) {
+ did_filetype = false;
+ }
}
}
diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim
index 91da0d9566..1d979a924f 100644
--- a/src/nvim/testdir/test_alot.vim
+++ b/src/nvim/testdir/test_alot.vim
@@ -19,6 +19,7 @@ source test_ga.vim
source test_goto.vim
source test_jumps.vim
source test_fileformat.vim
+source test_filetype.vim
source test_lambda.vim
source test_menu.vim
source test_mapping.vim
diff --git a/src/nvim/testdir/test_filetype.vim b/src/nvim/testdir/test_filetype.vim
new file mode 100644
index 0000000000..818603b180
--- /dev/null
+++ b/src/nvim/testdir/test_filetype.vim
@@ -0,0 +1,43 @@
+" Test :setfiletype
+
+func Test_detection()
+ filetype on
+ augroup filetypedetect
+ au BufNewFile,BufRead * call assert_equal(1, did_filetype())
+ augroup END
+ new something.vim
+ call assert_equal('vim', &filetype)
+
+ bwipe!
+ filetype off
+endfunc
+
+func Test_conf_type()
+ filetype on
+ call writefile(['# some comment', 'must be conf'], 'Xfile')
+ augroup filetypedetect
+ au BufNewFile,BufRead * call assert_equal(0, did_filetype())
+ augroup END
+ split Xfile
+ call assert_equal('conf', &filetype)
+
+ bwipe!
+ call delete('Xfile')
+ filetype off
+endfunc
+
+func Test_other_type()
+ filetype on
+ augroup filetypedetect
+ au BufNewFile,BufRead * call assert_equal(0, did_filetype())
+ au BufNewFile,BufRead Xfile setf testfile
+ au BufNewFile,BufRead * call assert_equal(1, did_filetype())
+ augroup END
+ call writefile(['# some comment', 'must be conf'], 'Xfile')
+ split Xfile
+ call assert_equal('testfile', &filetype)
+
+ bwipe!
+ call delete('Xfile')
+ filetype off
+endfunc