From 17c2b630e1f0f0f02a24fcc664f0df91122e8e00 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Wed, 16 Sep 2020 15:50:39 +0200 Subject: [PATCH] Write heuristics for perl, closes #550 --- README.md | 5 +- autoload/polyglot.vim | 103 +++++++++++++++++++-- autoload/sleuth.vim | 8 ++ ftdetect/polyglot.vim | 141 ++++++++++++++++++++++++----- ftplugin/bzl.vim | 98 ++++++++++++++++++++ ftplugin/prolog.vim | 24 +++++ heuristics.yaml | 69 +++++++++++++- indent/bzl.vim | 98 ++++++++++++++++++++ indent/prolog.vim | 71 +++++++++++++++ packages.yaml | 39 ++++++++ scripts/build | 21 +++-- scripts/test_extensions.vim | 75 ++++++++++++++++ scripts/test_filetypes.vim | 8 ++ syntax/bzl.vim | 20 +++++ syntax/prolog.vim | 122 +++++++++++++++++++++++++ syntax/tads.vim | 175 ++++++++++++++++++++++++++++++++++++ 16 files changed, 1035 insertions(+), 42 deletions(-) create mode 100644 ftplugin/bzl.vim create mode 100644 ftplugin/prolog.vim create mode 100644 indent/bzl.vim create mode 100644 indent/prolog.vim create mode 100644 syntax/bzl.vim create mode 100644 syntax/prolog.vim create mode 100644 syntax/tads.vim diff --git a/README.md b/README.md index 72c32ae11..4034fc26e 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 196 packages it consists of. +- It **installs and updates 120+ times faster** than the 199 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 29287ece8..5d4bfe9a7 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 c1de82cd1..ae101289a 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 41819e05e..1cd0efe75 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("") !~ g:ft_ignore_pat - exe 'setf ' . a:ft + if expand("") !~ 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("") !~ g:ft_ignore_pat - \ | call polyglot#Heuristics() | endif +func! s:PolyglotFallback() + if expand("") !~ 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 - \ 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 000000000..3abebee9e --- /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 000000000..bd813dcec --- /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 +" 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 901241cb4..8b803011e 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 000000000..adda8a858 --- /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 000000000..0426a473e --- /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 +" 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 372abc947..bbdb3214f 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 07bc301bf..c44e8cc80 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 f2aaf66c2..467ac86a0 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", "") +call TestExtension("tt2html", "percent.tt2", "<%filter>") +call TestExtension("tt2html", "html.tt2", "") + +" .html extension +call TestExtension("html", "empty.html", "") +call TestExtension("mason", "mason1.html", "% my $planet = 42;") +call TestExtension("mason", "mason2.html", "<%filter>") diff --git a/scripts/test_filetypes.vim b/scripts/test_filetypes.vim index a84b39e37..02d44ca46 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 000000000..9c0c57811 --- /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 000000000..4d6cb0be5 --- /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 +" 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 000000000..e47375354 --- /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 +" $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 "\[^/]*" contains=tadsObjectDef,tadsClass +syn match tadsClass contained "\" +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