diff options
Diffstat (limited to '')
-rw-r--r-- | autoload/polyglot/ft.vim | 739 |
1 files changed, 371 insertions, 368 deletions
diff --git a/autoload/polyglot/ft.vim b/autoload/polyglot/ft.vim index a8ca9008..92c65ac1 100644 --- a/autoload/polyglot/ft.vim +++ b/autoload/polyglot/ft.vim @@ -1,83 +1,89 @@ -vim9script +" Vim functions for file type detection +" +" Maintainer: Bram Moolenaar <Bram@vim.org> +" Last Change: 2022 Jan 31 -# Vim functions for file type detection -# -# Maintainer: Bram Moolenaar <Bram@vim.org> -# Last Change: 2022 Feb 05 +" These functions are moved here from runtime/filetype.vim to make startup +" faster. -# These functions are moved here from runtime/filetype.vim to make startup -# faster. +" Line continuation is used here, remove 'C' from 'cpoptions' +let s:cpo_save = &cpo +set cpo&vim -export def Check_inp() +func polyglot#ft#Check_inp() if getline(1) =~ '^\*' setf abaqus else - var n = 1 - var nmax = line("$") > 500 ? 500 : line("$") + let n = 1 + if line("$") > 500 + let nmax = 500 + else + let nmax = line("$") + endif while n <= nmax if getline(n) =~? "^header surface data" setf trasys break endif - n += 1 + let n = n + 1 endwhile endif -enddef +endfunc -# This function checks for the kind of assembly that is wanted by the user, or -# can be detected from the first five lines of the file. -export def FTasm() - # make sure b:asmsyntax exists +" This function checks for the kind of assembly that is wanted by the user, or +" can be detected from the first five lines of the file. +func polyglot#ft#FTasm() + " make sure b:asmsyntax exists if !exists("b:asmsyntax") - b:asmsyntax = "" + let b:asmsyntax = "" endif if b:asmsyntax == "" - FTasmsyntax() + call polyglot#ft#FTasmsyntax() endif - # if b:asmsyntax still isn't set, default to asmsyntax or GNU + " if b:asmsyntax still isn't set, default to asmsyntax or GNU if b:asmsyntax == "" if exists("g:asmsyntax") - b:asmsyntax = g:asmsyntax + let b:asmsyntax = g:asmsyntax else - b:asmsyntax = "asm" + let b:asmsyntax = "asm" endif endif - exe "setf " .. fnameescape(b:asmsyntax) -enddef + exe "setf " . fnameescape(b:asmsyntax) +endfunc -export def FTasmsyntax() - # see if the file contains any asmsyntax=foo overrides. If so, change - # b:asmsyntax appropriately - var head = " " .. getline(1) .. " " .. getline(2) .. " " - .. getline(3) .. " " .. getline(4) .. " " .. getline(5) .. " " - var match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s') +func polyglot#ft#FTasmsyntax() + " see if file contains any asmsyntax=foo overrides. If so, change + " b:asmsyntax appropriately + let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4). + \" ".getline(5)." " + let match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s') if match != '' - b:asmsyntax = match + let b:asmsyntax = match elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? '\.macro') || (head =~? '\.subtitle') || (head =~? '\.library')) - b:asmsyntax = "vmasm" + let b:asmsyntax = "vmasm" endif -enddef +endfunc -var ft_visual_basic_content = '\cVB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)' +let s:ft_visual_basic_content = '\cVB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)' -# See FTfrm() for Visual Basic form file detection -export def FTbas() +" See FTfrm() for Visual Basic form file detection +func polyglot#ft#FTbas() if exists("g:filetype_bas") - exe "setf " .. g:filetype_bas + exe "setf " . g:filetype_bas return endif - # most frequent FreeBASIC-specific keywords in distro files - var fb_keywords = '\c^\s*\%(extern\|var\|enum\|private\|scope\|union\|byref\|operator\|constructor\|delete\|namespace\|public\|property\|with\|destructor\|using\)\>\%(\s*[:=(]\)\@!' - var fb_preproc = '\c^\s*\%(#\a\+\|option\s\+\%(byval\|dynamic\|escape\|\%(no\)\=gosub\|nokeyword\|private\|static\)\>\)' - var fb_comment = "^\\s*/'" - # OPTION EXPLICIT, without the leading underscore, is common to many dialects - var qb64_preproc = '\c^\s*\%($\a\+\|option\s\+\%(_explicit\|_\=explicitarray\)\>\)' + " most frequent FreeBASIC-specific keywords in distro files + let fb_keywords = '\c^\s*\%(extern\|var\|enum\|private\|scope\|union\|byref\|operator\|constructor\|delete\|namespace\|public\|property\|with\|destructor\|using\)\>\%(\s*[:=(]\)\@!' + let fb_preproc = '\c^\s*\%(#\a\+\|option\s\+\%(byval\|dynamic\|escape\|\%(no\)\=gosub\|nokeyword\|private\|static\)\>\)' + let fb_comment = "^\\s*/'" + " OPTION EXPLICIT, without the leading underscore, is common to many dialects + let qb64_preproc = '\c^\s*\%($\a\+\|option\s\+\%(_explicit\|_\=explicitarray\)\>\)' - var lines = getline(1, min([line("$"), 100])) + let lines = getline(1, min([line("$"), 100])) if match(lines, fb_preproc) > -1 || match(lines, fb_comment) > -1 || match(lines, fb_keywords) > -1 setf freebasic @@ -88,40 +94,39 @@ export def FTbas() else setf basic endif -enddef +endfunc -export def FTbtm() +func polyglot#ft#FTbtm() if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm setf dosbatch else setf btm endif -enddef +endfunc -export def BindzoneCheck(default = '') - if getline(1) .. getline(2) .. getline(3) .. getline(4) - =~ '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA' +func polyglot#ft#BindzoneCheck(default) + if getline(1).getline(2).getline(3).getline(4) =~ '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA' setf bindzone - elseif default != '' - exe 'setf ' .. default + elseif a:default != '' + exe 'setf ' . a:default endif -enddef +endfunc -export def FTlpc() +func polyglot#ft#FTlpc() if exists("g:lpc_syntax_for_c") - var lnum = 1 + let lnum = 1 while lnum <= 12 if getline(lnum) =~# '^\(//\|inherit\|private\|protected\|nosave\|string\|object\|mapping\|mixed\)' setf lpc return endif - lnum += 1 + let lnum = lnum + 1 endwhile endif setf c -enddef +endfunc -export def FTheader() +func polyglot#ft#FTheader() if match(getline(1, min([line("$"), 200])), '^@\(interface\|end\|class\)') > -1 if exists("g:c_syntax_for_h") setf objc @@ -135,15 +140,15 @@ export def FTheader() else setf cpp endif -enddef +endfunc -# This function checks if one of the first ten lines start with a '@'. In -# that case it is probably a change file. -# If the first line starts with # or ! it's probably a ch file. -# If a line has "main", "include", "//" or "/*" it's probably ch. -# Otherwise CHILL is assumed. -export def FTchange() - var lnum = 1 +" This function checks if one of the first ten lines start with a '@'. In +" that case it is probably a change file. +" If the first line starts with # or ! it's probably a ch file. +" If a line has "main", "include", "//" or "/*" it's probably ch. +" Otherwise CHILL is assumed. +func polyglot#ft#FTchange() + let lnum = 1 while lnum <= 10 if getline(lnum)[0] == '@' setf change @@ -161,101 +166,101 @@ export def FTchange() setf ch return endif - lnum += 1 + let lnum = lnum + 1 endwhile setf chill -enddef +endfunc -export def FTent() - # This function checks for valid cl syntax in the first five lines. - # Look for either an opening comment, '#', or a block start, '{". - # If not found, assume SGML. - var lnum = 1 +func polyglot#ft#FTent() + " This function checks for valid cl syntax in the first five lines. + " Look for either an opening comment, '#', or a block start, '{". + " If not found, assume SGML. + let lnum = 1 while lnum < 6 - var line = getline(lnum) + let line = getline(lnum) if line =~ '^\s*[#{]' setf cl return elseif line !~ '^\s*$' - # Not a blank line, not a comment, and not a block start, - # so doesn't look like valid cl code. + " Not a blank line, not a comment, and not a block start, + " so doesn't look like valid cl code. break endif - lnum += 1 + let lnum = lnum + 1 endw setf dtd -enddef +endfunc -export def ExCheck() - var lines = getline(1, min([line("$"), 100])) +func polyglot#ft#ExCheck() + let lines = getline(1, min([line("$"), 100])) if exists('g:filetype_euphoria') - exe 'setf ' .. g:filetype_euphoria + exe 'setf ' . g:filetype_euphoria elseif match(lines, '^--\|^ifdef\>\|^include\>') > -1 setf euphoria3 else setf elixir endif -enddef +endfunc -export def EuphoriaCheck() +func polyglot#ft#EuphoriaCheck() if exists('g:filetype_euphoria') - exe 'setf ' .. g:filetype_euphoria + exe 'setf ' . g:filetype_euphoria else setf euphoria3 endif -enddef +endfunc -export def DtraceCheck() - var lines = getline(1, min([line("$"), 100])) +func polyglot#ft#DtraceCheck() + let lines = getline(1, min([line("$"), 100])) if match(lines, '^module\>\|^import\>') > -1 - # D files often start with a module and/or import statement. + " D files often start with a module and/or import statement. setf d elseif match(lines, '^#!\S\+dtrace\|#pragma\s\+D\s\+option\|:\S\{-}:\S\{-}:') > -1 setf dtrace else setf d endif -enddef +endfunc -export def FTe() +func polyglot#ft#FTe() if exists('g:filetype_euphoria') - exe 'setf ' .. g:filetype_euphoria + exe 'setf ' . g:filetype_euphoria else - var n = 1 + let n = 1 while n < 100 && n <= line("$") if getline(n) =~ "^\\s*\\(<'\\|'>\\)\\s*$" setf specman return endif - n += 1 + let n = n + 1 endwhile setf eiffel endif -enddef +endfunc -export def FTfrm() +func polyglot#ft#FTfrm() if exists("g:filetype_frm") - exe "setf " .. g:filetype_frm + exe "setf " . g:filetype_frm return endif - var lines = getline(1, min([line("$"), 5])) + let lines = getline(1, min([line("$"), 5])) if match(lines, s:ft_visual_basic_content) > -1 setf vb else setf form endif -enddef +endfunc -# Distinguish between Forth and F#. -# Provided by Doug Kearns. -export def FTfs() +" Distinguish between Forth and F#. +" Provided by Doug Kearns. +func polyglot#ft#FTfs() if exists("g:filetype_fs") - exe "setf " .. g:filetype_fs + exe "setf " . g:filetype_fs else - var line = getline(nextnonblank(1)) - # comments and colon definitions + let line = getline(nextnonblank(1)) + " comments and colon definitions if line =~ '^\s*\.\=( ' || line =~ '^\s*\\G\= ' || line =~ '^\\$' \ || line =~ '^\s*: \S' setf forth @@ -263,11 +268,11 @@ export def FTfs() setf fsharp endif endif -enddef +endfunc -# Distinguish between HTML, XHTML and Django -export def FThtml() - var n = 1 +" Distinguish between HTML, XHTML and Django +func polyglot#ft#FThtml() + let n = 1 while n < 10 && n <= line("$") if getline(n) =~ '\<DTD\s\+XHTML\s' setf xhtml @@ -277,58 +282,58 @@ export def FThtml() setf htmldjango return endif - n += 1 + let n = n + 1 endwhile setf FALLBACK html -enddef +endfunc -# Distinguish between standard IDL and MS-IDL -export def FTidl() - var n = 1 +" Distinguish between standard IDL and MS-IDL +func polyglot#ft#FTidl() + let n = 1 while n < 50 && n <= line("$") if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"' setf msidl return endif - n += 1 + let n = n + 1 endwhile setf idl -enddef - -# Distinguish between "default" and Cproto prototype file. */ -export def ProtoCheck(default: string) - # Cproto files have a comment in the first line and a function prototype in - # the second line, it always ends in ";". Indent files may also have - # comments, thus we can't match comments to see the difference. - # IDL files can have a single ';' in the second line, require at least one - # chacter before the ';'. +endfunc + +" Distinguish between "default" and Cproto prototype file. */ +func polyglot#ft#ProtoCheck(default) + " Cproto files have a comment in the first line and a function prototype in + " the second line, it always ends in ";". Indent files may also have + " comments, thus we can't match comments to see the difference. + " IDL files can have a single ';' in the second line, require at least one + " chacter before the ';'. if getline(2) =~ '.;$' setf cpp else - exe 'setf ' .. default + exe 'setf ' . a:default endif -enddef +endfunc -export def FTm() +func polyglot#ft#FTm() if exists("g:filetype_m") - exe "setf " .. g:filetype_m + exe "setf " . g:filetype_m return endif - # excluding end(for|function|if|switch|while) common to Murphi - var octave_block_terminators = '\<end\%(_try_catch\|classdef\|enumeration\|events\|methods\|parfor\|properties\)\>' + " excluding end(for|function|if|switch|while) common to Murphi + let octave_block_terminators = '\<end\%(_try_catch\|classdef\|enumeration\|events\|methods\|parfor\|properties\)\>' - var objc_preprocessor = '^\s*#\s*\%(import\|include\|define\|if\|ifn\=def\|undef\|line\|error\|pragma\)\>' + let objc_preprocessor = '^\s*#\s*\%(import\|include\|define\|if\|ifn\=def\|undef\|line\|error\|pragma\)\>' - var n = 1 - var saw_comment = 0 # Whether we've seen a multiline comment leader. + let n = 1 + let saw_comment = 0 " Whether we've seen a multiline comment leader. while n < 100 - var line = getline(n) + let line = getline(n) if line =~ '^\s*/\*' - # /* ... */ is a comment in Objective C and Murphi, so we can't conclude - # it's either of them yet, but track this as a hint in case we don't see - # anything more definitive. - saw_comment = 1 + " /* ... */ is a comment in Objective C and Murphi, so we can't conclude + " it's either of them yet, but track this as a hint in case we don't see + " anything more definitive. + let saw_comment = 1 endif if line =~ '^\s*//' || line =~ '^\s*@import\>' || line =~ objc_preprocessor setf objc @@ -339,7 +344,7 @@ export def FTm() setf octave return endif - # TODO: could be Matlab or Octave + " TODO: could be Matlab or Octave if line =~ '^\s*%' setf matlab return @@ -352,24 +357,24 @@ export def FTm() setf murphi return endif - n += 1 + let n = n + 1 endwhile if saw_comment - # We didn't see anything definitive, but this looks like either Objective C - # or Murphi based on the comment leader. Assume the former as it is more - # common. + " We didn't see anything definitive, but this looks like either Objective C + " or Murphi based on the comment leader. Assume the former as it is more + " common. setf objc else - # Default is Matlab + " Default is Matlab setf matlab endif -enddef +endfunc -export def FTmms() - var n = 1 +func polyglot#ft#FTmms() + let n = 1 while n < 20 - var line = getline(n) + let line = getline(n) if line =~ '^\s*\(%\|//\)' || line =~ '^\*' setf mmix return @@ -378,78 +383,78 @@ export def FTmms() setf make return endif - n += 1 + let n = n + 1 endwhile setf mmix -enddef +endfunc -# This function checks if one of the first five lines start with a dot. In -# that case it is probably an nroff file: 'filetype' is set and 1 is returned. -export def FTnroff(): number - if getline(1)[0] .. getline(2)[0] .. getline(3)[0] - .. getline(4)[0] .. getline(5)[0] =~ '\.' +" This function checks if one of the first five lines start with a dot. In +" that case it is probably an nroff file: 'filetype' is set and 1 is returned. +func polyglot#ft#FTnroff() + if getline(1)[0] . getline(2)[0] . getline(3)[0] . getline(4)[0] . getline(5)[0] =~ '\.' setf nroff return 1 endif return 0 -enddef +endfunc -export def FTmm() - var n = 1 +func polyglot#ft#FTmm() + let n = 1 while n < 20 - if getline(n) =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)' + let line = getline(n) + if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)' setf objcpp return endif - n += 1 + let n = n + 1 endwhile setf nroff -enddef +endfunc -export def FTpl() +func polyglot#ft#FTpl() if exists("g:filetype_pl") - exe "setf " .. g:filetype_pl + exe "setf " . g:filetype_pl 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)) + " recognize Prolog by specific text in the first non-empty line + " require a blank after the '%' because Perl uses "%list" and "%translate" + let l = getline(nextnonblank(1)) if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-' setf prolog else setf perl endif endif -enddef +endfunc -export def FTinc() +func polyglot#ft#FTinc() if exists("g:filetype_inc") - exe "setf " .. g:filetype_inc + exe "setf " . g:filetype_inc else - var lines = getline(1) .. getline(2) .. getline(3) + let lines = getline(1).getline(2).getline(3) if lines =~? "perlscript" setf aspperl elseif lines =~ "<%" setf aspvbs elseif lines =~ "<?" setf php - # Pascal supports // comments but they're vary rarely used for file - # headers so assume POV-Ray + " Pascal supports // comments but they're vary rarely used for file + " headers so assume POV-Ray elseif lines =~ '^\s*\%({\|(\*\)' || lines =~? s:ft_pascal_keywords setf pascal else - FTasmsyntax() + call polyglot#ft#FTasmsyntax() if exists("b:asmsyntax") - exe "setf " .. fnameescape(b:asmsyntax) + exe "setf " . fnameescape(b:asmsyntax) else setf pov endif endif endif -enddef +endfunc -export def FTprogress_cweb() +func polyglot#ft#FTprogress_cweb() if exists("g:filetype_w") - exe "setf " .. g:filetype_w + exe "setf " . g:filetype_w return endif if getline(1) =~ '&ANALYZE' || getline(3) =~ '&GLOBAL-DEFINE' @@ -457,76 +462,76 @@ export def FTprogress_cweb() else setf cweb endif -enddef +endfunc -export def FTprogress_asm() +func polyglot#ft#FTprogress_asm() if exists("g:filetype_i") - exe "setf " .. g:filetype_i + exe "setf " . g:filetype_i return endif - # This function checks for an assembly comment the first ten lines. - # If not found, assume Progress. - var lnum = 1 + " This function checks for an assembly comment the first ten lines. + " If not found, assume Progress. + let lnum = 1 while lnum <= 10 && lnum < line('$') - var line = getline(lnum) + let line = getline(lnum) if line =~ '^\s*;' || line =~ '^\*' - FTasm() + call polyglot#ft#FTasm() return elseif line !~ '^\s*$' || line =~ '^/\*' - # Not an empty line: Doesn't look like valid assembly code. - # Or it looks like a Progress /* comment + " Not an empty line: Doesn't look like valid assembly code. + " Or it looks like a Progress /* comment break endif - lnum += 1 + let lnum = lnum + 1 endw setf progress -enddef +endfunc -var ft_pascal_comments = '^\s*\%({\|(\*\|//\)' -var ft_pascal_keywords = '^\s*\%(program\|unit\|library\|uses\|begin\|procedure\|function\|const\|type\|var\)\>' +let s:ft_pascal_comments = '^\s*\%({\|(\*\|//\)' +let s:ft_pascal_keywords = '^\s*\%(program\|unit\|library\|uses\|begin\|procedure\|function\|const\|type\|var\)\>' -export def FTprogress_pascal() +func polyglot#ft#FTprogress_pascal() if exists("g:filetype_p") - exe "setf " .. g:filetype_p + exe "setf " . g:filetype_p return endif - # This function checks for valid Pascal syntax in the first ten lines. - # Look for either an opening comment or a program start. - # If not found, assume Progress. - var lnum = 1 + " This function checks for valid Pascal syntax in the first ten lines. + " Look for either an opening comment or a program start. + " If not found, assume Progress. + let lnum = 1 while lnum <= 10 && lnum < line('$') - var line = getline(lnum) + let line = getline(lnum) if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords setf pascal return elseif line !~ '^\s*$' || line =~ '^/\*' - # Not an empty line: Doesn't look like valid Pascal code. - # Or it looks like a Progress /* comment + " Not an empty line: Doesn't look like valid Pascal code. + " Or it looks like a Progress /* comment break endif - lnum += 1 + let lnum = lnum + 1 endw setf progress -enddef +endfunc -export def FTpp() +func polyglot#ft#FTpp() if exists("g:filetype_pp") - exe "setf " .. g:filetype_pp + exe "setf " . g:filetype_pp else - var line = getline(nextnonblank(1)) + let line = getline(nextnonblank(1)) if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords setf pascal else setf puppet endif endif -enddef +endfunc -export def FTr() - var max = line("$") > 50 ? 50 : line("$") +func polyglot#ft#FTr() + let max = line("$") > 50 ? 50 : line("$") for n in range(1, max) - # Rebol is easy to recognize, check for that first + " Rebol is easy to recognize, check for that first if getline(n) =~? '\<REBOL\>' setf rebol return @@ -534,82 +539,82 @@ export def FTr() endfor for n in range(1, max) - # R has # comments + " R has # comments if getline(n) =~ '^\s*#' setf r return endif - # Rexx has /* comments */ + " Rexx has /* comments */ if getline(n) =~ '^\s*/\*' setf rexx return endif endfor - # Nothing recognized, use user default or assume Rexx + " Nothing recognized, use user default or assume Rexx if exists("g:filetype_r") - exe "setf " .. g:filetype_r + exe "setf " . g:filetype_r else - # Rexx used to be the default, but R appears to be much more popular. + " Rexx used to be the default, but R appears to be much more popular. setf r endif -enddef +endfunc -export def McSetf() - # Rely on the file to start with a comment. - # MS message text files use ';', Sendmail files use '#' or 'dnl' +func polyglot#ft#McSetf() + " Rely on the file to start with a comment. + " MS message text files use ';', Sendmail files use '#' or 'dnl' for lnum in range(1, min([line("$"), 20])) - var line = getline(lnum) + let line = getline(lnum) if line =~ '^\s*\(#\|dnl\)' - setf m4 # Sendmail .mc file + setf m4 " Sendmail .mc file return elseif line =~ '^\s*;' - setf msmessages # MS Message text file + setf msmessages " MS Message text file return endif endfor setf m4 " Default: Sendmail .mc file -enddef +endfunc -# Called from filetype.vim and scripts.vim. -export def SetFileTypeSH(name: string) +" Called from filetype.vim and scripts.vim. +func polyglot#ft#SetFileTypeSH(name) if did_filetype() - # Filetype was already detected + " 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") + if a:name =~ '\<csh\>' + " Some .sh scripts contain #!/bin/csh. + call polyglot#ft#SetFileTypeShell("csh") return - elseif name =~ '\<tcsh\>' - # Some .sh scripts contain #!/bin/tcsh. - SetFileTypeShell("tcsh") + elseif a:name =~ '\<tcsh\>' + " Some .sh scripts contain #!/bin/tcsh. + call polyglot#ft#SetFileTypeShell("tcsh") return - elseif name =~ '\<zsh\>' - # Some .sh scripts contain #!/bin/zsh. - SetFileTypeShell("zsh") + elseif a:name =~ '\<zsh\>' + " Some .sh scripts contain #!/bin/zsh. + call polyglot#ft#SetFileTypeShell("zsh") return - elseif name =~ '\<ksh\>' - b:is_kornshell = 1 + elseif a:name =~ '\<ksh\>' + let b:is_kornshell = 1 if exists("b:is_bash") unlet b:is_bash endif if exists("b:is_sh") unlet b:is_sh endif - elseif exists("g:bash_is_sh") || name =~ '\<bash\>' || name =~ '\<bash2\>' - b:is_bash = 1 + elseif exists("g:bash_is_sh") || a:name =~ '\<bash\>' || a:name =~ '\<bash2\>' + let b:is_bash = 1 if exists("b:is_kornshell") unlet b:is_kornshell endif if exists("b:is_sh") unlet b:is_sh endif - elseif name =~ '\<sh\>' - b:is_sh = 1 + elseif a:name =~ '\<sh\>' + let b:is_sh = 1 if exists("b:is_kornshell") unlet b:is_kornshell endif @@ -617,76 +622,75 @@ export def SetFileTypeSH(name: string) unlet b:is_bash endif endif - SetFileTypeShell("sh") -enddef + call polyglot#ft#SetFileTypeShell("sh") +endfunc -# 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) +" 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. +func polyglot#ft#SetFileTypeShell(name) if did_filetype() - # Filetype was already detected + " Filetype was already detected return endif if expand("<amatch>") =~ g:ft_ignore_pat return endif - var l = 2 + let l = 2 while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)' - # Skip empty and comment lines. - l += 1 + " Skip empty and comment lines. + let l = 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\+\([^ ]*/\)\=', '', '') + " Found an "exec" line after a comment with continuation + let n = substitute(getline(l),'\s*exec\s\+\([^ ]*/\)\=', '', '') if n =~ '\<tclsh\|\<wish' setf tcl return endif endif - exe "setf " .. name -enddef + exe "setf " . a:name +endfunc -export def CSH() +func polyglot#ft#CSH() if did_filetype() - # Filetype was already detected + " Filetype was already detected return endif if exists("g:filetype_csh") - SetFileTypeShell(g:filetype_csh) + call polyglot#ft#SetFileTypeShell(g:filetype_csh) elseif &shell =~ "tcsh" - SetFileTypeShell("tcsh") + call polyglot#ft#SetFileTypeShell("tcsh") else - SetFileTypeShell("csh") + call polyglot#ft#SetFileTypeShell("csh") endif -enddef +endfunc -var ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*' -export def FTRules() - var path = expand('<amatch>:p') +let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*' +func polyglot#ft#FTRules() + let path = expand('<amatch>:p') if path =~ '/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|\%(usr/\)\=lib/udev/\%(rules\.d/\)\=.*\.rules\)$' setf udevrules return endif if path =~ '^/etc/ufw/' - setf conf # Better than hog + setf conf " Better than hog return endif if path =~ '^/\(etc\|usr/share\)/polkit-1/rules\.d' setf javascript return endif - var config_lines: list<string> try - config_lines = readfile('/etc/udev/udev.conf') + let config_lines = readfile('/etc/udev/udev.conf') catch /^Vim\%((\a\+)\)\=:E484/ setf hog return endtry - var dir = expand('<amatch>:p:h') + let dir = expand('<amatch>:p:h') for line in config_lines if line =~ s:ft_rules_udev_rules_pattern - var udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "") + let udev_rules = substitute(line, s:ft_rules_udev_rules_pattern, '\1', "") if dir == udev_rules setf udevrules endif @@ -694,24 +698,24 @@ export def FTRules() endif endfor setf hog -enddef +endfunc -export def SQL() +func polyglot#ft#SQL() if exists("g:filetype_sql") - exe "setf " .. g:filetype_sql + exe "setf " . g:filetype_sql else setf sql endif -enddef +endfunc -# If the file has an extension of 't' and is in a directory 't' or 'xt' then -# it is almost certainly a Perl test file. -# If the first line starts with '#' and contains 'perl' it's probably a Perl -# file. -# (Slow test) If a file contains a 'use' statement then it is almost certainly -# a Perl file. -export def FTperl(): number - var dirname = expand("%:p:h:t") +" If the file has an extension of 't' and is in a directory 't' or 'xt' then +" it is almost certainly a Perl test file. +" If the first line starts with '#' and contains 'perl' it's probably a Perl +" file. +" (Slow test) If a file contains a 'use' statement then it is almost certainly +" a Perl file. +func polyglot#ft#FTperl() + let dirname = expand("%:p:h:t") if expand("%:e") == 't' && (dirname == 't' || dirname == 'xt') setf perl return 1 @@ -720,88 +724,86 @@ export def FTperl(): number setf perl return 1 endif - var save_cursor = getpos('.') - call cursor(1, 1) - var has_use = search('^use\s\s*\k', 'c', 30) > 0 + let save_cursor = getpos('.') + call cursor(1,1) + let has_use = search('^use\s\s*\k', 'c', 30) call setpos('.', save_cursor) if has_use setf perl return 1 endif return 0 -enddef - -# Choose context, plaintex, or tex (LaTeX) based on these rules: -# 1. Check the first line of the file for "%&<format>". -# 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords. -# 3. Default to "plain" or to g:tex_flavor, can be set in user's vimrc. -export def FTtex() - var firstline = getline(1) - var format: string +endfunc + +" Choose context, plaintex, or tex (LaTeX) based on these rules: +" 1. Check the first line of the file for "%&<format>". +" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords. +" 3. Default to "plain" or to g:tex_flavor, can be set in user's vimrc. +func polyglot#ft#FTtex() + let firstline = getline(1) if firstline =~ '^%&\s*\a\+' - format = tolower(matchstr(firstline, '\a\+')) - format = substitute(format, 'pdf', '', '') + let format = tolower(matchstr(firstline, '\a\+')) + let format = substitute(format, 'pdf', '', '') if format == 'tex' - format = 'latex' + let format = 'latex' elseif format == 'plaintex' - format = 'plain' + let format = 'plain' endif elseif expand('%') =~ 'tex/context/.*/.*.tex' - format = 'context' + let format = 'context' else - # Default value, may be changed later: - format = exists("g:tex_flavor") ? g:tex_flavor : 'plain' - # Save position, go to the top of the file, find first non-comment line. - var save_cursor = getpos('.') - call cursor(1, 1) - var firstNC = search('^\s*[^[:space:]%]', 'c', 1000) - if firstNC > 0 - # Check the next thousand lines for a LaTeX or ConTeXt keyword. - var lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>' - var cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>' - var kwline = search('^\s*\\\%(' .. lpat .. '\)\|^\s*\\\(' .. cpat .. '\)', - 'cnp', firstNC + 1000) - if kwline == 1 # lpat matched - format = 'latex' - elseif kwline == 2 # cpat matched - format = 'context' - endif # If neither matched, keep default set above. - # let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000) - # let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000) - # if cline > 0 - # let format = 'context' - # endif - # if lline > 0 && (cline == 0 || cline > lline) - # let format = 'tex' - # endif - endif # firstNC + " Default value, may be changed later: + let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain' + " Save position, go to the top of the file, find first non-comment line. + let save_cursor = getpos('.') + call cursor(1,1) + let firstNC = search('^\s*[^[:space:]%]', 'c', 1000) + if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword. + let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>' + let cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>' + let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)', + \ 'cnp', firstNC + 1000) + if kwline == 1 " lpat matched + let format = 'latex' + elseif kwline == 2 " cpat matched + let format = 'context' + endif " If neither matched, keep default set above. + " let lline = search('^\s*\\\%(' . lpat . '\)', 'cn', firstNC + 1000) + " let cline = search('^\s*\\\%(' . cpat . '\)', 'cn', firstNC + 1000) + " if cline > 0 + " let format = 'context' + " endif + " if lline > 0 && (cline == 0 || cline > lline) + " let format = 'tex' + " endif + endif " firstNC call setpos('.', save_cursor) - endif # firstline =~ '^%&\s*\a\+' + endif " firstline =~ '^%&\s*\a\+' - # Translation from formats to file types. TODO: add AMSTeX, RevTex, others? + " Translation from formats to file types. TODO: add AMSTeX, RevTex, others? if format == 'plain' setf plaintex elseif format == 'context' setf context - else # probably LaTeX + else " probably LaTeX setf tex endif return -enddef +endfunc -export def FTxml() - var n = 1 +func polyglot#ft#FTxml() + let n = 1 while n < 100 && n <= line("$") - var line = getline(n) - # DocBook 4 or DocBook 5. - var is_docbook4 = line =~ '<!DOCTYPE.*DocBook' - var is_docbook5 = line =~ ' xmlns="http://docbook.org/ns/docbook"' + let line = getline(n) + " DocBook 4 or DocBook 5. + let is_docbook4 = line =~ '<!DOCTYPE.*DocBook' + let is_docbook5 = line =~ ' xmlns="http://docbook.org/ns/docbook"' if is_docbook4 || is_docbook5 - b:docbk_type = "xml" + let b:docbk_type = "xml" if is_docbook5 - b:docbk_ver = 5 + let b:docbk_ver = 5 else - b:docbk_ver = 4 + let b:docbk_ver = 4 endif setf docbk return @@ -810,15 +812,15 @@ export def FTxml() setf xbl return endif - n += 1 + let n += 1 endwhile setf xml -enddef +endfunc -export def FTy() - var n = 1 +func polyglot#ft#FTy() + let n = 1 while n < 100 && n <= line("$") - var line = getline(n) + let line = getline(n) if line =~ '^\s*%' setf yacc return @@ -827,25 +829,25 @@ export def FTy() setf racc return endif - n += 1 + let n = n + 1 endwhile setf yacc -enddef +endfunc -export def Redif() - var lnum = 1 +func polyglot#ft#Redif() + let lnum = 1 while lnum <= 5 && lnum < line('$') if getline(lnum) =~ "^\ctemplate-type:" setf redif return endif - lnum += 1 + let lnum = lnum + 1 endwhile -enddef +endfunc -# This function is called for all files under */debian/patches/*, make sure not -# to non-dep3patch files, such as README and other text files. -export def Dep3patch() +" This function is called for all files under */debian/patches/*, make sure not +" to non-dep3patch files, such as README and other text files. +func polyglot#ft#Dep3patch() if expand('%:t') ==# 'series' return endif @@ -855,43 +857,44 @@ export def Dep3patch() setf dep3patch return elseif ln =~# '^---' - # end of headers found. stop processing + " end of headers found. stop processing return endif endfor -enddef - -# This function checks the first 15 lines for appearance of 'FoamFile' -# and then 'object' in a following line. -# In that case, it's probably an OpenFOAM file -export def FTfoam() - var ffile = 0 - var lnum = 1 +endfunc + +" This function checks the first 15 lines for appearance of 'FoamFile' +" and then 'object' in a following line. +" In that case, it's probably an OpenFOAM file +func polyglot#ft#FTfoam() + let ffile = 0 + let lnum = 1 while lnum <= 15 if getline(lnum) =~# '^FoamFile' - ffile = 1 + let ffile = 1 elseif ffile == 1 && getline(lnum) =~# '^\s*object' setf foam return endif - lnum += 1 + let lnum = lnum + 1 endwhile -enddef +endfunc -# Determine if a *.tf file is TF mud client or terraform -export def FTtf() - var numberOfLines = line('$') +" Determine if a *.tf file is TF mud client or terraform +func polyglot#ft#FTtf() + let numberOfLines = line('$') for i in range(1, numberOfLines) - var currentLine = trim(getline(i)) - var firstCharacter = currentLine[0] + let currentLine = trim(getline(i)) + let firstCharacter = currentLine[0] if firstCharacter !=? ";" && firstCharacter !=? "/" && firstCharacter !=? "" setf terraform return endif endfor setf tf -enddef +endfunc -# Uncomment this line to check for compilation errors early -# defcompile +" Restore 'cpoptions' +let &cpo = s:cpo_save +unlet s:cpo_save |