Patch 9.0.1623
Problem:    The program to filetype translation is not exported.
Solution:   Export Exe2filetype().
Files:      runtime/autoload/dist/ft.vim, runtime/autoload/dist/script.vim


*** ../vim-9.0.1622/runtime/autoload/dist/ft.vim        2023-05-29 
19:59:38.217805411 +0100
--- runtime/autoload/dist/ft.vim        2023-06-09 20:57:34.635375695 +0100
***************
*** 3,9 ****
  # Vim functions for file type detection
  #
  # Maintainer: Bram Moolenaar <[email protected]>
! # Last Change:        2022 Apr 13
  
  # These functions are moved here from runtime/filetype.vim to make startup
  # faster.
--- 3,9 ----
  # Vim functions for file type detection
  #
  # Maintainer: Bram Moolenaar <[email protected]>
! # Last Change:        2023 Jun 09
  
  # These functions are moved here from runtime/filetype.vim to make startup
  # faster.
***************
*** 362,369 ****
    else
      # recognize Prolog by specific text in the first non-empty line
      # require a blank after the '%' because Perl uses "%list" and "%translate"
!     var l = getline(nextnonblank(1))
!     if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
        setf prolog
      else
        exe 'setf ' .. default
--- 362,369 ----
    else
      # recognize Prolog by specific text in the first non-empty line
      # require a blank after the '%' because Perl uses "%list" and "%translate"
!     var lnum = getline(nextnonblank(1))
!     if lnum =~ '\<prolog\>' || lnum =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || lnum =~ 
':-'
        setf prolog
      else
        exe 'setf ' .. default
***************
*** 472,483 ****
  def IsLProlog(): bool
    # skip apparent comments and blank lines, what looks like
    # LambdaProlog comment may be RAPID header
!   var l: number = nextnonblank(1)
!   while l > 0 && l < line('$') && getline(l) =~ '^\s*%' # LambdaProlog comment
!     l = nextnonblank(l + 1)
    endwhile
    # this pattern must not catch a go.mod file
!   return getline(l) =~ '\<module\s\+\w\+\s*\.\s*\(%\|$\)'
  enddef
  
  # Determine if *.mod is ABB RAPID, LambdaProlog, Modula-2, Modsim III or 
go.mod
--- 472,483 ----
  def IsLProlog(): bool
    # skip apparent comments and blank lines, what looks like
    # LambdaProlog comment may be RAPID header
!   var lnum: number = nextnonblank(1)
!   while lnum > 0 && lnum < line('$') && getline(lnum) =~ '^\s*%' # 
LambdaProlog comment
!     lnum = nextnonblank(lnum + 1)
    endwhile
    # this pattern must not catch a go.mod file
!   return getline(lnum) =~ '\<module\s\+\w\+\s*\.\s*\(%\|$\)'
  enddef
  
  # Determine if *.mod is ABB RAPID, LambdaProlog, Modula-2, Modsim III or 
go.mod
***************
*** 504,511 ****
    else
      # recognize Prolog by specific text in the first non-empty line
      # require a blank after the '%' because Perl uses "%list" and "%translate"
!     var l = getline(nextnonblank(1))
!     if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
        setf prolog
      else
        setf perl
--- 504,511 ----
    else
      # recognize Prolog by specific text in the first non-empty line
      # require a blank after the '%' because Perl uses "%list" and "%translate"
!     var line = getline(nextnonblank(1))
!     if line =~ '\<prolog\>' || line =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || line =~ 
':-'
        setf prolog
      else
        setf perl
***************
*** 678,703 ****
  enddef
  
  # Called from filetype.vim and scripts.vim.
! export def SetFileTypeSH(name: string)
!   if did_filetype()
      # Filetype was already detected
!     return
    endif
!   if expand("<amatch>") =~ g:ft_ignore_pat
!     return
    endif
    if name =~ '\<csh\>'
      # Some .sh scripts contain #!/bin/csh.
!     SetFileTypeShell("csh")
!     return
    elseif name =~ '\<tcsh\>'
      # Some .sh scripts contain #!/bin/tcsh.
!     SetFileTypeShell("tcsh")
!     return
    elseif name =~ '\<zsh\>'
      # Some .sh scripts contain #!/bin/zsh.
!     SetFileTypeShell("zsh")
!     return
    elseif name =~ '\<ksh\>'
      b:is_kornshell = 1
      if exists("b:is_bash")
--- 678,701 ----
  enddef
  
  # Called from filetype.vim and scripts.vim.
! # When "setft" is passed and false then the 'filetype' option is not set.
! export def SetFileTypeSH(name: string, setft = true): string
!   if setft && did_filetype()
      # Filetype was already detected
!     return ''
    endif
!   if setft && expand("<amatch>") =~ g:ft_ignore_pat
!     return ''
    endif
    if name =~ '\<csh\>'
      # Some .sh scripts contain #!/bin/csh.
!     return SetFileTypeShell("csh", setft)
    elseif name =~ '\<tcsh\>'
      # Some .sh scripts contain #!/bin/tcsh.
!     return SetFileTypeShell("tcsh", setft)
    elseif name =~ '\<zsh\>'
      # Some .sh scripts contain #!/bin/zsh.
!     return SetFileTypeShell("zsh", setft)
    elseif name =~ '\<ksh\>'
      b:is_kornshell = 1
      if exists("b:is_bash")
***************
*** 724,757 ****
        unlet b:is_bash
      endif
    endif
!   SetFileTypeShell("sh")
  enddef
  
  # For shell-like file types, check for an "exec" command hidden in a comment,
  # as used for Tcl.
  # Also called from scripts.vim, thus can't be local to this script.
! export def SetFileTypeShell(name: string)
!   if did_filetype()
      # Filetype was already detected
!     return
    endif
!   if expand("<amatch>") =~ g:ft_ignore_pat
!     return
    endif
!   var l = 2
!   while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)'
      # Skip empty and comment lines.
!     l += 1
    endwhile
!   if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ 
'^\s*#.*\\$'
      # Found an "exec" line after a comment with continuation
!     var n = substitute(getline(l), '\s*exec\s\+\([^ ]*/\)\=', '', '')
      if n =~ '\<tclsh\|\<wish'
!       setf tcl
!       return
      endif
    endif
!   exe "setf " .. name
  enddef
  
  export def CSH()
--- 722,764 ----
        unlet b:is_bash
      endif
    endif
! 
!   return SetFileTypeShell("sh", setft)
  enddef
  
  # For shell-like file types, check for an "exec" command hidden in a comment,
  # as used for Tcl.
+ # When "setft" is passed and false then the 'filetype' option is not set.
  # Also called from scripts.vim, thus can't be local to this script.
! export def SetFileTypeShell(name: string, setft = true): string
!   if setft && did_filetype()
      # Filetype was already detected
!     return ''
    endif
!   if setft && expand("<amatch>") =~ g:ft_ignore_pat
!     return ''
    endif
! 
!   var lnum = 2
!   while lnum < 20 && lnum < line("$") && getline(lnum) =~ '^\s*\(#\|$\)'
      # Skip empty and comment lines.
!     lnum += 1
    endwhile
!   if lnum < line("$") && getline(lnum) =~ '\s*exec\s' && getline(lnum - 1) =~ 
'^\s*#.*\\$'
      # Found an "exec" line after a comment with continuation
!     var n = substitute(getline(lnum), '\s*exec\s\+\([^ ]*/\)\=', '', '')
      if n =~ '\<tclsh\|\<wish'
!       if setft
!       setf tcl
!       endif
!       return 'tcl'
      endif
    endif
! 
!   if setft
!     exe "setf " .. name
!   endif
!   return name
  enddef
  
  export def CSH()
*** ../vim-9.0.1622/runtime/autoload/dist/script.vim    2023-06-08 
21:26:14.589704404 +0100
--- runtime/autoload/dist/script.vim    2023-06-09 20:50:06.360831720 +0100
***************
*** 4,10 ****
  # Invoked from "scripts.vim" in 'runtimepath'
  #
  # Maintainer: Bram Moolenaar <[email protected]>
! # Last Change:        2023 Jun 08
  
  export def DetectFiletype()
    var line1 = getline(1)
--- 4,10 ----
  # Invoked from "scripts.vim" in 'runtimepath'
  #
  # Maintainer: Bram Moolenaar <[email protected]>
! # Last Change:        2023 Jun 09
  
  export def DetectFiletype()
    var line1 = getline(1)
***************
*** 53,207 ****
      name = 'wish'
    endif
  
      # Bourne-like shell scripts: bash bash2 dash ksh ksh93 sh
    if name =~ '^\(bash\d*\|dash\|ksh\d*\|sh\)\>'
!     call dist#ft#SetFileTypeSH(line1)
  
      # csh scripts
    elseif name =~ '^csh\>'
!     if exists("g:filetype_csh")
!       call dist#ft#SetFileTypeShell(g:filetype_csh)
!     else
!       call dist#ft#SetFileTypeShell("csh")
!     endif
  
      # tcsh scripts
    elseif name =~ '^tcsh\>'
!     call dist#ft#SetFileTypeShell("tcsh")
  
      # Z shell scripts
    elseif name =~ '^zsh\>'
!     setl ft=zsh
  
      # TCL scripts
    elseif name =~ '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
!     setl ft=tcl
  
      # Expect scripts
    elseif name =~ '^expect\>'
!     setl ft=expect
  
      # Gnuplot scripts
    elseif name =~ '^gnuplot\>'
!     setl ft=gnuplot
  
      # Makefiles
    elseif name =~ 'make\>'
!     setl ft=make
  
      # Pike
    elseif name =~ '^pike\%(\>\|[0-9]\)'
!     setl ft=pike
  
      # Lua
    elseif name =~ 'lua'
!     setl ft=lua
  
      # Perl
    elseif name =~ 'perl'
!     setl ft=perl
  
      # PHP
    elseif name =~ 'php'
!     setl ft=php
  
      # Python
    elseif name =~ 'python'
!     setl ft=python
  
      # Groovy
    elseif name =~ '^groovy\>'
!     setl ft=groovy
  
      # Raku
    elseif name =~ 'raku'
!     setl ft=raku
  
      # Ruby
    elseif name =~ 'ruby'
!     setl ft=ruby
  
      # JavaScript
    elseif name =~ 'node\(js\)\=\>\|js\>' || name =~ 'rhino\>'
!     setl ft=javascript
  
      # BC calculator
    elseif name =~ '^bc\>'
!     setl ft=bc
  
      # sed
    elseif name =~ 'sed\>'
!     setl ft=sed
  
      # OCaml-scripts
    elseif name =~ 'ocaml'
!     setl ft=ocaml
  
      # Awk scripts; also finds "gawk"
    elseif name =~ 'awk\>'
!     setl ft=awk
  
      # Website MetaLanguage
    elseif name =~ 'wml'
!     setl ft=wml
  
      # Scheme scripts
    elseif name =~ 'scheme'
!     setl ft=scheme
  
      # CFEngine scripts
    elseif name =~ 'cfengine'
!     setl ft=cfengine
  
      # Erlang scripts
    elseif name =~ 'escript'
!     setl ft=erlang
  
      # Haskell
    elseif name =~ 'haskell'
!     setl ft=haskell
  
      # Scala
    elseif name =~ 'scala\>'
!     setl ft=scala
  
      # Clojure
    elseif name =~ 'clojure'
!     setl ft=clojure
  
      # Free Pascal
    elseif name =~ 'instantfpc\>'
!     setl ft=pascal
  
      # Fennel
    elseif name =~ 'fennel\>'
!     setl ft=fennel
  
      # MikroTik RouterOS script
    elseif name =~ 'rsc\>'
!     setl ft=routeros
  
      # Fish shell
    elseif name =~ 'fish\>'
!     setl ft=fish
  
      # Gforth
    elseif name =~ 'gforth\>'
!     setl ft=forth
  
      # Icon
    elseif name =~ 'icon\>'
!     setl ft=icon
  
      # Guile
    elseif name =~ 'guile'
!     setl ft=scheme
  
      # Nix
    elseif name =~ 'nix-shell'
!     setl ft=nix
  
    endif
  enddef
  
  
--- 53,216 ----
      name = 'wish'
    endif
  
+   var ft = Exe2filetype(name, line1)
+   if ft != ''
+     exe 'setl ft=' .. ft
+   endif
+ enddef
+ 
+ # Returns the filetype name associated with program "name".
+ # "line1" is the #! line at the top of the file.  Use the same as "name" if
+ # not available.
+ # Returns an empty string when not recognized.
+ export def Exe2filetype(name: string, line1: string): string
      # Bourne-like shell scripts: bash bash2 dash ksh ksh93 sh
    if name =~ '^\(bash\d*\|dash\|ksh\d*\|sh\)\>'
!     return dist#ft#SetFileTypeSH(line1, false)
  
      # csh scripts
    elseif name =~ '^csh\>'
!     return dist#ft#SetFileTypeShell(exists("g:filetype_csh") ? g:filetype_csh 
: 'csh', false)
  
      # tcsh scripts
    elseif name =~ '^tcsh\>'
!     return dist#ft#SetFileTypeShell("tcsh", false)
  
      # Z shell scripts
    elseif name =~ '^zsh\>'
!     return 'zsh'
  
      # TCL scripts
    elseif name =~ '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
!     return 'tcl'
  
      # Expect scripts
    elseif name =~ '^expect\>'
!     return 'expect'
  
      # Gnuplot scripts
    elseif name =~ '^gnuplot\>'
!     return 'gnuplot'
  
      # Makefiles
    elseif name =~ 'make\>'
!     return 'make'
  
      # Pike
    elseif name =~ '^pike\%(\>\|[0-9]\)'
!     return 'pike'
  
      # Lua
    elseif name =~ 'lua'
!     return 'lua'
  
      # Perl
    elseif name =~ 'perl'
!     return 'perl'
  
      # PHP
    elseif name =~ 'php'
!     return 'php'
  
      # Python
    elseif name =~ 'python'
!     return 'python'
  
      # Groovy
    elseif name =~ '^groovy\>'
!     return 'groovy'
  
      # Raku
    elseif name =~ 'raku'
!     return 'raku'
  
      # Ruby
    elseif name =~ 'ruby'
!     return 'ruby'
  
      # JavaScript
    elseif name =~ 'node\(js\)\=\>\|js\>' || name =~ 'rhino\>'
!     return 'javascript'
  
      # BC calculator
    elseif name =~ '^bc\>'
!     return 'bc'
  
      # sed
    elseif name =~ 'sed\>'
!     return 'sed'
  
      # OCaml-scripts
    elseif name =~ 'ocaml'
!     return 'ocaml'
  
      # Awk scripts; also finds "gawk"
    elseif name =~ 'awk\>'
!     return 'awk'
  
      # Website MetaLanguage
    elseif name =~ 'wml'
!     return 'wml'
  
      # Scheme scripts
    elseif name =~ 'scheme'
!     return 'scheme'
  
      # CFEngine scripts
    elseif name =~ 'cfengine'
!     return 'cfengine'
  
      # Erlang scripts
    elseif name =~ 'escript'
!     return 'erlang'
  
      # Haskell
    elseif name =~ 'haskell'
!     return 'haskell'
  
      # Scala
    elseif name =~ 'scala\>'
!     return 'scala'
  
      # Clojure
    elseif name =~ 'clojure'
!     return 'clojure'
  
      # Free Pascal
    elseif name =~ 'instantfpc\>'
!     return 'pascal'
  
      # Fennel
    elseif name =~ 'fennel\>'
!     return 'fennel'
  
      # MikroTik RouterOS script
    elseif name =~ 'rsc\>'
!     return 'routeros'
  
      # Fish shell
    elseif name =~ 'fish\>'
!     return 'fish'
  
      # Gforth
    elseif name =~ 'gforth\>'
!     return 'forth'
  
      # Icon
    elseif name =~ 'icon\>'
!     return 'icon'
  
      # Guile
    elseif name =~ 'guile'
!     return 'scheme'
  
      # Nix
    elseif name =~ 'nix-shell'
!     return 'nix'
  
    endif
+ 
+   return ''
  enddef
  
  
*** ../vim-9.0.1622/src/version.c       2023-06-09 19:19:59.627215494 +0100
--- src/version.c       2023-06-09 20:29:25.933527811 +0100
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1623,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
142. You dream about creating the world's greatest web site.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230609200229.11C271C0642%40moolenaar.net.

Raspunde prin e-mail lui