# HG changeset patch # User Bram Moolenaar # Date 1682196303 -7200 # Node ID 91bb2a8cc86686f3b111bee7bed966549160c59a # Parent 350996a79fc3665192b536f43c12eacc30242204 patch 9.0.1478: filetypes for *.v files not detected properly Commit: https://github.com/vim/vim/commit/80406c26188219f3773b2e9c49160caeeb386ee2 Author: Turiiya <34311583+tobealive@users.noreply.github.com> Date: Sat Apr 22 21:38:47 2023 +0100 patch 9.0.1478: filetypes for *.v files not detected properly Problem: Filetypes for *.v files not detected properly. Solution: Use the file contents to detect the filetype. (Turiiya, closes #12281) diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim --- a/runtime/autoload/dist/ft.vim +++ b/runtime/autoload/dist/ft.vim @@ -1106,5 +1106,40 @@ export def FTlsl() endif enddef +# Set the filetype of a *.v file to Verilog, V or Cog based on the first 200 +# lines. +export def FTv() + if did_filetype() + # ":setf" will do nothing, bail out early + return + endif + + for line in getline(1, 200) + if line[0] =~ '^\s*/' + # skip comment line + continue + endif + + # Verilog: line ends with ';' followed by an optional variable number of + # spaces and an optional start of a comment. + # Example: " b <= a + 1; // Add 1". + if line =~ ';\(\s*\)\?\(/.*\)\?$' + setf verilog + return + endif + + # Coq: line ends with a '.' followed by an optional variable number of + # spaces and an optional start of a comment. + # Example: "Definition x := 10. (*". + if line =~ '\.\(\s*\)\?\((\*.*\)\?$' + setf coq + return + endif + endfor + + # No line matched, fall back to "v". + setf v +enddef + # Uncomment this line to check for compilation errors early # defcompile diff --git a/runtime/filetype.vim b/runtime/filetype.vim --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -2303,8 +2303,8 @@ au BufNewFile,BufRead *.vr,*.vri,*.vrh " Vagrant (uses Ruby syntax) au BufNewFile,BufRead Vagrantfile setf ruby -" Verilog HDL -au BufNewFile,BufRead *.v setf verilog +" Verilog HDL, V or Coq +au BufNewFile,BufRead *.v call dist#ft#FTv() " Verilog-AMS HDL au BufNewFile,BufRead *.va,*.vams setf verilogams diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim --- a/src/testdir/test_filetype.vim +++ b/src/testdir/test_filetype.vim @@ -646,7 +646,6 @@ let s:filename_checks = { \ 'vdmrt': ['file.vdmrt'], \ 'vdmsl': ['file.vdm', 'file.vdmsl'], \ 'vera': ['file.vr', 'file.vri', 'file.vrh'], - \ 'verilog': ['file.v'], \ 'verilogams': ['file.va', 'file.vams'], \ 'vgrindefs': ['vgrindefs'], \ 'vhdl': ['file.hdl', 'file.vhd', 'file.vhdl', 'file.vbe', 'file.vst', 'file.vhdl_123', 'file.vho', 'some.vhdl_1', 'some.vhdl_1-file'], @@ -1771,6 +1770,27 @@ func Test_ttl_file() filetype off endfunc +func Test_v_file() + filetype on + + call writefile(['module tb; // Looks like a Verilog'], 'Xfile.v', 'D') + split Xfile.v + call assert_equal('verilog', &filetype) + bwipe! + + call writefile(['module main'], 'Xfile.v') + split Xfile.v + call assert_equal('v', &filetype) + bwipe! + + call writefile(['Definition x := 10. (*'], 'Xfile.v') + split Xfile.v + call assert_equal('coq', &filetype) + bwipe! + + filetype off +endfunc + func Test_xpm_file() filetype on diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 1478, +/**/ 1477, /**/ 1476,