forked from aniani/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)
This commit is contained in:
		
							
								
								
									
										17
									
								
								runtime/autoload/dist/ft.vim
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								runtime/autoload/dist/ft.vim
									
									
									
									
										vendored
									
									
								
							| @@ -219,6 +219,23 @@ func dist#ft#FTe() | |||||||
|   endif |   endif | ||||||
| endfunc | 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 | " Distinguish between HTML, XHTML and Django | ||||||
| func dist#ft#FThtml() | func dist#ft#FThtml() | ||||||
|   let n = 1 |   let n = 1 | ||||||
|   | |||||||
| @@ -139,18 +139,19 @@ can be used to overrule the filetype used for certain extensions: | |||||||
|  |  | ||||||
| 	file name	variable ~ | 	file name	variable ~ | ||||||
| 	*.asa		g:filetype_asa	|ft-aspvbs-syntax| |ft-aspperl-syntax| | 	*.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| | 	*.asm		g:asmsyntax	|ft-asm-syntax| | ||||||
| 	*.prg		g:filetype_prg | 	*.asp		g:filetype_asp	|ft-aspvbs-syntax| |ft-aspperl-syntax| | ||||||
| 	*.pl		g:filetype_pl | 	*.fs		g:filetype_fs   |ft-forth-syntax| | ||||||
| 	*.inc		g:filetype_inc |  | ||||||
| 	*.w		g:filetype_w	|ft-cweb-syntax| |  | ||||||
| 	*.i		g:filetype_i	|ft-progress-syntax| | 	*.i		g:filetype_i	|ft-progress-syntax| | ||||||
|  | 	*.inc		g:filetype_inc | ||||||
| 	*.m		g:filetype_m	|ft-mathematica-syntax| | 	*.m		g:filetype_m	|ft-mathematica-syntax| | ||||||
| 	*.p		g:filetype_p	|ft-pascal-syntax| | 	*.p		g:filetype_p	|ft-pascal-syntax| | ||||||
|  | 	*.pl		g:filetype_pl | ||||||
| 	*.pp		g:filetype_pp	|ft-pascal-syntax| | 	*.pp		g:filetype_pp	|ft-pascal-syntax| | ||||||
|  | 	*.prg		g:filetype_prg | ||||||
| 	*.sh		g:bash_is_sh	|ft-sh-syntax| | 	*.sh		g:bash_is_sh	|ft-sh-syntax| | ||||||
| 	*.tex		g:tex_flavor	|ft-tex-plugin| | 	*.tex		g:tex_flavor	|ft-tex-plugin| | ||||||
|  | 	*.w		g:filetype_w	|ft-cweb-syntax| | ||||||
|  |  | ||||||
| 							*filetype-ignore* | 							*filetype-ignore* | ||||||
| To avoid that certain files are being inspected, the g:ft_ignore_pat variable | 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 | For further discussion of fortran_have_tabs and the method used for the | ||||||
| detection of source format see |ft-fortran-syntax|. | 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* | GIT COMMIT                                              *ft-gitcommit-plugin* | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1533,6 +1533,14 @@ gvim display.  Here, statements are colored LightYellow instead of Yellow, and | |||||||
| conditionals are LightBlue for better distinction. | 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* | FORTRAN					*fortran.vim* *ft-fortran-syntax* | ||||||
|  |  | ||||||
| Default highlighting and dialect ~ | Default highlighting and dialect ~ | ||||||
|   | |||||||
| @@ -632,7 +632,10 @@ 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 *.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 | " Reva Forth | ||||||
| au BufNewFile,BufRead *.frt			setf reva | au BufNewFile,BufRead *.frt			setf reva | ||||||
|   | |||||||
| @@ -198,6 +198,10 @@ if s:line1 =~# "^#!" | |||||||
|   elseif s:name =~# 'fish\>' |   elseif s:name =~# 'fish\>' | ||||||
|     set ft=fish |     set ft=fish | ||||||
|  |  | ||||||
|  |     " Gforth | ||||||
|  |   elseif s:name =~# 'gforth\>' | ||||||
|  |     set ft=forth | ||||||
|  |  | ||||||
|   endif |   endif | ||||||
|   unlet s:name |   unlet s:name | ||||||
|  |  | ||||||
|   | |||||||
| @@ -182,11 +182,12 @@ let s:filename_checks = { | |||||||
|     \ 'fgl': ['file.4gl', 'file.4gh', 'file.m4gl'], |     \ 'fgl': ['file.4gl', 'file.4gh', 'file.m4gl'], | ||||||
|     \ 'fish': ['file.fish'], |     \ 'fish': ['file.fish'], | ||||||
|     \ 'focexec': ['file.fex', 'file.focexec'], |     \ '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'], |     \ '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'], | ||||||
|     \ 'freebasic': ['file.fb', 'file.bi'], |     \ 'freebasic': ['file.fb', 'file.bi'], | ||||||
|  |     \ 'fs': ['file.fs'], | ||||||
|     \ 'fstab': ['fstab', 'mtab'], |     \ 'fstab': ['fstab', 'mtab'], | ||||||
|     \ 'fvwm': ['/.fvwm/file', 'any/.fvwm/file'], |     \ 'fvwm': ['/.fvwm/file', 'any/.fvwm/file'], | ||||||
|     \ 'gdb': ['.gdbinit', 'gdbinit'], |     \ 'gdb': ['.gdbinit', 'gdbinit'], | ||||||
| @@ -664,6 +665,7 @@ let s:script_checks = { | |||||||
|       \ 'fennel': [['#!/path/fennel']], |       \ 'fennel': [['#!/path/fennel']], | ||||||
|       \ 'routeros': [['#!/path/rsc']], |       \ 'routeros': [['#!/path/rsc']], | ||||||
|       \ 'fish': [['#!/path/fish']], |       \ 'fish': [['#!/path/fish']], | ||||||
|  |       \ 'forth': [['#!/path/gforth']], | ||||||
|       \ } |       \ } | ||||||
|  |  | ||||||
| " Various forms of "env" optional arguments. | " Various forms of "env" optional arguments. | ||||||
| @@ -970,4 +972,57 @@ func Test_xpm_file() | |||||||
|   filetype off |   filetype off | ||||||
| endfunc | 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 | " vim: shiftwidth=2 sts=2 expandtab | ||||||
|   | |||||||
| @@ -757,6 +757,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 */ | ||||||
|  | /**/ | ||||||
|  |     3686, | ||||||
| /**/ | /**/ | ||||||
|     3685, |     3685, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user