forked from aniani/vim
patch 9.0.1773: cannot distinguish Forth and Fortran *.f files
Problem: cannot distinguish Forth and Fortran *.f files Solution: Add Filetype detection Code Also add *.4th as a Forth filetype closes: #12251 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Doug Kearns <dougkearns@gmail.com>
This commit is contained in:
parent
6633611f42
commit
19a3bc3add
45
runtime/autoload/dist/ft.vim
vendored
45
runtime/autoload/dist/ft.vim
vendored
@ -287,6 +287,37 @@ export def FTe()
|
|||||||
endif
|
endif
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def IsForth(): bool
|
||||||
|
var first_line = nextnonblank(1)
|
||||||
|
|
||||||
|
# SwiftForth block comment (line is usually filled with '-' or '=') or
|
||||||
|
# OPTIONAL (sometimes precedes the header comment)
|
||||||
|
if getline(first_line) =~? '^\%({\%(\s\|$\)\|OPTIONAL\s\)'
|
||||||
|
return true
|
||||||
|
endif
|
||||||
|
|
||||||
|
var n = first_line
|
||||||
|
while n < 100 && n <= line("$")
|
||||||
|
# Forth comments and colon definitions
|
||||||
|
if getline(n) =~ '^[:(\\] '
|
||||||
|
return true
|
||||||
|
endif
|
||||||
|
n += 1
|
||||||
|
endwhile
|
||||||
|
return false
|
||||||
|
enddef
|
||||||
|
|
||||||
|
# Distinguish between Forth and Fortran
|
||||||
|
export def FTf()
|
||||||
|
if exists("g:filetype_f")
|
||||||
|
exe "setf " .. g:filetype_f
|
||||||
|
elseif IsForth()
|
||||||
|
setf forth
|
||||||
|
else
|
||||||
|
setf fortran
|
||||||
|
endif
|
||||||
|
enddef
|
||||||
|
|
||||||
export def FTfrm()
|
export def FTfrm()
|
||||||
if exists("g:filetype_frm")
|
if exists("g:filetype_frm")
|
||||||
exe "setf " .. g:filetype_frm
|
exe "setf " .. g:filetype_frm
|
||||||
@ -302,21 +333,13 @@ export def FTfrm()
|
|||||||
endif
|
endif
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
# Distinguish between Forth and F#.
|
# Distinguish between Forth and F#
|
||||||
# Provided by Doug Kearns.
|
|
||||||
export def FTfs()
|
export def FTfs()
|
||||||
if exists("g:filetype_fs")
|
if exists("g:filetype_fs")
|
||||||
exe "setf " .. g:filetype_fs
|
exe "setf " .. g:filetype_fs
|
||||||
|
elseif IsForth()
|
||||||
|
setf forth
|
||||||
else
|
else
|
||||||
var n = 1
|
|
||||||
while n < 100 && n <= line("$")
|
|
||||||
# Forth comments and colon definitions
|
|
||||||
if getline(n) =~ "^[:(\\\\] "
|
|
||||||
setf forth
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
n += 1
|
|
||||||
endwhile
|
|
||||||
setf fsharp
|
setf fsharp
|
||||||
endif
|
endif
|
||||||
enddef
|
enddef
|
||||||
|
@ -146,6 +146,7 @@ variables can be used to overrule the filetype used for certain extensions:
|
|||||||
*.cls g:filetype_cls
|
*.cls g:filetype_cls
|
||||||
*.csh g:filetype_csh |ft-csh-syntax|
|
*.csh g:filetype_csh |ft-csh-syntax|
|
||||||
*.dat g:filetype_dat
|
*.dat g:filetype_dat
|
||||||
|
*.f g:filetype_f |ft-forth-syntax|
|
||||||
*.frm g:filetype_frm |ft-form-syntax|
|
*.frm g:filetype_frm |ft-form-syntax|
|
||||||
*.fs g:filetype_fs |ft-forth-syntax|
|
*.fs g:filetype_fs |ft-forth-syntax|
|
||||||
*.i g:filetype_i |ft-progress-syntax|
|
*.i g:filetype_i |ft-progress-syntax|
|
||||||
|
@ -1579,9 +1579,10 @@ example, FORM files, use this in your startup vimrc: >
|
|||||||
|
|
||||||
FORTH *forth.vim* *ft-forth-syntax*
|
FORTH *forth.vim* *ft-forth-syntax*
|
||||||
|
|
||||||
Files matching "*.fs" could be F# or Forth. If the automatic detection
|
Files matching "*.f" could be Fortran or Forth and those matching "*.fs" could
|
||||||
doesn't work for you, or you don't edit F# at all, use this in your
|
be F# or Forth. If the automatic detection doesn't work for you, or you don't
|
||||||
startup vimrc: >
|
edit F# or Fortran at all, use this in your startup vimrc: >
|
||||||
|
:let filetype_f = "forth"
|
||||||
:let filetype_fs = "forth"
|
:let filetype_fs = "forth"
|
||||||
|
|
||||||
|
|
||||||
|
@ -724,16 +724,19 @@ au BufNewFile,BufRead auto.master setf conf
|
|||||||
au BufNewFile,BufRead *.mas,*.master setf master
|
au BufNewFile,BufRead *.mas,*.master setf master
|
||||||
|
|
||||||
" Forth
|
" Forth
|
||||||
au BufNewFile,BufRead *.ft,*.fth setf forth
|
au BufNewFile,BufRead *.ft,*.fth,*.4th setf forth
|
||||||
|
|
||||||
" Reva Forth
|
" Reva Forth
|
||||||
au BufNewFile,BufRead *.frt setf reva
|
au BufNewFile,BufRead *.frt setf reva
|
||||||
|
|
||||||
" Fortran
|
" Fortran
|
||||||
if has("fname_case")
|
if has("fname_case")
|
||||||
au BufNewFile,BufRead *.F,*.FOR,*.FPP,*.FTN,*.F77,*.F90,*.F95,*.F03,*.F08 setf fortran
|
au BufNewFile,BufRead *.F,*.FOR,*.FPP,*.FTN,*.F77,*.F90,*.F95,*.F03,*.F08 setf fortran
|
||||||
endif
|
endif
|
||||||
au BufNewFile,BufRead *.f,*.for,*.fortran,*.fpp,*.ftn,*.f77,*.f90,*.f95,*.f03,*.f08 setf fortran
|
au BufNewFile,BufRead *.for,*.fortran,*.fpp,*.ftn,*.f77,*.f90,*.f95,*.f03,*.f08 setf fortran
|
||||||
|
|
||||||
|
" Fortran or Forth
|
||||||
|
au BufNewFile,BufRead *.f call dist#ft#FTf()
|
||||||
|
|
||||||
" Framescript
|
" Framescript
|
||||||
au BufNewFile,BufRead *.fsl setf framescript
|
au BufNewFile,BufRead *.fsl setf framescript
|
||||||
|
@ -246,7 +246,7 @@ def s:GetFilenameChecks(): dict<list<string>>
|
|||||||
fish: ['file.fish'],
|
fish: ['file.fish'],
|
||||||
focexec: ['file.fex', 'file.focexec'],
|
focexec: ['file.fex', 'file.focexec'],
|
||||||
form: ['file.frm'],
|
form: ['file.frm'],
|
||||||
forth: ['file.ft', 'file.fth'],
|
forth: ['file.ft', 'file.fth', 'file.4th'],
|
||||||
fortran: ['file.f', 'file.for', 'file.fortran', 'file.fpp', 'file.ftn', 'file.f77', 'file.f90', 'file.f95', 'file.f03', 'file.f08'],
|
fortran: ['file.f', 'file.for', 'file.fortran', 'file.fpp', 'file.ftn', 'file.f77', 'file.f90', 'file.f95', 'file.f03', 'file.f08'],
|
||||||
fpcmake: ['file.fpc'],
|
fpcmake: ['file.fpc'],
|
||||||
framescript: ['file.fsl'],
|
framescript: ['file.fsl'],
|
||||||
@ -1265,6 +1265,54 @@ func Test_ex_file()
|
|||||||
filetype off
|
filetype off
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_f_file()
|
||||||
|
filetype on
|
||||||
|
|
||||||
|
call writefile(['looks like Fortran'], 'Xfile.f', 'D')
|
||||||
|
split Xfile.f
|
||||||
|
call assert_equal('fortran', &filetype)
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
let g:filetype_f = 'forth'
|
||||||
|
split Xfile.f
|
||||||
|
call assert_equal('forth', &filetype)
|
||||||
|
bwipe!
|
||||||
|
unlet g:filetype_f
|
||||||
|
|
||||||
|
" Test dist#ft#FTf()
|
||||||
|
|
||||||
|
" Forth
|
||||||
|
|
||||||
|
call writefile(['( Forth inline comment )'], 'Xfile.f')
|
||||||
|
split Xfile.f
|
||||||
|
call assert_equal('forth', &filetype)
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
call writefile(['\ Forth line comment'], 'Xfile.f')
|
||||||
|
split Xfile.f
|
||||||
|
call assert_equal('forth', &filetype)
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
call writefile([': squared ( n -- n^2 )', 'dup * ;'], 'Xfile.f')
|
||||||
|
split Xfile.f
|
||||||
|
call assert_equal('forth', &filetype)
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
" SwiftForth
|
||||||
|
|
||||||
|
call writefile(['{ ================', 'Header comment', '================ }'], 'Xfile.f')
|
||||||
|
split Xfile.f
|
||||||
|
call assert_equal('forth', &filetype)
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
call writefile(['OPTIONAL Maybe Descriptive text'], 'Xfile.f')
|
||||||
|
split Xfile.f
|
||||||
|
call assert_equal('forth', &filetype)
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
filetype off
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_foam_file()
|
func Test_foam_file()
|
||||||
filetype on
|
filetype on
|
||||||
call assert_true(mkdir('0', 'pR'))
|
call assert_true(mkdir('0', 'pR'))
|
||||||
@ -1355,7 +1403,7 @@ func Test_fs_file()
|
|||||||
|
|
||||||
" Test dist#ft#FTfs()
|
" Test dist#ft#FTfs()
|
||||||
|
|
||||||
" Forth (Gforth)
|
" Forth
|
||||||
|
|
||||||
call writefile(['( Forth inline comment )'], 'Xfile.fs')
|
call writefile(['( Forth inline comment )'], 'Xfile.fs')
|
||||||
split Xfile.fs
|
split Xfile.fs
|
||||||
@ -1372,6 +1420,18 @@ func Test_fs_file()
|
|||||||
call assert_equal('forth', &filetype)
|
call assert_equal('forth', &filetype)
|
||||||
bwipe!
|
bwipe!
|
||||||
|
|
||||||
|
" SwiftForth
|
||||||
|
|
||||||
|
call writefile(['{ ================', 'Header comment', '================ }'], 'Xfile.fs')
|
||||||
|
split Xfile.fs
|
||||||
|
call assert_equal('forth', &filetype)
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
call writefile(['OPTIONAL Maybe Descriptive text'], 'Xfile.fs')
|
||||||
|
split Xfile.fs
|
||||||
|
call assert_equal('forth', &filetype)
|
||||||
|
bwipe!
|
||||||
|
|
||||||
filetype off
|
filetype off
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
@ -695,6 +695,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1773,
|
||||||
/**/
|
/**/
|
||||||
1772,
|
1772,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user