Compare commits

...

2 Commits

Author SHA1 Message Date
Adam Stankiewicz
7123e97498 Disable native autocommands when appropriate, fixes #533 2020-09-03 05:36:55 +02:00
Adam Stankiewicz
63119f09d1 Automatically detect indentation, closes #529 2020-09-01 23:38:17 +02:00
6 changed files with 683 additions and 36 deletions

View File

@@ -11,7 +11,7 @@ A collection of language packs for Vim.
- 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).
- No support for esoteric languages, only most popular ones (modern too, like `slim`).
- Automatically detect indentation (includes performance-optimized version of [vim-sleuth](https://github.com/tpope/vim-sleuth))
- Each build is tested by automated vimrunner script on CI. See `spec` directory.
\*To be completely honest, optimized `ftdetect` script takes around `19ms` to load.

221
autoload/sleuth.vim Normal file
View File

@@ -0,0 +1,221 @@
let s:globs = {
\ '8th': '{*.8th,}',
\ 'Dockerfile': '{*.dockerfile,*.dock,*.Dockerfile,Dockerfile,dockerfile,Dockerfile*,}',
\ 'Jenkinsfile': '{*.jenkinsfile,*.Jenkinsfile,Jenkinsfile,Jenkinsfile*,}',
\ 'a2ps': '{a2psrc,.a2psrc,}',
\ 'a65': '{*.a65,}',
\ 'aap': '{*.aap,}',
\ 'abap': '{*.abap,}',
\ 'abaqus': '{*.inp,}',
\ 'abc': '{*.abc,}',
\ 'abel': '{*.abl,}',
\ 'acedb': '{*.wrm,}',
\ 'ada': '{*.adb,*.ads,*.ada,*.gpr,}',
\ 'ahdl': '{*.tdf,}',
\ 'aidl': '{*.aidl,}',
\ 'alsaconf': '{.asoundrc,}',
\ 'aml': '{*.aml,}',
\ 'ampl': '{*.run,}',
\ 'ant': '{build.xml,}',
\ 'apache': '{.htaccess,}',
\ 'apiblueprint': '{*.apib,}',
\ 'applescript': '{*.applescript,*.scpt,}',
\ 'aptconf': '{apt.conf,}',
\ 'arch': '{.arch-inventory,=tagging-method,}',
\ 'arduino': '{*.pde,*.ino,}',
\ 'art': '{*.art,}',
\ 'asciidoc': '{*.asciidoc,*.adoc,*.asc,}',
\ 'asl': '{*.asl,*.dsl,}',
\ 'asn': '{*.asn,*.asn1,}',
\ 'aspperl': '{*.asp,}',
\ 'aspvbs': '{*.asa,*.asp,}',
\ 'atlas': '{*.atl,*.as,}',
\ 'autohotkey': '{*.ahk,*.ahkl,}',
\ 'autoit': '{*.au3,}',
\ 'automake': '{[Mm]akefile.am,GNUmakefile.am,}',
\ 'ave': '{*.ave,}',
\ 'awk': '{*.awk,}',
\ 'blade': '{*.blade,*.blade.php,}',
\ 'brewfile': '{Brewfile,}',
\ 'c': '{*.c,*.cats,*.h,*.idc,}',
\ 'caddyfile': '{Caddyfile,}',
\ 'carp': '{*.carp,}',
\ 'clojure': '{*.clj,*.boot,*.cl2,*.cljc,*.cljs,*.cljs.hl,*.cljscm,*.cljx,*.hic,*.edn,riemann.config,build.boot,profile.boot,}',
\ 'cmake': '{*.cmake,*.cmake.in,CMakeLists.txt,}',
\ 'coffee': '{*.coffee,*._coffee,*.cake,*.cjsx,*.iced,*.coffeekup,Cakefile,}',
\ 'cpp': '{*.cpp,*.c++,*.cc,*.cp,*.cxx,*.h,*.h++,*.hh,*.hpp,*.hxx,*.inc,*.inl,*.ipp,*.tcc,*.tpp,}',
\ 'cql': '{*.cql,}',
\ 'cryptol': '{*.cry,*.cyl,*.lcry,*.lcyl,}',
\ 'crystal': '{*.cr,Projectfile,}',
\ 'csv': '{*.csv,*.tsv,*.tab,}',
\ 'cucumber': '{*.feature,*.story,}',
\ 'cuesheet': '{*.cue,}',
\ 'd': '{*.d,*.di,}',
\ 'dart': '{*.dart,}',
\ 'dcov': '{*.lst,}',
\ 'dd': '{*.dd,}',
\ 'ddoc': '{*.ddoc,}',
\ 'dhall': '{*.dhall,}',
\ 'dosini': '{*.wrap,}',
\ 'dsdl': '{*.sdl,}',
\ 'dune': '{jbuild,dune,dune-project,dune-workspace,}',
\ 'ecrystal': '{*.ecr,}',
\ 'eelixir': '{*.eex,*.leex,}',
\ 'elf': '{*.am,}',
\ 'elixir': '{*.ex,*.exs,mix.lock,}',
\ 'elm': '{*.elm,}',
\ 'embeddedpuppet': '{*.epp,}',
\ 'ember-script': '{*.em,*.emberscript,}',
\ 'emblem': '{*.emblem,*.em,}',
\ 'erlang': '{*.erl,*.app.src,*.es,*.escript,*.hrl,*.xrl,*.yrl,*.app,*.yaws,Emakefile,rebar.config,rebar.config.lock,rebar.lock,}',
\ 'eruby': '{*.erb,*.erb.deface,*.rhtml,}',
\ 'fbs': '{*.fbs,}',
\ 'fennel': '{*.fnl,}',
\ 'ferm': '{*.ferm,ferm.conf,}',
\ 'fish': '{*.fish,}',
\ 'flow': '{*.flow,}',
\ 'forth': '{*.fs,*.ft,*.fth,}',
\ 'fsharp': '{*.fs,*.fsi,*.fsx,}',
\ 'gdscript3': '{*.gd,}',
\ 'gitcommit': '{,}',
\ 'gitconfig': '{*.gitconfig,.gitconfig,.gitmodules,}',
\ 'gitrebase': '{git-rebase-todo,}',
\ 'gitsendemail': '{.gitsendemail.*,}',
\ 'glsl': '{*.glsl,*.fp,*.frag,*.frg,*.fs,*.fsh,*.fshader,*.geo,*.geom,*.glslf,*.glslv,*.gs,*.gshader,*.shader,*.tesc,*.tese,*.vert,*.vrx,*.vsh,*.vshader,*.comp,}',
\ 'gmpl': '{*.mod,}',
\ 'gnuplot': '{*.gp,*.gnu,*.gnuplot,*.p,*.plot,*.plt,}',
\ 'go': '{*.go,}',
\ 'gohtmltmpl': '{*.tmpl,}',
\ 'gomod': '{go.mod,}',
\ 'graphql': '{*.graphql,*.gql,*.graphqls,}',
\ 'groovy': '{*.gradle,}',
\ 'grub': '{,}',
\ 'haml': '{*.haml,*.haml.deface,*.hamlc,*.hamlbars,}',
\ 'haproxy': '{*.cfg,haproxy.cfg,haproxy*.c*,}',
\ 'haskell': '{*.hs,*.hs-boot,*.hsc,*.bpk,*.hsig,}',
\ 'haxe': '{*.hx,*.hxsl,}',
\ 'hcl': '{*.hcl,*.nomad,*.workflow,Appfile,}',
\ 'helm': '{,}',
\ 'help': '{,}',
\ 'hive': '{*.q,*.hql,*.ql,}',
\ 'html': '{*.html,*.htm,*.html.hl,*.inc,*.st,*.xht,*.xhtml,}',
\ 'html.twig': '{*.twig,}',
\ 'i3config': '{*.i3.config,*.i3config,i3.config,i3config,.i3.config,.i3config,}',
\ 'icalendar': '{*.ics,}',
\ 'idris': '{*.idr,*.lidr,idris-response,}',
\ 'ion': '{*.ion,}',
\ 'javascript': '{*.js,*._js,*.bones,*.cjs,*.es,*.es6,*.frag,*.gs,*.jake,*.jsb,*.jscad,*.jsfl,*.jsm,*.jss,*.mjs,*.njs,*.pac,*.sjs,*.ssjs,*.xsjs,*.xsjslib,Jakefile,}',
\ 'javascriptreact': '{*.jsx,}',
\ 'jinja.html': '{*.jinja,*.j2,*.jinja2,}',
\ 'jq': '{*.jq,.jqrc,}',
\ 'json': '{*.json,*.avsc,*.geojson,*.gltf,*.har,*.ice,*.JSON-tmLanguage,*.jsonl,*.mcmeta,*.tfstate,*.tfstate.backup,*.topojson,*.webapp,*.webmanifest,*.yy,*.yyp,*.jsonp,*.template,.arcconfig,.htmlhintrc,.tern-config,.tern-project,.watchmanconfig,composer.lock,mcmod.info,}',
\ 'json5': '{*.json5,}',
\ 'jsonnet': '{*.jsonnet,*.libsonnet,}',
\ 'jst': '{*.ejs,*.ect,*.jst,}',
\ 'julia': '{*.jl,}',
\ 'kotlin': '{*.kt,*.ktm,*.kts,}',
\ 'ledger': '{*.ldg,*.ledger,*.journal,}',
\ 'less': '{*.less,}',
\ 'lilypond': '{*.ly,*.ily,}',
\ 'litcoffee': '{*.litcoffee,*.coffee.md,}',
\ 'livescript': '{*.ls,*._ls,Slakefile,}',
\ 'llvm': '{*.ll,}',
\ 'log': '{*.log,*.LOG,*_log,*_LOG,}',
\ 'lua': '{*.lua,*.fcgi,*.nse,*.p8,*.pd_lua,*.rbxs,*.rockspec,*.wlua,.luacheckrc,}',
\ 'm4': '{*.m4,*.at,}',
\ 'mako': '{*.mako,*.mao,}',
\ 'markdown': '{*.md,*.markdown,*.mdown,*.mdwn,*.mkd,*.mkdn,*.mkdown,*.ronn,*.workbook,contents.lr,}',
\ 'markdown.mdx': '{*.mdx,}',
\ 'meson': '{meson.build,meson_options.txt,}',
\ 'mma': '{*.mathematica,*.cdf,*.m,*.ma,*.mt,*.nb,*.nbp,*.wl,*.wlt,*.wls,}',
\ 'moon': '{*.moon,}',
\ 'murphi': '{*.m,}',
\ 'mustache': '{*.handlebars,*.hbs,*.hulk,*.hjs,*.mustache,*.njk,*.hogan,*.hdbs,*.hb,}',
\ 'nginx': '{*.nginx,*.nginxconf,*.vhost,nginx.conf,nginx*.conf,*nginx.conf,}',
\ 'nim': '{*.nim,*.nim.cfg,*.nimble,*.nimrod,*.nims,nim.cfg,}',
\ 'nix': '{*.nix,}',
\ 'oasis': '{_oasis,}',
\ 'objc': '{*.m,*.h,}',
\ 'ocaml': '{*.ml,*.eliom,*.eliomi,*.ml4,*.mli,*.mll,*.mly,*.mlt,*.mlp,*.mlip,*.mli.cppo,*.ml.cppo,.ocamlinit,}',
\ 'ocamlbuild_tags': '{_tags,}',
\ 'ocpbuild': '{*.ocp,}',
\ 'ocpbuildroot': '{*.root,}',
\ 'octave': '{*.oct,*.m,}',
\ 'omake': '{*.om,OMakefile,OMakeroot,OMakeroot.in,}',
\ 'opam': '{*.opam,*.opam.template,opam,}',
\ 'opencl': '{*.cl,*.opencl,}',
\ '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,.php,.php_cs,.php_cs.dist,Phakefile,}',
\ 'plantuml': '{*.puml,*.iuml,*.plantuml,*.uml,*.pu,}',
\ 'pony': '{*.pony,}',
\ 'proto': '{*.proto,}',
\ 'ps1': '{*.ps1,*.psd1,*.psm1,*.pssc,}',
\ 'ps1xml': '{*.ps1xml,}',
\ 'pug': '{*.jade,*.pug,}',
\ 'puppet': '{*.pp,Modulefile,}',
\ 'purescript': '{*.purs,}',
\ 'python': '{*.py,*.cgi,*.fcgi,*.gyp,*.gypi,*.lmi,*.py3,*.pyde,*.pyi,*.pyp,*.pyt,*.pyw,*.rpy,*.smk,*.spec,*.tac,*.wsgi,*.xpy,.gclient,DEPS,SConscript,SConstruct,Snakefile,wscript,}',
\ 'qmake': '{*.pro,*.pri,}',
\ 'qml': '{*.qml,*.qbs,}',
\ 'r': '{*.r,*.rsx,*.s,*.S,.Rprofile,expr-dist,}',
\ 'racket': '{*.rkt,*.rktd,*.rktl,*.scrbl,}',
\ 'ragel': '{*.rl,}',
\ 'raku': '{*.6pl,*.6pm,*.nqp,*.p6,*.p6l,*.p6m,*.pl,*.pl6,*.pm,*.pm6,*.t,*.rakudoc,*.rakutest,*.raku,*.rakumod,*.pod6,*.t6,}',
\ 'raml': '{*.raml,}',
\ 'razor': '{*.cshtml,*.razor,}',
\ 'reason': '{*.re,*.rei,}',
\ 'requirements': '{*.pip,*requirements.{txt,in},*require.{txt,in},constraints.{txt,in},}',
\ 'rhelp': '{*.rd,}',
\ 'rst': '{*.rst,*.rest,*.rest.txt,*.rst.txt,}',
\ 'ruby': '{*.rb,*.builder,*.eye,*.fcgi,*.gemspec,*.god,*.jbuilder,*.mspec,*.pluginspec,*.podspec,*.rabl,*.rake,*.rbi,*.rbuild,*.rbw,*.rbx,*.ru,*.ruby,*.spec,*.thor,*.watchr,*.rxml,*.rjs,*.rant,*.axlsx,*.cap,*.opal,.irbrc,.pryrc,.simplecov,Appraisals,Berksfile,Buildfile,Capfile,Dangerfile,Deliverfile,Fastfile,Gemfile,Gemfile.lock,Guardfile,Jarfile,Mavenfile,Podfile,Puppetfile,Rakefile,Snapfile,Thorfile,Vagrantfile,buildfile,Rantfile,.autotest,Cheffile,KitchenSink,Routefile,.Guardfile,.Brewfile,vagrantfile,[Rr]akefile*,*_spec.rb,}',
\ 'rust': '{*.rs,*.rs.in,}',
\ 'sbt.scala': '{*.sbt,}',
\ 'scala': '{*.scala,*.kojo,*.sc,}',
\ 'scss': '{*.scss,}',
\ 'sexplib': '{*.sexp,}',
\ 'sh': '{*.sh,*.bash,*.bats,*.cgi,*.command,*.env,*.fcgi,*.ksh,*.sh.in,*.tmux,*.tool,.bash_aliases,.bash_history,.bash_logout,.bash_profile,.bashrc,.cshrc,.env,.env.example,.flaskenv,.login,.profile,9fs,PKGBUILD,bash_aliases,bash_logout,bash_profile,bashrc,cshrc,gradlew,login,man,profile,}',
\ 'slim': '{*.slim,}',
\ 'slime': '{*.slime,}',
\ 'smt2': '{*.smt2,*.smt,}',
\ 'solidity': '{*.sol,}',
\ 'sql': '{*.pgsql,}',
\ 'stylus': '{*.styl,*.stylus,}',
\ 'svelte': '{*.svelte,}',
\ 'svg': '{*.svg,}',
\ 'swift': '{*.swift,}',
\ 'sxhkdrc': '{*.sxhkdrc,sxhkdrc,}',
\ 'systemd': '{*.automount,*.mount,*.path,*.service,*.socket,*.swap,*.target,*.timer,}',
\ 'tablegen': '{*.td,}',
\ 'terraform': '{*.hcl,*.nomad,*.tf,*.tfvars,*.workflow,}',
\ 'textile': '{*.textile,}',
\ 'thrift': '{*.thrift,}',
\ 'tmux': '{.tmux.conf,}',
\ 'toml': '{*.toml,Cargo.lock,Gopkg.lock,poetry.lock,Pipfile,}',
\ 'tptp': '{*.p,*.tptp,*.ax,}',
\ 'trasys': '{*.inp,}',
\ 'typescript': '{*.ts,}',
\ 'typescriptreact': '{*.tsx,}',
\ 'unison': '{*.u,*.uu,}',
\ 'v': '{*.v,}',
\ 'vala': '{*.vala,*.vapi,*.valadoc,}',
\ 'vbnet': '{*.vb,*.vbhtml,}',
\ 'vcl': '{*.vcl,}',
\ 'velocity': '{*.vm,}',
\ 'vmasm': '{*.mar,}',
\ 'vue': '{*.vue,*.wpy,}',
\ '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,.classpath,.cproject,.project,App.config,NuGet.config,Settings.StyleCop,Web.Debug.config,Web.Release.config,Web.config,packages.config,}',
\ 'xml.twig': '{*.xml.twig,}',
\ 'xsl': '{*.xslt,*.xsl,}',
\ 'yaml': '{*.yml,*.mir,*.reek,*.rviz,*.sublime-syntax,*.syntax,*.yaml,*.yaml-tmlanguage,*.yaml.sed,*.yml.mysql,.clang-format,.clang-tidy,.gemrc,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,}',
\ 'yaml.docker-compose': '{docker-compose*.yaml,docker-compose*.yml,}',
\ 'zephir': '{*.zep,}',
\ 'zig': '{*.zig,*.zir,}',
\ 'zir': '{*.zir,}',
\ 'zsh': '{*.zsh,.zshrc,.zshenv,.zlogin,.zprofile,.zlogout,}',
\}
func! sleuth#GlobForFiletype(type)
return get(s:globs, a:type, '')
endfunc

View File

@@ -59,6 +59,230 @@ if !exists('g:python_highlight_all')
call s:SetDefault('g:python_highlight_file_headers_as_comments', 1)
call s:SetDefault('g:python_slow_sync', 1)
endif
if !has_key(s:disabled_packages, '8th')
au! BufRead,BufNewFile *.8th
endif
if !has_key(s:disabled_packages, 'a65')
au! BufRead,BufNewFile *.a65
endif
if !has_key(s:disabled_packages, 'aap')
au! BufRead,BufNewFile *.aap
endif
if !has_key(s:disabled_packages, 'abap')
au! BufRead,BufNewFile *.abap
endif
if !has_key(s:disabled_packages, 'abc')
au! BufRead,BufNewFile *.abc
endif
if !has_key(s:disabled_packages, 'acpiasl')
au! BufRead,BufNewFile *.dsl
endif
if !has_key(s:disabled_packages, 'ada')
au! BufRead,BufNewFile *.ada
endif
if !has_key(s:disabled_packages, 'aidl')
au! BufRead,BufNewFile *.aidl
endif
if !has_key(s:disabled_packages, 'aml')
au! BufRead,BufNewFile *.aml
endif
if !has_key(s:disabled_packages, 'applescript')
au! BufRead,BufNewFile *.applescript
endif
if !has_key(s:disabled_packages, 'art')
au! BufRead,BufNewFile *.art
endif
if !has_key(s:disabled_packages, 'asciidoc')
au! BufRead,BufNewFile *.asciidoc
endif
if !has_key(s:disabled_packages, 'asn')
au! BufRead,BufNewFile *.asn
endif
if !has_key(s:disabled_packages, 'ave')
au! BufRead,BufNewFile *.ave
endif
if !has_key(s:disabled_packages, 'awk')
au! BufRead,BufNewFile *.awk
endif
if !has_key(s:disabled_packages, 'c/c++')
au! BufRead,BufNewFile *.c,*.cpp,*.tpp
endif
if !has_key(s:disabled_packages, 'cmake')
au! BufRead,BufNewFile *.cmake
endif
if !has_key(s:disabled_packages, 'dart')
au! BufRead,BufNewFile *.dart
endif
if !has_key(s:disabled_packages, 'dlang')
au! BufRead,BufNewFile *.sdl
endif
if !has_key(s:disabled_packages, 'dockerfile')
au! BufRead,BufNewFile *.dockerfile
endif
if !has_key(s:disabled_packages, 'elm')
au! BufRead,BufNewFile *.elm
endif
if !has_key(s:disabled_packages, 'git')
au! BufRead,BufNewFile *.gitconfig
endif
if !has_key(s:disabled_packages, 'gnuplot')
au! BufRead,BufNewFile *.gp,*.gnuplot
endif
if !has_key(s:disabled_packages, 'go')
au! BufRead,BufNewFile *.go
endif
if !has_key(s:disabled_packages, 'haml')
au! BufRead,BufNewFile *.haml
endif
if !has_key(s:disabled_packages, 'handlebars')
au! BufRead,BufNewFile *.hb
endif
if !has_key(s:disabled_packages, 'haproxy')
au! BufRead,BufNewFile *.cfg
endif
if !has_key(s:disabled_packages, 'html5')
au! BufRead,BufNewFile *.st,*.xhtml
endif
if !has_key(s:disabled_packages, 'json')
au! BufRead,BufNewFile *.json,*.template
endif
if !has_key(s:disabled_packages, 'less')
au! BufRead,BufNewFile *.less
endif
if !has_key(s:disabled_packages, 'lua')
au! BufRead,BufNewFile *.lua
endif
if !has_key(s:disabled_packages, 'm4')
au! BufRead,BufNewFile *.m4
endif
if !has_key(s:disabled_packages, 'markdown')
au! BufRead,BufNewFile *.markdown
endif
if !has_key(s:disabled_packages, 'opencl')
au! BufRead,BufNewFile *.cl
endif
if !has_key(s:disabled_packages, 'perl')
au! BufRead,BufNewFile *.perl
endif
if !has_key(s:disabled_packages, 'php')
au! BufRead,BufNewFile *.php
endif
if !has_key(s:disabled_packages, 'protobuf')
au! BufRead,BufNewFile *.proto
endif
if !has_key(s:disabled_packages, 'python')
au! BufRead,BufNewFile *.spec
endif
if !has_key(s:disabled_packages, 'r-lang')
au! BufRead,BufNewFile *.r
endif
if !has_key(s:disabled_packages, 'raku')
au! BufRead,BufNewFile *.pod6
endif
if !has_key(s:disabled_packages, 'raml')
au! BufRead,BufNewFile *.raml
endif
if !has_key(s:disabled_packages, 'rst')
au! BufRead,BufNewFile *.rst
endif
if !has_key(s:disabled_packages, 'ruby')
au! BufRead,BufNewFile *.ruby,*.spec
endif
if !has_key(s:disabled_packages, 'scala')
au! BufRead,BufNewFile *.scala
endif
if !has_key(s:disabled_packages, 'sbt')
au! BufRead,BufNewFile *.sbt
endif
if !has_key(s:disabled_packages, 'scss')
au! BufRead,BufNewFile *.scss
endif
if !has_key(s:disabled_packages, 'sh')
au! BufRead,BufNewFile *.sh,*.tmux,*.zsh
endif
if !has_key(s:disabled_packages, 'svg')
au! BufRead,BufNewFile *.svg
endif
if !has_key(s:disabled_packages, 'swift')
au! BufRead,BufNewFile *.swift
endif
if !has_key(s:disabled_packages, 'terraform')
au! BufRead,BufNewFile *.tf
endif
if !has_key(s:disabled_packages, 'twig')
au! BufRead,BufNewFile *.twig
endif
if !has_key(s:disabled_packages, 'vbnet')
au! BufRead,BufNewFile *.vb
endif
if !has_key(s:disabled_packages, 'vue')
au! BufRead,BufNewFile *.vue
endif
if !has_key(s:disabled_packages, 'xml')
au! BufRead,BufNewFile *.xml,*.ant,*.xsd
endif
if !has_key(s:disabled_packages, 'xsl')
au! BufRead,BufNewFile *.xslt
endif
if !has_key(s:disabled_packages, 'yaml')
au! BufRead,BufNewFile *.yaml
endif
if !has_key(s:disabled_packages, '8th')
au BufNewFile,BufRead *.8th setf 8th
endif
@@ -240,11 +464,9 @@ if !has_key(s:disabled_packages, 'c/c++')
au BufNewFile,BufRead *.hxx setf cpp
au BufNewFile,BufRead *.inc setf cpp
au BufNewFile,BufRead *.inl setf cpp
au BufNewFile,BufRead *.ino setf cpp
au BufNewFile,BufRead *.ipp setf cpp
au BufNewFile,BufRead *.tcc setf cpp
au BufNewFile,BufRead *.tpp setf cpp
au! BufNewFile,BufRead *.re call polyglot#DetectReFiletype()
endif
if !has_key(s:disabled_packages, 'caddyfile')
@@ -535,8 +757,6 @@ endif
if !has_key(s:disabled_packages, 'hcl')
au BufNewFile,BufRead *.hcl setf hcl
au BufNewFile,BufRead *.nomad setf hcl
au BufNewFile,BufRead *.tf setf hcl
au BufNewFile,BufRead *.tfvars setf hcl
au BufNewFile,BufRead *.workflow setf hcl
au BufNewFile,BufRead Appfile setf hcl
endif
@@ -621,7 +841,6 @@ if !has_key(s:disabled_packages, 'jinja')
au BufNewFile,BufRead *.j2 setf jinja.html
au BufNewFile,BufRead *.jinja setf jinja.html
au BufNewFile,BufRead *.jinja2 setf jinja.html
au BufNewFile,BufRead *.njk setf jinja.html
endif
if !has_key(s:disabled_packages, 'jq')
@@ -768,7 +987,6 @@ if !has_key(s:disabled_packages, 'markdown')
au BufNewFile,BufRead *.md setf markdown
au BufNewFile,BufRead *.mdown setf markdown
au BufNewFile,BufRead *.mdwn setf markdown
au BufNewFile,BufRead *.mdx setf markdown
au BufNewFile,BufRead *.mkd setf markdown
au BufNewFile,BufRead *.mkdn setf markdown
au BufNewFile,BufRead *.mkdown setf markdown
@@ -881,7 +1099,6 @@ endif
if !has_key(s:disabled_packages, 'pgsql')
au BufNewFile,BufRead *.pgsql let b:sql_type_override='pgsql' | set ft=sql
au BufNewFile,BufRead *.sql let b:sql_type_override='pgsql' | set ft=sql
endif
if !has_key(s:disabled_packages, 'cql')
@@ -1002,7 +1219,6 @@ endif
if !has_key(s:disabled_packages, 'r-lang')
au BufNewFile,BufRead *.S setf r
au BufNewFile,BufRead *.r setf r
au BufNewFile,BufRead *.rd setf r
au BufNewFile,BufRead *.rsx setf r
au BufNewFile,BufRead *.s setf r
au BufNewFile,BufRead {.,}Rprofile setf r
@@ -1093,7 +1309,6 @@ if !has_key(s:disabled_packages, 'ruby')
au BufNewFile,BufRead {.,}simplecov setf ruby
au BufNewFile,BufRead Appraisals setf ruby
au BufNewFile,BufRead Berksfile setf ruby
au BufNewFile,BufRead Brewfile setf ruby
au BufNewFile,BufRead Buildfile setf ruby
au BufNewFile,BufRead Capfile setf ruby
au BufNewFile,BufRead Cheffile setf ruby
@@ -1140,7 +1355,6 @@ endif
if !has_key(s:disabled_packages, 'scala')
au BufNewFile,BufRead *.kojo setf scala
au BufNewFile,BufRead *.sbt setf scala
au BufNewFile,BufRead *.sc setf scala
au BufNewFile,BufRead *.scala setf scala
endif
@@ -1165,7 +1379,6 @@ if !has_key(s:disabled_packages, 'sh')
au BufNewFile,BufRead *.sh.in setf sh
au BufNewFile,BufRead *.tmux setf sh
au BufNewFile,BufRead *.tool setf sh
au BufNewFile,BufRead *.zsh setf sh
au BufNewFile,BufRead {.,}bash_aliases setf sh
au BufNewFile,BufRead {.,}bash_history setf sh
au BufNewFile,BufRead {.,}bash_logout setf sh
@@ -1177,11 +1390,6 @@ if !has_key(s:disabled_packages, 'sh')
au BufNewFile,BufRead {.,}flaskenv setf sh
au BufNewFile,BufRead {.,}login setf sh
au BufNewFile,BufRead {.,}profile setf sh
au BufNewFile,BufRead {.,}zlogin setf sh
au BufNewFile,BufRead {.,}zlogout setf sh
au BufNewFile,BufRead {.,}zprofile setf sh
au BufNewFile,BufRead {.,}zshenv setf sh
au BufNewFile,BufRead {.,}zshrc setf sh
au BufNewFile,BufRead 9fs setf sh
au BufNewFile,BufRead PKGBUILD setf sh
au BufNewFile,BufRead bash_aliases setf sh
@@ -1193,11 +1401,6 @@ if !has_key(s:disabled_packages, 'sh')
au BufNewFile,BufRead login setf sh
au BufNewFile,BufRead man setf sh
au BufNewFile,BufRead profile setf sh
au BufNewFile,BufRead zlogin setf sh
au BufNewFile,BufRead zlogout setf sh
au BufNewFile,BufRead zprofile setf sh
au BufNewFile,BufRead zshenv setf sh
au BufNewFile,BufRead zshrc setf sh
au BufNewFile,BufRead *.zsh setf zsh
au BufNewFile,BufRead {.,}zlogin setf zsh
au BufNewFile,BufRead {.,}zlogout setf zsh
@@ -1416,8 +1619,6 @@ if !has_key(s:disabled_packages, 'xml')
au BufNewFile,BufRead *.sublime-snippet setf xml
au BufNewFile,BufRead *.targets setf xml
au BufNewFile,BufRead *.tml setf xml
au BufNewFile,BufRead *.ts setf xml
au BufNewFile,BufRead *.tsx setf xml
au BufNewFile,BufRead *.ui setf xml
au BufNewFile,BufRead *.urdf setf xml
au BufNewFile,BufRead *.ux setf xml

View File

@@ -302,6 +302,8 @@ filetypes:
ignored_extensions:
# conflicts with more popular reason, remove after heuristics work
- re
# implemented by arduino
- ino
---
name: caddyfile
remote: isobit/vim-caddyfile

164
plugin/sleuth.vim Normal file
View File

@@ -0,0 +1,164 @@
" Heuristically set buffer options
"
" Modified version of vim-sleuth:
" - softtab and tabstop reduced from 8 to 2
" - number of considered lines reduced from 1024 to 64
" - maximum 6 other files are checked instead of 20
" - check maximum of files 2 per directory level instead of 8
" - maximum of 3 directory levels are checked
" - globs are concatenated for performance
if exists("g:loaded_sleuth") || v:version < 700 || &cp
finish
endif
let g:loaded_sleuth = 1
function! s:guess(lines) abort
let options = {}
let heuristics = {'spaces': 0, 'hard': 0, 'soft': 0}
let ccomment = 0
let podcomment = 0
let triplequote = 0
let backtick = 0
let xmlcomment = 0
let softtab = repeat(' ', 2)
for line in a:lines
if !len(line) || line =~# '^\s*$'
continue
endif
if line =~# '^\s*/\*'
let ccomment = 1
endif
if ccomment
if line =~# '\*/'
let ccomment = 0
endif
continue
endif
if line =~# '^=\w'
let podcomment = 1
endif
if podcomment
if line =~# '^=\%(end\|cut\)\>'
let podcomment = 0
endif
continue
endif
if triplequote
if line =~# '^[^"]*"""[^"]*$'
let triplequote = 0
endif
continue
elseif line =~# '^[^"]*"""[^"]*$'
let triplequote = 1
endif
if backtick
if line =~# '^[^`]*`[^`]*$'
let backtick = 0
endif
continue
elseif &filetype ==# 'go' && line =~# '^[^`]*`[^`]*$'
let backtick = 1
endif
if line =~# '^\s*<\!--'
let xmlcomment = 1
endif
if xmlcomment
if line =~# '-->'
let xmlcomment = 0
endif
continue
endif
if line =~# '^\t'
let heuristics.hard += 1
elseif line =~# '^' . softtab
let heuristics.soft += 1
endif
if line =~# '^ '
let heuristics.spaces += 1
endif
let indent = len(matchstr(substitute(line, '\t', softtab, 'g'), '^ *'))
if indent > 1 && (indent < 4 || indent % 2 == 0) &&
\ get(options, 'shiftwidth', 99) > indent
let options.shiftwidth = indent
endif
endfor
if heuristics.hard && !heuristics.spaces
return {'expandtab': 0, 'shiftwidth': &tabstop}
elseif heuristics.soft != heuristics.hard
let options.expandtab = heuristics.soft > heuristics.hard
if heuristics.hard
let options.tabstop = 2
endif
endif
return options
endfunction
function! s:apply_if_ready(options) abort
if !has_key(a:options, 'expandtab') || !has_key(a:options, 'shiftwidth')
return 0
else
for [option, value] in items(a:options)
call setbufvar('', '&'.option, value)
endfor
return 1
endif
endfunction
function! s:detect() abort
if &buftype ==# 'help'
return
endif
let options = s:guess(getline(1, 64))
if s:apply_if_ready(options)
return
endif
let c = 6
let pattern = c > 0 ? sleuth#GlobForFiletype(&filetype) : ''
let dir = expand('%:p:h')
let level = 3
while isdirectory(dir) && dir !=# fnamemodify(dir, ':h') && c > 0 && level > 0
let level -= 1
for neighbor in glob(dir.'/'.pattern,0,1)[0:1]
if neighbor !=# expand('%:p') && filereadable(neighbor)
call extend(options, s:guess(readfile(neighbor, '', 32)), 'keep')
let c -= 1
endif
if s:apply_if_ready(options)
let b:sleuth_culprit = neighbor
return
endif
if c <= 0
break
endif
endfor
if c <= 0
break
endif
let dir = fnamemodify(dir, ':h')
endwhile
if has_key(options, 'shiftwidth')
return s:apply_if_ready(extend({'expandtab': 1}, options))
endif
endfunction
setglobal smarttab
if !exists('g:did_indent_on')
filetype indent on
endif
augroup polyglot
autocmd!
autocmd FileType * call s:detect()
augroup END

View File

@@ -59,17 +59,20 @@ def load_data()
linguist = languages.fetch(filetype["linguist"])
filetype["extensions"] = (linguist["extensions"] || []).map { |e| e[1..-1] } |
filetype.fetch("extra_extensions", []) -
filetype.fetch("ignored_extensions", []).uniq
filetype["extensions"] = ((
(linguist["extensions"] || []).map { |e| e[1..-1] } |
filetype.fetch("extra_extensions", [])
) - filetype.fetch("ignored_extensions", [])).uniq
filetype["filenames"] = (linguist["filenames"] || []) |
filetype.fetch("extra_filenames", []) -
filetype.fetch("ignored_filenames", []).uniq
filetype["filenames"] = ((
(linguist["filenames"] || []) |
filetype.fetch("extra_filenames", [])
) - filetype.fetch("ignored_filenames", [])).uniq
filetype["interpreters"] = (linguist["interpreters"] || []) |
filetype.fetch("extra_interpreters", []) -
filetype.fetch("ignored_interpreters", []).uniq
filetype["interpreters"] = ((
(linguist["interpreters"] || []) |
filetype.fetch("extra_interpreters", [])
) - filetype.fetch("ignored_interpreters", []).uniq)
else
filetype["extensions"] ||= []
filetype["filenames"] ||= []
@@ -445,7 +448,29 @@ def generate_ftdetect(packages, heuristics)
ambiguous_extensions = extensions
.select { |a, b| b.uniq.size > 1 }.keys.sort
expected_filetypes = detect_filetypes
expected_filetypes = detect_filetypes('tmp/**/ftdetect/*.vim')
native_filetypes = detect_filetypes('tmp/vim/vim/runtime/filetype.vim')
native_extensions = native_filetypes.flat_map { |k, v| v["extensions"] }
for package in packages
name = package.fetch("name")
to_disable = []
for filetype in package["filetypes"]
for extension in filetype["extensions"]
if native_filetypes.has_key?(extension)
to_disable << "*." + extension
end
end
end
if to_disable.size > 0
output << "if !has_key(s:disabled_packages, '#{name}')\n"
output << " au! BufRead,BufNewFile #{to_disable.join(",")}\n"
output << "endif\n\n"
end
end
for package in packages
name = package.fetch("name")
@@ -690,8 +715,8 @@ def expand_all(pattern)
end
end
def detect_filetypes
filetypes = Dir['tmp/**/ftdetect/*.vim'].flat_map do |file|
def detect_filetypes(glob)
filetypes = Dir[glob].flat_map do |file|
contents = File.read(file).gsub(/^\s*au(tocmd)?!?\s*$/, '')
results = contents.scan(/^\s*(?:au!|au|au[^g][^ ]*) +(?:\S+)\s+(\S+)[\s\\]+([^\n]+)/)
results = results.map do |a, b|
@@ -716,6 +741,39 @@ def detect_filetypes
}]
end
def generate_plugins(packages)
FileUtils.mkdir_p('autoload/polyglot')
output = "let s:globs = {\n"
patterns = Hash.new { |h, k| h[k] = [] }
for package in packages
for filetype in package["filetypes"]
extensions = (filetype["extensions"] || []).map { |e| "*.#{e}" }
files = (filetype["filenames"] || []).reject { |e| e.match(/\*\*|\//) }
patterns[filetype["name"]].concat(extensions)
patterns[filetype["name"]].concat(files)
end
end
for filetype in patterns.keys.sort
output << " \\ '#{filetype}': '{#{patterns[filetype].uniq.join(",")},}',\n"
end
output << " \\}\n\n"
output << <<~EOS
func! sleuth#GlobForFiletype(type)
return get(s:globs, a:type, '')
endfunc
EOS
File.write('autoload/sleuth.vim', output)
end
if __FILE__ == $0
if !ENV["DEV"]
FileUtils.rm_rf("tmp")
@@ -725,6 +783,7 @@ if __FILE__ == $0
download(packages)
extract(packages)
generate_ftdetect(packages, heuristics)
generate_plugins(packages)
generate_tests(packages)
puts(" Bye! Have a wonderful time!")