runtime(filetype): improve *.h filetype detection

Commit: 
https://github.com/vim/vim/commit/3041cf67d37cc23b79b17cc2c1c09feb7c22baf7
Author: Amelia Clarke <sel...@perilune.dev>
Date:   Sat Apr 19 11:48:10 2025 +0200

    runtime(filetype): improve *.h filetype detection
    
    This commit changes *.h files to default to C (instead of C++), and
    deprecates the existing `g:c_syntax_for_h` and `g:ch_syntax_for_h`
    variables in favor of a unified `g:filetype_h`, like is used for other
    ambiguous file extensions.
    
    closes: #17135
    
    Signed-off-by: Amelia Clarke <sel...@perilune.dev>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim
index a0be9302c..0c0b872f6 100644
--- a/runtime/autoload/dist/ft.vim
+++ b/runtime/autoload/dist/ft.vim
@@ -3,7 +3,7 @@ vim9script
 # Vim functions for file type detection
 #
 # Maintainer:          The Vim Project <https://github.com/vim/vim>
-# Last Change:         2025 Apr 15
+# Last Change:         2025 Apr 19
 # Former Maintainer:   Bram Moolenaar <b...@vim.org>
 
 # These functions are moved here from runtime/filetype.vim to make startup
@@ -203,19 +203,36 @@ export def FTlpc()
   setf c
 enddef
 
+# Searches within the first `maxlines` lines of the file for distinctive
+# Objective-C or C++ syntax and returns the appropriate filetype. Returns a
+# null_string if the search was inconclusive.
+def CheckObjCOrCpp(maxlines = 100): string
+  var n = 1
+  while n < maxlines && n <= line('$')
+    const line = getline(n)
+    if line =~ ' ^\s*\@%(class|interface|end)>'
+      return 'objcpp'
+    elseif line =~ ' ^\s*%(class|namespace|template|using)>'
+      return 'cpp'
+    endif
+    ++n
+  endwhile
+  return null_string
+enddef
+
+# Determines whether a *.h file is C, C++, Ch, or Objective-C/Objective-C++.
 export def FTheader()
-  if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') > 
-1
-    if exists("g:c_syntax_for_h")
-      setf objc
-    else
-      setf objcpp
-    endif
-  elseif exists("g:c_syntax_for_h")
+  if exists('g:filetype_h')
+    execute $'setf {g:filetype_h}'
+  elseif exists('g:c_syntax_for_h')
     setf c
-  elseif exists("g:ch_syntax_for_h")
+  elseif exists('g:ch_syntax_for_h')
     setf ch
   else
-    setf cpp
+    # Search the first 100 lines of the file for distinctive Objective-C or C++
+    # syntax and set the filetype accordingly. Otherwise, use C as the default
+    # filetype.
+    execute $'setf {CheckObjCOrCpp() ?? 'c'}'
   endif
 enddef
 
diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt
index c0bf1e616..77bf5f337 100644
--- a/runtime/doc/filetype.txt
+++ b/runtime/doc/filetype.txt
@@ -1,4 +1,4 @@
-*filetype.txt* For Vim version 9.1.  Last change: 2025 Apr 16
+*filetype.txt* For Vim version 9.1.  Last change: 2025 Apr 19
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -153,7 +153,11 @@ variables can be used to overrule the filetype used for 
certain extensions:
        *.f             g:filetype_f            |ft-forth-syntax|
        *.frm           g:filetype_frm          |ft-form-syntax|
        *.fs            g:filetype_fs           |ft-forth-syntax|
-       *.h             g:c_syntax_for_h        |ft-c-syntax|
+       *.h             g:c_syntax_for_h        |ft-c-syntax|   (deprecated)
+       *.h             g:ch_syntax_for_h       |ft-ch-syntax|  (deprecated)
+       *.h             g:filetype_h            |ft-c-syntax|
+                                               |ft-ch-syntax|
+                                               |ft-cpp-syntax|
        *.i             g:filetype_i            |ft-progress-syntax|
        *.inc           g:filetype_inc
        *.lsl           g:filetype_lsl
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index ae89bd9f1..a8fbe1a85 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -1,4 +1,4 @@
-*syntax.txt*   For Vim version 9.1.  Last change: 2025 Apr 15
+*syntax.txt*   For Vim version 9.1.  Last change: 2025 Apr 19
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1056,8 +1056,12 @@ Variable         Highlight ~
 *c_ansi_typedefs*       ... but do standard ANSI types
 *c_ansi_constants*      ... but do standard ANSI constants
 *c_no_utf*             don't highlight \u and \U in strings
-*c_syntax_for_h*       for *.h files use C syntax instead of C++ and use objc
-                       syntax instead of objcpp
+*c_syntax_for_h*       use C syntax for *.h files instead of C++/ObjC/ObjC++
+                       (NOTE: This variable is deprecated and no longer
+                        necessary, as *.h files now default to C, unless the
+                        file contains C++ or Objective-C syntax. If the
+                        automated detection fails, the default filetype can
+                        be adjusted using `g:filetype_h`.)
 *c_no_if0*             don't highlight "#if 0" blocks as comments
 *c_no_cformat*         don't highlight %-formats in strings
 *c_no_c99*             don't highlight C99 standard items
@@ -1116,8 +1120,11 @@ the C syntax file.  See |c.vim| for all the settings 
that are available for C.
 
 By setting a variable you can tell Vim to use Ch syntax for *.h files, instead
 of C or C++: >
-       :let ch_syntax_for_h = 1
+       :let g:filetype_h = 'ch'
 
+NOTE: In previous versions of Vim, the following (now-deprecated) variable was
+used, but is no longer the preferred approach: >
+       :let ch_syntax_for_h = 1
 
 CHILL                                          *chill.vim* *ft-chill-syntax*
 
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index e85007434..da74e25c0 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -1,7 +1,7 @@
 " Vim support file to detect file types
 "
 " Maintainer:  The Vim Project <https://github.com/vim/vim>
-" Last Change: 2025 Apr 18
+" Last Change: 2025 Apr 19
 " Former Maintainer:   Bram Moolenaar <b...@vim.org>
 
 " Listen very carefully, I will say this only once
@@ -436,9 +436,8 @@ au BufNewFile,BufRead *.ixx,*.mpp setf cpp
 " 
https://clang.llvm.org/docs/StandardCPlusPlusModules.html#file-name-requirement
 au BufNewFile,BufRead *.cppm,*.ccm,*.cxxm,*.c++m setf cpp
 
-" .h files can be C, Ch C++, ObjC or ObjC++.
-" Set c_syntax_for_h if you want C, ch_syntax_for_h if you want Ch. ObjC is
-" detected automatically.
+" .h files can be C, C++, Ch, Objective-C, or Objective-C++.
+" Set g_filetype_h to set a different filetype
 au BufNewFile,BufRead *.h                      call dist#ft#FTheader()
 
 " Ch (CHscript)

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1u64zT-00CLCi-1n%40256bit.org.

Raspunde prin e-mail lui