vim-patch:8.2.3686: filetype detection often mixes up Forth and F#

Problem:    Filetype detection often mixes up Forth and F#.
Solution:   Add a function to inspect the file contents. (Doug Kearns)
3d14c0f2b9
This commit is contained in:
Christian Clason 2021-11-27 18:39:34 +01:00
parent b339cb5aca
commit ea5699399e
6 changed files with 95 additions and 8 deletions

View File

@ -219,6 +219,23 @@ func dist#ft#FTe()
endif
endfunc
" Distinguish between Forth and F#.
" Provided by Doug Kearns.
func dist#ft#FTfs()
if exists("g:filetype_fs")
exe "setf " . g:filetype_fs
else
let line = getline(nextnonblank(1))
" comments and colon definitions
if line =~ '^\s*\.\=( ' || line =~ '^\s*\\G\= ' || line =~ '^\\$'
\ || line =~ '^\s*: \S'
setf forth
else
setf fs
endif
endif
endfunc
" Distinguish between HTML, XHTML and Django
func dist#ft#FThtml()
let n = 1

View File

@ -128,18 +128,19 @@ can be used to overrule the filetype used for certain extensions:
file name variable ~
*.asa g:filetype_asa |ft-aspvbs-syntax| |ft-aspperl-syntax|
*.asp g:filetype_asp |ft-aspvbs-syntax| |ft-aspperl-syntax|
*.asm g:asmsyntax |ft-asm-syntax|
*.prg g:filetype_prg
*.pl g:filetype_pl
*.inc g:filetype_inc
*.w g:filetype_w |ft-cweb-syntax|
*.asp g:filetype_asp |ft-aspvbs-syntax| |ft-aspperl-syntax|
*.fs g:filetype_fs |ft-forth-syntax|
*.i g:filetype_i |ft-progress-syntax|
*.inc g:filetype_inc
*.m g:filetype_m |ft-mathematica-syntax|
*.p g:filetype_p |ft-pascal-syntax|
*.pl g:filetype_pl
*.pp g:filetype_pp |ft-pascal-syntax|
*.prg g:filetype_prg
*.sh g:bash_is_sh |ft-sh-syntax|
*.tex g:tex_flavor |ft-tex-plugin|
*.w g:filetype_w |ft-cweb-syntax|
*filetype-ignore*
To avoid that certain files are being inspected, the g:ft_ignore_pat variable
@ -494,7 +495,6 @@ Options:
For further discussion of fortran_have_tabs and the method used for the
detection of source format see |ft-fortran-syntax|.
GIT COMMIT *ft-gitcommit-plugin*
One command, :DiffGitCached, is provided to show a diff of the current commit

View File

@ -1497,6 +1497,14 @@ gvim display. Here, statements are colored LightYellow instead of Yellow, and
conditionals are LightBlue for better distinction.
FORTH *forth.vim* *ft-forth-syntax*
Files matching "*.fs" could be F# or Forth. If the automatic detection
doesn't work for you, or you don't edit F# at all, use this in your
startup vimrc: >
:let filetype_fs = "forth"
FORTRAN *fortran.vim* *ft-fortran-syntax*
Default highlighting and dialect ~

View File

@ -628,7 +628,10 @@ au BufNewFile,BufRead auto.master setf conf
au BufNewFile,BufRead *.mas,*.master setf master
" Forth
au BufNewFile,BufRead *.fs,*.ft,*.fth setf forth
au BufNewFile,BufRead *.ft,*.fth setf forth
" F# or Forth
au BufNewFile,BufRead *.fs call dist#ft#FTfs()
" Reva Forth
au BufNewFile,BufRead *.frt setf reva

View File

@ -198,6 +198,10 @@ if s:line1 =~# "^#!"
elseif s:name =~# 'fish\>'
set ft=fish
" Gforth
elseif s:name =~# 'gforth\>'
set ft=forth
endif
unlet s:name

View File

@ -182,11 +182,12 @@ let s:filename_checks = {
\ 'fgl': ['file.4gl', 'file.4gh', 'file.m4gl'],
\ 'fish': ['file.fish'],
\ 'focexec': ['file.fex', 'file.focexec'],
\ 'forth': ['file.fs', 'file.ft', 'file.fth'],
\ 'forth': ['file.ft', 'file.fth'],
\ 'fortran': ['file.f', 'file.for', 'file.fortran', 'file.fpp', 'file.ftn', 'file.f77', 'file.f90', 'file.f95', 'file.f03', 'file.f08'],
\ 'fpcmake': ['file.fpc'],
\ 'framescript': ['file.fsl'],
\ 'freebasic': ['file.fb', 'file.bi'],
\ 'fs': ['file.fs'],
\ 'fstab': ['fstab', 'mtab'],
\ 'fvwm': ['/.fvwm/file', 'any/.fvwm/file'],
\ 'gdb': ['.gdbinit', 'gdbinit'],
@ -663,6 +664,7 @@ let s:script_checks = {
\ 'fennel': [['#!/path/fennel']],
\ 'routeros': [['#!/path/rsc']],
\ 'fish': [['#!/path/fish']],
\ 'forth': [['#!/path/gforth']],
\ }
" Various forms of "env" optional arguments.
@ -945,4 +947,57 @@ func Test_xpm_file()
filetype off
endfunc
func Test_fs_file()
filetype on
call writefile(['looks like F#'], 'Xfile.fs')
split Xfile.fs
call assert_equal('fs', &filetype)
bwipe!
let g:filetype_fs = 'forth'
split Xfile.fs
call assert_equal('forth', &filetype)
bwipe!
unlet g:filetype_fs
" Test dist#ft#FTfs()
" Forth (Gforth)
call writefile(['( Forth inline comment )'], 'Xfile.fs')
split Xfile.fs
call assert_equal('forth', &filetype)
bwipe!
call writefile(['.( Forth displayed inline comment )'], 'Xfile.fs')
split Xfile.fs
call assert_equal('forth', &filetype)
bwipe!
call writefile(['\ Forth line comment'], 'Xfile.fs')
split Xfile.fs
call assert_equal('forth', &filetype)
bwipe!
" empty line comment - no space required
call writefile(['\'], 'Xfile.fs')
split Xfile.fs
call assert_equal('forth', &filetype)
bwipe!
call writefile(['\G Forth documentation comment '], 'Xfile.fs')
split Xfile.fs
call assert_equal('forth', &filetype)
bwipe!
call writefile([': squared ( n -- n^2 )', 'dup * ;'], 'Xfile.fs')
split Xfile.fs
call assert_equal('forth', &filetype)
bwipe!
call delete('Xfile.fs')
filetype off
endfunc
" vim: shiftwidth=2 sts=2 expandtab