summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2020-09-16 15:50:39 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2020-09-16 15:50:39 +0200
commit17c2b630e1f0f0f02a24fcc664f0df91122e8e00 (patch)
tree09a54c87c97be6d400291b79b89368fab37ce234
parent271679272c7bb1a281c7404408a2414068abf91c (diff)
downloadvim-polyglot-17c2b630e1f0f0f02a24fcc664f0df91122e8e00.tar.gz
vim-polyglot-17c2b630e1f0f0f02a24fcc664f0df91122e8e00.zip
Write heuristics for perl, closes #550v4.10.2
-rw-r--r--README.md5
-rw-r--r--autoload/polyglot.vim103
-rw-r--r--autoload/sleuth.vim8
-rw-r--r--ftdetect/polyglot.vim141
-rw-r--r--ftplugin/bzl.vim98
-rw-r--r--ftplugin/prolog.vim24
-rw-r--r--heuristics.yaml69
-rw-r--r--indent/bzl.vim98
-rw-r--r--indent/prolog.vim71
-rw-r--r--packages.yaml39
-rwxr-xr-xscripts/build21
-rw-r--r--scripts/test_extensions.vim75
-rw-r--r--scripts/test_filetypes.vim8
-rw-r--r--syntax/bzl.vim20
-rw-r--r--syntax/prolog.vim122
-rw-r--r--syntax/tads.vim175
16 files changed, 1035 insertions, 42 deletions
diff --git a/README.md b/README.md
index 72c32ae1..4034fc26 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ A collection of language packs for Vim.
> One to rule them all, one to find them, one to bring them all and in the darkness bind them.
- It **won't affect your startup time**, as scripts are loaded only on demand\*.
-- It **installs and updates 120+ times faster** than the <!--Package Count-->196<!--/Package Count--> packages it consists of.
+- It **installs and updates 120+ times faster** than the <!--Package Count-->199<!--/Package Count--> packages it consists of.
- It is more secure because scripts loaded for all extensions are generated by vim-polyglot (ftdetect).
- Solid syntax and indentation support (other features skipped). Only the best language packs.
- All unnecessary files are ignored (like enormous documentation from php support).
@@ -81,6 +81,7 @@ If you need full functionality of any plugin, please use it directly with your p
- [basic](https://github.com/vim/vim/tree/master/runtime)
- [blade](https://github.com/jwalton512/vim-blade)
- [brewfile](https://github.com/bfontaine/Brewfile.vim)
+- [bzl](https://github.com/vim/vim/tree/master/runtime)
- [c/c++](https://github.com/vim-jp/vim-cpp)
- [caddyfile](https://github.com/isobit/vim-caddyfile)
- [carp](https://github.com/hellerve/carp-vim)
@@ -177,6 +178,7 @@ If you need full functionality of any plugin, please use it directly with your p
- [plantuml](https://github.com/aklt/plantuml-syntax)
- [pony](https://github.com/jakwings/vim-pony)
- [powershell](https://github.com/PProvost/vim-ps1)
+- [prolog](https://github.com/vim/vim/tree/master/runtime)
- [protobuf](https://github.com/uarun/vim-protobuf)
- [pug](https://github.com/digitaltoad/vim-pug)
- [puppet](https://github.com/rodjek/vim-puppet)
@@ -213,6 +215,7 @@ If you need full functionality of any plugin, please use it directly with your p
- [swift](https://github.com/keith/swift.vim)
- [sxhkd](https://github.com/baskerville/vim-sxhkdrc)
- [systemd](https://github.com/wgwoods/vim-systemd-syntax)
+- [tads](https://github.com/vim/vim/tree/master/runtime)
- [terraform](https://github.com/hashivim/vim-terraform)
- [textile](https://github.com/timcharper/textile.vim)
- [thrift](https://github.com/solarnz/thrift.vim)
diff --git a/autoload/polyglot.vim b/autoload/polyglot.vim
index 29287ece..5d4bfe9a 100644
--- a/autoload/polyglot.vim
+++ b/autoload/polyglot.vim
@@ -10,11 +10,11 @@ func! s:Setf(ft)
endif
endfunc
-func! polyglot#Heuristics()
+func! polyglot#Shebang()
" Try to detect filetype from shebang
- let l:filetype = polyglot#Shebang()
- if l:filetype != ""
- exec "setf " . l:filetype
+ let ft = polyglot#ShebangFiletype()
+ if ft != ""
+ call s:Setf(ft)
return 1
endif
@@ -52,6 +52,8 @@ let s:interpreters = {
\ 'cperl': 'perl',
\ 'perl': 'perl',
\ 'php': 'php',
+ \ 'swipl': 'prolog',
+ \ 'yap': 'prolog',
\ 'pwsh': 'ps1',
\ 'python': 'python',
\ 'python2': 'python',
@@ -95,7 +97,7 @@ let s:r_hashbang = '^#!\s*\(\S\+\)\s*\(.*\)\s*'
let s:r_envflag = '%(\S\+=\S\+\|-[iS]\|--ignore-environment\|--split-string\)'
let s:r_env = '^\%(\' . s:r_envflag . '\s\+\)*\(\S\+\)'
-func! polyglot#Shebang()
+func! polyglot#ShebangFiletype()
let l:line1 = getline(1)
if l:line1 !~# "^#!"
@@ -133,7 +135,7 @@ func! polyglot#Shebang()
endfunc
func! polyglot#DetectInpFiletype()
- let line = getline(1)
+ let line = getline(nextnonblank(1))
if line =~# '^\*'
call s:Setf('abaqus') | return
endif
@@ -269,10 +271,10 @@ func! polyglot#DetectIdrFiletype()
if line =~# '^%access .*'
call s:Setf('idris') | return
endif
- if exists("g:filetype_idr")
- call s:Setf(g:filetype_idr) | return
- endif
endfor
+ if exists("g:filetype_idr")
+ call s:Setf(g:filetype_idr) | return
+ endif
call s:Setf('idris2') | return
endfunc
@@ -296,6 +298,89 @@ func! polyglot#DetectBasFiletype()
call s:Setf('basic') | return
endfunc
+func! polyglot#DetectPmFiletype()
+ let line = getline(nextnonblank(1))
+ if line =~# 'XPM2'
+ call s:Setf('xpm2') | return
+ endif
+ if line =~# 'XPM'
+ call s:Setf('xpm') | return
+ endif
+ for lnum in range(1, min([line("$"), 50]))
+ let line = getline(lnum)
+ if line =~# '^\s*\%(use\s\+v6\(\<\|\>\)\|\(\<\|\>\)module\(\<\|\>\)\|\(\<\|\>\)\%(my\s\+\)\=class\(\<\|\>\)\)'
+ call s:Setf('raku') | return
+ endif
+ if line =~# '\(\<\|\>\)use\s\+\%(strict\(\<\|\>\)\|v\=5\.\)'
+ call s:Setf('perl') | return
+ endif
+ endfor
+ if exists("g:filetype_pm")
+ call s:Setf(g:filetype_pm) | return
+ endif
+ call s:Setf('perl') | return
+endfunc
+
+func! polyglot#DetectPlFiletype()
+ let line = getline(nextnonblank(1))
+ if line =~# '^[^#]*:-' || line =~# '^\s*\%(%\|/\*\)' || line =~# '\.\s*$'
+ call s:Setf('prolog') | return
+ endif
+ for lnum in range(1, min([line("$"), 50]))
+ let line = getline(lnum)
+ if line =~# '^\s*\%(use\s\+v6\(\<\|\>\)\|\(\<\|\>\)module\(\<\|\>\)\|\(\<\|\>\)\%(my\s\+\)\=class\(\<\|\>\)\)'
+ call s:Setf('raku') | return
+ endif
+ if line =~# '\(\<\|\>\)use\s\+\%(strict\(\<\|\>\)\|v\=5\.\)'
+ call s:Setf('perl') | return
+ endif
+ endfor
+ if exists("g:filetype_pl")
+ call s:Setf(g:filetype_pl) | return
+ endif
+ call s:Setf('perl') | return
+endfunc
+
+func! polyglot#DetectTFiletype()
+ for lnum in range(1, min([line("$"), 5]))
+ let line = getline(lnum)
+ if line =~# '^\.'
+ call s:Setf('nroff') | return
+ endif
+ endfor
+ for lnum in range(1, min([line("$"), 50]))
+ let line = getline(lnum)
+ if line =~# '^\s*\%(use\s\+v6\(\<\|\>\)\|\(\<\|\>\)module\(\<\|\>\)\|\(\<\|\>\)\%(my\s\+\)\=class\(\<\|\>\)\)'
+ call s:Setf('raku') | return
+ endif
+ if line =~# '\(\<\|\>\)use\s\+\%(strict\(\<\|\>\)\|v\=5\.\)'
+ call s:Setf('perl') | return
+ endif
+ endfor
+ if exists("g:filetype_t")
+ call s:Setf(g:filetype_t) | return
+ endif
+ call s:Setf('perl') | return
+endfunc
+
+func! polyglot#DetectTt2Filetype()
+ for lnum in range(1, min([line("$"), 3]))
+ let line = getline(lnum)
+ if line =~? '<\%(!DOCTYPE HTML\|[%?]\|html\)'
+ call s:Setf('tt2html') | return
+ endif
+ endfor
+ call s:Setf('tt2') | return
+endfunc
+
+func! polyglot#DetectHtmlFiletype()
+ let line = getline(nextnonblank(1))
+ if line =~# '^\(%\|<[%&].*>\)'
+ call s:Setf('mason') | return
+ endif
+ call s:Setf('html') | return
+endfunc
+
" Restore 'cpoptions'
let &cpo = s:cpo_save
unlet s:cpo_save
diff --git a/autoload/sleuth.vim b/autoload/sleuth.vim
index c1de82cd..ae101289 100644
--- a/autoload/sleuth.vim
+++ b/autoload/sleuth.vim
@@ -38,6 +38,7 @@ let s:globs = {
\ 'basic': '*.basic',
\ 'blade': '*.blade,*.blade.php',
\ 'brewfile': 'Brewfile',
+ \ 'bzl': '*.bzl,BUCK,BUILD,BUILD.bazel,Tiltfile,WORKSPACE',
\ 'c': '*.c,*.cats,*.h,*.idc,*.qc',
\ 'caddyfile': 'Caddyfile',
\ 'carp': '*.carp',
@@ -129,6 +130,7 @@ let s:globs = {
\ 'mako': '*.mako,*.mao',
\ 'markdown': '*.md,*.markdown,*.mdown,*.mdwn,*.mkd,*.mkdn,*.mkdown,*.ronn,*.workbook,contents.lr',
\ 'markdown.mdx': '*.mdx',
+ \ 'mason': '*.mason,*.mhtml,*.comp',
\ 'meson': 'meson.build,meson_options.txt',
\ 'mma': '*.mathematica,*.cdf,*.m,*.ma,*.mt,*.nb,*.nbp,*.wl,*.wlt,*.wls,*.mma',
\ 'moon': '*.moon',
@@ -151,7 +153,9 @@ let s:globs = {
\ 'perl': '*.pl,*.al,*.cgi,*.fcgi,*.perl,*.ph,*.plx,*.pm,*.psgi,*.t,Makefile.PL,Rexfile,ack,cpanfile',
\ 'php': '*.php,*.aw,*.ctp,*.fcgi,*.inc,*.php3,*.php4,*.php5,*.phps,*.phpt,Phakefile',
\ 'plantuml': '*.puml,*.iuml,*.plantuml,*.uml,*.pu',
+ \ 'pod': '*.pod',
\ 'pony': '*.pony',
+ \ 'prolog': '*.pl,*.pro,*.prolog,*.yap',
\ 'proto': '*.proto',
\ 'ps1': '*.ps1,*.psd1,*.psm1,*.pssc',
\ 'ps1xml': '*.ps1xml',
@@ -190,6 +194,7 @@ let s:globs = {
\ 'sxhkdrc': '*.sxhkdrc,sxhkdrc',
\ 'systemd': '*.automount,*.mount,*.path,*.service,*.socket,*.swap,*.target,*.timer',
\ 'tablegen': '*.td',
+ \ 'tads': '*.t',
\ 'terraform': '*.hcl,*.nomad,*.tf,*.tfvars,*.workflow',
\ 'textile': '*.textile',
\ 'thrift': '*.thrift',
@@ -197,6 +202,8 @@ let s:globs = {
\ 'toml': '*.toml,Cargo.lock,Gopkg.lock,poetry.lock,Pipfile',
\ 'tptp': '*.p,*.tptp,*.ax',
\ 'trasys': '*.inp',
+ \ 'tt2': '*.tt2',
+ \ 'tt2html': '*.tt2',
\ 'typescript': '*.ts',
\ 'typescriptreact': '*.tsx',
\ 'unison': '*.u,*.uu',
@@ -211,6 +218,7 @@ let s:globs = {
\ 'xdc': '*.xdc',
\ 'xml': '*.xml,*.adml,*.admx,*.ant,*.axml,*.builds,*.ccproj,*.ccxml,*.clixml,*.cproject,*.cscfg,*.csdef,*.csl,*.csproj,*.ct,*.depproj,*.dita,*.ditamap,*.ditaval,*.dll.config,*.dotsettings,*.filters,*.fsproj,*.fxml,*.glade,*.gml,*.gmx,*.grxml,*.gst,*.iml,*.ivy,*.jelly,*.jsproj,*.kml,*.launch,*.mdpolicy,*.mjml,*.mm,*.mod,*.mxml,*.natvis,*.ncl,*.ndproj,*.nproj,*.nuspec,*.odd,*.osm,*.pkgproj,*.pluginspec,*.proj,*.props,*.ps1xml,*.psc1,*.pt,*.rdf,*.resx,*.rss,*.sch,*.scxml,*.sfproj,*.shproj,*.srdf,*.storyboard,*.sublime-snippet,*.targets,*.tml,*.ui,*.urdf,*.ux,*.vbproj,*.vcxproj,*.vsixmanifest,*.vssettings,*.vstemplate,*.vxml,*.wixproj,*.workflow,*.wsdl,*.wsf,*.wxi,*.wxl,*.wxs,*.x3d,*.xacro,*.xaml,*.xib,*.xlf,*.xliff,*.xmi,*.xml.dist,*.xproj,*.xsd,*.xspec,*.xul,*.zcml,*.cdxml,App.config,NuGet.config,Settings.StyleCop,Web.Debug.config,Web.Release.config,Web.config,packages.config',
\ 'xml.twig': '*.xml.twig',
+ \ 'xs': '*.xs',
\ 'xsl': '*.xslt,*.xsl',
\ 'yaml': '*.yml,*.mir,*.reek,*.rviz,*.sublime-syntax,*.syntax,*.yaml,*.yaml-tmlanguage,*.yaml.sed,*.yml.mysql,glide.lock,yarn.lock,fish_history,fish_read_history',
\ 'yaml.ansible': 'playbook.y{a,}ml,site.y{a,}ml,main.y{a,}ml,local.y{a,}ml,requirements.y{a,}ml,tasks.*.y{a,}ml,roles.*.y{a,}ml,handlers.*.y{a,}ml',
diff --git a/ftdetect/polyglot.vim b/ftdetect/polyglot.vim
index 41819e05..1cd0efe7 100644
--- a/ftdetect/polyglot.vim
+++ b/ftdetect/polyglot.vim
@@ -75,13 +75,15 @@ endfunc
" When using this, the entry should probably be further down below with the
" other StarSetf() calls.
func! s:StarSetf(ft)
- if expand("<amatch>") !~ g:ft_ignore_pat
- exe 'setf ' . a:ft
+ if expand("<amatch>") !~ g:ft_ignore_pat && &filetype !~# '\<'.a:ft.'\>'
+ let &filetype = a:ft
endif
endfunc
augroup filetypedetect
+au! filetypedetect BufRead,BufNewFile,StdinReadPost *
+
" filetypes
if !has_key(s:disabled_packages, '8th')
@@ -92,6 +94,10 @@ if !has_key(s:disabled_packages, 'haproxy')
au! BufRead,BufNewFile *.cfg
endif
+if !has_key(s:disabled_packages, 'a2ps')
+ au! BufRead,BufNewFile */etc/a2ps.cfg,*/etc/a2ps/*.cfg,a2psrc,.a2psrc
+endif
+
if !has_key(s:disabled_packages, 'a65')
au! BufRead,BufNewFile *.a65
endif
@@ -132,6 +138,10 @@ if !has_key(s:disabled_packages, 'aidl')
au! BufRead,BufNewFile *.aidl
endif
+if !has_key(s:disabled_packages, 'alsaconf')
+ au! BufRead,BufNewFile .asoundrc,*/usr/share/alsa/alsa.conf,*/etc/asound.conf
+endif
+
if !has_key(s:disabled_packages, 'aml')
au! BufRead,BufNewFile *.aml
endif
@@ -144,12 +154,28 @@ if !has_key(s:disabled_packages, 'xml')
au! BufRead,BufNewFile *.csproj,*.ui,*.wsdl,*.wsf,*.xlf,*.xliff,*.xmi,*.xsd,*.xul
endif
+if !has_key(s:disabled_packages, 'ant')
+ au! BufRead,BufNewFile build.xml
+endif
+
+if !has_key(s:disabled_packages, 'apache')
+ au! BufRead,BufNewFile .htaccess,*/etc/httpd/*.conf,*/etc/apache2/sites-*/*.com,access.conf*,apache.conf*,apache2.conf*,httpd.conf*,srm.conf*,*/etc/apache2/*.conf*,*/etc/apache2/conf.*/*,*/etc/apache2/mods-*/*,*/etc/apache2/sites-*/*,*/etc/httpd/conf.d/*.conf*
+endif
+
if !has_key(s:disabled_packages, 'applescript')
au! BufRead,BufNewFile *.scpt
endif
+if !has_key(s:disabled_packages, 'aptconf')
+ au! BufRead,BufNewFile apt.conf,*/.aptitude/config
+endif
+
+if !has_key(s:disabled_packages, 'arch')
+ au! BufRead,BufNewFile .arch-inventory,=tagging-method
+endif
+
if !has_key(s:disabled_packages, 'c/c++')
- au! BufRead,BufNewFile *.cpp,*.c++,*.cc,*.cxx,*.hh,*.hpp,*.hxx,*.inl,*.ipp,*.tcc,*.tpp,*.moc,*.tlh,*.qc
+ au! BufRead,BufNewFile *.cpp,*.c++,*.cc,*.cxx,*.hh,*.hpp,*.hxx,*.inl,*.ipp,*.tcc,*.tpp,*.moc,*.tlh,*.qc,*enlightenment/*.cfg
endif
if !has_key(s:disabled_packages, 'arduino')
@@ -172,6 +198,10 @@ if !has_key(s:disabled_packages, 'elf')
au! BufRead,BufNewFile *.am
endif
+if !has_key(s:disabled_packages, 'automake')
+ au! BufRead,BufNewFile GNUmakefile.am
+endif
+
if !has_key(s:disabled_packages, 'asn')
au! BufRead,BufNewFile *.asn,*.asn1
endif
@@ -197,7 +227,7 @@ if !has_key(s:disabled_packages, 'clojure')
endif
if !has_key(s:disabled_packages, 'cmake')
- au! BufRead,BufNewFile *.cmake,*.cmake.in
+ au! BufRead,BufNewFile *.cmake,*.cmake.in,CMakeLists.txt
endif
if !has_key(s:disabled_packages, 'cucumber')
@@ -213,7 +243,7 @@ if !has_key(s:disabled_packages, 'dlang')
endif
if !has_key(s:disabled_packages, 'dockerfile')
- au! BufRead,BufNewFile *.Dockerfile
+ au! BufRead,BufNewFile *.Dockerfile,Dockerfile
endif
if !has_key(s:disabled_packages, 'elm')
@@ -236,6 +266,10 @@ if !has_key(s:disabled_packages, 'fsharp')
au! BufRead,BufNewFile *.fs
endif
+if !has_key(s:disabled_packages, 'git')
+ au! BufRead,BufNewFile .gitconfig,.gitmodules,*.git/config,*/.config/git/config,*.git/modules/*/config,git-rebase-todo
+endif
+
if !has_key(s:disabled_packages, 'gnuplot')
au! BufRead,BufNewFile *.gp,*.gpi
endif
@@ -256,6 +290,10 @@ if !has_key(s:disabled_packages, 'groovy')
au! BufRead,BufNewFile *.groovy,*.gradle
endif
+if !has_key(s:disabled_packages, 'grub')
+ au! BufRead,BufNewFile */boot/grub/menu.lst,*/boot/grub/grub.conf,*/etc/grub.conf
+endif
+
if !has_key(s:disabled_packages, 'haml')
au! BufRead,BufNewFile *.haml
endif
@@ -273,7 +311,7 @@ if !has_key(s:disabled_packages, 'html5')
endif
if !has_key(s:disabled_packages, 'json')
- au! BufRead,BufNewFile *.json,*.ice,*.webmanifest,*.yy,*.jsonp
+ au! BufRead,BufNewFile *.json,*.ice,*.webmanifest,*.yy,*.jsonp,Pipfile.lock
endif
if !has_key(s:disabled_packages, 'kotlin')
@@ -304,8 +342,12 @@ if !has_key(s:disabled_packages, 'markdown')
au! BufRead,BufNewFile *.md,*.markdown,*.mdown,*.mdwn,*.mkd,*.mkdn
endif
+if !has_key(s:disabled_packages, 'meson')
+ au! BufRead,BufNewFile meson.build,meson_options.txt
+endif
+
if !has_key(s:disabled_packages, 'ocaml')
- au! BufRead,BufNewFile *.ml,*.mli,*.mll,*.mly
+ au! BufRead,BufNewFile *.ml,*.mli,*.mll,*.mly,.ocamlinit
endif
if !has_key(s:disabled_packages, 'opencl')
@@ -313,7 +355,7 @@ if !has_key(s:disabled_packages, 'opencl')
endif
if !has_key(s:disabled_packages, 'perl')
- au! BufRead,BufNewFile *.al,*.plx,*.psgi,*.t
+ au! BufRead,BufNewFile *.al,*.plx,*.psgi,*.t,*.pod,*.mason,*.mhtml,*.comp,*.xs
endif
if !has_key(s:disabled_packages, 'php')
@@ -325,7 +367,7 @@ if !has_key(s:disabled_packages, 'protobuf')
endif
if !has_key(s:disabled_packages, 'python')
- au! BufRead,BufNewFile *.py,*.pyi,*.pyw,*.spec
+ au! BufRead,BufNewFile *.py,*.pyi,*.pyw,*.spec,SConstruct
endif
if !has_key(s:disabled_packages, 'r-lang')
@@ -349,7 +391,7 @@ if !has_key(s:disabled_packages, 'rst')
endif
if !has_key(s:disabled_packages, 'ruby')
- au! BufRead,BufNewFile *.rb,*.builder,*.gemspec,*.rake,*.rbw,*.ru,*.spec,*.rxml,*.rjs,*.rant,*.erb,*.rhtml
+ au! BufRead,BufNewFile *.rb,*.builder,*.gemspec,*.rake,*.rbw,*.ru,*.spec,*.rxml,*.rjs,*.rant,.irbrc,Gemfile,Rakefile,Rantfile,*.erb,*.rhtml
endif
if !has_key(s:disabled_packages, 'rust')
@@ -369,7 +411,7 @@ if !has_key(s:disabled_packages, 'scss')
endif
if !has_key(s:disabled_packages, 'sh')
- au! BufRead,BufNewFile *.zsh
+ au! BufRead,BufNewFile *.zsh,.zshrc,.zshenv,.zlogin,.zprofile,.zlogout
endif
if !has_key(s:disabled_packages, 'smt2')
@@ -388,6 +430,10 @@ if !has_key(s:disabled_packages, 'terraform')
au! BufRead,BufNewFile *.tf
endif
+if !has_key(s:disabled_packages, 'toml')
+ au! BufRead,BufNewFile Pipfile
+endif
+
if !has_key(s:disabled_packages, 'twig')
au! BufRead,BufNewFile *.twig
endif
@@ -420,12 +466,24 @@ if !has_key(s:disabled_packages, 'yaml')
au! BufRead,BufNewFile *.yml,*.yaml
endif
+if !has_key(s:disabled_packages, 'help')
+ au! BufRead,BufNewFile $VIMRUNTIME/doc/*.txt
+endif
+
if !has_key(s:disabled_packages, 'visual-basic')
au! BufRead,BufNewFile *.vba,*.vbs,*.dsm,*.ctl,*.sba
endif
if !has_key(s:disabled_packages, 'dosini')
- au! BufRead,BufNewFile *.ini,*.properties
+ au! BufRead,BufNewFile *.ini,*.properties,.editorconfig,.npmrc,*/etc/pacman.conf,php.ini-*,*/etc/yum.conf,*/etc/yum.repos.d/*
+endif
+
+if !has_key(s:disabled_packages, 'bzl')
+ au! BufRead,BufNewFile *.bzl,BUILD,WORKSPACE
+endif
+
+if !has_key(s:disabled_packages, 'tads')
+ au! BufRead,BufNewFile *.t
endif
if !has_key(s:disabled_packages, '8th')
@@ -1071,12 +1129,12 @@ endif
if !has_key(s:disabled_packages, 'html5')
au BufNewFile,BufRead *.htm call s:Setf('html')
- au BufNewFile,BufRead *.html call s:Setf('html')
au BufNewFile,BufRead *.html.hl call s:Setf('html')
au BufNewFile,BufRead *.inc call s:Setf('html')
au BufNewFile,BufRead *.st call s:Setf('html')
au BufNewFile,BufRead *.xht call s:Setf('html')
au BufNewFile,BufRead *.xhtml call s:Setf('html')
+ au! BufNewFile,BufRead *.html call polyglot#DetectHtmlFiletype()
endif
if !has_key(s:disabled_packages, 'i3')
@@ -1365,15 +1423,21 @@ if !has_key(s:disabled_packages, 'perl')
au BufNewFile,BufRead *.fcgi call s:Setf('perl')
au BufNewFile,BufRead *.perl call s:Setf('perl')
au BufNewFile,BufRead *.ph call s:Setf('perl')
- au BufNewFile,BufRead *.pl call s:Setf('perl')
au BufNewFile,BufRead *.plx call s:Setf('perl')
- au BufNewFile,BufRead *.pm call s:Setf('perl')
au BufNewFile,BufRead *.psgi call s:Setf('perl')
- au BufNewFile,BufRead *.t call s:Setf('perl')
au BufNewFile,BufRead Makefile.PL call s:Setf('perl')
au BufNewFile,BufRead Rexfile call s:Setf('perl')
au BufNewFile,BufRead ack call s:Setf('perl')
au BufNewFile,BufRead cpanfile call s:Setf('perl')
+ au BufNewFile,BufRead *.pod call s:Setf('pod')
+ au BufNewFile,BufRead *.comp call s:Setf('mason')
+ au BufNewFile,BufRead *.mason call s:Setf('mason')
+ au BufNewFile,BufRead *.mhtml call s:Setf('mason')
+ au BufNewFile,BufRead *.xs call s:Setf('xs')
+ au! BufNewFile,BufRead *.pl call polyglot#DetectPlFiletype()
+ au! BufNewFile,BufRead *.pm call polyglot#DetectPmFiletype()
+ au! BufNewFile,BufRead *.t call polyglot#DetectTFiletype()
+ au! BufNewFile,BufRead *.tt2 call polyglot#DetectTt2Filetype()
endif
if !has_key(s:disabled_packages, 'pgsql')
@@ -1517,17 +1581,17 @@ if !has_key(s:disabled_packages, 'raku')
au BufNewFile,BufRead *.p6 call s:Setf('raku')
au BufNewFile,BufRead *.p6l call s:Setf('raku')
au BufNewFile,BufRead *.p6m call s:Setf('raku')
- au BufNewFile,BufRead *.pl call s:Setf('raku')
au BufNewFile,BufRead *.pl6 call s:Setf('raku')
- au BufNewFile,BufRead *.pm call s:Setf('raku')
au BufNewFile,BufRead *.pm6 call s:Setf('raku')
au BufNewFile,BufRead *.pod6 call s:Setf('raku')
au BufNewFile,BufRead *.raku call s:Setf('raku')
au BufNewFile,BufRead *.rakudoc call s:Setf('raku')
au BufNewFile,BufRead *.rakumod call s:Setf('raku')
au BufNewFile,BufRead *.rakutest call s:Setf('raku')
- au BufNewFile,BufRead *.t call s:Setf('raku')
au BufNewFile,BufRead *.t6 call s:Setf('raku')
+ au! BufNewFile,BufRead *.pl call polyglot#DetectPlFiletype()
+ au! BufNewFile,BufRead *.pm call polyglot#DetectPmFiletype()
+ au! BufNewFile,BufRead *.t call polyglot#DetectTFiletype()
endif
if !has_key(s:disabled_packages, 'raml')
@@ -1616,7 +1680,7 @@ if !has_key(s:disabled_packages, 'ruby')
endif
if !has_key(s:disabled_packages, 'rspec')
- au BufNewFile,BufRead *_spec.rb if !did_filetype() | set ft=ruby syntax=rspec | endif
+ au BufNewFile,BufRead *_spec.rb set ft=ruby syntax=rspec
endif
if !has_key(s:disabled_packages, 'brewfile')
@@ -1918,12 +1982,41 @@ if !has_key(s:disabled_packages, 'odin')
au BufNewFile,BufRead *.odin call s:Setf('odin')
endif
+if !has_key(s:disabled_packages, 'bzl')
+ au BufNewFile,BufRead *.bzl call s:Setf('bzl')
+ au BufNewFile,BufRead BUCK call s:Setf('bzl')
+ au BufNewFile,BufRead BUILD call s:Setf('bzl')
+ au BufNewFile,BufRead BUILD.bazel call s:Setf('bzl')
+ au BufNewFile,BufRead Tiltfile call s:Setf('bzl')
+ au BufNewFile,BufRead WORKSPACE call s:Setf('bzl')
+endif
+
+if !has_key(s:disabled_packages, 'prolog')
+ au BufNewFile,BufRead *.pro call s:Setf('prolog')
+ au BufNewFile,BufRead *.prolog call s:Setf('prolog')
+ au BufNewFile,BufRead *.yap call s:Setf('prolog')
+ au! BufNewFile,BufRead *.pl call polyglot#DetectPlFiletype()
+endif
+
+if !has_key(s:disabled_packages, 'tads')
+ au! BufNewFile,BufRead *.t call polyglot#DetectTFiletype()
+endif
+
" end filetypes
-au BufNewFile,BufRead,StdinReadPost *
- \ if !did_filetype() && expand("<afile>") !~ g:ft_ignore_pat
- \ | call polyglot#Heuristics() | endif
+func! s:PolyglotFallback()
+ if expand("<afile>") !~ g:ft_ignore_pat
+ if getline(1) =~# "^#!"
+ call polyglot#Shebang()
+ endif
+ if &filetype == ''
+ runtime! scripts.vim
+ endif
+ endif
+endfunc
+
+au BufNewFile,BufRead,StdinReadPost * call s:PolyglotFallback()
augroup END
@@ -2123,7 +2216,7 @@ au VimEnter * call s:verify()
func! s:observe_filetype()
augroup polyglot-observer
au! CursorHold,CursorHoldI <buffer>
- \ if polyglot#Heuristics() | au! polyglot-observer CursorHold,CursorHoldI | endif
+ \ if polyglot#Shebang() | au! polyglot-observer CursorHold,CursorHoldI | endif
augroup END
endfunc
diff --git a/ftplugin/bzl.vim b/ftplugin/bzl.vim
new file mode 100644
index 00000000..3abebee9
--- /dev/null
+++ b/ftplugin/bzl.vim
@@ -0,0 +1,98 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'bzl') == -1
+
+" Vim filetype plugin file
+" Language: Bazel (http://bazel.io)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-bzl)
+" Last Change: 2015 Aug 11
+
+""
+" @section Introduction, intro
+" Core settings for the bzl filetype, used for BUILD and *.bzl files for the
+" Bazel build system (http://bazel.io/).
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+
+" Vim 7.4.051 has opinionated settings in ftplugin/python.vim that try to force
+" PEP8 conventions on every python file, but these conflict with Google's
+" indentation guidelines. As a workaround, we explicitly source the system
+" ftplugin, but save indentation settings beforehand and restore them after.
+let s:save_expandtab = &l:expandtab
+let s:save_shiftwidth = &l:shiftwidth
+let s:save_softtabstop = &l:softtabstop
+let s:save_tabstop = &l:tabstop
+
+" NOTE: Vim versions before 7.3.511 had a ftplugin/python.vim that was broken
+" for compatible mode.
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Load base python ftplugin (also defines b:did_ftplugin).
+source $VIMRUNTIME/ftplugin/python.vim
+
+" NOTE: Vim versions before 7.4.104 and later set this in ftplugin/python.vim.
+setlocal comments=b:#,fb:-
+
+" Restore pre-existing indentation settings.
+let &l:expandtab = s:save_expandtab
+let &l:shiftwidth = s:save_shiftwidth
+let &l:softtabstop = s:save_softtabstop
+let &l:tabstop = s:save_tabstop
+
+setlocal formatoptions-=t
+
+" Make gf work with imports in BUILD files.
+setlocal includeexpr=substitute(v:fname,'//','','')
+
+" Enable syntax-based folding, if specified.
+if get(g:, 'ft_bzl_fold', 0)
+ setlocal foldmethod=syntax
+ setlocal foldtext=BzlFoldText()
+endif
+
+if exists('*BzlFoldText')
+ finish
+endif
+
+function BzlFoldText() abort
+ let l:start_num = nextnonblank(v:foldstart)
+ let l:end_num = prevnonblank(v:foldend)
+
+ if l:end_num <= l:start_num + 1
+ " If the fold is empty, don't print anything for the contents.
+ let l:content = ''
+ else
+ " Otherwise look for something matching the content regex.
+ " And if nothing matches, print an ellipsis.
+ let l:content = '...'
+ for l:line in getline(l:start_num + 1, l:end_num - 1)
+ let l:content_match = matchstr(l:line, '\m\C^\s*name = \zs.*\ze,$')
+ if !empty(l:content_match)
+ let l:content = l:content_match
+ break
+ endif
+ endfor
+ endif
+
+ " Enclose content with start and end
+ let l:start_text = getline(l:start_num)
+ let l:end_text = substitute(getline(l:end_num), '^\s*', '', '')
+ let l:text = l:start_text . ' ' . l:content . ' ' . l:end_text
+
+ " Compute the available width for the displayed text.
+ let l:width = winwidth(0) - &foldcolumn - (&number ? &numberwidth : 0)
+ let l:lines_folded = ' ' . string(1 + v:foldend - v:foldstart) . ' lines'
+
+ " Expand tabs, truncate, pad, and concatenate
+ let l:text = substitute(l:text, '\t', repeat(' ', &tabstop), 'g')
+ let l:text = strpart(l:text, 0, l:width - len(l:lines_folded))
+ let l:padding = repeat(' ', l:width - len(l:lines_folded) - len(l:text))
+ return l:text . l:padding . l:lines_folded
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+endif
diff --git a/ftplugin/prolog.vim b/ftplugin/prolog.vim
new file mode 100644
index 00000000..bd813dce
--- /dev/null
+++ b/ftplugin/prolog.vim
@@ -0,0 +1,24 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'prolog') == -1
+
+" Vim filetype plugin file
+" Language: Prolog
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:% commentstring=%\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+endif
diff --git a/heuristics.yaml b/heuristics.yaml
index 901241cb..8b803011 100644
--- a/heuristics.yaml
+++ b/heuristics.yaml
@@ -98,7 +98,7 @@ rules:
filetype: idris2
- pattern: '^%access .*'
filetype: idris
- - override: 'g:filetype_idr'
+- override: 'g:filetype_idr'
- filetype: idris2
---
extensions: [lidr]
@@ -115,3 +115,70 @@ rules:
filetype: vb
ignore_case: true
- filetype: basic
+---
+extensions: [pm]
+rules:
+- lines: 1
+ rules:
+ - pattern: 'XPM2'
+ filetype: xpm2
+ - pattern: 'XPM'
+ filetype: xpm
+- lines: 50
+ rules:
+ - pattern: '^\s*(?:use\s+v6\b|\bmodule\b|\b(?:my\s+)?class\b)'
+ filetype: raku
+ - pattern: '\buse\s+(?:strict\b|v?5\.)'
+ filetype: perl
+- override: 'g:filetype_pm'
+- filetype: perl
+---
+extensions: [pl]
+rules:
+- lines: 1
+ or:
+ - pattern: '^[^#]*:-'
+ - pattern: '^\s*(?:%|/\*)'
+ - pattern: '\.\s*$'
+ filetype: prolog
+- lines: 50
+ rules:
+ - pattern: '^\s*(?:use\s+v6\b|\bmodule\b|\b(?:my\s+)?class\b)'
+ filetype: raku
+ - pattern: '\buse\s+(?:strict\b|v?5\.)'
+ filetype: perl
+- override: 'g:filetype_pl'
+- filetype: perl
+---
+extensions: [t]
+rules:
+- lines: 5
+ pattern: '^\.'
+ filetype: nroff
+- lines: 50
+ rules:
+ - pattern: '^\s*(?:use\s+v6\b|\bmodule\b|\b(?:my\s+)?class\b)'
+ filetype: raku
+ - pattern: '\buse\s+(?:strict\b|v?5\.)'
+ filetype: perl
+ ## I haven't found turing syntax for vim...
+ # - pattern: '^\s*%[ \t]+|^\s*var\s+\w+(\s*:\s*\w+)?\s*:=\s*\w+'
+ # filetype: turing
+- override: 'g:filetype_t'
+- filetype: perl
+---
+extensions: [tt2]
+rules:
+- lines: 3
+ pattern: '<(?:!DOCTYPE HTML|[%?]|html)'
+ ignore_case: true
+ filetype: tt2html
+- filetype: tt2
+---
+extensions: [html]
+rules:
+- lines: 1
+ pattern: '^(%|<[%&].*>)'
+ filetype: mason
+- filetype: html
+
diff --git a/indent/bzl.vim b/indent/bzl.vim
new file mode 100644
index 00000000..adda8a85
--- /dev/null
+++ b/indent/bzl.vim
@@ -0,0 +1,98 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'bzl') == -1
+
+" Vim indent file
+" Language: Bazel (http://bazel.io)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-bzl)
+" Last Change: 2017 Jun 13
+
+if exists('b:did_indent')
+ finish
+endif
+
+" Load base python indent.
+if !exists('*GetPythonIndent')
+ runtime! indent/python.vim
+endif
+
+let b:did_indent = 1
+
+" Only enable bzl google indent if python google indent is enabled.
+if !get(g:, 'no_google_python_indent')
+ setlocal indentexpr=GetBzlIndent(v:lnum)
+endif
+
+if exists('*GetBzlIndent')
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Maximum number of lines to look backwards.
+let s:maxoff = 50
+
+""
+" Determine the correct indent level given an {lnum} in the current buffer.
+function GetBzlIndent(lnum) abort
+ let l:use_recursive_indent = !get(g:, 'no_google_python_recursive_indent')
+ if l:use_recursive_indent
+ " Backup and override indent setting variables.
+ if exists('g:pyindent_nested_paren')
+ let l:pyindent_nested_paren = g:pyindent_nested_paren
+ endif
+ if exists('g:pyindent_open_paren')
+ let l:pyindent_open_paren = g:pyindent_open_paren
+ endif
+ let g:pyindent_nested_paren = 'shiftwidth() * 2'
+ let g:pyindent_open_paren = 'shiftwidth() * 2'
+ endif
+
+ let l:indent = -1
+
+ " Indent inside parens.
+ " Align with the open paren unless it is at the end of the line.
+ " E.g.
+ " open_paren_not_at_EOL(100,
+ " (200,
+ " 300),
+ " 400)
+ " open_paren_at_EOL(
+ " 100, 200, 300, 400)
+ call cursor(a:lnum, 1)
+ let [l:par_line, l:par_col] = searchpairpos('(\|{\|\[', '', ')\|}\|\]', 'bW',
+ \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" .
+ \ " synIDattr(synID(line('.'), col('.'), 1), 'name')" .
+ \ " =~ '\\(Comment\\|String\\)$'")
+ if l:par_line > 0
+ call cursor(l:par_line, 1)
+ if l:par_col != col('$') - 1
+ let l:indent = l:par_col
+ endif
+ endif
+
+ " Delegate the rest to the original function.
+ if l:indent == -1
+ let l:indent = GetPythonIndent(a:lnum)
+ endif
+
+ if l:use_recursive_indent
+ " Restore global variables.
+ if exists('l:pyindent_nested_paren')
+ let g:pyindent_nested_paren = l:pyindent_nested_paren
+ else
+ unlet g:pyindent_nested_paren
+ endif
+ if exists('l:pyindent_open_paren')
+ let g:pyindent_open_paren = l:pyindent_open_paren
+ else
+ unlet g:pyindent_open_paren
+ endif
+ endif
+
+ return l:indent
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+endif
diff --git a/indent/prolog.vim b/indent/prolog.vim
new file mode 100644
index 00000000..0426a473
--- /dev/null
+++ b/indent/prolog.vim
@@ -0,0 +1,71 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'prolog') == -1
+
+" vim: set sw=4 sts=4:
+" Maintainer : Gergely Kontra <kgergely@mcl.hu>
+" Revised on : 2002.02.18. 23:34:05
+" Language : Prolog
+" Last change by: Takuya Fujiwara, 2018 Sep 23
+
+" TODO:
+" checking with respect to syntax highlighting
+" ignoring multiline comments
+" detecting multiline strings
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetPrologIndent()
+setlocal indentkeys-=:,0#
+setlocal indentkeys+=0%,-,0;,>,0)
+
+" Only define the function once.
+"if exists("*GetPrologIndent")
+" finish
+"endif
+
+function! GetPrologIndent()
+ " Find a non-blank line above the current line.
+ let pnum = prevnonblank(v:lnum - 1)
+ " Hit the start of the file, use zero indent.
+ if pnum == 0
+ return 0
+ endif
+ let line = getline(v:lnum)
+ let pline = getline(pnum)
+
+ let ind = indent(pnum)
+ " Previous line was comment -> use previous line's indent
+ if pline =~ '^\s*%'
+ return ind
+ endif
+ " Previous line was the start of block comment -> +1 after '/*' comment
+ if pline =~ '^\s*/\*'
+ return ind + 1
+ endif
+ " Previous line was the end of block comment -> -1 after '*/' comment
+ if pline =~ '^\s*\*/'
+ return ind - 1
+ endif
+ " Check for clause head on previous line
+ if pline =~ '\%(:-\|-->\)\s*\(%.*\)\?$'
+ let ind = ind + shiftwidth()
+ " Check for end of clause on previous line
+ elseif pline =~ '\.\s*\(%.*\)\?$'
+ let ind = ind - shiftwidth()
+ endif
+ " Check for opening conditional on previous line
+ if pline =~ '^\s*\([(;]\|->\)'
+ let ind = ind + shiftwidth()
+ endif
+ " Check for closing an unclosed paren, or middle ; or ->
+ if line =~ '^\s*\([);]\|->\)'
+ let ind = ind - shiftwidth()
+ endif
+ return ind
+endfunction
+
+endif
diff --git a/packages.yaml b/packages.yaml
index 372abc94..bbdb3214 100644
--- a/packages.yaml
+++ b/packages.yaml
@@ -1175,6 +1175,23 @@ remote: vim-perl/vim-perl
filetypes:
- name: perl
linguist: Perl
+- name: pod
+ extensions:
+ - pod
+- name: mason
+ extensions:
+ - mason
+ - mhtml
+ - comp
+- name: tt2
+ extensions:
+ - tt2
+- name: tt2html
+ extensions:
+ - tt2
+- name: xs
+ extensions:
+ - xs
---
name: pgsql
remote: lifepillar/pgsql.vim
@@ -1834,3 +1851,25 @@ remote: Tetralux/odin.vim
filetypes:
- name: odin
linguist: Odin
+---
+name: bzl
+remote: vim/vim:runtime
+glob: '**/bzl.vim'
+filetypes:
+- name: bzl
+ linguist: Starlark
+---
+name: prolog
+remote: vim/vim:runtime
+glob: '**/prolog.vim'
+filetypes:
+- name: prolog
+ linguist: Prolog
+---
+name: tads
+remote: vim/vim:runtime
+glob: '**/tads.vim'
+filetypes:
+- name: tads
+ extensions:
+ - t
diff --git a/scripts/build b/scripts/build
index 07bc301b..c44e8cc8 100755
--- a/scripts/build
+++ b/scripts/build
@@ -263,7 +263,7 @@ def rule_to_code(rule)
if rule.has_key?("lines")
if rule["lines"] == 1
return <<~EOS
- let line = getline(1)
+ let line = getline(nextnonblank(1))
#{indent(rule_to_code(except(rule, "lines")), 0)}
EOS
@@ -423,6 +423,7 @@ def generate_ftdetect(packages, heuristics)
expected_filetypes = expected_filetypes.select { |e| filetype_names.include?(e["name"]) }
native_extensions = Set.new(native_filetypes.flat_map { |f| f["extensions"] || [] })
+ native_filenames = Set.new(native_filetypes.flat_map { |f| f["filenames"] || [] })
for package in packages
name = package.fetch("name")
@@ -435,6 +436,12 @@ def generate_ftdetect(packages, heuristics)
to_disable << "*." + extension
end
end
+
+ for filename in filetype["filenames"]
+ if native_filenames.include?(filename)
+ to_disable << filename
+ end
+ end
end
if to_disable.size > 0
@@ -457,7 +464,7 @@ def generate_ftdetect(packages, heuristics)
set_command = "call s:Setf('#{name}')"
if filetype["syntax"]
- set_command = "if !did_filetype() | set ft=#{name} syntax=#{filetype["syntax"]} | endif"
+ set_command = "set ft=#{name} syntax=#{filetype["syntax"]}"
end
if filetype["custom_set"]
@@ -544,11 +551,11 @@ def generate_ftdetect(packages, heuristics)
endif
endfunc
- func! polyglot#Heuristics()
+ func! polyglot#Shebang()
" Try to detect filetype from shebang
- let l:filetype = polyglot#Shebang()
- if l:filetype != ""
- exec "setf " . l:filetype
+ let ft = polyglot#ShebangFiletype()
+ if ft != ""
+ call s:Setf(ft)
return 1
endif
@@ -571,7 +578,7 @@ def generate_ftdetect(packages, heuristics)
let s:r_envflag = '%(\\S\\+=\\S\\+\\|-[iS]\\|--ignore-environment\\|--split-string\\)'
let s:r_env = '^\\%(\\' . s:r_envflag . '\\s\\+\\)*\\(\\S\\+\\)'
- func! polyglot#Shebang()
+ func! polyglot#ShebangFiletype()
let l:line1 = getline(1)
if l:line1 !~# "^#!"
diff --git a/scripts/test_extensions.vim b/scripts/test_extensions.vim
index f2aaf66c..467ac86a 100644
--- a/scripts/test_extensions.vim
+++ b/scripts/test_extensions.vim
@@ -15,6 +15,12 @@ function! TestExtension(filetype, filename, content)
endtry
endfunction
+" make sure native vim scripts.vim is respected
+call TestExtension("rib", "renderman", "##RenderMan")
+
+" make sure case of file does matter when recognizing file
+call TestExtension("ruby", "scripts/build", "#!/usr/bin/env ruby")
+
call TestExtension("sh", "bash1", "#!/bin/bash")
call TestExtension("sh", "bash2", "#! /bin/bash")
call TestExtension("sh", "bash3", "#! /bin/bash2.3")
@@ -279,3 +285,72 @@ call TestExtension("c", "foo.h", "")
unlet g:c_syntax_for_h
let g:ch_syntax_for_h = 1
call TestExtension("ch", "foo.h", "")
+
+" perl
+call TestExtension("perl", "empty.plx", "")
+call TestExtension("perl", "empty.al", "")
+call TestExtension("perl", "empty.psgi", "")
+call TestExtension("pod", "empty.pod", "")
+
+" raku
+call TestExtension("raku", "empty.p6", "")
+call TestExtension("raku", "empty.pm6", "")
+call TestExtension("raku", "empty.pl6", "")
+call TestExtension("raku", "empty.raku", "")
+call TestExtension("raku", "empty.rakumod", "")
+call TestExtension("raku", "empty.pod6", "")
+call TestExtension("raku", "empty.rakudoc", "")
+call TestExtension("raku", "empty.rakutest", "")
+call TestExtension("raku", "empty.t6", "")
+
+
+" .pm extension
+call TestExtension("perl", "empty.pm", "")
+call TestExtension("perl", "strict.pm", " use strict hello;")
+call TestExtension("perl", "use5.pm", " use 5;")
+call TestExtension("perl", "usev5.pm", " use v5;")
+call TestExtension("raku", "script.pm", "#!/usr/bin/env perl6\nprint('Hello world')")
+call TestExtension("raku", "class.pm", " class Class {}")
+call TestExtension("raku", "module.pm", " module foobar")
+call TestExtension("xpm", "xpm.pm", "/* XPM */")
+call TestExtension("xpm2", "xpm2.pm", "/* XPM2 */")
+let g:filetype_pm = "fizfuz"
+call TestExtension("fizfuz", "fizfuz.pm", "")
+
+" .pl extension
+call TestExtension("perl", "empty.pl", "")
+call TestExtension("prolog", "comment.pl", "% hello world")
+call TestExtension("prolog", "comment2.pl", "/* hello world */")
+call TestExtension("prolog", "statement.pl", "happy(vincent). ")
+call TestExtension("prolog", "statement2.pl", "nearbychk(X,Y) :- Y is X-1.")
+call TestExtension("perl", "strict.pl", " use strict hello;")
+call TestExtension("perl", "use5.pl", " use 5;")
+call TestExtension("perl", "usev5.pl", " use v5;")
+call TestExtension("raku", "script.pl", "#!/usr/bin/env perl6\nprint('Hello world')")
+call TestExtension("raku", "class.pl", " class Class {}")
+call TestExtension("raku", "module.pl", " module foobar")
+let g:filetype_pl = "fizfuz"
+call TestExtension("fizfuz", "fizfuz.pl", "")
+
+" .t extension
+call TestExtension("perl", "empty.t", "")
+call TestExtension("perl", "strict.t", " use strict hello;")
+call TestExtension("perl", "use5.t", " use 5;")
+call TestExtension("perl", "usev5.t", " use v5;")
+call TestExtension("raku", "script.t", "#!/usr/bin/env perl6\nprint('Hello world')")
+call TestExtension("raku", "class.t", " class Class {}")
+call TestExtension("raku", "module.t", " module foobar")
+call TestExtension("nroff", "module.t", ".nf\n101 Main Street")
+let g:filetype_t = "fizfuz"
+call TestExtension("fizfuz", "fizfuz.t", "")
+
+" .tt2 extension
+call TestExtension("tt2", "empty.tt2", "")
+call TestExtension("tt2html", "doctype.tt2", "<!DOCTYPE HTML>")
+call TestExtension("tt2html", "percent.tt2", "<%filter>")
+call TestExtension("tt2html", "html.tt2", "<html>")
+
+" .html extension
+call TestExtension("html", "empty.html", "")
+call TestExtension("mason", "mason1.html", "% my $planet = 42;")
+call TestExtension("mason", "mason2.html", "<%filter></%filter>")
diff --git a/scripts/test_filetypes.vim b/scripts/test_filetypes.vim
index a84b39e3..02d44ca4 100644
--- a/scripts/test_filetypes.vim
+++ b/scripts/test_filetypes.vim
@@ -154,6 +154,11 @@ call TestFiletype('sexplib')
call TestFiletype('octave')
call TestFiletype('opencl')
call TestFiletype('perl')
+call TestFiletype('pod')
+call TestFiletype('mason')
+call TestFiletype('tt2')
+call TestFiletype('tt2html')
+call TestFiletype('xs')
call TestFiletype('sql')
call TestFiletype('cql')
call TestFiletype('php')
@@ -232,3 +237,6 @@ call TestFiletype('basic')
call TestFiletype('vb')
call TestFiletype('dosini')
call TestFiletype('odin')
+call TestFiletype('bzl')
+call TestFiletype('prolog')
+call TestFiletype('tads')
diff --git a/syntax/bzl.vim b/syntax/bzl.vim
new file mode 100644
index 00000000..9c0c5781
--- /dev/null
+++ b/syntax/bzl.vim
@@ -0,0 +1,20 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'bzl') == -1
+
+" Vim syntax file
+" Language: Bazel (http://bazel.io)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-bzl)
+" Last Change: 2015 Aug 11
+
+if exists('b:current_syntax')
+ finish
+endif
+
+
+runtime! syntax/python.vim
+
+let b:current_syntax = 'bzl'
+
+syn region bzlRule start='^\w\+($' end='^)\n*' transparent fold
+syn region bzlList start='\[' end='\]' transparent fold
+
+endif
diff --git a/syntax/prolog.vim b/syntax/prolog.vim
new file mode 100644
index 00000000..4d6cb0be
--- /dev/null
+++ b/syntax/prolog.vim
@@ -0,0 +1,122 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'prolog') == -1
+
+" Vim syntax file
+" Language: PROLOG
+" Maintainer: Anton Kochkov <anton.kochkov@gmail.com>
+" Last Change: 2019 Aug 29
+
+" There are two sets of highlighting in here:
+" If the "prolog_highlighting_clean" variable exists, it is rather sparse.
+" Otherwise you get more highlighting.
+"
+" You can also set the "prolog_highlighting_no_keyword" variable. If set,
+" keywords will not be highlighted.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Prolog is case sensitive.
+syn case match
+
+" Very simple highlighting for comments, clause heads and
+" character codes. It respects prolog strings and atoms.
+
+syn region prologCComment start=+/\*+ end=+\*/+
+syn match prologComment +%.*+
+
+if !exists("prolog_highlighting_no_keyword")
+ syn keyword prologKeyword module meta_predicate multifile dynamic
+endif
+syn match prologCharCode +0'\\\=.+
+syn region prologString start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn region prologAtom start=+'+ skip=+\\\\\|\\'+ end=+'+
+syn region prologClause matchgroup=prologClauseHead start=+^\s*[a-z]\w*+ matchgroup=Normal end=+\.\s\|\.$+ contains=ALLBUT,prologClause
+
+if !exists("prolog_highlighting_clean")
+
+ " some keywords
+ " some common predicates are also highlighted as keywords
+ " is there a better solution?
+ if !exists("prolog_highlighting_no_keyword")
+ syn keyword prologKeyword abolish current_output peek_code
+ syn keyword prologKeyword append current_predicate put_byte
+ syn keyword prologKeyword arg current_prolog_flag put_char
+ syn keyword prologKeyword asserta fail put_code
+ syn keyword prologKeyword assertz findall read
+ syn keyword prologKeyword at_end_of_stream float read_term
+ syn keyword prologKeyword atom flush_output repeat
+ syn keyword prologKeyword atom_chars functor retract
+ syn keyword prologKeyword atom_codes get_byte set_input
+ syn keyword prologKeyword atom_concat get_char set_output
+ syn keyword prologKeyword atom_length get_code set_prolog_flag
+ syn keyword prologKeyword atomic halt set_stream_position
+ syn keyword prologKeyword bagof integer setof
+ syn keyword prologKeyword call is stream_property
+ syn keyword prologKeyword catch nl sub_atom
+ syn keyword prologKeyword char_code nonvar throw
+ syn keyword prologKeyword char_conversion number true
+ syn keyword prologKeyword clause number_chars unify_with_occurs_check
+ syn keyword prologKeyword close number_codes var
+ syn keyword prologKeyword compound once write
+ syn keyword prologKeyword copy_term op write_canonical
+ syn keyword prologKeyword current_char_conversion open write_term
+ syn keyword prologKeyword current_input peek_byte writeq
+ syn keyword prologKeyword current_op peek_char
+ endif
+
+ syn match prologOperator "=\\=\|=:=\|\\==\|=<\|==\|>=\|\\=\|\\+\|=\.\.\|<\|>\|="
+ syn match prologAsIs "===\|\\===\|<=\|=>"
+
+ syn match prologNumber "\<\d*\>'\@!"
+ syn match prologNumber "\<0[xX]\x*\>'\@!"
+ syn match prologCommentError "\*/"
+ syn match prologSpecialCharacter ";"
+ syn match prologSpecialCharacter "!"
+ syn match prologSpecialCharacter ":-"
+ syn match prologSpecialCharacter "-->"
+ syn match prologQuestion "?-.*\." contains=prologNumber
+
+
+endif
+
+syn sync maxlines=50
+
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+" The default highlighting.
+hi def link prologComment Comment
+hi def link prologCComment Comment
+hi def link prologCharCode Special
+
+if exists ("prolog_highlighting_clean")
+
+hi def link prologKeyword Statement
+hi def link prologClauseHead Statement
+hi def link prologClause Normal
+
+else
+
+hi def link prologKeyword Keyword
+hi def link prologClauseHead Constant
+hi def link prologClause Normal
+hi def link prologQuestion PreProc
+hi def link prologSpecialCharacter Special
+hi def link prologNumber Number
+hi def link prologAsIs Normal
+hi def link prologCommentError Error
+hi def link prologAtom String
+hi def link prologString String
+hi def link prologOperator Operator
+
+endif
+
+
+let b:current_syntax = "prolog"
+
+" vim: ts=8
+
+endif
diff --git a/syntax/tads.vim b/syntax/tads.vim
new file mode 100644
index 00000000..e4737535
--- /dev/null
+++ b/syntax/tads.vim
@@ -0,0 +1,175 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'tads') == -1
+
+" Vim syntax file
+" Language: TADS
+" Maintainer: Amir Karger <karger@post.harvard.edu>
+" $Date: 2004/06/13 19:28:45 $
+" $Revision: 1.1 $
+" Stolen from: Bram Moolenaar's C language file
+" Newest version at: http://www.hec.utah.edu/~karger/vim/syntax/tads.vim
+" History info at the bottom of the file
+
+" TODO lots more keywords
+" global, self, etc. are special *objects*, not functions. They should
+" probably be a different color than the special functions
+" Actually, should cvtstr etc. be functions?! (change tadsFunction)
+" Make global etc. into Identifiers, since we don't have regular variables?
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A bunch of useful keywords
+syn keyword tadsStatement goto break return continue pass
+syn keyword tadsLabel case default
+syn keyword tadsConditional if else switch
+syn keyword tadsRepeat while for do
+syn keyword tadsStorageClass local compoundWord formatstring specialWords
+syn keyword tadsBoolean nil true
+
+" TADS keywords
+syn keyword tadsKeyword replace modify
+syn keyword tadsKeyword global self inherited
+" builtin functions
+syn keyword tadsKeyword cvtstr cvtnum caps lower upper substr
+syn keyword tadsKeyword say length
+syn keyword tadsKeyword setit setscore
+syn keyword tadsKeyword datatype proptype
+syn keyword tadsKeyword car cdr
+syn keyword tadsKeyword defined isclass
+syn keyword tadsKeyword find firstobj nextobj
+syn keyword tadsKeyword getarg argcount
+syn keyword tadsKeyword input yorn askfile
+syn keyword tadsKeyword rand randomize
+syn keyword tadsKeyword restart restore quit save undo
+syn keyword tadsException abort exit exitobj
+
+syn keyword tadsTodo contained TODO FIXME XXX
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match tadsSpecial contained "\\."
+syn region tadsDoubleString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=tadsSpecial,tadsEmbedded
+syn region tadsSingleString start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=tadsSpecial
+" Embedded expressions in strings
+syn region tadsEmbedded contained start="<<" end=">>" contains=tadsKeyword
+
+" TADS doesn't have \xxx, right?
+"syn match cSpecial contained "\\[0-7][0-7][0-7]\=\|\\."
+"syn match cSpecialCharacter "'\\[0-7][0-7]'"
+"syn match cSpecialCharacter "'\\[0-7][0-7][0-7]'"
+
+"catch errors caused by wrong parenthesis
+"syn region cParen transparent start='(' end=')' contains=ALLBUT,cParenError,cIncluded,cSpecial,cTodo,cUserCont,cUserLabel
+"syn match cParenError ")"
+"syn match cInParen contained "[{}]"
+syn region tadsBrace transparent start='{' end='}' contains=ALLBUT,tadsBraceError,tadsIncluded,tadsSpecial,tadsTodo
+syn match tadsBraceError "}"
+
+"integer number (TADS has no floating point numbers)
+syn case ignore
+syn match tadsNumber "\<[0-9]\+\>"
+"hex number
+syn match tadsNumber "\<0x[0-9a-f]\+\>"
+syn match tadsIdentifier "\<[a-z][a-z0-9_$]*\>"
+syn case match
+" flag an octal number with wrong digits
+syn match tadsOctalError "\<0[0-7]*[89]"
+
+" Removed complicated c_comment_strings
+syn region tadsComment start="/\*" end="\*/" contains=tadsTodo
+syn match tadsComment "//.*" contains=tadsTodo
+syntax match tadsCommentError "\*/"
+
+syn region tadsPreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=tadsComment,tadsString,tadsNumber,tadsCommentError
+syn region tadsIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match tadsIncluded contained "<[^>]*>"
+syn match tadsInclude "^\s*#\s*include\>\s*["<]" contains=tadsIncluded
+syn region tadsDefine start="^\s*#\s*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,tadsPreCondit,tadsIncluded,tadsInclude,tadsDefine,tadsInBrace,tadsIdentifier
+
+syn region tadsPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,tadsPreCondit,tadsIncluded,tadsInclude,tadsDefine,tadsInParen,tadsIdentifier
+
+" Highlight User Labels
+" TODO labels for gotos?
+"syn region cMulti transparent start='?' end=':' contains=ALLBUT,cIncluded,cSpecial,cTodo,cUserCont,cUserLabel,cBitField
+" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
+"syn match cUserCont "^\s*\I\i*\s*:$" contains=cUserLabel
+"syn match cUserCont ";\s*\I\i*\s*:$" contains=cUserLabel
+"syn match cUserCont "^\s*\I\i*\s*:[^:]" contains=cUserLabel
+"syn match cUserCont ";\s*\I\i*\s*:[^:]" contains=cUserLabel
+
+"syn match cUserLabel "\I\i*" contained
+
+" identifier: class-name [, class-name [...]] [property-list] ;
+" Don't highlight comment in class def
+syn match tadsClassDef "\<class\>[^/]*" contains=tadsObjectDef,tadsClass
+syn match tadsClass contained "\<class\>"
+syn match tadsObjectDef "\<[a-zA-Z][a-zA-Z0-9_$]*\s*:\s*[a-zA-Z0-9_$]\+\(\s*,\s*[a-zA-Z][a-zA-Z0-9_$]*\)*\(\s*;\)\="
+syn keyword tadsFunction contained function
+syn match tadsFunctionDef "\<[a-zA-Z][a-zA-Z0-9_$]*\s*:\s*function[^{]*" contains=tadsFunction
+"syn region tadsObject transparent start = '[a-zA-Z][\i$]\s*:\s*' end=";" contains=tadsBrace,tadsObjectDef
+
+" How far back do we go to find matching groups
+if !exists("tads_minlines")
+ let tads_minlines = 15
+endif
+exec "syn sync ccomment tadsComment minlines=" . tads_minlines
+if !exists("tads_sync_dist")
+ let tads_sync_dist = 100
+endif
+execute "syn sync maxlines=" . tads_sync_dist
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+" The default methods for highlighting. Can be overridden later
+hi def link tadsFunctionDef Function
+hi def link tadsFunction Structure
+hi def link tadsClass Structure
+hi def link tadsClassDef Identifier
+hi def link tadsObjectDef Identifier
+" no highlight for tadsEmbedded, so it prints as normal text w/in the string
+
+hi def link tadsOperator Operator
+hi def link tadsStructure Structure
+hi def link tadsTodo Todo
+hi def link tadsLabel Label
+hi def link tadsConditional Conditional
+hi def link tadsRepeat Repeat
+hi def link tadsException Exception
+hi def link tadsStatement Statement
+hi def link tadsStorageClass StorageClass
+hi def link tadsKeyWord Keyword
+hi def link tadsSpecial SpecialChar
+hi def link tadsNumber Number
+hi def link tadsBoolean Boolean
+hi def link tadsDoubleString tadsString
+hi def link tadsSingleString tadsString
+
+hi def link tadsOctalError tadsError
+hi def link tadsCommentError tadsError
+hi def link tadsBraceError tadsError
+hi def link tadsInBrace tadsError
+hi def link tadsError Error
+
+hi def link tadsInclude Include
+hi def link tadsPreProc PreProc
+hi def link tadsDefine Macro
+hi def link tadsIncluded tadsString
+hi def link tadsPreCondit PreCondit
+
+hi def link tadsString String
+hi def link tadsComment Comment
+
+
+
+let b:current_syntax = "tads"
+
+" Changes:
+" 11/18/99 Added a bunch of TADS functions, tadsException
+" 10/22/99 Misspelled Moolenaar (sorry!), c_minlines to tads_minlines
+"
+" vim: ts=8
+
+endif