summaryrefslogtreecommitdiffstats
path: root/autoload/polyglot.vim
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2020-09-01 08:33:15 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2020-09-01 08:33:15 +0200
commite166f741ef054ea990aa6d1af85b97ceb82171bb (patch)
tree275e4f7660eaa181cc3e40f71ce72ba8864e6c71 /autoload/polyglot.vim
parentd4fcef1aa835f20f4f9df41eceb406b66f446f70 (diff)
downloadvim-polyglot-4.6.0.tar.gz
vim-polyglot-4.6.0.zip
Some major updates including heuristicsv4.6.0
- Allow to define heuristics in heuristics.yaml - Migrate all filetypes from vim beginning with "a" - Remove enhanced cpp syntax (it was too slow to load) - Use setf instead of set ft for setting filetype (faster) - Override native hauristics with au! - Add globbing of files for packages - Replace predefined dirs with extra_dirs and ignored_dirs - Allow to define proper order of packages with topological sort - Fix powershell detection - Lint and fix many packages.yaml issues - etc etd
Diffstat (limited to 'autoload/polyglot.vim')
-rw-r--r--autoload/polyglot.vim207
1 files changed, 207 insertions, 0 deletions
diff --git a/autoload/polyglot.vim b/autoload/polyglot.vim
new file mode 100644
index 00000000..7d5aa867
--- /dev/null
+++ b/autoload/polyglot.vim
@@ -0,0 +1,207 @@
+" Line continuation is used here, remove 'C' from 'cpoptions'
+let s:cpo_save = &cpo
+set cpo&vim
+
+func! polyglot#Heuristics()
+ " Try to detect filetype from shebang
+ let l:filetype = polyglot#Shebang()
+ if l:filetype != ""
+ exec "setf " . l:filetype
+ return
+ endif
+endfunc
+
+let s:interpreters = {
+ \ 'osascript': 'applescript',
+ \ 'tcc': 'c',
+ \ 'coffee': 'coffee',
+ \ 'crystal': 'crystal',
+ \ 'dart': 'dart',
+ \ 'elixir': 'elixir',
+ \ 'escript': 'erlang',
+ \ 'fish': 'fish',
+ \ 'gnuplot': 'gnuplot',
+ \ 'runhaskell': 'haskell',
+ \ 'chakra': 'javascript',
+ \ 'd8': 'javascript',
+ \ 'gjs': 'javascript',
+ \ 'js': 'javascript',
+ \ 'node': 'javascript',
+ \ 'nodejs': 'javascript',
+ \ 'qjs': 'javascript',
+ \ 'rhino': 'javascript',
+ \ 'v8': 'javascript',
+ \ 'v8-shell': 'javascript',
+ \ 'julia': 'julia',
+ \ 'lua': 'lua',
+ \ 'moon': 'moon',
+ \ 'ocaml': 'ocaml',
+ \ 'ocamlrun': 'ocaml',
+ \ 'ocamlscript': 'ocaml',
+ \ 'cperl': 'perl',
+ \ 'perl': 'perl',
+ \ 'php': 'php',
+ \ 'pwsh': 'ps1',
+ \ 'python': 'python',
+ \ 'python2': 'python',
+ \ 'python3': 'python',
+ \ 'qmake': 'qmake',
+ \ 'Rscript': 'r',
+ \ 'racket': 'racket',
+ \ 'perl6': 'raku',
+ \ 'raku': 'raku',
+ \ 'rakudo': 'raku',
+ \ 'ruby': 'ruby',
+ \ 'macruby': 'ruby',
+ \ 'rake': 'ruby',
+ \ 'jruby': 'ruby',
+ \ 'rbx': 'ruby',
+ \ 'scala': 'scala',
+ \ 'ash': 'sh',
+ \ 'bash': 'sh',
+ \ 'dash': 'sh',
+ \ 'ksh': 'sh',
+ \ 'mksh': 'sh',
+ \ 'pdksh': 'sh',
+ \ 'rc': 'sh',
+ \ 'sh': 'sh',
+ \ 'zsh': 'sh',
+ \ 'boolector': 'smt2',
+ \ 'cvc4': 'smt2',
+ \ 'mathsat5': 'smt2',
+ \ 'opensmt': 'smt2',
+ \ 'smtinterpol': 'smt2',
+ \ 'smt-rat': 'smt2',
+ \ 'stp': 'smt2',
+ \ 'verit': 'smt2',
+ \ 'yices2': 'smt2',
+ \ 'z3': 'smt2',
+ \ 'deno': 'typescript',
+ \ 'ts-node': 'typescript',
+ \ }
+
+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()
+ let l:line1 = getline(1)
+
+ if l:line1 !~# "^#!"
+ return
+ endif
+
+ let l:pathrest = matchlist(l:line1, s:r_hashbang)
+
+ if len(l:pathrest) == 0
+ return
+ endif
+
+ let [_, l:path, l:rest; __] = l:pathrest
+
+ let l:script = split(l:path, "/")[-1]
+
+ if l:script == "env"
+ let l:argspath = matchlist(l:rest, s:r_env)
+ if len(l:argspath) == 0
+ return
+ endif
+
+ let l:script = l:argspath[1]
+ endif
+
+ if has_key(s:interpreters, l:script)
+ return s:interpreters[l:script]
+ endif
+
+ for interpreter in keys(s:interpreters)
+ if l:script =~# '^' . interpreter
+ return s:interpreters[interpreter]
+ endif
+ endfor
+endfunc
+
+func! polyglot#DetectInpFiletype()
+ let line = getline(1)
+ if line =~# '^\*'
+ setf abaqus | return
+ endif
+ for lnum in range(1, min([line("$"), 500]))
+ let line = getline(lnum)
+ if line =~? '^header surface data'
+ setf trasys | return
+ endif
+ endfor
+endfunc
+
+func! polyglot#DetectAsaFiletype()
+ if exists("g:filetype_asa")
+ exe "setf " . g:filetype_asa | return
+ endif
+ setf aspvbs | return
+endfunc
+
+func! polyglot#DetectAspFiletype()
+ if exists("g:filetype_asp")
+ exe "setf " . g:filetype_asp | return
+ endif
+ for lnum in range(1, min([line("$"), 3]))
+ let line = getline(lnum)
+ if line =~? 'perlscript'
+ setf aspperl | return
+ endif
+ endfor
+ setf aspvbs | return
+endfunc
+
+func! polyglot#DetectMFiletype()
+ let saw_comment = 0
+ for lnum in range(1, min([line("$"), 100]))
+ let line = getline(lnum)
+ if line =~# '^\s*/\*'
+ let saw_comment = 1
+ endif
+ if line =~# '^\s*\(@\(interface\|class\|protocol\|property\|end\|synchronised\|selector\|implementation\)\(\<\|\>\)\|#import\s\+.\+\.h[">]\)'
+ setf objc | return
+ endif
+ if line =~# '^\s*%'
+ setf octave | return
+ endif
+ if line =~# '^\s*(\*'
+ setf mma | return
+ endif
+ if line =~? '^\s*\(\(type\|var\)\(\<\|\>\)\|--\)'
+ setf murphi | return
+ endif
+ endfor
+ if saw_comment
+ setf objc | return
+ endif
+ if exists("g:filetype_m")
+ exe "setf " . g:filetype_m | return
+ endif
+ setf octave | return
+endfunc
+
+func! polyglot#DetectFsFiletype()
+ for lnum in range(1, min([line("$"), 50]))
+ let line = getline(lnum)
+ if line =~# '^\(: \|new-device\)'
+ setf forth | return
+ endif
+ if line =~# '^\s*\(#light\|import\|let\|module\|namespace\|open\|type\)'
+ setf fsharp | return
+ endif
+ if line =~# '\s*\(#version\|precision\|uniform\|varying\|vec[234]\)'
+ setf glsl | return
+ endif
+ endfor
+ if exists("g:filetype_fs")
+ exe "setf " . g:filetype_fs | return
+ endif
+ setf forth | return
+endfunc
+
+" Restore 'cpoptions'
+let &cpo = s:cpo_save
+unlet s:cpo_save