Compare commits

...

1 Commits

Author SHA1 Message Date
Adam Stankiewicz
17c2b630e1 Write heuristics for perl, closes #550 2020-09-16 15:50:39 +02:00
16 changed files with 1035 additions and 42 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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',

View File

@@ -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

98
ftplugin/bzl.vim Normal file
View File

@@ -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

24
ftplugin/prolog.vim Normal file
View File

@@ -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

View File

@@ -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

98
indent/bzl.vim Normal file
View File

@@ -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

71
indent/prolog.vim Normal file
View File

@@ -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

View File

@@ -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

View File

@@ -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 !~# "^#!"

View File

@@ -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>")

View File

@@ -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')

20
syntax/bzl.vim Normal file
View File

@@ -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

122
syntax/prolog.vim Normal file
View File

@@ -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

175
syntax/tads.vim Normal file
View File

@@ -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