Skip to content

Commit

Permalink
patch 8.0.0613: the conf filetype is used before ftdetect from packages
Browse files Browse the repository at this point in the history
Problem:    The conf filetype detection is done before ftdetect scripts from
            packages that are added later.
Solution:   Add the FALLBACK argument to :setfiletype. (closes #1679,
            closes #1693)
  • Loading branch information
brammool committed Jun 4, 2017
1 parent ce876aa commit 3e54569
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 9 deletions.
33 changes: 26 additions & 7 deletions runtime/filetype.vim
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
" Vim support file to detect file types
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2017 May 27
" Last Change: 2017 Jun 04

" Listen very carefully, I will say this only once
if exists("did_load_filetypes")
Expand Down Expand Up @@ -1181,14 +1181,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
Expand All @@ -1200,11 +1207,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
Expand Down Expand Up @@ -2777,12 +2796,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


Expand Down
1 change: 1 addition & 0 deletions src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2133,6 +2133,7 @@ test_arglist \
test_feedkeys \
test_file_perm \
test_fileformat \
test_filetype \
test_filter_cmd \
test_filter_map \
test_findfile \
Expand Down
13 changes: 11 additions & 2 deletions src/ex_docmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -12172,13 +12172,22 @@ ex_filetype(exarg_T *eap)
}

/*
* ":setfiletype {name}"
* ":setfiletype [FALLBACK] {name}"
*/
static void
ex_setfiletype(exarg_T *eap)
{
if (!did_filetype)
set_option_value((char_u *)"filetype", 0L, eap->arg, OPT_LOCAL);
{
char_u *arg = eap->arg;

if (STRNCMP(arg, "FALLBACK ", 9) == 0)
arg += 9;

set_option_value((char_u *)"filetype", 0L, arg, OPT_LOCAL);
if (arg != eap->arg)
did_filetype = FALSE;
}
}
#endif

Expand Down
1 change: 1 addition & 0 deletions src/testdir/test_alot.vim
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ source test_expr.vim
source test_feedkeys.vim
source test_file_perm.vim
source test_fileformat.vim
source test_filetype.vim
source test_filter_cmd.vim
source test_filter_map.vim
source test_findfile.vim
Expand Down
43 changes: 43 additions & 0 deletions src/testdir/test_filetype.vim
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -764,6 +764,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
613,
/**/
612,
/**/
Expand Down

0 comments on commit 3e54569

Please sign in to comment.