summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Kearns <dougkearns@gmail.com>2023-08-20 20:51:12 +0200
committerChristian Brabandt <cb@256bit.org>2023-08-20 20:53:47 +0200
commit19a3bc3addf9b4aa8150a01b11b4249c67d15d3b (patch)
tree9a6778b92527ccb378862faadb48ca8d033354de
parent6633611f4280f33934c2ab9b6a3e84c04f054ad3 (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.vim45
-rw-r--r--runtime/doc/filetype.txt1
-rw-r--r--runtime/doc/syntax.txt7
-rw-r--r--runtime/filetype.vim9
-rw-r--r--src/testdir/test_filetype.vim64
-rw-r--r--src/version.c2
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,