diff options
author | Doug Kearns <dougkearns@gmail.com> | 2023-08-20 20:51:12 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-08-20 20:53:47 +0200 |
commit | 19a3bc3addf9b4aa8150a01b11b4249c67d15d3b (patch) | |
tree | 9a6778b92527ccb378862faadb48ca8d033354de | |
parent | 6633611f4280f33934c2ab9b6a3e84c04f054ad3 (diff) |
patch 9.0.1773: cannot distinguish Forth and Fortran *.f filesv9.0.1773
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>
-rw-r--r-- | runtime/autoload/dist/ft.vim | 45 | ||||
-rw-r--r-- | runtime/doc/filetype.txt | 1 | ||||
-rw-r--r-- | runtime/doc/syntax.txt | 7 | ||||
-rw-r--r-- | runtime/filetype.vim | 9 | ||||
-rw-r--r-- | src/testdir/test_filetype.vim | 64 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 109 insertions, 19 deletions
diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim index 9f53f68460..bc2125754a 100644 --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -287,6 +287,37 @@ export def FTe() endif 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() if exists("g:filetype_frm") exe "setf " .. g:filetype_frm @@ -302,21 +333,13 @@ export def FTfrm() endif enddef -# Distinguish between Forth and F#. -# Provided by Doug Kearns. +# Distinguish between Forth and F# export def FTfs() if exists("g:filetype_fs") exe "setf " .. g:filetype_fs + elseif IsForth() + setf forth 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 endif enddef diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt index 05574eba22..05047224f9 100644 --- a/runtime/doc/filetype.txt +++ b/runtime/doc/filetype.txt @@ -146,6 +146,7 @@ variables can be used to overrule the filetype used for certain extensions: *.cls g:filetype_cls *.csh g:filetype_csh |ft-csh-syntax| *.dat g:filetype_dat + *.f g:filetype_f |ft-forth-syntax| *.frm g:filetype_frm |ft-form-syntax| *.fs g:filetype_fs |ft-forth-syntax| *.i g:filetype_i |ft-progress-syntax| diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index 17f81391a9..29a12396d4 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1579,9 +1579,10 @@ example, FORM files, use this in your startup vimrc: > 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: > +Files matching "*.f" could be Fortran or Forth and those matching "*.fs" could +be F# or Forth. If the automatic detection doesn't work for you, or you don't +edit F# or Fortran at all, use this in your startup vimrc: > + :let filetype_f = "forth" :let filetype_fs = "forth" diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 16d4a131fd..a434503418 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -724,16 +724,19 @@ au BufNewFile,BufRead auto.master setf conf au BufNewFile,BufRead *.mas,*.master setf master " Forth -au BufNewFile,BufRead *.ft,*.fth setf forth +au BufNewFile,BufRead *.ft,*.fth,*.4th setf forth " Reva Forth au BufNewFile,BufRead *.frt setf reva " Fortran 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 -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 au BufNewFile,BufRead *.fsl setf framescript diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim index 778736b36c..a8ce88cca0 100644 --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -246,7 +246,7 @@ def s:GetFilenameChecks(): dict<list<string>> fish: ['file.fish'], focexec: ['file.fex', 'file.focexec'], 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'], fpcmake: ['file.fpc'], framescript: ['file.fsl'], @@ -1265,6 +1265,54 @@ func Test_ex_file() filetype off 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() filetype on call assert_true(mkdir('0', 'pR')) @@ -1355,7 +1403,7 @@ func Test_fs_file() " Test dist#ft#FTfs() - " Forth (Gforth) + " Forth call writefile(['( Forth inline comment )'], 'Xfile.fs') split Xfile.fs @@ -1372,6 +1420,18 @@ func Test_fs_file() call assert_equal('forth', &filetype) 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 endfunc diff --git a/src/version.c b/src/version.c index 13d27f4afd..ffecee9e17 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1773, +/**/ 1772, /**/ 1771, |