changeset 26311:ce3678583211 v8.2.3686

patch 8.2.3686: filetype detection often mixes up Forth and F# Commit: https://github.com/vim/vim/commit/3d14c0f2b964195d08b34bb43f89ec5f99255194 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Nov 27 17:22:07 2021 +0000 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 27 Nov 2021 18:30:03 +0100
parents 61dd75441707
children 97c299ecd366
files runtime/autoload/dist/ft.vim runtime/doc/filetype.txt runtime/doc/syntax.txt runtime/filetype.vim runtime/scripts.vim src/testdir/test_filetype.vim src/version.c
diffstat 7 files changed, 105 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/autoload/dist/ft.vim
+++ b/runtime/autoload/dist/ft.vim
@@ -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
--- a/runtime/doc/filetype.txt
+++ b/runtime/doc/filetype.txt
@@ -139,18 +139,19 @@ can be used to overrule the filetype use
 
 	file name	variable ~
 	*.asa		g:filetype_asa	|ft-aspvbs-syntax| |ft-aspperl-syntax|
+	*.asm		g:asmsyntax	|ft-asm-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
+	*.fs		g:filetype_fs   |ft-forth-syntax|
+	*.i		g:filetype_i	|ft-progress-syntax|
 	*.inc		g:filetype_inc
-	*.w		g:filetype_w	|ft-cweb-syntax|
-	*.i		g:filetype_i	|ft-progress-syntax|
 	*.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
@@ -538,6 +539,14 @@ Options:
 For further discussion of fortran_have_tabs and the method used for the
 detection of source format see |ft-fortran-syntax|.
 
+GPROF							*ft-gprof-plugin*
+
+The gprof filetype plugin defines a mapping <C-]> to jump from a function
+entry in the gprof flat profile or from a function entry in the call graph
+to the details of that function in the call graph.
+
+The mapping can be disabled with: >
+	let g:no_gprof_maps = 1
 
 GIT COMMIT                                              *ft-gitcommit-plugin*
 
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -1533,6 +1533,14 @@ gvim display.  Here, statements are colo
 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 ~
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -632,7 +632,10 @@ au BufNewFile,BufRead auto.master		setf 
 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
--- a/runtime/scripts.vim
+++ b/runtime/scripts.vim
@@ -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
 
--- a/src/testdir/test_filetype.vim
+++ b/src/testdir/test_filetype.vim
@@ -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'],
@@ -664,6 +665,7 @@ let s:script_checks = {
       \ 'fennel': [['#!/path/fennel']],
       \ 'routeros': [['#!/path/rsc']],
       \ 'fish': [['#!/path/fish']],
+      \ 'forth': [['#!/path/gforth']],
       \ }
 
 " Various forms of "env" optional arguments.
@@ -970,4 +972,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
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3686,
+/**/
     3685,
 /**/
     3684,