From 4a4a6b1e81ccbfaedb052eab5ca1a2aa042ac2b4 Mon Sep 17 00:00:00 2001 From: LinlyBoi Date: Sun, 30 Apr 2023 08:14:07 +0300 Subject: [PATCH] I broke up with neovim....vim is my best friend now --- dot_vim/after/ftplugin/coffee/folding.vim | 37 + dot_vim/after/plugin/ale.vim | 16 + dot_vim/autoload/pathogen.vim | 245 + dot_vim/autoload/plug.vim | 2812 ++ dot_vim/bundle/vimux.git/LICENSE | 21 + dot_vim/bundle/vimux.git/README.mkd | 38 + dot_vim/bundle/vimux.git/doc/vimux.txt | 355 + dot_vim/bundle/vimux.git/dot_gitignore | 1 + dot_vim/bundle/vimux.git/plugin/vimux.vim | 198 + dot_vim/colors/Tomorrow-Night-Blue.vim | 347 + dot_vim/colors/Tomorrow-Night-Bright.vim | 347 + dot_vim/colors/Tomorrow-Night-Eighties.vim | 347 + dot_vim/colors/Tomorrow-Night.vim | 362 + dot_vim/colors/Tomorrow.vim | 347 + dot_vim/doc/live-latex-preview.txt | 109 + dot_vim/doc/tags | 77 + dot_vim/dot_gitignore | 1 + dot_vim/dot_gitmodules | 27 + dot_vim/dot_netrwhist | 3 + dot_vim/ftplugin/lisp/limp.vim | 53 + dot_vim/ftplugin/lisp/limp/autoclose.vim | 208 + dot_vim/ftplugin/lisp/limp/bridge.vim | 510 + dot_vim/ftplugin/lisp/limp/cursor.vim | 207 + dot_vim/ftplugin/lisp/limp/desert256.vim | 338 + dot_vim/ftplugin/lisp/limp/highlight.vim | 236 + dot_vim/ftplugin/lisp/limp/keys.vim | 96 + dot_vim/ftplugin/lisp/limp/limp.vim | 53 + dot_vim/ftplugin/lisp/limp/mode.vim | 118 + dot_vim/ftplugin/lisp/limp/sexp.vim | 308 + dot_vim/ftplugin/lisp/limp/thesaurus | 1339 + dot_vim/gvimrc | 5 + dot_vim/indent/cpp.vim | 43 + dot_vim/init.vim | 1 + dot_vim/plugged/ale/Dockerfile | 27 + dot_vim/plugged/ale/LICENSE | 22 + dot_vim/plugged/ale/README.md | 963 + dot_vim/plugged/ale/ale_linters/ada/adals.vim | 26 + .../plugged/ale/ale_linters/ada/cspell.vim | 5 + dot_vim/plugged/ale/ale_linters/ada/gcc.vim | 54 + .../ansible/ansible_language_server.vim | 46 + .../ale/ale_linters/ansible/ansible_lint.vim | 128 + .../ale/ale_linters/apiblueprint/drafter.vim | 38 + .../ale_linters/apkbuild/apkbuild_lint.vim | 12 + .../ale_linters/apkbuild/secfixes_check.vim | 12 + .../plugged/ale/ale_linters/asciidoc/alex.vim | 4 + .../ale/ale_linters/asciidoc/cspell.vim | 5 + .../ale/ale_linters/asciidoc/languagetool.vim | 5 + .../ale/ale_linters/asciidoc/proselint.vim | 9 + .../ale/ale_linters/asciidoc/redpen.vim | 9 + .../ale/ale_linters/asciidoc/textlint.vim | 9 + .../plugged/ale/ale_linters/asciidoc/vale.vim | 9 + .../ale/ale_linters/asciidoc/writegood.vim | 4 + dot_vim/plugged/ale/ale_linters/asm/gcc.vim | 37 + dot_vim/plugged/ale/ale_linters/avra/avra.vim | 36 + dot_vim/plugged/ale/ale_linters/awk/gawk.vim | 23 + .../ale/ale_linters/bats/shellcheck.vim | 4 + .../plugged/ale/ale_linters/bib/bibclean.vim | 80 + .../plugged/ale/ale_linters/bicep/bicep.vim | 64 + .../ale/ale_linters/bitbake/oelint_adv.vim | 47 + dot_vim/plugged/ale/ale_linters/c/cc.vim | 67 + dot_vim/plugged/ale/ale_linters/c/ccls.vim | 15 + dot_vim/plugged/ale/ale_linters/c/clangd.vim | 22 + .../plugged/ale/ale_linters/c/clangtidy.vim | 52 + .../plugged/ale/ale_linters/c/cppcheck.vim | 29 + dot_vim/plugged/ale/ale_linters/c/cpplint.vim | 20 + dot_vim/plugged/ale/ale_linters/c/cquery.vim | 30 + dot_vim/plugged/ale/ale_linters/c/cspell.vim | 5 + .../plugged/ale/ale_linters/c/flawfinder.vim | 25 + .../ale/ale_linters/cairo/starknet.vim | 37 + .../ale/ale_linters/chef/cookstyle.vim | 54 + .../ale/ale_linters/chef/foodcritic.vim | 41 + .../ale/ale_linters/clojure/clj_kondo.vim | 47 + .../plugged/ale/ale_linters/clojure/joker.vim | 34 + .../cloudformation/cfn_python_lint.vim | 36 + .../ale/ale_linters/cmake/cmake_lint.vim | 43 + .../ale/ale_linters/cmake/cmakelint.vim | 24 + .../plugged/ale/ale_linters/coffee/coffee.vim | 23 + .../ale/ale_linters/coffee/coffeelint.vim | 43 + dot_vim/plugged/ale/ale_linters/cpp/cc.vim | 67 + dot_vim/plugged/ale/ale_linters/cpp/ccls.vim | 15 + .../ale/ale_linters/cpp/clangcheck.vim | 35 + .../plugged/ale/ale_linters/cpp/clangd.vim | 22 + .../plugged/ale/ale_linters/cpp/clangtidy.vim | 53 + dot_vim/plugged/ale/ale_linters/cpp/clazy.vim | 32 + .../plugged/ale/ale_linters/cpp/cppcheck.vim | 29 + .../plugged/ale/ale_linters/cpp/cpplint.vim | 20 + .../plugged/ale/ale_linters/cpp/cquery.vim | 30 + .../plugged/ale/ale_linters/cpp/cspell.vim | 5 + .../ale/ale_linters/cpp/flawfinder.vim | 25 + .../plugged/ale/ale_linters/crystal/ameba.vim | 57 + .../ale/ale_linters/crystal/crystal.vim | 35 + dot_vim/plugged/ale/ale_linters/cs/csc.vim | 90 + dot_vim/plugged/ale/ale_linters/cs/cspell.vim | 5 + dot_vim/plugged/ale/ale_linters/cs/mcs.vim | 37 + dot_vim/plugged/ale/ale_linters/cs/mcsc.vim | 91 + .../plugged/ale/ale_linters/css/cspell.vim | 5 + .../plugged/ale/ale_linters/css/csslint.vim | 18 + dot_vim/plugged/ale/ale_linters/css/fecs.vim | 9 + .../plugged/ale/ale_linters/css/stylelint.vim | 19 + .../plugged/ale/ale_linters/css/vscodecss.vim | 16 + .../ale/ale_linters/cucumber/cucumber.vim | 46 + .../plugged/ale/ale_linters/cuda/clangd.vim | 23 + dot_vim/plugged/ale/ale_linters/cuda/nvcc.vim | 46 + .../ale/ale_linters/cypher/cypher_lint.vim | 26 + dot_vim/plugged/ale/ale_linters/d/dls.vim | 22 + dot_vim/plugged/ale/ale_linters/d/dmd.vim | 116 + .../plugged/ale/ale_linters/dafny/dafny.vim | 41 + .../ale/ale_linters/dart/analysis_server.vim | 29 + .../ale/ale_linters/dart/dart_analyze.vim | 29 + .../ale/ale_linters/dart/language_server.vim | 20 + .../desktop/desktop_file_validate.vim | 31 + .../dockerfile/dockerfile_lint.vim | 76 + .../ale/ale_linters/dockerfile/hadolint.vim | 123 + .../plugged/ale/ale_linters/elixir/credo.vim | 71 + .../plugged/ale/ale_linters/elixir/cspell.vim | 5 + .../ale/ale_linters/elixir/dialyxir.vim | 34 + .../plugged/ale/ale_linters/elixir/dogma.vim | 39 + .../ale/ale_linters/elixir/elixir_ls.vim | 21 + .../plugged/ale/ale_linters/elixir/mix.vim | 45 + .../plugged/ale/ale_linters/elm/elm_ls.vim | 40 + dot_vim/plugged/ale/ale_linters/elm/make.vim | 242 + .../ale/ale_linters/erlang/dialyzer.vim | 97 + .../plugged/ale/ale_linters/erlang/elvis.vim | 40 + .../ale/ale_linters/erlang/erlang_ls.vim | 49 + .../plugged/ale/ale_linters/erlang/erlc.vim | 104 + .../ale/ale_linters/erlang/syntaxerl.vim | 42 + dot_vim/plugged/ale/ale_linters/eruby/erb.vim | 25 + .../plugged/ale/ale_linters/eruby/erblint.vim | 51 + .../plugged/ale/ale_linters/eruby/erubi.vim | 32 + .../plugged/ale/ale_linters/eruby/erubis.vim | 23 + .../plugged/ale/ale_linters/eruby/ruumba.vim | 62 + dot_vim/plugged/ale/ale_linters/fish/fish.vim | 67 + .../plugged/ale/ale_linters/fortran/gcc.vim | 72 + .../ale_linters/fortran/language_server.vim | 19 + .../ale/ale_linters/fountain/proselint.vim | 9 + .../ale/ale_linters/fuse/fusionlint.vim | 33 + .../ale/ale_linters/gitcommit/gitlint.vim | 51 + .../plugged/ale/ale_linters/glsl/glslang.vim | 40 + .../plugged/ale/ale_linters/glsl/glslls.vim | 30 + dot_vim/plugged/ale/ale_linters/go/bingo.vim | 31 + dot_vim/plugged/ale/ale_linters/go/cspell.vim | 5 + .../plugged/ale/ale_linters/go/gobuild.vim | 57 + dot_vim/plugged/ale/ale_linters/go/gofmt.vim | 15 + .../ale/ale_linters/go/golangci_lint.vim | 64 + dot_vim/plugged/ale/ale_linters/go/golint.vim | 21 + .../ale/ale_linters/go/gometalinter.vim | 58 + dot_vim/plugged/ale/ale_linters/go/gopls.vim | 39 + .../plugged/ale/ale_linters/go/gosimple.vim | 12 + dot_vim/plugged/ale/ale_linters/go/gotype.vim | 24 + dot_vim/plugged/ale/ale_linters/go/govet.vim | 28 + .../plugged/ale/ale_linters/go/langserver.vim | 29 + dot_vim/plugged/ale/ale_linters/go/revive.vim | 21 + .../ale/ale_linters/go/staticcheck.vim | 34 + .../ale/ale_linters/graphql/eslint.vim | 10 + .../ale/ale_linters/graphql/gqlint.vim | 10 + dot_vim/plugged/ale/ale_linters/hack/hack.vim | 22 + .../plugged/ale/ale_linters/hack/hhast.vim | 40 + .../plugged/ale/ale_linters/haml/hamllint.vim | 57 + .../handlebars/embertemplatelint.vim | 67 + .../ale/ale_linters/haskell/cabal_ghc.vim | 20 + .../ale/ale_linters/haskell/cspell.vim | 5 + .../plugged/ale/ale_linters/haskell/ghc.vim | 18 + .../ale/ale_linters/haskell/ghc_mod.vim | 19 + .../ale/ale_linters/haskell/hdevtools.vim | 20 + .../plugged/ale/ale_linters/haskell/hie.vim | 41 + .../plugged/ale/ale_linters/haskell/hlint.vim | 46 + .../plugged/ale/ale_linters/haskell/hls.vim | 65 + .../ale/ale_linters/haskell/stack_build.vim | 23 + .../ale/ale_linters/haskell/stack_ghc.vim | 21 + dot_vim/plugged/ale/ale_linters/help/alex.vim | 4 + .../plugged/ale/ale_linters/help/cspell.vim | 5 + .../ale/ale_linters/help/proselint.vim | 9 + .../ale/ale_linters/help/writegood.vim | 4 + dot_vim/plugged/ale/ale_linters/html/alex.vim | 4 + .../plugged/ale/ale_linters/html/angular.vim | 56 + .../plugged/ale/ale_linters/html/cspell.vim | 5 + dot_vim/plugged/ale/ale_linters/html/fecs.vim | 9 + .../plugged/ale/ale_linters/html/htmlhint.vim | 32 + .../ale/ale_linters/html/proselint.vim | 9 + .../ale/ale_linters/html/stylelint.vim | 27 + dot_vim/plugged/ale/ale_linters/html/tidy.vim | 70 + .../ale/ale_linters/html/vscodehtml.vim | 16 + .../ale/ale_linters/html/writegood.vim | 4 + .../plugged/ale/ale_linters/idris/idris.vim | 81 + dot_vim/plugged/ale/ale_linters/ink/ls.vim | 35 + dot_vim/plugged/ale/ale_linters/inko/inko.vim | 33 + dot_vim/plugged/ale/ale_linters/ispc/ispc.vim | 45 + .../ale/ale_linters/java/checkstyle.vim | 73 + .../plugged/ale/ale_linters/java/cspell.vim | 5 + .../ale/ale_linters/java/eclipselsp.vim | 200 + .../plugged/ale/ale_linters/java/javac.vim | 163 + .../plugged/ale/ale_linters/java/javalsp.vim | 55 + dot_vim/plugged/ale/ale_linters/java/pmd.vim | 36 + .../ale/ale_linters/javascript/cspell.vim | 5 + .../ale/ale_linters/javascript/deno.vim | 11 + .../ale/ale_linters/javascript/eslint.vim | 11 + .../ale/ale_linters/javascript/fecs.vim | 10 + .../ale/ale_linters/javascript/flow.vim | 160 + .../ale/ale_linters/javascript/flow_ls.vim | 28 + .../ale/ale_linters/javascript/jscs.vim | 61 + .../ale/ale_linters/javascript/jshint.vim | 33 + .../ale/ale_linters/javascript/standard.vim | 32 + .../ale/ale_linters/javascript/tsserver.vim | 17 + .../plugged/ale/ale_linters/javascript/xo.vim | 9 + .../plugged/ale/ale_linters/json/cspell.vim | 5 + .../plugged/ale/ale_linters/json/eslint.vim | 16 + dot_vim/plugged/ale/ale_linters/json/jq.vim | 24 + .../plugged/ale/ale_linters/json/jsonlint.vim | 43 + .../plugged/ale/ale_linters/json/spectral.vim | 14 + .../ale/ale_linters/json/vscodejson.vim | 16 + .../plugged/ale/ale_linters/json5/eslint.vim | 16 + .../plugged/ale/ale_linters/jsonc/eslint.vim | 16 + .../ale/ale_linters/jsonnet/jsonnet_lint.vim | 59 + .../ale/ale_linters/jsonnet/jsonnetfmt.vim | 52 + .../ale/ale_linters/julia/languageserver.vim | 21 + .../ale/ale_linters/kotlin/kotlinc.vim | 177 + .../plugged/ale/ale_linters/kotlin/ktlint.vim | 10 + .../ale/ale_linters/kotlin/languageserver.vim | 29 + .../plugged/ale/ale_linters/less/lessc.vim | 47 + .../ale/ale_linters/less/stylelint.vim | 20 + dot_vim/plugged/ale/ale_linters/llvm/llc.vim | 24 + .../plugged/ale/ale_linters/lua/cspell.vim | 5 + dot_vim/plugged/ale/ale_linters/lua/luac.vim | 31 + .../plugged/ale/ale_linters/lua/luacheck.vim | 44 + .../plugged/ale/ale_linters/lua/selene.vim | 46 + dot_vim/plugged/ale/ale_linters/mail/alex.vim | 4 + .../ale/ale_linters/mail/languagetool.vim | 5 + .../ale/ale_linters/mail/proselint.vim | 9 + dot_vim/plugged/ale/ale_linters/mail/vale.vim | 9 + .../ale/ale_linters/make/checkmake.vim | 37 + .../plugged/ale/ale_linters/markdown/alex.vim | 4 + .../ale/ale_linters/markdown/cspell.vim | 5 + .../ale/ale_linters/markdown/languagetool.vim | 5 + .../ale/ale_linters/markdown/markdownlint.vim | 27 + .../plugged/ale/ale_linters/markdown/mdl.vim | 43 + .../ale/ale_linters/markdown/proselint.vim | 9 + .../ale/ale_linters/markdown/redpen.vim | 9 + .../ale/ale_linters/markdown/remark_lint.vim | 48 + .../ale/ale_linters/markdown/textlint.vim | 9 + .../plugged/ale/ale_linters/markdown/vale.vim | 24 + .../ale/ale_linters/markdown/writegood.vim | 4 + .../plugged/ale/ale_linters/matlab/mlint.vim | 44 + .../plugged/ale/ale_linters/mercury/mmc.vim | 38 + dot_vim/plugged/ale/ale_linters/nasm/nasm.vim | 41 + .../plugged/ale/ale_linters/nim/nimcheck.vim | 79 + .../plugged/ale/ale_linters/nim/nimlsp.vim | 33 + dot_vim/plugged/ale/ale_linters/nix/nix.vim | 63 + .../plugged/ale/ale_linters/nix/rnix_lsp.vim | 16 + .../plugged/ale/ale_linters/nix/statix.vim | 18 + .../plugged/ale/ale_linters/nroff/alex.vim | 4 + .../ale/ale_linters/nroff/proselint.vim | 9 + .../ale/ale_linters/nroff/writegood.vim | 4 + dot_vim/plugged/ale/ale_linters/objc/ccls.vim | 15 + .../plugged/ale/ale_linters/objc/clang.vim | 23 + .../plugged/ale/ale_linters/objc/clangd.vim | 17 + .../plugged/ale/ale_linters/objcpp/clang.vim | 23 + .../plugged/ale/ale_linters/objcpp/clangd.vim | 17 + .../plugged/ale/ale_linters/ocaml/merlin.vim | 17 + .../ale/ale_linters/ocaml/ocamllsp.vim | 13 + dot_vim/plugged/ale/ale_linters/ocaml/ols.vim | 14 + .../ale/ale_linters/ocamlinterface/merlin.vim | 17 + .../ale_linters/ocamlinterface/ocamllsp.vim | 13 + .../ale/ale_linters/openapi/ibm_validator.vim | 58 + .../ale/ale_linters/openapi/yamllint.vim | 9 + .../ale/ale_linters/openscad/sca2d.vim | 24 + dot_vim/plugged/ale/ale_linters/perl/perl.vim | 64 + .../ale/ale_linters/perl/perlcritic.vim | 61 + .../plugged/ale/ale_linters/perl6/perl6.vim | 166 + .../plugged/ale/ale_linters/php/cspell.vim | 5 + .../php/executable_intelephense.vim | 32 + .../ale/ale_linters/php/langserver.vim | 27 + dot_vim/plugged/ale/ale_linters/php/phan.vim | 75 + dot_vim/plugged/ale/ale_linters/php/php.vim | 39 + .../plugged/ale/ale_linters/php/phpactor.vim | 23 + dot_vim/plugged/ale/ale_linters/php/phpcs.vim | 54 + dot_vim/plugged/ale/ale_linters/php/phpmd.vim | 38 + .../plugged/ale/ale_linters/php/phpstan.vim | 89 + dot_vim/plugged/ale/ale_linters/php/psalm.vim | 32 + dot_vim/plugged/ale/ale_linters/php/tlint.vim | 80 + dot_vim/plugged/ale/ale_linters/po/alex.vim | 4 + dot_vim/plugged/ale/ale_linters/po/msgfmt.vim | 30 + .../plugged/ale/ale_linters/po/proselint.vim | 9 + .../plugged/ale/ale_linters/po/writegood.vim | 4 + dot_vim/plugged/ale/ale_linters/pod/alex.vim | 4 + .../plugged/ale/ale_linters/pod/proselint.vim | 9 + .../plugged/ale/ale_linters/pod/writegood.vim | 4 + .../plugged/ale/ale_linters/pony/ponyc.vim | 16 + .../ale/ale_linters/powershell/cspell.vim | 5 + .../ale/ale_linters/powershell/powershell.vim | 100 + .../powershell/psscriptanalyzer.vim | 76 + .../plugged/ale/ale_linters/prolog/swipl.vim | 110 + .../ale/ale_linters/proto/buf_lint.vim | 26 + .../ale/ale_linters/proto/protoc_gen_lint.vim | 27 + .../ale/ale_linters/proto/protolint.vim | 24 + .../plugged/ale/ale_linters/pug/puglint.vim | 56 + .../ale/ale_linters/puppet/languageserver.vim | 37 + .../plugged/ale/ale_linters/puppet/puppet.vim | 39 + .../ale/ale_linters/puppet/puppetlint.vim | 18 + .../plugged/ale/ale_linters/purescript/ls.vim | 49 + .../plugged/ale/ale_linters/pyrex/cython.vim | 36 + .../plugged/ale/ale_linters/python/bandit.vim | 76 + .../plugged/ale/ale_linters/python/cspell.vim | 5 + .../plugged/ale/ale_linters/python/flake8.vim | 170 + .../ale/ale_linters/python/flakehell.vim | 175 + .../plugged/ale/ale_linters/python/jedils.vim | 34 + .../plugged/ale/ale_linters/python/mypy.vim | 103 + .../ale/ale_linters/python/prospector.vim | 106 + .../ale/ale_linters/python/pycodestyle.vim | 81 + .../ale/ale_linters/python/pydocstyle.vim | 77 + .../ale/ale_linters/python/pyflakes.vim | 56 + .../plugged/ale/ale_linters/python/pylama.vim | 154 + .../plugged/ale/ale_linters/python/pylint.vim | 120 + .../plugged/ale/ale_linters/python/pylsp.vim | 57 + .../plugged/ale/ale_linters/python/pyre.vim | 44 + .../ale/ale_linters/python/pyright.vim | 57 + .../plugged/ale/ale_linters/python/refurb.vim | 73 + .../plugged/ale/ale_linters/python/ruff.vim | 84 + .../ale/ale_linters/python/unimport.vim | 75 + .../ale/ale_linters/python/vulture.vim | 79 + .../plugged/ale/ale_linters/qml/qmlfmt.vim | 25 + .../plugged/ale/ale_linters/qml/qmllint.vim | 29 + .../ale/ale_linters/r/languageserver.vim | 27 + dot_vim/plugged/ale/ale_linters/r/lintr.vim | 35 + .../ale/ale_linters/racket/langserver.vim | 7 + .../plugged/ale/ale_linters/racket/raco.vim | 34 + dot_vim/plugged/ale/ale_linters/reason/ls.vim | 23 + .../plugged/ale/ale_linters/reason/merlin.vim | 17 + .../plugged/ale/ale_linters/reason/ols.vim | 14 + .../plugged/ale/ale_linters/rego/cspell.vim | 4 + .../plugged/ale/ale_linters/rego/opacheck.vim | 56 + .../plugged/ale/ale_linters/review/redpen.vim | 9 + .../plugged/ale/ale_linters/robot/rflint.vim | 46 + dot_vim/plugged/ale/ale_linters/rst/alex.vim | 4 + .../plugged/ale/ale_linters/rst/cspell.vim | 5 + .../plugged/ale/ale_linters/rst/proselint.vim | 9 + .../plugged/ale/ale_linters/rst/redpen.vim | 9 + .../plugged/ale/ale_linters/rst/rstcheck.vim | 31 + .../plugged/ale/ale_linters/rst/textlint.vim | 9 + dot_vim/plugged/ale/ale_linters/rst/vale.vim | 9 + .../plugged/ale/ale_linters/rst/writegood.vim | 4 + .../plugged/ale/ale_linters/ruby/brakeman.vim | 51 + .../plugged/ale/ale_linters/ruby/cspell.vim | 5 + .../plugged/ale/ale_linters/ruby/debride.vim | 42 + .../ale_linters/ruby/rails_best_practices.vim | 49 + dot_vim/plugged/ale/ale_linters/ruby/reek.vim | 69 + .../plugged/ale/ale_linters/ruby/rubocop.vim | 31 + dot_vim/plugged/ale/ale_linters/ruby/ruby.vim | 12 + .../ale/ale_linters/ruby/solargraph.vim | 22 + .../plugged/ale/ale_linters/ruby/sorbet.vim | 26 + .../ale/ale_linters/ruby/standardrb.vim | 23 + .../plugged/ale/ale_linters/rust/analyzer.vim | 36 + .../plugged/ale/ale_linters/rust/cargo.vim | 110 + .../plugged/ale/ale_linters/rust/cspell.vim | 5 + dot_vim/plugged/ale/ale_linters/rust/rls.vim | 27 + .../plugged/ale/ale_linters/rust/rustc.vim | 33 + .../ale/ale_linters/salt/salt_lint.vim | 33 + .../plugged/ale/ale_linters/sass/sasslint.vim | 28 + .../ale/ale_linters/sass/stylelint.vim | 13 + .../plugged/ale/ale_linters/scala/cspell.vim | 5 + dot_vim/plugged/ale/ale_linters/scala/fsc.vim | 14 + .../plugged/ale/ale_linters/scala/metals.vim | 50 + .../ale/ale_linters/scala/sbtserver.vim | 31 + .../plugged/ale/ale_linters/scala/scalac.vim | 15 + .../ale/ale_linters/scala/scalastyle.vim | 86 + .../plugged/ale/ale_linters/scss/sasslint.vim | 28 + .../plugged/ale/ale_linters/scss/scsslint.vim | 34 + .../ale/ale_linters/scss/stylelint.vim | 19 + .../plugged/ale/ale_linters/sh/bashate.vim | 43 + dot_vim/plugged/ale/ale_linters/sh/cspell.vim | 5 + .../ale/ale_linters/sh/language_server.vim | 32 + dot_vim/plugged/ale/ale_linters/sh/shell.vim | 59 + .../plugged/ale/ale_linters/sh/shellcheck.vim | 4 + .../plugged/ale/ale_linters/slim/slimlint.vim | 55 + dot_vim/plugged/ale/ale_linters/sml/smlnj.vim | 9 + .../plugged/ale/ale_linters/sml/smlnj_cm.vim | 21 + .../plugged/ale/ale_linters/solidity/solc.vim | 53 + .../ale/ale_linters/solidity/solhint.vim | 12 + .../ale/ale_linters/solidity/solium.vim | 9 + .../plugged/ale/ale_linters/spec/rpmlint.vim | 90 + .../plugged/ale/ale_linters/sql/sqlfluff.vim | 72 + .../plugged/ale/ale_linters/sql/sqlint.vim | 28 + .../plugged/ale/ale_linters/sql/sqllint.vim | 33 + .../ale/ale_linters/stylus/stylelint.vim | 20 + .../ale/ale_linters/sugarss/stylelint.vim | 21 + .../ale/ale_linters/svelte/svelteserver.vim | 21 + .../ale_linters/swift/appleswiftformat.vim | 43 + .../plugged/ale/ale_linters/swift/cspell.vim | 5 + .../ale/ale_linters/swift/sourcekitlsp.vim | 13 + .../ale/ale_linters/swift/swiftlint.vim | 69 + .../ale_linters/systemd/systemd_analyze.vim | 18 + .../plugged/ale/ale_linters/tcl/nagelfar.vim | 39 + .../ale/ale_linters/terraform/checkov.vim | 41 + .../ale/ale_linters/terraform/terraform.vim | 69 + .../ale_linters/terraform/terraform_ls.vim | 38 + .../ale_linters/terraform/terraform_lsp.vim | 25 + .../ale/ale_linters/terraform/tflint.vim | 105 + .../ale/ale_linters/terraform/tfsec.vim | 87 + .../ale/ale_linters/testft/testlinter.vim | 10 + dot_vim/plugged/ale/ale_linters/tex/alex.vim | 4 + .../plugged/ale/ale_linters/tex/chktex.vim | 54 + .../plugged/ale/ale_linters/tex/cspell.vim | 5 + .../plugged/ale/ale_linters/tex/lacheck.vim | 43 + .../plugged/ale/ale_linters/tex/proselint.vim | 9 + .../plugged/ale/ale_linters/tex/redpen.vim | 9 + .../plugged/ale/ale_linters/tex/texlab.vim | 26 + .../plugged/ale/ale_linters/tex/textlint.vim | 9 + dot_vim/plugged/ale/ale_linters/tex/vale.vim | 9 + .../plugged/ale/ale_linters/tex/writegood.vim | 4 + .../plugged/ale/ale_linters/texinfo/alex.vim | 4 + .../ale/ale_linters/texinfo/cspell.vim | 5 + .../ale/ale_linters/texinfo/proselint.vim | 9 + .../ale/ale_linters/texinfo/writegood.vim | 4 + dot_vim/plugged/ale/ale_linters/text/alex.vim | 4 + .../plugged/ale/ale_linters/text/cspell.vim | 5 + .../ale/ale_linters/text/languagetool.vim | 4 + .../ale/ale_linters/text/proselint.vim | 9 + .../plugged/ale/ale_linters/text/redpen.vim | 9 + .../plugged/ale/ale_linters/text/textlint.vim | 9 + dot_vim/plugged/ale/ale_linters/text/vale.vim | 9 + .../ale/ale_linters/text/writegood.vim | 4 + .../plugged/ale/ale_linters/thrift/thrift.vim | 87 + .../ale/ale_linters/thrift/thriftcheck.vim | 46 + .../ale/ale_linters/typescript/cspell.vim | 5 + .../ale/ale_linters/typescript/deno.vim | 12 + .../ale/ale_linters/typescript/eslint.vim | 10 + .../ale/ale_linters/typescript/standard.vim | 31 + .../ale/ale_linters/typescript/tslint.vim | 75 + .../ale/ale_linters/typescript/tsserver.vim | 18 + .../ale/ale_linters/typescript/typecheck.vim | 33 + .../plugged/ale/ale_linters/typescript/xo.vim | 6 + dot_vim/plugged/ale/ale_linters/v/v.vim | 82 + .../ale/ale_linters/vala/vala_lint.vim | 66 + .../ale/ale_linters/verilog/hdl_checker.vim | 5 + .../ale/ale_linters/verilog/iverilog.vim | 43 + .../ale/ale_linters/verilog/verilator.vim | 60 + .../plugged/ale/ale_linters/verilog/vlog.vim | 52 + .../plugged/ale/ale_linters/verilog/xvlog.vim | 35 + .../plugged/ale/ale_linters/verilog/yosys.vim | 42 + dot_vim/plugged/ale/ale_linters/vhdl/ghdl.vim | 37 + .../ale/ale_linters/vhdl/hdl_checker.vim | 5 + dot_vim/plugged/ale/ale_linters/vhdl/vcom.vim | 38 + .../plugged/ale/ale_linters/vhdl/xvhdl.vim | 37 + .../vim/ale_custom_linting_rules.vim | 70 + dot_vim/plugged/ale/ale_linters/vim/vimls.vim | 61 + dot_vim/plugged/ale/ale_linters/vim/vint.vim | 65 + .../plugged/ale/ale_linters/vue/cspell.vim | 5 + dot_vim/plugged/ale/ale_linters/vue/vls.vim | 22 + dot_vim/plugged/ale/ale_linters/vue/volar.vim | 80 + dot_vim/plugged/ale/ale_linters/wgsl/naga.vim | 12 + .../plugged/ale/ale_linters/xhtml/alex.vim | 4 + .../plugged/ale/ale_linters/xhtml/cspell.vim | 5 + .../ale/ale_linters/xhtml/proselint.vim | 9 + .../ale/ale_linters/xhtml/writegood.vim | 4 + .../plugged/ale/ale_linters/xml/xmllint.vim | 65 + .../ale/ale_linters/yaml/actionlint.vim | 11 + .../plugged/ale/ale_linters/yaml/circleci.vim | 35 + .../ale/ale_linters/yaml/gitlablint.vim | 49 + dot_vim/plugged/ale/ale_linters/yaml/ls.vim | 34 + .../plugged/ale/ale_linters/yaml/spectral.vim | 14 + .../plugged/ale/ale_linters/yaml/swaglint.vim | 40 + .../plugged/ale/ale_linters/yaml/yamllint.vim | 11 + .../plugged/ale/ale_linters/yang/yang_lsp.vim | 15 + dot_vim/plugged/ale/ale_linters/zeek/zeek.vim | 22 + dot_vim/plugged/ale/ale_linters/zig/zls.vim | 20 + dot_vim/plugged/ale/autoload/ale.vim | 285 + dot_vim/plugged/ale/autoload/ale/ant.vim | 45 + dot_vim/plugged/ale/autoload/ale/args.vim | 43 + dot_vim/plugged/ale/autoload/ale/assert.vim | 424 + dot_vim/plugged/ale/autoload/ale/balloon.vim | 74 + dot_vim/plugged/ale/autoload/ale/c.vim | 622 + .../plugged/ale/autoload/ale/code_action.vim | 389 + dot_vim/plugged/ale/autoload/ale/codefix.vim | 497 + dot_vim/plugged/ale/autoload/ale/command.vim | 473 + .../plugged/ale/autoload/ale/completion.vim | 1070 + .../ale/autoload/ale/completion/python.vim | 3 + dot_vim/plugged/ale/autoload/ale/cursor.vim | 189 + dot_vim/plugged/ale/autoload/ale/d.vim | 16 + .../plugged/ale/autoload/ale/debugging.vim | 276 + .../plugged/ale/autoload/ale/definition.vim | 224 + dot_vim/plugged/ale/autoload/ale/dhall.vim | 24 + dot_vim/plugged/ale/autoload/ale/engine.vim | 738 + .../ale/autoload/ale/engine/ignore.vim | 50 + dot_vim/plugged/ale/autoload/ale/events.vim | 165 + .../ale/autoload/ale/filename_mapping.vim | 22 + .../plugged/ale/autoload/ale/filerename.vim | 133 + .../plugged/ale/autoload/ale/filetypes.vim | 58 + dot_vim/plugged/ale/autoload/ale/fix.vim | 399 + .../plugged/ale/autoload/ale/fix/registry.vim | 795 + .../autoload/ale/fixers/appleswiftformat.vim | 16 + .../ale/autoload/ale/fixers/astyle.vim | 59 + .../ale/autoload/ale/fixers/autoflake.vim | 28 + .../ale/autoload/ale/fixers/autoimport.vim | 27 + .../ale/autoload/ale/fixers/autopep8.vim | 26 + .../ale/autoload/ale/fixers/bibclean.vim | 15 + .../plugged/ale/autoload/ale/fixers/black.vim | 52 + .../ale/autoload/ale/fixers/brittany.vim | 22 + .../ale/autoload/ale/fixers/buf_format.vim | 12 + .../ale/autoload/ale/fixers/buildifier.vim | 26 + .../ale/autoload/ale/fixers/clangformat.vim | 47 + .../ale/autoload/ale/fixers/clangtidy.vim | 52 + .../ale/autoload/ale/fixers/cmakeformat.vim | 16 + .../ale/autoload/ale/fixers/crystal.vim | 14 + .../ale/autoload/ale/fixers/css_beautify.vim | 20 + .../ale/autoload/ale/fixers/dart_format.vim | 18 + .../ale/autoload/ale/fixers/dartfmt.vim | 18 + .../plugged/ale/autoload/ale/fixers/deno.vim | 17 + .../plugged/ale/autoload/ale/fixers/dfmt.vim | 18 + .../ale/autoload/ale/fixers/dhall_format.vim | 11 + .../ale/autoload/ale/fixers/dhall_freeze.vim | 14 + .../ale/autoload/ale/fixers/dhall_lint.vim | 11 + .../ale/autoload/ale/fixers/dotnet_format.vim | 18 + .../ale/autoload/ale/fixers/dprint.vim | 29 + .../plugged/ale/autoload/ale/fixers/dune.vim | 16 + .../ale/autoload/ale/fixers/elm_format.vim | 23 + .../ale/autoload/ale/fixers/erblint.vim | 40 + .../ale/autoload/ale/fixers/erlfmt.vim | 21 + .../ale/autoload/ale/fixers/eslint.vim | 83 + .../plugged/ale/autoload/ale/fixers/fecs.vim | 17 + .../ale/autoload/ale/fixers/fish_indent.vim | 19 + .../ale/autoload/ale/fixers/fixjson.vim | 28 + .../ale/autoload/ale/fixers/floskell.vim | 20 + .../ale/autoload/ale/fixers/generic.vim | 25 + .../autoload/ale/fixers/generic_python.vim | 75 + .../ale/autoload/ale/fixers/gnatpp.vim | 17 + .../plugged/ale/autoload/ale/fixers/gofmt.vim | 16 + .../ale/autoload/ale/fixers/gofumpt.vim | 17 + .../ale/autoload/ale/fixers/goimports.vim | 23 + .../ale/autoload/ale/fixers/golines.vim | 21 + .../plugged/ale/autoload/ale/fixers/gomod.vim | 11 + .../ale/fixers/google_java_format.vim | 23 + .../ale/autoload/ale/fixers/hackfmt.vim | 18 + .../plugged/ale/autoload/ale/fixers/help.vim | 24 + .../plugged/ale/autoload/ale/fixers/hfmt.vim | 16 + .../ale/autoload/ale/fixers/hindent.vim | 20 + .../plugged/ale/autoload/ale/fixers/hlint.vim | 13 + .../ale/autoload/ale/fixers/html_beautify.vim | 20 + .../ale/autoload/ale/fixers/importjs.vim | 25 + .../plugged/ale/autoload/ale/fixers/isort.vim | 71 + .../plugged/ale/autoload/ale/fixers/jq.vim | 22 + .../ale/autoload/ale/fixers/jsonnetfmt.vim | 18 + .../ale/autoload/ale/fixers/ktlint.vim | 8 + .../ale/autoload/ale/fixers/latexindent.vim | 16 + .../ale/autoload/ale/fixers/lua_format.vim | 16 + .../ale/autoload/ale/fixers/luafmt.vim | 13 + .../ale/autoload/ale/fixers/mix_format.vim | 25 + .../ale/autoload/ale/fixers/nimpretty.vim | 15 + .../ale/autoload/ale/fixers/nixfmt.vim | 15 + .../ale/autoload/ale/fixers/nixpkgsfmt.vim | 12 + .../ale/autoload/ale/fixers/ocamlformat.vim | 17 + .../ale/autoload/ale/fixers/ocp_indent.vim | 18 + .../ale/autoload/ale/fixers/opafmt.vim | 15 + .../ale/autoload/ale/fixers/ormolu.vim | 12 + .../ale/autoload/ale/fixers/packer.vim | 17 + .../ale/autoload/ale/fixers/pandoc.vim | 16 + .../ale/autoload/ale/fixers/perltidy.vim | 18 + .../ale/autoload/ale/fixers/pgformatter.vim | 12 + .../ale/autoload/ale/fixers/php_cs_fixer.vim | 24 + .../ale/autoload/ale/fixers/phpcbf.vim | 26 + .../plugged/ale/autoload/ale/fixers/pint.vim | 25 + .../ale/autoload/ale/fixers/prettier.vim | 124 + .../autoload/ale/fixers/prettier_eslint.vim | 56 + .../autoload/ale/fixers/prettier_standard.vim | 24 + .../ale/autoload/ale/fixers/protolint.vim | 26 + .../plugged/ale/autoload/ale/fixers/ptop.vim | 17 + .../ale/autoload/ale/fixers/puppetlint.vim | 22 + .../ale/autoload/ale/fixers/purs_tidy.vim | 24 + .../plugged/ale/autoload/ale/fixers/purty.vim | 22 + .../ale/autoload/ale/fixers/pyflyby.vim | 41 + .../ale/autoload/ale/fixers/qmlfmt.vim | 11 + .../ale/autoload/ale/fixers/raco_fmt.vim | 15 + .../plugged/ale/autoload/ale/fixers/refmt.vim | 18 + .../ale/autoload/ale/fixers/remark_lint.vim | 24 + .../ale/fixers/reorder_python_imports.vim | 25 + .../ale/autoload/ale/fixers/rubocop.vim | 38 + .../plugged/ale/autoload/ale/fixers/ruff.vim | 89 + .../plugged/ale/autoload/ale/fixers/rufo.vim | 20 + .../ale/autoload/ale/fixers/rustfmt.vim | 15 + .../ale/autoload/ale/fixers/scalafmt.vim | 25 + .../plugged/ale/autoload/ale/fixers/shfmt.vim | 17 + .../ale/autoload/ale/fixers/sorbet.vim | 19 + .../ale/autoload/ale/fixers/sqlfluff.vim | 25 + .../ale/autoload/ale/fixers/sqlfmt.vim | 13 + .../ale/autoload/ale/fixers/sqlformat.vim | 16 + .../ale/autoload/ale/fixers/standard.vim | 33 + .../ale/autoload/ale/fixers/standardrb.vim | 23 + .../ale/autoload/ale/fixers/statix.vim | 17 + .../ale/autoload/ale/fixers/stylelint.vim | 26 + .../ale/autoload/ale/fixers/styler.vim | 16 + .../autoload/ale/fixers/stylish_haskell.vim | 21 + .../ale/autoload/ale/fixers/stylua.vim | 14 + .../ale/autoload/ale/fixers/swiftformat.vim | 25 + .../ale/autoload/ale/fixers/syntax_tree.vim | 19 + .../ale/autoload/ale/fixers/terraform.vim | 17 + .../ale/autoload/ale/fixers/textlint.vim | 15 + .../plugged/ale/autoload/ale/fixers/tidy.vim | 26 + .../ale/autoload/ale/fixers/tslint.vim | 22 + .../ale/autoload/ale/fixers/uncrustify.vim | 33 + .../plugged/ale/autoload/ale/fixers/vfmt.vim | 13 + .../ale/autoload/ale/fixers/xmllint.vim | 29 + .../plugged/ale/autoload/ale/fixers/xo.vim | 36 + .../ale/autoload/ale/fixers/yamlfix.vim | 25 + .../plugged/ale/autoload/ale/fixers/yapf.vim | 26 + .../ale/autoload/ale/fixers/zigfmt.vim | 14 + .../ale/autoload/ale/floating_preview.vim | 231 + dot_vim/plugged/ale/autoload/ale/go.vim | 58 + dot_vim/plugged/ale/autoload/ale/gradle.vim | 74 + .../ale/autoload/ale/gradle/init.gradle | 23 + .../ale/autoload/ale/handlers/actionlint.vim | 36 + .../ale/autoload/ale/handlers/alex.vim | 55 + .../ale/autoload/ale/handlers/atools.vim | 41 + .../ale/autoload/ale/handlers/ccls.vim | 26 + .../ale/autoload/ale/handlers/cppcheck.vim | 89 + .../ale/autoload/ale/handlers/cpplint.vim | 21 + .../ale/autoload/ale/handlers/cspell.vim | 54 + .../plugged/ale/autoload/ale/handlers/css.vim | 70 + .../ale/autoload/ale/handlers/deno.vim | 76 + .../ale/autoload/ale/handlers/elixir.vim | 28 + .../ale/autoload/ale/handlers/eslint.vim | 280 + .../ale/autoload/ale/handlers/fecs.vim | 52 + .../ale/autoload/ale/handlers/flawfinder.vim | 48 + .../ale/autoload/ale/handlers/gawk.vim | 27 + .../plugged/ale/autoload/ale/handlers/gcc.vim | 176 + .../plugged/ale/autoload/ale/handlers/go.vim | 29 + .../ale/autoload/ale/handlers/haskell.vim | 119 + .../autoload/ale/handlers/haskell_stack.vim | 7 + .../ale/autoload/ale/handlers/hdl_checker.vim | 73 + .../ale/autoload/ale/handlers/hlint.vim | 8 + .../ale/autoload/ale/handlers/inko.vim | 37 + .../ale/autoload/ale/handlers/ktlint.vim | 45 + .../autoload/ale/handlers/languagetool.vim | 77 + .../autoload/ale/handlers/markdownlint.vim | 24 + .../ale/autoload/ale/handlers/naga.vim | 30 + .../ale/autoload/ale/handlers/ocamllsp.vim | 30 + .../plugged/ale/autoload/ale/handlers/ols.vim | 26 + .../ale/autoload/ale/handlers/openscad.vim | 73 + .../ale/autoload/ale/handlers/pony.vim | 33 + .../ale/autoload/ale/handlers/redpen.vim | 65 + .../ale/autoload/ale/handlers/ruby.vim | 38 + .../ale/autoload/ale/handlers/rust.vim | 78 + .../ale/autoload/ale/handlers/scala.vim | 37 + .../plugged/ale/autoload/ale/handlers/sh.vim | 37 + .../ale/autoload/ale/handlers/shellcheck.vim | 123 + .../plugged/ale/autoload/ale/handlers/sml.vim | 102 + .../ale/autoload/ale/handlers/solhint.vim | 98 + .../ale/autoload/ale/handlers/spectral.vim | 31 + .../ale/autoload/ale/handlers/statix.vim | 24 + .../ale/autoload/ale/handlers/textlint.vim | 39 + .../ale/autoload/ale/handlers/tslint.vim | 13 + .../ale/autoload/ale/handlers/tsserver.vim | 8 + .../ale/autoload/ale/handlers/unix.vim | 26 + .../ale/autoload/ale/handlers/vale.vim | 39 + .../ale/autoload/ale/handlers/writegood.vim | 72 + .../plugged/ale/autoload/ale/handlers/xo.vim | 44 + .../ale/autoload/ale/handlers/yamllint.vim | 39 + .../plugged/ale/autoload/ale/highlight.vim | 222 + dot_vim/plugged/ale/autoload/ale/history.vim | 62 + dot_vim/plugged/ale/autoload/ale/hover.vim | 368 + dot_vim/plugged/ale/autoload/ale/java.vim | 26 + dot_vim/plugged/ale/autoload/ale/job.vim | 385 + dot_vim/plugged/ale/autoload/ale/julia.vim | 19 + dot_vim/plugged/ale/autoload/ale/linter.vim | 462 + dot_vim/plugged/ale/autoload/ale/list.vim | 274 + .../ale/autoload/ale/loclist_jumping.vim | 163 + dot_vim/plugged/ale/autoload/ale/lsp.vim | 718 + .../plugged/ale/autoload/ale/lsp/message.vim | 212 + .../plugged/ale/autoload/ale/lsp/reset.vim | 25 + .../plugged/ale/autoload/ale/lsp/response.vim | 152 + .../ale/autoload/ale/lsp/tsserver_message.vim | 165 + .../plugged/ale/autoload/ale/lsp_linter.vim | 547 + .../plugged/ale/autoload/ale/lsp_window.vim | 58 + dot_vim/plugged/ale/autoload/ale/maven.vim | 57 + dot_vim/plugged/ale/autoload/ale/node.vim | 22 + .../ale/autoload/ale/organize_imports.vim | 65 + .../plugged/ale/autoload/ale/other_source.vim | 21 + dot_vim/plugged/ale/autoload/ale/path.vim | 252 + .../ale/autoload/ale/pattern_options.vim | 47 + .../plugged/ale/autoload/ale/powershell.vim | 32 + dot_vim/plugged/ale/autoload/ale/preview.vim | 137 + dot_vim/plugged/ale/autoload/ale/python.vim | 170 + dot_vim/plugged/ale/autoload/ale/racket.vim | 12 + .../plugged/ale/autoload/ale/references.vim | 187 + dot_vim/plugged/ale/autoload/ale/rename.vim | 210 + dot_vim/plugged/ale/autoload/ale/ruby.vim | 83 + dot_vim/plugged/ale/autoload/ale/semver.vim | 78 + dot_vim/plugged/ale/autoload/ale/sign.vim | 496 + dot_vim/plugged/ale/autoload/ale/socket.vim | 151 + .../plugged/ale/autoload/ale/statusline.vim | 135 + dot_vim/plugged/ale/autoload/ale/swift.vim | 70 + dot_vim/plugged/ale/autoload/ale/symbol.vim | 110 + dot_vim/plugged/ale/autoload/ale/test.vim | 205 + dot_vim/plugged/ale/autoload/ale/toggle.vim | 101 + dot_vim/plugged/ale/autoload/ale/uri.vim | 43 + dot_vim/plugged/ale/autoload/ale/uri/jdt.vim | 110 + dot_vim/plugged/ale/autoload/ale/util.vim | 574 + .../plugged/ale/autoload/ale/virtualtext.vim | 248 + .../ale/autoload/asyncomplete/sources/ale.vim | 26 + dot_vim/plugged/ale/doc/ale-ada.txt | 71 + dot_vim/plugged/ale/doc/ale-ansible.txt | 39 + dot_vim/plugged/ale/doc/ale-apkbuild.txt | 30 + dot_vim/plugged/ale/doc/ale-asciidoc.txt | 24 + dot_vim/plugged/ale/doc/ale-asm.txt | 25 + dot_vim/plugged/ale/doc/ale-avra.txt | 26 + dot_vim/plugged/ale/doc/ale-awk.txt | 25 + dot_vim/plugged/ale/doc/ale-bats.txt | 13 + dot_vim/plugged/ale/doc/ale-bazel.txt | 28 + dot_vim/plugged/ale/doc/ale-bib.txt | 19 + dot_vim/plugged/ale/doc/ale-bicep.txt | 24 + dot_vim/plugged/ale/doc/ale-bitbake.txt | 31 + dot_vim/plugged/ale/doc/ale-c.txt | 451 + dot_vim/plugged/ale/doc/ale-cairo.txt | 15 + dot_vim/plugged/ale/doc/ale-chef.txt | 46 + dot_vim/plugged/ale/doc/ale-clojure.txt | 36 + .../plugged/ale/doc/ale-cloudformation.txt | 46 + dot_vim/plugged/ale/doc/ale-cmake.txt | 62 + dot_vim/plugged/ale/doc/ale-cpp.txt | 401 + dot_vim/plugged/ale/doc/ale-cs.txt | 243 + dot_vim/plugged/ale/doc/ale-css.txt | 93 + dot_vim/plugged/ale/doc/ale-cuda.txt | 52 + dot_vim/plugged/ale/doc/ale-d.txt | 32 + dot_vim/plugged/ale/doc/ale-dafny.txt | 16 + dot_vim/plugged/ale/doc/ale-dart.txt | 124 + dot_vim/plugged/ale/doc/ale-desktop.txt | 21 + dot_vim/plugged/ale/doc/ale-development.txt | 536 + dot_vim/plugged/ale/doc/ale-dhall.txt | 52 + dot_vim/plugged/ale/doc/ale-dockerfile.txt | 76 + dot_vim/plugged/ale/doc/ale-elixir.txt | 108 + dot_vim/plugged/ale/doc/ale-elm.txt | 100 + dot_vim/plugged/ale/doc/ale-erlang.txt | 131 + dot_vim/plugged/ale/doc/ale-eruby.txt | 58 + dot_vim/plugged/ale/doc/ale-fish.txt | 31 + dot_vim/plugged/ale/doc/ale-fortran.txt | 55 + dot_vim/plugged/ale/doc/ale-fountain.txt | 6 + dot_vim/plugged/ale/doc/ale-fuse.txt | 25 + dot_vim/plugged/ale/doc/ale-gitcommit.txt | 44 + dot_vim/plugged/ale/doc/ale-glsl.txt | 56 + dot_vim/plugged/ale/doc/ale-go.txt | 372 + dot_vim/plugged/ale/doc/ale-graphql.txt | 22 + dot_vim/plugged/ale/doc/ale-hack.txt | 51 + dot_vim/plugged/ale/doc/ale-handlebars.txt | 34 + dot_vim/plugged/ale/doc/ale-haskell.txt | 228 + dot_vim/plugged/ale/doc/ale-hcl.txt | 16 + dot_vim/plugged/ale/doc/ale-help.txt | 12 + dot_vim/plugged/ale/doc/ale-html.txt | 202 + dot_vim/plugged/ale/doc/ale-idris.txt | 23 + dot_vim/plugged/ale/doc/ale-ink.txt | 40 + dot_vim/plugged/ale/doc/ale-inko.txt | 22 + dot_vim/plugged/ale/doc/ale-ispc.txt | 24 + dot_vim/plugged/ale/doc/ale-java.txt | 291 + dot_vim/plugged/ale/doc/ale-javascript.txt | 363 + dot_vim/plugged/ale/doc/ale-json.txt | 177 + dot_vim/plugged/ale/doc/ale-json5.txt | 15 + dot_vim/plugged/ale/doc/ale-jsonc.txt | 15 + dot_vim/plugged/ale/doc/ale-jsonnet.txt | 43 + dot_vim/plugged/ale/doc/ale-julia.txt | 20 + dot_vim/plugged/ale/doc/ale-kotlin.txt | 113 + dot_vim/plugged/ale/doc/ale-latex.txt | 21 + dot_vim/plugged/ale/doc/ale-less.txt | 66 + dot_vim/plugged/ale/doc/ale-llvm.txt | 19 + dot_vim/plugged/ale/doc/ale-lua.txt | 118 + dot_vim/plugged/ale/doc/ale-make.txt | 18 + dot_vim/plugged/ale/doc/ale-markdown.txt | 122 + dot_vim/plugged/ale/doc/ale-mercury.txt | 26 + dot_vim/plugged/ale/doc/ale-nasm.txt | 26 + dot_vim/plugged/ale/doc/ale-nim.txt | 45 + dot_vim/plugged/ale/doc/ale-nix.txt | 79 + dot_vim/plugged/ale/doc/ale-nroff.txt | 12 + dot_vim/plugged/ale/doc/ale-objc.txt | 80 + dot_vim/plugged/ale/doc/ale-objcpp.txt | 42 + dot_vim/plugged/ale/doc/ale-ocaml.txt | 117 + dot_vim/plugged/ale/doc/ale-openapi.txt | 74 + dot_vim/plugged/ale/doc/ale-openscad.txt | 25 + dot_vim/plugged/ale/doc/ale-packer.txt | 24 + dot_vim/plugged/ale/doc/ale-pascal.txt | 24 + dot_vim/plugged/ale/doc/ale-pawn.txt | 12 + dot_vim/plugged/ale/doc/ale-perl.txt | 91 + dot_vim/plugged/ale/doc/ale-perl6.txt | 43 + dot_vim/plugged/ale/doc/ale-php.txt | 367 + dot_vim/plugged/ale/doc/ale-po.txt | 12 + dot_vim/plugged/ale/doc/ale-pod.txt | 12 + dot_vim/plugged/ale/doc/ale-pony.txt | 25 + dot_vim/plugged/ale/doc/ale-powershell.txt | 75 + dot_vim/plugged/ale/doc/ale-prolog.txt | 56 + dot_vim/plugged/ale/doc/ale-proto.txt | 112 + dot_vim/plugged/ale/doc/ale-pug.txt | 44 + dot_vim/plugged/ale/doc/ale-puppet.txt | 57 + dot_vim/plugged/ale/doc/ale-purescript.txt | 69 + dot_vim/plugged/ale/doc/ale-pyrex.txt | 25 + dot_vim/plugged/ale/doc/ale-python.txt | 1353 + dot_vim/plugged/ale/doc/ale-qml.txt | 18 + dot_vim/plugged/ale/doc/ale-r.txt | 68 + dot_vim/plugged/ale/doc/ale-racket.txt | 41 + dot_vim/plugged/ale/doc/ale-reasonml.txt | 76 + dot_vim/plugged/ale/doc/ale-rego.txt | 50 + .../plugged/ale/doc/ale-restructuredtext.txt | 33 + dot_vim/plugged/ale/doc/ale-robot.txt | 16 + dot_vim/plugged/ale/doc/ale-ruby.txt | 243 + dot_vim/plugged/ale/doc/ale-rust.txt | 300 + dot_vim/plugged/ale/doc/ale-salt.tmt | 43 + dot_vim/plugged/ale/doc/ale-sass.txt | 31 + dot_vim/plugged/ale/doc/ale-scala.txt | 130 + dot_vim/plugged/ale/doc/ale-scss.txt | 64 + dot_vim/plugged/ale/doc/ale-sh.txt | 144 + dot_vim/plugged/ale/doc/ale-sml.txt | 36 + dot_vim/plugged/ale/doc/ale-solidity.txt | 41 + dot_vim/plugged/ale/doc/ale-spec.txt | 43 + dot_vim/plugged/ale/doc/ale-sql.txt | 89 + dot_vim/plugged/ale/doc/ale-stylus.txt | 33 + dot_vim/plugged/ale/doc/ale-sugarss.txt | 31 + .../doc/ale-supported-languages-and-tools.txt | 701 + dot_vim/plugged/ale/doc/ale-svelte.txt | 31 + dot_vim/plugged/ale/doc/ale-swift.txt | 67 + dot_vim/plugged/ale/doc/ale-systemd.txt | 14 + dot_vim/plugged/ale/doc/ale-tcl.txt | 25 + dot_vim/plugged/ale/doc/ale-terraform.txt | 138 + dot_vim/plugged/ale/doc/ale-tex.txt | 95 + dot_vim/plugged/ale/doc/ale-texinfo.txt | 18 + dot_vim/plugged/ale/doc/ale-text.txt | 48 + dot_vim/plugged/ale/doc/ale-thrift.txt | 65 + dot_vim/plugged/ale/doc/ale-toml.txt | 12 + dot_vim/plugged/ale/doc/ale-typescript.txt | 223 + dot_vim/plugged/ale/doc/ale-v.txt | 45 + dot_vim/plugged/ale/doc/ale-vala.txt | 33 + dot_vim/plugged/ale/doc/ale-verilog.txt | 142 + dot_vim/plugged/ale/doc/ale-vhdl.txt | 157 + dot_vim/plugged/ale/doc/ale-vim-help.txt | 12 + dot_vim/plugged/ale/doc/ale-vim.txt | 82 + dot_vim/plugged/ale/doc/ale-vue.txt | 68 + dot_vim/plugged/ale/doc/ale-wgsl.txt | 17 + dot_vim/plugged/ale/doc/ale-xhtml.txt | 18 + dot_vim/plugged/ale/doc/ale-xml.txt | 34 + dot_vim/plugged/ale/doc/ale-yaml.txt | 331 + dot_vim/plugged/ale/doc/ale-yang.txt | 17 + dot_vim/plugged/ale/doc/ale-zeek.txt | 23 + dot_vim/plugged/ale/doc/ale-zig.txt | 45 + dot_vim/plugged/ale/doc/ale.txt | 4660 +++ dot_vim/plugged/ale/doc/tags | 2561 ++ dot_vim/plugged/ale/dot_appveyor.yml | 48 + dot_vim/plugged/ale/dot_editorconfig | 14 + dot_vim/plugged/ale/dot_git/HEAD | 1 + dot_vim/plugged/ale/dot_git/branches/.keep | 0 dot_vim/plugged/ale/dot_git/config | 11 + dot_vim/plugged/ale/dot_git/description | 1 + .../ale/dot_git/hooks/applypatch-msg.sample | 15 + .../ale/dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../ale/dot_git/hooks/post-update.sample | 8 + .../ale/dot_git/hooks/pre-applypatch.sample | 14 + .../ale/dot_git/hooks/pre-commit.sample | 49 + .../ale/dot_git/hooks/pre-merge-commit.sample | 13 + .../plugged/ale/dot_git/hooks/pre-push.sample | 53 + .../ale/dot_git/hooks/pre-rebase.sample | 169 + .../ale/dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../ale/dot_git/hooks/push-to-checkout.sample | 78 + .../plugged/ale/dot_git/hooks/update.sample | 128 + dot_vim/plugged/ale/dot_git/index | Bin 0 -> 230424 bytes dot_vim/plugged/ale/dot_git/info/exclude | 6 + dot_vim/plugged/ale/dot_git/logs/HEAD | 2 + .../ale/dot_git/logs/refs/heads/master | 1 + .../ale/dot_git/logs/refs/remotes/origin/HEAD | 1 + .../plugged/ale/dot_git/objects/info/.keep | 0 ...5dba8ccc2287167c324ef036a5261c7f156062.idx | Bin 0 -> 221852 bytes ...dba8ccc2287167c324ef036a5261c7f156062.pack | Bin 0 -> 10366847 bytes dot_vim/plugged/ale/dot_git/packed-refs | 62 + dot_vim/plugged/ale/dot_git/refs/heads/master | 1 + .../ale/dot_git/refs/remotes/origin/HEAD | 1 + dot_vim/plugged/ale/dot_git/refs/tags/.keep | 0 dot_vim/plugged/ale/dot_git/shallow | 43 + dot_vim/plugged/ale/dot_gitattributes | 13 + .../plugged/ale/dot_github/CODE_OF_CONDUCT.md | 3 + .../plugged/ale/dot_github/CONTRIBUTING.md | 25 + .../ale/dot_github/ISSUE_TEMPLATE/config.yml | 6 + .../dot_github/ISSUE_TEMPLATE/report-a-bug.md | 48 + .../suggest-a-new-linter-or-fixer.md | 21 + .../ISSUE_TEMPLATE/suggest-an-improvement.md | 8 + .../ale/dot_github/PULL_REQUEST_TEMPLATE.md | 13 + dot_vim/plugged/ale/dot_github/stale.yml | 17 + .../plugged/ale/dot_github/workflows/main.yml | 37 + dot_vim/plugged/ale/dot_gitignore | 12 + dot_vim/plugged/ale/dot_vintrc.yaml | 5 + dot_vim/plugged/ale/executable_run-tests | 270 + .../plugged/ale/ftplugin/ale-fix-suggest.vim | 2 + .../ale/ftplugin/ale-preview-selection.vim | 16 + dot_vim/plugged/ale/ftplugin/ale-preview.vim | 2 + dot_vim/plugged/ale/plugin/ale.vim | 354 + .../rplugin/python3/deoplete/sources/ale.py | 62 + dot_vim/plugged/ale/run-tests.bat | 30 + dot_vim/plugged/ale/supported-tools.md | 707 + .../plugged/ale/syntax/ale-fix-suggest.vim | 13 + .../ale/syntax/ale-preview-selection.vim | 11 + .../completion/test_ale_import_command.vader | 562 + .../completion/test_complete_events.vader | 35 + .../completion/test_completion_events.vader | 486 + .../test_completion_filtering.vader | 142 + .../completion/test_completion_prefixes.vader | 65 + .../test_lsp_completion_messages.vader | 307 + .../test_lsp_completion_parsing.vader | 736 + .../completion/test_omnifunc_completion.vader | 60 + .../test_public_completion_api.vader | 47 + .../test_tsserver_completion_parsing.vader | 309 + .../ale/test/dot_config/nvim/symlink_init.vim | 1 + .../plugged/ale/test/fix/test_ale_fix.vader | 884 + .../ale/test/fix/test_ale_fix_aliases.vader | 5 + .../test/fix/test_ale_fix_completion.vader | 23 + .../fix/test_ale_fix_completion_filter.vader | 14 + .../ale/test/fix/test_ale_fix_ignore.vader | 110 + .../ale/test/fix/test_ale_fix_suggest.vader | 102 + ...test_appleswiftformat_fixer_callback.vader | 47 + .../fixers/test_astyle_fixer_callback.vader | 96 + .../test_autoflake_fixer_callback.vader | 49 + .../test_autoimport_fixer_callback.vader | 47 + .../fixers/test_autopep8_fixer_callback.vader | 37 + .../fixers/test_bibclean_fixer_callback.vader | 30 + .../fixers/test_black_fixer_callback.vader | 67 + ...est_break_up_long_lines_python_fixer.vader | 39 + .../fixers/test_brittany_fixer_callback.vader | 24 + .../test_buf_format_fixer_callback.vader | 21 + .../test_buildifier_fixer_callback.vader | 29 + .../test_clangformat_fixer_callback.vader | 64 + .../test_clangtidy_fixer_callback.vader | 47 + .../test_cmakeformat_fixer_callback.vader | 36 + .../test_crystal_format_fixer_callback.vader | 33 + .../test_css_beautify_fixer_callback.vader | 12 + .../test_dart_format_fixer_callback.vader | 40 + .../fixers/test_dartfmt_fixer_callback.vader | 40 + .../fixers/test_dfmt_fixer_callback.vader | 40 + .../test_dhall_format_fixer_callback.vader | 22 + .../test_dhall_freeze_fixer_callback.vader | 22 + .../test_dhall_lint_fixer_callback.vader | 20 + .../test_dotnet_format_fixer_callback.vader | 41 + .../fixers/test_dprint_fixer_callback.vader | 44 + .../fixers/test_dune_fixer_callback.vader | 36 + .../test_elm_format_fixer_callback.vader | 74 + .../fixers/test_erblint_fixer_callback.vader | 55 + .../fixers/test_erlfmt_fixer_callback.vader | 25 + .../fixers/test_eslint_fixer_callback.vader | 339 + .../fixers/test_fecs_fixer_callback.vader | 24 + .../test_fish_indent_fixer_callback.vader | 40 + .../fixers/test_fixjson_fixer_callback.vader | 50 + .../fixers/test_floskell_fixer_callback.vader | 23 + .../fixers/test_gnatpp_fixer_callback.vader | 28 + .../fixers/test_gofmt_fixer_callback.vader | 50 + .../ale/test/fixers/test_gofumpt_fixer.vader | 27 + .../test_goimports_fixer_callback.vader | 57 + .../fixers/test_golines_fixer_callback.vader | 54 + .../fixers/test_gomod_fixer_callback.vader | 41 + ...st_goofle_java_format_fixer_callback.vader | 27 + .../fixers/test_hackfmt_fixer_callback.vader | 37 + .../fixers/test_hfmt_fixer_callback.vader | 24 + .../fixers/test_hindent_fixer_callback.vader | 18 + .../fixers/test_hlint_fixer_callback.vader | 20 + .../test_html_beautify_fixer_callback.vader | 12 + .../fixers/test_importjs_fixer_callback.vader | 35 + .../fixers/test_isort_fixer_callback.vader | 70 + .../test/fixers/test_jq_fixer_callback.vader | 26 + .../test_jsonnetfmt_fixer_callback.vader | 38 + .../fixers/test_ktlint_fixer_callback.vader | 42 + .../test_latexindent_fixer_callback.vader | 36 + .../test_lua_format_fixer_callback.vader | 35 + .../fixers/test_luafmt_fixer_callback.vader | 35 + .../test_mix_format_fixer_callback.vader | 36 + .../test_nimpretty_fixer_callback.vader | 23 + .../fixers/test_nixfmt_fixer_callback.vader | 24 + .../test_nixpkgsfmt_fixer_callback.vader | 24 + .../test_ocamlformat_fixer_callback.vader | 36 + .../test_ocp_indent_fixer_callback.vader | 34 + .../fixers/test_opa_fmt_fixer_callback.vader | 33 + .../fixers/test_ormolu_fixer_callback.vader | 24 + .../test_packer_fmt_fixer_callback.vader | 34 + .../fixers/test_pandoc_fixer_callback.vader | 23 + .../fixers/test_perltidy_fixer_callback.vader | 40 + .../test_pgformatter_fixer_callback.vader | 24 + .../ale/test/fixers/test_php_cs_fixer.vader | 62 + .../fixers/test_phpcbf_fixer_callback.vader | 117 + .../ale/test/fixers/test_pint_fixer.vader | 62 + .../test_prettier_eslint_fixer.callback.vader | 97 + .../fixers/test_prettier_fixer_callback.vader | 337 + .../test_prettier_standard_callback.vader | 15 + .../test_protolint_fixer_callback.vader | 28 + .../fixers/test_ptop_fixer_callback.vader | 38 + .../test_puppetlint_fixer_callback.vader | 24 + .../test_purs_tidy_fixer_callback.vader | 20 + .../fixers/test_purty_fixer_callback.vader | 24 + .../fixers/test_pyflyby_fixer_callback.vader | 38 + .../test_python_add_blank_lines_fixer.vader | 167 + .../fixers/test_qmlfmt_fixer_callback.vader | 12 + .../fixers/test_raco_fmt_fixer_callback.vader | 17 + .../fixers/test_refmt_fixer_callback.vader | 41 + .../test_remark_lint_fixer_callback.vader | 24 + ...eorder_python_imports_fixer_callback.vader | 46 + .../fixers/test_rubocop_fixer_callback.vader | 89 + .../fixers/test_ruff_fixer_callback.vader | 122 + .../fixers/test_rufo_fixer_callback.vader | 30 + .../fixers/test_rustfmt_fixer_callback.vader | 16 + .../fixers/test_scalafmt_fixer_callback.vader | 66 + .../fixers/test_shfmt_fixer_callback.vader | 27 + .../fixers/test_sorbet_fixer_callback.vader | 38 + .../fixers/test_sqlfmt_fixer_callback.vader | 26 + .../test_sqlformat_fixer_callback.vader | 24 + .../fixers/test_standard_fixer_callback.vader | 31 + .../test_standardrb_fixer_callback.vader | 51 + .../ale/test/fixers/test_statix_fixer.vader | 18 + .../test_stylelint_fixer_callback.vader | 34 + .../fixers/test_styler_fixer_callback.vader | 21 + .../test_stylish_haskell_fixer_callback.vader | 24 + .../fixers/test_stylua_fixer_callback.vader | 19 + .../test_swiftformat_fixer_callback.vader | 35 + .../test_syntax_tree_fixer_callback.vader | 37 + .../test_terraform_fmt_fixer_callback.vader | 34 + .../fixers/test_textlint_fixer_callback.vader | 42 + .../fixers/test_tidy_fixer_callback.vader | 25 + .../test/fixers/test_trim_whitespace.vader | 28 + .../fixers/test_tslint_fixer_callback.vader | 42 + .../test_uncrustify_fixer_callback.vader | 108 + .../fixers/test_vfmt_fixer_callback.vader | 44 + .../test_vim_help_tags_alignment_fixer.vader | 19 + .../fixers/test_xmllint_fixer_callback.vader | 46 + .../test/fixers/test_xo_fixer_callback.vader | 45 + .../fixers/test_xots_fixer_callback.vader | 45 + .../fixers/test_yamlfix_fixer_callback.vader | 33 + .../fixers/test_yapf_fixer_callback.vader | 39 + .../fixers/test_zigfmt_fixer_callback.vader | 20 + .../handler/test_actionlint_handler.vader | 43 + .../test/handler/test_ada_gcc_handler.vader | 36 + .../ale/test/handler/test_alex_handler.vader | 54 + .../ale/test/handler/test_ameba_handler.vader | 44 + .../handler/test_ansible_lint_handler.vader | 101 + .../test_appleswiftformat_handler.vader | 28 + .../ale/test/handler/test_asm_handler.vader | 26 + .../test/handler/test_atools_handler.vader | 85 + .../ale/test/handler/test_avra_handler.vader | 24 + .../test/handler/test_bandit_handler.vader | 42 + .../test/handler/test_bashate_handler.vader | 36 + .../test/handler/test_bibclean_handler.vader | 88 + .../handler/test_bicep_bicep_handler.vader | 30 + .../test_bitbake_oelint_adv_handler.vader | 28 + .../test/handler/test_brakeman_handler.vader | 83 + .../test_cfn_python_lint_handler.vader | 33 + .../test/handler/test_checkmake_handler.vader | 23 + .../test/handler/test_checkov_handler.vader | 66 + .../handler/test_checkstyle_handler.vader | 53 + .../test/handler/test_circleci_handler.vader | 39 + .../ale/test/handler/test_clang_handler.vader | 30 + .../test_clojure_clj_kondo_handler.vader | 89 + .../handler/test_clojure_joker_handler.vader | 75 + .../handler/test_cmake_lint_handler.vader | 30 + .../handler/test_coffeelint_handler.vader | 20 + .../test/handler/test_common_handlers.vader | 181 + .../test/handler/test_cookstyle_handler.vader | 22 + .../test/handler/test_cppcheck_handler.vader | 93 + .../test/handler/test_cpplint_handler.vader | 29 + .../ale/test/handler/test_credo_handler.vader | 53 + .../test/handler/test_crystal_handler.vader | 28 + .../ale/test/handler/test_csc_handler.vader | 98 + .../test/handler/test_cspell_handler.vader | 13 + .../test/handler/test_cucumber_handler.vader | 18 + .../test/handler/test_cuda_nvcc_handler.vader | 41 + .../handler/test_cypher_lint_handler.vader | 21 + .../ale/test/handler/test_dafny_handler.vader | 36 + .../handler/test_dart_analyze_handler.vader | 35 + .../test/handler/test_debride_handler.vader | 27 + .../test_desktop_file_validate_handler.vader | 26 + .../ale/test/handler/test_dmd_handler.vader | 41 + .../test_dockerfile_lint_handler.vader | 112 + .../ale/test/handler/test_dogma_handler.vader | 30 + .../test/handler/test_drafter_handler.vader | 37 + .../test/handler/test_elmmake_handler.vader | 299 + .../test_embertemplatelint_handler.vader | 81 + .../test/handler/test_erblint_handler.vader | 70 + .../test_erlang_dialyzer_handler.vader | 27 + .../handler/test_erlang_elvis_handler.vader | 40 + .../test/handler/test_eslint_handler.vader | 438 + .../handler/test_eslint_json_handler.vader | 376 + .../ale/test/handler/test_fecs_handler.vader | 35 + .../ale/test/handler/test_fish_handler.vader | 61 + .../test/handler/test_flake8_handler.vader | 276 + .../test/handler/test_flakehell_handler.vader | 276 + .../handler/test_flawfinder_handler.vader | 57 + .../ale/test/handler/test_flow_handler.vader | 507 + .../handler/test_foodcritic_handler.vader | 44 + .../test/handler/test_fortran_handler.vader | 95 + .../ale/test/handler/test_gawk_handler.vader | 39 + .../ale/test/handler/test_gcc_handler.vader | 316 + .../ale/test/handler/test_ghc_handler.vader | 177 + .../test/handler/test_ghc_mod_handler.vader | 37 + .../ale/test/handler/test_ghdl_handler.vader | 26 + .../handler/test_gitlablint_handler.vader | 35 + .../test/handler/test_gitlint_handler.vader | 89 + .../test/handler/test_glslang_handler.vader | 24 + .../handler/test_go_generic_handler.vader | 38 + .../test/handler/test_gobuild_handler.vader | 45 + .../handler/test_golangci_lint_handler.vader | 84 + .../handler/test_gometalinter_handler.vader | 57 + .../ale/test/handler/test_hadolint.vader | 59 + .../handler/test_haskell_stack_handler.vader | 7 + .../ale/test/handler/test_hlint_handler.vader | 80 + .../test_ibm_openapi_validator_handler.vader | 49 + .../ale/test/handler/test_idris_handler.vader | 66 + .../ale/test/handler/test_inko_handler.vader | 54 + .../test/handler/test_ispc_ispc_handler.vader | 90 + .../ale/test/handler/test_javac_handler.vader | 97 + .../ale/test/handler/test_jscs_handler.vader | 39 + .../test/handler/test_ktlint_handler.vader | 21 + .../test/handler/test_lacheck_handler.vader | 34 + .../handler/test_languagetool_handler.vader | 62 + .../ale/test/handler/test_lessc_handler.vader | 69 + .../ale/test/handler/test_llc_handler.vader | 58 + .../handler/test_lua_selene_handler.vader | 38 + .../ale/test/handler/test_luac_handler.vader | 36 + .../test/handler/test_luacheck_handler.vader | 62 + .../handler/test_markdownlint_handler.vader | 91 + .../ale/test/handler/test_mcs_handler.vader | 37 + .../ale/test/handler/test_mcsc_handler.vader | 88 + .../ale/test/handler/test_mdl_handler.vader | 25 + .../handler/test_mercury_mmc_handler.vader | 58 + .../ale/test/handler/test_mix_handler.vader | 21 + .../ale/test/handler/test_msgfmt_hander.vader | 24 + .../ale/test/handler/test_mypy_handler.vader | 141 + .../ale/test/handler/test_naga_handler.vader | 23 + .../test/handler/test_nagelfar_handler.vader | 174 + .../ale/test/handler/test_nasm_handler.vader | 30 + .../ale/test/handler/test_nim_handler.vader | 80 + .../ale/test/handler/test_nix_handler.vader | 101 + .../test/handler/test_openscad_handler.vader | 76 + .../ale/test/handler/test_perl6_handler.vader | 277 + .../ale/test/handler/test_perl_handler.vader | 109 + .../handler/test_perlcritic_handler.vader | 20 + .../ale/test/handler/test_php_handler.vader | 93 + .../test/handler/test_php_phan_handler.vader | 26 + .../test/handler/test_php_phpmd_handler.vader | 24 + .../ale/test/handler/test_phpcs_handler.vader | 28 + .../test/handler/test_phpstan_handler.vader | 51 + .../ale/test/handler/test_pmd_handler.vader | 42 + .../ale/test/handler/test_pony_handler.vader | 21 + .../handler/test_powershell_handler.vader | 109 + .../handler/test_prospector_handler.vader | 163 + .../test_psscriptanalyzer_handler.vader | 42 + .../test/handler/test_puglint_handler.vader | 45 + .../test/handler/test_puppet_handler.vader | 77 + .../handler/test_pycodestyle_handler.vader | 154 + .../handler/test_pydocstyle_handler.vader | 116 + .../test/handler/test_pyflakes_handler.vader | 24 + .../test/handler/test_pylama_handler.vader | 268 + .../test/handler/test_pylint_handler.vader | 135 + .../handler/test_pyrex_cython_handler.vader | 26 + .../test/handler/test_qmlfmt_handler.vader | 19 + .../test/handler/test_qmllint_handler.vader | 19 + .../ale/test/handler/test_raco_handler.vader | 27 + .../test_rails_best_practices_handler.vader | 52 + .../test/handler/test_redpen_handler.vader | 98 + .../ale/test/handler/test_reek_handler.vader | 81 + .../handler/test_remark_lint_handler.vader | 39 + .../test/handler/test_rflint_handler.vader | 33 + .../test/handler/test_rpmlint_handler.vader | 33 + .../handler/test_rstcheck_lint_handler.vader | 42 + .../test/handler/test_rubocop_handler.vader | 76 + .../ale/test/handler/test_ruby_handler.vader | 38 + .../ale/test/handler/test_rust_handler.vader | 483 + .../test/handler/test_salt_salt_lint.vader | 34 + .../ale/test/handler/test_scala_handler.vader | 32 + .../handler/test_scalastyle_handler.vader | 53 + .../ale/test/handler/test_shell_handler.vader | 177 + .../handler/test_shellcheck_handler.vader | 43 + .../ale/test/handler/test_slim_handler.vader | 34 + .../ale/test/handler/test_sml_handler.vader | 119 + .../ale/test/handler/test_solc_handler.vader | 34 + .../test/handler/test_solhint_handler.vader | 84 + .../test/handler/test_spectral_handler.vader | 52 + .../handler/test_sql_sqlfluff_handler.vader | 39 + .../test/handler/test_sqlint_handler.vader | 34 + .../test/handler/test_sqllint_handler.vader | 23 + .../test/handler/test_standard_handler.vader | 37 + .../test/handler/test_starknet_handler.vader | 36 + .../test/handler/test_statix_handler.vader | 16 + .../test/handler/test_stylelint_handler.vader | 43 + .../test/handler/test_swaglint_handler.vader | 68 + .../test/handler/test_swiftlint_handler.vader | 30 + .../ale/test/handler/test_swipl_handler.vader | 155 + .../test/handler/test_syntaxerl_handler.vader | 24 + .../test_systemd_analyze_handler.vader | 19 + .../test/handler/test_terraform_handler.vader | 138 + .../test/handler/test_textlint_handler.vader | 41 + .../test/handler/test_tflint_handler.vader | 99 + .../ale/test/handler/test_tfsec_handler.vader | 52 + .../test/handler/test_thrift_handler.vader | 63 + .../handler/test_thriftcheck_handler.vader | 28 + .../ale/test/handler/test_tlint_handler.vader | 34 + .../test/handler/test_tslint_handler.vader | 315 + .../test/handler/test_typecheck_handler.vader | 24 + .../test/handler/test_unimport_handler.vader | 18 + .../ale/test/handler/test_v_handler.vader | 54 + .../test/handler/test_vala_lint_handler.vader | 54 + .../ale/test/handler/test_vale_handler.vader | 88 + .../ale/test/handler/test_vcom_handler.vader | 36 + .../test/handler/test_verilator_handler.vader | 52 + .../ale/test/handler/test_vint_handler.vader | 65 + .../ale/test/handler/test_vlog_handler.vader | 47 + .../test/handler/test_vulture_handler.vader | 92 + .../handler/test_write_good_handler.vader | 37 + .../test/handler/test_xmllint_handler.vader | 30 + .../ale/test/handler/test_xvhdl_handler.vader | 24 + .../ale/test/handler/test_xvlog_handler.vader | 18 + .../test/handler/test_yamllint_handler.vader | 59 + .../ale/test/handler/test_yosys_handler.vader | 27 + .../ale/test/handler/test_zeek_handler.vader | 17 + .../ale/test/jsonnet_files/testfile.jsonnet | 1 + .../test/linter/executable_test_bitbake.vader | 13 + .../ale/test/linter/test_ada_gcc.vader | 42 + .../plugged/ale/test/linter/test_adals.vader | 17 + .../plugged/ale/test/linter/test_alex.vader | 34 + .../plugged/ale/test/linter/test_ameba.vader | 20 + .../ale/test/linter/test_angular.vader | 28 + .../linter/test_ansible_language_server.vader | 18 + .../ale/test/linter/test_ansible_lint.vader | 26 + .../test/linter/test_asciidoc_textlint.vader | 65 + .../ale/test/linter/test_asm_gcc.vader | 19 + .../ale/test/linter/test_avra_avra.vader | 29 + .../plugged/ale/test/linter/test_bandit.vader | 90 + .../ale/test/linter/test_bashate.vader | 15 + .../ale/test/linter/test_bib_bibclean.vader | 24 + .../ale/test/linter/test_bicep_bicep.vader | 21 + .../plugged/ale/test/linter/test_bingo.vader | 74 + .../ale/test/linter/test_brakeman.vader | 37 + .../ale/test/linter/test_buf_lint.vader | 32 + .../plugged/ale/test/linter/test_c_cc.vader | 94 + .../plugged/ale/test/linter/test_c_ccls.vader | 69 + .../ale/test/linter/test_c_clang_tidy.vader | 77 + .../ale/test/linter/test_c_clangd.vader | 47 + .../ale/test/linter/test_c_cppcheck.vader | 63 + .../ale/test/linter/test_c_cquery.vader | 37 + .../ale/test/linter/test_c_flawfinder.vader | 24 + .../ale/test/linter/test_c_import_paths.vader | 162 + .../plugged/ale/test/linter/test_cargo.vader | 222 + .../ale/test/linter/test_checkmake.vader | 39 + .../ale/test/linter/test_checkov.vader | 14 + .../ale/test/linter/test_checkstyle.vader | 72 + .../ale/test/linter/test_circleci.vader | 13 + .../ale/test/linter/test_clang_tidy.vader | 84 + .../ale/test/linter/test_clj_kondo.vader | 15 + .../test/linter/test_cmake_cmake_lint.vader | 13 + .../ale/test/linter/test_cookstyle.vader | 19 + .../plugged/ale/test/linter/test_cpp_cc.vader | 94 + .../ale/test/linter/test_cpp_ccls.vader | 69 + .../ale/test/linter/test_cpp_clangcheck.vader | 35 + .../ale/test/linter/test_cpp_clazy.vader | 56 + .../ale/test/linter/test_cpp_cppcheck.vader | 83 + .../ale/test/linter/test_cpp_cquery.vader | 40 + .../ale/test/linter/test_cpp_flawfinder.vader | 26 + .../ale/test/linter/test_cpplint.vader | 17 + .../plugged/ale/test/linter/test_cs_csc.vader | 42 + .../plugged/ale/test/linter/test_cs_mcs.vader | 13 + .../ale/test/linter/test_cs_mcsc.vader | 42 + .../plugged/ale/test/linter/test_cspell.vader | 71 + .../ale/test/linter/test_cucumber.vader | 18 + .../ale/test/linter/test_cuda_nvcc.vader | 20 + .../test/linter/test_cypher_cypher_lint.vader | 8 + .../plugged/ale/test/linter/test_d_dls.vader | 19 + .../linter/test_dart_analysis_server.vader | 15 + .../linter/test_dart_language_server.vader | 8 + .../linter/test_desktop_file_validate.vader | 15 + .../ale/test/linter/test_dialyxir.vader | 16 + .../test/linter/test_dmd_commandline.vader | 96 + .../test/linter/test_dockerfile_lint.vader | 19 + .../plugged/ale/test/linter/test_dogma.vader | 16 + .../ale/test/linter/test_eclipselsp.vader | 111 + .../ale/test/linter/test_elixir_credo.vader | 43 + .../ale/test/linter/test_elixir_ls.vader | 34 + .../ale/test/linter/test_elixir_mix.vader | 19 + .../plugged/ale/test/linter/test_elm_ls.vader | 29 + .../ale/test/linter/test_elm_make.vader | 63 + .../test/linter/test_embertemplatelint.vader | 23 + .../plugged/ale/test/linter/test_erb.vader | 16 + .../ale/test/linter/test_erblint.vader | 26 + .../test/linter/test_erlang_dialyzer.vader | 45 + .../ale/test/linter/test_erlang_elvis.vader | 16 + .../test/linter/test_erlang_erlang_ls.vader | 48 + .../ale/test/linter/test_erlang_erlc.vader | 62 + .../test/linter/test_erlang_syntaxerl.vader | 45 + .../plugged/ale/test/linter/test_erubi.vader | 32 + .../plugged/ale/test/linter/test_erubis.vader | 16 + .../plugged/ale/test/linter/test_eslint.vader | 85 + .../plugged/ale/test/linter/test_fecs.vader | 9 + .../plugged/ale/test/linter/test_flake8.vader | 219 + .../ale/test/linter/test_flakehell.vader | 203 + .../plugged/ale/test/linter/test_flow.vader | 42 + .../ale/test/linter/test_foodcritic.vader | 18 + .../ale/test/linter/test_fortran_fortls.vader | 18 + .../plugged/ale/test/linter/test_fsc.vader | 13 + .../ale/test/linter/test_fusionlint.vader | 19 + .../plugged/ale/test/linter/test_gawk.vader | 25 + .../ale/test/linter/test_gfortran.vader | 24 + .../plugged/ale/test/linter/test_ghdl.vader | 19 + .../ale/test/linter/test_gitlint.vader | 43 + .../ale/test/linter/test_glslang.vader | 19 + .../plugged/ale/test/linter/test_glslls.vader | 19 + .../ale/test/linter/test_gobuild.vader | 33 + .../plugged/ale/test/linter/test_gofmt.vader | 26 + .../ale/test/linter/test_golangci_lint.vader | 50 + .../ale/test/linter/test_golangserver.vader | 76 + .../plugged/ale/test/linter/test_golint.vader | 30 + .../ale/test/linter/test_gometalinter.vader | 49 + .../plugged/ale/test/linter/test_gopls.vader | 96 + .../ale/test/linter/test_gosimple.vader | 19 + .../plugged/ale/test/linter/test_gotype.vader | 24 + .../plugged/ale/test/linter/test_govet.vader | 32 + .../ale/test/linter/test_graphql_gqlint.vader | 9 + .../ale/test/linter/test_haml_hamllint.vader | 43 + .../test/linter/test_haskell_cabal_ghc.vader | 13 + .../ale/test/linter/test_haskell_ghc.vader | 12 + .../test/linter/test_haskell_ghc_mod.vader | 10 + .../test/linter/test_haskell_hdevtools.vader | 16 + .../ale/test/linter/test_haskell_hie.vader | 27 + .../ale/test/linter/test_haskell_hlint.vader | 17 + .../ale/test/linter/test_haskell_hls.vader | 32 + .../linter/test_haskell_stack_build.vader | 13 + .../test/linter/test_haskell_stack_ghc.vader | 18 + .../linter/test_hdl_checker_options.vader | 86 + .../ale/test/linter/test_html_stylelint.vader | 60 + .../ale/test/linter/test_htmlhint.vader | 51 + .../linter/test_ibm_openapi_validator.vader | 15 + .../plugged/ale/test/linter/test_idris.vader | 21 + .../plugged/ale/test/linter/test_ink_ls.vader | 22 + .../ale/test/linter/test_inko_inko.vader | 20 + .../ale/test/linter/test_ispc_ispc.vader | 20 + .../ale/test/linter/test_iverilog.vader | 14 + .../plugged/ale/test/linter/test_javac.vader | 326 + .../ale/test/linter/test_javalsp.vader | 80 + .../linter/test_javascript_deno_lsp.vader | 79 + .../linter/test_javascript_tsserver.vader | 16 + dot_vim/plugged/ale/test/linter/test_jq.vader | 8 + .../plugged/ale/test/linter/test_jscs.vader | 15 + .../plugged/ale/test/linter/test_jshint.vader | 17 + .../ale/test/linter/test_jsonnet_lint.vader | 19 + .../ale/test/linter/test_jsonnetfmt.vader | 19 + .../linter/test_julia_languageserver.vader | 30 + .../linter/test_kotlin_languageserver.vader | 23 + .../ale/test/linter/test_kotlinc.vader | 9 + .../ale/test/linter/test_languagetool.vader | 22 + .../ale/test/linter/test_less_stylelint.vader | 32 + .../plugged/ale/test/linter/test_lessc.vader | 46 + .../plugged/ale/test/linter/test_lintr.vader | 34 + .../plugged/ale/test/linter/test_llc.vader | 21 + .../ale/test/linter/test_lua_selene.vader | 19 + .../plugged/ale/test/linter/test_luac.vader | 13 + .../ale/test/linter/test_luacheck.vader | 23 + .../linter/test_markdown_markdownlint.vader | 18 + .../ale/test/linter/test_markdown_mdl.vader | 19 + .../ale/test/linter/test_markdown_vale.vader | 32 + .../ale/test/linter/test_mercury_mmc.vader | 22 + .../plugged/ale/test/linter/test_mypy.vader | 106 + .../plugged/ale/test/linter/test_naga.vader | 10 + .../ale/test/linter/test_nagelfar.vader | 19 + .../ale/test/linter/test_nasm_nasm.vader | 32 + .../plugged/ale/test/linter/test_nimlsp.vader | 12 + .../ale/test/linter/test_nix_statix.vader | 19 + .../ale/test/linter/test_objc_ccls.vader | 66 + .../ale/test/linter/test_ocaml_ocamllsp.vader | 29 + .../ale/test/linter/test_ocaml_ols.vader | 41 + .../linter/test_ocamlinterface_ocamllsp.vader | 29 + .../ale/test/linter/test_openscad_sca2d.vader | 12 + .../plugged/ale/test/linter/test_perl.vader | 14 + .../plugged/ale/test/linter/test_perl6.vader | 14 + .../ale/test/linter/test_perlcritic.vader | 36 + .../plugged/ale/test/linter/test_php.vader | 15 + .../test/linter/test_php_intelephense.vader | 26 + .../ale/test/linter/test_php_langserver.vader | 32 + .../ale/test/linter/test_phpactor.vader | 20 + .../plugged/ale/test/linter/test_phpcs.vader | 42 + .../plugged/ale/test/linter/test_phpmd.vader | 12 + .../ale/test/linter/test_phpstan.vader | 121 + .../ale/test/linter/test_pony_ponyc.vader | 12 + .../ale/test/linter/test_prospector.vader | 35 + .../plugged/ale/test/linter/test_proto.vader | 16 + .../ale/test/linter/test_protolint.vader | 24 + .../plugged/ale/test/linter/test_psalm.vader | 44 + .../ale/test/linter/test_puglint.vader | 48 + .../ale/test/linter/test_purescript_ls.vader | 31 + .../ale/test/linter/test_pycodestyle.vader | 46 + .../ale/test/linter/test_pydocstyle.vader | 45 + .../ale/test/linter/test_pyflakes.vader | 60 + .../plugged/ale/test/linter/test_pylama.vader | 88 + .../plugged/ale/test/linter/test_pylint.vader | 96 + .../plugged/ale/test/linter/test_pylsp.vader | 78 + .../plugged/ale/test/linter/test_pyre.vader | 69 + .../ale/test/linter/test_pyrex_cython.vader | 30 + .../ale/test/linter/test_pyright.vader | 124 + .../plugged/ale/test/linter/test_qmlfmt.vader | 13 + .../test/linter/test_r_languageserver.vader | 22 + .../test/linter/test_racket_langserver.vader | 45 + .../ale/test/linter/test_racket_raco.vader | 10 + .../linter/test_rails_best_practices.vader | 42 + .../ale/test/linter/test_reason_ls.vader | 21 + .../ale/test/linter/test_reason_ols.vader | 42 + .../plugged/ale/test/linter/test_reek.vader | 49 + .../plugged/ale/test/linter/test_refurb.vader | 85 + .../ale/test/linter/test_rego_opacheck.vader | 16 + .../ale/test/linter/test_remark_lint.vader | 37 + .../plugged/ale/test/linter/test_revive.vader | 30 + .../plugged/ale/test/linter/test_rflint.vader | 20 + .../plugged/ale/test/linter/test_rnix.vader | 12 + .../ale/test/linter/test_rst_textlint.vader | 65 + .../ale/test/linter/test_rubocop.vader | 26 + .../plugged/ale/test/linter/test_ruby.vader | 13 + .../ale/test/linter/test_ruby_debride.vader | 8 + .../test/linter/test_ruby_solargraph.vader | 43 + .../plugged/ale/test/linter/test_ruff.vader | 105 + .../ale/test/linter/test_rust_analyzer.vader | 28 + .../ale/test/linter/test_rust_rls.vader | 33 + .../plugged/ale/test/linter/test_rustc.vader | 25 + .../plugged/ale/test/linter/test_ruumba.vader | 26 + .../ale/test/linter/test_sass_sasslint.vader | 43 + .../ale/test/linter/test_scala_metals.vader | 21 + .../test/linter/test_scala_sbtserver.vader | 23 + .../plugged/ale/test/linter/test_scalac.vader | 13 + .../ale/test/linter/test_scalastyle.vader | 34 + .../ale/test/linter/test_scss_sasslint.vader | 43 + .../ale/test/linter/test_scss_stylelint.vader | 33 + .../ale/test/linter/test_shellcheck.vader | 106 + .../ale/test/linter/test_slimlint.vader | 19 + .../plugged/ale/test/linter/test_solc.vader | 13 + .../ale/test/linter/test_solc_commit.vader | 14 + .../ale/test/linter/test_solhint.vader | 28 + .../plugged/ale/test/linter/test_sorbet.vader | 34 + .../ale/test/linter/test_spectral.vader | 31 + .../ale/test/linter/test_sql_sqlfluff.vader | 25 + .../ale/test/linter/test_sqllint.vader | 12 + .../ale/test/linter/test_standard.vader | 43 + .../ale/test/linter/test_standardrb.vader | 26 + .../ale/test/linter/test_standardts.vader | 43 + .../ale/test/linter/test_starknet.vader | 13 + .../ale/test/linter/test_staticcheck.vader | 49 + .../test/linter/test_sugarss_stylelint.vader | 33 + .../ale/test/linter/test_svelteserver.vader | 8 + .../ale/test/linter/test_swaglint.vader | 29 + .../linter/test_swift_appleswiftformat.vader | 42 + .../test/linter/test_swift_sourcekitlsp.vader | 21 + .../ale/test/linter/test_swiftlint.vader | 43 + .../test/linter/test_systemd_analyze.vader | 9 + .../ale/test/linter/test_terraform_ls.vader | 42 + .../ale/test/linter/test_terraform_lsp.vader | 29 + .../linter/test_terraform_terraform.vader | 15 + .../test/linter/test_terraform_tflint.vader | 28 + .../test/linter/test_terraform_tfsec.vader | 38 + .../ale/test/linter/test_tex_lacheck.vader | 13 + .../ale/test/linter/test_tex_textlint.vader | 65 + .../plugged/ale/test/linter/test_texlab.vader | 35 + .../ale/test/linter/test_textlint.vader | 65 + .../plugged/ale/test/linter/test_thrift.vader | 53 + .../ale/test/linter/test_thriftcheck.vader | 21 + .../plugged/ale/test/linter/test_tslint.vader | 23 + .../linter/test_typescript_deno_lsp.vader | 79 + .../linter/test_typescript_tsserver.vader | 8 + .../ale/test/linter/test_unimport.vader | 71 + .../test/linter/test_v_command_callback.vader | 25 + .../plugged/ale/test/linter/test_vcom.vader | 19 + .../ale/test/linter/test_verilator.vader | 14 + .../ale/test/linter/test_vim_vimls.vader | 77 + .../plugged/ale/test/linter/test_vint.vader | 34 + .../plugged/ale/test/linter/test_vlog.vader | 19 + .../plugged/ale/test/linter/test_volar.vader | 27 + .../ale/test/linter/test_vulture.vader | 62 + .../ale/test/linter/test_write_good.vader | 55 + .../ale/test/linter/test_xmllint.vader | 20 + dot_vim/plugged/ale/test/linter/test_xo.vader | 23 + .../plugged/ale/test/linter/test_xots.vader | 23 + .../plugged/ale/test/linter/test_xvhdl.vader | 19 + .../plugged/ale/test/linter/test_xvlog.vader | 19 + .../ale/test/linter/test_yaml_ls.vader | 21 + .../ale/test/linter/test_yang_lsp.vader | 12 + .../plugged/ale/test/linter/test_zeek.vader | 17 + .../ale/test/linter/test_zig_zls.vader | 15 + .../ale/test/lsp/test_closing_documents.vader | 176 + .../ale/test/lsp/test_did_save_event.vader | 147 + .../test_engine_lsp_response_handling.vader | 428 + .../lsp/test_handling_window_requests.vader | 94 + .../test/lsp/test_lsp_client_messages.vader | 389 + .../lsp/test_lsp_command_formatting.vader | 44 + .../ale/test/lsp/test_lsp_connections.vader | 227 + .../test/lsp/test_lsp_custom_request.vader | 158 + .../ale/test/lsp/test_lsp_error_parsing.vader | 74 + .../test/lsp/test_lsp_root_detection.vader | 90 + .../ale/test/lsp/test_lsp_startup.vader | 492 + ...st_other_initialize_message_handling.vader | 216 + .../test/lsp/test_read_lsp_diagnostics.vader | 257 + .../plugged/ale/test/lsp/test_reset_lsp.vader | 98 + .../ale/test/lsp/test_update_config.vader | 21 + .../ale/test/python/test_deoplete_source.py | 121 + .../ale/test/script/dumb_named_pipe_server.py | 42 + .../ale/test/script/dumb_tcp_client.py | 33 + .../ale/test/script/dumb_tcp_server.py | 40 + .../script/executable_block-padding-checker | 145 + .../script/executable_check-duplicate-tags | 5 + .../executable_check-supported-tools-tables | 60 + .../script/executable_check-tag-alignment | 11 + .../script/executable_check-tag-references | 22 + .../ale/test/script/executable_check-toc | 90 + .../ale/test/script/executable_custom-checks | 80 + .../script/executable_custom-linting-rules | 166 + .../test/script/executable_run-vader-tests | 167 + .../ale/test/script/executable_run-vint | 20 + .../test/sign/test_linting_sets_signs.vader | 76 + .../sign/test_sign_column_highlighting.vader | 68 + .../ale/test/sign/test_sign_limits.vader | 57 + .../ale/test/sign/test_sign_parsing.vader | 88 + .../ale/test/sign/test_sign_placement.vader | 315 + dot_vim/plugged/ale/test/smoke_test.vader | 141 + .../test/test-files/ada/empty_testfile.adb | 0 .../node_modules/alex/empty_cli.js | 0 .../node_modules/dot_bin/empty_alex | 0 .../language-server/bin/empty_ngserver | 0 .../@angular/language-service/empty_dummy | 0 .../ant/ant-project/empty_build.xml | 0 .../test-files/ant/bin/empty_executable_ant | 0 .../ant/bin/empty_executable_ant.exe | 0 .../ale/test/test-files/bazel/empty_BUILD | 0 .../ale/test/test-files/bazel/empty_WORKSPACE | 0 .../ale/test/test-files/bazel/empty_defs.bzl | 0 .../ale/test/test-files/bib/empty_dummy.bib | 0 .../build/empty_bad_folder_to_test_priority | 0 .../build/empty_compile_commands.json | 0 .../c/configure_project/empty_Makefile | 0 .../c/configure_project/empty_configure | 0 .../c/configure_project/include/empty_test.h | 0 .../c/configure_project/subdir/empty_Makefile | 0 .../ale/test/test-files/c/empty_dummy.c | 0 .../include/empty_test.h | 0 .../src/empty_Makefile | 0 .../c/gnumakefile_project/empty_GNUmakefile | 0 .../c/gnumakefile_project/empty_file.c | 0 .../c/h_file_project/empty_Makefile | 0 .../test-files/c/h_file_project/empty_test.h | 0 .../c/h_file_project/subdir/empty_dummy | 0 .../c/hpp_file_project/empty_Makefile | 0 .../c/hpp_file_project/empty_test.hpp | 0 .../c/hpp_file_project/subdir/empty_dummy | 0 .../build/empty_compile_commands.json | 0 .../c/json_project/include/empty_test.h | 0 .../c/json_project/subdir/empty_dummy | 0 .../test/test-files/c/makefile_project/args | 3 + .../c/makefile_project/empty_Makefile | 0 .../c/makefile_project/empty__astylerc | 0 .../c/makefile_project/include/empty_test.h | 0 .../test-files/c/makefile_project/subdir/args | 1 + .../c/makefile_project/subdir/empty_dummy | 0 .../c/makefile_project/subdir/empty_file.c | 0 .../test/test-files/cargo/empty_Cargo.toml | 0 .../cargo/workspace_paths/empty_Cargo.toml | 0 .../workspace_paths/subpath/empty_Cargo.toml | 0 .../empty_compile_commands.json | 0 .../ccls/with_ccls-root/empty_dot_ccls-root | 0 .../test-files/ccls/with_ccls/empty_dot_ccls | 0 .../empty_compile_commands.json | 0 .../checkstyle/empty_other_config.xml | 0 .../empty_compile_commands.json | 0 .../empty_compile_commands.json | 0 .../with_clangformat/empty_dot_clang-format | 0 .../test/test-files/cpp/empty_dot_astylerc | 0 .../ale/test/test-files/cpp/empty_dummy.cpp | 0 .../cppcheck/one/empty_compile_commands.json | 0 .../cppcheck/one/two/three/empty_file.c | 0 .../cppcheck/one/two/three/empty_file.cpp | 0 .../build/empty_compile_commands.json | 0 .../cquery/build/empty_compile_commands.json | 0 .../cquery/with_cquery/empty_dot_cquery | 0 .../cspell/empty_executable_bin.js | 0 .../dot_bin/empty_executable_cspell | 0 .../csslint/other-app/empty_testfile.css | 0 .../csslint/some-app/empty_dot_csslintrc | 0 .../some-app/subdir/empty_testfile.css | 0 .../cucumber/features/empty_cuke.feature | 0 .../step_definitions/empty_base_steps.rb | 0 .../ale/test/test-files/d/empty_test.d | 0 .../test/test-files/dart/empty_dot_packages | 0 .../test/test-files/dart/empty_testfile.dart | 0 .../test-files/dot_circleci/empty_config.yml | 0 .../plugged/ale/test/test-files/dot_gitignore | 2 + .../ale/test/test-files/dprint/empty_blank.ts | 0 .../test/test-files/dprint/empty_dprint.json | 0 .../test/test-files/elixir/empty_testfile.ex | 0 .../elixir/mix_project/lib/empty_app.ex | 0 .../test-files/elixir/mix_project/mix.exs | 3 + .../umbrella_project/apps/app1/empty_mix.exs | 0 .../apps/app1/lib/empty_app.ex | 0 .../umbrella_project/apps/app2/empty_mix.exs | 0 .../apps/app2/lib/empty_app.ex | 0 .../elixir/umbrella_project/empty_mix.exs | 0 .../elm/newapp-notests/empty_elm.json | 0 .../node_modules/dot_bin/empty_elm | 0 .../newapp-notests/tests/empty_TestMain.elm | 0 .../test/test-files/elm/newapp/empty_elm.json | 0 .../elm/newapp/node_modules/dot_bin/empty_elm | 0 .../node_modules/dot_bin/empty_elm-test | 0 .../test-files/elm/newapp/src/empty_Main.elm | 0 .../elm/newapp/tests/empty_TestSuite.elm | 0 .../elm/node_modules/dot_bin/empty_elm-format | 0 .../elm/oldapp/empty_elm-package.json | 0 .../elm/oldapp/node_modules/dot_bin/empty_elm | 0 .../node_modules/dot_bin/empty_elm-test | 0 .../test-files/elm/oldapp/src/empty_Main.elm | 0 .../elm/oldapp/tests/empty_TestSuite.elm | 0 .../elm/src/subdir/empty_testfile.elm | 0 .../_build/default/lib/dep/empty_rebar.lock | 0 .../_build/default/lib/dep/src/empty_dep.erl | 0 .../test-files/erlang/app/empty_rebar.lock | 0 .../test-files/erlang/app/src/empty_app.erl | 0 .../default/lib/dep/empty_erlang_ls.config | 0 .../_build/default/lib/dep/src/empty_dep.erl | 0 .../empty_erlang_ls.config | 0 .../src/empty_app.erl | 0 .../kerl_otp_root/empty_dot_kerl_config | 0 .../lib/stdlib-4.1.1/src/empty_array.erl | 0 .../test-files/eruby/empty_dummy.html.erb | 0 .../node_modules/dot_bin/empty_eslint_d | 0 .../test/test-files/eslint/empty_package.json | 0 .../eslint/node_modules/dot_bin/empty_eslint | 0 .../eslint/other-app/subdir/empty_testfile.js | 0 .../eslint/react-app/empty_dot_eslintrc.js | 0 .../node_modules/eslint/bin/empty_eslint.js | 0 .../node_modules/standard/bin/empty_cmd.js | 0 .../stylelint/bin/empty_stylelint.js | 0 .../react-app/node_modules/xo/empty_cli.js | 0 .../subdir-with-config/empty_dot_eslintrc | 0 .../empty_package.json | 0 .../node_modules/empty_dot_gitkeep | 0 .../react-app/subdir/empty_testfile.css | 0 .../eslint/react-app/subdir/empty_testfile.js | 0 .../eslint/react-app/subdir/empty_testfile.ts | 0 .../dot_yarn/sdks/eslint/bin/empty_eslint.js | 0 .../eslint/yarn2-app/subdir/empty_testfile.js | 0 .../test-files/fecs/empty_executable_fecs | 0 .../test-files/fecs/empty_executable_fecs.exe | 0 .../test/test-files/fish/empty_testfile.fish | 0 .../test-files/flow/a/empty_dot_flowconfig | 0 .../test/test-files/flow/a/sub/empty_dummy | 0 .../test/test-files/flow/b/sub/empty_dummy | 0 .../test/test-files/fortls-project/dot_fortls | 2 + .../ale/test/test-files/go/empty_testfile.go | 0 .../ale/test/test-files/go/empty_testfile2.go | 0 .../test/test-files/go/go1/prj1/empty_file.go | 0 .../test/test-files/go/go2/prj2/empty_file.go | 0 .../test/test-files/go/gopath/bin/empty_gopls | 0 .../go/gopath/bin/empty_staticcheck | 0 .../build-gradle-project/empty_build.gradle | 0 .../src/main/kotlin/empty_dummy.kt | 0 .../test-files/gradle/empty_executable_gradle | 0 .../src/main/kotlin/empty_dummy.kt | 0 .../empty_settings.gradle | 0 .../src/main/kotlin/empty_dummy.kt | 0 .../unwrapped-project/empty_build.gradle | 0 .../unwrapped-project/empty_settings.gradle | 0 .../src/main/kotlin/empty_dummy.kt | 0 .../gradle/wrapped-project/empty_build.gradle | 0 .../gradle/wrapped-project/empty_gradlew | 0 .../wrapped-project/empty_settings.gradle | 0 .../src/main/kotlin/empty_dummy.kt | 0 .../empty_dot_haml-lint.yml | 0 .../empty_dot_rubocop.yml | 0 .../subdir/empty_file.haml | 0 .../haml-lint-yml/empty_dot_haml-lint.yml | 0 .../haml-lint-yml/subdir/empty_file.haml | 0 .../rubocop-yml/empty_dot_rubocop.yml | 0 .../rubocop-yml/subdir/empty_file.haml | 0 .../test/test-files/hdl_server/empty_foo.vhd | 0 .../empty__hdl_checker.config | 0 .../empty_dot_hdl_checker.config | 0 .../hdl_server/with_config_file/empty_foo.vhd | 0 .../test/test-files/hie_paths/empty_file.hs | 0 .../empty_executable_html-beautify | 0 .../test-files/html_beautify/empty_test.html | 0 .../dot_bin/empty_executable_htmlhint | 0 .../htmlhint/with_config/empty_dot_htmlhintrc | 0 .../test/test-files/ink/story/empty_main.ink | 0 .../ale/test/test-files/inko/empty_test.inko | 0 .../inko/tests/test/empty_test_foo.inko | 0 .../src/test/java/com/something/empty_dummy | 0 .../src/main/java/com/something/empty_dummy | 0 .../src/main/jaxb/com/something/empty_dummy | 0 .../gen/main/java/com/something/empty_dummy | 0 .../gen2/main/java/com/something/empty_dummy | 0 .../src/main/java/com/something/empty_dummy | 0 .../src/test/java/com/something/empty_dummy | 0 .../test/test-files/javascript/empty_test.js | 0 .../javascript_deno/custom_import_map.json | 3 + .../javascript_deno/import_map.json | 3 + .../test/test-files/javascript_deno/main.js | 1 + .../test-files/javascript_deno/tsconfig.json | 16 + .../ale/test/test-files/json/testfile.json | 1 + .../app-without-jsonlint/src/empty_app.json | 0 .../app/node_modules/dot_bin/empty_jsonlint | 0 .../jsonlint/app/src/empty_app.json | 0 .../node_modules/jsonlint/lib/empty_cli.js | 0 .../ale/test/test-files/julia/empty_REQUIRE | 0 .../ale/test/test-files/julia/empty_test.jl | 0 .../test/test-files/kotlin/empty_testfile.kt | 0 .../dot_bin/empty_executable_lessc | 0 .../ale/test/test-files/long-line/setup.cfg | 2 + .../test/test-files/lua/empty_testfile.lua | 0 .../test-files/markdown/empty_testfile.md | 0 .../test-files/maven/empty_executable_mvn | 0 .../module1/empty_executable_mvnw | 0 .../module1/empty_executable_mvnw.cmd | 0 .../module1/src/main/java/empty_dummy1.java | 0 .../module2/src/main/java/empty_dummy2.java | 0 .../src/main/java/empty_dummy.java | 0 .../nim/with-git/src/empty_source.nim | 0 .../test/test-files/ocaml/empty_testfile.ml | 0 .../test-files/ocamllsp/empty_dune-project | 0 .../ale/test/test-files/ols/empty_dot_merlin | 0 .../dot_bin/empty_ocaml-language-server | 0 .../ale/test/test-files/pascal/empty_test.pas | 0 .../project-with-php-cs-fixer/empty_test.php | 0 .../vendor/bin/empty_php-cs-fixer | 0 .../project-with-phpcbf/foo/empty_test.php | 0 .../vendor/bin/empty_phpcbf | 0 .../php/project-with-pint/empty_test.php | 0 .../project-with-pint/vendor/bin/empty_pint | 0 .../empty_test.php | 0 .../project-without-phpcbf/foo/empty_test.php | 0 .../php/project-without-pint/empty_test.php | 0 .../empty_executable_php-language-server.php | 0 .../php/with-composer/empty_composer.json | 0 .../empty_executable_php-language-server.php | 0 .../empty_executable_php-language-server.php | 0 .../project-with-phpcs/foo/empty_test.php | 0 .../project-with-phpcs/vendor/bin/empty_phpcs | 0 .../project-without-phpcs/foo/empty_test.php | 0 .../test/test-files/prettier/empty_testfile | 0 .../test-files/prettier/empty_testfile.css | 0 .../test-files/prettier/empty_testfile.js | 0 .../test-files/prettier/empty_testfile.json | 0 .../test-files/prettier/empty_testfile.scss | 0 .../test-files/prettier/empty_testfile.ts | 0 .../prettier/with_config/empty_dot_prettierrc | 0 .../prettier/with_config/empty_testfile.js | 0 .../empty_dot_prettierignore | 0 .../with_prettierignore/src/empty_testfile.js | 0 .../test-files/proto/empty_testfile.proto | 0 .../psalm/vendor/bin/empty_executable_psalm | 0 .../test-files/puglint/empty_package.json | 0 .../node_modules/dot_bin/empty_pug-lint | 0 .../puglint_rc_dir/empty_dot_pug-lintrc | 0 .../puglint_rc_js_dir/empty_dot_pug-lintrc.js | 0 .../empty_dot_pug-lintrc.json | 0 .../ale/test/test-files/puppet/empty_dummy.pp | 0 .../new-style-module/empty_metadata.json | 0 .../lib/puppet/types/empty_exampletype.rb | 0 .../template/empty_template.epp | 0 .../old-style-module/manifests/empty_init.pp | 0 .../templates/empty_template.epp | 0 .../purescript/bower/empty_Foo.purs | 0 .../purescript/bower/empty_bower.json | 0 .../purescript/psc-package/empty_Foo.purs | 0 .../psc-package/empty_psc-package.json | 0 .../purescript/spago/empty_Foo.purs | 0 .../purescript/spago/empty_spago.dhall | 0 .../namespace_package_manifest/MANIFEST.in | 3 + .../namespace/foo/empty___init__.py | 0 .../namespace/foo/empty_bar.py | 0 .../namespace/foo/empty___init__.py | 0 .../namespace/foo/empty_bar.py | 0 .../namespace_package_pytest/pytest.ini | 2 + .../namespace/foo/empty___init__.py | 0 .../namespace/foo/empty_bar.py | 0 .../python/namespace_package_setup/setup.cfg | 2 + .../namespace/foo/empty___init__.py | 0 .../namespace/foo/empty_bar.py | 0 .../python/namespace_package_tox/tox.ini | 3 + .../subdir/foo/empty_COMMIT_EDITMSG | 0 .../subdir/foo/empty___init__.py | 0 .../no_virtualenv/subdir/foo/empty_bar.py | 0 .../python/pipenv/empty_Pipfile.lock | 0 .../python/poetry/empty_poetry.lock | 0 .../empty_dot_pyre_configuration.local | 0 .../foo/empty___init__.py | 0 .../pyre_configuration_dir/foo/empty_bar.py | 0 .../python-package-project/empty_dot_flake8 | 0 .../package-name/empty_module.py | 0 .../python/with_bandit/empty_dot_bandit | 0 .../namespace/foo/empty___init__.py | 0 .../with_bandit/namespace/foo/empty_bar.py | 0 .../empty_mypy.ini | 0 .../tests/empty_pytest.ini | 0 .../tests/testsubfolder/empty_my_tests.py | 0 .../dir_with_yapf_config/empty_dot_style.yapf | 0 .../env/Scripts/empty_activate | 0 .../Scripts/empty_executable_autoflake.exe | 0 .../Scripts/empty_executable_autoimport.exe | 0 .../env/Scripts/empty_executable_autopep8.exe | 0 .../env/Scripts/empty_executable_black.exe | 0 .../env/Scripts/empty_executable_flake8.exe | 0 .../Scripts/empty_executable_flakehell.exe | 0 .../env/Scripts/empty_executable_gitlint.exe | 0 .../env/Scripts/empty_executable_isort.exe | 0 .../env/Scripts/empty_executable_mypy.exe | 0 .../env/Scripts/empty_executable_pyflakes.exe | 0 .../env/Scripts/empty_executable_pylama.exe | 0 .../env/Scripts/empty_executable_pylint.exe | 0 .../env/Scripts/empty_executable_pylsp.exe | 0 .../env/Scripts/empty_executable_pyre.exe | 0 .../env/Scripts/empty_executable_refurb.exe | 0 ...mpty_executable_reorder-python-imports.exe | 0 .../env/Scripts/empty_executable_ruff.exe | 0 .../Scripts/empty_executable_tidy-imports.exe | 0 .../env/Scripts/empty_executable_unimport.exe | 0 .../env/Scripts/empty_executable_vulture.exe | 0 .../env/Scripts/empty_executable_yapf.exe | 0 .../env/Scripts/empty_yamlfix.exe | 0 .../with_virtualenv/env/bin/empty_activate | 0 .../env/bin/empty_executable_autoflake | 0 .../env/bin/empty_executable_autoimport | 0 .../env/bin/empty_executable_autopep8 | 0 .../env/bin/empty_executable_black | 0 .../env/bin/empty_executable_flake8 | 0 .../env/bin/empty_executable_flakehell | 0 .../env/bin/empty_executable_gitlint | 0 .../env/bin/empty_executable_isort | 0 .../env/bin/empty_executable_mypy | 0 .../env/bin/empty_executable_pyflakes | 0 .../env/bin/empty_executable_pylama | 0 .../env/bin/empty_executable_pylint | 0 .../env/bin/empty_executable_pylsp | 0 .../env/bin/empty_executable_pyre | 0 .../env/bin/empty_executable_refurb | 0 .../empty_executable_reorder-python-imports | 0 .../env/bin/empty_executable_ruff | 0 .../env/bin/empty_executable_tidy-imports | 0 .../env/bin/empty_executable_unimport | 0 .../env/bin/empty_executable_vulture | 0 .../env/bin/empty_executable_yamlfix | 0 .../env/bin/empty_executable_yapf | 0 .../subdir/foo/empty_COMMIT_EDITMSG | 0 .../subdir/foo/empty___init__.py | 0 .../with_virtualenv/subdir/foo/empty_bar.py | 0 .../with_virtualenv/subdir/foo/empty_bar.pyi | 0 .../ale/test/test-files/r/empty_dot_Rprofile | 0 .../racket/many-inits/a/b/c/foo.rkt | 3 + .../racket/many-inits/a/b/c/init.rkt | 1 + .../test-files/racket/many-inits/a/b/foo.rkt | 3 + .../test-files/racket/many-inits/a/b/init.rkt | 1 + .../test-files/racket/many-inits/a/foo.rkt | 3 + .../test-files/racket/many-inits/a/init.rkt | 1 + .../test/test-files/racket/many-inits/foo.rkt | 3 + .../test-files/racket/many-inits/init.rkt | 1 + .../test-files/racket/simple-script/foo.rkt | 3 + .../test-files/reasonml/empty_bsconfig.json | 0 .../test-files/reasonml/empty_testfile.re | 0 .../dot_bin/empty_executable_remark | 0 .../ale/test/test-files/ruby/empty_dummy.rb | 0 .../ruby/not_a_rails_app/empty_file.rb | 0 .../ruby/valid_rails_app/app/empty_dummy.rb | 0 .../valid_rails_app/app/models/empty_thing.rb | 0 .../app/views/empty_my_great_view.html.erb | 0 .../valid_rails_app/config/empty_dummy.rb | 0 .../ruby/valid_rails_app/db/empty_dummy.rb | 0 .../ruby/valid_ruby_app1/empty_Rakefile | 0 .../ruby/valid_ruby_app1/lib/empty_file.rb | 0 .../ruby/valid_ruby_app2/empty_Gemfile | 0 .../ruby/valid_ruby_app2/lib/empty_file.rb | 0 .../valid_ruby_app3/empty_dot_solargraph.yml | 0 .../ruby/valid_ruby_app3/lib/empty_file.rb | 0 .../ruby/with_config/empty_dot_rubocop.yml | 0 .../ruby/with_config/empty_dot_standard.yml | 0 .../test-files/rust/cargo/empty_Cargo.toml | 0 .../test-files/rust/cargo/empty_testfile.rs | 0 .../rust/rust-project/empty_rust-project.json | 0 .../rust/rust-project/empty_testfile.rs | 0 .../dot_bin/empty_executable_sass-lint | 0 .../bin/empty_executable_sass-lint.js | 0 .../test/test-files/scala/empty_dummy.scala | 0 .../invalid_sbt_project/empty_Main.scala | 0 .../scala/valid_sbt_project/empty_Main.scala | 0 .../scala/valid_sbt_project/empty_build.sbt | 0 .../test-files/slimlint/empty_dot_rubocop.yml | 0 .../slimlint/subdir/empty_file.slim | 0 .../test/test-files/smlnj/cm/empty_foo.sml | 0 .../test/test-files/smlnj/cm/empty_sources.cm | 0 .../test-files/smlnj/cm/path/to/empty_bar.sml | 0 .../test/test-files/smlnj/file/empty_qux.sml | 0 .../test-files/solhint/empty_Contract.sol | 0 .../test-files/solhint/empty_package.json | 0 .../node_modules/dot_bin/empty_solhint | 0 .../node_modules/solhint/empty_index.js | 0 .../test-files/spectral/empty_openapi.yaml | 0 .../node_modules/dot_bin/empty_spectral | 0 .../test/test-files/stack/empty_stack.yaml | 0 .../dot_bin/empty_executable_standard | 0 .../standard/bin/empty_executable_cmd.js | 0 .../dot_bin/empty_executable_stylelint | 0 .../swaglint/docs/empty_swagger.yaml | 0 .../node_modules/dot_bin/empty_swaglint | 0 .../test/test-files/swift/empty_dummy.swift | 0 .../src/folder/empty_dummy.swift | 0 .../dot_swift-format | 10 + .../empty_Package.swift | 0 .../src/folder/empty_dummy.swift | 0 .../swift-package-project/empty_Package.swift | 0 .../src/folder/empty_dummy.swift | 0 .../Pods/SwiftLint/empty_swiftlint | 0 .../ios/Pods/SwiftLint/empty_swiftlint | 0 .../cocoapods/Pods/SwiftLint/empty_swiftlint | 0 .../ios/Pods/SwiftLint/empty_swiftlint | 0 .../terraform/dot_terraform/empty_dummy | 0 .../test/test-files/terraform/empty_main.tf | 0 .../ale/test/test-files/tex/empty_sample1.tex | 0 .../ale/test/test-files/tex/empty_sample2.tex | 0 .../test/test-files/tex/empty_testfile.tex | 0 .../dot_bin/empty_executable_textlint | 0 .../textlint/bin/empty_executable_textlint.js | 0 .../test/test-files/tflint/foo/empty_bar.tf | 0 .../tflint/foo/empty_dot_tflint.hcl | 0 .../tfsec/json/dot_tfsec/empty_config.json | 0 .../test/test-files/tfsec/json/empty_main.tf | 0 .../tfsec/yml/dot_tfsec/empty_config.yml | 0 .../test/test-files/tfsec/yml/empty_main.tf | 0 .../ale/test/test-files/tidy/empty_dot_tidyrc | 0 .../test-files/tidy/empty_executable_tidy | 0 .../test-files/tidy/empty_executable_tidy.exe | 0 .../ale/test/test-files/tidy/empty_test.html | 0 .../empty_empty-file | 0 .../ale/test/test-files/top/empty_example.ini | 0 .../top/middle/bottom/empty_dummy.txt | 0 .../test-files/tsserver/empty_tsconfig.json | 0 .../test-files/tsserver/src/empty_file1.ts | 0 .../tsserver/src/level-1/empty_file2.ts | 0 .../tsserver/src/level-1/empty_tsconfig.json | 0 .../src/level-1/level-2/empty_file3.ts | 0 .../typescript/empty_custom_import_map.json | 0 .../typescript/empty_import_map.json | 0 .../test/test-files/typescript/empty_test.ts | 0 .../test-files/typescript/empty_tsconfig.json | 0 .../vim/invalid_vim_project/empty_test.vim | 0 .../dot_bin/empty_vim-language-server | 0 .../autoload/empty_test.vim | 0 .../vim/path_with_autoload/empty_test.vim | 0 .../vim/path_with_initvim/empty_init.vim | 0 .../vim/path_with_plugin/empty_test.vim | 0 .../path_with_plugin/plugin/empty_test.vim | 0 .../vim/path_with_vimrc/empty_dot_vimrc | 0 .../test/test-files/volar/empty_package.json | 0 .../empty_executable_vue-language-server | 0 .../typescript/lib/empty_tsserverlibrary.js | 0 .../test/test-files/volar/src/empty_App.vue | 0 .../write-good/bin/empty_write-good.js | 0 .../node_modules/dot_bin/empty_write-good | 0 .../test-files/xo/monorepo/empty_package.json | 0 .../xo/monorepo/node_modules/xo/empty_cli.js | 0 .../xo/monorepo/packages/a/empty_index.js | 0 .../xo/monorepo/packages/a/empty_index.ts | 0 .../xo/monorepo/packages/a/empty_package.json | 0 .../ale/test/test-files/yaml/empty_test.yaml | 0 .../ale/test/test-files/zig/empty_build.zig | 0 dot_vim/plugged/ale/test/test_ale_has.vader | 14 + dot_vim/plugged/ale/test/test_ale_info.vader | 777 + .../ale/test/test_ale_info_to_clipboard.vader | 15 + .../ale/test/test_ale_lint_command.vader | 77 + .../ale/test/test_ale_lint_stop_command.vader | 27 + .../ale/test/test_ale_populate_command.vader | 96 + .../plugged/ale/test/test_ale_toggle.vader | 444 + dot_vim/plugged/ale/test/test_ale_var.vader | 24 + .../ale/test/test_alejobstarted_autocmd.vader | 46 + .../ale/test/test_alelint_autocmd.vader | 40 + .../test_ant_build_classpath_command.vader | 27 + .../ale/test/test_ant_find_project_root.vader | 35 + .../ale/test/test_autocmd_commands.vader | 238 + .../test/test_backwards_compatibility.vader | 19 + .../ale/test/test_balloon_messages.vader | 87 + .../ale/test/test_c_flag_parsing.vader | 689 + .../test/test_checkingbuffer_autocmd.vader | 57 + dot_vim/plugged/ale/test/test_cleanup.vader | 14 + .../plugged/ale/test/test_code_action.vader | 605 + .../test/test_code_action_corner_cases.vader | 141 + .../ale/test/test_code_action_python.vader | 59 + dot_vim/plugged/ale/test/test_codefix.vader | 549 + .../test/test_computed_lint_file_values.vader | 150 + .../test/test_csslint_config_detection.vader | 29 + .../ale/test/test_cursor_warnings.vader | 276 + .../test/test_deferred_command_string.vader | 50 + .../test_deferred_executable_string.vader | 46 + .../test/test_deno_executable_detection.vader | 20 + .../plugged/ale/test/test_disabling_ale.vader | 119 + .../test_dockerfile_hadolint_linter.vader | 106 + .../plugged/ale/test/test_env_function.vader | 8 + ...rrors_removed_after_filetype_changed.vader | 78 + .../ale/test/test_filename_mapping.vader | 62 + .../plugged/ale/test/test_filerename.vader | 224 + .../test/test_filetype_linter_defaults.vader | 137 + .../ale/test/test_filetype_mapping.vader | 29 + .../test/test_find_nearest_directory.vader | 17 + .../ale/test/test_find_references.vader | 480 + .../ale/test/test_floating_preview.vader | 92 + .../ale/test/test_format_command.vader | 186 + .../test_format_temporary_file_creation.vader | 63 + .../ale/test/test_function_arg_count.vader | 45 + .../ale/test/test_fuzzy_json_decode.vader | 29 + .../plugged/ale/test/test_get_abspath.vader | 29 + .../plugged/ale/test/test_get_loclist.vader | 31 + .../plugged/ale/test/test_getmatches.vader | 163 + .../ale/test/test_go_to_definition.vader | 689 + .../test_gradle_build_classpath_command.vader | 52 + .../test/test_gradle_find_executable.vader | 37 + .../test/test_gradle_find_project_root.vader | 35 + dot_vim/plugged/ale/test/test_helptags.vader | 2 + .../ale/test/test_highlight_placement.vader | 465 + .../test_highlight_position_chunking.vader | 76 + .../ale/test/test_history_saving.vader | 177 + dot_vim/plugged/ale/test/test_hover.vader | 272 + .../plugged/ale/test/test_hover_parsing.vader | 173 + .../ale/test/test_ignoring_linters.vader | 403 + dot_vim/plugged/ale/test/test_jq_linter.vader | 18 + .../test_jsonlint_executable_detection.vader | 45 + dot_vim/plugged/ale/test/test_line_join.vader | 84 + .../ale/test/test_lint_file_linters.vader | 317 + ...test_lint_on_enter_when_file_changed.vader | 84 + .../test/test_lint_on_filetype_changed.vader | 77 + .../test_linter_defintion_processing.vader | 501 + .../ale/test/test_linter_retrieval.vader | 190 + .../ale/test/test_linter_type_mapping.vader | 120 + .../ale/test/test_linting_blacklist.vader | 16 + .../test/test_linting_updates_loclist.vader | 96 + .../ale/test/test_list_formatting.vader | 188 + .../plugged/ale/test/test_list_opening.vader | 290 + .../plugged/ale/test/test_list_titles.vader | 77 + .../ale/test/test_load_all_linters.vader | 6 + .../ale/test/test_loclist_binary_search.vader | 66 + .../ale/test/test_loclist_corrections.vader | 469 + .../ale/test/test_loclist_jumping.vader | 121 + .../ale/test/test_loclist_sorting.vader | 43 + .../test_maven_build_classpath_command.vader | 53 + .../ale/test/test_maven_find_executable.vader | 46 + .../test/test_maven_find_project_root.vader | 28 + .../ale/test/test_nearest_file_search.vader | 15 + .../ale/test/test_nimlsp_project_root.vader | 19 + .../test/test_no_linting_on_write_quit.vader | 118 + .../ale/test/test_organize_imports.vader | 172 + .../plugged/ale/test/test_other_sources.vader | 153 + .../ale/test/test_parse_command_args.vader | 52 + .../plugged/ale/test/test_path_dirname.vader | 13 + .../plugged/ale/test/test_path_equality.vader | 82 + .../plugged/ale/test/test_path_upwards.vader | 48 + dot_vim/plugged/ale/test/test_path_uri.vader | 73 + .../ale/test/test_pattern_options.vader | 107 + .../ale/test/test_prepare_command.vader | 96 + .../ale/test/test_puppet_path_detection.vader | 22 + .../test/test_python_find_project_root.vader | 11 + .../plugged/ale/test/test_python_pipenv.vader | 19 + .../plugged/ale/test/test_python_poetry.vader | 19 + .../ale/test/test_python_traceback.vader | 79 + .../ale/test/test_python_virtualenv.vader | 12 + .../test/test_quickfix_deduplication.vader | 50 + .../ale/test/test_quitting_variable.vader | 39 + ...redundant_tsserver_rendering_avoided.vader | 178 + .../ale/test/test_regex_escaping.vader | 4 + dot_vim/plugged/ale/test/test_rename.vader | 504 + .../ale/test/test_resolve_local_path.vader | 17 + ...lts_not_cleared_when_opening_loclist.vader | 30 + .../ale/test/test_sandbox_execution.vader | 103 + .../plugged/ale/test/test_semver_utils.vader | 43 + .../ale/test/test_set_list_timers.vader | 29 + ..._setting_loclist_from_another_buffer.vader | 26 + ...g_problems_found_in_previous_buffers.vader | 98 + .../ale/test/test_shell_detection.vader | 177 + .../test_should_do_nothing_conditions.vader | 88 + .../plugged/ale/test/test_sml_command.vader | 45 + .../ale/test/test_socket_connections.vader | 139 + .../plugged/ale/test/test_statusline.vader | 157 + .../test/test_swift_find_project_root.vader | 18 + .../plugged/ale/test/test_symbol_search.vader | 189 + .../test/test_temporary_file_management.vader | 146 + .../ale/test/test_tmpdir_wrapper.vader | 32 + .../test/test_vim8_processid_parsing.vader | 5 + .../plugged/ale/test/test_virtualtext.vader | 179 + .../ale/test/test_windows_escaping.vader | 42 + .../plugged/ale/test/test_wrap_comand.vader | 48 + .../ale/test/test_writefile_function.vader | 117 + .../test/util/test_cd_string_commands.vader | 20 + .../plugged/ale/test/v_files/empty_testfile.v | 0 dot_vim/plugged/ale/test/vimrc | 42 + dot_vim/plugged/asyncomplete-lsp.vim/LICENSE | 21 + .../plugged/asyncomplete-lsp.vim/README.md | 12 + .../plugged/asyncomplete-lsp.vim/dot_git/HEAD | 1 + .../dot_git/branches/.keep | 0 .../asyncomplete-lsp.vim/dot_git/config | 11 + .../asyncomplete-lsp.vim/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../dot_git/hooks/update.sample | 128 + .../asyncomplete-lsp.vim/dot_git/index | Bin 0 -> 496 bytes .../asyncomplete-lsp.vim/dot_git/info/exclude | 6 + .../asyncomplete-lsp.vim/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...3cfc833a012d1d35bf0ac2a56aff3e0682dc7b.idx | Bin 0 -> 1436 bytes ...cfc833a012d1d35bf0ac2a56aff3e0682dc7b.pack | Bin 0 -> 4158 bytes .../asyncomplete-lsp.vim/dot_git/packed-refs | 3 + .../dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../dot_git/refs/tags/.keep | 0 .../asyncomplete-lsp.vim/dot_git/shallow | 2 + .../asyncomplete-lsp.vim/dot_gitattributes | 1 + .../asyncomplete-lsp.vim/dot_gitignore | 1 + .../plugin/asyncomplete-lsp.vim | 103 + dot_vim/plugged/asyncomplete.vim/LICENSE | 21 + dot_vim/plugged/asyncomplete.vim/README.md | 245 + .../autoload/asyncomplete.vim | 540 + .../autoload/asyncomplete/utils.vim | 21 + .../utils/_on_change/textchangedp.vim | 81 + .../asyncomplete/utils/_on_change/timer.vim | 83 + .../asyncomplete.vim/doc/asyncomplete.txt | 191 + dot_vim/plugged/asyncomplete.vim/doc/tags | 21 + dot_vim/plugged/asyncomplete.vim/dot_git/HEAD | 1 + .../asyncomplete.vim/dot_git/branches/.keep | 0 .../plugged/asyncomplete.vim/dot_git/config | 11 + .../asyncomplete.vim/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../dot_git/hooks/update.sample | 128 + .../plugged/asyncomplete.vim/dot_git/index | Bin 0 -> 2259 bytes .../asyncomplete.vim/dot_git/info/exclude | 6 + .../asyncomplete.vim/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...fe57e622e915afe452c54d88ca8df3422de069.idx | Bin 0 -> 4404 bytes ...e57e622e915afe452c54d88ca8df3422de069.pack | Bin 0 -> 42161 bytes .../asyncomplete.vim/dot_git/packed-refs | 10 + .../dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../asyncomplete.vim/dot_git/refs/tags/.keep | 0 .../plugged/asyncomplete.vim/dot_git/shallow | 8 + .../asyncomplete.vim/dot_gitattributes | 1 + .../asyncomplete.vim/dot_github/FUNDING.yml | 12 + .../asyncomplete.vim/dot_github/stale.yml | 17 + .../dot_github/workflows/linux_neovim.yml | 44 + .../dot_github/workflows/linux_vim.yml | 46 + .../dot_github/workflows/mac_neovim.yml | 44 + .../dot_github/workflows/reviewdog.yml | 22 + .../dot_github/workflows/windows_neovim.yml | 46 + .../dot_github/workflows/windows_vim.yml | 52 + .../plugged/asyncomplete.vim/dot_gitignore | 1 + .../plugged/asyncomplete.vim/dot_vintrc.yaml | 10 + .../asyncomplete.vim/plugin/asyncomplete.vim | 25 + .../test/asyncomplete.vimspec | 2 + .../asyncomplete.vim/test/dot_themisrc | 3 + dot_vim/plugged/ctrlp.vim/LICENSE | 30 + dot_vim/plugged/ctrlp.vim/autoload/ctrlp.vim | 2900 ++ .../ctrlp.vim/autoload/ctrlp/autoignore.vim | 173 + .../ctrlp.vim/autoload/ctrlp/bookmarkdir.vim | 147 + .../ctrlp.vim/autoload/ctrlp/buffertag.vim | 281 + .../ctrlp.vim/autoload/ctrlp/changes.vim | 98 + .../plugged/ctrlp.vim/autoload/ctrlp/dir.vim | 95 + .../plugged/ctrlp.vim/autoload/ctrlp/line.vim | 81 + .../ctrlp.vim/autoload/ctrlp/mixed.vim | 88 + .../ctrlp.vim/autoload/ctrlp/mrufiles.vim | 158 + .../ctrlp.vim/autoload/ctrlp/quickfix.vim | 59 + .../ctrlp.vim/autoload/ctrlp/rtscript.vim | 59 + .../plugged/ctrlp.vim/autoload/ctrlp/tag.vim | 146 + .../plugged/ctrlp.vim/autoload/ctrlp/undo.vim | 154 + .../ctrlp.vim/autoload/ctrlp/utils.vim | 119 + dot_vim/plugged/ctrlp.vim/doc/ctrlp.cnx | 1605 + dot_vim/plugged/ctrlp.vim/doc/ctrlp.txt | 1687 + dot_vim/plugged/ctrlp.vim/doc/tags | 112 + dot_vim/plugged/ctrlp.vim/doc/tags-cn | 111 + dot_vim/plugged/ctrlp.vim/dot_git/HEAD | 1 + .../plugged/ctrlp.vim/dot_git/branches/.keep | 0 dot_vim/plugged/ctrlp.vim/dot_git/config | 11 + dot_vim/plugged/ctrlp.vim/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../ctrlp.vim/dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../ctrlp.vim/dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../ctrlp.vim/dot_git/hooks/pre-push.sample | 53 + .../ctrlp.vim/dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../ctrlp.vim/dot_git/hooks/update.sample | 128 + dot_vim/plugged/ctrlp.vim/dot_git/index | Bin 0 -> 2062 bytes .../plugged/ctrlp.vim/dot_git/info/exclude | 6 + dot_vim/plugged/ctrlp.vim/dot_git/logs/HEAD | 2 + .../ctrlp.vim/dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../ctrlp.vim/dot_git/objects/info/.keep | 0 ...42198332ff2cae5890b7ccbe5f6cf7fbe7e20a.idx | Bin 0 -> 13896 bytes ...2198332ff2cae5890b7ccbe5f6cf7fbe7e20a.pack | Bin 0 -> 419970 bytes dot_vim/plugged/ctrlp.vim/dot_git/packed-refs | 42 + .../ctrlp.vim/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../plugged/ctrlp.vim/dot_git/refs/tags/.keep | 0 dot_vim/plugged/ctrlp.vim/dot_git/shallow | 41 + .../plugged/ctrlp.vim/dot_github/FUNDING.yml | 13 + dot_vim/plugged/ctrlp.vim/dot_gitignore | 7 + dot_vim/plugged/ctrlp.vim/plugin/ctrlp.vim | 72 + dot_vim/plugged/ctrlp.vim/readme.md | 117 + dot_vim/plugged/friendly-snippets/LICENSE | 21 + dot_vim/plugged/friendly-snippets/README.md | 95 + .../plugged/friendly-snippets/dot_git/HEAD | 1 + .../friendly-snippets/dot_git/branches/.keep | 0 .../plugged/friendly-snippets/dot_git/config | 11 + .../friendly-snippets/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../dot_git/hooks/update.sample | 128 + .../plugged/friendly-snippets/dot_git/index | Bin 0 -> 9737 bytes .../friendly-snippets/dot_git/info/exclude | 6 + .../friendly-snippets/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/main | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...56bc11a05362366c282fbf7169e627b7bc1b9f.idx | Bin 0 -> 4376 bytes ...6bc11a05362366c282fbf7169e627b7bc1b9f.pack | Bin 0 -> 193938 bytes .../friendly-snippets/dot_git/packed-refs | 3 + .../friendly-snippets/dot_git/refs/heads/main | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../friendly-snippets/dot_git/refs/tags/.keep | 0 .../plugged/friendly-snippets/dot_git/shallow | 2 + .../plugged/friendly-snippets/package.json | 458 + .../plugged/friendly-snippets/snippets/c.json | 547 + .../snippets/cobol/vscode_cobol-compound.json | 26 + .../snippets/cobol/vscode_cobol.json | 2407 ++ .../snippets/cobol/vscode_cobol_dir.json | 49 + .../snippets/cobol/vscode_cobol_jcl.json | 73 + .../friendly-snippets/snippets/cpp.json | 254 + .../friendly-snippets/snippets/csharp.json | 401 + .../friendly-snippets/snippets/css.json | 651 + .../friendly-snippets/snippets/dart.json | 84 + .../snippets/docker/docker-compose.json | 332 + .../snippets/docker/docker_file.json | 74 + .../friendly-snippets/snippets/eelixir.json | 44 + .../friendly-snippets/snippets/elixir.json | 220 + .../friendly-snippets/snippets/erb.json | 86 + .../friendly-snippets/snippets/erlang.json | 55 + .../friendly-snippets/snippets/fennel.json | 52 + .../friendly-snippets/snippets/fortran.json | 520 + .../snippets/frameworks/django/admin.json | 108 + .../django/django_rest/serializers.json | 201 + .../frameworks/django/django_rest/views.json | 153 + .../snippets/frameworks/django/forms.json | 287 + .../snippets/frameworks/django/models.json | 377 + .../snippets/frameworks/django/tags.json | 69 + .../snippets/frameworks/django/urls.json | 94 + .../snippets/frameworks/django/views.json | 85 + .../snippets/frameworks/djangohtml.json | 335 + .../snippets/frameworks/edge.json | 322 + .../snippets/frameworks/ejs.json | 87 + .../snippets/frameworks/flutter.json | 498 + .../snippets/frameworks/jekyll.json | 526 + .../snippets/frameworks/rails.json | 301 + .../snippets/frameworks/relm4/components.json | 192 + .../snippets/frameworks/relm4/factories.json | 157 + .../snippets/frameworks/relm4/templates.json | 18 + .../snippets/frameworks/relm4/workers.json | 28 + .../snippets/frameworks/twig.json | 536 + .../snippets/frameworks/unreal.json | 434 + .../snippets/frameworks/vue/html.json | 422 + .../snippets/frameworks/vue/javascript.json | 1384 + .../snippets/frameworks/vue/pug.json | 352 + .../snippets/frameworks/vue/vue.json | 312 + .../friendly-snippets/snippets/fsh.json | 126 + .../friendly-snippets/snippets/gdscript.json | 200 + .../friendly-snippets/snippets/gitcommit.json | 96 + .../friendly-snippets/snippets/global.json | 404 + .../friendly-snippets/snippets/glsl.json | 651 + .../friendly-snippets/snippets/go.json | 286 + .../friendly-snippets/snippets/haskell.json | 160 + .../friendly-snippets/snippets/html.json | 693 + .../friendly-snippets/snippets/java.json | 161 + .../snippets/java/java-tests.json | 208 + .../snippets/javascript/javascript.json | 933 + .../snippets/javascript/jsdoc.json | 83 + .../snippets/javascript/next-ts.json | 95 + .../snippets/javascript/next.json | 125 + .../snippets/javascript/react-es7.json | 1557 + .../snippets/javascript/react-native-ts.json | 445 + .../snippets/javascript/react-native.json | 476 + .../snippets/javascript/react-ts.json | 385 + .../snippets/javascript/react.json | 394 + .../snippets/javascript/typescript.json | 291 + .../friendly-snippets/snippets/julia.json | 278 + .../friendly-snippets/snippets/kotlin.json | 107 + .../snippets/kubernetes.json | 464 + .../friendly-snippets/snippets/latex.json | 558 + .../snippets/latex/latex-snippets.json | 481 + .../snippets/latex/vscode-latex-snippets.json | 367 + .../friendly-snippets/snippets/liquid.json | 960 + .../friendly-snippets/snippets/lua.json | 145 + .../friendly-snippets/snippets/make.json | 45 + .../friendly-snippets/snippets/markdown.json | 380 + .../friendly-snippets/snippets/mint.json | 241 + .../friendly-snippets/snippets/norg.json | 79 + .../friendly-snippets/snippets/objc.json | 411 + .../friendly-snippets/snippets/org.json | 217 + .../friendly-snippets/snippets/php.json | 230 + .../friendly-snippets/snippets/plantuml.json | 209 + .../snippets/python/base.json | 173 + .../snippets/python/comprehension.json | 47 + .../snippets/python/debug.json | 34 + .../snippets/python/python.json | 122 + .../snippets/python/unittest.json | 54 + .../friendly-snippets/snippets/quarto.json | 128 + .../plugged/friendly-snippets/snippets/r.json | 169 + .../friendly-snippets/snippets/rescript.json | 217 + .../friendly-snippets/snippets/rmarkdown.json | 40 + .../friendly-snippets/snippets/ruby.json | 440 + .../friendly-snippets/snippets/rust.json | 413 + .../friendly-snippets/snippets/scala.json | 97 + .../friendly-snippets/snippets/shell.json | 93 + .../friendly-snippets/snippets/solidity.json | 210 + .../friendly-snippets/snippets/sql.json | 226 + .../friendly-snippets/snippets/svelte.json | 616 + .../friendly-snippets/snippets/swift.json | 175 + .../snippets/systemverilog.json | 1434 + .../friendly-snippets/snippets/verilog.json | 114 + .../friendly-snippets/snippets/vhdl.json | 249 + dot_vim/plugged/gruvbox/CHANGELOG.md | 117 + dot_vim/plugged/gruvbox/README.md | 113 + .../autoload/airline/themes/gruvbox.vim | 79 + dot_vim/plugged/gruvbox/autoload/gruvbox.vim | 41 + .../lightline/colorscheme/gruvbox.vim | 57 + dot_vim/plugged/gruvbox/colors/gruvbox.vim | 1418 + dot_vim/plugged/gruvbox/dot_git/HEAD | 1 + .../plugged/gruvbox/dot_git/branches/.keep | 0 dot_vim/plugged/gruvbox/dot_git/config | 11 + dot_vim/plugged/gruvbox/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../gruvbox/dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../gruvbox/dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../gruvbox/dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../gruvbox/dot_git/hooks/pre-push.sample | 53 + .../gruvbox/dot_git/hooks/pre-rebase.sample | 169 + .../gruvbox/dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../gruvbox/dot_git/hooks/update.sample | 128 + dot_vim/plugged/gruvbox/dot_git/index | Bin 0 -> 1062 bytes dot_vim/plugged/gruvbox/dot_git/info/exclude | 6 + dot_vim/plugged/gruvbox/dot_git/logs/HEAD | 2 + .../gruvbox/dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../gruvbox/dot_git/objects/info/.keep | 0 ...07c924f99cd2caf1ccb4fd9380b1168f83f690.idx | Bin 0 -> 2864 bytes ...7c924f99cd2caf1ccb4fd9380b1168f83f690.pack | Bin 0 -> 64163 bytes dot_vim/plugged/gruvbox/dot_git/packed-refs | 10 + .../plugged/gruvbox/dot_git/refs/heads/master | 1 + .../gruvbox/dot_git/refs/remotes/origin/HEAD | 1 + .../plugged/gruvbox/dot_git/refs/tags/.keep | 0 dot_vim/plugged/gruvbox/dot_git/shallow | 7 + .../gruvbox/executable_gruvbox_256palette.sh | 118 + .../executable_gruvbox_256palette_osx.sh | 116 + dot_vim/plugged/gruvbox/package.json | 10 + dot_vim/plugged/pony-vim-syntax/LICENSE | 25 + dot_vim/plugged/pony-vim-syntax/README.md | 3 + .../autoload/neomake/makers/ft/pony.vim | 14 + dot_vim/plugged/pony-vim-syntax/dot_git/HEAD | 1 + .../pony-vim-syntax/dot_git/branches/.keep | 0 .../plugged/pony-vim-syntax/dot_git/config | 11 + .../pony-vim-syntax/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../dot_git/hooks/update.sample | 128 + dot_vim/plugged/pony-vim-syntax/dot_git/index | Bin 0 -> 825 bytes .../pony-vim-syntax/dot_git/info/exclude | 6 + .../plugged/pony-vim-syntax/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...9bbc7fd9e747e73f37a198f8e2c83e2e7934f9.idx | Bin 0 -> 1520 bytes ...bbc7fd9e747e73f37a198f8e2c83e2e7934f9.pack | Bin 0 -> 4706 bytes .../pony-vim-syntax/dot_git/packed-refs | 2 + .../pony-vim-syntax/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../pony-vim-syntax/dot_git/refs/tags/.keep | 0 .../plugged/pony-vim-syntax/dot_git/shallow | 1 + .../plugged/pony-vim-syntax/ftdetect/pony.vim | 1 + .../plugged/pony-vim-syntax/syntax/pony.vim | 180 + .../syntax_checkers/pony/ponyc.vim | 43 + .../autoload/rainbow_parentheses.vim | 98 + .../rainbow_parentheses.vim/dot_git/HEAD | 1 + .../dot_git/branches/.keep | 0 .../rainbow_parentheses.vim/dot_git/config | 11 + .../dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../dot_git/hooks/update.sample | 128 + .../rainbow_parentheses.vim/dot_git/index | Bin 0 -> 393 bytes .../dot_git/info/exclude | 6 + .../rainbow_parentheses.vim/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...67058172ee12147ab6b2c064135484c529c208.idx | Bin 0 -> 1268 bytes ...7058172ee12147ab6b2c064135484c529c208.pack | Bin 0 -> 2131 bytes .../dot_git/packed-refs | 2 + .../dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../dot_git/refs/tags/.keep | 0 .../rainbow_parentheses.vim/dot_git/shallow | 1 + .../plugin/rainbow_parentheses.vim | 13 + .../plugged/rainbow_parentheses.vim/readme.md | 51 + dot_vim/plugged/rust.vim/ISSUE_TEMPLATE.md | 28 + dot_vim/plugged/rust.vim/LICENSE-APACHE | 201 + dot_vim/plugged/rust.vim/LICENSE-MIT | 25 + dot_vim/plugged/rust.vim/README.md | 135 + .../plugged/rust.vim/after/syntax/rust.vim | 41 + dot_vim/plugged/rust.vim/autoload/cargo.vim | 147 + .../rust.vim/autoload/cargo/quickfix.vim | 27 + dot_vim/plugged/rust.vim/autoload/rust.vim | 570 + .../rust.vim/autoload/rust/debugging.vim | 103 + .../rust.vim/autoload/rust/delimitmate.vim | 44 + .../plugged/rust.vim/autoload/rust/tags.vim | 18 + dot_vim/plugged/rust.vim/autoload/rustfmt.vim | 260 + dot_vim/plugged/rust.vim/compiler/cargo.vim | 51 + dot_vim/plugged/rust.vim/compiler/rustc.vim | 57 + dot_vim/plugged/rust.vim/ctags/rust.ctags | 11 + dot_vim/plugged/rust.vim/doc/rust.txt | 486 + dot_vim/plugged/rust.vim/doc/tags | 66 + dot_vim/plugged/rust.vim/dot_git/HEAD | 1 + .../plugged/rust.vim/dot_git/branches/.keep | 0 dot_vim/plugged/rust.vim/dot_git/config | 11 + dot_vim/plugged/rust.vim/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../rust.vim/dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../rust.vim/dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../rust.vim/dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../rust.vim/dot_git/hooks/pre-push.sample | 53 + .../rust.vim/dot_git/hooks/pre-rebase.sample | 169 + .../rust.vim/dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../rust.vim/dot_git/hooks/update.sample | 128 + dot_vim/plugged/rust.vim/dot_git/index | Bin 0 -> 3687 bytes dot_vim/plugged/rust.vim/dot_git/info/exclude | 6 + dot_vim/plugged/rust.vim/dot_git/logs/HEAD | 2 + .../rust.vim/dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../rust.vim/dot_git/objects/info/.keep | 0 ...9f6fb8d950cde3b5af4822c7163c815fc203aa.idx | Bin 0 -> 3732 bytes ...f6fb8d950cde3b5af4822c7163c815fc203aa.pack | Bin 0 -> 55561 bytes dot_vim/plugged/rust.vim/dot_git/packed-refs | 3 + .../rust.vim/dot_git/refs/heads/master | 1 + .../rust.vim/dot_git/refs/remotes/origin/HEAD | 1 + .../plugged/rust.vim/dot_git/refs/tags/.keep | 0 dot_vim/plugged/rust.vim/dot_git/shallow | 2 + .../rust.vim/dot_github/workflows/ci.yml | 9 + dot_vim/plugged/rust.vim/dot_gitignore | 1 + dot_vim/plugged/rust.vim/dot_vintrc.yml | 10 + dot_vim/plugged/rust.vim/ftdetect/rust.vim | 15 + dot_vim/plugged/rust.vim/ftplugin/rust.vim | 200 + .../plugged/rust.vim/ftplugin/rust/tagbar.vim | 40 + dot_vim/plugged/rust.vim/indent/rust.vim | 286 + dot_vim/plugged/rust.vim/plugin/cargo.vim | 27 + dot_vim/plugged/rust.vim/plugin/rust.vim | 28 + dot_vim/plugged/rust.vim/syntax/rust.vim | 387 + .../rust.vim/syntax_checkers/rust/cargo.vim | 93 + .../rust.vim/syntax_checkers/rust/rustc.vim | 54 + dot_vim/plugged/rust.vim/test/Dockerfile | 34 + dot_vim/plugged/rust.vim/test/coverage.vader | 24 + .../plugged/rust.vim/test/empty_dot_gitignore | 0 dot_vim/plugged/rust.vim/test/empty_sample.rs | 0 .../rust.vim/test/executable_run-tests | 105 + dot_vim/plugged/rust.vim/test/indent.vader | 292 + dot_vim/plugged/rust.vim/test/vimrc | 30 + dot_vim/plugged/rust.vim/triagebot.toml | 1 + .../plugged/semantic-highlight.vim/README.md | 105 + .../autoload/blacklist.vim | 641 + .../autoload/containedinlist.vim | 11 + .../doc/semantic-highlight.txt | 87 + .../plugged/semantic-highlight.vim/doc/tags | 12 + .../semantic-highlight.vim/dot_git/HEAD | 1 + .../dot_git/branches/.keep | 0 .../semantic-highlight.vim/dot_git/config | 11 + .../dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../dot_git/hooks/update.sample | 128 + .../semantic-highlight.vim/dot_git/index | Bin 0 -> 677 bytes .../dot_git/info/exclude | 6 + .../semantic-highlight.vim/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...c371a82cbf80d59118029f75eadf7d8f4024bd.idx | Bin 0 -> 1744 bytes ...371a82cbf80d59118029f75eadf7d8f4024bd.pack | Bin 0 -> 190474 bytes .../dot_git/packed-refs | 5 + .../dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../dot_git/refs/tags/.keep | 0 .../semantic-highlight.vim/dot_git/shallow | 4 + .../semantic-highlight.vim/plugin/semhl.vim | 185 + .../semantic-highlight.png | Bin 0 -> 192866 bytes dot_vim/plugged/vim-airline-themes/LICENSE | 21 + dot_vim/plugged/vim-airline-themes/README.md | 62 + .../autoload/airline/themes/alduin.vim | 97 + .../autoload/airline/themes/angr.vim | 109 + .../autoload/airline/themes/apprentice.vim | 84 + .../autoload/airline/themes/atomic.vim | 77 + .../autoload/airline/themes/ayu_dark.vim | 34 + .../autoload/airline/themes/ayu_light.vim | 34 + .../autoload/airline/themes/ayu_mirage.vim | 34 + .../autoload/airline/themes/badwolf.vim | 56 + .../autoload/airline/themes/base16.vim | 181 + .../autoload/airline/themes/base16_3024.vim | 73 + .../airline/themes/base16_adwaita.vim | 73 + .../autoload/airline/themes/base16_apathy.vim | 73 + .../autoload/airline/themes/base16_ashes.vim | 73 + .../airline/themes/base16_atelier_cave.vim | 85 + .../themes/base16_atelier_cave_light.vim | 85 + .../airline/themes/base16_atelier_dune.vim | 85 + .../themes/base16_atelier_dune_light.vim | 85 + .../airline/themes/base16_atelier_estuary.vim | 85 + .../themes/base16_atelier_estuary_light.vim | 85 + .../airline/themes/base16_atelier_forest.vim | 85 + .../themes/base16_atelier_forest_light.vim | 85 + .../airline/themes/base16_atelier_heath.vim | 85 + .../themes/base16_atelier_heath_light.vim | 85 + .../themes/base16_atelier_lakeside.vim | 85 + .../themes/base16_atelier_lakeside_light.vim | 85 + .../airline/themes/base16_atelier_plateau.vim | 85 + .../themes/base16_atelier_plateau_light.vim | 85 + .../airline/themes/base16_atelier_savanna.vim | 85 + .../themes/base16_atelier_savanna_light.vim | 85 + .../airline/themes/base16_atelier_seaside.vim | 85 + .../themes/base16_atelier_seaside_light.vim | 85 + .../themes/base16_atelier_sulphurpool.vim | 85 + .../base16_atelier_sulphurpool_light.vim | 85 + .../airline/themes/base16_atelierdune.vim | 89 + .../airline/themes/base16_atelierforest.vim | 73 + .../airline/themes/base16_atelierheath.vim | 73 + .../airline/themes/base16_atelierlakeside.vim | 73 + .../airline/themes/base16_atelierseaside.vim | 73 + .../autoload/airline/themes/base16_atlas.vim | 85 + .../autoload/airline/themes/base16_bespin.vim | 73 + .../airline/themes/base16_black_metal.vim | 85 + .../themes/base16_black_metal_bathory.vim | 85 + .../themes/base16_black_metal_burzum.vim | 85 + .../base16_black_metal_dark_funeral.vim | 85 + .../themes/base16_black_metal_gorgoroth.vim | 85 + .../themes/base16_black_metal_immortal.vim | 85 + .../themes/base16_black_metal_khold.vim | 85 + .../themes/base16_black_metal_marduk.vim | 85 + .../themes/base16_black_metal_mayhem.vim | 85 + .../themes/base16_black_metal_nile.vim | 85 + .../themes/base16_black_metal_venom.vim | 85 + .../autoload/airline/themes/base16_brewer.vim | 73 + .../autoload/airline/themes/base16_bright.vim | 73 + .../airline/themes/base16_brogrammer.vim | 85 + .../airline/themes/base16_brushtrees.vim | 85 + .../airline/themes/base16_brushtrees_dark.vim | 85 + .../autoload/airline/themes/base16_chalk.vim | 73 + .../autoload/airline/themes/base16_circus.vim | 85 + .../airline/themes/base16_classic.vim | 73 + .../airline/themes/base16_classic_dark.vim | 85 + .../airline/themes/base16_classic_light.vim | 85 + .../airline/themes/base16_codeschool.vim | 73 + .../autoload/airline/themes/base16_colors.vim | 73 + .../airline/themes/base16_cupcake.vim | 85 + .../airline/themes/base16_cupertino.vim | 85 + .../airline/themes/base16_darktooth.vim | 85 + .../autoload/airline/themes/base16_decaf.vim | 85 + .../airline/themes/base16_default.vim | 73 + .../airline/themes/base16_default_dark.vim | 85 + .../airline/themes/base16_default_light.vim | 85 + .../airline/themes/base16_dracula.vim | 85 + .../airline/themes/base16_edge_dark.vim | 85 + .../airline/themes/base16_edge_light.vim | 85 + .../airline/themes/base16_eighties.vim | 73 + .../autoload/airline/themes/base16_embers.vim | 73 + .../airline/themes/base16_espresso.vim | 85 + .../autoload/airline/themes/base16_flat.vim | 73 + .../autoload/airline/themes/base16_framer.vim | 85 + .../airline/themes/base16_fruit_soda.vim | 85 + .../airline/themes/base16_gigavolt.vim | 85 + .../autoload/airline/themes/base16_github.vim | 85 + .../autoload/airline/themes/base16_google.vim | 73 + .../airline/themes/base16_google_dark.vim | 85 + .../airline/themes/base16_google_light.vim | 85 + .../airline/themes/base16_grayscale.vim | 73 + .../airline/themes/base16_grayscale_dark.vim | 85 + .../airline/themes/base16_grayscale_light.vim | 85 + .../airline/themes/base16_greenscreen.vim | 73 + .../themes/base16_gruvbox_dark_hard.vim | 78 + .../themes/base16_gruvbox_dark_medium.vim | 85 + .../themes/base16_gruvbox_dark_pale.vim | 85 + .../themes/base16_gruvbox_dark_soft.vim | 85 + .../themes/base16_gruvbox_light_hard.vim | 85 + .../themes/base16_gruvbox_light_medium.vim | 85 + .../themes/base16_gruvbox_light_soft.vim | 85 + .../airline/themes/base16_harmonic16.vim | 73 + .../airline/themes/base16_harmonic_dark.vim | 85 + .../airline/themes/base16_harmonic_light.vim | 85 + .../autoload/airline/themes/base16_heetch.vim | 85 + .../airline/themes/base16_heetch_light.vim | 85 + .../autoload/airline/themes/base16_helios.vim | 85 + .../airline/themes/base16_hopscotch.vim | 73 + .../airline/themes/base16_horizon_dark.vim | 85 + .../airline/themes/base16_horizon_light.vim | 85 + .../themes/base16_horizon_terminal_dark.vim | 85 + .../themes/base16_horizon_terminal_light.vim | 85 + .../airline/themes/base16_ia_dark.vim | 85 + .../airline/themes/base16_ia_light.vim | 85 + .../autoload/airline/themes/base16_icy.vim | 85 + .../airline/themes/base16_irblack.vim | 85 + .../airline/themes/base16_isotope.vim | 73 + .../airline/themes/base16_londontube.vim | 73 + .../airline/themes/base16_macintosh.vim | 85 + .../airline/themes/base16_marrakesh.vim | 73 + .../airline/themes/base16_materia.vim | 85 + .../airline/themes/base16_material.vim | 85 + .../airline/themes/base16_material_darker.vim | 85 + .../themes/base16_material_lighter.vim | 85 + .../themes/base16_material_palenight.vim | 85 + .../airline/themes/base16_material_vivid.vim | 85 + .../airline/themes/base16_mellow_purple.vim | 85 + .../airline/themes/base16_mexico_light.vim | 85 + .../autoload/airline/themes/base16_mocha.vim | 73 + .../airline/themes/base16_monokai.vim | 73 + .../autoload/airline/themes/base16_nord.vim | 75 + .../autoload/airline/themes/base16_nova.vim | 85 + .../autoload/airline/themes/base16_ocean.vim | 73 + .../airline/themes/base16_oceanicnext.vim | 83 + .../airline/themes/base16_one_light.vim | 85 + .../airline/themes/base16_onedark.vim | 85 + .../airline/themes/base16_outrun_dark.vim | 85 + .../airline/themes/base16_papercolor_dark.vim | 85 + .../themes/base16_papercolor_light.vim | 85 + .../airline/themes/base16_paraiso.vim | 73 + .../autoload/airline/themes/base16_phd.vim | 85 + .../autoload/airline/themes/base16_pico.vim | 85 + .../autoload/airline/themes/base16_pop.vim | 73 + .../autoload/airline/themes/base16_porple.vim | 85 + .../airline/themes/base16_railscasts.vim | 73 + .../airline/themes/base16_rebecca.vim | 85 + .../airline/themes/base16_sandcastle.vim | 85 + .../autoload/airline/themes/base16_seti.vim | 77 + .../airline/themes/base16_shapeshifter.vim | 73 + .../autoload/airline/themes/base16_shell.vim | 10 + .../autoload/airline/themes/base16_snazzy.vim | 121 + .../airline/themes/base16_solarflare.vim | 85 + .../airline/themes/base16_solarized.vim | 73 + .../airline/themes/base16_solarized_dark.vim | 85 + .../airline/themes/base16_solarized_light.vim | 85 + .../airline/themes/base16_spacemacs.vim | 191 + .../airline/themes/base16_summerfruit.vim | 73 + .../themes/base16_summerfruit_dark.vim | 85 + .../themes/base16_summerfruit_light.vim | 85 + .../themes/base16_synth_midnight_dark.vim | 85 + .../airline/themes/base16_tomorrow.vim | 82 + .../airline/themes/base16_tomorrow_night.vim | 85 + .../themes/base16_tomorrow_night_eighties.vim | 85 + .../autoload/airline/themes/base16_tube.vim | 85 + .../airline/themes/base16_twilight.vim | 73 + .../airline/themes/base16_unikitty_dark.vim | 85 + .../airline/themes/base16_unikitty_light.vim | 85 + .../autoload/airline/themes/base16_vim.vim | 172 + .../airline/themes/base16_woodland.vim | 85 + .../airline/themes/base16_xcode_dusk.vim | 85 + .../airline/themes/base16_zenburn.vim | 85 + .../autoload/airline/themes/base16color.vim | 77 + .../autoload/airline/themes/behelit.vim | 58 + .../autoload/airline/themes/biogoo.vim | 58 + .../autoload/airline/themes/blood_red.vim | 35 + .../autoload/airline/themes/bubblegum.vim | 70 + .../autoload/airline/themes/cobalt2.vim | 100 + .../autoload/airline/themes/cool.vim | 70 + .../autoload/airline/themes/cyberpunk.vim | 113 + .../autoload/airline/themes/dark_minimal.vim | 63 + .../autoload/airline/themes/desertink.vim | 68 + .../autoload/airline/themes/deus.vim | 117 + .../autoload/airline/themes/distinguished.vim | 59 + .../autoload/airline/themes/durant.vim | 62 + .../airline/themes/executable_ouo.vim | 135 + .../autoload/airline/themes/fairyfloss.vim | 88 + .../autoload/airline/themes/fruit_punch.vim | 80 + .../autoload/airline/themes/google_dark.vim | 64 + .../autoload/airline/themes/google_light.vim | 64 + .../autoload/airline/themes/hybrid.vim | 52 + .../autoload/airline/themes/hybridline.vim | 34 + .../autoload/airline/themes/jellybeans.vim | 88 + .../autoload/airline/themes/jet.vim | 98 + .../autoload/airline/themes/kalisi.vim | 70 + .../autoload/airline/themes/kolor.vim | 59 + .../autoload/airline/themes/laederon.vim | 87 + .../autoload/airline/themes/lessnoise.vim | 182 + .../autoload/airline/themes/light.vim | 47 + .../autoload/airline/themes/lighthaus.vim | 132 + .../autoload/airline/themes/lucius.vim | 71 + .../autoload/airline/themes/luna.vim | 92 + .../autoload/airline/themes/minimalist.vim | 81 + .../autoload/airline/themes/molokai.vim | 76 + .../autoload/airline/themes/monochrome.vim | 18 + .../autoload/airline/themes/murmur.vim | 82 + .../autoload/airline/themes/night_owl.vim | 60 + .../autoload/airline/themes/nord_minimal.vim | 60 + .../autoload/airline/themes/onedark.vim | 140 + .../autoload/airline/themes/owo.vim | 85 + .../autoload/airline/themes/papercolor.vim | 66 + .../autoload/airline/themes/peaksea.vim | 75 + .../autoload/airline/themes/powerlineish.vim | 49 + .../autoload/airline/themes/qwq.vim | 61 + .../autoload/airline/themes/raven.vim | 85 + .../autoload/airline/themes/ravenpower.vim | 36 + .../autoload/airline/themes/seagull.vim | 189 + .../autoload/airline/themes/selenized.vim | 136 + .../autoload/airline/themes/selenized_bw.vim | 136 + .../autoload/airline/themes/seoul256.vim | 63 + .../autoload/airline/themes/serene.vim | 41 + .../autoload/airline/themes/sierra.vim | 94 + .../autoload/airline/themes/silver.vim | 85 + .../autoload/airline/themes/simple.vim | 46 + .../autoload/airline/themes/soda.vim | 33 + .../autoload/airline/themes/sol.vim | 90 + .../autoload/airline/themes/solarized.vim | 234 + .../airline/themes/solarized_flood.vim | 174 + .../autoload/airline/themes/supernova.vim | 62 + .../autoload/airline/themes/term.vim | 92 + .../autoload/airline/themes/term_light.vim | 92 + .../autoload/airline/themes/tomorrow.vim | 44 + .../autoload/airline/themes/transparent.vim | 155 + .../autoload/airline/themes/ubaryd.vim | 87 + .../autoload/airline/themes/understated.vim | 43 + .../autoload/airline/themes/violet.vim | 32 + .../autoload/airline/themes/wombat.vim | 90 + .../autoload/airline/themes/xtermlight.vim | 45 + .../autoload/airline/themes/zenburn.vim | 45 + .../vim-airline-themes/doc/airline-themes.txt | 442 + dot_vim/plugged/vim-airline-themes/doc/tags | 33 + .../plugged/vim-airline-themes/dot_git/HEAD | 1 + .../vim-airline-themes/dot_git/branches/.keep | 0 .../plugged/vim-airline-themes/dot_git/config | 11 + .../vim-airline-themes/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../dot_git/hooks/update.sample | 128 + .../plugged/vim-airline-themes/dot_git/index | Bin 0 -> 26507 bytes .../vim-airline-themes/dot_git/info/exclude | 6 + .../vim-airline-themes/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...c90ec387856bdc94b1b6a4d9fdaa1db01bf0d1.idx | Bin 0 -> 9416 bytes ...90ec387856bdc94b1b6a4d9fdaa1db01bf0d1.pack | Bin 0 -> 131466 bytes .../vim-airline-themes/dot_git/packed-refs | 4 + .../dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../dot_git/refs/tags/.keep | 0 .../vim-airline-themes/dot_git/shallow | 3 + .../dot_github/ISSUE_TEMPLATE.md | 24 + .../dot_github/workflows/ci.yml | 44 + .../dot_github/workflows/reviewdog.yml | 22 + .../plugged/vim-airline-themes/dot_gitignore | 2 + .../plugin/airline-themes.vim | 15 + .../test/airline-themes.vader | 38 + dot_vim/plugged/vim-airline/CHANGELOG.md | 251 + dot_vim/plugged/vim-airline/CONTRIBUTING.md | 45 + dot_vim/plugged/vim-airline/LICENSE | 21 + dot_vim/plugged/vim-airline/README.md | 372 + .../plugged/vim-airline/autoload/airline.vim | 313 + .../vim-airline/autoload/airline/async.vim | 382 + .../vim-airline/autoload/airline/builder.vim | 246 + .../vim-airline/autoload/airline/debug.vim | 51 + .../autoload/airline/extensions.vim | 523 + .../autoload/airline/extensions/ale.vim | 138 + .../autoload/airline/extensions/battery.vim | 23 + .../autoload/airline/extensions/bookmark.vim | 30 + .../autoload/airline/extensions/branch.vim | 369 + .../airline/extensions/bufferline.vim | 28 + .../autoload/airline/extensions/capslock.vim | 17 + .../autoload/airline/extensions/coc.vim | 54 + .../autoload/airline/extensions/commandt.vim | 19 + .../autoload/airline/extensions/csv.vim | 33 + .../autoload/airline/extensions/ctrlp.vim | 82 + .../autoload/airline/extensions/ctrlspace.vim | 21 + .../airline/extensions/cursormode.vim | 126 + .../autoload/airline/extensions/default.vim | 97 + .../autoload/airline/extensions/denite.vim | 55 + .../autoload/airline/extensions/dirvish.vim | 36 + .../autoload/airline/extensions/eclim.vim | 62 + .../autoload/airline/extensions/example.vim | 55 + .../autoload/airline/extensions/fern.vim | 36 + .../airline/extensions/fugitiveline.vim | 61 + .../autoload/airline/extensions/fzf.vim | 44 + .../autoload/airline/extensions/gen_tags.vim | 19 + .../autoload/airline/extensions/gina.vim | 28 + .../autoload/airline/extensions/grepper.vim | 18 + .../autoload/airline/extensions/gutentags.vim | 18 + .../autoload/airline/extensions/hunks.vim | 149 + .../autoload/airline/extensions/keymap.vim | 31 + .../airline/extensions/languageclient.vim | 113 + .../airline/extensions/localsearch.vim | 41 + .../autoload/airline/extensions/lsp.vim | 111 + .../autoload/airline/extensions/neomake.vim | 37 + .../autoload/airline/extensions/netrw.vim | 35 + .../autoload/airline/extensions/nrrwrgn.vim | 58 + .../autoload/airline/extensions/nvimlsp.vim | 69 + .../autoload/airline/extensions/obsession.vim | 23 + .../autoload/airline/extensions/omnisharp.vim | 45 + .../autoload/airline/extensions/po.vim | 105 + .../autoload/airline/extensions/poetv.vim | 32 + .../airline/extensions/promptline.vim | 36 + .../autoload/airline/extensions/quickfix.vim | 58 + .../autoload/airline/extensions/rufo.vim | 38 + .../autoload/airline/extensions/scrollbar.vim | 37 + .../airline/extensions/searchcount.vim | 56 + .../autoload/airline/extensions/syntastic.vim | 44 + .../autoload/airline/extensions/tabline.vim | 483 + .../airline/extensions/tabline/autoshow.vim | 53 + .../airline/extensions/tabline/buffers.vim | 267 + .../airline/extensions/tabline/buflist.vim | 85 + .../airline/extensions/tabline/builder.vim | 232 + .../airline/extensions/tabline/ctrlspace.vim | 169 + .../extensions/tabline/formatters/default.vim | 85 + .../tabline/formatters/jsformatter.vim | 15 + .../tabline/formatters/short_path.vim | 21 + .../formatters/short_path_improved.vim | 36 + .../extensions/tabline/formatters/tabnr.vim | 20 + .../tabline/formatters/unique_tail.vim | 46 + .../formatters/unique_tail_improved.vim | 91 + .../airline/extensions/tabline/tabs.vim | 141 + .../airline/extensions/tabline/tabws.vim | 156 + .../airline/extensions/tabline/xtabline.vim | 404 + .../autoload/airline/extensions/tagbar.vim | 64 + .../autoload/airline/extensions/taglist.vim | 37 + .../autoload/airline/extensions/term.vim | 80 + .../autoload/airline/extensions/tmuxline.vim | 28 + .../autoload/airline/extensions/undotree.vim | 29 + .../autoload/airline/extensions/unicode.vim | 25 + .../autoload/airline/extensions/unite.vim | 25 + .../autoload/airline/extensions/vim9lsp.vim | 27 + .../autoload/airline/extensions/vimagit.vim | 30 + .../autoload/airline/extensions/vimcmake.vim | 30 + .../autoload/airline/extensions/vimtex.vim | 84 + .../airline/extensions/virtualenv.vim | 32 + .../autoload/airline/extensions/vista.vim | 18 + .../airline/extensions/whitespace.vim | 199 + .../airline/extensions/windowswap.vim | 30 + .../autoload/airline/extensions/wordcount.vim | 128 + .../wordcount/formatters/default.vim | 47 + .../wordcount/formatters/readingtime.vim | 47 + .../autoload/airline/extensions/xkblayout.vim | 29 + .../autoload/airline/extensions/ycm.vim | 42 + .../airline/extensions/zoomwintab.vim | 27 + .../autoload/airline/formatter/short_path.vim | 8 + .../autoload/airline/highlighter.vim | 685 + .../vim-airline/autoload/airline/init.vim | 288 + .../vim-airline/autoload/airline/msdos.vim | 83 + .../vim-airline/autoload/airline/parts.vim | 208 + .../vim-airline/autoload/airline/section.vim | 84 + .../vim-airline/autoload/airline/themes.vim | 163 + .../autoload/airline/themes/dark.vim | 163 + .../vim-airline/autoload/airline/util.vim | 239 + dot_vim/plugged/vim-airline/doc/airline.txt | 2147 ++ dot_vim/plugged/vim-airline/doc/tags | 102 + dot_vim/plugged/vim-airline/dot_git/HEAD | 1 + .../vim-airline/dot_git/branches/.keep | 0 dot_vim/plugged/vim-airline/dot_git/config | 11 + .../plugged/vim-airline/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../vim-airline/dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vim-airline/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vim-airline/dot_git/index | Bin 0 -> 12423 bytes .../plugged/vim-airline/dot_git/info/exclude | 6 + dot_vim/plugged/vim-airline/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../vim-airline/dot_git/objects/info/.keep | 0 ...eb515db437289aa44701d94ef45ee2a470bb12.idx | Bin 0 -> 31032 bytes ...b515db437289aa44701d94ef45ee2a470bb12.pack | Bin 0 -> 414312 bytes .../plugged/vim-airline/dot_git/packed-refs | 18 + .../vim-airline/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../vim-airline/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vim-airline/dot_git/shallow | 16 + .../vim-airline/dot_github/ISSUE_TEMPLATE.md | 26 + .../vim-airline/dot_github/workflows/ci.yml | 44 + .../dot_github/workflows/reviewdog.yml | 22 + dot_vim/plugged/vim-airline/dot_gitignore | 8 + .../plugged/vim-airline/plugin/airline.vim | 310 + .../plugged/vim-airline/test/airline.vimspec | 64 + .../plugged/vim-airline/test/builder.vimspec | 107 + .../plugged/vim-airline/test/commands.vimspec | 50 + dot_vim/plugged/vim-airline/test/dot_themisrc | 28 + .../test/extensions_default.vimspec | 47 + .../test/extensions_tabline.vimspec | 14 + .../vim-airline/test/highlighter.vimspec | 28 + dot_vim/plugged/vim-airline/test/init.vimspec | 109 + .../plugged/vim-airline/test/parts.vimspec | 58 + .../plugged/vim-airline/test/section.vimspec | 77 + .../plugged/vim-airline/test/themes.vimspec | 91 + dot_vim/plugged/vim-airline/test/util.vimspec | 69 + dot_vim/plugged/vim-latex/Makefile | 33 + dot_vim/plugged/vim-latex/Makefile.in | 133 + dot_vim/plugged/vim-latex/README.md | 19 + dot_vim/plugged/vim-latex/compiler/tex.vim | 412 + dot_vim/plugged/vim-latex/doc/Makefile | 62 + dot_vim/plugged/vim-latex/doc/Makefile.in | 29 + dot_vim/plugged/vim-latex/doc/README | 110 + dot_vim/plugged/vim-latex/doc/README.new | 25 + dot_vim/plugged/vim-latex/doc/catalog.xml | 12 + .../plugged/vim-latex/doc/db2vim/domutils.py | 27 + .../vim-latex/doc/db2vim/executable_db2vim | 715 + .../plugged/vim-latex/doc/db2vim/textutils.py | 207 + dot_vim/plugged/vim-latex/doc/imaps.txt | 86 + .../vim-latex/doc/latex-suite-chunk.xsl | 50 + .../vim-latex/doc/latex-suite-common.xsl | 62 + .../vim-latex/doc/latex-suite-quickstart.css | 182 + .../vim-latex/doc/latex-suite-quickstart.txt | 391 + .../vim-latex/doc/latex-suite-quickstart.xml | 433 + dot_vim/plugged/vim-latex/doc/latex-suite.css | 182 + dot_vim/plugged/vim-latex/doc/latex-suite.txt | 3529 ++ dot_vim/plugged/vim-latex/doc/latex-suite.xml | 4749 +++ dot_vim/plugged/vim-latex/doc/latex-suite.xsl | 22 + dot_vim/plugged/vim-latex/doc/tags | 619 + dot_vim/plugged/vim-latex/dot_git/HEAD | 1 + .../plugged/vim-latex/dot_git/branches/.keep | 0 dot_vim/plugged/vim-latex/dot_git/config | 11 + dot_vim/plugged/vim-latex/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../vim-latex/dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../vim-latex/dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../vim-latex/dot_git/hooks/pre-push.sample | 53 + .../vim-latex/dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vim-latex/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vim-latex/dot_git/index | Bin 0 -> 14575 bytes .../plugged/vim-latex/dot_git/info/exclude | 6 + dot_vim/plugged/vim-latex/dot_git/logs/HEAD | 2 + .../vim-latex/dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../vim-latex/dot_git/objects/info/.keep | 0 ...0a80d4a3819d1f713bcc8696237103d844b52a.idx | Bin 0 -> 7428 bytes ...a80d4a3819d1f713bcc8696237103d844b52a.pack | Bin 0 -> 362268 bytes dot_vim/plugged/vim-latex/dot_git/packed-refs | 6 + .../vim-latex/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../plugged/vim-latex/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vim-latex/dot_git/shallow | 3 + dot_vim/plugged/vim-latex/dot_gitattributes | 2 + dot_vim/plugged/vim-latex/dot_gitignore | 40 + .../plugged/vim-latex/executable_latextags | 11 + dot_vim/plugged/vim-latex/executable_ltags | 78 + .../vim-latex/ftplugin/bib_latexSuite.vim | 22 + .../__pycache__/bibtools.cpython-310.pyc | Bin 0 -> 6453 bytes .../__pycache__/outline.cpython-310.pyc | Bin 0 -> 3503 bytes .../vim-latex/ftplugin/latex-suite/bibtex.vim | 253 + .../ftplugin/latex-suite/bibtools.py | 248 + .../ftplugin/latex-suite/brackets.vim | 146 + .../ftplugin/latex-suite/compiler.vim | 935 + .../ftplugin/latex-suite/custommacros.vim | 251 + .../ftplugin/latex-suite/diacritics.vim | 124 + .../ftplugin/latex-suite/dictionaries/SIunits | 289 + .../latex-suite/dictionaries/dictionary | 676 + .../ftplugin/latex-suite/elementmacros.vim | 330 + .../ftplugin/latex-suite/envmacros.vim | 1193 + .../latex-suite/executable_outline.py | 200 + .../ftplugin/latex-suite/folding.vim | 546 + .../ftplugin/latex-suite/macros/example | 11 + .../vim-latex/ftplugin/latex-suite/main.vim | 1189 + .../ftplugin/latex-suite/mathmacros-utf.vim | 729 + .../ftplugin/latex-suite/mathmacros.vim | 730 + .../ftplugin/latex-suite/multicompile.vim | 16 + .../ftplugin/latex-suite/packages.vim | 689 + .../ftplugin/latex-suite/packages/SIunits | 315 + .../ftplugin/latex-suite/packages/accents | 28 + .../ftplugin/latex-suite/packages/acromake | 10 + .../ftplugin/latex-suite/packages/afterpage | 10 + .../ftplugin/latex-suite/packages/alltt | 12 + .../ftplugin/latex-suite/packages/amsmath | 106 + .../ftplugin/latex-suite/packages/amsthm | 21 + .../ftplugin/latex-suite/packages/amsxtra | 12 + .../ftplugin/latex-suite/packages/arabic | 10 + .../ftplugin/latex-suite/packages/array | 17 + .../ftplugin/latex-suite/packages/babel | 103 + .../ftplugin/latex-suite/packages/bar | 27 + .../ftplugin/latex-suite/packages/biblatex | 159 + .../ftplugin/latex-suite/packages/bm | 10 + .../ftplugin/latex-suite/packages/bophook | 12 + .../latex-suite/packages/boxedminipage | 10 + .../ftplugin/latex-suite/packages/caption2 | 43 + .../ftplugin/latex-suite/packages/cases | 12 + .../ftplugin/latex-suite/packages/ccaption | 20 + .../ftplugin/latex-suite/packages/changebar | 35 + .../ftplugin/latex-suite/packages/chapterbib | 24 + .../ftplugin/latex-suite/packages/cite | 32 + .../ftplugin/latex-suite/packages/color | 43 + .../ftplugin/latex-suite/packages/comma | 12 + .../ftplugin/latex-suite/packages/csquotes | 104 + .../ftplugin/latex-suite/packages/deleq | 36 + .../ftplugin/latex-suite/packages/drftcite | 29 + .../ftplugin/latex-suite/packages/dropping | 12 + .../ftplugin/latex-suite/packages/enumerate | 10 + .../ftplugin/latex-suite/packages/eqlist | 19 + .../ftplugin/latex-suite/packages/eqparbox | 12 + .../ftplugin/latex-suite/packages/everyshi | 10 + .../ftplugin/latex-suite/packages/exmpl | 55 + .../ftplugin/latex-suite/packages/fixme | 42 + .../ftplugin/latex-suite/packages/flafter | 10 + .../ftplugin/latex-suite/packages/float | 16 + .../ftplugin/latex-suite/packages/floatflt | 12 + .../ftplugin/latex-suite/packages/fn2end | 10 + .../ftplugin/latex-suite/packages/footmisc | 21 + .../ftplugin/latex-suite/packages/geometry | 93 + .../ftplugin/latex-suite/packages/german | 17 + .../ftplugin/latex-suite/packages/graphicx | 69 + .../ftplugin/latex-suite/packages/graphpap | 10 + .../ftplugin/latex-suite/packages/harpoon | 18 + .../ftplugin/latex-suite/packages/hhline | 21 + .../ftplugin/latex-suite/packages/histogram | 13 + .../ftplugin/latex-suite/packages/hyperref | 167 + .../ftplugin/latex-suite/packages/ifthen | 21 + .../ftplugin/latex-suite/packages/inputenc | 29 + .../ftplugin/latex-suite/packages/letterspace | 10 + .../ftplugin/latex-suite/packages/lineno | 60 + .../ftplugin/latex-suite/packages/longtable | 35 + .../ftplugin/latex-suite/packages/lscape | 10 + .../ftplugin/latex-suite/packages/manyfoot | 15 + .../ftplugin/latex-suite/packages/moreverb | 28 + .../ftplugin/latex-suite/packages/multibox | 10 + .../ftplugin/latex-suite/packages/multicol | 21 + .../ftplugin/latex-suite/packages/newalg | 26 + .../ftplugin/latex-suite/packages/ngerman | 17 + .../ftplugin/latex-suite/packages/numprint | 18 + .../ftplugin/latex-suite/packages/oldstyle | 12 + .../ftplugin/latex-suite/packages/outliner | 19 + .../ftplugin/latex-suite/packages/overcite | 34 + .../ftplugin/latex-suite/packages/pagenote | 26 + .../ftplugin/latex-suite/packages/parallel | 15 + .../ftplugin/latex-suite/packages/plain | 10 + .../ftplugin/latex-suite/packages/plates | 16 + .../ftplugin/latex-suite/packages/polski | 165 + .../ftplugin/latex-suite/packages/psgo | 27 + .../ftplugin/latex-suite/packages/schedule | 20 + .../ftplugin/latex-suite/packages/textfit | 12 + .../ftplugin/latex-suite/packages/times | 10 + .../ftplugin/latex-suite/packages/tipa | 364 + .../ftplugin/latex-suite/packages/ulem | 21 + .../ftplugin/latex-suite/packages/url | 24 + .../ftplugin/latex-suite/packages/verbatim | 18 + .../ftplugin/latex-suite/packages/version | 12 + .../ftplugin/latex-suite/projecttemplate.vim | 11 + .../vim-latex/ftplugin/latex-suite/pytools.py | 60 + .../ftplugin/latex-suite/smartspace.vim | 102 + .../ftplugin/latex-suite/templates.vim | 167 + .../latex-suite/templates/IEEEtran.tex | 142 + .../latex-suite/templates/article.tex | 9 + .../ftplugin/latex-suite/templates/report.tex | 9 + .../templates/report_two_column.tex | 9 + .../ftplugin/latex-suite/texmenuconf.vim | 130 + .../ftplugin/latex-suite/texproject.vim | 55 + .../vim-latex/ftplugin/latex-suite/texrc | 768 + .../ftplugin/latex-suite/texviewer.vim | 1111 + .../ftplugin/latex-suite/version.vim | 30 + .../ftplugin/latex-suite/wizardfuncs.vim | 335 + .../vim-latex/ftplugin/tex_latexSuite.vim | 20 + dot_vim/plugged/vim-latex/indent/tex.vim | 389 + .../plugged/vim-latex/plugin/SyntaxFolds.vim | 321 + .../plugged/vim-latex/plugin/filebrowser.vim | 249 + dot_vim/plugged/vim-latex/plugin/imaps.vim | 766 + .../plugged/vim-latex/plugin/remoteOpen.vim | 154 + .../plugged/vim-latex/vim-latex.metainfo.xml | 12 + dot_vim/plugged/vim-lsp-ale/LICENSE | 20 + dot_vim/plugged/vim-lsp-ale/README.md | 75 + .../plugged/vim-lsp-ale/autoload/lsp/ale.vim | 203 + dot_vim/plugged/vim-lsp-ale/doc/tags | 17 + .../plugged/vim-lsp-ale/doc/vim-lsp-ale.txt | 213 + dot_vim/plugged/vim-lsp-ale/dot_codecov.yml | 8 + dot_vim/plugged/vim-lsp-ale/dot_coveragerc | 3 + dot_vim/plugged/vim-lsp-ale/dot_git/HEAD | 1 + .../vim-lsp-ale/dot_git/branches/.keep | 0 dot_vim/plugged/vim-lsp-ale/dot_git/config | 11 + .../plugged/vim-lsp-ale/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../vim-lsp-ale/dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vim-lsp-ale/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vim-lsp-ale/dot_git/index | Bin 0 -> 3075 bytes .../plugged/vim-lsp-ale/dot_git/info/exclude | 6 + dot_vim/plugged/vim-lsp-ale/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../vim-lsp-ale/dot_git/objects/info/.keep | 0 ...2b38ea7f56cccdf29554efb5d8419c2d93646f.idx | Bin 0 -> 2416 bytes ...b38ea7f56cccdf29554efb5d8419c2d93646f.pack | Bin 0 -> 17864 bytes .../plugged/vim-lsp-ale/dot_git/packed-refs | 2 + .../vim-lsp-ale/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../vim-lsp-ale/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vim-lsp-ale/dot_git/shallow | 1 + .../vim-lsp-ale/dot_github/workflows/ci.yml | 101 + dot_vim/plugged/vim-lsp-ale/dot_gitignore | 1 + .../plugged/vim-lsp-ale/plugin/lsp_ale.vim | 28 + dot_vim/plugged/vim-lsp-ale/test/README.md | 103 + .../test/integ/deps/empty_dot_gitkeep | 0 .../vim-lsp-ale/test/integ/dot_gitignore | 4 + .../vim-lsp-ale/test/integ/dot_themisrc | 44 + .../vim-lsp-ale/test/integ/project/Cargo.lock | 5 + .../vim-lsp-ale/test/integ/project/Cargo.toml | 9 + .../test/integ/project/dot_gitignore | 2 + .../vim-lsp-ale/test/integ/project/src/lib.rs | 3 + .../vim-lsp-ale/test/integ/test.vimspec | 103 + .../vim-lsp-ale/test/unit/dot_themisrc | 18 + .../runtime/autoload/ale/other_source.vim | 62 + .../test/unit/runtime/autoload/lsp.vim | 2 + .../unit/runtime/autoload/lsp/callbag.vim | 35 + .../lsp/internal/diagnostics/state.vim | 7 + .../runtime/autoload/lsp/ui/vim/utils.vim | 19 + .../test/unit/runtime/autoload/lsp/utils.vim | 11 + .../vim-lsp-ale/test/unit/test.vimspec | 471 + dot_vim/plugged/vim-lsp-settings/LICENSE | 21 + dot_vim/plugged/vim-lsp-settings/Makefile | 11 + dot_vim/plugged/vim-lsp-settings/README.md | 420 + .../autoload/lsp_settings.vim | 635 + .../autoload/lsp_settings/profile.vim | 120 + .../autoload/lsp_settings/ui.vim | 107 + .../autoload/lsp_settings/utils.vim | 187 + .../vim-lsp-settings/checkers/cl-lsp.vim | 8 + .../checkers/perl-languageserver.vim | 7 + .../plugged/vim-lsp-settings/checkers/slp.vim | 3 + .../plugged/vim-lsp-settings/data/README.md | 7 + .../vim-lsp-settings/data/catalog.json | 3981 +++ dot_vim/plugged/vim-lsp-settings/doc/tags | 15 + .../vim-lsp-settings/doc/vim-lsp-settings.txt | 181 + .../plugged/vim-lsp-settings/dot_editorconfig | 16 + dot_vim/plugged/vim-lsp-settings/dot_git/HEAD | 1 + .../vim-lsp-settings/dot_git/branches/.keep | 0 .../plugged/vim-lsp-settings/dot_git/config | 11 + .../vim-lsp-settings/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../dot_git/hooks/update.sample | 128 + .../plugged/vim-lsp-settings/dot_git/index | Bin 0 -> 32405 bytes .../vim-lsp-settings/dot_git/info/exclude | 6 + .../vim-lsp-settings/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...6f923bc56139eb4bbe9177d4663ef1e882096b.idx | Bin 0 -> 33888 bytes ...f923bc56139eb4bbe9177d4663ef1e882096b.pack | Bin 0 -> 285641 bytes .../vim-lsp-settings/dot_git/packed-refs | 18 + .../dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../vim-lsp-settings/dot_git/refs/tags/.keep | 0 .../plugged/vim-lsp-settings/dot_git/shallow | 17 + .../vim-lsp-settings/dot_gitattributes | 12 + .../dot_github/workflows/ci.yml | 39 + .../dot_github/workflows/reviewdog.yml | 35 + .../plugged/vim-lsp-settings/dot_gitignore | 5 + .../installer/executable_go_install.sh | 10 + ...e_install-analysis-server-dart-snapshot.sh | 29 + ...cutable_install-angular-language-server.sh | 15 + .../executable_install-apex-jorje-lsp.sh | 11 + .../installer/executable_install-astro-ls.sh | 5 + ...executable_install-bash-language-server.sh | 5 + .../installer/executable_install-bufls.sh | 5 + .../installer/executable_install-cl-lsp.sh | 3 + .../installer/executable_install-clangd.sh | 117 + .../executable_install-clj-kondo-lsp.sh | 3 + .../executable_install-clojure-lsp.sh | 51 + ...xecutable_install-cmake-language-server.sh | 5 + ...ecutable_install-cobol-language-support.sh | 18 + .../executable_install-css-languageserver.sh | 5 + .../installer/executable_install-deno.sh | 21 + .../installer/executable_install-dls.sh | 21 + .../executable_install-docker-langserver.sh | 5 + .../executable_install-dot-language-server.sh | 5 + .../executable_install-eclipse-jdt-ls.sh | 25 + .../executable_install-efm-langserver.sh | 5 + .../installer/executable_install-elixir-ls.sh | 19 + .../executable_install-elm-language-server.sh | 5 + .../executable_install-emmylua-ls.sh | 15 + .../installer/executable_install-erlang-ls.sh | 8 + .../installer/executable_install-esbonio.sh | 16 + ...ecutable_install-eslint-language-server.sh | 19 + .../installer/executable_install-flow.sh | 5 + .../installer/executable_install-fortls.sh | 3 + .../executable_install-fsautocomplete.sh | 15 + ...ecutable_install-fsharp-language-server.sh | 18 + ...utable_install-golangci-lint-langserver.sh | 6 + .../installer/executable_install-gopls.sh | 5 + .../executable_install-gql-language-server.sh | 5 + ...cutable_install-graphql-language-server.sh | 13 + ...ecutable_install-groovy-language-server.sh | 15 + .../executable_install-html-languageserver.sh | 5 + .../executable_install-intelephense.sh | 5 + ...ble_install-javascript-typescript-stdio.sh | 5 + ...executable_install-jedi-language-server.sh | 5 + .../executable_install-json-languageserver.sh | 6 + ...xecutable_install-julia-language-server.sh | 13 + ...ecutable_install-kotlin-language-server.sh | 10 + .../installer/executable_install-lemminx.sh | 18 + .../installer/executable_install-marksman.sh | 17 + .../installer/executable_install-metals.sh | 36 + .../installer/executable_install-nimlsp.sh | 6 + .../installer/executable_install-ntt.sh | 20 + .../installer/executable_install-ocaml-lsp.sh | 26 + .../installer/executable_install-ols.sh | 6 + .../executable_install-omnisharp-lsp.sh | 64 + .../executable_install-perlnavigator.sh | 21 + .../executable_install-plpgsql-lsp.sh | 16 + ...table_install-powershell-languageserver.sh | 19 + ...ecutable_install-prisma-language-server.sh | 20 + ...xecutable_install-psalm-language-server.sh | 6 + .../installer/executable_install-puppet-ls.sh | 16 + ...able_install-purescript-language-server.sh | 5 + .../installer/executable_install-pyls-all.sh | 6 + .../installer/executable_install-pyls-ms.sh | 34 + .../installer/executable_install-pyls.sh | 5 + .../installer/executable_install-pylsp-all.sh | 6 + .../installer/executable_install-pylsp.sh | 5 + .../executable_install-pyright-langserver.sh | 5 + .../executable_install-r-languageserver.sh | 14 + .../executable_install-racket-lsp.sh | 10 + ...ecutable_install-reason-language-server.sh | 23 + ...ecutable_install-remark-language-server.sh | 5 + .../installer/executable_install-rnix-lsp.sh | 5 + .../installer/executable_install-rome.sh | 5 + .../installer/executable_install-ruby-lsp.sh | 17 + ...executable_install-ruby_language_server.sh | 17 + .../executable_install-rust-analyzer.sh | 49 + .../installer/executable_install-serve-d.sh | 21 + .../executable_install-solargraph.sh | 17 + .../executable_install-sql-language-server.sh | 5 + .../installer/executable_install-sqls.sh | 5 + .../installer/executable_install-steep.sh | 17 + ...ble_install-sumneko-lua-language-server.sh | 60 + ...ecutable_install-svelte-language-server.sh | 6 + .../installer/executable_install-svls.sh | 23 + ...utable_install-tailwindcss-intellisense.sh | 22 + .../installer/executable_install-taplo-lsp.sh | 18 + .../executable_install-terraform-ls.sh | 37 + .../executable_install-terraform-lsp.sh | 18 + .../installer/executable_install-texlab.sh | 35 + .../installer/executable_install-typeprof.sh | 17 + ...able_install-typescript-language-server.sh | 6 + .../executable_install-vim-language-server.sh | 5 + .../installer/executable_install-vlang-vls.sh | 7 + .../installer/executable_install-vls.sh | 5 + .../executable_install-volar-server.sh | 7 + ...able_install-vscode-css-language-server.sh | 5 + ...ble_install-vscode-html-language-server.sh | 5 + ...ble_install-vscode-json-language-server.sh | 5 + ...executable_install-yaml-language-server.sh | 5 + .../installer/executable_install-zls.sh | 11 + .../installer/executable_npm_install.sh | 18 + .../installer/executable_pip_install.sh | 11 + .../installer/executable_yarn_install.sh | 18 + .../vim-lsp-settings/installer/go_install.cmd | 13 + .../install-analysis-server-dart-snapshot.cmd | 11 + .../install-angular-language-server.cmd | 11 + .../installer/install-apex-jorje-lsp.cmd | 9 + .../installer/install-astro-ls.cmd | 3 + .../install-bash-language-server.cmd | 3 + .../installer/install-bufls.cmd | 3 + .../installer/install-cl-lsp.cmd | 3 + .../installer/install-clangd.cmd | 16 + .../installer/install-clj-kondo-lsp.cmd | 4 + .../installer/install-clojure-lsp.cmd | 22 + .../install-cmake-language-server.cmd | 3 + .../install-cobol-language-support.cmd | 14 + .../installer/install-css-languageserver.cmd | 3 + .../installer/install-deno.cmd | 6 + .../installer/install-dls.cmd | 7 + .../installer/install-docker-langserver.cmd | 4 + .../installer/install-dot-language-server.cmd | 3 + .../installer/install-eclipse-jdt-ls.cmd | 21 + .../installer/install-efm-langserver.cmd | 3 + .../installer/install-elixir-ls.cmd | 14 + .../installer/install-elm-language-server.cmd | 3 + .../installer/install-emmylua-ls.cmd | 12 + .../installer/install-erlang-ls.cmd | 10 + .../installer/install-esbonio.cmd | 10 + .../install-eslint-language-server.cmd | 14 + .../installer/install-flow.cmd | 3 + .../installer/install-fortls.cmd | 4 + .../installer/install-fsautocomplete.cmd | 19 + .../install-fsharp-language-server.cmd | 11 + .../install-golangci-lint-langserver.cmd | 4 + .../installer/install-gopls.cmd | 3 + .../installer/install-gql-language-server.cmd | 3 + .../install-graphql-language-server.cmd | 15 + .../install-groovy-language-server.cmd | 10 + .../installer/install-html-languageserver.cmd | 3 + .../installer/install-intelephense.cmd | 3 + .../install-javascript-typescript-stdio.cmd | 3 + .../install-jedi-language-server.cmd | 3 + .../installer/install-json-languageserver.cmd | 3 + .../install-julia-language-server.cmd | 16 + .../install-kotlin-language-server.cmd | 14 + .../installer/install-lemminx.cmd | 15 + .../installer/install-marksman.cmd | 3 + .../installer/install-metals.cmd | 16 + .../installer/install-nimlsp.cmd | 9 + .../installer/install-ntt.cmd | 6 + .../installer/install-ols.cmd | 7 + .../installer/install-omnisharp-lsp.cmd | 22 + .../installer/install-perlnavigator.cmd | 9 + .../install-powershell-languageserver.cmd | 20 + .../install-prisma-language-server.cmd | 18 + .../install-psalm-language-server.cmd | 10 + .../installer/install-puppet-ls.cmd | 17 + .../installer/install-pyls-all.cmd | 4 + .../installer/install-pyls-ms.cmd | 19 + .../installer/install-pyls.cmd | 3 + .../installer/install-pylsp-all.cmd | 4 + .../installer/install-pylsp.cmd | 3 + .../installer/install-pyright-langserver.cmd | 3 + .../installer/install-r-languageserver.cmd | 10 + .../installer/install-racket-lsp.cmd | 9 + .../install-reason-language-server.cmd | 8 + .../install-remark-language-server.cmd | 3 + .../installer/install-rome.cmd | 3 + .../install-ruby_language_server.cmd | 18 + .../installer/install-rust-analyzer.cmd | 7 + .../installer/install-serve-d.cmd | 8 + .../installer/install-solargraph.cmd | 18 + .../installer/install-sql-language-server.cmd | 3 + .../installer/install-sqls.cmd | 3 + .../installer/install-steep.cmd | 17 + .../install-sumneko-lua-language-server.cmd | 14 + .../install-svelte-language-server.cmd | 4 + .../installer/install-svls.cmd | 9 + .../install-tailwindcss-intellisense.cmd | 14 + .../installer/install-taplo-lsp.cmd | 15 + .../installer/install-terraform-ls.cmd | 7 + .../installer/install-terraform-lsp.cmd | 7 + .../installer/install-texlab.cmd | 6 + .../installer/install-typeprof.cmd | 18 + .../install-typescript-language-server.cmd | 4 + .../installer/install-vim-language-server.cmd | 3 + .../installer/install-vlang-vls.cmd | 8 + .../installer/install-vls.cmd | 3 + .../installer/install-volar-server.cmd | 5 + .../install-vscode-css-language-server.cmd | 3 + .../install-vscode-html-language-server.cmd | 3 + .../install-vscode-json-language-server.cmd | 3 + .../install-yaml-language-server.cmd | 3 + .../installer/install-zls.cmd | 16 + .../installer/literal_run_gzip.cmd | 9 + .../installer/literal_run_unzip.cmd | 11 + .../installer/npm_install.cmd | 19 + .../installer/pip_install.cmd | 67 + .../installer/yarn_install.cmd | 19 + .../vim-lsp-settings/local-schema.json | 67 + .../vim-lsp-settings/plugin/lsp_settings.vim | 19 + dot_vim/plugged/vim-lsp-settings/schema.json | 87 + .../plugged/vim-lsp-settings/settings.json | 1708 + .../analysis-server-dart-snapshot.vim | 14 + .../settings/angular-language-server.vim | 14 + .../settings/apex-jorje-lsp.vim | 14 + .../vim-lsp-settings/settings/astro-ls.vim | 43 + .../settings/bash-language-server.vim | 14 + .../vim-lsp-settings/settings/bufls.vim | 14 + .../vim-lsp-settings/settings/cl-lsp.vim | 14 + .../vim-lsp-settings/settings/clangd.vim | 93 + .../settings/clj-kondo-lsp.vim | 14 + .../vim-lsp-settings/settings/clojure-lsp.vim | 14 + .../settings/cmake-language-server.vim | 14 + .../settings/cobol-language-support.vim | 14 + .../settings/css-languageserver.vim | 19 + .../vim-lsp-settings/settings/deno.vim | 402 + .../vim-lsp-settings/settings/digestif.vim | 14 + .../plugged/vim-lsp-settings/settings/dls.vim | 14 + .../settings/docker-langserver.vim | 14 + .../settings/dot-language-server.vim | 14 + .../settings/eclipse-jdt-ls.vim | 35 + .../settings/efm-langserver.vim | 14 + .../vim-lsp-settings/settings/elixir-ls.vim | 15 + .../settings/elm-language-server.vim | 14 + .../vim-lsp-settings/settings/emmylua-ls.vim | 14 + .../vim-lsp-settings/settings/erlang-ls.vim | 14 + .../vim-lsp-settings/settings/esbonio.vim | 14 + .../settings/eslint-language-server.vim | 36 + .../vim-lsp-settings/settings/flow.vim | 14 + .../vim-lsp-settings/settings/fortls.vim | 14 + .../settings/fsautocomplete.vim | 14 + .../settings/fsharp-language-server.vim | 14 + .../vim-lsp-settings/settings/glslls.vim | 14 + .../vim-lsp-settings/settings/godot.vim | 14 + .../settings/golangci-lint-langserver.vim | 14 + .../vim-lsp-settings/settings/gopls.vim | 66 + .../settings/gql-language-server.vim | 14 + .../settings/graphql-language-server.vim | 14 + .../settings/groovy-language-server.vim | 14 + .../haskell-language-server-wrapper.vim | 45 + .../vim-lsp-settings/settings/hie-wrapper.vim | 44 + .../settings/html-languageserver.vim | 14 + .../settings/intelephense.vim | 14 + .../settings/java-language-server.vim | 14 + .../settings/javascript-typescript-stdio.vim | 14 + .../settings/jedi-language-server.vim | 14 + .../settings/json-languageserver.vim | 30 + .../settings/julia-language-server.vim | 14 + .../settings/kotlin-language-server.vim | 14 + .../vim-lsp-settings/settings/lemminx.vim | 14 + .../vim-lsp-settings/settings/marksman.vim | 14 + .../vim-lsp-settings/settings/metals.vim | 14 + .../vim-lsp-settings/settings/monastery.vim | 14 + .../vim-lsp-settings/settings/nimlsp.vim | 14 + .../plugged/vim-lsp-settings/settings/ntt.vim | 14 + .../vim-lsp-settings/settings/ocaml-lsp.vim | 15 + .../plugged/vim-lsp-settings/settings/ols.vim | 14 + .../settings/omnisharp-lsp.vim | 14 + .../settings/perl-languageserver.vim | 14 + .../settings/perlnavigator.vim | 15 + .../vim-lsp-settings/settings/plpgsql-lsp.vim | 14 + .../settings/powershell-languageserver.vim | 14 + .../settings/prisma-language-server.vim | 18 + .../settings/prolog-lsp_server.vim | 14 + .../settings/psalm-language-server.vim | 14 + .../vim-lsp-settings/settings/puppet-ls.vim | 14 + .../settings/purescript-language-server.vim | 27 + .../vim-lsp-settings/settings/pyls-all.vim | 14 + .../vim-lsp-settings/settings/pyls-ms.vim | 35 + .../vim-lsp-settings/settings/pyls.vim | 14 + .../vim-lsp-settings/settings/pylsp-all.vim | 14 + .../vim-lsp-settings/settings/pylsp.vim | 14 + .../settings/pyright-langserver.vim | 20 + .../settings/r-languageserver.vim | 15 + .../vim-lsp-settings/settings/racket-lsp.vim | 14 + .../settings/reason-language-server.vim | 14 + .../settings/remark-language-server.vim | 14 + .../plugged/vim-lsp-settings/settings/rls.vim | 14 + .../vim-lsp-settings/settings/rnix-lsp.vim | 14 + .../vim-lsp-settings/settings/rome.vim | 14 + .../vim-lsp-settings/settings/ruby-lsp.vim | 14 + .../settings/ruby_language_server.vim | 14 + .../settings/rust-analyzer.vim | 242 + .../vim-lsp-settings/settings/serve-d.vim | 14 + .../plugged/vim-lsp-settings/settings/slp.vim | 14 + .../vim-lsp-settings/settings/solargraph.vim | 14 + .../settings/sourcekit-lsp.vim | 14 + .../settings/sql-language-server.vim | 14 + .../vim-lsp-settings/settings/sqls.vim | 43 + .../vim-lsp-settings/settings/steep.vim | 14 + .../settings/sumneko-lua-language-server.vim | 56 + .../settings/svelte-language-server.vim | 14 + .../vim-lsp-settings/settings/svls.vim | 14 + .../settings/tailwindcss-intellisense.vim | 15 + .../vim-lsp-settings/settings/taplo-lsp.vim | 152 + .../settings/terraform-ls.vim | 14 + .../settings/terraform-lsp.vim | 14 + .../vim-lsp-settings/settings/texlab.vim | 160 + .../vim-lsp-settings/settings/typeprof.vim | 14 + .../settings/typescript-language-server.vim | 24 + .../settings/vala-language-server.vim | 14 + .../settings/vim-language-server.vim | 20 + .../vim-lsp-settings/settings/vlang-vls.vim | 14 + .../plugged/vim-lsp-settings/settings/vls.vim | 56 + .../settings/volar-server.vim | 60 + .../settings/vscode-css-language-server.vim | 19 + .../settings/vscode-html-language-server.vim | 14 + .../settings/vscode-json-language-server.vim | 30 + .../settings/yaml-language-server.vim | 35 + .../plugged/vim-lsp-settings/settings/zls.vim | 14 + .../vim-lsp-settings/test/dot_themisrc | 3 + .../test/lsp_settings.vimspec | 158 + .../test/lsp_settings/utils.vimspec | 43 + dot_vim/plugged/vim-lsp/LICENSE | 21 + dot_vim/plugged/vim-lsp/LICENSE-THIRD-PARTY | 47 + dot_vim/plugged/vim-lsp/README.md | 247 + .../plugged/vim-lsp/autoload/health/lsp.vim | 65 + dot_vim/plugged/vim-lsp/autoload/lsp.vim | 1332 + .../plugged/vim-lsp/autoload/lsp/callbag.vim | 1700 + .../vim-lsp/autoload/lsp/capabilities.vim | 198 + .../plugged/vim-lsp/autoload/lsp/client.vim | 465 + .../lsp/internal/completion/documentation.vim | 207 + .../autoload/lsp/internal/diagnostics.vim | 20 + .../document_diagnostics_command.vim | 40 + .../lsp/internal/diagnostics/echo.vim | 41 + .../lsp/internal/diagnostics/first_line.vim | 26 + .../lsp/internal/diagnostics/float.vim | 123 + .../lsp/internal/diagnostics/highlights.vim | 207 + .../lsp/internal/diagnostics/movement.vim | 199 + .../lsp/internal/diagnostics/signs.vim | 151 + .../lsp/internal/diagnostics/state.vim | 173 + .../lsp/internal/diagnostics/under_cursor.vim | 48 + .../lsp/internal/diagnostics/virtual_text.vim | 191 + .../internal/document_code_action/signs.vim | 131 + .../lsp/internal/document_formatting.vim | 86 + .../lsp/internal/document_highlight.vim | 238 + .../internal/document_hover/under_cursor.vim | 278 + .../internal/document_range_formatting.vim | 125 + .../lsp/internal/document_symbol/search.vim | 76 + .../autoload/lsp/internal/inlay_hints.vim | 127 + .../autoload/lsp/internal/semantic.vim | 411 + .../autoload/lsp/internal/show_message.vim | 74 + .../lsp/internal/show_message_request.vim | 58 + .../autoload/lsp/internal/textprop.vim | 13 + .../autoload/lsp/internal/type_hierarchy.vim | 91 + .../autoload/lsp/internal/ui/popupmenu.vim | 39 + .../autoload/lsp/internal/ui/quickpick.vim | 461 + .../lsp/internal/work_done_progress.vim | 70 + .../lsp/internal/workspace_symbol/search.vim | 94 + dot_vim/plugged/vim-lsp/autoload/lsp/omni.vim | 453 + dot_vim/plugged/vim-lsp/autoload/lsp/tag.vim | 157 + .../plugged/vim-lsp/autoload/lsp/ui/vim.vim | 497 + .../autoload/lsp/ui/vim/code_action.vim | 207 + .../vim-lsp/autoload/lsp/ui/vim/code_lens.vim | 137 + .../autoload/lsp/ui/vim/completion.vim | 303 + .../autoload/lsp/ui/vim/execute_command.vim | 64 + .../vim-lsp/autoload/lsp/ui/vim/folding.vim | 201 + .../vim-lsp/autoload/lsp/ui/vim/output.vim | 450 + .../autoload/lsp/ui/vim/signature_help.vim | 160 + .../vim-lsp/autoload/lsp/ui/vim/utils.vim | 164 + .../plugged/vim-lsp/autoload/lsp/utils.vim | 523 + .../vim-lsp/autoload/lsp/utils/args.vim | 42 + .../vim-lsp/autoload/lsp/utils/buffer.vim | 74 + .../vim-lsp/autoload/lsp/utils/diff.vim | 165 + .../vim-lsp/autoload/lsp/utils/job.vim | 409 + .../vim-lsp/autoload/lsp/utils/location.vim | 135 + .../vim-lsp/autoload/lsp/utils/position.vim | 91 + .../vim-lsp/autoload/lsp/utils/range.vim | 82 + .../vim-lsp/autoload/lsp/utils/step.vim | 19 + .../vim-lsp/autoload/lsp/utils/tagstack.vim | 33 + .../vim-lsp/autoload/lsp/utils/text_edit.vim | 229 + .../vim-lsp/autoload/lsp/utils/tree.vim | 295 + .../autoload/lsp/utils/workspace_config.vim | 14 + .../autoload/lsp/utils/workspace_edit.vim | 27 + .../plugged/vim-lsp/autoload/vital/_lsp.vim | 9 + .../vital/_lsp/VS/LSP/MarkupContent.vim | 66 + .../autoload/vital/_lsp/VS/LSP/Text.vim | 23 + .../autoload/vital/_lsp/VS/Vim/Buffer.vim | 140 + .../vital/_lsp/VS/Vim/Syntax/Markdown.vim | 155 + .../autoload/vital/_lsp/VS/Vim/Window.vim | 157 + .../_lsp/VS/Vim/Window/FloatingWindow.vim | 515 + .../plugged/vim-lsp/autoload/vital/lsp.vim | 334 + .../plugged/vim-lsp/autoload/vital/lsp.vital | 8 + dot_vim/plugged/vim-lsp/doc/tags | 170 + dot_vim/plugged/vim-lsp/doc/vim-lsp.txt | 2221 ++ dot_vim/plugged/vim-lsp/dot_git/HEAD | 1 + .../plugged/vim-lsp/dot_git/branches/.keep | 0 dot_vim/plugged/vim-lsp/dot_git/config | 11 + dot_vim/plugged/vim-lsp/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../vim-lsp/dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../vim-lsp/dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../vim-lsp/dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../vim-lsp/dot_git/hooks/pre-push.sample | 53 + .../vim-lsp/dot_git/hooks/pre-rebase.sample | 169 + .../vim-lsp/dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vim-lsp/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vim-lsp/dot_git/index | Bin 0 -> 13752 bytes dot_vim/plugged/vim-lsp/dot_git/info/exclude | 6 + dot_vim/plugged/vim-lsp/dot_git/logs/HEAD | 2 + .../vim-lsp/dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../vim-lsp/dot_git/objects/info/.keep | 0 ...c7f87f2ee40817d49724772ea390415e2f9afb.idx | Bin 0 -> 21372 bytes ...7f87f2ee40817d49724772ea390415e2f9afb.pack | Bin 0 -> 305568 bytes dot_vim/plugged/vim-lsp/dot_git/packed-refs | 18 + .../plugged/vim-lsp/dot_git/refs/heads/master | 1 + .../vim-lsp/dot_git/refs/remotes/origin/HEAD | 1 + .../plugged/vim-lsp/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vim-lsp/dot_git/shallow | 17 + dot_vim/plugged/vim-lsp/dot_gitattributes | 3 + dot_vim/plugged/vim-lsp/dot_github/stale.yml | 17 + .../dot_github/workflows/linux_neovim.yml | 88 + .../dot_github/workflows/linux_vim.yml | 88 + .../dot_github/workflows/mac_neovim.yml | 84 + .../vim-lsp/dot_github/workflows/mac_vim.yml | 58 + .../dot_github/workflows/reviewdog.yml | 22 + .../dot_github/workflows/windows_neovim.yml | 87 + .../dot_github/workflows/windows_vim.yml | 87 + dot_vim/plugged/vim-lsp/dot_gitignore | 1 + dot_vim/plugged/vim-lsp/dot_vintrc.yaml | 10 + .../plugged/vim-lsp/ftplugin/lsp-hover.vim | 24 + dot_vim/plugged/vim-lsp/minimal.vimrc | 35 + dot_vim/plugged/vim-lsp/plugin/lsp.vim | 237 + dot_vim/plugged/vim-lsp/syntax/lsp-hover.vim | 50 + dot_vim/plugged/vim-lsp/test/dot_themisrc | 10 + .../go/document_formatting.vimspec | 40 + .../document_diagnostics_command.vimspec | 88 + .../lsp/internal/diagnostics/state.vimspec | 70 + .../test/lsp/internal/show_message.vimspec | 92 + dot_vim/plugged/vim-lsp/test/lsp/omni.vimspec | 499 + .../vim-lsp/test/lsp/ui/vim/code_lens.vimspec | 134 + .../test/lsp/ui/vim/completion.vimspec | 37 + .../plugged/vim-lsp/test/lsp/utils.vimspec | 316 + .../vim-lsp/test/lsp/utils/buffer.vimspec | 101 + .../vim-lsp/test/lsp/utils/diff.vimspec | 86 + .../vim-lsp/test/lsp/utils/position.vimspec | 65 + .../vim-lsp/test/lsp/utils/range.vimspec | 61 + .../vim-lsp/test/lsp/utils/tagstack.vimspec | 75 + .../vim-lsp/test/lsp/utils/text_edit.vimspec | 647 + .../test/lsp/utils/work_done_progress.vimspec | 92 + .../test/lsp/utils/workspace_edit.vimspec | 81 + .../vim-lsp/test/testfiles/multibyte.txt | 3 + .../test/testproject-go/documentformat.go | 7 + .../vim-lsp/test/testproject-rust/Cargo.lock | 5 + .../vim-lsp/test/testproject-rust/Cargo.toml | 9 + .../test/testproject-rust/dot_gitignore | 1 + .../test/testproject-rust/src/calc/add.rs | 3 + .../test/testproject-rust/src/calc/mod.rs | 1 + .../src/documentdefinition.rs | 13 + .../src/documentdiagnostics.rs | 11 + .../testproject-rust/src/documentformat.rs | 3 + .../vim-lsp/test/testproject-rust/src/main.rs | 8 + .../test/testproject/empty_CMakeLists.txt | 0 .../vim-lsp/test/testproject/empty_README.md | 0 .../testproject/empty_compile_commands.json | 0 .../vim-lsp/test/testproject/empty_dot_ccls | 0 .../test/testproject/git/empty_dot_gitignore | 0 .../test/testproject/src/empty_CMakeLists.txt | 0 .../test/testproject/src/empty_main.cpp | 0 .../vim-lsp/test/utils/autoload/lsp/test.vim | 50 + dot_vim/plugged/vim-orgmode/CHANGELOG.org | 214 + dot_vim/plugged/vim-orgmode/LICENSE | 60 + dot_vim/plugged/vim-orgmode/Makefile | 91 + dot_vim/plugged/vim-orgmode/README.org | 43 + dot_vim/plugged/vim-orgmode/doc/orgguide.txt | 1528 + dot_vim/plugged/vim-orgmode/doc/tags | 90 + dot_vim/plugged/vim-orgmode/dot_git/HEAD | 1 + .../vim-orgmode/dot_git/branches/.keep | 0 dot_vim/plugged/vim-orgmode/dot_git/config | 11 + .../plugged/vim-orgmode/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../vim-orgmode/dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vim-orgmode/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vim-orgmode/dot_git/index | Bin 0 -> 8403 bytes .../plugged/vim-orgmode/dot_git/info/exclude | 6 + dot_vim/plugged/vim-orgmode/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../vim-orgmode/dot_git/objects/info/.keep | 0 ...ef9bbfee7b6e301f42815ae4fc1932c4290d07.idx | Bin 0 -> 16192 bytes ...f9bbfee7b6e301f42815ae4fc1932c4290d07.pack | Bin 0 -> 664040 bytes .../plugged/vim-orgmode/dot_git/packed-refs | 19 + .../vim-orgmode/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../vim-orgmode/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vim-orgmode/dot_git/shallow | 14 + dot_vim/plugged/vim-orgmode/dot_gitignore | 6 + dot_vim/plugged/vim-orgmode/dot_pylintrc | 234 + dot_vim/plugged/vim-orgmode/dot_travis.yml | 21 + .../plugged/vim-orgmode/examples/mylife.gif | Bin 0 -> 101565 bytes .../plugged/vim-orgmode/examples/mylife.org | 26 + .../plugged/vim-orgmode/examples/mylife.png | Bin 0 -> 67333 bytes .../examples/plugins/PluginExample.py | 51 + dot_vim/plugged/vim-orgmode/ftdetect/org.vim | 2 + dot_vim/plugged/vim-orgmode/ftplugin/org.cnf | 5 + dot_vim/plugged/vim-orgmode/ftplugin/org.vim | 170 + .../vim-orgmode/ftplugin/orgmode/__init__.py | 1 + .../vim-orgmode/ftplugin/orgmode/_vim.py | 408 + .../ftplugin/orgmode/docs/Makefile | 230 + .../vim-orgmode/ftplugin/orgmode/docs/conf.py | 387 + .../ftplugin/orgmode/docs/index.rst | 22 + .../ftplugin/orgmode/docs/make.bat | 281 + .../orgmode/docs/orgmode.liborgmode.rst | 78 + .../ftplugin/orgmode/docs/orgmode.plugins.rst | 110 + .../orgmode/docs/orgmode.py3compat.rst | 46 + .../ftplugin/orgmode/docs/orgmode.rst | 71 + .../ftplugin/orgmode/exceptions.py | 21 + .../ftplugin/orgmode/keybinding.py | 214 + .../ftplugin/orgmode/liborgmode/__init__.py | 1 + .../ftplugin/orgmode/liborgmode/agenda.py | 61 + .../orgmode/liborgmode/agendafilter.py | 91 + .../ftplugin/orgmode/liborgmode/base.py | 193 + .../ftplugin/orgmode/liborgmode/checkboxes.py | 403 + .../ftplugin/orgmode/liborgmode/documents.py | 312 + .../ftplugin/orgmode/liborgmode/dom_obj.py | 502 + .../ftplugin/orgmode/liborgmode/headings.py | 886 + .../ftplugin/orgmode/liborgmode/orgdate.py | 294 + .../vim-orgmode/ftplugin/orgmode/menu.py | 170 + .../ftplugin/orgmode/plugins/Agenda.py | 312 + .../ftplugin/orgmode/plugins/Date.py | 316 + .../ftplugin/orgmode/plugins/EditCheckbox.py | 328 + .../ftplugin/orgmode/plugins/EditStructure.py | 428 + .../ftplugin/orgmode/plugins/Export.py | 181 + .../ftplugin/orgmode/plugins/Hyperlinks.py | 219 + .../ftplugin/orgmode/plugins/LoggingWork.py | 42 + .../ftplugin/orgmode/plugins/Misc.py | 171 + .../ftplugin/orgmode/plugins/Navigator.py | 324 + .../ftplugin/orgmode/plugins/ShowHide.py | 181 + .../orgmode/plugins/TagsProperties.py | 213 + .../ftplugin/orgmode/plugins/Todo.py | 344 + .../ftplugin/orgmode/plugins/__init__.py | 1 + .../ftplugin/orgmode/py3compat/__init__.py | 1 + .../orgmode/py3compat/encode_compatibility.py | 11 + .../orgmode/py3compat/py_py3_string.py | 17 + .../py3compat/unicode_compatibility.py | 4 + .../orgmode/py3compat/xrange_compatibility.py | 4 + .../vim-orgmode/ftplugin/orgmode/settings.py | 95 + .../vim-orgmode/ftplugin/orgmode/vimbuffer.py | 500 + dot_vim/plugged/vim-orgmode/indent/org.vim | 133 + dot_vim/plugged/vim-orgmode/syntax/org.vim | 395 + .../plugged/vim-orgmode/syntax/orgagenda.vim | 79 + .../plugged/vim-orgmode/syntax/orgtodo.vim | 47 + .../tests/executable_literal_run_tests.py | 56 + .../vim-orgmode/tests/orgmode_testfile.org | 37 + .../vim-orgmode/tests/test_libagendafilter.py | 168 + .../plugged/vim-orgmode/tests/test_libbase.py | 33 + .../vim-orgmode/tests/test_libcheckbox.py | 130 + .../vim-orgmode/tests/test_libheading.py | 154 + .../vim-orgmode/tests/test_liborgdate.py | 51 + .../tests/test_liborgdate_parsing.py | 246 + .../vim-orgmode/tests/test_liborgdate_utf8.py | 50 + .../vim-orgmode/tests/test_liborgdatetime.py | 47 + .../vim-orgmode/tests/test_liborgtimerange.py | 83 + .../vim-orgmode/tests/test_plugin_date.py | 172 + .../tests/test_plugin_edit_checkbox.py | 239 + .../tests/test_plugin_edit_structure.py | 387 + .../vim-orgmode/tests/test_plugin_mappings.py | 66 + .../vim-orgmode/tests/test_plugin_misc.py | 164 + .../tests/test_plugin_navigator.py | 633 + .../tests/test_plugin_show_hide.py | 385 + .../tests/test_plugin_tags_properties.py | 176 + .../vim-orgmode/tests/test_plugin_todo.py | 422 + .../vim-orgmode/tests/test_vimbuffer.py | 1257 + dot_vim/plugged/vim-orgmode/tests/vim.py | 88 + dot_vim/plugged/vim-project/doc/project.txt | 710 + dot_vim/plugged/vim-project/doc/tags | 12 + dot_vim/plugged/vim-project/dot_git/HEAD | 1 + .../vim-project/dot_git/branches/.keep | 0 dot_vim/plugged/vim-project/dot_git/config | 11 + .../plugged/vim-project/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../vim-project/dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vim-project/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vim-project/dot_git/index | Bin 0 -> 292 bytes .../plugged/vim-project/dot_git/info/exclude | 6 + dot_vim/plugged/vim-project/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../vim-project/dot_git/objects/info/.keep | 0 ...8bf7a3741e7dee6448877b461f9a4de96d5f6b.idx | Bin 0 -> 1240 bytes ...bf7a3741e7dee6448877b461f9a4de96d5f6b.pack | Bin 0 -> 25774 bytes .../plugged/vim-project/dot_git/packed-refs | 2 + .../vim-project/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../vim-project/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vim-project/dot_git/shallow | 1 + .../plugged/vim-project/plugin/project.vim | 1293 + dot_vim/plugged/vim-surround/README.markdown | 98 + dot_vim/plugged/vim-surround/doc/surround.txt | 205 + dot_vim/plugged/vim-surround/doc/tags | 17 + dot_vim/plugged/vim-surround/dot_git/HEAD | 1 + .../vim-surround/dot_git/branches/.keep | 0 dot_vim/plugged/vim-surround/dot_git/config | 11 + .../plugged/vim-surround/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vim-surround/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vim-surround/dot_git/index | Bin 0 -> 572 bytes .../plugged/vim-surround/dot_git/info/exclude | 6 + .../plugged/vim-surround/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../vim-surround/dot_git/objects/info/.keep | 0 ...0b6b55db4f5d42be498095200e778ac4bd3017.idx | Bin 0 -> 2192 bytes ...b6b55db4f5d42be498095200e778ac4bd3017.pack | Bin 0 -> 18246 bytes .../plugged/vim-surround/dot_git/packed-refs | 10 + .../vim-surround/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../vim-surround/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vim-surround/dot_git/shallow | 5 + .../vim-surround/dot_github/FUNDING.yml | 2 + dot_vim/plugged/vim-surround/dot_gitignore | 1 + .../plugged/vim-surround/plugin/surround.vim | 630 + dot_vim/plugged/vim-vsnip-integ/LICENSE | 21 + dot_vim/plugged/vim-vsnip-integ/README.md | 48 + .../after/plugin/vsnip_integ.vim | 1 + .../vim-vsnip-integ/autoload/vsnip_integ.vim | 318 + .../autoload/vsnip_integ/detection.vim | 37 + .../autoload/vsnip_integ/integration.vim | 26 + .../vsnip_integ/integration/asyncomplete.vim | 55 + .../autoload/vsnip_integ/integration/lcn.vim | 7 + .../autoload/vsnip_integ/integration/lsc.vim | 7 + .../vsnip_integ/integration/mucomplete.vim | 31 + .../vsnip_integ/integration/vimlsp.vim | 32 + .../vsnip_integ/integration/yegappan_lsp.vim | 7 + .../denops/@ddc-sources/vsnip.ts | 22 + dot_vim/plugged/vim-vsnip-integ/doc/tags | 5 + .../vim-vsnip-integ/doc/vsnip_integ.txt | 38 + dot_vim/plugged/vim-vsnip-integ/dot_git/HEAD | 1 + .../vim-vsnip-integ/dot_git/branches/.keep | 0 .../plugged/vim-vsnip-integ/dot_git/config | 11 + .../vim-vsnip-integ/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../dot_git/hooks/pre-push.sample | 53 + .../dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../dot_git/hooks/update.sample | 128 + dot_vim/plugged/vim-vsnip-integ/dot_git/index | Bin 0 -> 1975 bytes .../vim-vsnip-integ/dot_git/info/exclude | 6 + .../plugged/vim-vsnip-integ/dot_git/logs/HEAD | 2 + .../dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../dot_git/objects/info/.keep | 0 ...66ec94e158c19f7b32cbd024043f67d34e6efd.idx | Bin 0 -> 6364 bytes ...6ec94e158c19f7b32cbd024043f67d34e6efd.pack | Bin 0 -> 31369 bytes .../vim-vsnip-integ/dot_git/packed-refs | 14 + .../vim-vsnip-integ/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../vim-vsnip-integ/dot_git/refs/tags/.keep | 0 .../plugged/vim-vsnip-integ/dot_git/shallow | 13 + dot_vim/plugged/vim-vsnip-integ/dot_gitignore | 3 + .../plugged/vim-vsnip-integ/empty_dot_vimrc | 0 .../vim-vsnip-integ/plugin/vsnip_integ.vim | 17 + dot_vim/plugged/vim-vsnip/LICENSE | 21 + dot_vim/plugged/vim-vsnip/README.md | 199 + .../vim-vsnip/autoload/vital/_vsnip.vim | 9 + .../autoload/vital/_vsnip/VS/LSP/Diff.vim | 164 + .../autoload/vital/_vsnip/VS/LSP/Position.vim | 62 + .../autoload/vital/_vsnip/VS/LSP/Text.vim | 23 + .../autoload/vital/_vsnip/VS/LSP/TextEdit.vim | 185 + .../autoload/vital/_vsnip/VS/Vim/Buffer.vim | 126 + .../autoload/vital/_vsnip/VS/Vim/Option.vim | 21 + .../vim-vsnip/autoload/vital/vsnip.vim | 330 + .../vim-vsnip/autoload/vital/vsnip.vital | 6 + dot_vim/plugged/vim-vsnip/autoload/vsnip.vim | 243 + .../vim-vsnip/autoload/vsnip/indent.vim | 61 + .../autoload/vsnip/parser/combinator.vim | 223 + .../vim-vsnip/autoload/vsnip/range.vim | 10 + .../vim-vsnip/autoload/vsnip/session.vim | 260 + .../vim-vsnip/autoload/vsnip/snippet.vim | 557 + .../vim-vsnip/autoload/vsnip/snippet/node.vim | 43 + .../vsnip/snippet/node/placeholder.vim | 55 + .../autoload/vsnip/snippet/node/text.vim | 38 + .../autoload/vsnip/snippet/node/transform.vim | 112 + .../autoload/vsnip/snippet/node/variable.vim | 63 + .../autoload/vsnip/snippet/parser.vim | 212 + .../vim-vsnip/autoload/vsnip/source.vim | 116 + .../autoload/vsnip/source/snipmate.vim | 88 + .../autoload/vsnip/source/user_snippet.vim | 69 + .../autoload/vsnip/source/vscode.vim | 104 + .../vim-vsnip/autoload/vsnip/variable.vim | 189 + dot_vim/plugged/vim-vsnip/doc/tags | 12 + dot_vim/plugged/vim-vsnip/doc/vsnip.txt | 323 + dot_vim/plugged/vim-vsnip/dot_git/HEAD | 1 + .../plugged/vim-vsnip/dot_git/branches/.keep | 0 dot_vim/plugged/vim-vsnip/dot_git/config | 11 + dot_vim/plugged/vim-vsnip/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../vim-vsnip/dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../vim-vsnip/dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../vim-vsnip/dot_git/hooks/pre-push.sample | 53 + .../vim-vsnip/dot_git/hooks/pre-rebase.sample | 169 + .../dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vim-vsnip/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vim-vsnip/dot_git/index | Bin 0 -> 6021 bytes .../plugged/vim-vsnip/dot_git/info/exclude | 6 + dot_vim/plugged/vim-vsnip/dot_git/logs/HEAD | 2 + .../vim-vsnip/dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../vim-vsnip/dot_git/objects/info/.keep | 0 ...2c2121c3c98497a9bd4dea2843e7305a5943fa.idx | Bin 0 -> 8352 bytes ...c2121c3c98497a9bd4dea2843e7305a5943fa.pack | Bin 0 -> 84282 bytes dot_vim/plugged/vim-vsnip/dot_git/packed-refs | 8 + .../vim-vsnip/dot_git/refs/heads/master | 1 + .../dot_git/refs/remotes/origin/HEAD | 1 + .../plugged/vim-vsnip/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vim-vsnip/dot_git/shallow | 7 + .../dot_github/workflows/linux_neovim.yml | 49 + .../dot_github/workflows/linux_vim.yml | 50 + .../dot_github/workflows/mac_neovim.yml | 49 + .../dot_github/workflows/windows_neovim.yml | 50 + .../dot_github/workflows/windows_vim.yml | 56 + dot_vim/plugged/vim-vsnip/dot_gitignore | 2 + dot_vim/plugged/vim-vsnip/dot_npmrc | 1 + dot_vim/plugged/vim-vsnip/dot_themisrc | 58 + dot_vim/plugged/vim-vsnip/dot_vimrc | 47 + .../plugged/vim-vsnip/ftplugin/snippets.vim | 39 + dot_vim/plugged/vim-vsnip/indent/snippets.vim | 55 + .../plugged/vim-vsnip/misc/basic_spec.json | 16 + .../plugged/vim-vsnip/misc/integration.json | 185 + .../plugged/vim-vsnip/misc/snipmate.snippets | 6 + .../plugged/vim-vsnip/misc/source_spec.json | 13 + .../misc/source_spec_vscode/package.json | 10 + .../source_spec_vscode.json | 10 + dot_vim/plugged/vim-vsnip/package.json | 38 + dot_vim/plugged/vim-vsnip/plugin/vsnip.vim | 225 + .../vim-vsnip/spec/autoload/vsnip.vimspec | 149 + .../spec/autoload/vsnip/indent.vimspec | 129 + .../spec/autoload/vsnip/snippet.vimspec | 573 + .../autoload/vsnip/snippet/parser.vimspec | 231 + .../spec/autoload/vsnip/source.vimspec | 97 + .../vim-vsnip/spec/plugin/vsnip.vimspec | 709 + dot_vim/plugged/vim-vsnip/syntax/snippets.vim | 45 + dot_vim/plugged/vimtex/CONTRIBUTING.md | 81 + dot_vim/plugged/vimtex/DOCUMENTATION.md | 381 + dot_vim/plugged/vimtex/LICENSE.md | 21 + dot_vim/plugged/vimtex/README.md | 344 + dot_vim/plugged/vimtex/VISUALS.md | 222 + dot_vim/plugged/vimtex/after/ftplugin/tex.vim | 27 + .../vimtex/assets/json/fontawesome.json | 1458 + .../plugged/vimtex/autoload/health/vimtex.vim | 155 + .../vimtex/autoload/unite/sources/vimtex.vim | 83 + dot_vim/plugged/vimtex/autoload/vimtex.vim | 399 + .../plugged/vimtex/autoload/vimtex/bib.vim | 121 + .../plugged/vimtex/autoload/vimtex/cache.vim | 325 + .../plugged/vimtex/autoload/vimtex/cmd.vim | 744 + .../vimtex/autoload/vimtex/compiler.vim | 422 + .../autoload/vimtex/compiler/_template.vim | 478 + .../vimtex/autoload/vimtex/compiler/arara.vim | 31 + .../autoload/vimtex/compiler/generic.vim | 31 + .../autoload/vimtex/compiler/latexmk.vim | 224 + .../autoload/vimtex/compiler/latexrun.vim | 52 + .../autoload/vimtex/compiler/tectonic.vim | 48 + .../vimtex/autoload/vimtex/complete.vim | 968 + .../vimtex/autoload/vimtex/complete/abntcite | 8 + .../vimtex/autoload/vimtex/complete/acro | 33 + .../vimtex/autoload/vimtex/complete/acronym | 29 + .../vimtex/autoload/vimtex/complete/afterpage | 1 + .../autoload/vimtex/complete/algorithm2e | 205 + .../vimtex/autoload/vimtex/complete/allrunes | 31 + .../vimtex/autoload/vimtex/complete/amsbsy | 1 + .../vimtex/autoload/vimtex/complete/amsfonts | 17 + .../vimtex/autoload/vimtex/complete/amsmath | 93 + .../vimtex/autoload/vimtex/complete/amsopn | 8 + .../vimtex/autoload/vimtex/complete/amssymb | 199 + .../vimtex/autoload/vimtex/complete/amsthm | 6 + .../vimtex/autoload/vimtex/complete/appendix | 21 + .../vimtex/autoload/vimtex/complete/array | 7 + .../autoload/vimtex/complete/attachfile | 5 + .../vimtex/autoload/vimtex/complete/babel | 72 + .../autoload/vimtex/complete/beamerfoils | 9 + .../autoload/vimtex/complete/beamerprosper | 33 + .../autoload/vimtex/complete/beamerseminar | 8 + .../autoload/vimtex/complete/beamertexpower | 18 + .../autoload/vimtex/complete/beamerthemeFhG | 26 + .../vimtex/autoload/vimtex/complete/biblatex | 203 + .../vimtex/autoload/vimtex/complete/bm | 7 + .../vimtex/autoload/vimtex/complete/booktabs | 7 + .../vimtex/autoload/vimtex/complete/braket | 2 + .../vimtex/autoload/vimtex/complete/calc | 9 + .../vimtex/autoload/vimtex/complete/cancel | 5 + .../vimtex/autoload/vimtex/complete/caption | 20 + .../vimtex/autoload/vimtex/complete/cases | 2 + .../autoload/vimtex/complete/chemformula | 42 + .../vimtex/autoload/vimtex/complete/chemstyle | 20 + .../autoload/vimtex/complete/circuitikz | 92 + .../autoload/vimtex/complete/class-beamer | 235 + .../autoload/vimtex/complete/class-book | 3 + .../autoload/vimtex/complete/class-letter | 10 + .../autoload/vimtex/complete/class-memoir | 1207 + .../autoload/vimtex/complete/class-moderncv | 37 + .../autoload/vimtex/complete/class-scrartcl | 1 + .../complete/class-scrartcl,scrreprt,scrbook | 95 + .../autoload/vimtex/complete/class-scrbook | 1 + .../autoload/vimtex/complete/class-scrlttr2 | 78 + .../autoload/vimtex/complete/class-scrreprt | 1 + .../vimtex/autoload/vimtex/complete/cleveref | 36 + .../vimtex/autoload/vimtex/complete/color | 6 + .../vimtex/autoload/vimtex/complete/colortbl | 5 + .../vimtex/autoload/vimtex/complete/commath | 22 + .../vimtex/autoload/vimtex/complete/comment | 7 + .../vimtex/autoload/vimtex/complete/coordsys | 22 + .../vimtex/autoload/vimtex/complete/cquthesis | 72 + .../vimtex/autoload/vimtex/complete/csquotes | 58 + .../vimtex/autoload/vimtex/complete/currvita | 10 + .../vimtex/autoload/vimtex/complete/cyrillic | 157 + .../vimtex/autoload/vimtex/complete/datatool | 157 + .../autoload/vimtex/complete/datatool-base | 144 + .../vimtex/autoload/vimtex/complete/default | 820 + .../vimtex/autoload/vimtex/complete/diagxy | 33 + .../vimtex/autoload/vimtex/complete/doi | 1 + .../vimtex/autoload/vimtex/complete/empheq | 46 + .../autoload/vimtex/complete/empty_enumerate | 0 .../autoload/vimtex/complete/empty_german | 0 .../autoload/vimtex/complete/empty_latex-209 | 0 .../vimtex/complete/empty_latex-mathsymbols | 0 .../autoload/vimtex/complete/empty_ngerman | 0 .../autoload/vimtex/complete/empty_parskip | 0 .../vimtex/autoload/vimtex/complete/epigraph | 15 + .../vimtex/autoload/vimtex/complete/epstopdf | 10 + .../vimtex/autoload/vimtex/complete/etoolbox | 157 + .../vimtex/autoload/vimtex/complete/eurosym | 5 + .../vimtex/autoload/vimtex/complete/fancybox | 36 + .../vimtex/autoload/vimtex/complete/fancyhdr | 18 + .../autoload/vimtex/complete/fancyunits-base | 153 + .../autoload/vimtex/complete/fancyunits-np | 56 + .../autoload/vimtex/complete/fancyunits-per | 67 + .../vimtex/complete/fancyunits_big-fractions | 54 + .../complete/fancyunits_medium-fractions | 54 + .../complete/fancyunits_small-fractions | 54 + .../vimtex/autoload/vimtex/complete/fancyvrb | 8 + .../vimtex/complete/fhgtechdoku_additional | 9 + .../vimtex/autoload/vimtex/complete/fixme | 22 + .../vimtex/autoload/vimtex/complete/float | 6 + .../vimtex/autoload/vimtex/complete/fontspec | 20 + .../vimtex/autoload/vimtex/complete/geometry | 5 + .../autoload/vimtex/complete/glossaries | 448 + .../vimtex/autoload/vimtex/complete/glosstex | 16 + .../vimtex/autoload/vimtex/complete/graphicx | 11 + .../vimtex/autoload/vimtex/complete/harvard | 23 + .../vimtex/autoload/vimtex/complete/hyperref | 40 + .../vimtex/autoload/vimtex/complete/ifluatex | 4 + .../vimtex/autoload/vimtex/complete/ifpdf | 2 + .../vimtex/autoload/vimtex/complete/iftex | 7 + .../vimtex/autoload/vimtex/complete/ifthen | 10 + .../vimtex/autoload/vimtex/complete/ifvtex | 7 + .../vimtex/autoload/vimtex/complete/ifxetex | 3 + .../vimtex/autoload/vimtex/complete/import | 8 + .../vimtex/autoload/vimtex/complete/jurabib | 18 + .../autoload/vimtex/complete/kantlipsum | 5 + .../vimtex/autoload/vimtex/complete/latex-dev | 22 + .../autoload/vimtex/complete/latex-document | 3 + .../autoload/vimtex/complete/latex-l2tabu | 7 + .../vimtex/autoload/vimtex/complete/layout | 1 + .../autoload/vimtex/complete/letltxmacro | 2 + .../vimtex/autoload/vimtex/complete/libertine | 86 + .../vimtex/autoload/vimtex/complete/lipsum | 4 + .../vimtex/autoload/vimtex/complete/listings | 13 + .../vimtex/autoload/vimtex/complete/logsys | 19 + .../vimtex/autoload/vimtex/complete/longtable | 14 + .../vimtex/autoload/vimtex/complete/lscape | 1 + .../vimtex/autoload/vimtex/complete/ltxtable | 3 + .../vimtex/autoload/vimtex/complete/luatex | 47 + .../autoload/vimtex/complete/luatodonotes | 3 + .../vimtex/autoload/vimtex/complete/manyfoot | 12 + .../vimtex/autoload/vimtex/complete/marvosym | 219 + .../vimtex/autoload/vimtex/complete/mathtools | 108 + .../vimtex/autoload/vimtex/complete/mdframed | 7 + .../vimtex/autoload/vimtex/complete/mdwlist | 10 + .../vimtex/autoload/vimtex/complete/memhfixc | 15 + .../vimtex/autoload/vimtex/complete/menukeys | 41 + .../vimtex/autoload/vimtex/complete/metrix | 9 + .../vimtex/autoload/vimtex/complete/mhchem | 16 + .../vimtex/autoload/vimtex/complete/microtype | 21 + .../vimtex/autoload/vimtex/complete/minted | 21 + .../vimtex/autoload/vimtex/complete/multicol | 7 + .../vimtex/autoload/vimtex/complete/multido | 1 + .../autoload/vimtex/complete/multimedia | 2 + .../vimtex/autoload/vimtex/complete/multirow | 1 + .../vimtex/autoload/vimtex/complete/nameref | 2 + .../vimtex/autoload/vimtex/complete/natbib | 28 + .../vimtex/autoload/vimtex/complete/needspace | 3 + .../vimtex/autoload/vimtex/complete/newclude | 19 + .../vimtex/autoload/vimtex/complete/nicefrac | 1 + .../vimtex/autoload/vimtex/complete/nomencl | 9 + .../vimtex/autoload/vimtex/complete/paracol | 17 + .../vimtex/autoload/vimtex/complete/pdfpages | 10 + .../vimtex/autoload/vimtex/complete/pgf | 2 + .../vimtex/autoload/vimtex/complete/pgfcore | 256 + .../vimtex/autoload/vimtex/complete/pgfplots | 8 + .../vimtex/autoload/vimtex/complete/physics | 163 + .../vimtex/autoload/vimtex/complete/pifont | 11 + .../vimtex/autoload/vimtex/complete/placeins | 1 + .../vimtex/autoload/vimtex/complete/psfrag | 5 + .../vimtex/autoload/vimtex/complete/pst-3d | 5 + .../vimtex/autoload/vimtex/complete/pst-blur | 1 + .../vimtex/autoload/vimtex/complete/pst-char | 7 + .../vimtex/autoload/vimtex/complete/pst-coil | 6 + .../vimtex/autoload/vimtex/complete/pst-eps | 4 + .../vimtex/autoload/vimtex/complete/pst-fill | 2 + .../vimtex/autoload/vimtex/complete/pst-node | 94 + .../vimtex/autoload/vimtex/complete/pst-plot | 18 + .../vimtex/autoload/vimtex/complete/pst-text | 1 + .../vimtex/autoload/vimtex/complete/pst-tree | 24 + .../vimtex/autoload/vimtex/complete/pstricks | 124 + .../vimtex/autoload/vimtex/complete/rotating | 2 + .../vimtex/autoload/vimtex/complete/scraddr | 13 + .../vimtex/autoload/vimtex/complete/scrdate | 2 + .../vimtex/autoload/vimtex/complete/scrlfile | 8 + .../vimtex/autoload/vimtex/complete/scrpage2 | 33 + .../vimtex/autoload/vimtex/complete/scrtime | 3 + .../vimtex/autoload/vimtex/complete/secsty | 15 + .../vimtex/autoload/vimtex/complete/setspace | 9 + .../vimtex/autoload/vimtex/complete/siunitx | 122 + .../autoload/vimtex/complete/siunitx-special | 19 + .../autoload/vimtex/complete/subcaption | 8 + .../vimtex/autoload/vimtex/complete/subfig | 8 + .../vimtex/autoload/vimtex/complete/subfigure | 19 + .../vimtex/autoload/vimtex/complete/subfiles | 2 + .../autoload/vimtex/complete/supertabular | 13 + .../vimtex/autoload/vimtex/complete/svn-multi | 37 + .../vimtex/autoload/vimtex/complete/svninfo | 15 + .../vimtex/autoload/vimtex/complete/tabu | 19 + .../vimtex/autoload/vimtex/complete/tabularx | 4 + .../vimtex/autoload/vimtex/complete/tabulary | 1 + .../vimtex/autoload/vimtex/complete/tex | 378 + .../vimtex/autoload/vimtex/complete/textcomp | 109 + .../vimtex/autoload/vimtex/complete/theorem | 5 + .../vimtex/autoload/vimtex/complete/tikz | 48 + .../vimtex/autoload/vimtex/complete/tikz-cd | 3 + .../autoload/vimtex/complete/tikz-timing | 47 + .../vimtex/autoload/vimtex/complete/titlesec | 46 + .../vimtex/autoload/vimtex/complete/tocbibind | 13 + .../vimtex/autoload/vimtex/complete/tocloft | 152 + .../vimtex/autoload/vimtex/complete/todonotes | 3 + .../complete/tools/executable_convert-cwl | 47 + .../tools/executable_symbols-merge.py | 34 + .../tools/executable_symbols-parse-json.py | 14 + .../autoload/vimtex/complete/tools/symbols | 2612 ++ .../vimtex/complete/tools/symbols-collected | 342 + .../vimtex/complete/tools/symbols-generated | 2398 ++ .../vimtex/complete/tools/symbols-json | 500 + .../vimtex/complete/tools/symbols.json | 1 + .../vimtex/complete/tools/unicode-math/README | 2 + .../tools/unicode-math/generate-symbols.tex | 26 + .../vimtex/autoload/vimtex/complete/ulem | 7 + .../vimtex/autoload/vimtex/complete/units | 3 + .../vimtex/autoload/vimtex/complete/upgreek | 40 + .../vimtex/autoload/vimtex/complete/url | 13 + .../vimtex/autoload/vimtex/complete/varioref | 21 + .../vimtex/autoload/vimtex/complete/verse | 24 + .../autoload/vimtex/complete/virginialake | 129 + .../vimtex/autoload/vimtex/complete/wasysym | 121 + .../vimtex/autoload/vimtex/complete/xcolor | 15 + .../vimtex/autoload/vimtex/complete/xetex | 64 + .../vimtex/autoload/vimtex/complete/xifthen | 16 + .../vimtex/autoload/vimtex/complete/xkeyval | 1 + .../vimtex/autoload/vimtex/complete/xltxtra | 11 + .../vimtex/autoload/vimtex/complete/xparse | 7 + .../vimtex/autoload/vimtex/complete/xspace | 3 + .../vimtex/autoload/vimtex/complete/xtab | 15 + .../vimtex/autoload/vimtex/complete/xy | 8 + .../vimtex/autoload/vimtex/complete/yathesis | 83 + .../vimtex/autoload/vimtex/complete/yfonts | 15 + .../vimtex/autoload/vimtex/context.vim | 68 + .../vimtex/autoload/vimtex/context/cite.vim | 193 + .../plugged/vimtex/autoload/vimtex/debug.vim | 109 + .../plugged/vimtex/autoload/vimtex/delim.vim | 1182 + .../plugged/vimtex/autoload/vimtex/doc.vim | 273 + .../vimtex/autoload/vimtex/doc/handlers.vim | 15 + .../plugged/vimtex/autoload/vimtex/env.vim | 459 + .../plugged/vimtex/autoload/vimtex/fold.vim | 152 + .../vimtex/autoload/vimtex/fold/bib.vim | 110 + .../autoload/vimtex/fold/cmd_addplot.vim | 47 + .../vimtex/autoload/vimtex/fold/cmd_multi.vim | 47 + .../autoload/vimtex/fold/cmd_single.vim | 48 + .../autoload/vimtex/fold/cmd_single_opt.vim | 49 + .../vimtex/autoload/vimtex/fold/comments.vim | 43 + .../autoload/vimtex/fold/env_options.vim | 49 + .../vimtex/autoload/vimtex/fold/envs.vim | 207 + .../vimtex/autoload/vimtex/fold/items.vim | 66 + .../vimtex/autoload/vimtex/fold/markers.vim | 56 + .../vimtex/autoload/vimtex/fold/preamble.vim | 32 + .../vimtex/autoload/vimtex/fold/sections.vim | 181 + .../plugged/vimtex/autoload/vimtex/format.vim | 187 + .../plugged/vimtex/autoload/vimtex/fzf.vim | 116 + .../plugged/vimtex/autoload/vimtex/imaps.vim | 179 + .../vimtex/autoload/vimtex/include.vim | 167 + .../plugged/vimtex/autoload/vimtex/info.vim | 222 + .../plugged/vimtex/autoload/vimtex/jobs.vim | 79 + .../vimtex/autoload/vimtex/jobs/neovim.vim | 177 + .../vimtex/autoload/vimtex/jobs/vim.vim | 201 + .../vimtex/autoload/vimtex/kpsewhich.vim | 61 + .../plugged/vimtex/autoload/vimtex/log.vim | 160 + .../vimtex/autoload/vimtex/matchparen.vim | 103 + .../plugged/vimtex/autoload/vimtex/misc.vim | 153 + .../plugged/vimtex/autoload/vimtex/motion.vim | 350 + .../plugged/vimtex/autoload/vimtex/nvim.vim | 19 + .../vimtex/autoload/vimtex/options.vim | 628 + .../plugged/vimtex/autoload/vimtex/parser.vim | 156 + .../autoload/vimtex/parser/auxiliary.vim | 165 + .../vimtex/autoload/vimtex/parser/bib.vim | 459 + .../vimtex/autoload/vimtex/parser/fls.vim | 15 + .../vimtex/autoload/vimtex/parser/tex.vim | 278 + .../vimtex/autoload/vimtex/parser/toc.vim | 315 + .../vimtex/parser/toc/beamer_frame.vim | 36 + .../vimtex/parser/toc/bibliography.vim | 112 + .../autoload/vimtex/parser/toc/include.vim | 38 + .../vimtex/parser/toc/include_biblatex.vim | 39 + .../vimtex/parser/toc/include_bibtex.vim | 47 + .../vimtex/parser/toc/include_graphics.vim | 42 + .../vimtex/parser/toc/include_vimtex.vim | 39 + .../autoload/vimtex/parser/toc/index.vim | 16 + .../autoload/vimtex/parser/toc/labels.vim | 52 + .../autoload/vimtex/parser/toc/parts.vim | 25 + .../autoload/vimtex/parser/toc/preamble.vim | 33 + .../autoload/vimtex/parser/toc/section.vim | 99 + .../vimtex/parser/toc/table_of_contents.vim | 16 + .../autoload/vimtex/parser/toc/titlepage.vim | 16 + .../vimtex/parser/toc/todo_comments.vim | 36 + .../autoload/vimtex/parser/toc/todo_fixme.vim | 65 + .../autoload/vimtex/parser/toc/todo_notes.vim | 55 + .../autoload/vimtex/parser/vimcomplete.bst | 320 + .../plugged/vimtex/autoload/vimtex/paths.vim | 109 + .../plugged/vimtex/autoload/vimtex/pos.vim | 93 + .../vimtex/autoload/vimtex/profile.vim | 134 + dot_vim/plugged/vimtex/autoload/vimtex/qf.vim | 223 + .../vimtex/autoload/vimtex/qf/biblatex.vim | 251 + .../vimtex/autoload/vimtex/qf/bibtex.vim | 190 + .../vimtex/autoload/vimtex/qf/latexlog.vim | 232 + .../vimtex/autoload/vimtex/qf/pplatex.vim | 96 + .../vimtex/autoload/vimtex/qf/pulp.vim | 60 + .../plugged/vimtex/autoload/vimtex/qf/u.vim | 18 + dot_vim/plugged/vimtex/autoload/vimtex/re.vim | 125 + .../vimtex/autoload/vimtex/scratch.vim | 69 + .../plugged/vimtex/autoload/vimtex/state.vim | 548 + .../vimtex/autoload/vimtex/state/class.vim | 264 + .../plugged/vimtex/autoload/vimtex/syntax.vim | 38 + .../vimtex/autoload/vimtex/syntax/core.vim | 2095 ++ .../vimtex/autoload/vimtex/syntax/nested.vim | 68 + .../autoload/vimtex/syntax/p/amsmath.vim | 111 + .../autoload/vimtex/syntax/p/amssymb.vim | 214 + .../autoload/vimtex/syntax/p/amsthm.vim | 29 + .../vimtex/autoload/vimtex/syntax/p/array.vim | 64 + .../autoload/vimtex/syntax/p/asymptote.vim | 20 + .../vimtex/autoload/vimtex/syntax/p/babel.vim | 17 + .../autoload/vimtex/syntax/p/beamer.vim | 23 + .../autoload/vimtex/syntax/p/biblatex.vim | 77 + .../autoload/vimtex/syntax/p/booktabs.vim | 14 + .../vimtex/autoload/vimtex/syntax/p/breqn.vim | 16 + .../vimtex/autoload/vimtex/syntax/p/cases.vim | 13 + .../autoload/vimtex/syntax/p/chemformula.vim | 33 + .../autoload/vimtex/syntax/p/circuitikz.vim | 20 + .../autoload/vimtex/syntax/p/cleveref.vim | 60 + .../autoload/vimtex/syntax/p/comment.vim | 18 + .../autoload/vimtex/syntax/p/csquotes.vim | 16 + .../autoload/vimtex/syntax/p/dot2texi.vim | 13 + .../vimtex/autoload/vimtex/syntax/p/fixme.vim | 44 + .../autoload/vimtex/syntax/p/fontawesome5.vim | 52 + .../autoload/vimtex/syntax/p/geometry.vim | 15 + .../autoload/vimtex/syntax/p/glossaries.vim | 44 + .../vimtex/syntax/p/glossaries_extra.vim | 11 + .../autoload/vimtex/syntax/p/gnuplottex.vim | 13 + .../autoload/vimtex/syntax/p/hyperref.vim | 54 + .../vimtex/syntax/p/ieeetrantools.vim | 23 + .../autoload/vimtex/syntax/p/listings.vim | 97 + .../autoload/vimtex/syntax/p/luacode.vim | 42 + .../autoload/vimtex/syntax/p/markdown.vim | 15 + .../autoload/vimtex/syntax/p/mathtools.vim | 35 + .../vimtex/autoload/vimtex/syntax/p/mhequ.vim | 13 + .../autoload/vimtex/syntax/p/minted.vim | 232 + .../autoload/vimtex/syntax/p/mleftright.vim | 68 + .../autoload/vimtex/syntax/p/moreverb.vim | 13 + .../autoload/vimtex/syntax/p/nameref.vim | 13 + .../autoload/vimtex/syntax/p/natbib.vim | 38 + .../autoload/vimtex/syntax/p/optidef.vim | 14 + .../autoload/vimtex/syntax/p/pdfpages.vim | 11 + .../autoload/vimtex/syntax/p/pgfplots.vim | 58 + .../autoload/vimtex/syntax/p/pyluatex.vim | 18 + .../autoload/vimtex/syntax/p/pythontex.vim | 24 + .../autoload/vimtex/syntax/p/sagetex.vim | 25 + .../autoload/vimtex/syntax/p/siunitx.vim | 61 + .../autoload/vimtex/syntax/p/subfile.vim | 12 + .../autoload/vimtex/syntax/p/tabularx.vim | 31 + .../autoload/vimtex/syntax/p/tcolorbox.vim | 39 + .../vimtex/autoload/vimtex/syntax/p/tikz.vim | 45 + .../autoload/vimtex/syntax/p/todonotes.vim | 16 + .../vimtex/autoload/vimtex/syntax/p/url.vim | 11 + .../autoload/vimtex/syntax/p/varioref.vim | 11 + .../vimtex/autoload/vimtex/syntax/p/wiki.vim | 18 + .../autoload/vimtex/syntax/packages.vim | 64 + .../plugged/vimtex/autoload/vimtex/test.vim | 111 + .../vimtex/autoload/vimtex/text_obj.vim | 512 + .../autoload/vimtex/text_obj/cmdtargets.vim | 81 + .../autoload/vimtex/text_obj/envtargets.vim | 106 + .../autoload/vimtex/text_obj/targets.vim | 45 + .../plugged/vimtex/autoload/vimtex/toc.vim | 832 + dot_vim/plugged/vimtex/autoload/vimtex/ui.vim | 285 + .../plugged/vimtex/autoload/vimtex/util.vim | 491 + .../plugged/vimtex/autoload/vimtex/view.vim | 200 + .../vimtex/autoload/vimtex/view/_template.vim | 268 + .../vimtex/autoload/vimtex/view/general.vim | 65 + .../vimtex/autoload/vimtex/view/mupdf.vim | 135 + .../vimtex/autoload/vimtex/view/sioyek.vim | 56 + .../vimtex/autoload/vimtex/view/skim.vim | 76 + .../vimtex/autoload/vimtex/view/zathura.vim | 116 + dot_vim/plugged/vimtex/cliff.toml | 33 + dot_vim/plugged/vimtex/compiler/bibertool.vim | 17 + dot_vim/plugged/vimtex/compiler/chktex.vim | 18 + dot_vim/plugged/vimtex/compiler/lacheck.vim | 11 + .../plugged/vimtex/compiler/style-check.vim | 15 + dot_vim/plugged/vimtex/compiler/textidote.vim | 51 + dot_vim/plugged/vimtex/compiler/vlty.vim | 148 + dot_vim/plugged/vimtex/doc/tags | 460 + .../vimtex/doc/targets-textobj-cheatsheet.md | 158 + dot_vim/plugged/vimtex/doc/vimtex.txt | 6503 ++++ dot_vim/plugged/vimtex/docker/Dockerfile | 36 + dot_vim/plugged/vimtex/dot_git/HEAD | 1 + dot_vim/plugged/vimtex/dot_git/branches/.keep | 0 dot_vim/plugged/vimtex/dot_git/config | 11 + dot_vim/plugged/vimtex/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../vimtex/dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../vimtex/dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../vimtex/dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../vimtex/dot_git/hooks/pre-push.sample | 53 + .../vimtex/dot_git/hooks/pre-rebase.sample | 169 + .../vimtex/dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vimtex/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vimtex/dot_git/index | Bin 0 -> 112652 bytes dot_vim/plugged/vimtex/dot_git/info/exclude | 6 + dot_vim/plugged/vimtex/dot_git/logs/HEAD | 2 + .../vimtex/dot_git/logs/refs/heads/master | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../plugged/vimtex/dot_git/objects/info/.keep | 0 ...81e8592b23b0b3d795a76def72f0ff6822109a.idx | Bin 0 -> 99016 bytes ...1e8592b23b0b3d795a76def72f0ff6822109a.pack | Bin 0 -> 2776076 bytes dot_vim/plugged/vimtex/dot_git/packed-refs | 26 + .../plugged/vimtex/dot_git/refs/heads/master | 1 + .../vimtex/dot_git/refs/remotes/origin/HEAD | 1 + .../plugged/vimtex/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vimtex/dot_git/shallow | 25 + .../ISSUE_TEMPLATE/feature_request.md | 24 + .../ISSUE_TEMPLATE/issue_report.md.disabled | 55 + .../ISSUE_TEMPLATE/issue_report.yml | 85 + .../vimtex/dot_github/workflows/main.yml | 48 + dot_vim/plugged/vimtex/dot_gitignore | 6 + dot_vim/plugged/vimtex/dot_vintrc.yaml | 3 + dot_vim/plugged/vimtex/ftdetect/cls.vim | 9 + dot_vim/plugged/vimtex/ftdetect/tex.vim | 15 + dot_vim/plugged/vimtex/ftdetect/tikz.vim | 9 + dot_vim/plugged/vimtex/ftplugin/bib.vim | 25 + dot_vim/plugged/vimtex/ftplugin/tex.vim | 34 + dot_vim/plugged/vimtex/indent/bib.vim | 81 + dot_vim/plugged/vimtex/indent/tex.vim | 332 + dot_vim/plugged/vimtex/plugin/vimtex.vim | 25 + .../rplugin/python3/denite/source/vimtex.py | 46 + dot_vim/plugged/vimtex/syntax/tex.vim | 47 + dot_vim/plugged/vimtex/test/Makefile | 36 + dot_vim/plugged/vimtex/test/common/huge.bib | 16683 ++++++++++ dot_vim/plugged/vimtex/test/common/local1.bib | 4 + dot_vim/plugged/vimtex/test/common/local2.bib | 4 + .../test/example-book-multifile/appendix.tex | 35 + .../example-book-multifile/backmatter.tex | 27 + .../test/example-book-multifile/book.bib | 3 + .../test/example-book-multifile/chapters.tex | 87 + .../example-book-multifile/empty_test.jpg | 0 .../example-book-multifile/frontmatter.tex | 9 + .../test/example-book-multifile/main.tex | 38 + .../test/example-book-multifile/minivimrc | 46 + .../test/example-book-multifile/preamble.tex | 5 + .../test/example-book-multifile/sections.tex | 1 + .../test/example-book-multifile/test.tikz | 3 + .../plugged/vimtex/test/example-book/main.tex | 128 + .../vimtex/test/example-minimal/main.tex | 4 + .../vimtex/test/example-minimal/minivimrc | 21 + .../jobs-capture-cached.vim | 21 + .../vimtex/test/example-quick-start/main.tex | 153 + .../vimtex/test/example-quickfix/main.log | 61 + .../vimtex/test/example-quickfix/main.tex | 6 + .../test/example-startup-timing/Makefile | 9 + .../test/example-startup-timing/minivimrc | 12 + .../test/example-startup-timing/thesis.tex | 26771 ++++++++++++++++ .../vimtex/test/test-bibfiles/Makefile | 14 + .../vimtex/test/test-bibfiles/test_revtex.tex | 6 + .../vimtex/test/test-bibfiles/test_revtex.vim | 33 + .../plugged/vimtex/test/test-cache/Makefile | 24 + .../vimtex/test/test-cache/test-basic.json | 1 + .../vimtex/test/test-cache/test-basic.vim | 42 + .../vimtex/test/test-cache/test-clear.vim | 30 + .../vimtex/test/test-cache/test-empty.vim | 19 + .../test-kpsewhich-local-a/empty_local.bib | 0 .../test-kpsewhich-local-a/test.vim | 17 + .../test-kpsewhich-local-b/empty_local.bib | 0 .../test-kpsewhich-local-b/test.vim | 17 + .../vimtex/test/test-cache/test-local.vim | 28 + .../vimtex/test/test-cache/test-validate.vim | 31 + .../vimtex/test/test-cache/test-wrapper.vim | 30 + .../vimtex/test/test-commands/Makefile | 14 + .../test/test-commands/test-change-cmd.vim | 12 + .../test-change-env-complete.vim | 26 + .../test/test-commands/test-change-env.vim | 31 + .../test/test-commands/test-change-math.vim | 107 + .../test/test-commands/test-close-delim.vim | 36 + .../test/test-commands/test-delete-cmd.vim | 14 + .../test/test-commands/test-delete-env.vim | 17 + .../test/test-commands/test-delete-math.vim | 32 + .../test/test-commands/test-delim-toggle.vim | 25 + .../test/test-commands/test-insert-cmd.vim | 16 + .../test-commands/test-toggle-custom-frac.vim | 30 + .../test/test-commands/test-toggle-frac.vim | 60 + .../test/test-compiler-generic/Makefile | 19 + .../test/test-compiler-generic/test.tex | 4 + .../test/test-compiler-generic/test.vim | 32 + .../test/test-compiler-pdfmode/Makefile | 11 + .../test-conflict-warning/Makefile | 9 + .../test-conflict-warning/latexmkrc | 3 + .../test-conflict-warning/main.tex | 9 + .../test-conflict-warning/test.vim | 23 + .../test-compiler-pdfmode/test-pdfps/Makefile | 9 + .../test-pdfps/latexmkrc | 1 + .../test-compiler-pdfmode/test-pdfps/main.tex | 10 + .../test-compiler-pdfmode/test-pdfps/test.vim | 20 + .../test/test-compiler-selected/Makefile | 15 + .../test/test-compiler-selected/inputfile.tex | 5 + .../test-compiler-selected/reference1.tex | 13 + .../test-compiler-selected/reference2.tex | 13 + .../test-compiler-selected/reference3.tex | 18 + .../test-compiler-selected/test-template.tex | 16 + .../test/test-compiler-selected/test.tex | 17 + .../test/test-compiler-selected/test.vim | 26 + .../vimtex-template.tex | 11 + .../vimtex/test/test-compiler/Makefile | 27 + .../test/test-compiler/test-backend.vim | 107 + .../test/test-compiler/test-builddir.tex | 4 + .../test/test-compiler/test-builddir.vim | 33 + .../test/test-completion-bibstyle/Makefile | 9 + .../test/test-completion-bibstyle/main.tex | 9 + .../test/test-completion-bibstyle/test.vim | 16 + .../test-completion-bibtex-speed/Makefile | 10 + .../test-completion-bibtex-speed/bibspeed.tex | 18 + .../test-completion-bibtex-speed/bibspeed.vim | 38 + .../test/test-completion-bibtex/Makefile | 22 + .../test/test-completion-bibtex/dot_gitignore | 1 + .../test-completion-bibtex/test_backend.tex | 21 + .../test-completion-bibtex/test_backend.vim | 42 + .../test_custom_bibs.bib | 5 + .../test_custom_bibs.tex | 11 + .../test_custom_bibs.vim | 21 + .../test-completion-bibtex/test_globbed.bib | 13 + .../test-completion-bibtex/test_globbed_1.bib | 10 + .../test-completion-bibtex/test_globbed_2.bib | 10 + .../test_globbed_braces.tex | 6 + .../test_globbed_braces.vim | 28 + .../test_globbed_bracket.tex | 6 + .../test_globbed_bracket.vim | 28 + .../test_globbed_star.tex | 6 + .../test_globbed_star.vim | 28 + .../test_globbed_wildcard.tex | 6 + .../test_globbed_wildcard.vim | 28 + .../test-completion-bibtex/test_jobname.bib | 7 + .../test-completion-bibtex/test_jobname.tex | 25 + .../test-completion-bibtex/test_jobname.vim | 18 + .../test-completion-bibtex/test_matchstr.bib | 12 + .../test-completion-bibtex/test_matchstr.tex | 10 + .../test-completion-bibtex/test_matchstr.vim | 22 + .../test-completion-bibtex/test_multicite.tex | 7 + .../test-completion-bibtex/test_multicite.vim | 19 + .../test_parser_bcf.bcf | 2217 ++ .../test_parser_bcf.tex | 7 + .../test_parser_bcf.vim | 17 + .../test_parser_blg.blg | 65 + .../test_parser_blg.tex | 7 + .../test_parser_blg.vim | 17 + .../test-completion-bibtex/test_starred.tex | 7 + .../test-completion-bibtex/test_starred.vim | 18 + .../test/test-completion-commands/Makefile | 17 + .../test-custom-cls-speed.cls | 60 + .../test-custom-cls-speed.tex | 6 + .../test-custom-cls-speed.vim | 31 + .../test-custom-cls.cls | 6 + .../test-custom-cls.tex | 4 + .../test-custom-cls.vim | 21 + .../test-custom-cmds.tex | 36 + .../test-custom-cmds.vim | 34 + .../test-completion-documentclass/Makefile | 9 + .../test-completion-documentclass/main.tex | 4 + .../test-completion-documentclass/test.vim | 14 + .../test-completion-environments/Makefile | 17 + .../test-completion-environments/test1.tex | 8 + .../test-completion-environments/test1.vim | 22 + .../test-completion-environments/test2.cls | 37 + .../test-completion-environments/test2.tex | 6 + .../test-completion-environments/test2.vim | 22 + .../test-completion-environments/test3.sty | 12 + .../test-completion-environments/test3.tex | 6 + .../test-completion-environments/test3.vim | 22 + .../test/test-completion-filenames/Makefile | 9 + .../test-completion-filenames/empty_fig1.png | 0 .../figures/empty_example.tikzz | 0 .../figures/empty_example1.tikz | 0 .../figures/empty_example2.TikZ | 0 .../figures/empty_example3.TIKZ | 0 .../figures/empty_fig10.png | 0 .../figures/empty_fig11.eps | 0 .../figures/empty_fig12.pdf | 0 .../figures/empty_fig13.jpg | 0 .../figures/empty_fig2.png | 0 .../figures/empty_fig3.png | 0 .../figures/empty_fig4.png | 0 .../figures/empty_fig5.png | 0 .../figures/empty_fig6.png | 0 .../figures/empty_fig7.png | 0 .../figures/empty_fig8.png | 0 .../figures/empty_fig9.png | 0 .../test/test-completion-filenames/main.tex | 11 + .../my figures/empty_new_fig1.jpg | 0 .../my figures/empty_new_fig2.jpg | 0 .../my figures/empty_new_fig3.jpg | 0 .../my figures/empty_new_fig4.jpg | 0 .../my figures/empty_new_fig5.jpg | 0 .../my figures/empty_new_fig6.jpg | 0 .../my figures/empty_new_fig7.jpg | 0 .../my figures/empty_new_fig8.jpg | 0 .../my figures/empty_new_fig9.jpg | 0 .../test/test-completion-filenames/test.vim | 48 + .../test-completion-filenames/tikz_pic.tex | 10 + .../tikzpics/empty_figure.tikz | 0 .../Makefile | 9 + .../test.vim | 22 + .../texinclude/inp.tex | 9 + .../texwork/example.tex | 21 + .../test/test-completion-glossary/Makefile | 21 + .../glossaries-extra-1.tex | 19 + .../glossaries-extra-2.tex | 16 + .../glossaries-extra.bib | 49 + .../glossaries-extra.vim | 14 + .../test-completion-glossary/glossaries.tex | 27 + .../test-completion-glossary/glossaries.vim | 45 + .../test-completion-glossary/glsentries.tex | 53 + .../test/test-completion-glossary/latexmkrc | 18 + .../test/test-completion-labels/Makefile | 17 + .../test/test-completion-labels/test1.aux | 15 + .../test/test-completion-labels/test1.tex | 45 + .../test/test-completion-labels/test1.vim | 20 + .../test-completion-labels/test1/sub1.aux | 55 + .../test-completion-labels/test1/sub1.tex | 77 + .../test1/sub2 with spaces.tex | 7 + .../test1/sub3 with spaces.tex | 6 + .../test-completion-labels/test1/sub4.tex | 4 + .../test/test-completion-labels/test2.tex | 10 + .../test/test-completion-labels/test2.vim | 20 + .../test-completion-labels/test2/input1.aux | 2 + .../test-completion-labels/test2/input2.aux | 2 + .../test/test-completion-packages/Makefile | 9 + .../test/test-completion-packages/main.tex | 4 + .../test/test-completion-packages/test.vim | 20 + .../vimtex/test/test-context-cite/Makefile | 14 + .../test/test-context-cite/test-cites.bib | 34 + .../test/test-context-cite/test-cites.tex | 16 + .../test/test-context-cite/test-cites.vim | 29 + .../plugged/vimtex/test/test-delim/Makefile | 9 + .../plugged/vimtex/test/test-delim/test.tex | 12 + .../plugged/vimtex/test/test-delim/test.vim | 22 + dot_vim/plugged/vimtex/test/test-doc/Makefile | 14 + dot_vim/plugged/vimtex/test/test-doc/test.tex | 11 + .../vimtex/test/test-doc/test_usepackage.vim | 24 + .../test/test-doc/test_usetikzlibrary.vim | 37 + dot_vim/plugged/vimtex/test/test-env/Makefile | 14 + .../vimtex/test/test-env/test-getters.tex | 12 + .../vimtex/test/test-env/test-getters.vim | 22 + .../vimtex/test/test-env/test-surround.tex | 18 + .../vimtex/test/test-env/test-surround.vim | 42 + .../vimtex/test/test-env/test-toggle-star.tex | 6 + .../vimtex/test/test-env/test-toggle-star.vim | 14 + .../vimtex/test/test-folding-bib/Makefile | 9 + .../vimtex/test/test-folding-bib/test.bib | 119 + .../vimtex/test/test-folding-bib/test.vim | 75 + .../plugged/vimtex/test/test-folding/Makefile | 14 + .../test/test-folding/test-env-options.tex | 42 + .../test/test-folding/test-env-options.vim | 43 + .../vimtex/test/test-folding/test-other.tex | 221 + .../vimtex/test/test-folding/test-other.vim | 77 + .../vimtex/test/test-formatting/Makefile | 16 + .../vimtex/test/test-formatting/test-01.ref | 5 + .../vimtex/test/test-formatting/test-01.tex | 6 + .../vimtex/test/test-formatting/test-02.ref | 8 + .../vimtex/test/test-formatting/test-02.tex | 8 + .../vimtex/test/test-formatting/test-03.ref | 21 + .../vimtex/test/test-formatting/test-03.tex | 23 + .../vimtex/test/test-formatting/test-04.ref | 14 + .../vimtex/test/test-formatting/test-04.tex | 15 + .../vimtex/test/test-formatting/test-05.ref | 17 + .../vimtex/test/test-formatting/test-05.tex | 17 + .../vimtex/test/test-formatting/test-06.ref | 9 + .../vimtex/test/test-formatting/test-06.tex | 9 + .../vimtex/test/test-formatting/test.vim | 25 + .../vimtex/test/test-get-main/Makefile | 9 + .../vimtex/test/test-get-main/simple.tex | 4 + .../test-bib-alternate/empty_references.bib | 0 .../test-get-main/test-bib-alternate/main.tex | 6 + .../test-bib-notfound/empty_references.bib | 0 .../test-bib-simple/empty_references.bib | 0 .../test-get-main/test-bib-simple/main.tex | 9 + .../test-included-preamble/main.tex | 3 + .../test-included-preamble/preamble.tex | 1 + .../test-get-main/test-includes/include3.tex | 3 + .../test/test-get-main/test-includes/main.tex | 8 + .../test-get-main/test-includes/subfile.tex | 3 + .../test-includes/test/include1.tex | 3 + .../test-includes/test/sub/include2.tex | 1 + .../test-latexmain/empty_included.tex | 0 .../test-latexmain/empty_main.tex.latexmain | 0 .../test-get-main/test-latexmain/main.tex | 1 + .../test-latexmain/section1/empty_main.tex | 0 .../test/test-get-main/test-latexmk/latexmkrc | 1 + .../test/test-get-main/test-latexmk/main.tex | 7 + .../test-get-main/test-latexmk/preamble.tex | 2 + .../test-get-main/test-standalone/a/a.tex | 6 + .../test-get-main/test-standalone/a/b/b.tex | 4 + .../test-get-main/test-standalone/main.tex | 9 + .../test-subfiles/empty_not-main.tex | 0 .../test/test-get-main/test-subfiles/main.tex | 6 + .../test-get-main/test-subfiles/preamble.tex | 1 + .../test-get-main/test-subfiles/sub/sub1.tex | 7 + .../test-get-main/test-subfiles/sub/sub2.tex | 6 + .../test-get-main/test-subfiles/sub/sub3.tex | 7 + .../test-get-main/test-texroot/empty_main.tex | 0 .../test-get-main/test-texroot/included.tex | 1 + .../[code college-1] title/test.tex | 4 + .../vimtex/test/test-get-main/test.vim | 68 + .../plugged/vimtex/test/test-imaps/Makefile | 9 + .../plugged/vimtex/test/test-imaps/test.vim | 74 + .../plugged/vimtex/test/test-include/Makefile | 9 + .../vimtex/test/test-include/references.bib | 6 + .../test/test-include/sub/empty_file1.tex | 0 .../test/test-include/sub/empty_file2.tex | 0 .../test/test-include/sub/empty_file3.tex | 0 .../plugged/vimtex/test/test-include/test.tex | 17 + .../plugged/vimtex/test/test-include/test.vim | 36 + .../test/test-indentation-timing/Makefile | 16 + .../test/test-indentation-timing/test.vim | 26 + .../test/test-indentation-timing/thesis.tex | 3363 ++ .../vimtex/test/test-indentation/Makefile | 22 + .../vimtex/test/test-indentation/test.vim | 33 + .../test_ampersands-off_input.tex | 13 + .../test_ampersands-off_reference.tex | 13 + .../test_ampersands_input.tex | 30 + .../test_ampersands_nested-envs_input.tex | 18 + .../test_ampersands_nested-envs_reference.tex | 18 + .../test_ampersands_reference.tex | 30 + .../test_close-indented_input.tex | 20 + .../test_close-indented_reference.tex | 20 + .../test_close_open_same_line_input.tex | 25 + .../test_close_open_same_line_reference.tex | 25 + .../test_environments-ignored_input.tex | 9 + .../test_environments-ignored_reference.tex | 9 + .../test_environments_input.tex | 34 + .../test_environments_reference.tex | 34 + .../test-indentation/test_itemized_input.tex | 21 + .../test_itemized_reference.tex | 21 + .../test/test-indentation/test_math_input.tex | 66 + .../test-indentation/test_math_reference.tex | 66 + .../test/test-indentation/test_tikz_input.tex | 49 + .../test-indentation/test_tikz_long_input.tex | 56 + .../test_tikz_long_reference.tex | 56 + .../test-indentation/test_tikz_reference.tex | 49 + .../test-indentation/test_verbatim_input.tex | 25 + .../test_verbatim_reference.tex | 25 + .../plugged/vimtex/test/test-jobs/Makefile | 14 + .../vimtex/test/test-jobs/test-capture.vim | 17 + .../vimtex/test/test-jobs/test-run.vim | 27 + .../vimtex/test/test-jobs/test-start.vim | 17 + .../test/test-matchparen-speed/Makefile | 10 + .../test/test-matchparen-speed/test.tex | 5 + .../test/test-matchparen-speed/test.vim | 23 + .../vimtex/test/test-metadata/Makefile | 14 + .../test/test-metadata/test-sources.vim | 15 + .../test-metadata/test-sources/include1.tex | 3 + .../test/test-metadata/test-sources/main.tex | 11 + .../test-sources/sub1/include2.tex | 1 + .../test-sources/sub2/include3.tex | 3 + .../test-metadata/test-sources/subfile.tex | 3 + .../vimtex/test/test-motions-virtual/Makefile | 10 + .../vimtex/test/test-motions-virtual/test.tex | 2 + .../vimtex/test/test-motions-virtual/test.vim | 19 + .../plugged/vimtex/test/test-motions/Makefile | 14 + .../vimtex/test/test-motions/test-beamer.tex | 45 + .../vimtex/test/test-motions/test-beamer.vim | 26 + .../vimtex/test/test-motions/test-comment.tex | 14 + .../vimtex/test/test-motions/test-comment.vim | 25 + .../vimtex/test/test-motions/test-math.tex | 31 + .../vimtex/test/test-motions/test-math.vim | 26 + .../vimtex/test/test-motions/test-method.tex | 28 + .../vimtex/test/test-motions/test-method.vim | 25 + .../vimtex/test/test-motions/test-section.tex | 55 + .../vimtex/test/test-motions/test-section.vim | 41 + .../vimtex/test/test-parser-bib/Makefile | 9 + .../vimtex/test/test-parser-bib/test.bib | 47 + .../vimtex/test/test-parser-bib/test.vim | 41 + .../vimtex/test/test-parser-cmds/Makefile | 9 + .../vimtex/test/test-parser-cmds/test.tex | 1 + .../vimtex/test/test-parser-cmds/test.vim | 20 + .../vimtex/test/test-parser-tex/Makefile | 14 + .../test-parser-tex/test_preamble_include.ref | 4 + .../test-parser-tex/test_preamble_include.tex | 8 + .../test-parser-tex/test_preamble_include.vim | 12 + .../test_preamble_included.tex | 1 + .../test/test-parser-tex/test_recursive.tex | 9 + .../test/test-parser-tex/test_recursive.vim | 21 + .../vimtex/test/test-parser-toc/Makefile | 9 + .../vimtex/test/test-parser-toc/main.tex | 25 + .../vimtex/test/test-parser-toc/sub.tex | 4 + .../vimtex/test/test-parser-toc/test.vim | 22 + .../plugged/vimtex/test/test-paths/Makefile | 9 + .../plugged/vimtex/test/test-paths/main.tex | 6 + .../plugged/vimtex/test/test-paths/test.vim | 25 + .../test/test-quickfix-fix-path/Makefile | 14 + .../test/test-quickfix-fix-path/dot_gitignore | 1 + .../test-quickfix-fix-path/test-beamer.log | 733 + .../test-quickfix-fix-path/test-beamer.tex | 32 + .../test-quickfix-fix-path/test-beamer.vim | 26 + .../test-quickfix-fix-path/test-hbox-1.tex | 6 + .../test-quickfix-fix-path/test-hbox-2.tex | 3 + .../test-quickfix-fix-path/test-hbox-3.tex | 2 + .../test/test-quickfix-fix-path/test-hbox.log | 97 + .../test/test-quickfix-fix-path/test-hbox.tex | 8 + .../test/test-quickfix-fix-path/test-hbox.vim | 27 + .../vimtex/test/test-quickfix/Makefile | 23 + .../test/test-quickfix/file with errors.log | 573 + .../test/test-quickfix/file with errors.tex | 34 + .../test/test-quickfix/input with spaces.tex | 4 + .../test/test-quickfix/test-latexlog.vim | 43 + .../test/test-quickfix/test-pplatex.log | 842 + .../test/test-quickfix/test-pplatex.vim | 34 + .../vimtex/test/test-quickfix/test-spaces.vim | 70 + .../plugged/vimtex/test/test-state/Makefile | 14 + .../vimtex/test/test-state/included.tex | 1 + .../vimtex/test/test-state/minimal.tex | 7 + .../vimtex/test/test-state/test_builddir.vim | 36 + .../vimtex/test/test-state/test_hidden.vim | 56 + .../test/test-state/test_modified-quit.vim | 28 + .../vimtex/test/test-state/test_no-hidden.vim | 54 + .../test-state/test_parse_documentclass.tex | 14 + .../test-state/test_parse_documentclass.vim | 15 + .../vimtex/test/test-state/test_reload.cls | 8 + .../vimtex/test/test-state/test_reload.vim | 19 + .../vimtex/test/test-state/test_reopen.vim | 26 + .../test/test-state/test_toggle-main.vim | 38 + .../vimtex/test/test-subfiles/Makefile | 14 + .../vimtex/test/test-subfiles/test_nested.vim | 19 + .../test/test-subfiles/test_nested/main.tex | 9 + .../test_nested/parts/chapter.tex | 7 + .../test_nested/parts/sections/first.tex | 10 + .../test_nested/parts/sections/second.tex | 5 + .../plugged/vimtex/test/test-syntax/Makefile | 24 + .../vimtex/test/test-syntax/common.vim | 22 + .../vimtex/test/test-syntax/test-amsmath.tex | 49 + .../vimtex/test/test-syntax/test-amsmath.vim | 24 + .../vimtex/test/test-syntax/test-amsthm.tex | 27 + .../vimtex/test/test-syntax/test-amsthm.vim | 25 + .../vimtex/test/test-syntax/test-array.tex | 38 + .../vimtex/test/test-syntax/test-array.vim | 12 + .../test/test-syntax/test-asymptote.tex | 57 + .../test/test-syntax/test-asymptote.vim | 10 + .../vimtex/test/test-syntax/test-babel.tex | 8 + .../vimtex/test/test-syntax/test-babel.vim | 7 + .../vimtex/test/test-syntax/test-biblatex.tex | 35 + .../vimtex/test/test-syntax/test-biblatex.vim | 17 + .../test/test-syntax/test-bold-italic.tex | 12 + .../test/test-syntax/test-bold-italic.vim | 15 + .../vimtex/test/test-syntax/test-booktabs.tex | 17 + .../vimtex/test/test-syntax/test-booktabs.vim | 8 + .../vimtex/test/test-syntax/test-breqn.tex | 19 + .../vimtex/test/test-syntax/test-breqn.vim | 10 + .../vimtex/test/test-syntax/test-cases.tex | 16 + .../vimtex/test/test-syntax/test-cases.vim | 7 + .../test/test-syntax/test-chemformula.tex | 27 + .../test/test-syntax/test-chemformula.vim | 10 + .../test/test-syntax/test-circuitikz.tex | 12 + .../vimtex/test/test-syntax/test-cleveref.tex | 23 + .../vimtex/test/test-syntax/test-cleveref.vim | 9 + .../vimtex/test/test-syntax/test-comment.tex | 29 + .../vimtex/test/test-syntax/test-conceal.tex | 113 + .../vimtex/test/test-syntax/test-conceal.vim | 18 + .../vimtex/test/test-syntax/test-core.dtx | 3 + .../vimtex/test/test-syntax/test-core.sty | 13 + .../vimtex/test/test-syntax/test-core.tex | 132 + .../vimtex/test/test-syntax/test-core.vim | 24 + .../vimtex/test/test-syntax/test-custom.tex | 31 + .../vimtex/test/test-syntax/test-custom.vim | 33 + .../test/test-syntax/test-dockerfile.tex | 10 + .../test/test-syntax/test-dockerfile.vim | 9 + .../vimtex/test/test-syntax/test-expl3.tex | 67 + .../vimtex/test/test-syntax/test-expl3.vim | 9 + .../vimtex/test/test-syntax/test-fixme.tex | 139 + .../vimtex/test/test-syntax/test-fixme.vim | 11 + .../test/test-syntax/test-fls-reload.tex | 7 + .../test/test-syntax/test-fls-reload.vim | 22 + .../test/test-syntax/test-fontawesome5.tex | 24 + .../test/test-syntax/test-fontawesome5.vim | 14 + .../test/test-syntax/test-glossaries.tex | 19 + .../vimtex/test/test-syntax/test-hyperref.tex | 19 + .../vimtex/test/test-syntax/test-hyperref.vim | 10 + .../test/test-syntax/test-ieeetrantools.tex | 45 + .../test/test-syntax/test-ieeetrantools.vim | 12 + .../vimtex/test/test-syntax/test-iffalse.tex | 35 + .../test/test-syntax/test-ifnextchar.tex | 10 + .../test/test-syntax/test-ifnextchar.vim | 10 + .../vimtex/test/test-syntax/test-iftrue.tex | 38 + .../vimtex/test/test-syntax/test-latex3.tex | 30 + .../vimtex/test/test-syntax/test-latex3.vim | 11 + .../vimtex/test/test-syntax/test-listings.tex | 50 + .../vimtex/test/test-syntax/test-listings.vim | 20 + .../vimtex/test/test-syntax/test-loading.tex | 7 + .../vimtex/test/test-syntax/test-loading.vim | 8 + .../vimtex/test/test-syntax/test-luacode.tex | 28 + .../vimtex/test/test-syntax/test-markdown.tex | 18 + .../vimtex/test/test-syntax/test-markdown.vim | 12 + .../test/test-syntax/test-mathtools.tex | 56 + .../test/test-syntax/test-mathtools.vim | 16 + .../vimtex/test/test-syntax/test-mhequ.tex | 25 + .../vimtex/test/test-syntax/test-minted.tex | 126 + .../vimtex/test/test-syntax/test-minted.vim | 21 + .../test/test-syntax/test-mleftright.tex | 11 + .../test/test-syntax/test-mleftright.vim | 16 + .../vimtex/test/test-syntax/test-natbib.tex | 52 + .../vimtex/test/test-syntax/test-natbib.vim | 17 + .../vimtex/test/test-syntax/test-optidef.tex | 30 + .../vimtex/test/test-syntax/test-optidef.vim | 14 + .../vimtex/test/test-syntax/test-postinit.vim | 9 + .../vimtex/test/test-syntax/test-pyluatex.tex | 18 + .../vimtex/test/test-syntax/test-pyluatex.vim | 11 + .../test/test-syntax/test-pythontex.tex | 37 + .../test/test-syntax/test-pythontex.vim | 10 + .../vimtex/test/test-syntax/test-sagetex.tex | 47 + .../vimtex/test/test-syntax/test-sagetex.vim | 8 + .../vimtex/test/test-syntax/test-siunitx.tex | 8 + .../vimtex/test/test-syntax/test-tabularx.tex | 13 + .../vimtex/test/test-syntax/test-tabularx.vim | 17 + .../test/test-syntax/test-tcolorbox.tex | 24 + .../test/test-syntax/test-tcolorbox.vim | 9 + .../vimtex/test/test-syntax/test-tikz.tex | 97 + .../vimtex/test/test-syntax/test-tikz.vim | 11 + .../test-syntax/test-various-packages.tex | 93 + .../test-syntax/test-various-packages.vim | 9 + .../vimtex/test/test-syntax/test-wiki.tex | 26 + .../vimtex/test/test-syntax/test-wiki.vim | 10 + .../vimtex/test/test-texflavor/Makefile | 14 + .../test/test-texflavor/test-defined.vim | 10 + .../test/test-texflavor/test-undefined.vim | 8 + .../vimtex/test/test-textobj-targets/Makefile | 16 + .../test/test-textobj-targets/minimal.tex | 127 + .../vimtex/test/test-textobj-targets/test.vim | 61 + .../vimtex/test/test-textobj-targets/test1.ok | 146 + .../test/test-textobj-targets/test1.tex | 1 + .../plugged/vimtex/test/test-textobj/Makefile | 14 + .../vimtex/test/test-textobj/test-envs.vim | 89 + .../test/test-textobj/test-exclusive.vim | 26 + .../vimtex/test/test-textobj/test-items.vim | 152 + .../vimtex/test/test-textobj/test-other.vim | 26 + .../test/test-textobj/test-sections.vim | 73 + .../vimtex/test/test-toc-speed/Makefile | 9 + .../test-toc-speed/chapters/chapter00.tex | 24 + .../test-toc-speed/chapters/chapter01.tex | 24 + .../test-toc-speed/chapters/chapter02.tex | 24 + .../test-toc-speed/chapters/chapter03.tex | 24 + .../test-toc-speed/chapters/chapter04.tex | 24 + .../test-toc-speed/chapters/chapter05.tex | 24 + .../test-toc-speed/chapters/chapter06.tex | 24 + .../test-toc-speed/chapters/chapter07.tex | 24 + .../test-toc-speed/chapters/chapter08.tex | 24 + .../test-toc-speed/chapters/chapter09.tex | 24 + .../test-toc-speed/chapters/chapter10.tex | 24 + .../test-toc-speed/chapters/chapter11.tex | 24 + .../test-toc-speed/chapters/chapter12.tex | 24 + .../test-toc-speed/chapters/chapter13.tex | 24 + .../test-toc-speed/chapters/chapter14.tex | 24 + .../test-toc-speed/chapters/chapter15.tex | 24 + .../test-toc-speed/chapters/chapter16.tex | 24 + .../test-toc-speed/chapters/chapter17.tex | 24 + .../test-toc-speed/chapters/chapter18.tex | 24 + .../test-toc-speed/chapters/chapter19.tex | 24 + .../test-toc-speed/chapters/chapter20.tex | 24 + .../test-toc-speed/chapters/chapter21.tex | 24 + .../test-toc-speed/chapters/chapter22.tex | 24 + .../test-toc-speed/chapters/chapter23.tex | 24 + .../test-toc-speed/chapters/chapter24.tex | 24 + .../test-toc-speed/chapters/chapter25.tex | 24 + .../test-toc-speed/chapters/chapter26.tex | 24 + .../test-toc-speed/chapters/chapter27.tex | 24 + .../test-toc-speed/chapters/chapter28.tex | 24 + .../test-toc-speed/chapters/chapter29.tex | 24 + .../test-toc-speed/chapters/chapter30.tex | 24 + .../test-toc-speed/chapters/chapter31.tex | 24 + .../test-toc-speed/chapters/chapter32.tex | 24 + .../test-toc-speed/chapters/chapter33.tex | 24 + .../test-toc-speed/chapters/chapter34.tex | 24 + .../test-toc-speed/chapters/chapter35.tex | 24 + .../test-toc-speed/chapters/chapter36.tex | 24 + .../test-toc-speed/chapters/chapter37.tex | 24 + .../test-toc-speed/chapters/chapter38.tex | 24 + .../test-toc-speed/chapters/chapter39.tex | 24 + .../test-toc-speed/chapters/chapter40.tex | 24 + .../test-toc-speed/chapters/chapter41.tex | 24 + .../test-toc-speed/chapters/chapter42.tex | 24 + .../test-toc-speed/chapters/chapter43.tex | 24 + .../test-toc-speed/chapters/chapter44.tex | 24 + .../test-toc-speed/chapters/chapter45.tex | 24 + .../test-toc-speed/chapters/chapter46.tex | 24 + .../test-toc-speed/chapters/chapter47.tex | 24 + .../test-toc-speed/chapters/chapter48.tex | 24 + .../test-toc-speed/chapters/chapter49.tex | 24 + .../test-toc-speed/chapters/chapter50.tex | 24 + .../test-toc-speed/chapters/chapter51.tex | 24 + .../test-toc-speed/chapters/chapter52.tex | 24 + .../test-toc-speed/chapters/chapter53.tex | 24 + .../test-toc-speed/chapters/chapter54.tex | 24 + .../test-toc-speed/chapters/chapter55.tex | 24 + .../test-toc-speed/chapters/chapter56.tex | 24 + .../test-toc-speed/chapters/chapter57.tex | 24 + .../test-toc-speed/chapters/chapter58.tex | 24 + .../test-toc-speed/chapters/chapter59.tex | 24 + .../test-toc-speed/chapters/chapter60.tex | 24 + .../test-toc-speed/chapters/chapter61.tex | 24 + .../test-toc-speed/chapters/chapter62.tex | 24 + .../test-toc-speed/chapters/chapter63.tex | 24 + .../test-toc-speed/chapters/chapter64.tex | 24 + .../test-toc-speed/chapters/chapter65.tex | 24 + .../test-toc-speed/chapters/chapter66.tex | 24 + .../test-toc-speed/chapters/chapter67.tex | 24 + .../test-toc-speed/chapters/chapter68.tex | 24 + .../test-toc-speed/chapters/chapter69.tex | 24 + .../test-toc-speed/chapters/chapter70.tex | 24 + .../test-toc-speed/chapters/chapter71.tex | 24 + .../test-toc-speed/chapters/chapter72.tex | 24 + .../test-toc-speed/chapters/chapter73.tex | 24 + .../test-toc-speed/chapters/chapter74.tex | 24 + .../test-toc-speed/chapters/chapter75.tex | 24 + .../test-toc-speed/chapters/chapter76.tex | 24 + .../test-toc-speed/chapters/chapter77.tex | 24 + .../test-toc-speed/chapters/chapter78.tex | 24 + .../test-toc-speed/chapters/chapter79.tex | 24 + .../test-toc-speed/chapters/chapter80.tex | 24 + .../test-toc-speed/chapters/chapter81.tex | 24 + .../test-toc-speed/chapters/chapter82.tex | 24 + .../test-toc-speed/chapters/chapter83.tex | 24 + .../test-toc-speed/chapters/chapter84.tex | 24 + .../test-toc-speed/chapters/chapter85.tex | 24 + .../test-toc-speed/chapters/chapter86.tex | 24 + .../test-toc-speed/chapters/chapter87.tex | 24 + .../test-toc-speed/chapters/chapter88.tex | 24 + .../test-toc-speed/chapters/chapter89.tex | 24 + .../test-toc-speed/chapters/chapter90.tex | 24 + .../test-toc-speed/chapters/chapter91.tex | 24 + .../test-toc-speed/chapters/chapter92.tex | 24 + .../test-toc-speed/chapters/chapter93.tex | 24 + .../test-toc-speed/chapters/chapter94.tex | 24 + .../test-toc-speed/chapters/chapter95.tex | 24 + .../test-toc-speed/chapters/chapter96.tex | 24 + .../test-toc-speed/chapters/chapter97.tex | 24 + .../test-toc-speed/chapters/chapter98.tex | 24 + .../test-toc-speed/chapters/chapter99.tex | 24 + .../chapters/empty_preamble.tex | 0 .../test/test-toc-speed/chapters/subfile.tex | 7 + .../vimtex/test/test-toc-speed/main.tex | 120 + .../vimtex/test/test-toc-speed/test.vim | 34 + dot_vim/plugged/vimtex/test/test-toc/Makefile | 14 + .../vimtex/test/test-toc/chapters/chapter.tex | 6 + .../test/test-toc/chapters/empty_preamble.tex | 0 .../test/test-toc/chapters/equations.tex | 15 + .../test/test-toc/chapters/imported.tex | 2 + .../test/test-toc/chapters/sections/first.tex | 10 + .../test-toc/chapters/sections/second.tex | 5 + .../vimtex/test/test-toc/chapters/subfile.tex | 10 + dot_vim/plugged/vimtex/test/test-toc/main.aux | 19 + dot_vim/plugged/vimtex/test/test-toc/main.bib | 5 + dot_vim/plugged/vimtex/test/test-toc/main.tex | 24 + .../vimtex/test/test-toc/test-beamer.tex | 36 + .../vimtex/test/test-toc/test-beamer.vim | 20 + .../vimtex/test/test-toc/test-disable.vim | 20 + .../vimtex/test/test-toc/test-fixme.tex | 139 + .../vimtex/test/test-toc/test-fixme.vim | 26 + .../vimtex/test/test-toc/test-general.vim | 52 + .../vimtex/test/test-toc/test-indent.vim | 23 + .../vimtex/test/test-toc/test-keepalt.vim | 19 + .../vimtex/test/test-toc/test-keepwidth.vim | 22 + .../vimtex/test/test-toc/test-multiline.tex | 11 + .../vimtex/test/test-toc/test-multiline.vim | 21 + .../vimtex/test/test-toc/test-starred.tex | 26 + .../vimtex/test/test-toc/test-starred.vim | 32 + .../test/test-toc/test-texorpdfstring.vim | 21 + .../plugged/vimtex/test/test-utils/Makefile | 14 + .../plugged/vimtex/test/test-utils/test1.vim | 19 + .../plugged/vimtex/test/test-view/Makefile | 14 + .../vimtex/test/test-view/included.tex | 4 + .../plugged/vimtex/test/test-view/main.tex | 19 + .../test/test-view/test_inverse_search.vim | 43 + .../vimtex/test/test-wordcount/Makefile | 9 + .../vimtex/test/test-wordcount/minimal.tex | 9 + .../vimtex/test/test-wordcount/test.vim | 15 + dot_vim/plugged/vimwiki/CONTRIBUTING.md | 68 + dot_vim/plugged/vimwiki/Dockerfile | 25 + dot_vim/plugged/vimwiki/LICENSE.md | 22 + dot_vim/plugged/vimwiki/README-cn.md | 161 + dot_vim/plugged/vimwiki/README.md | 294 + .../plugged/vimwiki/autoload/vimwiki/base.vim | 3074 ++ .../vimwiki/autoload/vimwiki/default.tpl | 13 + .../vimwiki/autoload/vimwiki/diary.vim | 535 + .../vimwiki/autoload/vimwiki/emoji.vim | 1831 ++ .../vimwiki/executable_customwiki2html.sh | 61 + .../plugged/vimwiki/autoload/vimwiki/html.vim | 2107 ++ .../plugged/vimwiki/autoload/vimwiki/lst.vim | 1844 ++ .../autoload/vimwiki/markdown_base.vim | 115 + .../plugged/vimwiki/autoload/vimwiki/path.vim | 251 + .../vimwiki/autoload/vimwiki/style.css | 187 + .../plugged/vimwiki/autoload/vimwiki/tags.vim | 450 + .../plugged/vimwiki/autoload/vimwiki/tbl.vim | 856 + .../plugged/vimwiki/autoload/vimwiki/u.vim | 446 + .../plugged/vimwiki/autoload/vimwiki/vars.vim | 1668 + dot_vim/plugged/vimwiki/doc/design_notes.md | 254 + dot_vim/plugged/vimwiki/doc/entries.png | Bin 0 -> 341380 bytes dot_vim/plugged/vimwiki/doc/lists.png | Bin 0 -> 430499 bytes dot_vim/plugged/vimwiki/doc/logo.svg | 10 + dot_vim/plugged/vimwiki/doc/screenshot_1.png | Bin 0 -> 29362 bytes dot_vim/plugged/vimwiki/doc/screenshot_2.png | Bin 0 -> 49959 bytes .../plugged/vimwiki/doc/specification.wiki | 898 + dot_vim/plugged/vimwiki/doc/splash.png | Bin 0 -> 11140 bytes dot_vim/plugged/vimwiki/doc/tags | 295 + dot_vim/plugged/vimwiki/doc/todos.png | Bin 0 -> 369021 bytes dot_vim/plugged/vimwiki/doc/vertical-logo.svg | 98 + dot_vim/plugged/vimwiki/doc/vimwiki-emoji.txt | 598 + dot_vim/plugged/vimwiki/doc/vimwiki.txt | 4564 +++ dot_vim/plugged/vimwiki/doc/wiki.png | Bin 0 -> 476675 bytes dot_vim/plugged/vimwiki/dot_git/HEAD | 1 + .../plugged/vimwiki/dot_git/branches/.keep | 0 dot_vim/plugged/vimwiki/dot_git/config | 11 + dot_vim/plugged/vimwiki/dot_git/description | 1 + .../dot_git/hooks/applypatch-msg.sample | 15 + .../vimwiki/dot_git/hooks/commit-msg.sample | 24 + .../dot_git/hooks/fsmonitor-watchman.sample | 174 + .../vimwiki/dot_git/hooks/post-update.sample | 8 + .../dot_git/hooks/pre-applypatch.sample | 14 + .../vimwiki/dot_git/hooks/pre-commit.sample | 49 + .../dot_git/hooks/pre-merge-commit.sample | 13 + .../vimwiki/dot_git/hooks/pre-push.sample | 53 + .../vimwiki/dot_git/hooks/pre-rebase.sample | 169 + .../vimwiki/dot_git/hooks/pre-receive.sample | 24 + .../dot_git/hooks/prepare-commit-msg.sample | 42 + .../dot_git/hooks/push-to-checkout.sample | 78 + .../vimwiki/dot_git/hooks/update.sample | 128 + dot_vim/plugged/vimwiki/dot_git/index | Bin 0 -> 9253 bytes dot_vim/plugged/vimwiki/dot_git/info/exclude | 6 + dot_vim/plugged/vimwiki/dot_git/logs/HEAD | 2 + .../vimwiki/dot_git/logs/refs/heads/dev | 1 + .../dot_git/logs/refs/remotes/origin/HEAD | 1 + .../vimwiki/dot_git/objects/info/.keep | 0 ...3097a7ca1d11cc2b5825937c0a7df65d09ae6e.idx | Bin 0 -> 11768 bytes ...097a7ca1d11cc2b5825937c0a7df65d09ae6e.pack | Bin 0 -> 2880183 bytes dot_vim/plugged/vimwiki/dot_git/packed-refs | 16 + .../plugged/vimwiki/dot_git/refs/heads/dev | 1 + .../vimwiki/dot_git/refs/remotes/origin/HEAD | 1 + .../plugged/vimwiki/dot_git/refs/tags/.keep | 0 dot_vim/plugged/vimwiki/dot_git/shallow | 13 + .../vimwiki/dot_github/issue_template.md | 6 + .../dot_github/pull_request_template.md | 9 + dot_vim/plugged/vimwiki/dot_gitignore | 24 + dot_vim/plugged/vimwiki/dot_travis.yml | 45 + dot_vim/plugged/vimwiki/ftplugin/vimwiki.vim | 780 + dot_vim/plugged/vimwiki/plugin/vimwiki.vim | 482 + dot_vim/plugged/vimwiki/syntax/vimwiki.vim | 540 + .../syntax/vimwiki_markdown_custom.vim | 196 + dot_vim/plugged/vimwiki/test/README.md | 85 + .../vimwiki/test/api_base_resolve_link.vader | 42 + .../vimwiki/test/config_commentstring.vader | 32 + .../plugged/vimwiki/test/config_vars.vader | 91 + .../test/executable_literal_run_tests.sh | 375 + dot_vim/plugged/vimwiki/test/file_goto.vader | 83 + .../plugged/vimwiki/test/file_system.vader | 27 + dot_vim/plugged/vimwiki/test/fold.vader | 59 + .../vimwiki/test/html_blockquote.vader | 170 + .../vimwiki/test/html_convert_default.vader | 300 + .../vimwiki/test/html_convert_title.vader | 10 + .../vimwiki/test/html_diary_rss_feed.vader | 110 + .../plugged/vimwiki/test/issue_markdown.vader | 177 + .../vimwiki/test/issue_profile_tabnext.vader | 51 + .../plugged/vimwiki/test/link_anchor.vader | 394 + .../plugged/vimwiki/test/link_creation.vader | 474 + .../vimwiki/test/link_generation.vader | 262 + .../plugged/vimwiki/test/link_renaming.vader | 295 + .../vimwiki/test/link_syntax_markdown.vader | 122 + .../vimwiki/test/link_syntax_vimwiki.vader | 122 + dot_vim/plugged/vimwiki/test/link_toc.vader | 413 + dot_vim/plugged/vimwiki/test/list_clean.vader | 196 + .../plugged/vimwiki/test/list_margin.vader | 112 + dot_vim/plugged/vimwiki/test/list_move.vader | 45 + .../plugged/vimwiki/test/list_return.vader | 379 + dot_vim/plugged/vimwiki/test/list_todo.vader | 249 + .../plugged/vimwiki/test/list_update.vader | 191 + .../test/list_update_nopropagate.vader | 87 + dot_vim/plugged/vimwiki/test/map.vader | 654 + .../test/resources/executable_delay.wiki | 10923 +++++++ .../vimwiki/test/resources/rtp_local.vim | 3 + .../test/resources/testmarkdown/buzz_bozz.md | 3 + .../testmarkdown/diary/empty_2020-07-22.md | 0 .../test/resources/testmarkdown/index.md | 59 + .../resources/testmarkdown/link_syntax.md | 7 + .../testmarkdown/link_syntax/nested.md | 6 + .../resources/testwiki space/buzz bozz.wiki | 3 + .../test/resources/testwiki space/index.wiki | 30 + .../test/resources/testwiki/buzz_bozz.wiki | 3 + .../resources/testwiki/diary/2020-07-22.wiki | 1 + .../resources/testwiki/diary/2020-07-23.wiki | 3 + .../resources/testwiki/diary/2020-07-24.wiki | 5 + .../resources/testwiki/diary/2020-07-25.wiki | 17 + .../test/resources/testwiki/index.wiki | 35 + .../test/resources/testwiki/link_syntax.wiki | 7 + .../testwiki/link_syntax/nested.wiki | 6 + .../testwiki/templates/template_1073.tpl | 7 + dot_vim/plugged/vimwiki/test/search.vader | 68 + dot_vim/plugged/vimwiki/test/syntax.vader | 811 + dot_vim/plugged/vimwiki/test/table.vader | 88 + .../vimwiki/test/table_autoformat.vader | 240 + dot_vim/plugged/vimwiki/test/tag.vader | 305 + dot_vim/plugged/vimwiki/test/vimrc | 390 + dot_vim/plugged/vimwiki/test/z_success.vader | 10 + dot_vim/spell/en.utf-8.spl | Bin 0 -> 609336 bytes dot_vim/spell/en.utf-8.sug | Bin 0 -> 596960 bytes dot_vim/syntax/cpp11.vim | 68 + dot_vim/syntax/cpp11_cbase.vim | 380 + dot_vim/vimrc | 23 +- dot_zshrc | 2 +- private_dot_config/nvim/lua/user/init.lua | 5 +- 5245 files changed, 468325 insertions(+), 25 deletions(-) create mode 100644 dot_vim/after/ftplugin/coffee/folding.vim create mode 100644 dot_vim/after/plugin/ale.vim create mode 100644 dot_vim/autoload/pathogen.vim create mode 100644 dot_vim/autoload/plug.vim create mode 100644 dot_vim/bundle/vimux.git/LICENSE create mode 100644 dot_vim/bundle/vimux.git/README.mkd create mode 100644 dot_vim/bundle/vimux.git/doc/vimux.txt create mode 100644 dot_vim/bundle/vimux.git/dot_gitignore create mode 100644 dot_vim/bundle/vimux.git/plugin/vimux.vim create mode 100644 dot_vim/colors/Tomorrow-Night-Blue.vim create mode 100644 dot_vim/colors/Tomorrow-Night-Bright.vim create mode 100644 dot_vim/colors/Tomorrow-Night-Eighties.vim create mode 100644 dot_vim/colors/Tomorrow-Night.vim create mode 100644 dot_vim/colors/Tomorrow.vim create mode 100644 dot_vim/doc/live-latex-preview.txt create mode 100644 dot_vim/doc/tags create mode 100644 dot_vim/dot_gitignore create mode 100644 dot_vim/dot_gitmodules create mode 100644 dot_vim/dot_netrwhist create mode 100644 dot_vim/ftplugin/lisp/limp.vim create mode 100644 dot_vim/ftplugin/lisp/limp/autoclose.vim create mode 100644 dot_vim/ftplugin/lisp/limp/bridge.vim create mode 100644 dot_vim/ftplugin/lisp/limp/cursor.vim create mode 100644 dot_vim/ftplugin/lisp/limp/desert256.vim create mode 100644 dot_vim/ftplugin/lisp/limp/highlight.vim create mode 100644 dot_vim/ftplugin/lisp/limp/keys.vim create mode 100644 dot_vim/ftplugin/lisp/limp/limp.vim create mode 100644 dot_vim/ftplugin/lisp/limp/mode.vim create mode 100644 dot_vim/ftplugin/lisp/limp/sexp.vim create mode 100644 dot_vim/ftplugin/lisp/limp/thesaurus create mode 100644 dot_vim/gvimrc create mode 100644 dot_vim/indent/cpp.vim create mode 100644 dot_vim/init.vim create mode 100644 dot_vim/plugged/ale/Dockerfile create mode 100644 dot_vim/plugged/ale/LICENSE create mode 100644 dot_vim/plugged/ale/README.md create mode 100644 dot_vim/plugged/ale/ale_linters/ada/adals.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ada/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ada/gcc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ansible/ansible_language_server.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ansible/ansible_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/apiblueprint/drafter.vim create mode 100644 dot_vim/plugged/ale/ale_linters/apkbuild/apkbuild_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/apkbuild/secfixes_check.vim create mode 100644 dot_vim/plugged/ale/ale_linters/asciidoc/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/asciidoc/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/asciidoc/languagetool.vim create mode 100644 dot_vim/plugged/ale/ale_linters/asciidoc/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/asciidoc/redpen.vim create mode 100644 dot_vim/plugged/ale/ale_linters/asciidoc/textlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/asciidoc/vale.vim create mode 100644 dot_vim/plugged/ale/ale_linters/asciidoc/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/asm/gcc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/avra/avra.vim create mode 100644 dot_vim/plugged/ale/ale_linters/awk/gawk.vim create mode 100644 dot_vim/plugged/ale/ale_linters/bats/shellcheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/bib/bibclean.vim create mode 100644 dot_vim/plugged/ale/ale_linters/bicep/bicep.vim create mode 100644 dot_vim/plugged/ale/ale_linters/bitbake/oelint_adv.vim create mode 100644 dot_vim/plugged/ale/ale_linters/c/cc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/c/ccls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/c/clangd.vim create mode 100644 dot_vim/plugged/ale/ale_linters/c/clangtidy.vim create mode 100644 dot_vim/plugged/ale/ale_linters/c/cppcheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/c/cpplint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/c/cquery.vim create mode 100644 dot_vim/plugged/ale/ale_linters/c/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/c/flawfinder.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cairo/starknet.vim create mode 100644 dot_vim/plugged/ale/ale_linters/chef/cookstyle.vim create mode 100644 dot_vim/plugged/ale/ale_linters/chef/foodcritic.vim create mode 100644 dot_vim/plugged/ale/ale_linters/clojure/clj_kondo.vim create mode 100644 dot_vim/plugged/ale/ale_linters/clojure/joker.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cloudformation/cfn_python_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cmake/cmake_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cmake/cmakelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/coffee/coffee.vim create mode 100644 dot_vim/plugged/ale/ale_linters/coffee/coffeelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/cc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/ccls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/clangcheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/clangd.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/clangtidy.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/clazy.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/cppcheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/cpplint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/cquery.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cpp/flawfinder.vim create mode 100644 dot_vim/plugged/ale/ale_linters/crystal/ameba.vim create mode 100644 dot_vim/plugged/ale/ale_linters/crystal/crystal.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cs/csc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cs/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cs/mcs.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cs/mcsc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/css/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/css/csslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/css/fecs.vim create mode 100644 dot_vim/plugged/ale/ale_linters/css/stylelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/css/vscodecss.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cucumber/cucumber.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cuda/clangd.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cuda/nvcc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/cypher/cypher_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/d/dls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/d/dmd.vim create mode 100644 dot_vim/plugged/ale/ale_linters/dafny/dafny.vim create mode 100644 dot_vim/plugged/ale/ale_linters/dart/analysis_server.vim create mode 100644 dot_vim/plugged/ale/ale_linters/dart/dart_analyze.vim create mode 100644 dot_vim/plugged/ale/ale_linters/dart/language_server.vim create mode 100644 dot_vim/plugged/ale/ale_linters/desktop/desktop_file_validate.vim create mode 100644 dot_vim/plugged/ale/ale_linters/dockerfile/dockerfile_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/dockerfile/hadolint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/elixir/credo.vim create mode 100644 dot_vim/plugged/ale/ale_linters/elixir/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/elixir/dialyxir.vim create mode 100644 dot_vim/plugged/ale/ale_linters/elixir/dogma.vim create mode 100644 dot_vim/plugged/ale/ale_linters/elixir/elixir_ls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/elixir/mix.vim create mode 100644 dot_vim/plugged/ale/ale_linters/elm/elm_ls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/elm/make.vim create mode 100644 dot_vim/plugged/ale/ale_linters/erlang/dialyzer.vim create mode 100644 dot_vim/plugged/ale/ale_linters/erlang/elvis.vim create mode 100644 dot_vim/plugged/ale/ale_linters/erlang/erlang_ls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/erlang/erlc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/erlang/syntaxerl.vim create mode 100644 dot_vim/plugged/ale/ale_linters/eruby/erb.vim create mode 100644 dot_vim/plugged/ale/ale_linters/eruby/erblint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/eruby/erubi.vim create mode 100644 dot_vim/plugged/ale/ale_linters/eruby/erubis.vim create mode 100644 dot_vim/plugged/ale/ale_linters/eruby/ruumba.vim create mode 100644 dot_vim/plugged/ale/ale_linters/fish/fish.vim create mode 100644 dot_vim/plugged/ale/ale_linters/fortran/gcc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/fortran/language_server.vim create mode 100644 dot_vim/plugged/ale/ale_linters/fountain/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/fuse/fusionlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/gitcommit/gitlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/glsl/glslang.vim create mode 100644 dot_vim/plugged/ale/ale_linters/glsl/glslls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/bingo.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/gobuild.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/gofmt.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/golangci_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/golint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/gometalinter.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/gopls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/gosimple.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/gotype.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/govet.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/langserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/revive.vim create mode 100644 dot_vim/plugged/ale/ale_linters/go/staticcheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/graphql/eslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/graphql/gqlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/hack/hack.vim create mode 100644 dot_vim/plugged/ale/ale_linters/hack/hhast.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haml/hamllint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/handlebars/embertemplatelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/cabal_ghc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/ghc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/ghc_mod.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/hdevtools.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/hie.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/hlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/hls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/stack_build.vim create mode 100644 dot_vim/plugged/ale/ale_linters/haskell/stack_ghc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/help/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/help/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/help/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/help/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/angular.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/fecs.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/htmlhint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/stylelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/tidy.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/vscodehtml.vim create mode 100644 dot_vim/plugged/ale/ale_linters/html/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/idris/idris.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ink/ls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/inko/inko.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ispc/ispc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/java/checkstyle.vim create mode 100644 dot_vim/plugged/ale/ale_linters/java/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/java/eclipselsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/java/javac.vim create mode 100644 dot_vim/plugged/ale/ale_linters/java/javalsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/java/pmd.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/deno.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/eslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/fecs.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/flow.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/flow_ls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/jscs.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/jshint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/standard.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/tsserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/javascript/xo.vim create mode 100644 dot_vim/plugged/ale/ale_linters/json/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/json/eslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/json/jq.vim create mode 100644 dot_vim/plugged/ale/ale_linters/json/jsonlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/json/spectral.vim create mode 100644 dot_vim/plugged/ale/ale_linters/json/vscodejson.vim create mode 100644 dot_vim/plugged/ale/ale_linters/json5/eslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/jsonc/eslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/jsonnet/jsonnet_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/jsonnet/jsonnetfmt.vim create mode 100644 dot_vim/plugged/ale/ale_linters/julia/languageserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/kotlin/kotlinc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/kotlin/ktlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/kotlin/languageserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/less/lessc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/less/stylelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/llvm/llc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/lua/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/lua/luac.vim create mode 100644 dot_vim/plugged/ale/ale_linters/lua/luacheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/lua/selene.vim create mode 100644 dot_vim/plugged/ale/ale_linters/mail/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/mail/languagetool.vim create mode 100644 dot_vim/plugged/ale/ale_linters/mail/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/mail/vale.vim create mode 100644 dot_vim/plugged/ale/ale_linters/make/checkmake.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/languagetool.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/markdownlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/mdl.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/redpen.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/remark_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/textlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/vale.vim create mode 100644 dot_vim/plugged/ale/ale_linters/markdown/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/matlab/mlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/mercury/mmc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/nasm/nasm.vim create mode 100644 dot_vim/plugged/ale/ale_linters/nim/nimcheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/nim/nimlsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/nix/nix.vim create mode 100644 dot_vim/plugged/ale/ale_linters/nix/rnix_lsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/nix/statix.vim create mode 100644 dot_vim/plugged/ale/ale_linters/nroff/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/nroff/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/nroff/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/objc/ccls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/objc/clang.vim create mode 100644 dot_vim/plugged/ale/ale_linters/objc/clangd.vim create mode 100644 dot_vim/plugged/ale/ale_linters/objcpp/clang.vim create mode 100644 dot_vim/plugged/ale/ale_linters/objcpp/clangd.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ocaml/merlin.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ocaml/ocamllsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ocaml/ols.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ocamlinterface/merlin.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ocamlinterface/ocamllsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/openapi/ibm_validator.vim create mode 100644 dot_vim/plugged/ale/ale_linters/openapi/yamllint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/openscad/sca2d.vim create mode 100644 dot_vim/plugged/ale/ale_linters/perl/perl.vim create mode 100644 dot_vim/plugged/ale/ale_linters/perl/perlcritic.vim create mode 100644 dot_vim/plugged/ale/ale_linters/perl6/perl6.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/executable_intelephense.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/langserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/phan.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/php.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/phpactor.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/phpcs.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/phpmd.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/phpstan.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/psalm.vim create mode 100644 dot_vim/plugged/ale/ale_linters/php/tlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/po/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/po/msgfmt.vim create mode 100644 dot_vim/plugged/ale/ale_linters/po/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/po/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/pod/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/pod/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/pod/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/pony/ponyc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/powershell/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/powershell/powershell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/powershell/psscriptanalyzer.vim create mode 100644 dot_vim/plugged/ale/ale_linters/prolog/swipl.vim create mode 100644 dot_vim/plugged/ale/ale_linters/proto/buf_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/proto/protoc_gen_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/proto/protolint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/pug/puglint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/puppet/languageserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/puppet/puppet.vim create mode 100644 dot_vim/plugged/ale/ale_linters/puppet/puppetlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/purescript/ls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/pyrex/cython.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/bandit.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/flake8.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/flakehell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/jedils.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/mypy.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/prospector.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/pycodestyle.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/pydocstyle.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/pyflakes.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/pylama.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/pylint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/pylsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/pyre.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/pyright.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/refurb.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/ruff.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/unimport.vim create mode 100644 dot_vim/plugged/ale/ale_linters/python/vulture.vim create mode 100644 dot_vim/plugged/ale/ale_linters/qml/qmlfmt.vim create mode 100644 dot_vim/plugged/ale/ale_linters/qml/qmllint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/r/languageserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/r/lintr.vim create mode 100644 dot_vim/plugged/ale/ale_linters/racket/langserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/racket/raco.vim create mode 100644 dot_vim/plugged/ale/ale_linters/reason/ls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/reason/merlin.vim create mode 100644 dot_vim/plugged/ale/ale_linters/reason/ols.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rego/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rego/opacheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/review/redpen.vim create mode 100644 dot_vim/plugged/ale/ale_linters/robot/rflint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rst/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rst/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rst/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rst/redpen.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rst/rstcheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rst/textlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rst/vale.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rst/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/brakeman.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/debride.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/rails_best_practices.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/reek.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/rubocop.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/ruby.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/solargraph.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/sorbet.vim create mode 100644 dot_vim/plugged/ale/ale_linters/ruby/standardrb.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rust/analyzer.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rust/cargo.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rust/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rust/rls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/rust/rustc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/salt/salt_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sass/sasslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sass/stylelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/scala/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/scala/fsc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/scala/metals.vim create mode 100644 dot_vim/plugged/ale/ale_linters/scala/sbtserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/scala/scalac.vim create mode 100644 dot_vim/plugged/ale/ale_linters/scala/scalastyle.vim create mode 100644 dot_vim/plugged/ale/ale_linters/scss/sasslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/scss/scsslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/scss/stylelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sh/bashate.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sh/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sh/language_server.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sh/shell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sh/shellcheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/slim/slimlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sml/smlnj.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sml/smlnj_cm.vim create mode 100644 dot_vim/plugged/ale/ale_linters/solidity/solc.vim create mode 100644 dot_vim/plugged/ale/ale_linters/solidity/solhint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/solidity/solium.vim create mode 100644 dot_vim/plugged/ale/ale_linters/spec/rpmlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sql/sqlfluff.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sql/sqlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sql/sqllint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/stylus/stylelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/sugarss/stylelint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/svelte/svelteserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/swift/appleswiftformat.vim create mode 100644 dot_vim/plugged/ale/ale_linters/swift/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/swift/sourcekitlsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/swift/swiftlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/systemd/systemd_analyze.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tcl/nagelfar.vim create mode 100644 dot_vim/plugged/ale/ale_linters/terraform/checkov.vim create mode 100644 dot_vim/plugged/ale/ale_linters/terraform/terraform.vim create mode 100644 dot_vim/plugged/ale/ale_linters/terraform/terraform_ls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/terraform/terraform_lsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/terraform/tflint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/terraform/tfsec.vim create mode 100644 dot_vim/plugged/ale/ale_linters/testft/testlinter.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/chktex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/lacheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/redpen.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/texlab.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/textlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/vale.vim create mode 100644 dot_vim/plugged/ale/ale_linters/tex/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/texinfo/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/texinfo/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/texinfo/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/texinfo/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/text/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/text/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/text/languagetool.vim create mode 100644 dot_vim/plugged/ale/ale_linters/text/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/text/redpen.vim create mode 100644 dot_vim/plugged/ale/ale_linters/text/textlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/text/vale.vim create mode 100644 dot_vim/plugged/ale/ale_linters/text/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/thrift/thrift.vim create mode 100644 dot_vim/plugged/ale/ale_linters/thrift/thriftcheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/typescript/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/typescript/deno.vim create mode 100644 dot_vim/plugged/ale/ale_linters/typescript/eslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/typescript/standard.vim create mode 100644 dot_vim/plugged/ale/ale_linters/typescript/tslint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/typescript/tsserver.vim create mode 100644 dot_vim/plugged/ale/ale_linters/typescript/typecheck.vim create mode 100644 dot_vim/plugged/ale/ale_linters/typescript/xo.vim create mode 100644 dot_vim/plugged/ale/ale_linters/v/v.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vala/vala_lint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/verilog/hdl_checker.vim create mode 100644 dot_vim/plugged/ale/ale_linters/verilog/iverilog.vim create mode 100644 dot_vim/plugged/ale/ale_linters/verilog/verilator.vim create mode 100644 dot_vim/plugged/ale/ale_linters/verilog/vlog.vim create mode 100644 dot_vim/plugged/ale/ale_linters/verilog/xvlog.vim create mode 100644 dot_vim/plugged/ale/ale_linters/verilog/yosys.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vhdl/ghdl.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vhdl/hdl_checker.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vhdl/vcom.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vhdl/xvhdl.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vim/ale_custom_linting_rules.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vim/vimls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vim/vint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vue/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vue/vls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/vue/volar.vim create mode 100644 dot_vim/plugged/ale/ale_linters/wgsl/naga.vim create mode 100644 dot_vim/plugged/ale/ale_linters/xhtml/alex.vim create mode 100644 dot_vim/plugged/ale/ale_linters/xhtml/cspell.vim create mode 100644 dot_vim/plugged/ale/ale_linters/xhtml/proselint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/xhtml/writegood.vim create mode 100644 dot_vim/plugged/ale/ale_linters/xml/xmllint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/yaml/actionlint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/yaml/circleci.vim create mode 100644 dot_vim/plugged/ale/ale_linters/yaml/gitlablint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/yaml/ls.vim create mode 100644 dot_vim/plugged/ale/ale_linters/yaml/spectral.vim create mode 100644 dot_vim/plugged/ale/ale_linters/yaml/swaglint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/yaml/yamllint.vim create mode 100644 dot_vim/plugged/ale/ale_linters/yang/yang_lsp.vim create mode 100644 dot_vim/plugged/ale/ale_linters/zeek/zeek.vim create mode 100644 dot_vim/plugged/ale/ale_linters/zig/zls.vim create mode 100644 dot_vim/plugged/ale/autoload/ale.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/ant.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/args.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/assert.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/balloon.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/c.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/code_action.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/codefix.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/command.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/completion.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/completion/python.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/cursor.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/d.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/debugging.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/definition.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/dhall.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/engine.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/engine/ignore.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/events.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/filename_mapping.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/filerename.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/filetypes.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fix.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fix/registry.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/appleswiftformat.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/astyle.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/autoflake.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/autoimport.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/autopep8.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/bibclean.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/black.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/brittany.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/buf_format.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/buildifier.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/clangformat.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/clangtidy.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/cmakeformat.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/crystal.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/css_beautify.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/dart_format.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/dartfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/deno.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/dfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/dhall_format.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/dhall_freeze.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/dhall_lint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/dotnet_format.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/dprint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/dune.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/elm_format.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/erblint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/erlfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/eslint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/fecs.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/fish_indent.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/fixjson.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/floskell.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/generic.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/generic_python.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/gnatpp.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/gofmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/gofumpt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/goimports.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/golines.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/gomod.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/google_java_format.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/hackfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/help.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/hfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/hindent.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/hlint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/html_beautify.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/importjs.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/isort.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/jq.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/jsonnetfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/ktlint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/latexindent.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/lua_format.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/luafmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/mix_format.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/nimpretty.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/nixfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/nixpkgsfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/ocamlformat.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/ocp_indent.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/opafmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/ormolu.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/packer.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/pandoc.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/perltidy.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/pgformatter.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/php_cs_fixer.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/phpcbf.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/pint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/prettier.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/prettier_eslint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/prettier_standard.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/protolint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/ptop.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/puppetlint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/purs_tidy.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/purty.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/pyflyby.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/qmlfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/raco_fmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/refmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/remark_lint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/reorder_python_imports.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/rubocop.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/ruff.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/rufo.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/rustfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/scalafmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/shfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/sorbet.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/sqlfluff.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/sqlfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/sqlformat.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/standard.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/standardrb.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/statix.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/stylelint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/styler.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/stylish_haskell.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/stylua.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/swiftformat.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/syntax_tree.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/terraform.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/textlint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/tidy.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/tslint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/uncrustify.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/vfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/xmllint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/xo.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/yamlfix.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/yapf.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/fixers/zigfmt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/floating_preview.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/go.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/gradle.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/gradle/init.gradle create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/actionlint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/alex.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/atools.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/ccls.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/cppcheck.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/cpplint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/cspell.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/css.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/deno.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/elixir.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/eslint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/fecs.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/flawfinder.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/gawk.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/gcc.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/go.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/haskell.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/haskell_stack.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/hdl_checker.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/hlint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/inko.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/ktlint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/languagetool.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/markdownlint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/naga.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/ocamllsp.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/ols.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/openscad.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/pony.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/redpen.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/ruby.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/rust.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/scala.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/sh.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/shellcheck.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/sml.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/solhint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/spectral.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/statix.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/textlint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/tslint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/tsserver.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/unix.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/vale.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/writegood.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/xo.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/handlers/yamllint.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/highlight.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/history.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/hover.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/java.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/job.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/julia.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/linter.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/list.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/loclist_jumping.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/lsp.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/lsp/message.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/lsp/reset.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/lsp/response.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/lsp/tsserver_message.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/lsp_linter.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/lsp_window.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/maven.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/node.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/organize_imports.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/other_source.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/path.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/pattern_options.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/powershell.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/preview.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/python.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/racket.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/references.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/rename.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/ruby.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/semver.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/sign.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/socket.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/statusline.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/swift.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/symbol.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/test.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/toggle.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/uri.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/uri/jdt.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/util.vim create mode 100644 dot_vim/plugged/ale/autoload/ale/virtualtext.vim create mode 100644 dot_vim/plugged/ale/autoload/asyncomplete/sources/ale.vim create mode 100644 dot_vim/plugged/ale/doc/ale-ada.txt create mode 100644 dot_vim/plugged/ale/doc/ale-ansible.txt create mode 100644 dot_vim/plugged/ale/doc/ale-apkbuild.txt create mode 100644 dot_vim/plugged/ale/doc/ale-asciidoc.txt create mode 100644 dot_vim/plugged/ale/doc/ale-asm.txt create mode 100644 dot_vim/plugged/ale/doc/ale-avra.txt create mode 100644 dot_vim/plugged/ale/doc/ale-awk.txt create mode 100644 dot_vim/plugged/ale/doc/ale-bats.txt create mode 100644 dot_vim/plugged/ale/doc/ale-bazel.txt create mode 100644 dot_vim/plugged/ale/doc/ale-bib.txt create mode 100644 dot_vim/plugged/ale/doc/ale-bicep.txt create mode 100644 dot_vim/plugged/ale/doc/ale-bitbake.txt create mode 100644 dot_vim/plugged/ale/doc/ale-c.txt create mode 100644 dot_vim/plugged/ale/doc/ale-cairo.txt create mode 100644 dot_vim/plugged/ale/doc/ale-chef.txt create mode 100644 dot_vim/plugged/ale/doc/ale-clojure.txt create mode 100644 dot_vim/plugged/ale/doc/ale-cloudformation.txt create mode 100644 dot_vim/plugged/ale/doc/ale-cmake.txt create mode 100644 dot_vim/plugged/ale/doc/ale-cpp.txt create mode 100644 dot_vim/plugged/ale/doc/ale-cs.txt create mode 100644 dot_vim/plugged/ale/doc/ale-css.txt create mode 100644 dot_vim/plugged/ale/doc/ale-cuda.txt create mode 100644 dot_vim/plugged/ale/doc/ale-d.txt create mode 100644 dot_vim/plugged/ale/doc/ale-dafny.txt create mode 100644 dot_vim/plugged/ale/doc/ale-dart.txt create mode 100644 dot_vim/plugged/ale/doc/ale-desktop.txt create mode 100644 dot_vim/plugged/ale/doc/ale-development.txt create mode 100644 dot_vim/plugged/ale/doc/ale-dhall.txt create mode 100644 dot_vim/plugged/ale/doc/ale-dockerfile.txt create mode 100644 dot_vim/plugged/ale/doc/ale-elixir.txt create mode 100644 dot_vim/plugged/ale/doc/ale-elm.txt create mode 100644 dot_vim/plugged/ale/doc/ale-erlang.txt create mode 100644 dot_vim/plugged/ale/doc/ale-eruby.txt create mode 100644 dot_vim/plugged/ale/doc/ale-fish.txt create mode 100644 dot_vim/plugged/ale/doc/ale-fortran.txt create mode 100644 dot_vim/plugged/ale/doc/ale-fountain.txt create mode 100644 dot_vim/plugged/ale/doc/ale-fuse.txt create mode 100644 dot_vim/plugged/ale/doc/ale-gitcommit.txt create mode 100644 dot_vim/plugged/ale/doc/ale-glsl.txt create mode 100644 dot_vim/plugged/ale/doc/ale-go.txt create mode 100644 dot_vim/plugged/ale/doc/ale-graphql.txt create mode 100644 dot_vim/plugged/ale/doc/ale-hack.txt create mode 100644 dot_vim/plugged/ale/doc/ale-handlebars.txt create mode 100644 dot_vim/plugged/ale/doc/ale-haskell.txt create mode 100644 dot_vim/plugged/ale/doc/ale-hcl.txt create mode 100644 dot_vim/plugged/ale/doc/ale-help.txt create mode 100644 dot_vim/plugged/ale/doc/ale-html.txt create mode 100644 dot_vim/plugged/ale/doc/ale-idris.txt create mode 100644 dot_vim/plugged/ale/doc/ale-ink.txt create mode 100644 dot_vim/plugged/ale/doc/ale-inko.txt create mode 100644 dot_vim/plugged/ale/doc/ale-ispc.txt create mode 100644 dot_vim/plugged/ale/doc/ale-java.txt create mode 100644 dot_vim/plugged/ale/doc/ale-javascript.txt create mode 100644 dot_vim/plugged/ale/doc/ale-json.txt create mode 100644 dot_vim/plugged/ale/doc/ale-json5.txt create mode 100644 dot_vim/plugged/ale/doc/ale-jsonc.txt create mode 100644 dot_vim/plugged/ale/doc/ale-jsonnet.txt create mode 100644 dot_vim/plugged/ale/doc/ale-julia.txt create mode 100644 dot_vim/plugged/ale/doc/ale-kotlin.txt create mode 100644 dot_vim/plugged/ale/doc/ale-latex.txt create mode 100644 dot_vim/plugged/ale/doc/ale-less.txt create mode 100644 dot_vim/plugged/ale/doc/ale-llvm.txt create mode 100644 dot_vim/plugged/ale/doc/ale-lua.txt create mode 100644 dot_vim/plugged/ale/doc/ale-make.txt create mode 100644 dot_vim/plugged/ale/doc/ale-markdown.txt create mode 100644 dot_vim/plugged/ale/doc/ale-mercury.txt create mode 100644 dot_vim/plugged/ale/doc/ale-nasm.txt create mode 100644 dot_vim/plugged/ale/doc/ale-nim.txt create mode 100644 dot_vim/plugged/ale/doc/ale-nix.txt create mode 100644 dot_vim/plugged/ale/doc/ale-nroff.txt create mode 100644 dot_vim/plugged/ale/doc/ale-objc.txt create mode 100644 dot_vim/plugged/ale/doc/ale-objcpp.txt create mode 100644 dot_vim/plugged/ale/doc/ale-ocaml.txt create mode 100644 dot_vim/plugged/ale/doc/ale-openapi.txt create mode 100644 dot_vim/plugged/ale/doc/ale-openscad.txt create mode 100644 dot_vim/plugged/ale/doc/ale-packer.txt create mode 100644 dot_vim/plugged/ale/doc/ale-pascal.txt create mode 100644 dot_vim/plugged/ale/doc/ale-pawn.txt create mode 100644 dot_vim/plugged/ale/doc/ale-perl.txt create mode 100644 dot_vim/plugged/ale/doc/ale-perl6.txt create mode 100644 dot_vim/plugged/ale/doc/ale-php.txt create mode 100644 dot_vim/plugged/ale/doc/ale-po.txt create mode 100644 dot_vim/plugged/ale/doc/ale-pod.txt create mode 100644 dot_vim/plugged/ale/doc/ale-pony.txt create mode 100644 dot_vim/plugged/ale/doc/ale-powershell.txt create mode 100644 dot_vim/plugged/ale/doc/ale-prolog.txt create mode 100644 dot_vim/plugged/ale/doc/ale-proto.txt create mode 100644 dot_vim/plugged/ale/doc/ale-pug.txt create mode 100644 dot_vim/plugged/ale/doc/ale-puppet.txt create mode 100644 dot_vim/plugged/ale/doc/ale-purescript.txt create mode 100644 dot_vim/plugged/ale/doc/ale-pyrex.txt create mode 100644 dot_vim/plugged/ale/doc/ale-python.txt create mode 100644 dot_vim/plugged/ale/doc/ale-qml.txt create mode 100644 dot_vim/plugged/ale/doc/ale-r.txt create mode 100644 dot_vim/plugged/ale/doc/ale-racket.txt create mode 100644 dot_vim/plugged/ale/doc/ale-reasonml.txt create mode 100644 dot_vim/plugged/ale/doc/ale-rego.txt create mode 100644 dot_vim/plugged/ale/doc/ale-restructuredtext.txt create mode 100644 dot_vim/plugged/ale/doc/ale-robot.txt create mode 100644 dot_vim/plugged/ale/doc/ale-ruby.txt create mode 100644 dot_vim/plugged/ale/doc/ale-rust.txt create mode 100644 dot_vim/plugged/ale/doc/ale-salt.tmt create mode 100644 dot_vim/plugged/ale/doc/ale-sass.txt create mode 100644 dot_vim/plugged/ale/doc/ale-scala.txt create mode 100644 dot_vim/plugged/ale/doc/ale-scss.txt create mode 100644 dot_vim/plugged/ale/doc/ale-sh.txt create mode 100644 dot_vim/plugged/ale/doc/ale-sml.txt create mode 100644 dot_vim/plugged/ale/doc/ale-solidity.txt create mode 100644 dot_vim/plugged/ale/doc/ale-spec.txt create mode 100644 dot_vim/plugged/ale/doc/ale-sql.txt create mode 100644 dot_vim/plugged/ale/doc/ale-stylus.txt create mode 100644 dot_vim/plugged/ale/doc/ale-sugarss.txt create mode 100644 dot_vim/plugged/ale/doc/ale-supported-languages-and-tools.txt create mode 100644 dot_vim/plugged/ale/doc/ale-svelte.txt create mode 100644 dot_vim/plugged/ale/doc/ale-swift.txt create mode 100644 dot_vim/plugged/ale/doc/ale-systemd.txt create mode 100644 dot_vim/plugged/ale/doc/ale-tcl.txt create mode 100644 dot_vim/plugged/ale/doc/ale-terraform.txt create mode 100644 dot_vim/plugged/ale/doc/ale-tex.txt create mode 100644 dot_vim/plugged/ale/doc/ale-texinfo.txt create mode 100644 dot_vim/plugged/ale/doc/ale-text.txt create mode 100644 dot_vim/plugged/ale/doc/ale-thrift.txt create mode 100644 dot_vim/plugged/ale/doc/ale-toml.txt create mode 100644 dot_vim/plugged/ale/doc/ale-typescript.txt create mode 100644 dot_vim/plugged/ale/doc/ale-v.txt create mode 100644 dot_vim/plugged/ale/doc/ale-vala.txt create mode 100644 dot_vim/plugged/ale/doc/ale-verilog.txt create mode 100644 dot_vim/plugged/ale/doc/ale-vhdl.txt create mode 100644 dot_vim/plugged/ale/doc/ale-vim-help.txt create mode 100644 dot_vim/plugged/ale/doc/ale-vim.txt create mode 100644 dot_vim/plugged/ale/doc/ale-vue.txt create mode 100644 dot_vim/plugged/ale/doc/ale-wgsl.txt create mode 100644 dot_vim/plugged/ale/doc/ale-xhtml.txt create mode 100644 dot_vim/plugged/ale/doc/ale-xml.txt create mode 100644 dot_vim/plugged/ale/doc/ale-yaml.txt create mode 100644 dot_vim/plugged/ale/doc/ale-yang.txt create mode 100644 dot_vim/plugged/ale/doc/ale-zeek.txt create mode 100644 dot_vim/plugged/ale/doc/ale-zig.txt create mode 100644 dot_vim/plugged/ale/doc/ale.txt create mode 100644 dot_vim/plugged/ale/doc/tags create mode 100644 dot_vim/plugged/ale/dot_appveyor.yml create mode 100644 dot_vim/plugged/ale/dot_editorconfig create mode 100644 dot_vim/plugged/ale/dot_git/HEAD create mode 100644 dot_vim/plugged/ale/dot_git/branches/.keep create mode 100644 dot_vim/plugged/ale/dot_git/config create mode 100644 dot_vim/plugged/ale/dot_git/description create mode 100644 dot_vim/plugged/ale/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/ale/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/ale/dot_git/index create mode 100644 dot_vim/plugged/ale/dot_git/info/exclude create mode 100644 dot_vim/plugged/ale/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/ale/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/ale/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/ale/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/ale/dot_git/objects/pack/readonly_pack-065dba8ccc2287167c324ef036a5261c7f156062.idx create mode 100644 dot_vim/plugged/ale/dot_git/objects/pack/readonly_pack-065dba8ccc2287167c324ef036a5261c7f156062.pack create mode 100644 dot_vim/plugged/ale/dot_git/packed-refs create mode 100644 dot_vim/plugged/ale/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/ale/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/ale/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/ale/dot_git/shallow create mode 100644 dot_vim/plugged/ale/dot_gitattributes create mode 100644 dot_vim/plugged/ale/dot_github/CODE_OF_CONDUCT.md create mode 100644 dot_vim/plugged/ale/dot_github/CONTRIBUTING.md create mode 100644 dot_vim/plugged/ale/dot_github/ISSUE_TEMPLATE/config.yml create mode 100644 dot_vim/plugged/ale/dot_github/ISSUE_TEMPLATE/report-a-bug.md create mode 100644 dot_vim/plugged/ale/dot_github/ISSUE_TEMPLATE/suggest-a-new-linter-or-fixer.md create mode 100644 dot_vim/plugged/ale/dot_github/ISSUE_TEMPLATE/suggest-an-improvement.md create mode 100644 dot_vim/plugged/ale/dot_github/PULL_REQUEST_TEMPLATE.md create mode 100644 dot_vim/plugged/ale/dot_github/stale.yml create mode 100644 dot_vim/plugged/ale/dot_github/workflows/main.yml create mode 100644 dot_vim/plugged/ale/dot_gitignore create mode 100644 dot_vim/plugged/ale/dot_vintrc.yaml create mode 100644 dot_vim/plugged/ale/executable_run-tests create mode 100644 dot_vim/plugged/ale/ftplugin/ale-fix-suggest.vim create mode 100644 dot_vim/plugged/ale/ftplugin/ale-preview-selection.vim create mode 100644 dot_vim/plugged/ale/ftplugin/ale-preview.vim create mode 100644 dot_vim/plugged/ale/plugin/ale.vim create mode 100644 dot_vim/plugged/ale/rplugin/python3/deoplete/sources/ale.py create mode 100644 dot_vim/plugged/ale/run-tests.bat create mode 100644 dot_vim/plugged/ale/supported-tools.md create mode 100644 dot_vim/plugged/ale/syntax/ale-fix-suggest.vim create mode 100644 dot_vim/plugged/ale/syntax/ale-preview-selection.vim create mode 100644 dot_vim/plugged/ale/test/completion/test_ale_import_command.vader create mode 100644 dot_vim/plugged/ale/test/completion/test_complete_events.vader create mode 100644 dot_vim/plugged/ale/test/completion/test_completion_events.vader create mode 100644 dot_vim/plugged/ale/test/completion/test_completion_filtering.vader create mode 100644 dot_vim/plugged/ale/test/completion/test_completion_prefixes.vader create mode 100644 dot_vim/plugged/ale/test/completion/test_lsp_completion_messages.vader create mode 100644 dot_vim/plugged/ale/test/completion/test_lsp_completion_parsing.vader create mode 100644 dot_vim/plugged/ale/test/completion/test_omnifunc_completion.vader create mode 100644 dot_vim/plugged/ale/test/completion/test_public_completion_api.vader create mode 100644 dot_vim/plugged/ale/test/completion/test_tsserver_completion_parsing.vader create mode 100644 dot_vim/plugged/ale/test/dot_config/nvim/symlink_init.vim create mode 100644 dot_vim/plugged/ale/test/fix/test_ale_fix.vader create mode 100644 dot_vim/plugged/ale/test/fix/test_ale_fix_aliases.vader create mode 100644 dot_vim/plugged/ale/test/fix/test_ale_fix_completion.vader create mode 100644 dot_vim/plugged/ale/test/fix/test_ale_fix_completion_filter.vader create mode 100644 dot_vim/plugged/ale/test/fix/test_ale_fix_ignore.vader create mode 100644 dot_vim/plugged/ale/test/fix/test_ale_fix_suggest.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_appleswiftformat_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_astyle_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_autoflake_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_autoimport_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_autopep8_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_bibclean_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_black_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_break_up_long_lines_python_fixer.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_brittany_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_buf_format_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_buildifier_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_clangformat_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_clangtidy_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_cmakeformat_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_crystal_format_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_css_beautify_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_dart_format_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_dartfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_dfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_dhall_format_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_dhall_freeze_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_dhall_lint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_dotnet_format_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_dprint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_dune_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_elm_format_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_erblint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_erlfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_eslint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_fecs_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_fish_indent_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_fixjson_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_floskell_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_gnatpp_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_gofmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_gofumpt_fixer.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_goimports_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_golines_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_gomod_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_goofle_java_format_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_hackfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_hfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_hindent_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_hlint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_html_beautify_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_importjs_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_isort_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_jq_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_jsonnetfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_ktlint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_latexindent_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_lua_format_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_luafmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_mix_format_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_nimpretty_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_nixfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_nixpkgsfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_ocamlformat_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_ocp_indent_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_opa_fmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_ormolu_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_packer_fmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_pandoc_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_perltidy_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_pgformatter_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_php_cs_fixer.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_phpcbf_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_pint_fixer.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_prettier_eslint_fixer.callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_prettier_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_prettier_standard_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_protolint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_ptop_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_puppetlint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_purs_tidy_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_purty_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_pyflyby_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_python_add_blank_lines_fixer.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_qmlfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_raco_fmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_refmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_remark_lint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_reorder_python_imports_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_rubocop_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_ruff_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_rufo_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_rustfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_scalafmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_shfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_sorbet_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_sqlfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_sqlformat_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_standard_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_standardrb_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_statix_fixer.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_stylelint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_styler_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_stylish_haskell_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_stylua_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_swiftformat_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_syntax_tree_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_terraform_fmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_textlint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_tidy_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_trim_whitespace.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_tslint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_uncrustify_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_vfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_vim_help_tags_alignment_fixer.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_xmllint_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_xo_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_xots_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_yamlfix_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_yapf_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/fixers/test_zigfmt_fixer_callback.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_actionlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ada_gcc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_alex_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ameba_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ansible_lint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_appleswiftformat_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_asm_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_atools_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_avra_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_bandit_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_bashate_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_bibclean_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_bicep_bicep_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_bitbake_oelint_adv_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_brakeman_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_cfn_python_lint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_checkmake_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_checkov_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_checkstyle_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_circleci_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_clang_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_clojure_clj_kondo_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_clojure_joker_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_cmake_lint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_coffeelint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_common_handlers.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_cookstyle_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_cppcheck_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_cpplint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_credo_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_crystal_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_csc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_cspell_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_cucumber_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_cuda_nvcc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_cypher_lint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_dafny_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_dart_analyze_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_debride_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_desktop_file_validate_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_dmd_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_dockerfile_lint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_dogma_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_drafter_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_elmmake_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_embertemplatelint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_erblint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_erlang_dialyzer_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_erlang_elvis_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_eslint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_eslint_json_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_fecs_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_fish_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_flake8_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_flakehell_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_flawfinder_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_flow_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_foodcritic_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_fortran_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_gawk_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_gcc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ghc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ghc_mod_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ghdl_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_gitlablint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_gitlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_glslang_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_go_generic_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_gobuild_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_golangci_lint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_gometalinter_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_hadolint.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_haskell_stack_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_hlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ibm_openapi_validator_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_idris_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_inko_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ispc_ispc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_javac_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_jscs_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ktlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_lacheck_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_languagetool_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_lessc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_llc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_lua_selene_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_luac_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_luacheck_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_markdownlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_mcs_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_mcsc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_mdl_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_mercury_mmc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_mix_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_msgfmt_hander.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_mypy_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_naga_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_nagelfar_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_nasm_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_nim_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_nix_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_openscad_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_perl6_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_perl_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_perlcritic_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_php_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_php_phan_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_php_phpmd_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_phpcs_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_phpstan_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_pmd_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_pony_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_powershell_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_prospector_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_psscriptanalyzer_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_puglint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_puppet_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_pycodestyle_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_pydocstyle_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_pyflakes_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_pylama_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_pylint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_pyrex_cython_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_qmlfmt_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_qmllint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_raco_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_rails_best_practices_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_redpen_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_reek_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_remark_lint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_rflint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_rpmlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_rstcheck_lint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_rubocop_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_ruby_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_rust_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_salt_salt_lint.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_scala_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_scalastyle_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_shell_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_shellcheck_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_slim_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_sml_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_solc_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_solhint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_spectral_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_sql_sqlfluff_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_sqlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_sqllint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_standard_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_starknet_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_statix_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_stylelint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_swaglint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_swiftlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_swipl_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_syntaxerl_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_systemd_analyze_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_terraform_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_textlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_tflint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_tfsec_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_thrift_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_thriftcheck_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_tlint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_tslint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_typecheck_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_unimport_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_v_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_vala_lint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_vale_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_vcom_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_verilator_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_vint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_vlog_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_vulture_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_write_good_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_xmllint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_xvhdl_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_xvlog_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_yamllint_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_yosys_handler.vader create mode 100644 dot_vim/plugged/ale/test/handler/test_zeek_handler.vader create mode 100644 dot_vim/plugged/ale/test/jsonnet_files/testfile.jsonnet create mode 100644 dot_vim/plugged/ale/test/linter/executable_test_bitbake.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ada_gcc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_adals.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_alex.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ameba.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_angular.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ansible_language_server.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ansible_lint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_asciidoc_textlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_asm_gcc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_avra_avra.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_bandit.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_bashate.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_bib_bibclean.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_bicep_bicep.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_bingo.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_brakeman.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_buf_lint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_c_cc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_c_ccls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_c_clang_tidy.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_c_clangd.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_c_cppcheck.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_c_cquery.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_c_flawfinder.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_c_import_paths.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cargo.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_checkmake.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_checkov.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_checkstyle.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_circleci.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_clang_tidy.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_clj_kondo.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cmake_cmake_lint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cookstyle.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cpp_cc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cpp_ccls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cpp_clangcheck.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cpp_clazy.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cpp_cppcheck.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cpp_cquery.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cpp_flawfinder.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cpplint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cs_csc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cs_mcs.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cs_mcsc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cspell.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cucumber.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cuda_nvcc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_cypher_cypher_lint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_d_dls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_dart_analysis_server.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_dart_language_server.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_desktop_file_validate.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_dialyxir.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_dmd_commandline.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_dockerfile_lint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_dogma.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_eclipselsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_elixir_credo.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_elixir_ls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_elixir_mix.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_elm_ls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_elm_make.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_embertemplatelint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_erb.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_erblint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_erlang_dialyzer.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_erlang_elvis.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_erlang_erlang_ls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_erlang_erlc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_erlang_syntaxerl.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_erubi.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_erubis.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_eslint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_fecs.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_flake8.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_flakehell.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_flow.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_foodcritic.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_fortran_fortls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_fsc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_fusionlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_gawk.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_gfortran.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ghdl.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_gitlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_glslang.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_glslls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_gobuild.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_gofmt.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_golangci_lint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_golangserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_golint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_gometalinter.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_gopls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_gosimple.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_gotype.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_govet.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_graphql_gqlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haml_hamllint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haskell_cabal_ghc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haskell_ghc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haskell_ghc_mod.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haskell_hdevtools.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haskell_hie.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haskell_hlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haskell_hls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haskell_stack_build.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_haskell_stack_ghc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_hdl_checker_options.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_html_stylelint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_htmlhint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ibm_openapi_validator.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_idris.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ink_ls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_inko_inko.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ispc_ispc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_iverilog.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_javac.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_javalsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_javascript_deno_lsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_javascript_tsserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_jq.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_jscs.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_jshint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_jsonnet_lint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_jsonnetfmt.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_julia_languageserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_kotlin_languageserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_kotlinc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_languagetool.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_less_stylelint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_lessc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_lintr.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_llc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_lua_selene.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_luac.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_luacheck.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_markdown_markdownlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_markdown_mdl.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_markdown_vale.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_mercury_mmc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_mypy.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_naga.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_nagelfar.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_nasm_nasm.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_nimlsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_nix_statix.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_objc_ccls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ocaml_ocamllsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ocaml_ols.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ocamlinterface_ocamllsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_openscad_sca2d.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_perl.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_perl6.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_perlcritic.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_php.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_php_intelephense.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_php_langserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_phpactor.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_phpcs.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_phpmd.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_phpstan.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pony_ponyc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_prospector.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_proto.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_protolint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_psalm.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_puglint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_purescript_ls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pycodestyle.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pydocstyle.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pyflakes.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pylama.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pylint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pylsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pyre.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pyrex_cython.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_pyright.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_qmlfmt.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_r_languageserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_racket_langserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_racket_raco.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_rails_best_practices.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_reason_ls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_reason_ols.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_reek.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_refurb.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_rego_opacheck.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_remark_lint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_revive.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_rflint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_rnix.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_rst_textlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_rubocop.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ruby.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ruby_debride.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ruby_solargraph.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ruff.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_rust_analyzer.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_rust_rls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_rustc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_ruumba.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_sass_sasslint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_scala_metals.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_scala_sbtserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_scalac.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_scalastyle.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_scss_sasslint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_scss_stylelint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_shellcheck.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_slimlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_solc.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_solc_commit.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_solhint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_sorbet.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_spectral.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_sql_sqlfluff.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_sqllint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_standard.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_standardrb.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_standardts.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_starknet.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_staticcheck.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_sugarss_stylelint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_svelteserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_swaglint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_swift_appleswiftformat.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_swift_sourcekitlsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_swiftlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_systemd_analyze.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_terraform_ls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_terraform_lsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_terraform_terraform.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_terraform_tflint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_terraform_tfsec.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_tex_lacheck.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_tex_textlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_texlab.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_textlint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_thrift.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_thriftcheck.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_tslint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_typescript_deno_lsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_typescript_tsserver.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_unimport.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_v_command_callback.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_vcom.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_verilator.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_vim_vimls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_vint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_vlog.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_volar.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_vulture.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_write_good.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_xmllint.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_xo.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_xots.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_xvhdl.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_xvlog.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_yaml_ls.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_yang_lsp.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_zeek.vader create mode 100644 dot_vim/plugged/ale/test/linter/test_zig_zls.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_closing_documents.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_did_save_event.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_engine_lsp_response_handling.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_handling_window_requests.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_lsp_client_messages.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_lsp_command_formatting.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_lsp_connections.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_lsp_custom_request.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_lsp_error_parsing.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_lsp_root_detection.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_lsp_startup.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_other_initialize_message_handling.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_read_lsp_diagnostics.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_reset_lsp.vader create mode 100644 dot_vim/plugged/ale/test/lsp/test_update_config.vader create mode 100644 dot_vim/plugged/ale/test/python/test_deoplete_source.py create mode 100644 dot_vim/plugged/ale/test/script/dumb_named_pipe_server.py create mode 100644 dot_vim/plugged/ale/test/script/dumb_tcp_client.py create mode 100644 dot_vim/plugged/ale/test/script/dumb_tcp_server.py create mode 100644 dot_vim/plugged/ale/test/script/executable_block-padding-checker create mode 100644 dot_vim/plugged/ale/test/script/executable_check-duplicate-tags create mode 100644 dot_vim/plugged/ale/test/script/executable_check-supported-tools-tables create mode 100644 dot_vim/plugged/ale/test/script/executable_check-tag-alignment create mode 100644 dot_vim/plugged/ale/test/script/executable_check-tag-references create mode 100644 dot_vim/plugged/ale/test/script/executable_check-toc create mode 100644 dot_vim/plugged/ale/test/script/executable_custom-checks create mode 100644 dot_vim/plugged/ale/test/script/executable_custom-linting-rules create mode 100644 dot_vim/plugged/ale/test/script/executable_run-vader-tests create mode 100644 dot_vim/plugged/ale/test/script/executable_run-vint create mode 100644 dot_vim/plugged/ale/test/sign/test_linting_sets_signs.vader create mode 100644 dot_vim/plugged/ale/test/sign/test_sign_column_highlighting.vader create mode 100644 dot_vim/plugged/ale/test/sign/test_sign_limits.vader create mode 100644 dot_vim/plugged/ale/test/sign/test_sign_parsing.vader create mode 100644 dot_vim/plugged/ale/test/sign/test_sign_placement.vader create mode 100644 dot_vim/plugged/ale/test/smoke_test.vader create mode 100644 dot_vim/plugged/ale/test/test-files/ada/empty_testfile.adb create mode 100644 dot_vim/plugged/ale/test/test-files/alex/node-modules-2/node_modules/alex/empty_cli.js create mode 100644 dot_vim/plugged/ale/test/test-files/alex/node-modules/node_modules/dot_bin/empty_alex create mode 100644 dot_vim/plugged/ale/test/test-files/angular/node_modules/@angular/language-server/bin/empty_ngserver create mode 100644 dot_vim/plugged/ale/test/test-files/angular/node_modules/@angular/language-service/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/ant/ant-project/empty_build.xml create mode 100644 dot_vim/plugged/ale/test/test-files/ant/bin/empty_executable_ant create mode 100644 dot_vim/plugged/ale/test/test-files/ant/bin/empty_executable_ant.exe create mode 100644 dot_vim/plugged/ale/test/test-files/bazel/empty_BUILD create mode 100644 dot_vim/plugged/ale/test/test-files/bazel/empty_WORKSPACE create mode 100644 dot_vim/plugged/ale/test/test-files/bazel/empty_defs.bzl create mode 100644 dot_vim/plugged/ale/test/test-files/bib/empty_dummy.bib create mode 100644 dot_vim/plugged/ale/test/test-files/c/build_compile_commands_project/build/empty_bad_folder_to_test_priority create mode 100644 dot_vim/plugged/ale/test/test-files/c/build_compile_commands_project/build/empty_compile_commands.json create mode 100644 dot_vim/plugged/ale/test/test-files/c/configure_project/empty_Makefile create mode 100644 dot_vim/plugged/ale/test/test-files/c/configure_project/empty_configure create mode 100644 dot_vim/plugged/ale/test/test-files/c/configure_project/include/empty_test.h create mode 100644 dot_vim/plugged/ale/test/test-files/c/configure_project/subdir/empty_Makefile create mode 100644 dot_vim/plugged/ale/test/test-files/c/empty_dummy.c create mode 100644 dot_vim/plugged/ale/test/test-files/c/git_and_nested_makefiles/include/empty_test.h create mode 100644 dot_vim/plugged/ale/test/test-files/c/git_and_nested_makefiles/src/empty_Makefile create mode 100644 dot_vim/plugged/ale/test/test-files/c/gnumakefile_project/empty_GNUmakefile create mode 100644 dot_vim/plugged/ale/test/test-files/c/gnumakefile_project/empty_file.c create mode 100644 dot_vim/plugged/ale/test/test-files/c/h_file_project/empty_Makefile create mode 100644 dot_vim/plugged/ale/test/test-files/c/h_file_project/empty_test.h create mode 100644 dot_vim/plugged/ale/test/test-files/c/h_file_project/subdir/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/c/hpp_file_project/empty_Makefile create mode 100644 dot_vim/plugged/ale/test/test-files/c/hpp_file_project/empty_test.hpp create mode 100644 dot_vim/plugged/ale/test/test-files/c/hpp_file_project/subdir/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/c/json_project/build/empty_compile_commands.json create mode 100644 dot_vim/plugged/ale/test/test-files/c/json_project/include/empty_test.h create mode 100644 dot_vim/plugged/ale/test/test-files/c/json_project/subdir/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/c/makefile_project/args create mode 100644 dot_vim/plugged/ale/test/test-files/c/makefile_project/empty_Makefile create mode 100644 dot_vim/plugged/ale/test/test-files/c/makefile_project/empty__astylerc create mode 100644 dot_vim/plugged/ale/test/test-files/c/makefile_project/include/empty_test.h create mode 100644 dot_vim/plugged/ale/test/test-files/c/makefile_project/subdir/args create mode 100644 dot_vim/plugged/ale/test/test-files/c/makefile_project/subdir/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/c/makefile_project/subdir/empty_file.c create mode 100644 dot_vim/plugged/ale/test/test-files/cargo/empty_Cargo.toml create mode 100644 dot_vim/plugged/ale/test/test-files/cargo/workspace_paths/empty_Cargo.toml create mode 100644 dot_vim/plugged/ale/test/test-files/cargo/workspace_paths/subpath/empty_Cargo.toml create mode 100644 dot_vim/plugged/ale/test/test-files/ccls/with_build_dir/unusual_build_dir_name/empty_compile_commands.json create mode 100644 dot_vim/plugged/ale/test/test-files/ccls/with_ccls-root/empty_dot_ccls-root create mode 100644 dot_vim/plugged/ale/test/test-files/ccls/with_ccls/empty_dot_ccls create mode 100644 dot_vim/plugged/ale/test/test-files/ccls/with_compile_commands_json/empty_compile_commands.json create mode 100644 dot_vim/plugged/ale/test/test-files/checkstyle/empty_other_config.xml create mode 100644 dot_vim/plugged/ale/test/test-files/clangd/with_build_dir/unusual_build_dir_name/empty_compile_commands.json create mode 100644 dot_vim/plugged/ale/test/test-files/clangd/with_compile_commands/empty_compile_commands.json create mode 100644 dot_vim/plugged/ale/test/test-files/clangformat/with_clangformat/empty_dot_clang-format create mode 100644 dot_vim/plugged/ale/test/test-files/cpp/empty_dot_astylerc create mode 100644 dot_vim/plugged/ale/test/test-files/cpp/empty_dummy.cpp create mode 100644 dot_vim/plugged/ale/test/test-files/cppcheck/one/empty_compile_commands.json create mode 100644 dot_vim/plugged/ale/test/test-files/cppcheck/one/two/three/empty_file.c create mode 100644 dot_vim/plugged/ale/test/test-files/cppcheck/one/two/three/empty_file.cpp create mode 100644 dot_vim/plugged/ale/test/test-files/cppcheck/with_build_dir/build/empty_compile_commands.json create mode 100644 dot_vim/plugged/ale/test/test-files/cquery/build/empty_compile_commands.json create mode 100644 dot_vim/plugged/ale/test/test-files/cquery/with_cquery/empty_dot_cquery create mode 100644 dot_vim/plugged/ale/test/test-files/cspell/node-modules-2/node_modules/cspell/empty_executable_bin.js create mode 100644 dot_vim/plugged/ale/test/test-files/cspell/node-modules/node_modules/dot_bin/empty_executable_cspell create mode 100644 dot_vim/plugged/ale/test/test-files/csslint/other-app/empty_testfile.css create mode 100644 dot_vim/plugged/ale/test/test-files/csslint/some-app/empty_dot_csslintrc create mode 100644 dot_vim/plugged/ale/test/test-files/csslint/some-app/subdir/empty_testfile.css create mode 100644 dot_vim/plugged/ale/test/test-files/cucumber/features/empty_cuke.feature create mode 100644 dot_vim/plugged/ale/test/test-files/cucumber/features/step_definitions/empty_base_steps.rb create mode 100644 dot_vim/plugged/ale/test/test-files/d/empty_test.d create mode 100644 dot_vim/plugged/ale/test/test-files/dart/empty_dot_packages create mode 100644 dot_vim/plugged/ale/test/test-files/dart/empty_testfile.dart create mode 100644 dot_vim/plugged/ale/test/test-files/dot_circleci/empty_config.yml create mode 100644 dot_vim/plugged/ale/test/test-files/dot_gitignore create mode 100644 dot_vim/plugged/ale/test/test-files/dprint/empty_blank.ts create mode 100644 dot_vim/plugged/ale/test/test-files/dprint/empty_dprint.json create mode 100644 dot_vim/plugged/ale/test/test-files/elixir/empty_testfile.ex create mode 100644 dot_vim/plugged/ale/test/test-files/elixir/mix_project/lib/empty_app.ex create mode 100644 dot_vim/plugged/ale/test/test-files/elixir/mix_project/mix.exs create mode 100644 dot_vim/plugged/ale/test/test-files/elixir/umbrella_project/apps/app1/empty_mix.exs create mode 100644 dot_vim/plugged/ale/test/test-files/elixir/umbrella_project/apps/app1/lib/empty_app.ex create mode 100644 dot_vim/plugged/ale/test/test-files/elixir/umbrella_project/apps/app2/empty_mix.exs create mode 100644 dot_vim/plugged/ale/test/test-files/elixir/umbrella_project/apps/app2/lib/empty_app.ex create mode 100644 dot_vim/plugged/ale/test/test-files/elixir/umbrella_project/empty_mix.exs create mode 100644 dot_vim/plugged/ale/test/test-files/elm/newapp-notests/empty_elm.json create mode 100644 dot_vim/plugged/ale/test/test-files/elm/newapp-notests/node_modules/dot_bin/empty_elm create mode 100644 dot_vim/plugged/ale/test/test-files/elm/newapp-notests/tests/empty_TestMain.elm create mode 100644 dot_vim/plugged/ale/test/test-files/elm/newapp/empty_elm.json create mode 100644 dot_vim/plugged/ale/test/test-files/elm/newapp/node_modules/dot_bin/empty_elm create mode 100644 dot_vim/plugged/ale/test/test-files/elm/newapp/node_modules/dot_bin/empty_elm-test create mode 100644 dot_vim/plugged/ale/test/test-files/elm/newapp/src/empty_Main.elm create mode 100644 dot_vim/plugged/ale/test/test-files/elm/newapp/tests/empty_TestSuite.elm create mode 100644 dot_vim/plugged/ale/test/test-files/elm/node_modules/dot_bin/empty_elm-format create mode 100644 dot_vim/plugged/ale/test/test-files/elm/oldapp/empty_elm-package.json create mode 100644 dot_vim/plugged/ale/test/test-files/elm/oldapp/node_modules/dot_bin/empty_elm create mode 100644 dot_vim/plugged/ale/test/test-files/elm/oldapp/node_modules/dot_bin/empty_elm-test create mode 100644 dot_vim/plugged/ale/test/test-files/elm/oldapp/src/empty_Main.elm create mode 100644 dot_vim/plugged/ale/test/test-files/elm/oldapp/tests/empty_TestSuite.elm create mode 100644 dot_vim/plugged/ale/test/test-files/elm/src/subdir/empty_testfile.elm create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/app/_build/default/lib/dep/empty_rebar.lock create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/app/_build/default/lib/dep/src/empty_dep.erl create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/app/empty_rebar.lock create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/app/src/empty_app.erl create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/app_with_erlang_ls_config/_build/default/lib/dep/empty_erlang_ls.config create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/app_with_erlang_ls_config/_build/default/lib/dep/src/empty_dep.erl create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/app_with_erlang_ls_config/empty_erlang_ls.config create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/app_with_erlang_ls_config/src/empty_app.erl create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/kerl_otp_root/empty_dot_kerl_config create mode 100644 dot_vim/plugged/ale/test/test-files/erlang/kerl_otp_root/lib/stdlib-4.1.1/src/empty_array.erl create mode 100644 dot_vim/plugged/ale/test/test-files/eruby/empty_dummy.html.erb create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/app-with-eslint-d/node_modules/dot_bin/empty_eslint_d create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/empty_package.json create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/node_modules/dot_bin/empty_eslint create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/other-app/subdir/empty_testfile.js create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/empty_dot_eslintrc.js create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/node_modules/eslint/bin/empty_eslint.js create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/node_modules/standard/bin/empty_cmd.js create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/node_modules/stylelint/bin/empty_stylelint.js create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/node_modules/xo/empty_cli.js create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/subdir-with-config/empty_dot_eslintrc create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/subdir-with-package-json/empty_package.json create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/subdir-with-package-json/node_modules/empty_dot_gitkeep create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/subdir/empty_testfile.css create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/subdir/empty_testfile.js create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/react-app/subdir/empty_testfile.ts create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/yarn2-app/dot_yarn/sdks/eslint/bin/empty_eslint.js create mode 100644 dot_vim/plugged/ale/test/test-files/eslint/yarn2-app/subdir/empty_testfile.js create mode 100644 dot_vim/plugged/ale/test/test-files/fecs/empty_executable_fecs create mode 100644 dot_vim/plugged/ale/test/test-files/fecs/empty_executable_fecs.exe create mode 100644 dot_vim/plugged/ale/test/test-files/fish/empty_testfile.fish create mode 100644 dot_vim/plugged/ale/test/test-files/flow/a/empty_dot_flowconfig create mode 100644 dot_vim/plugged/ale/test/test-files/flow/a/sub/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/flow/b/sub/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/fortls-project/dot_fortls create mode 100644 dot_vim/plugged/ale/test/test-files/go/empty_testfile.go create mode 100644 dot_vim/plugged/ale/test/test-files/go/empty_testfile2.go create mode 100644 dot_vim/plugged/ale/test/test-files/go/go1/prj1/empty_file.go create mode 100644 dot_vim/plugged/ale/test/test-files/go/go2/prj2/empty_file.go create mode 100644 dot_vim/plugged/ale/test/test-files/go/gopath/bin/empty_gopls create mode 100644 dot_vim/plugged/ale/test/test-files/go/gopath/bin/empty_staticcheck create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/build-gradle-project/empty_build.gradle create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/build-gradle-project/src/main/kotlin/empty_dummy.kt create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/empty_executable_gradle create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/non-gradle-project/src/main/kotlin/empty_dummy.kt create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/settings-gradle-project/empty_settings.gradle create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/settings-gradle-project/src/main/kotlin/empty_dummy.kt create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/unwrapped-project/empty_build.gradle create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/unwrapped-project/empty_settings.gradle create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/unwrapped-project/src/main/kotlin/empty_dummy.kt create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/wrapped-project/empty_build.gradle create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/wrapped-project/empty_gradlew create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/wrapped-project/empty_settings.gradle create mode 100644 dot_vim/plugged/ale/test/test-files/gradle/wrapped-project/src/main/kotlin/empty_dummy.kt create mode 100644 dot_vim/plugged/ale/test/test-files/hamllint/haml-lint-and-rubocop/empty_dot_haml-lint.yml create mode 100644 dot_vim/plugged/ale/test/test-files/hamllint/haml-lint-and-rubocop/empty_dot_rubocop.yml create mode 100644 dot_vim/plugged/ale/test/test-files/hamllint/haml-lint-and-rubocop/subdir/empty_file.haml create mode 100644 dot_vim/plugged/ale/test/test-files/hamllint/haml-lint-yml/empty_dot_haml-lint.yml create mode 100644 dot_vim/plugged/ale/test/test-files/hamllint/haml-lint-yml/subdir/empty_file.haml create mode 100644 dot_vim/plugged/ale/test/test-files/hamllint/rubocop-yml/empty_dot_rubocop.yml create mode 100644 dot_vim/plugged/ale/test/test-files/hamllint/rubocop-yml/subdir/empty_file.haml create mode 100644 dot_vim/plugged/ale/test/test-files/hdl_server/empty_foo.vhd create mode 100644 dot_vim/plugged/ale/test/test-files/hdl_server/with_config_file/empty__hdl_checker.config create mode 100644 dot_vim/plugged/ale/test/test-files/hdl_server/with_config_file/empty_dot_hdl_checker.config create mode 100644 dot_vim/plugged/ale/test/test-files/hdl_server/with_config_file/empty_foo.vhd create mode 100644 dot_vim/plugged/ale/test/test-files/hie_paths/empty_file.hs create mode 100644 dot_vim/plugged/ale/test/test-files/html_beautify/empty_executable_html-beautify create mode 100644 dot_vim/plugged/ale/test/test-files/html_beautify/empty_test.html create mode 100644 dot_vim/plugged/ale/test/test-files/htmlhint/node_modules/dot_bin/empty_executable_htmlhint create mode 100644 dot_vim/plugged/ale/test/test-files/htmlhint/with_config/empty_dot_htmlhintrc create mode 100644 dot_vim/plugged/ale/test/test-files/ink/story/empty_main.ink create mode 100644 dot_vim/plugged/ale/test/test-files/inko/empty_test.inko create mode 100644 dot_vim/plugged/ale/test/test-files/inko/tests/test/empty_test_foo.inko create mode 100644 dot_vim/plugged/ale/test/test-files/java/no_main/src/test/java/com/something/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/java/with_jaxb/src/main/java/com/something/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/java/with_jaxb/src/main/jaxb/com/something/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/java/with_main/build/gen/main/java/com/something/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/java/with_main/build/gen2/main/java/com/something/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/java/with_main/src/main/java/com/something/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/java/with_main/src/test/java/com/something/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/javascript/empty_test.js create mode 100644 dot_vim/plugged/ale/test/test-files/javascript_deno/custom_import_map.json create mode 100644 dot_vim/plugged/ale/test/test-files/javascript_deno/import_map.json create mode 100644 dot_vim/plugged/ale/test/test-files/javascript_deno/main.js create mode 100644 dot_vim/plugged/ale/test/test-files/javascript_deno/tsconfig.json create mode 100644 dot_vim/plugged/ale/test/test-files/json/testfile.json create mode 100644 dot_vim/plugged/ale/test/test-files/jsonlint/app-without-jsonlint/src/empty_app.json create mode 100644 dot_vim/plugged/ale/test/test-files/jsonlint/app/node_modules/dot_bin/empty_jsonlint create mode 100644 dot_vim/plugged/ale/test/test-files/jsonlint/app/src/empty_app.json create mode 100644 dot_vim/plugged/ale/test/test-files/jsonlint/node_modules/jsonlint/lib/empty_cli.js create mode 100644 dot_vim/plugged/ale/test/test-files/julia/empty_REQUIRE create mode 100644 dot_vim/plugged/ale/test/test-files/julia/empty_test.jl create mode 100644 dot_vim/plugged/ale/test/test-files/kotlin/empty_testfile.kt create mode 100644 dot_vim/plugged/ale/test/test-files/lessc/node_modules/dot_bin/empty_executable_lessc create mode 100644 dot_vim/plugged/ale/test/test-files/long-line/setup.cfg create mode 100644 dot_vim/plugged/ale/test/test-files/lua/empty_testfile.lua create mode 100644 dot_vim/plugged/ale/test/test-files/markdown/empty_testfile.md create mode 100644 dot_vim/plugged/ale/test/test-files/maven/empty_executable_mvn create mode 100644 dot_vim/plugged/ale/test/test-files/maven/maven-java-project/module1/empty_executable_mvnw create mode 100644 dot_vim/plugged/ale/test/test-files/maven/maven-java-project/module1/empty_executable_mvnw.cmd create mode 100644 dot_vim/plugged/ale/test/test-files/maven/maven-java-project/module1/src/main/java/empty_dummy1.java create mode 100644 dot_vim/plugged/ale/test/test-files/maven/maven-java-project/module2/src/main/java/empty_dummy2.java create mode 100644 dot_vim/plugged/ale/test/test-files/maven/non-maven-project/src/main/java/empty_dummy.java create mode 100644 dot_vim/plugged/ale/test/test-files/nim/with-git/src/empty_source.nim create mode 100644 dot_vim/plugged/ale/test/test-files/ocaml/empty_testfile.ml create mode 100644 dot_vim/plugged/ale/test/test-files/ocamllsp/empty_dune-project create mode 100644 dot_vim/plugged/ale/test/test-files/ols/empty_dot_merlin create mode 100644 dot_vim/plugged/ale/test/test-files/ols/node_modules/dot_bin/empty_ocaml-language-server create mode 100644 dot_vim/plugged/ale/test/test-files/pascal/empty_test.pas create mode 100644 dot_vim/plugged/ale/test/test-files/php/project-with-php-cs-fixer/empty_test.php create mode 100644 dot_vim/plugged/ale/test/test-files/php/project-with-php-cs-fixer/vendor/bin/empty_php-cs-fixer create mode 100644 dot_vim/plugged/ale/test/test-files/php/project-with-phpcbf/foo/empty_test.php create mode 100644 dot_vim/plugged/ale/test/test-files/php/project-with-phpcbf/vendor/bin/empty_phpcbf create mode 100644 dot_vim/plugged/ale/test/test-files/php/project-with-pint/empty_test.php create mode 100644 dot_vim/plugged/ale/test/test-files/php/project-with-pint/vendor/bin/empty_pint create mode 100644 dot_vim/plugged/ale/test/test-files/php/project-without-php-cs-fixer/empty_test.php create mode 100644 dot_vim/plugged/ale/test/test-files/php/project-without-phpcbf/foo/empty_test.php create mode 100644 dot_vim/plugged/ale/test/test-files/php/project-without-pint/empty_test.php create mode 100644 dot_vim/plugged/ale/test/test-files/php/vendor/bin/empty_executable_php-language-server.php create mode 100644 dot_vim/plugged/ale/test/test-files/php/with-composer/empty_composer.json create mode 100644 dot_vim/plugged/ale/test/test-files/php/with-composer/vendor/bin/empty_executable_php-language-server.php create mode 100644 dot_vim/plugged/ale/test/test-files/php/with-git/vendor/bin/empty_executable_php-language-server.php create mode 100644 dot_vim/plugged/ale/test/test-files/phpcs/project-with-phpcs/foo/empty_test.php create mode 100644 dot_vim/plugged/ale/test/test-files/phpcs/project-with-phpcs/vendor/bin/empty_phpcs create mode 100644 dot_vim/plugged/ale/test/test-files/phpcs/project-without-phpcs/foo/empty_test.php create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/empty_testfile create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/empty_testfile.css create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/empty_testfile.js create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/empty_testfile.json create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/empty_testfile.scss create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/empty_testfile.ts create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/with_config/empty_dot_prettierrc create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/with_config/empty_testfile.js create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/with_prettierignore/empty_dot_prettierignore create mode 100644 dot_vim/plugged/ale/test/test-files/prettier/with_prettierignore/src/empty_testfile.js create mode 100644 dot_vim/plugged/ale/test/test-files/proto/empty_testfile.proto create mode 100644 dot_vim/plugged/ale/test/test-files/psalm/vendor/bin/empty_executable_psalm create mode 100644 dot_vim/plugged/ale/test/test-files/puglint/empty_package.json create mode 100644 dot_vim/plugged/ale/test/test-files/puglint/node_modules/dot_bin/empty_pug-lint create mode 100644 dot_vim/plugged/ale/test/test-files/puglint/puglint_rc_dir/empty_dot_pug-lintrc create mode 100644 dot_vim/plugged/ale/test/test-files/puglint/puglint_rc_js_dir/empty_dot_pug-lintrc.js create mode 100644 dot_vim/plugged/ale/test/test-files/puglint/puglint_rc_json_dir/empty_dot_pug-lintrc.json create mode 100644 dot_vim/plugged/ale/test/test-files/puppet/empty_dummy.pp create mode 100644 dot_vim/plugged/ale/test/test-files/puppet/new-style-module/empty_metadata.json create mode 100644 dot_vim/plugged/ale/test/test-files/puppet/new-style-module/lib/puppet/types/empty_exampletype.rb create mode 100644 dot_vim/plugged/ale/test/test-files/puppet/new-style-module/template/empty_template.epp create mode 100644 dot_vim/plugged/ale/test/test-files/puppet/old-style-module/manifests/empty_init.pp create mode 100644 dot_vim/plugged/ale/test/test-files/puppet/old-style-module/templates/empty_template.epp create mode 100644 dot_vim/plugged/ale/test/test-files/purescript/bower/empty_Foo.purs create mode 100644 dot_vim/plugged/ale/test/test-files/purescript/bower/empty_bower.json create mode 100644 dot_vim/plugged/ale/test/test-files/purescript/psc-package/empty_Foo.purs create mode 100644 dot_vim/plugged/ale/test/test-files/purescript/psc-package/empty_psc-package.json create mode 100644 dot_vim/plugged/ale/test/test-files/purescript/spago/empty_Foo.purs create mode 100644 dot_vim/plugged/ale/test/test-files/purescript/spago/empty_spago.dhall create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_manifest/MANIFEST.in create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_manifest/namespace/foo/empty___init__.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_manifest/namespace/foo/empty_bar.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_pytest/namespace/foo/empty___init__.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_pytest/namespace/foo/empty_bar.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_pytest/pytest.ini create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_setup/namespace/foo/empty___init__.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_setup/namespace/foo/empty_bar.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_setup/setup.cfg create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_tox/namespace/foo/empty___init__.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_tox/namespace/foo/empty_bar.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/namespace_package_tox/tox.ini create mode 100644 dot_vim/plugged/ale/test/test-files/python/no_virtualenv/subdir/foo/empty_COMMIT_EDITMSG create mode 100644 dot_vim/plugged/ale/test/test-files/python/no_virtualenv/subdir/foo/empty___init__.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/no_virtualenv/subdir/foo/empty_bar.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/pipenv/empty_Pipfile.lock create mode 100644 dot_vim/plugged/ale/test/test-files/python/poetry/empty_poetry.lock create mode 100644 dot_vim/plugged/ale/test/test-files/python/pyre_configuration_dir/empty_dot_pyre_configuration.local create mode 100644 dot_vim/plugged/ale/test/test-files/python/pyre_configuration_dir/foo/empty___init__.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/pyre_configuration_dir/foo/empty_bar.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/python-package-project/empty_dot_flake8 create mode 100644 dot_vim/plugged/ale/test/test-files/python/python-package-project/package-name/empty_module.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_bandit/empty_dot_bandit create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_bandit/namespace/foo/empty___init__.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_bandit/namespace/foo/empty_bar.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_mypy_ini_and_pytest_ini/empty_mypy.ini create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_mypy_ini_and_pytest_ini/tests/empty_pytest.ini create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_mypy_ini_and_pytest_ini/tests/testsubfolder/empty_my_tests.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/dir_with_yapf_config/empty_dot_style.yapf create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_activate create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_autoflake.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_autoimport.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_autopep8.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_black.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_flake8.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_flakehell.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_gitlint.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_isort.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_mypy.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_pyflakes.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_pylama.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_pylint.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_pylsp.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_pyre.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_refurb.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_reorder-python-imports.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_ruff.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_tidy-imports.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_unimport.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_vulture.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_executable_yapf.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/Scripts/empty_yamlfix.exe create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_activate create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_autoflake create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_autoimport create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_autopep8 create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_black create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_flake8 create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_flakehell create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_gitlint create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_isort create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_mypy create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_pyflakes create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_pylama create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_pylint create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_pylsp create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_pyre create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_refurb create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_reorder-python-imports create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_ruff create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_tidy-imports create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_unimport create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_vulture create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_yamlfix create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/env/bin/empty_executable_yapf create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/subdir/foo/empty_COMMIT_EDITMSG create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/subdir/foo/empty___init__.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/subdir/foo/empty_bar.py create mode 100644 dot_vim/plugged/ale/test/test-files/python/with_virtualenv/subdir/foo/empty_bar.pyi create mode 100644 dot_vim/plugged/ale/test/test-files/r/empty_dot_Rprofile create mode 100644 dot_vim/plugged/ale/test/test-files/racket/many-inits/a/b/c/foo.rkt create mode 100644 dot_vim/plugged/ale/test/test-files/racket/many-inits/a/b/c/init.rkt create mode 100644 dot_vim/plugged/ale/test/test-files/racket/many-inits/a/b/foo.rkt create mode 100644 dot_vim/plugged/ale/test/test-files/racket/many-inits/a/b/init.rkt create mode 100644 dot_vim/plugged/ale/test/test-files/racket/many-inits/a/foo.rkt create mode 100644 dot_vim/plugged/ale/test/test-files/racket/many-inits/a/init.rkt create mode 100644 dot_vim/plugged/ale/test/test-files/racket/many-inits/foo.rkt create mode 100644 dot_vim/plugged/ale/test/test-files/racket/many-inits/init.rkt create mode 100644 dot_vim/plugged/ale/test/test-files/racket/simple-script/foo.rkt create mode 100644 dot_vim/plugged/ale/test/test-files/reasonml/empty_bsconfig.json create mode 100644 dot_vim/plugged/ale/test/test-files/reasonml/empty_testfile.re create mode 100644 dot_vim/plugged/ale/test/test-files/remark_lint/with_bin_path/node_modules/dot_bin/empty_executable_remark create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/empty_dummy.rb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/not_a_rails_app/empty_file.rb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_rails_app/app/empty_dummy.rb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_rails_app/app/models/empty_thing.rb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_rails_app/app/views/empty_my_great_view.html.erb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_rails_app/config/empty_dummy.rb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_rails_app/db/empty_dummy.rb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_ruby_app1/empty_Rakefile create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_ruby_app1/lib/empty_file.rb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_ruby_app2/empty_Gemfile create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_ruby_app2/lib/empty_file.rb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_ruby_app3/empty_dot_solargraph.yml create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/valid_ruby_app3/lib/empty_file.rb create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/with_config/empty_dot_rubocop.yml create mode 100644 dot_vim/plugged/ale/test/test-files/ruby/with_config/empty_dot_standard.yml create mode 100644 dot_vim/plugged/ale/test/test-files/rust/cargo/empty_Cargo.toml create mode 100644 dot_vim/plugged/ale/test/test-files/rust/cargo/empty_testfile.rs create mode 100644 dot_vim/plugged/ale/test/test-files/rust/rust-project/empty_rust-project.json create mode 100644 dot_vim/plugged/ale/test/test-files/rust/rust-project/empty_testfile.rs create mode 100644 dot_vim/plugged/ale/test/test-files/sasslint/with-bin/node_modules/dot_bin/empty_executable_sass-lint create mode 100644 dot_vim/plugged/ale/test/test-files/sasslint/with-source/node_modules/sass-lint/bin/empty_executable_sass-lint.js create mode 100644 dot_vim/plugged/ale/test/test-files/scala/empty_dummy.scala create mode 100644 dot_vim/plugged/ale/test/test-files/scala/invalid_sbt_project/empty_Main.scala create mode 100644 dot_vim/plugged/ale/test/test-files/scala/valid_sbt_project/empty_Main.scala create mode 100644 dot_vim/plugged/ale/test/test-files/scala/valid_sbt_project/empty_build.sbt create mode 100644 dot_vim/plugged/ale/test/test-files/slimlint/empty_dot_rubocop.yml create mode 100644 dot_vim/plugged/ale/test/test-files/slimlint/subdir/empty_file.slim create mode 100644 dot_vim/plugged/ale/test/test-files/smlnj/cm/empty_foo.sml create mode 100644 dot_vim/plugged/ale/test/test-files/smlnj/cm/empty_sources.cm create mode 100644 dot_vim/plugged/ale/test/test-files/smlnj/cm/path/to/empty_bar.sml create mode 100644 dot_vim/plugged/ale/test/test-files/smlnj/file/empty_qux.sml create mode 100644 dot_vim/plugged/ale/test/test-files/solhint/empty_Contract.sol create mode 100644 dot_vim/plugged/ale/test/test-files/solhint/empty_package.json create mode 100644 dot_vim/plugged/ale/test/test-files/solhint/node_modules/dot_bin/empty_solhint create mode 100644 dot_vim/plugged/ale/test/test-files/solhint/node_modules/solhint/empty_index.js create mode 100644 dot_vim/plugged/ale/test/test-files/spectral/empty_openapi.yaml create mode 100644 dot_vim/plugged/ale/test/test-files/spectral/node_modules/dot_bin/empty_spectral create mode 100644 dot_vim/plugged/ale/test/test-files/stack/empty_stack.yaml create mode 100644 dot_vim/plugged/ale/test/test-files/standard/with-bin/node_modules/dot_bin/empty_executable_standard create mode 100644 dot_vim/plugged/ale/test/test-files/standard/with-cmd/node_modules/standard/bin/empty_executable_cmd.js create mode 100644 dot_vim/plugged/ale/test/test-files/stylelint/node_modules/dot_bin/empty_executable_stylelint create mode 100644 dot_vim/plugged/ale/test/test-files/swaglint/docs/empty_swagger.yaml create mode 100644 dot_vim/plugged/ale/test/test-files/swaglint/node_modules/dot_bin/empty_swaglint create mode 100644 dot_vim/plugged/ale/test/test-files/swift/empty_dummy.swift create mode 100644 dot_vim/plugged/ale/test/test-files/swift/non-swift-package-project/src/folder/empty_dummy.swift create mode 100644 dot_vim/plugged/ale/test/test-files/swift/swift-package-project-with-config/dot_swift-format create mode 100644 dot_vim/plugged/ale/test/test-files/swift/swift-package-project-with-config/empty_Package.swift create mode 100644 dot_vim/plugged/ale/test/test-files/swift/swift-package-project-with-config/src/folder/empty_dummy.swift create mode 100644 dot_vim/plugged/ale/test/test-files/swift/swift-package-project/empty_Package.swift create mode 100644 dot_vim/plugged/ale/test/test-files/swift/swift-package-project/src/folder/empty_dummy.swift create mode 100644 dot_vim/plugged/ale/test/test-files/swiftlint/cocoapods-and-react-native/Pods/SwiftLint/empty_swiftlint create mode 100644 dot_vim/plugged/ale/test/test-files/swiftlint/cocoapods-and-react-native/ios/Pods/SwiftLint/empty_swiftlint create mode 100644 dot_vim/plugged/ale/test/test-files/swiftlint/cocoapods/Pods/SwiftLint/empty_swiftlint create mode 100644 dot_vim/plugged/ale/test/test-files/swiftlint/react-native/ios/Pods/SwiftLint/empty_swiftlint create mode 100644 dot_vim/plugged/ale/test/test-files/terraform/dot_terraform/empty_dummy create mode 100644 dot_vim/plugged/ale/test/test-files/terraform/empty_main.tf create mode 100644 dot_vim/plugged/ale/test/test-files/tex/empty_sample1.tex create mode 100644 dot_vim/plugged/ale/test/test-files/tex/empty_sample2.tex create mode 100644 dot_vim/plugged/ale/test/test-files/tex/empty_testfile.tex create mode 100644 dot_vim/plugged/ale/test/test-files/textlint/with_bin_path/node_modules/dot_bin/empty_executable_textlint create mode 100644 dot_vim/plugged/ale/test/test-files/textlint/with_textlint_bin_path/node_modules/textlint/bin/empty_executable_textlint.js create mode 100644 dot_vim/plugged/ale/test/test-files/tflint/foo/empty_bar.tf create mode 100644 dot_vim/plugged/ale/test/test-files/tflint/foo/empty_dot_tflint.hcl create mode 100644 dot_vim/plugged/ale/test/test-files/tfsec/json/dot_tfsec/empty_config.json create mode 100644 dot_vim/plugged/ale/test/test-files/tfsec/json/empty_main.tf create mode 100644 dot_vim/plugged/ale/test/test-files/tfsec/yml/dot_tfsec/empty_config.yml create mode 100644 dot_vim/plugged/ale/test/test-files/tfsec/yml/empty_main.tf create mode 100644 dot_vim/plugged/ale/test/test-files/tidy/empty_dot_tidyrc create mode 100644 dot_vim/plugged/ale/test/test-files/tidy/empty_executable_tidy create mode 100644 dot_vim/plugged/ale/test/test-files/tidy/empty_executable_tidy.exe create mode 100644 dot_vim/plugged/ale/test/test-files/tidy/empty_test.html create mode 100644 dot_vim/plugged/ale/test/test-files/top/ale-special-directory-name-dont-use-this-please/empty_empty-file create mode 100644 dot_vim/plugged/ale/test/test-files/top/empty_example.ini create mode 100644 dot_vim/plugged/ale/test/test-files/top/middle/bottom/empty_dummy.txt create mode 100644 dot_vim/plugged/ale/test/test-files/tsserver/empty_tsconfig.json create mode 100644 dot_vim/plugged/ale/test/test-files/tsserver/src/empty_file1.ts create mode 100644 dot_vim/plugged/ale/test/test-files/tsserver/src/level-1/empty_file2.ts create mode 100644 dot_vim/plugged/ale/test/test-files/tsserver/src/level-1/empty_tsconfig.json create mode 100644 dot_vim/plugged/ale/test/test-files/tsserver/src/level-1/level-2/empty_file3.ts create mode 100644 dot_vim/plugged/ale/test/test-files/typescript/empty_custom_import_map.json create mode 100644 dot_vim/plugged/ale/test/test-files/typescript/empty_import_map.json create mode 100644 dot_vim/plugged/ale/test/test-files/typescript/empty_test.ts create mode 100644 dot_vim/plugged/ale/test/test-files/typescript/empty_tsconfig.json create mode 100644 dot_vim/plugged/ale/test/test-files/vim/invalid_vim_project/empty_test.vim create mode 100644 dot_vim/plugged/ale/test/test-files/vim/node_modules/dot_bin/empty_vim-language-server create mode 100644 dot_vim/plugged/ale/test/test-files/vim/path_with_autoload/autoload/empty_test.vim create mode 100644 dot_vim/plugged/ale/test/test-files/vim/path_with_autoload/empty_test.vim create mode 100644 dot_vim/plugged/ale/test/test-files/vim/path_with_initvim/empty_init.vim create mode 100644 dot_vim/plugged/ale/test/test-files/vim/path_with_plugin/empty_test.vim create mode 100644 dot_vim/plugged/ale/test/test-files/vim/path_with_plugin/plugin/empty_test.vim create mode 100644 dot_vim/plugged/ale/test/test-files/vim/path_with_vimrc/empty_dot_vimrc create mode 100644 dot_vim/plugged/ale/test/test-files/volar/empty_package.json create mode 100644 dot_vim/plugged/ale/test/test-files/volar/node_modules/dot_bin/empty_executable_vue-language-server create mode 100644 dot_vim/plugged/ale/test/test-files/volar/node_modules/typescript/lib/empty_tsserverlibrary.js create mode 100644 dot_vim/plugged/ale/test/test-files/volar/src/empty_App.vue create mode 100644 dot_vim/plugged/ale/test/test-files/write-good/node-modules-2/node_modules/write-good/bin/empty_write-good.js create mode 100644 dot_vim/plugged/ale/test/test-files/write-good/node-modules/node_modules/dot_bin/empty_write-good create mode 100644 dot_vim/plugged/ale/test/test-files/xo/monorepo/empty_package.json create mode 100644 dot_vim/plugged/ale/test/test-files/xo/monorepo/node_modules/xo/empty_cli.js create mode 100644 dot_vim/plugged/ale/test/test-files/xo/monorepo/packages/a/empty_index.js create mode 100644 dot_vim/plugged/ale/test/test-files/xo/monorepo/packages/a/empty_index.ts create mode 100644 dot_vim/plugged/ale/test/test-files/xo/monorepo/packages/a/empty_package.json create mode 100644 dot_vim/plugged/ale/test/test-files/yaml/empty_test.yaml create mode 100644 dot_vim/plugged/ale/test/test-files/zig/empty_build.zig create mode 100644 dot_vim/plugged/ale/test/test_ale_has.vader create mode 100644 dot_vim/plugged/ale/test/test_ale_info.vader create mode 100644 dot_vim/plugged/ale/test/test_ale_info_to_clipboard.vader create mode 100644 dot_vim/plugged/ale/test/test_ale_lint_command.vader create mode 100644 dot_vim/plugged/ale/test/test_ale_lint_stop_command.vader create mode 100644 dot_vim/plugged/ale/test/test_ale_populate_command.vader create mode 100644 dot_vim/plugged/ale/test/test_ale_toggle.vader create mode 100644 dot_vim/plugged/ale/test/test_ale_var.vader create mode 100644 dot_vim/plugged/ale/test/test_alejobstarted_autocmd.vader create mode 100644 dot_vim/plugged/ale/test/test_alelint_autocmd.vader create mode 100644 dot_vim/plugged/ale/test/test_ant_build_classpath_command.vader create mode 100644 dot_vim/plugged/ale/test/test_ant_find_project_root.vader create mode 100644 dot_vim/plugged/ale/test/test_autocmd_commands.vader create mode 100644 dot_vim/plugged/ale/test/test_backwards_compatibility.vader create mode 100644 dot_vim/plugged/ale/test/test_balloon_messages.vader create mode 100644 dot_vim/plugged/ale/test/test_c_flag_parsing.vader create mode 100644 dot_vim/plugged/ale/test/test_checkingbuffer_autocmd.vader create mode 100644 dot_vim/plugged/ale/test/test_cleanup.vader create mode 100644 dot_vim/plugged/ale/test/test_code_action.vader create mode 100644 dot_vim/plugged/ale/test/test_code_action_corner_cases.vader create mode 100644 dot_vim/plugged/ale/test/test_code_action_python.vader create mode 100644 dot_vim/plugged/ale/test/test_codefix.vader create mode 100644 dot_vim/plugged/ale/test/test_computed_lint_file_values.vader create mode 100644 dot_vim/plugged/ale/test/test_csslint_config_detection.vader create mode 100644 dot_vim/plugged/ale/test/test_cursor_warnings.vader create mode 100644 dot_vim/plugged/ale/test/test_deferred_command_string.vader create mode 100644 dot_vim/plugged/ale/test/test_deferred_executable_string.vader create mode 100644 dot_vim/plugged/ale/test/test_deno_executable_detection.vader create mode 100644 dot_vim/plugged/ale/test/test_disabling_ale.vader create mode 100644 dot_vim/plugged/ale/test/test_dockerfile_hadolint_linter.vader create mode 100644 dot_vim/plugged/ale/test/test_env_function.vader create mode 100644 dot_vim/plugged/ale/test/test_errors_removed_after_filetype_changed.vader create mode 100644 dot_vim/plugged/ale/test/test_filename_mapping.vader create mode 100644 dot_vim/plugged/ale/test/test_filerename.vader create mode 100644 dot_vim/plugged/ale/test/test_filetype_linter_defaults.vader create mode 100644 dot_vim/plugged/ale/test/test_filetype_mapping.vader create mode 100644 dot_vim/plugged/ale/test/test_find_nearest_directory.vader create mode 100644 dot_vim/plugged/ale/test/test_find_references.vader create mode 100644 dot_vim/plugged/ale/test/test_floating_preview.vader create mode 100644 dot_vim/plugged/ale/test/test_format_command.vader create mode 100644 dot_vim/plugged/ale/test/test_format_temporary_file_creation.vader create mode 100644 dot_vim/plugged/ale/test/test_function_arg_count.vader create mode 100644 dot_vim/plugged/ale/test/test_fuzzy_json_decode.vader create mode 100644 dot_vim/plugged/ale/test/test_get_abspath.vader create mode 100644 dot_vim/plugged/ale/test/test_get_loclist.vader create mode 100644 dot_vim/plugged/ale/test/test_getmatches.vader create mode 100644 dot_vim/plugged/ale/test/test_go_to_definition.vader create mode 100644 dot_vim/plugged/ale/test/test_gradle_build_classpath_command.vader create mode 100644 dot_vim/plugged/ale/test/test_gradle_find_executable.vader create mode 100644 dot_vim/plugged/ale/test/test_gradle_find_project_root.vader create mode 100644 dot_vim/plugged/ale/test/test_helptags.vader create mode 100644 dot_vim/plugged/ale/test/test_highlight_placement.vader create mode 100644 dot_vim/plugged/ale/test/test_highlight_position_chunking.vader create mode 100644 dot_vim/plugged/ale/test/test_history_saving.vader create mode 100644 dot_vim/plugged/ale/test/test_hover.vader create mode 100644 dot_vim/plugged/ale/test/test_hover_parsing.vader create mode 100644 dot_vim/plugged/ale/test/test_ignoring_linters.vader create mode 100644 dot_vim/plugged/ale/test/test_jq_linter.vader create mode 100644 dot_vim/plugged/ale/test/test_jsonlint_executable_detection.vader create mode 100644 dot_vim/plugged/ale/test/test_line_join.vader create mode 100644 dot_vim/plugged/ale/test/test_lint_file_linters.vader create mode 100644 dot_vim/plugged/ale/test/test_lint_on_enter_when_file_changed.vader create mode 100644 dot_vim/plugged/ale/test/test_lint_on_filetype_changed.vader create mode 100644 dot_vim/plugged/ale/test/test_linter_defintion_processing.vader create mode 100644 dot_vim/plugged/ale/test/test_linter_retrieval.vader create mode 100644 dot_vim/plugged/ale/test/test_linter_type_mapping.vader create mode 100644 dot_vim/plugged/ale/test/test_linting_blacklist.vader create mode 100644 dot_vim/plugged/ale/test/test_linting_updates_loclist.vader create mode 100644 dot_vim/plugged/ale/test/test_list_formatting.vader create mode 100644 dot_vim/plugged/ale/test/test_list_opening.vader create mode 100644 dot_vim/plugged/ale/test/test_list_titles.vader create mode 100644 dot_vim/plugged/ale/test/test_load_all_linters.vader create mode 100644 dot_vim/plugged/ale/test/test_loclist_binary_search.vader create mode 100644 dot_vim/plugged/ale/test/test_loclist_corrections.vader create mode 100644 dot_vim/plugged/ale/test/test_loclist_jumping.vader create mode 100644 dot_vim/plugged/ale/test/test_loclist_sorting.vader create mode 100644 dot_vim/plugged/ale/test/test_maven_build_classpath_command.vader create mode 100644 dot_vim/plugged/ale/test/test_maven_find_executable.vader create mode 100644 dot_vim/plugged/ale/test/test_maven_find_project_root.vader create mode 100644 dot_vim/plugged/ale/test/test_nearest_file_search.vader create mode 100644 dot_vim/plugged/ale/test/test_nimlsp_project_root.vader create mode 100644 dot_vim/plugged/ale/test/test_no_linting_on_write_quit.vader create mode 100644 dot_vim/plugged/ale/test/test_organize_imports.vader create mode 100644 dot_vim/plugged/ale/test/test_other_sources.vader create mode 100644 dot_vim/plugged/ale/test/test_parse_command_args.vader create mode 100644 dot_vim/plugged/ale/test/test_path_dirname.vader create mode 100644 dot_vim/plugged/ale/test/test_path_equality.vader create mode 100644 dot_vim/plugged/ale/test/test_path_upwards.vader create mode 100644 dot_vim/plugged/ale/test/test_path_uri.vader create mode 100644 dot_vim/plugged/ale/test/test_pattern_options.vader create mode 100644 dot_vim/plugged/ale/test/test_prepare_command.vader create mode 100644 dot_vim/plugged/ale/test/test_puppet_path_detection.vader create mode 100644 dot_vim/plugged/ale/test/test_python_find_project_root.vader create mode 100644 dot_vim/plugged/ale/test/test_python_pipenv.vader create mode 100644 dot_vim/plugged/ale/test/test_python_poetry.vader create mode 100644 dot_vim/plugged/ale/test/test_python_traceback.vader create mode 100644 dot_vim/plugged/ale/test/test_python_virtualenv.vader create mode 100644 dot_vim/plugged/ale/test/test_quickfix_deduplication.vader create mode 100644 dot_vim/plugged/ale/test/test_quitting_variable.vader create mode 100644 dot_vim/plugged/ale/test/test_redundant_tsserver_rendering_avoided.vader create mode 100644 dot_vim/plugged/ale/test/test_regex_escaping.vader create mode 100644 dot_vim/plugged/ale/test/test_rename.vader create mode 100644 dot_vim/plugged/ale/test/test_resolve_local_path.vader create mode 100644 dot_vim/plugged/ale/test/test_results_not_cleared_when_opening_loclist.vader create mode 100644 dot_vim/plugged/ale/test/test_sandbox_execution.vader create mode 100644 dot_vim/plugged/ale/test/test_semver_utils.vader create mode 100644 dot_vim/plugged/ale/test/test_set_list_timers.vader create mode 100644 dot_vim/plugged/ale/test/test_setting_loclist_from_another_buffer.vader create mode 100644 dot_vim/plugged/ale/test/test_setting_problems_found_in_previous_buffers.vader create mode 100644 dot_vim/plugged/ale/test/test_shell_detection.vader create mode 100644 dot_vim/plugged/ale/test/test_should_do_nothing_conditions.vader create mode 100644 dot_vim/plugged/ale/test/test_sml_command.vader create mode 100644 dot_vim/plugged/ale/test/test_socket_connections.vader create mode 100644 dot_vim/plugged/ale/test/test_statusline.vader create mode 100644 dot_vim/plugged/ale/test/test_swift_find_project_root.vader create mode 100644 dot_vim/plugged/ale/test/test_symbol_search.vader create mode 100644 dot_vim/plugged/ale/test/test_temporary_file_management.vader create mode 100644 dot_vim/plugged/ale/test/test_tmpdir_wrapper.vader create mode 100644 dot_vim/plugged/ale/test/test_vim8_processid_parsing.vader create mode 100644 dot_vim/plugged/ale/test/test_virtualtext.vader create mode 100644 dot_vim/plugged/ale/test/test_windows_escaping.vader create mode 100644 dot_vim/plugged/ale/test/test_wrap_comand.vader create mode 100644 dot_vim/plugged/ale/test/test_writefile_function.vader create mode 100644 dot_vim/plugged/ale/test/util/test_cd_string_commands.vader create mode 100644 dot_vim/plugged/ale/test/v_files/empty_testfile.v create mode 100644 dot_vim/plugged/ale/test/vimrc create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/LICENSE create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/README.md create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/HEAD create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/branches/.keep create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/config create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/description create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/index create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/info/exclude create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/objects/pack/readonly_pack-f73cfc833a012d1d35bf0ac2a56aff3e0682dc7b.idx create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/objects/pack/readonly_pack-f73cfc833a012d1d35bf0ac2a56aff3e0682dc7b.pack create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/packed-refs create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_git/shallow create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_gitattributes create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/dot_gitignore create mode 100644 dot_vim/plugged/asyncomplete-lsp.vim/plugin/asyncomplete-lsp.vim create mode 100644 dot_vim/plugged/asyncomplete.vim/LICENSE create mode 100644 dot_vim/plugged/asyncomplete.vim/README.md create mode 100644 dot_vim/plugged/asyncomplete.vim/autoload/asyncomplete.vim create mode 100644 dot_vim/plugged/asyncomplete.vim/autoload/asyncomplete/utils.vim create mode 100644 dot_vim/plugged/asyncomplete.vim/autoload/asyncomplete/utils/_on_change/textchangedp.vim create mode 100644 dot_vim/plugged/asyncomplete.vim/autoload/asyncomplete/utils/_on_change/timer.vim create mode 100644 dot_vim/plugged/asyncomplete.vim/doc/asyncomplete.txt create mode 100644 dot_vim/plugged/asyncomplete.vim/doc/tags create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/HEAD create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/branches/.keep create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/config create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/description create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/index create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/info/exclude create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/objects/pack/readonly_pack-acfe57e622e915afe452c54d88ca8df3422de069.idx create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/objects/pack/readonly_pack-acfe57e622e915afe452c54d88ca8df3422de069.pack create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/packed-refs create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_git/shallow create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_gitattributes create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_github/FUNDING.yml create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_github/stale.yml create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_github/workflows/linux_neovim.yml create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_github/workflows/linux_vim.yml create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_github/workflows/mac_neovim.yml create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_github/workflows/reviewdog.yml create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_github/workflows/windows_neovim.yml create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_github/workflows/windows_vim.yml create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_gitignore create mode 100644 dot_vim/plugged/asyncomplete.vim/dot_vintrc.yaml create mode 100644 dot_vim/plugged/asyncomplete.vim/plugin/asyncomplete.vim create mode 100644 dot_vim/plugged/asyncomplete.vim/test/asyncomplete.vimspec create mode 100644 dot_vim/plugged/asyncomplete.vim/test/dot_themisrc create mode 100644 dot_vim/plugged/ctrlp.vim/LICENSE create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/autoignore.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/buffertag.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/changes.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/dir.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/line.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/mixed.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/mrufiles.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/quickfix.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/rtscript.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/tag.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/undo.vim create mode 100644 dot_vim/plugged/ctrlp.vim/autoload/ctrlp/utils.vim create mode 100644 dot_vim/plugged/ctrlp.vim/doc/ctrlp.cnx create mode 100644 dot_vim/plugged/ctrlp.vim/doc/ctrlp.txt create mode 100644 dot_vim/plugged/ctrlp.vim/doc/tags create mode 100644 dot_vim/plugged/ctrlp.vim/doc/tags-cn create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/HEAD create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/branches/.keep create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/config create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/description create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/index create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/info/exclude create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/objects/pack/readonly_pack-2842198332ff2cae5890b7ccbe5f6cf7fbe7e20a.idx create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/objects/pack/readonly_pack-2842198332ff2cae5890b7ccbe5f6cf7fbe7e20a.pack create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/packed-refs create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/ctrlp.vim/dot_git/shallow create mode 100644 dot_vim/plugged/ctrlp.vim/dot_github/FUNDING.yml create mode 100644 dot_vim/plugged/ctrlp.vim/dot_gitignore create mode 100644 dot_vim/plugged/ctrlp.vim/plugin/ctrlp.vim create mode 100644 dot_vim/plugged/ctrlp.vim/readme.md create mode 100644 dot_vim/plugged/friendly-snippets/LICENSE create mode 100644 dot_vim/plugged/friendly-snippets/README.md create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/HEAD create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/branches/.keep create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/config create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/description create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/index create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/info/exclude create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/logs/refs/heads/main create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/objects/pack/readonly_pack-0a56bc11a05362366c282fbf7169e627b7bc1b9f.idx create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/objects/pack/readonly_pack-0a56bc11a05362366c282fbf7169e627b7bc1b9f.pack create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/packed-refs create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/refs/heads/main create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/friendly-snippets/dot_git/shallow create mode 100644 dot_vim/plugged/friendly-snippets/package.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/c.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/cobol/vscode_cobol-compound.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/cobol/vscode_cobol.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/cobol/vscode_cobol_dir.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/cobol/vscode_cobol_jcl.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/cpp.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/csharp.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/css.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/dart.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/docker/docker-compose.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/docker/docker_file.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/eelixir.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/elixir.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/erb.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/erlang.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/fennel.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/fortran.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/django/admin.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/django/django_rest/serializers.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/django/django_rest/views.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/django/forms.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/django/models.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/django/tags.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/django/urls.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/django/views.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/djangohtml.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/edge.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/ejs.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/flutter.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/jekyll.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/rails.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/relm4/components.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/relm4/factories.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/relm4/templates.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/relm4/workers.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/twig.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/unreal.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/vue/html.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/vue/javascript.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/vue/pug.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/frameworks/vue/vue.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/fsh.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/gdscript.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/gitcommit.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/global.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/glsl.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/go.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/haskell.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/html.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/java.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/java/java-tests.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/javascript.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/jsdoc.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/next-ts.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/next.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/react-es7.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/react-native-ts.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/react-native.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/react-ts.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/react.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/javascript/typescript.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/julia.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/kotlin.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/kubernetes.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/latex.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/latex/latex-snippets.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/latex/vscode-latex-snippets.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/liquid.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/lua.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/make.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/markdown.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/mint.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/norg.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/objc.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/org.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/php.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/plantuml.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/python/base.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/python/comprehension.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/python/debug.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/python/python.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/python/unittest.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/quarto.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/r.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/rescript.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/rmarkdown.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/ruby.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/rust.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/scala.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/shell.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/solidity.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/sql.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/svelte.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/swift.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/systemverilog.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/verilog.json create mode 100644 dot_vim/plugged/friendly-snippets/snippets/vhdl.json create mode 100644 dot_vim/plugged/gruvbox/CHANGELOG.md create mode 100644 dot_vim/plugged/gruvbox/README.md create mode 100644 dot_vim/plugged/gruvbox/autoload/airline/themes/gruvbox.vim create mode 100644 dot_vim/plugged/gruvbox/autoload/gruvbox.vim create mode 100644 dot_vim/plugged/gruvbox/autoload/lightline/colorscheme/gruvbox.vim create mode 100644 dot_vim/plugged/gruvbox/colors/gruvbox.vim create mode 100644 dot_vim/plugged/gruvbox/dot_git/HEAD create mode 100644 dot_vim/plugged/gruvbox/dot_git/branches/.keep create mode 100644 dot_vim/plugged/gruvbox/dot_git/config create mode 100644 dot_vim/plugged/gruvbox/dot_git/description create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/gruvbox/dot_git/index create mode 100644 dot_vim/plugged/gruvbox/dot_git/info/exclude create mode 100644 dot_vim/plugged/gruvbox/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/gruvbox/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/gruvbox/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/gruvbox/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/gruvbox/dot_git/objects/pack/readonly_pack-3a07c924f99cd2caf1ccb4fd9380b1168f83f690.idx create mode 100644 dot_vim/plugged/gruvbox/dot_git/objects/pack/readonly_pack-3a07c924f99cd2caf1ccb4fd9380b1168f83f690.pack create mode 100644 dot_vim/plugged/gruvbox/dot_git/packed-refs create mode 100644 dot_vim/plugged/gruvbox/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/gruvbox/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/gruvbox/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/gruvbox/dot_git/shallow create mode 100644 dot_vim/plugged/gruvbox/executable_gruvbox_256palette.sh create mode 100644 dot_vim/plugged/gruvbox/executable_gruvbox_256palette_osx.sh create mode 100644 dot_vim/plugged/gruvbox/package.json create mode 100644 dot_vim/plugged/pony-vim-syntax/LICENSE create mode 100644 dot_vim/plugged/pony-vim-syntax/README.md create mode 100644 dot_vim/plugged/pony-vim-syntax/autoload/neomake/makers/ft/pony.vim create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/HEAD create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/branches/.keep create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/config create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/description create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/index create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/info/exclude create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/objects/pack/readonly_pack-ff9bbc7fd9e747e73f37a198f8e2c83e2e7934f9.idx create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/objects/pack/readonly_pack-ff9bbc7fd9e747e73f37a198f8e2c83e2e7934f9.pack create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/packed-refs create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/pony-vim-syntax/dot_git/shallow create mode 100644 dot_vim/plugged/pony-vim-syntax/ftdetect/pony.vim create mode 100644 dot_vim/plugged/pony-vim-syntax/syntax/pony.vim create mode 100644 dot_vim/plugged/pony-vim-syntax/syntax_checkers/pony/ponyc.vim create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/autoload/rainbow_parentheses.vim create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/HEAD create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/branches/.keep create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/config create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/description create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/index create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/info/exclude create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/objects/pack/readonly_pack-8767058172ee12147ab6b2c064135484c529c208.idx create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/objects/pack/readonly_pack-8767058172ee12147ab6b2c064135484c529c208.pack create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/packed-refs create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/dot_git/shallow create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/plugin/rainbow_parentheses.vim create mode 100644 dot_vim/plugged/rainbow_parentheses.vim/readme.md create mode 100644 dot_vim/plugged/rust.vim/ISSUE_TEMPLATE.md create mode 100644 dot_vim/plugged/rust.vim/LICENSE-APACHE create mode 100644 dot_vim/plugged/rust.vim/LICENSE-MIT create mode 100644 dot_vim/plugged/rust.vim/README.md create mode 100644 dot_vim/plugged/rust.vim/after/syntax/rust.vim create mode 100644 dot_vim/plugged/rust.vim/autoload/cargo.vim create mode 100644 dot_vim/plugged/rust.vim/autoload/cargo/quickfix.vim create mode 100644 dot_vim/plugged/rust.vim/autoload/rust.vim create mode 100644 dot_vim/plugged/rust.vim/autoload/rust/debugging.vim create mode 100644 dot_vim/plugged/rust.vim/autoload/rust/delimitmate.vim create mode 100644 dot_vim/plugged/rust.vim/autoload/rust/tags.vim create mode 100644 dot_vim/plugged/rust.vim/autoload/rustfmt.vim create mode 100644 dot_vim/plugged/rust.vim/compiler/cargo.vim create mode 100644 dot_vim/plugged/rust.vim/compiler/rustc.vim create mode 100644 dot_vim/plugged/rust.vim/ctags/rust.ctags create mode 100644 dot_vim/plugged/rust.vim/doc/rust.txt create mode 100644 dot_vim/plugged/rust.vim/doc/tags create mode 100644 dot_vim/plugged/rust.vim/dot_git/HEAD create mode 100644 dot_vim/plugged/rust.vim/dot_git/branches/.keep create mode 100644 dot_vim/plugged/rust.vim/dot_git/config create mode 100644 dot_vim/plugged/rust.vim/dot_git/description create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/rust.vim/dot_git/index create mode 100644 dot_vim/plugged/rust.vim/dot_git/info/exclude create mode 100644 dot_vim/plugged/rust.vim/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/rust.vim/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/rust.vim/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/rust.vim/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/rust.vim/dot_git/objects/pack/readonly_pack-1d9f6fb8d950cde3b5af4822c7163c815fc203aa.idx create mode 100644 dot_vim/plugged/rust.vim/dot_git/objects/pack/readonly_pack-1d9f6fb8d950cde3b5af4822c7163c815fc203aa.pack create mode 100644 dot_vim/plugged/rust.vim/dot_git/packed-refs create mode 100644 dot_vim/plugged/rust.vim/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/rust.vim/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/rust.vim/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/rust.vim/dot_git/shallow create mode 100644 dot_vim/plugged/rust.vim/dot_github/workflows/ci.yml create mode 100644 dot_vim/plugged/rust.vim/dot_gitignore create mode 100644 dot_vim/plugged/rust.vim/dot_vintrc.yml create mode 100644 dot_vim/plugged/rust.vim/ftdetect/rust.vim create mode 100644 dot_vim/plugged/rust.vim/ftplugin/rust.vim create mode 100644 dot_vim/plugged/rust.vim/ftplugin/rust/tagbar.vim create mode 100644 dot_vim/plugged/rust.vim/indent/rust.vim create mode 100644 dot_vim/plugged/rust.vim/plugin/cargo.vim create mode 100644 dot_vim/plugged/rust.vim/plugin/rust.vim create mode 100644 dot_vim/plugged/rust.vim/syntax/rust.vim create mode 100644 dot_vim/plugged/rust.vim/syntax_checkers/rust/cargo.vim create mode 100644 dot_vim/plugged/rust.vim/syntax_checkers/rust/rustc.vim create mode 100644 dot_vim/plugged/rust.vim/test/Dockerfile create mode 100644 dot_vim/plugged/rust.vim/test/coverage.vader create mode 100644 dot_vim/plugged/rust.vim/test/empty_dot_gitignore create mode 100644 dot_vim/plugged/rust.vim/test/empty_sample.rs create mode 100644 dot_vim/plugged/rust.vim/test/executable_run-tests create mode 100644 dot_vim/plugged/rust.vim/test/indent.vader create mode 100644 dot_vim/plugged/rust.vim/test/vimrc create mode 100644 dot_vim/plugged/rust.vim/triagebot.toml create mode 100644 dot_vim/plugged/semantic-highlight.vim/README.md create mode 100644 dot_vim/plugged/semantic-highlight.vim/autoload/blacklist.vim create mode 100644 dot_vim/plugged/semantic-highlight.vim/autoload/containedinlist.vim create mode 100644 dot_vim/plugged/semantic-highlight.vim/doc/semantic-highlight.txt create mode 100644 dot_vim/plugged/semantic-highlight.vim/doc/tags create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/HEAD create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/branches/.keep create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/config create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/description create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/index create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/info/exclude create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/objects/pack/readonly_pack-a6c371a82cbf80d59118029f75eadf7d8f4024bd.idx create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/objects/pack/readonly_pack-a6c371a82cbf80d59118029f75eadf7d8f4024bd.pack create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/packed-refs create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/semantic-highlight.vim/dot_git/shallow create mode 100644 dot_vim/plugged/semantic-highlight.vim/plugin/semhl.vim create mode 100644 dot_vim/plugged/semantic-highlight.vim/semantic-highlight.png create mode 100644 dot_vim/plugged/vim-airline-themes/LICENSE create mode 100644 dot_vim/plugged/vim-airline-themes/README.md create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/alduin.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/angr.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/apprentice.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/atomic.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/ayu_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/ayu_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/ayu_mirage.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/badwolf.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_3024.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_adwaita.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_apathy.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_ashes.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_cave.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_cave_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_dune.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_dune_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_estuary.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_estuary_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_forest.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_forest_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_heath.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_heath_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_lakeside.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_lakeside_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_plateau.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_plateau_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_savanna.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_savanna_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_seaside.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_seaside_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_sulphurpool.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelier_sulphurpool_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelierdune.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelierforest.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelierheath.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelierlakeside.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atelierseaside.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_atlas.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_bespin.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_bathory.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_burzum.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_dark_funeral.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_gorgoroth.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_immortal.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_khold.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_marduk.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_mayhem.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_nile.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_black_metal_venom.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_brewer.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_bright.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_brogrammer.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_brushtrees.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_brushtrees_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_chalk.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_circus.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_classic.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_classic_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_classic_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_codeschool.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_colors.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_cupcake.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_cupertino.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_darktooth.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_decaf.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_default.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_default_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_default_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_dracula.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_edge_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_edge_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_eighties.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_embers.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_espresso.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_flat.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_framer.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_fruit_soda.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_gigavolt.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_github.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_google.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_google_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_google_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_grayscale.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_grayscale_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_grayscale_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_greenscreen.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_gruvbox_dark_hard.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_gruvbox_dark_medium.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_gruvbox_dark_pale.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_gruvbox_dark_soft.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_gruvbox_light_hard.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_gruvbox_light_medium.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_gruvbox_light_soft.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_harmonic16.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_harmonic_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_harmonic_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_heetch.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_heetch_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_helios.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_hopscotch.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_horizon_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_horizon_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_horizon_terminal_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_horizon_terminal_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_ia_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_ia_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_icy.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_irblack.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_isotope.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_londontube.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_macintosh.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_marrakesh.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_materia.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_material.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_material_darker.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_material_lighter.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_material_palenight.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_material_vivid.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_mellow_purple.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_mexico_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_mocha.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_monokai.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_nord.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_nova.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_ocean.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_oceanicnext.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_one_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_onedark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_outrun_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_papercolor_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_papercolor_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_paraiso.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_phd.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_pico.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_pop.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_porple.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_railscasts.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_rebecca.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_sandcastle.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_seti.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_shapeshifter.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_shell.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_snazzy.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_solarflare.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_solarized.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_solarized_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_solarized_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_spacemacs.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_summerfruit.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_summerfruit_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_summerfruit_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_synth_midnight_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_tomorrow.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_tomorrow_night.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_tomorrow_night_eighties.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_tube.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_twilight.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_unikitty_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_unikitty_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_vim.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_woodland.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_xcode_dusk.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16_zenburn.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/base16color.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/behelit.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/biogoo.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/blood_red.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/bubblegum.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/cobalt2.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/cool.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/cyberpunk.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/dark_minimal.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/desertink.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/deus.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/distinguished.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/durant.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/executable_ouo.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/fairyfloss.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/fruit_punch.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/google_dark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/google_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/hybrid.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/hybridline.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/jellybeans.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/jet.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/kalisi.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/kolor.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/laederon.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/lessnoise.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/lighthaus.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/lucius.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/luna.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/minimalist.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/molokai.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/monochrome.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/murmur.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/night_owl.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/nord_minimal.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/onedark.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/owo.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/papercolor.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/peaksea.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/powerlineish.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/qwq.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/raven.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/ravenpower.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/seagull.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/selenized.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/selenized_bw.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/seoul256.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/serene.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/sierra.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/silver.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/simple.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/soda.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/sol.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/solarized.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/solarized_flood.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/supernova.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/term.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/term_light.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/tomorrow.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/transparent.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/ubaryd.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/understated.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/violet.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/wombat.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/xtermlight.vim create mode 100644 dot_vim/plugged/vim-airline-themes/autoload/airline/themes/zenburn.vim create mode 100644 dot_vim/plugged/vim-airline-themes/doc/airline-themes.txt create mode 100644 dot_vim/plugged/vim-airline-themes/doc/tags create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/config create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/description create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/index create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/objects/pack/readonly_pack-f0c90ec387856bdc94b1b6a4d9fdaa1db01bf0d1.idx create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/objects/pack/readonly_pack-f0c90ec387856bdc94b1b6a4d9fdaa1db01bf0d1.pack create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-airline-themes/dot_git/shallow create mode 100644 dot_vim/plugged/vim-airline-themes/dot_github/ISSUE_TEMPLATE.md create mode 100644 dot_vim/plugged/vim-airline-themes/dot_github/workflows/ci.yml create mode 100644 dot_vim/plugged/vim-airline-themes/dot_github/workflows/reviewdog.yml create mode 100644 dot_vim/plugged/vim-airline-themes/dot_gitignore create mode 100644 dot_vim/plugged/vim-airline-themes/plugin/airline-themes.vim create mode 100644 dot_vim/plugged/vim-airline-themes/test/airline-themes.vader create mode 100644 dot_vim/plugged/vim-airline/CHANGELOG.md create mode 100644 dot_vim/plugged/vim-airline/CONTRIBUTING.md create mode 100644 dot_vim/plugged/vim-airline/LICENSE create mode 100644 dot_vim/plugged/vim-airline/README.md create mode 100644 dot_vim/plugged/vim-airline/autoload/airline.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/async.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/builder.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/debug.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/ale.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/battery.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/bookmark.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/branch.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/bufferline.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/capslock.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/coc.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/commandt.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/csv.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/ctrlp.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/ctrlspace.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/cursormode.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/default.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/denite.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/dirvish.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/eclim.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/example.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/fern.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/fugitiveline.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/fzf.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/gen_tags.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/gina.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/grepper.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/gutentags.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/hunks.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/keymap.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/languageclient.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/localsearch.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/lsp.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/neomake.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/netrw.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/nrrwrgn.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/nvimlsp.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/obsession.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/omnisharp.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/po.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/poetv.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/promptline.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/quickfix.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/rufo.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/scrollbar.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/searchcount.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/syntastic.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/autoshow.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/buffers.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/buflist.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/builder.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/ctrlspace.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/formatters/default.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/formatters/jsformatter.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/formatters/short_path.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/formatters/short_path_improved.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/formatters/tabnr.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/formatters/unique_tail.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/formatters/unique_tail_improved.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/tabs.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/tabws.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tabline/xtabline.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tagbar.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/taglist.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/term.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/tmuxline.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/undotree.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/unicode.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/unite.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/vim9lsp.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/vimagit.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/vimcmake.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/vimtex.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/virtualenv.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/vista.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/whitespace.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/windowswap.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/wordcount.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/wordcount/formatters/default.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/wordcount/formatters/readingtime.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/xkblayout.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/ycm.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/extensions/zoomwintab.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/formatter/short_path.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/highlighter.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/init.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/msdos.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/parts.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/section.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/themes.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/themes/dark.vim create mode 100644 dot_vim/plugged/vim-airline/autoload/airline/util.vim create mode 100644 dot_vim/plugged/vim-airline/doc/airline.txt create mode 100644 dot_vim/plugged/vim-airline/doc/tags create mode 100644 dot_vim/plugged/vim-airline/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-airline/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-airline/dot_git/config create mode 100644 dot_vim/plugged/vim-airline/dot_git/description create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-airline/dot_git/index create mode 100644 dot_vim/plugged/vim-airline/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-airline/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-airline/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-airline/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-airline/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-airline/dot_git/objects/pack/readonly_pack-97eb515db437289aa44701d94ef45ee2a470bb12.idx create mode 100644 dot_vim/plugged/vim-airline/dot_git/objects/pack/readonly_pack-97eb515db437289aa44701d94ef45ee2a470bb12.pack create mode 100644 dot_vim/plugged/vim-airline/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-airline/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-airline/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-airline/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-airline/dot_git/shallow create mode 100644 dot_vim/plugged/vim-airline/dot_github/ISSUE_TEMPLATE.md create mode 100644 dot_vim/plugged/vim-airline/dot_github/workflows/ci.yml create mode 100644 dot_vim/plugged/vim-airline/dot_github/workflows/reviewdog.yml create mode 100644 dot_vim/plugged/vim-airline/dot_gitignore create mode 100644 dot_vim/plugged/vim-airline/plugin/airline.vim create mode 100644 dot_vim/plugged/vim-airline/test/airline.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/builder.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/commands.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/dot_themisrc create mode 100644 dot_vim/plugged/vim-airline/test/extensions_default.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/extensions_tabline.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/highlighter.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/init.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/parts.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/section.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/themes.vimspec create mode 100644 dot_vim/plugged/vim-airline/test/util.vimspec create mode 100644 dot_vim/plugged/vim-latex/Makefile create mode 100644 dot_vim/plugged/vim-latex/Makefile.in create mode 100644 dot_vim/plugged/vim-latex/README.md create mode 100644 dot_vim/plugged/vim-latex/compiler/tex.vim create mode 100644 dot_vim/plugged/vim-latex/doc/Makefile create mode 100644 dot_vim/plugged/vim-latex/doc/Makefile.in create mode 100644 dot_vim/plugged/vim-latex/doc/README create mode 100644 dot_vim/plugged/vim-latex/doc/README.new create mode 100644 dot_vim/plugged/vim-latex/doc/catalog.xml create mode 100644 dot_vim/plugged/vim-latex/doc/db2vim/domutils.py create mode 100644 dot_vim/plugged/vim-latex/doc/db2vim/executable_db2vim create mode 100644 dot_vim/plugged/vim-latex/doc/db2vim/textutils.py create mode 100644 dot_vim/plugged/vim-latex/doc/imaps.txt create mode 100644 dot_vim/plugged/vim-latex/doc/latex-suite-chunk.xsl create mode 100644 dot_vim/plugged/vim-latex/doc/latex-suite-common.xsl create mode 100644 dot_vim/plugged/vim-latex/doc/latex-suite-quickstart.css create mode 100644 dot_vim/plugged/vim-latex/doc/latex-suite-quickstart.txt create mode 100644 dot_vim/plugged/vim-latex/doc/latex-suite-quickstart.xml create mode 100644 dot_vim/plugged/vim-latex/doc/latex-suite.css create mode 100644 dot_vim/plugged/vim-latex/doc/latex-suite.txt create mode 100644 dot_vim/plugged/vim-latex/doc/latex-suite.xml create mode 100644 dot_vim/plugged/vim-latex/doc/latex-suite.xsl create mode 100644 dot_vim/plugged/vim-latex/doc/tags create mode 100644 dot_vim/plugged/vim-latex/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-latex/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-latex/dot_git/config create mode 100644 dot_vim/plugged/vim-latex/dot_git/description create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-latex/dot_git/index create mode 100644 dot_vim/plugged/vim-latex/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-latex/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-latex/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-latex/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-latex/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-latex/dot_git/objects/pack/readonly_pack-120a80d4a3819d1f713bcc8696237103d844b52a.idx create mode 100644 dot_vim/plugged/vim-latex/dot_git/objects/pack/readonly_pack-120a80d4a3819d1f713bcc8696237103d844b52a.pack create mode 100644 dot_vim/plugged/vim-latex/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-latex/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-latex/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-latex/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-latex/dot_git/shallow create mode 100644 dot_vim/plugged/vim-latex/dot_gitattributes create mode 100644 dot_vim/plugged/vim-latex/dot_gitignore create mode 100644 dot_vim/plugged/vim-latex/executable_latextags create mode 100644 dot_vim/plugged/vim-latex/executable_ltags create mode 100644 dot_vim/plugged/vim-latex/ftplugin/bib_latexSuite.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/__pycache__/bibtools.cpython-310.pyc create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/__pycache__/outline.cpython-310.pyc create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/bibtex.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/bibtools.py create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/brackets.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/compiler.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/custommacros.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/diacritics.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/dictionaries/SIunits create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/dictionaries/dictionary create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/elementmacros.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/envmacros.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/executable_outline.py create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/folding.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/macros/example create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/main.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/mathmacros-utf.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/mathmacros.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/multicompile.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/SIunits create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/accents create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/acromake create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/afterpage create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/alltt create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/amsmath create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/amsthm create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/amsxtra create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/arabic create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/array create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/babel create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/bar create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/biblatex create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/bm create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/bophook create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/boxedminipage create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/caption2 create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/cases create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/ccaption create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/changebar create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/chapterbib create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/cite create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/color create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/comma create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/csquotes create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/deleq create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/drftcite create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/dropping create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/enumerate create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/eqlist create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/eqparbox create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/everyshi create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/exmpl create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/fixme create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/flafter create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/float create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/floatflt create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/fn2end create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/footmisc create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/geometry create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/german create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/graphicx create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/graphpap create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/harpoon create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/hhline create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/histogram create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/hyperref create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/ifthen create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/inputenc create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/letterspace create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/lineno create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/longtable create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/lscape create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/manyfoot create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/moreverb create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/multibox create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/multicol create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/newalg create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/ngerman create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/numprint create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/oldstyle create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/outliner create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/overcite create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/pagenote create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/parallel create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/plain create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/plates create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/polski create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/psgo create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/schedule create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/textfit create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/times create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/tipa create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/ulem create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/url create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/verbatim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/packages/version create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/projecttemplate.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/pytools.py create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/smartspace.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/templates.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/templates/IEEEtran.tex create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/templates/article.tex create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/templates/report.tex create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/templates/report_two_column.tex create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/texmenuconf.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/texproject.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/texrc create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/texviewer.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/version.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/latex-suite/wizardfuncs.vim create mode 100644 dot_vim/plugged/vim-latex/ftplugin/tex_latexSuite.vim create mode 100644 dot_vim/plugged/vim-latex/indent/tex.vim create mode 100644 dot_vim/plugged/vim-latex/plugin/SyntaxFolds.vim create mode 100644 dot_vim/plugged/vim-latex/plugin/filebrowser.vim create mode 100644 dot_vim/plugged/vim-latex/plugin/imaps.vim create mode 100644 dot_vim/plugged/vim-latex/plugin/remoteOpen.vim create mode 100644 dot_vim/plugged/vim-latex/vim-latex.metainfo.xml create mode 100644 dot_vim/plugged/vim-lsp-ale/LICENSE create mode 100644 dot_vim/plugged/vim-lsp-ale/README.md create mode 100644 dot_vim/plugged/vim-lsp-ale/autoload/lsp/ale.vim create mode 100644 dot_vim/plugged/vim-lsp-ale/doc/tags create mode 100644 dot_vim/plugged/vim-lsp-ale/doc/vim-lsp-ale.txt create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_codecov.yml create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_coveragerc create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/config create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/description create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/index create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/objects/pack/readonly_pack-f42b38ea7f56cccdf29554efb5d8419c2d93646f.idx create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/objects/pack/readonly_pack-f42b38ea7f56cccdf29554efb5d8419c2d93646f.pack create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_git/shallow create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_github/workflows/ci.yml create mode 100644 dot_vim/plugged/vim-lsp-ale/dot_gitignore create mode 100644 dot_vim/plugged/vim-lsp-ale/plugin/lsp_ale.vim create mode 100644 dot_vim/plugged/vim-lsp-ale/test/README.md create mode 100644 dot_vim/plugged/vim-lsp-ale/test/integ/deps/empty_dot_gitkeep create mode 100644 dot_vim/plugged/vim-lsp-ale/test/integ/dot_gitignore create mode 100644 dot_vim/plugged/vim-lsp-ale/test/integ/dot_themisrc create mode 100644 dot_vim/plugged/vim-lsp-ale/test/integ/project/Cargo.lock create mode 100644 dot_vim/plugged/vim-lsp-ale/test/integ/project/Cargo.toml create mode 100644 dot_vim/plugged/vim-lsp-ale/test/integ/project/dot_gitignore create mode 100644 dot_vim/plugged/vim-lsp-ale/test/integ/project/src/lib.rs create mode 100644 dot_vim/plugged/vim-lsp-ale/test/integ/test.vimspec create mode 100644 dot_vim/plugged/vim-lsp-ale/test/unit/dot_themisrc create mode 100644 dot_vim/plugged/vim-lsp-ale/test/unit/runtime/autoload/ale/other_source.vim create mode 100644 dot_vim/plugged/vim-lsp-ale/test/unit/runtime/autoload/lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-ale/test/unit/runtime/autoload/lsp/callbag.vim create mode 100644 dot_vim/plugged/vim-lsp-ale/test/unit/runtime/autoload/lsp/internal/diagnostics/state.vim create mode 100644 dot_vim/plugged/vim-lsp-ale/test/unit/runtime/autoload/lsp/ui/vim/utils.vim create mode 100644 dot_vim/plugged/vim-lsp-ale/test/unit/runtime/autoload/lsp/utils.vim create mode 100644 dot_vim/plugged/vim-lsp-ale/test/unit/test.vimspec create mode 100644 dot_vim/plugged/vim-lsp-settings/LICENSE create mode 100644 dot_vim/plugged/vim-lsp-settings/Makefile create mode 100644 dot_vim/plugged/vim-lsp-settings/README.md create mode 100644 dot_vim/plugged/vim-lsp-settings/autoload/lsp_settings.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/autoload/lsp_settings/profile.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/autoload/lsp_settings/ui.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/autoload/lsp_settings/utils.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/checkers/cl-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/checkers/perl-languageserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/checkers/slp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/data/README.md create mode 100644 dot_vim/plugged/vim-lsp-settings/data/catalog.json create mode 100644 dot_vim/plugged/vim-lsp-settings/doc/tags create mode 100644 dot_vim/plugged/vim-lsp-settings/doc/vim-lsp-settings.txt create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_editorconfig create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/config create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/description create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/index create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/objects/pack/readonly_pack-856f923bc56139eb4bbe9177d4663ef1e882096b.idx create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/objects/pack/readonly_pack-856f923bc56139eb4bbe9177d4663ef1e882096b.pack create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_git/shallow create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_gitattributes create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_github/workflows/ci.yml create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_github/workflows/reviewdog.yml create mode 100644 dot_vim/plugged/vim-lsp-settings/dot_gitignore create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_go_install.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-analysis-server-dart-snapshot.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-angular-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-apex-jorje-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-astro-ls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-bash-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-bufls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-cl-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-clangd.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-clj-kondo-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-clojure-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-cmake-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-cobol-language-support.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-css-languageserver.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-deno.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-dls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-docker-langserver.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-dot-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-eclipse-jdt-ls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-efm-langserver.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-elixir-ls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-elm-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-emmylua-ls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-erlang-ls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-esbonio.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-eslint-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-flow.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-fortls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-fsautocomplete.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-fsharp-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-golangci-lint-langserver.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-gopls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-gql-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-graphql-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-groovy-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-html-languageserver.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-intelephense.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-javascript-typescript-stdio.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-jedi-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-json-languageserver.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-julia-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-kotlin-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-lemminx.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-marksman.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-metals.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-nimlsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-ntt.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-ocaml-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-ols.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-omnisharp-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-perlnavigator.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-plpgsql-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-powershell-languageserver.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-prisma-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-psalm-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-puppet-ls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-purescript-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-pyls-all.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-pyls-ms.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-pyls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-pylsp-all.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-pylsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-pyright-langserver.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-r-languageserver.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-racket-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-reason-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-remark-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-rnix-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-rome.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-ruby-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-ruby_language_server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-rust-analyzer.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-serve-d.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-solargraph.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-sql-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-sqls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-steep.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-sumneko-lua-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-svelte-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-svls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-tailwindcss-intellisense.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-taplo-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-terraform-ls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-terraform-lsp.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-texlab.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-typeprof.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-typescript-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-vim-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-vlang-vls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-vls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-volar-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-vscode-css-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-vscode-html-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-vscode-json-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-yaml-language-server.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_install-zls.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_npm_install.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_pip_install.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/executable_yarn_install.sh create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/go_install.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-analysis-server-dart-snapshot.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-angular-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-apex-jorje-lsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-astro-ls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-bash-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-bufls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-cl-lsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-clangd.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-clj-kondo-lsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-clojure-lsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-cmake-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-cobol-language-support.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-css-languageserver.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-deno.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-dls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-docker-langserver.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-dot-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-eclipse-jdt-ls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-efm-langserver.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-elixir-ls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-elm-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-emmylua-ls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-erlang-ls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-esbonio.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-eslint-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-flow.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-fortls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-fsautocomplete.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-fsharp-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-golangci-lint-langserver.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-gopls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-gql-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-graphql-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-groovy-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-html-languageserver.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-intelephense.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-javascript-typescript-stdio.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-jedi-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-json-languageserver.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-julia-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-kotlin-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-lemminx.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-marksman.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-metals.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-nimlsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-ntt.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-ols.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-omnisharp-lsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-perlnavigator.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-powershell-languageserver.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-prisma-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-psalm-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-puppet-ls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-pyls-all.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-pyls-ms.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-pyls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-pylsp-all.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-pylsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-pyright-langserver.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-r-languageserver.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-racket-lsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-reason-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-remark-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-rome.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-ruby_language_server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-rust-analyzer.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-serve-d.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-solargraph.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-sql-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-sqls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-steep.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-sumneko-lua-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-svelte-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-svls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-tailwindcss-intellisense.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-taplo-lsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-terraform-ls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-terraform-lsp.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-texlab.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-typeprof.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-typescript-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-vim-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-vlang-vls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-vls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-volar-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-vscode-css-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-vscode-html-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-vscode-json-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-yaml-language-server.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/install-zls.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/literal_run_gzip.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/literal_run_unzip.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/npm_install.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/pip_install.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/installer/yarn_install.cmd create mode 100644 dot_vim/plugged/vim-lsp-settings/local-schema.json create mode 100644 dot_vim/plugged/vim-lsp-settings/plugin/lsp_settings.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/schema.json create mode 100644 dot_vim/plugged/vim-lsp-settings/settings.json create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/analysis-server-dart-snapshot.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/angular-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/apex-jorje-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/astro-ls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/bash-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/bufls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/cl-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/clangd.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/clj-kondo-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/clojure-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/cmake-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/cobol-language-support.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/css-languageserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/deno.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/digestif.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/dls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/docker-langserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/dot-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/eclipse-jdt-ls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/efm-langserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/elixir-ls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/elm-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/emmylua-ls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/erlang-ls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/esbonio.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/eslint-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/flow.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/fortls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/fsautocomplete.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/fsharp-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/glslls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/godot.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/golangci-lint-langserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/gopls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/gql-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/graphql-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/groovy-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/haskell-language-server-wrapper.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/hie-wrapper.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/html-languageserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/intelephense.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/java-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/javascript-typescript-stdio.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/jedi-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/json-languageserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/julia-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/kotlin-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/lemminx.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/marksman.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/metals.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/monastery.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/nimlsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/ntt.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/ocaml-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/ols.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/omnisharp-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/perl-languageserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/perlnavigator.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/plpgsql-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/powershell-languageserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/prisma-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/prolog-lsp_server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/psalm-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/puppet-ls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/purescript-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/pyls-all.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/pyls-ms.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/pyls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/pylsp-all.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/pylsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/pyright-langserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/r-languageserver.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/racket-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/reason-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/remark-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/rls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/rnix-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/rome.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/ruby-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/ruby_language_server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/rust-analyzer.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/serve-d.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/slp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/solargraph.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/sourcekit-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/sql-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/sqls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/steep.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/sumneko-lua-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/svelte-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/svls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/tailwindcss-intellisense.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/taplo-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/terraform-ls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/terraform-lsp.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/texlab.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/typeprof.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/typescript-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/vala-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/vim-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/vlang-vls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/vls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/volar-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/vscode-css-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/vscode-html-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/vscode-json-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/yaml-language-server.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/settings/zls.vim create mode 100644 dot_vim/plugged/vim-lsp-settings/test/dot_themisrc create mode 100644 dot_vim/plugged/vim-lsp-settings/test/lsp_settings.vimspec create mode 100644 dot_vim/plugged/vim-lsp-settings/test/lsp_settings/utils.vimspec create mode 100644 dot_vim/plugged/vim-lsp/LICENSE create mode 100644 dot_vim/plugged/vim-lsp/LICENSE-THIRD-PARTY create mode 100644 dot_vim/plugged/vim-lsp/README.md create mode 100644 dot_vim/plugged/vim-lsp/autoload/health/lsp.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/callbag.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/capabilities.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/client.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/completion/documentation.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/document_diagnostics_command.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/echo.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/first_line.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/float.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/highlights.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/movement.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/signs.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/state.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/under_cursor.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/diagnostics/virtual_text.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/document_code_action/signs.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/document_formatting.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/document_highlight.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/document_hover/under_cursor.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/document_range_formatting.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/document_symbol/search.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/inlay_hints.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/semantic.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/show_message.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/show_message_request.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/textprop.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/type_hierarchy.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/ui/popupmenu.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/ui/quickpick.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/work_done_progress.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/internal/workspace_symbol/search.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/omni.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/tag.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/ui/vim.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/ui/vim/code_action.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/ui/vim/code_lens.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/ui/vim/completion.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/ui/vim/execute_command.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/ui/vim/folding.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/ui/vim/output.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/ui/vim/signature_help.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/ui/vim/utils.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/args.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/buffer.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/diff.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/job.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/location.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/position.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/range.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/step.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/tagstack.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/text_edit.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/tree.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/workspace_config.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/lsp/utils/workspace_edit.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/vital/_lsp.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/vital/_lsp/VS/LSP/MarkupContent.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/vital/_lsp/VS/LSP/Text.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/vital/_lsp/VS/Vim/Buffer.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/vital/_lsp/VS/Vim/Syntax/Markdown.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/vital/_lsp/VS/Vim/Window.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/vital/_lsp/VS/Vim/Window/FloatingWindow.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/vital/lsp.vim create mode 100644 dot_vim/plugged/vim-lsp/autoload/vital/lsp.vital create mode 100644 dot_vim/plugged/vim-lsp/doc/tags create mode 100644 dot_vim/plugged/vim-lsp/doc/vim-lsp.txt create mode 100644 dot_vim/plugged/vim-lsp/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-lsp/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-lsp/dot_git/config create mode 100644 dot_vim/plugged/vim-lsp/dot_git/description create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-lsp/dot_git/index create mode 100644 dot_vim/plugged/vim-lsp/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-lsp/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-lsp/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-lsp/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-lsp/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-lsp/dot_git/objects/pack/readonly_pack-01c7f87f2ee40817d49724772ea390415e2f9afb.idx create mode 100644 dot_vim/plugged/vim-lsp/dot_git/objects/pack/readonly_pack-01c7f87f2ee40817d49724772ea390415e2f9afb.pack create mode 100644 dot_vim/plugged/vim-lsp/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-lsp/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-lsp/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-lsp/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-lsp/dot_git/shallow create mode 100644 dot_vim/plugged/vim-lsp/dot_gitattributes create mode 100644 dot_vim/plugged/vim-lsp/dot_github/stale.yml create mode 100644 dot_vim/plugged/vim-lsp/dot_github/workflows/linux_neovim.yml create mode 100644 dot_vim/plugged/vim-lsp/dot_github/workflows/linux_vim.yml create mode 100644 dot_vim/plugged/vim-lsp/dot_github/workflows/mac_neovim.yml create mode 100644 dot_vim/plugged/vim-lsp/dot_github/workflows/mac_vim.yml create mode 100644 dot_vim/plugged/vim-lsp/dot_github/workflows/reviewdog.yml create mode 100644 dot_vim/plugged/vim-lsp/dot_github/workflows/windows_neovim.yml create mode 100644 dot_vim/plugged/vim-lsp/dot_github/workflows/windows_vim.yml create mode 100644 dot_vim/plugged/vim-lsp/dot_gitignore create mode 100644 dot_vim/plugged/vim-lsp/dot_vintrc.yaml create mode 100644 dot_vim/plugged/vim-lsp/ftplugin/lsp-hover.vim create mode 100644 dot_vim/plugged/vim-lsp/minimal.vimrc create mode 100644 dot_vim/plugged/vim-lsp/plugin/lsp.vim create mode 100644 dot_vim/plugged/vim-lsp/syntax/lsp-hover.vim create mode 100644 dot_vim/plugged/vim-lsp/test/dot_themisrc create mode 100644 dot_vim/plugged/vim-lsp/test/integration/go/document_formatting.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/internal/diagnostics/document_diagnostics_command.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/internal/diagnostics/state.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/internal/show_message.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/omni.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/ui/vim/code_lens.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/ui/vim/completion.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/utils.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/utils/buffer.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/utils/diff.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/utils/position.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/utils/range.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/utils/tagstack.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/utils/text_edit.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/utils/work_done_progress.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/lsp/utils/workspace_edit.vimspec create mode 100644 dot_vim/plugged/vim-lsp/test/testfiles/multibyte.txt create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-go/documentformat.go create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-rust/Cargo.lock create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-rust/Cargo.toml create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-rust/dot_gitignore create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-rust/src/calc/add.rs create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-rust/src/calc/mod.rs create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-rust/src/documentdefinition.rs create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-rust/src/documentdiagnostics.rs create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-rust/src/documentformat.rs create mode 100644 dot_vim/plugged/vim-lsp/test/testproject-rust/src/main.rs create mode 100644 dot_vim/plugged/vim-lsp/test/testproject/empty_CMakeLists.txt create mode 100644 dot_vim/plugged/vim-lsp/test/testproject/empty_README.md create mode 100644 dot_vim/plugged/vim-lsp/test/testproject/empty_compile_commands.json create mode 100644 dot_vim/plugged/vim-lsp/test/testproject/empty_dot_ccls create mode 100644 dot_vim/plugged/vim-lsp/test/testproject/git/empty_dot_gitignore create mode 100644 dot_vim/plugged/vim-lsp/test/testproject/src/empty_CMakeLists.txt create mode 100644 dot_vim/plugged/vim-lsp/test/testproject/src/empty_main.cpp create mode 100644 dot_vim/plugged/vim-lsp/test/utils/autoload/lsp/test.vim create mode 100644 dot_vim/plugged/vim-orgmode/CHANGELOG.org create mode 100644 dot_vim/plugged/vim-orgmode/LICENSE create mode 100644 dot_vim/plugged/vim-orgmode/Makefile create mode 100644 dot_vim/plugged/vim-orgmode/README.org create mode 100644 dot_vim/plugged/vim-orgmode/doc/orgguide.txt create mode 100644 dot_vim/plugged/vim-orgmode/doc/tags create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/config create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/description create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/index create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/objects/pack/readonly_pack-ecef9bbfee7b6e301f42815ae4fc1932c4290d07.idx create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/objects/pack/readonly_pack-ecef9bbfee7b6e301f42815ae4fc1932c4290d07.pack create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-orgmode/dot_git/shallow create mode 100644 dot_vim/plugged/vim-orgmode/dot_gitignore create mode 100644 dot_vim/plugged/vim-orgmode/dot_pylintrc create mode 100644 dot_vim/plugged/vim-orgmode/dot_travis.yml create mode 100644 dot_vim/plugged/vim-orgmode/examples/mylife.gif create mode 100644 dot_vim/plugged/vim-orgmode/examples/mylife.org create mode 100644 dot_vim/plugged/vim-orgmode/examples/mylife.png create mode 100644 dot_vim/plugged/vim-orgmode/examples/plugins/PluginExample.py create mode 100644 dot_vim/plugged/vim-orgmode/ftdetect/org.vim create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/org.cnf create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/org.vim create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/__init__.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/_vim.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/docs/Makefile create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/docs/conf.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/docs/index.rst create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/docs/make.bat create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/docs/orgmode.liborgmode.rst create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/docs/orgmode.plugins.rst create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/docs/orgmode.py3compat.rst create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/docs/orgmode.rst create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/exceptions.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/keybinding.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/liborgmode/__init__.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/liborgmode/agenda.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/liborgmode/agendafilter.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/liborgmode/base.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/liborgmode/checkboxes.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/liborgmode/documents.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/liborgmode/dom_obj.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/liborgmode/headings.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/liborgmode/orgdate.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/menu.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/Agenda.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/Date.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/EditCheckbox.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/EditStructure.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/Export.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/Hyperlinks.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/LoggingWork.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/Misc.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/Navigator.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/ShowHide.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/TagsProperties.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/Todo.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/plugins/__init__.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/py3compat/__init__.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/py3compat/encode_compatibility.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/py3compat/py_py3_string.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/py3compat/unicode_compatibility.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/py3compat/xrange_compatibility.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/settings.py create mode 100644 dot_vim/plugged/vim-orgmode/ftplugin/orgmode/vimbuffer.py create mode 100644 dot_vim/plugged/vim-orgmode/indent/org.vim create mode 100644 dot_vim/plugged/vim-orgmode/syntax/org.vim create mode 100644 dot_vim/plugged/vim-orgmode/syntax/orgagenda.vim create mode 100644 dot_vim/plugged/vim-orgmode/syntax/orgtodo.vim create mode 100644 dot_vim/plugged/vim-orgmode/tests/executable_literal_run_tests.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/orgmode_testfile.org create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_libagendafilter.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_libbase.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_libcheckbox.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_libheading.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_liborgdate.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_liborgdate_parsing.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_liborgdate_utf8.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_liborgdatetime.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_liborgtimerange.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_plugin_date.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_plugin_edit_checkbox.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_plugin_edit_structure.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_plugin_mappings.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_plugin_misc.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_plugin_navigator.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_plugin_show_hide.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_plugin_tags_properties.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_plugin_todo.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/test_vimbuffer.py create mode 100644 dot_vim/plugged/vim-orgmode/tests/vim.py create mode 100644 dot_vim/plugged/vim-project/doc/project.txt create mode 100644 dot_vim/plugged/vim-project/doc/tags create mode 100644 dot_vim/plugged/vim-project/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-project/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-project/dot_git/config create mode 100644 dot_vim/plugged/vim-project/dot_git/description create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-project/dot_git/index create mode 100644 dot_vim/plugged/vim-project/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-project/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-project/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-project/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-project/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-project/dot_git/objects/pack/readonly_pack-478bf7a3741e7dee6448877b461f9a4de96d5f6b.idx create mode 100644 dot_vim/plugged/vim-project/dot_git/objects/pack/readonly_pack-478bf7a3741e7dee6448877b461f9a4de96d5f6b.pack create mode 100644 dot_vim/plugged/vim-project/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-project/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-project/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-project/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-project/dot_git/shallow create mode 100644 dot_vim/plugged/vim-project/plugin/project.vim create mode 100644 dot_vim/plugged/vim-surround/README.markdown create mode 100644 dot_vim/plugged/vim-surround/doc/surround.txt create mode 100644 dot_vim/plugged/vim-surround/doc/tags create mode 100644 dot_vim/plugged/vim-surround/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-surround/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-surround/dot_git/config create mode 100644 dot_vim/plugged/vim-surround/dot_git/description create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-surround/dot_git/index create mode 100644 dot_vim/plugged/vim-surround/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-surround/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-surround/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-surround/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-surround/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-surround/dot_git/objects/pack/readonly_pack-c30b6b55db4f5d42be498095200e778ac4bd3017.idx create mode 100644 dot_vim/plugged/vim-surround/dot_git/objects/pack/readonly_pack-c30b6b55db4f5d42be498095200e778ac4bd3017.pack create mode 100644 dot_vim/plugged/vim-surround/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-surround/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-surround/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-surround/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-surround/dot_git/shallow create mode 100644 dot_vim/plugged/vim-surround/dot_github/FUNDING.yml create mode 100644 dot_vim/plugged/vim-surround/dot_gitignore create mode 100644 dot_vim/plugged/vim-surround/plugin/surround.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/LICENSE create mode 100644 dot_vim/plugged/vim-vsnip-integ/README.md create mode 100644 dot_vim/plugged/vim-vsnip-integ/after/plugin/vsnip_integ.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/autoload/vsnip_integ.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/autoload/vsnip_integ/detection.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/autoload/vsnip_integ/integration.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/autoload/vsnip_integ/integration/asyncomplete.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/autoload/vsnip_integ/integration/lcn.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/autoload/vsnip_integ/integration/lsc.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/autoload/vsnip_integ/integration/mucomplete.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/autoload/vsnip_integ/integration/vimlsp.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/autoload/vsnip_integ/integration/yegappan_lsp.vim create mode 100644 dot_vim/plugged/vim-vsnip-integ/denops/@ddc-sources/vsnip.ts create mode 100644 dot_vim/plugged/vim-vsnip-integ/doc/tags create mode 100644 dot_vim/plugged/vim-vsnip-integ/doc/vsnip_integ.txt create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/config create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/description create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/index create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/objects/pack/readonly_pack-a066ec94e158c19f7b32cbd024043f67d34e6efd.idx create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/objects/pack/readonly_pack-a066ec94e158c19f7b32cbd024043f67d34e6efd.pack create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_git/shallow create mode 100644 dot_vim/plugged/vim-vsnip-integ/dot_gitignore create mode 100644 dot_vim/plugged/vim-vsnip-integ/empty_dot_vimrc create mode 100644 dot_vim/plugged/vim-vsnip-integ/plugin/vsnip_integ.vim create mode 100644 dot_vim/plugged/vim-vsnip/LICENSE create mode 100644 dot_vim/plugged/vim-vsnip/README.md create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vital/_vsnip.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vital/_vsnip/VS/LSP/Diff.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vital/_vsnip/VS/LSP/Position.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vital/_vsnip/VS/LSP/Text.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vital/_vsnip/VS/LSP/TextEdit.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vital/_vsnip/VS/Vim/Buffer.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vital/_vsnip/VS/Vim/Option.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vital/vsnip.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vital/vsnip.vital create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/indent.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/parser/combinator.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/range.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/session.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/snippet.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/snippet/node.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/snippet/node/placeholder.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/snippet/node/text.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/snippet/node/transform.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/snippet/node/variable.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/snippet/parser.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/source.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/source/snipmate.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/source/user_snippet.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/source/vscode.vim create mode 100644 dot_vim/plugged/vim-vsnip/autoload/vsnip/variable.vim create mode 100644 dot_vim/plugged/vim-vsnip/doc/tags create mode 100644 dot_vim/plugged/vim-vsnip/doc/vsnip.txt create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/HEAD create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/config create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/description create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/index create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/info/exclude create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/objects/pack/readonly_pack-492c2121c3c98497a9bd4dea2843e7305a5943fa.idx create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/objects/pack/readonly_pack-492c2121c3c98497a9bd4dea2843e7305a5943fa.pack create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/packed-refs create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vim-vsnip/dot_git/shallow create mode 100644 dot_vim/plugged/vim-vsnip/dot_github/workflows/linux_neovim.yml create mode 100644 dot_vim/plugged/vim-vsnip/dot_github/workflows/linux_vim.yml create mode 100644 dot_vim/plugged/vim-vsnip/dot_github/workflows/mac_neovim.yml create mode 100644 dot_vim/plugged/vim-vsnip/dot_github/workflows/windows_neovim.yml create mode 100644 dot_vim/plugged/vim-vsnip/dot_github/workflows/windows_vim.yml create mode 100644 dot_vim/plugged/vim-vsnip/dot_gitignore create mode 100644 dot_vim/plugged/vim-vsnip/dot_npmrc create mode 100644 dot_vim/plugged/vim-vsnip/dot_themisrc create mode 100644 dot_vim/plugged/vim-vsnip/dot_vimrc create mode 100644 dot_vim/plugged/vim-vsnip/ftplugin/snippets.vim create mode 100644 dot_vim/plugged/vim-vsnip/indent/snippets.vim create mode 100644 dot_vim/plugged/vim-vsnip/misc/basic_spec.json create mode 100644 dot_vim/plugged/vim-vsnip/misc/integration.json create mode 100644 dot_vim/plugged/vim-vsnip/misc/snipmate.snippets create mode 100644 dot_vim/plugged/vim-vsnip/misc/source_spec.json create mode 100644 dot_vim/plugged/vim-vsnip/misc/source_spec_vscode/package.json create mode 100644 dot_vim/plugged/vim-vsnip/misc/source_spec_vscode/source_spec_vscode.json create mode 100644 dot_vim/plugged/vim-vsnip/package.json create mode 100644 dot_vim/plugged/vim-vsnip/plugin/vsnip.vim create mode 100644 dot_vim/plugged/vim-vsnip/spec/autoload/vsnip.vimspec create mode 100644 dot_vim/plugged/vim-vsnip/spec/autoload/vsnip/indent.vimspec create mode 100644 dot_vim/plugged/vim-vsnip/spec/autoload/vsnip/snippet.vimspec create mode 100644 dot_vim/plugged/vim-vsnip/spec/autoload/vsnip/snippet/parser.vimspec create mode 100644 dot_vim/plugged/vim-vsnip/spec/autoload/vsnip/source.vimspec create mode 100644 dot_vim/plugged/vim-vsnip/spec/plugin/vsnip.vimspec create mode 100644 dot_vim/plugged/vim-vsnip/syntax/snippets.vim create mode 100644 dot_vim/plugged/vimtex/CONTRIBUTING.md create mode 100644 dot_vim/plugged/vimtex/DOCUMENTATION.md create mode 100644 dot_vim/plugged/vimtex/LICENSE.md create mode 100644 dot_vim/plugged/vimtex/README.md create mode 100644 dot_vim/plugged/vimtex/VISUALS.md create mode 100644 dot_vim/plugged/vimtex/after/ftplugin/tex.vim create mode 100644 dot_vim/plugged/vimtex/assets/json/fontawesome.json create mode 100644 dot_vim/plugged/vimtex/autoload/health/vimtex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/unite/sources/vimtex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/bib.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/cache.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/cmd.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/compiler.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/compiler/_template.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/compiler/arara.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/compiler/generic.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/compiler/latexmk.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/compiler/latexrun.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/compiler/tectonic.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/abntcite create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/acro create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/acronym create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/afterpage create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/algorithm2e create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/allrunes create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/amsbsy create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/amsfonts create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/amsmath create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/amsopn create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/amssymb create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/amsthm create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/appendix create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/array create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/attachfile create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/babel create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/beamerfoils create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/beamerprosper create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/beamerseminar create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/beamertexpower create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/beamerthemeFhG create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/biblatex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/bm create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/booktabs create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/braket create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/calc create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/cancel create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/caption create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/cases create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/chemformula create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/chemstyle create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/circuitikz create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-beamer create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-book create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-letter create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-memoir create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-moderncv create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-scrartcl create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-scrartcl,scrreprt,scrbook create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-scrbook create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-scrlttr2 create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/class-scrreprt create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/cleveref create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/color create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/colortbl create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/commath create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/comment create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/coordsys create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/cquthesis create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/csquotes create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/currvita create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/cyrillic create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/datatool create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/datatool-base create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/default create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/diagxy create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/doi create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/empheq create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/empty_enumerate create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/empty_german create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/empty_latex-209 create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/empty_latex-mathsymbols create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/empty_ngerman create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/empty_parskip create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/epigraph create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/epstopdf create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/etoolbox create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/eurosym create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fancybox create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fancyhdr create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fancyunits-base create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fancyunits-np create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fancyunits-per create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fancyunits_big-fractions create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fancyunits_medium-fractions create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fancyunits_small-fractions create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fancyvrb create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fhgtechdoku_additional create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fixme create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/float create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/fontspec create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/geometry create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/glossaries create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/glosstex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/graphicx create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/harvard create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/hyperref create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/ifluatex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/ifpdf create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/iftex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/ifthen create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/ifvtex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/ifxetex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/import create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/jurabib create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/kantlipsum create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/latex-dev create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/latex-document create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/latex-l2tabu create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/layout create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/letltxmacro create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/libertine create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/lipsum create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/listings create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/logsys create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/longtable create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/lscape create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/ltxtable create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/luatex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/luatodonotes create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/manyfoot create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/marvosym create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/mathtools create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/mdframed create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/mdwlist create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/memhfixc create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/menukeys create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/metrix create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/mhchem create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/microtype create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/minted create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/multicol create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/multido create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/multimedia create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/multirow create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/nameref create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/natbib create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/needspace create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/newclude create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/nicefrac create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/nomencl create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/paracol create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pdfpages create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pgf create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pgfcore create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pgfplots create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/physics create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pifont create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/placeins create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/psfrag create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-3d create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-blur create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-char create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-coil create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-eps create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-fill create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-node create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-plot create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-text create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pst-tree create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/pstricks create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/rotating create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/scraddr create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/scrdate create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/scrlfile create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/scrpage2 create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/scrtime create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/secsty create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/setspace create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/siunitx create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/siunitx-special create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/subcaption create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/subfig create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/subfigure create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/subfiles create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/supertabular create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/svn-multi create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/svninfo create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tabu create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tabularx create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tabulary create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/textcomp create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/theorem create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tikz create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tikz-cd create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tikz-timing create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/titlesec create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tocbibind create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tocloft create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/todonotes create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/executable_convert-cwl create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/executable_symbols-merge.py create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/executable_symbols-parse-json.py create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/symbols create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/symbols-collected create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/symbols-generated create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/symbols-json create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/symbols.json create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/unicode-math/README create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/tools/unicode-math/generate-symbols.tex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/ulem create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/units create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/upgreek create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/url create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/varioref create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/verse create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/virginialake create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/wasysym create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/xcolor create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/xetex create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/xifthen create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/xkeyval create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/xltxtra create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/xparse create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/xspace create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/xtab create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/xy create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/yathesis create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/complete/yfonts create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/context.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/context/cite.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/debug.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/delim.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/doc.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/doc/handlers.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/env.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/bib.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/cmd_addplot.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/cmd_multi.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/cmd_single.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/cmd_single_opt.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/comments.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/env_options.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/envs.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/items.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/markers.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/preamble.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fold/sections.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/format.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/fzf.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/imaps.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/include.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/info.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/jobs.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/jobs/neovim.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/jobs/vim.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/kpsewhich.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/log.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/matchparen.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/misc.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/motion.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/nvim.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/options.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/auxiliary.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/bib.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/fls.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/tex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/beamer_frame.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/bibliography.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/include.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/include_biblatex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/include_bibtex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/include_graphics.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/include_vimtex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/index.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/labels.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/parts.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/preamble.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/section.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/table_of_contents.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/titlepage.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/todo_comments.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/todo_fixme.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/toc/todo_notes.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/parser/vimcomplete.bst create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/paths.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/pos.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/profile.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/qf.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/qf/biblatex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/qf/bibtex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/qf/latexlog.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/qf/pplatex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/qf/pulp.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/qf/u.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/re.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/scratch.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/state.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/state/class.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/core.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/nested.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/amsmath.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/amssymb.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/amsthm.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/array.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/asymptote.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/babel.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/beamer.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/biblatex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/booktabs.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/breqn.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/cases.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/chemformula.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/circuitikz.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/cleveref.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/comment.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/csquotes.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/dot2texi.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/fixme.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/fontawesome5.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/geometry.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/glossaries.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/glossaries_extra.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/gnuplottex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/hyperref.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/ieeetrantools.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/listings.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/luacode.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/markdown.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/mathtools.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/mhequ.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/minted.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/mleftright.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/moreverb.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/nameref.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/natbib.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/optidef.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/pdfpages.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/pgfplots.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/pyluatex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/pythontex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/sagetex.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/siunitx.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/subfile.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/tabularx.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/tcolorbox.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/tikz.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/todonotes.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/url.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/varioref.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/p/wiki.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/syntax/packages.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/test.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/text_obj.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/text_obj/cmdtargets.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/text_obj/envtargets.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/text_obj/targets.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/toc.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/ui.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/util.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/view.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/view/_template.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/view/general.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/view/mupdf.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/view/sioyek.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/view/skim.vim create mode 100644 dot_vim/plugged/vimtex/autoload/vimtex/view/zathura.vim create mode 100644 dot_vim/plugged/vimtex/cliff.toml create mode 100644 dot_vim/plugged/vimtex/compiler/bibertool.vim create mode 100644 dot_vim/plugged/vimtex/compiler/chktex.vim create mode 100644 dot_vim/plugged/vimtex/compiler/lacheck.vim create mode 100644 dot_vim/plugged/vimtex/compiler/style-check.vim create mode 100644 dot_vim/plugged/vimtex/compiler/textidote.vim create mode 100644 dot_vim/plugged/vimtex/compiler/vlty.vim create mode 100644 dot_vim/plugged/vimtex/doc/tags create mode 100644 dot_vim/plugged/vimtex/doc/targets-textobj-cheatsheet.md create mode 100644 dot_vim/plugged/vimtex/doc/vimtex.txt create mode 100644 dot_vim/plugged/vimtex/docker/Dockerfile create mode 100644 dot_vim/plugged/vimtex/dot_git/HEAD create mode 100644 dot_vim/plugged/vimtex/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vimtex/dot_git/config create mode 100644 dot_vim/plugged/vimtex/dot_git/description create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vimtex/dot_git/index create mode 100644 dot_vim/plugged/vimtex/dot_git/info/exclude create mode 100644 dot_vim/plugged/vimtex/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vimtex/dot_git/logs/refs/heads/master create mode 100644 dot_vim/plugged/vimtex/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vimtex/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vimtex/dot_git/objects/pack/readonly_pack-3081e8592b23b0b3d795a76def72f0ff6822109a.idx create mode 100644 dot_vim/plugged/vimtex/dot_git/objects/pack/readonly_pack-3081e8592b23b0b3d795a76def72f0ff6822109a.pack create mode 100644 dot_vim/plugged/vimtex/dot_git/packed-refs create mode 100644 dot_vim/plugged/vimtex/dot_git/refs/heads/master create mode 100644 dot_vim/plugged/vimtex/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vimtex/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vimtex/dot_git/shallow create mode 100644 dot_vim/plugged/vimtex/dot_github/ISSUE_TEMPLATE/feature_request.md create mode 100644 dot_vim/plugged/vimtex/dot_github/ISSUE_TEMPLATE/issue_report.md.disabled create mode 100644 dot_vim/plugged/vimtex/dot_github/ISSUE_TEMPLATE/issue_report.yml create mode 100644 dot_vim/plugged/vimtex/dot_github/workflows/main.yml create mode 100644 dot_vim/plugged/vimtex/dot_gitignore create mode 100644 dot_vim/plugged/vimtex/dot_vintrc.yaml create mode 100644 dot_vim/plugged/vimtex/ftdetect/cls.vim create mode 100644 dot_vim/plugged/vimtex/ftdetect/tex.vim create mode 100644 dot_vim/plugged/vimtex/ftdetect/tikz.vim create mode 100644 dot_vim/plugged/vimtex/ftplugin/bib.vim create mode 100644 dot_vim/plugged/vimtex/ftplugin/tex.vim create mode 100644 dot_vim/plugged/vimtex/indent/bib.vim create mode 100644 dot_vim/plugged/vimtex/indent/tex.vim create mode 100644 dot_vim/plugged/vimtex/plugin/vimtex.vim create mode 100644 dot_vim/plugged/vimtex/rplugin/python3/denite/source/vimtex.py create mode 100644 dot_vim/plugged/vimtex/syntax/tex.vim create mode 100644 dot_vim/plugged/vimtex/test/Makefile create mode 100644 dot_vim/plugged/vimtex/test/common/huge.bib create mode 100644 dot_vim/plugged/vimtex/test/common/local1.bib create mode 100644 dot_vim/plugged/vimtex/test/common/local2.bib create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/appendix.tex create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/backmatter.tex create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/book.bib create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/chapters.tex create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/empty_test.jpg create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/frontmatter.tex create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/main.tex create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/minivimrc create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/preamble.tex create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/sections.tex create mode 100644 dot_vim/plugged/vimtex/test/example-book-multifile/test.tikz create mode 100644 dot_vim/plugged/vimtex/test/example-book/main.tex create mode 100644 dot_vim/plugged/vimtex/test/example-minimal/main.tex create mode 100644 dot_vim/plugged/vimtex/test/example-minimal/minivimrc create mode 100644 dot_vim/plugged/vimtex/test/example-performance/jobs-capture-cached.vim create mode 100644 dot_vim/plugged/vimtex/test/example-quick-start/main.tex create mode 100644 dot_vim/plugged/vimtex/test/example-quickfix/main.log create mode 100644 dot_vim/plugged/vimtex/test/example-quickfix/main.tex create mode 100644 dot_vim/plugged/vimtex/test/example-startup-timing/Makefile create mode 100644 dot_vim/plugged/vimtex/test/example-startup-timing/minivimrc create mode 100644 dot_vim/plugged/vimtex/test/example-startup-timing/thesis.tex create mode 100644 dot_vim/plugged/vimtex/test/test-bibfiles/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-bibfiles/test_revtex.tex create mode 100644 dot_vim/plugged/vimtex/test/test-bibfiles/test_revtex.vim create mode 100644 dot_vim/plugged/vimtex/test/test-cache/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-basic.json create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-basic.vim create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-clear.vim create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-empty.vim create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-kpsewhich-local-a/empty_local.bib create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-kpsewhich-local-a/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-kpsewhich-local-b/empty_local.bib create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-kpsewhich-local-b/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-local.vim create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-validate.vim create mode 100644 dot_vim/plugged/vimtex/test/test-cache/test-wrapper.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-change-cmd.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-change-env-complete.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-change-env.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-change-math.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-close-delim.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-delete-cmd.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-delete-env.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-delete-math.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-delim-toggle.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-insert-cmd.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-toggle-custom-frac.vim create mode 100644 dot_vim/plugged/vimtex/test/test-commands/test-toggle-frac.vim create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-generic/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-generic/test.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-generic/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-pdfmode/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-pdfmode/test-conflict-warning/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-pdfmode/test-conflict-warning/latexmkrc create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-pdfmode/test-conflict-warning/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-pdfmode/test-conflict-warning/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-pdfmode/test-pdfps/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-pdfmode/test-pdfps/latexmkrc create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-pdfmode/test-pdfps/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-pdfmode/test-pdfps/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-selected/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-selected/inputfile.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-selected/reference1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-selected/reference2.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-selected/reference3.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-selected/test-template.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-selected/test.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-selected/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-compiler-selected/vimtex-template.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-compiler/test-backend.vim create mode 100644 dot_vim/plugged/vimtex/test/test-compiler/test-builddir.tex create mode 100644 dot_vim/plugged/vimtex/test/test-compiler/test-builddir.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibstyle/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibstyle/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibstyle/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex-speed/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex-speed/bibspeed.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex-speed/bibspeed.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/dot_gitignore create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_backend.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_backend.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_custom_bibs.bib create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_custom_bibs.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_custom_bibs.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed.bib create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_1.bib create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_2.bib create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_braces.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_braces.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_bracket.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_bracket.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_star.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_star.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_wildcard.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_globbed_wildcard.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_jobname.bib create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_jobname.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_jobname.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_matchstr.bib create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_matchstr.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_matchstr.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_multicite.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_multicite.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_parser_bcf.bcf create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_parser_bcf.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_parser_bcf.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_parser_blg.blg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_parser_blg.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_parser_blg.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_starred.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-bibtex/test_starred.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-commands/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-commands/test-custom-cls-speed.cls create mode 100644 dot_vim/plugged/vimtex/test/test-completion-commands/test-custom-cls-speed.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-commands/test-custom-cls-speed.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-commands/test-custom-cls.cls create mode 100644 dot_vim/plugged/vimtex/test/test-completion-commands/test-custom-cls.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-commands/test-custom-cls.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-commands/test-custom-cmds.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-commands/test-custom-cmds.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-documentclass/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-documentclass/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-documentclass/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-environments/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-environments/test1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-environments/test1.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-environments/test2.cls create mode 100644 dot_vim/plugged/vimtex/test/test-completion-environments/test2.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-environments/test2.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-environments/test3.sty create mode 100644 dot_vim/plugged/vimtex/test/test-completion-environments/test3.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-environments/test3.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/empty_fig1.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_example.tikzz create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_example1.tikz create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_example2.TikZ create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_example3.TIKZ create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig10.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig11.eps create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig12.pdf create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig13.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig2.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig3.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig4.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig5.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig6.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig7.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig8.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/figures/empty_fig9.png create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/my figures/empty_new_fig1.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/my figures/empty_new_fig2.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/my figures/empty_new_fig3.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/my figures/empty_new_fig4.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/my figures/empty_new_fig5.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/my figures/empty_new_fig6.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/my figures/empty_new_fig7.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/my figures/empty_new_fig8.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/my figures/empty_new_fig9.jpg create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/tikz_pic.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-filenames/tikzpics/empty_figure.tikz create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary-texinputs/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary-texinputs/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary-texinputs/texinclude/inp.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary-texinputs/texwork/example.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary/glossaries-extra-1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary/glossaries-extra-2.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary/glossaries-extra.bib create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary/glossaries-extra.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary/glossaries.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary/glossaries.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary/glsentries.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-glossary/latexmkrc create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test1.aux create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test1.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test1/sub1.aux create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test1/sub1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test1/sub2 with spaces.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test1/sub3 with spaces.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test1/sub4.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test2.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test2.vim create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test2/input1.aux create mode 100644 dot_vim/plugged/vimtex/test/test-completion-labels/test2/input2.aux create mode 100644 dot_vim/plugged/vimtex/test/test-completion-packages/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-completion-packages/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-completion-packages/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-context-cite/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-context-cite/test-cites.bib create mode 100644 dot_vim/plugged/vimtex/test/test-context-cite/test-cites.tex create mode 100644 dot_vim/plugged/vimtex/test/test-context-cite/test-cites.vim create mode 100644 dot_vim/plugged/vimtex/test/test-delim/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-delim/test.tex create mode 100644 dot_vim/plugged/vimtex/test/test-delim/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-doc/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-doc/test.tex create mode 100644 dot_vim/plugged/vimtex/test/test-doc/test_usepackage.vim create mode 100644 dot_vim/plugged/vimtex/test/test-doc/test_usetikzlibrary.vim create mode 100644 dot_vim/plugged/vimtex/test/test-env/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-env/test-getters.tex create mode 100644 dot_vim/plugged/vimtex/test/test-env/test-getters.vim create mode 100644 dot_vim/plugged/vimtex/test/test-env/test-surround.tex create mode 100644 dot_vim/plugged/vimtex/test/test-env/test-surround.vim create mode 100644 dot_vim/plugged/vimtex/test/test-env/test-toggle-star.tex create mode 100644 dot_vim/plugged/vimtex/test/test-env/test-toggle-star.vim create mode 100644 dot_vim/plugged/vimtex/test/test-folding-bib/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-folding-bib/test.bib create mode 100644 dot_vim/plugged/vimtex/test/test-folding-bib/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-folding/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-folding/test-env-options.tex create mode 100644 dot_vim/plugged/vimtex/test/test-folding/test-env-options.vim create mode 100644 dot_vim/plugged/vimtex/test/test-folding/test-other.tex create mode 100644 dot_vim/plugged/vimtex/test/test-folding/test-other.vim create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-01.ref create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-01.tex create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-02.ref create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-02.tex create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-03.ref create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-03.tex create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-04.ref create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-04.tex create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-05.ref create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-05.tex create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-06.ref create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test-06.tex create mode 100644 dot_vim/plugged/vimtex/test/test-formatting/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/simple.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-bib-alternate/empty_references.bib create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-bib-alternate/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-bib-notfound/empty_references.bib create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-bib-simple/empty_references.bib create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-bib-simple/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-included-preamble/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-included-preamble/preamble.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-includes/include3.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-includes/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-includes/subfile.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-includes/test/include1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-includes/test/sub/include2.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-latexmain/empty_included.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-latexmain/empty_main.tex.latexmain create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-latexmain/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-latexmain/section1/empty_main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-latexmk/latexmkrc create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-latexmk/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-latexmk/preamble.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-standalone/a/a.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-standalone/a/b/b.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-standalone/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-subfiles/empty_not-main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-subfiles/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-subfiles/preamble.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-subfiles/sub/sub1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-subfiles/sub/sub2.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-subfiles/sub/sub3.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-texroot/empty_main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-texroot/included.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test-ugly-paths/[code college-1] title/test.tex create mode 100644 dot_vim/plugged/vimtex/test/test-get-main/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-imaps/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-imaps/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-include/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-include/references.bib create mode 100644 dot_vim/plugged/vimtex/test/test-include/sub/empty_file1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-include/sub/empty_file2.tex create mode 100644 dot_vim/plugged/vimtex/test/test-include/sub/empty_file3.tex create mode 100644 dot_vim/plugged/vimtex/test/test-include/test.tex create mode 100644 dot_vim/plugged/vimtex/test/test-include/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-indentation-timing/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-indentation-timing/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-indentation-timing/thesis.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_ampersands-off_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_ampersands-off_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_ampersands_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_ampersands_nested-envs_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_ampersands_nested-envs_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_ampersands_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_close-indented_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_close-indented_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_close_open_same_line_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_close_open_same_line_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_environments-ignored_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_environments-ignored_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_environments_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_environments_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_itemized_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_itemized_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_math_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_math_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_tikz_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_tikz_long_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_tikz_long_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_tikz_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_verbatim_input.tex create mode 100644 dot_vim/plugged/vimtex/test/test-indentation/test_verbatim_reference.tex create mode 100644 dot_vim/plugged/vimtex/test/test-jobs/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-jobs/test-capture.vim create mode 100644 dot_vim/plugged/vimtex/test/test-jobs/test-run.vim create mode 100644 dot_vim/plugged/vimtex/test/test-jobs/test-start.vim create mode 100644 dot_vim/plugged/vimtex/test/test-matchparen-speed/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-matchparen-speed/test.tex create mode 100644 dot_vim/plugged/vimtex/test/test-matchparen-speed/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-metadata/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-metadata/test-sources.vim create mode 100644 dot_vim/plugged/vimtex/test/test-metadata/test-sources/include1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-metadata/test-sources/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-metadata/test-sources/sub1/include2.tex create mode 100644 dot_vim/plugged/vimtex/test/test-metadata/test-sources/sub2/include3.tex create mode 100644 dot_vim/plugged/vimtex/test/test-metadata/test-sources/subfile.tex create mode 100644 dot_vim/plugged/vimtex/test/test-motions-virtual/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-motions-virtual/test.tex create mode 100644 dot_vim/plugged/vimtex/test/test-motions-virtual/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-motions/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-beamer.tex create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-beamer.vim create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-comment.tex create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-comment.vim create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-math.tex create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-math.vim create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-method.tex create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-method.vim create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-section.tex create mode 100644 dot_vim/plugged/vimtex/test/test-motions/test-section.vim create mode 100644 dot_vim/plugged/vimtex/test/test-parser-bib/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-parser-bib/test.bib create mode 100644 dot_vim/plugged/vimtex/test/test-parser-bib/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-parser-cmds/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-parser-cmds/test.tex create mode 100644 dot_vim/plugged/vimtex/test/test-parser-cmds/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-parser-tex/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-parser-tex/test_preamble_include.ref create mode 100644 dot_vim/plugged/vimtex/test/test-parser-tex/test_preamble_include.tex create mode 100644 dot_vim/plugged/vimtex/test/test-parser-tex/test_preamble_include.vim create mode 100644 dot_vim/plugged/vimtex/test/test-parser-tex/test_preamble_included.tex create mode 100644 dot_vim/plugged/vimtex/test/test-parser-tex/test_recursive.tex create mode 100644 dot_vim/plugged/vimtex/test/test-parser-tex/test_recursive.vim create mode 100644 dot_vim/plugged/vimtex/test/test-parser-toc/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-parser-toc/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-parser-toc/sub.tex create mode 100644 dot_vim/plugged/vimtex/test/test-parser-toc/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-paths/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-paths/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-paths/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/dot_gitignore create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/test-beamer.log create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/test-beamer.tex create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/test-beamer.vim create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/test-hbox-1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/test-hbox-2.tex create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/test-hbox-3.tex create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/test-hbox.log create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/test-hbox.tex create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix-fix-path/test-hbox.vim create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix/file with errors.log create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix/file with errors.tex create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix/input with spaces.tex create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix/test-latexlog.vim create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix/test-pplatex.log create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix/test-pplatex.vim create mode 100644 dot_vim/plugged/vimtex/test/test-quickfix/test-spaces.vim create mode 100644 dot_vim/plugged/vimtex/test/test-state/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-state/included.tex create mode 100644 dot_vim/plugged/vimtex/test/test-state/minimal.tex create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_builddir.vim create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_hidden.vim create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_modified-quit.vim create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_no-hidden.vim create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_parse_documentclass.tex create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_parse_documentclass.vim create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_reload.cls create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_reload.vim create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_reopen.vim create mode 100644 dot_vim/plugged/vimtex/test/test-state/test_toggle-main.vim create mode 100644 dot_vim/plugged/vimtex/test/test-subfiles/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-subfiles/test_nested.vim create mode 100644 dot_vim/plugged/vimtex/test/test-subfiles/test_nested/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-subfiles/test_nested/parts/chapter.tex create mode 100644 dot_vim/plugged/vimtex/test/test-subfiles/test_nested/parts/sections/first.tex create mode 100644 dot_vim/plugged/vimtex/test/test-subfiles/test_nested/parts/sections/second.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/common.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-amsmath.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-amsmath.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-amsthm.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-amsthm.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-array.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-array.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-asymptote.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-asymptote.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-babel.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-babel.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-biblatex.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-biblatex.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-bold-italic.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-bold-italic.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-booktabs.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-booktabs.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-breqn.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-breqn.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-cases.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-cases.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-chemformula.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-chemformula.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-circuitikz.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-cleveref.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-cleveref.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-comment.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-conceal.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-conceal.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-core.dtx create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-core.sty create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-core.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-core.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-custom.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-custom.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-dockerfile.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-dockerfile.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-expl3.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-expl3.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-fixme.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-fixme.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-fls-reload.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-fls-reload.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-fontawesome5.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-fontawesome5.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-glossaries.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-hyperref.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-hyperref.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-ieeetrantools.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-ieeetrantools.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-iffalse.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-ifnextchar.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-ifnextchar.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-iftrue.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-latex3.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-latex3.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-listings.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-listings.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-loading.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-loading.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-luacode.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-markdown.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-markdown.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-mathtools.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-mathtools.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-mhequ.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-minted.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-minted.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-mleftright.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-mleftright.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-natbib.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-natbib.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-optidef.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-optidef.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-postinit.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-pyluatex.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-pyluatex.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-pythontex.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-pythontex.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-sagetex.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-sagetex.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-siunitx.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-tabularx.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-tabularx.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-tcolorbox.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-tcolorbox.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-tikz.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-tikz.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-various-packages.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-various-packages.vim create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-wiki.tex create mode 100644 dot_vim/plugged/vimtex/test/test-syntax/test-wiki.vim create mode 100644 dot_vim/plugged/vimtex/test/test-texflavor/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-texflavor/test-defined.vim create mode 100644 dot_vim/plugged/vimtex/test/test-texflavor/test-undefined.vim create mode 100644 dot_vim/plugged/vimtex/test/test-textobj-targets/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-textobj-targets/minimal.tex create mode 100644 dot_vim/plugged/vimtex/test/test-textobj-targets/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-textobj-targets/test1.ok create mode 100644 dot_vim/plugged/vimtex/test/test-textobj-targets/test1.tex create mode 100644 dot_vim/plugged/vimtex/test/test-textobj/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-textobj/test-envs.vim create mode 100644 dot_vim/plugged/vimtex/test/test-textobj/test-exclusive.vim create mode 100644 dot_vim/plugged/vimtex/test/test-textobj/test-items.vim create mode 100644 dot_vim/plugged/vimtex/test/test-textobj/test-other.vim create mode 100644 dot_vim/plugged/vimtex/test/test-textobj/test-sections.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter00.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter01.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter02.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter03.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter04.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter05.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter06.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter07.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter08.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter09.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter10.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter11.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter12.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter13.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter14.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter15.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter16.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter17.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter18.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter19.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter20.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter21.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter22.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter23.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter24.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter25.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter26.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter27.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter28.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter29.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter30.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter31.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter32.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter33.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter34.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter35.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter36.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter37.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter38.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter39.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter40.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter41.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter42.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter43.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter44.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter45.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter46.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter47.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter48.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter49.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter50.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter51.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter52.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter53.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter54.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter55.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter56.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter57.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter58.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter59.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter60.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter61.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter62.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter63.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter64.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter65.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter66.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter67.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter68.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter69.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter70.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter71.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter72.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter73.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter74.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter75.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter76.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter77.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter78.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter79.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter80.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter81.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter82.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter83.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter84.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter85.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter86.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter87.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter88.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter89.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter90.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter91.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter92.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter93.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter94.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter95.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter96.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter97.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter98.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/chapter99.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/empty_preamble.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/chapters/subfile.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc-speed/test.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-toc/chapters/chapter.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/chapters/empty_preamble.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/chapters/equations.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/chapters/imported.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/chapters/sections/first.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/chapters/sections/second.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/chapters/subfile.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/main.aux create mode 100644 dot_vim/plugged/vimtex/test/test-toc/main.bib create mode 100644 dot_vim/plugged/vimtex/test/test-toc/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-beamer.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-beamer.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-disable.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-fixme.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-fixme.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-general.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-indent.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-keepalt.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-keepwidth.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-multiline.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-multiline.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-starred.tex create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-starred.vim create mode 100644 dot_vim/plugged/vimtex/test/test-toc/test-texorpdfstring.vim create mode 100644 dot_vim/plugged/vimtex/test/test-utils/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-utils/test1.vim create mode 100644 dot_vim/plugged/vimtex/test/test-view/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-view/included.tex create mode 100644 dot_vim/plugged/vimtex/test/test-view/main.tex create mode 100644 dot_vim/plugged/vimtex/test/test-view/test_inverse_search.vim create mode 100644 dot_vim/plugged/vimtex/test/test-wordcount/Makefile create mode 100644 dot_vim/plugged/vimtex/test/test-wordcount/minimal.tex create mode 100644 dot_vim/plugged/vimtex/test/test-wordcount/test.vim create mode 100644 dot_vim/plugged/vimwiki/CONTRIBUTING.md create mode 100644 dot_vim/plugged/vimwiki/Dockerfile create mode 100644 dot_vim/plugged/vimwiki/LICENSE.md create mode 100644 dot_vim/plugged/vimwiki/README-cn.md create mode 100644 dot_vim/plugged/vimwiki/README.md create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/base.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/default.tpl create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/diary.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/emoji.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/executable_customwiki2html.sh create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/html.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/lst.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/markdown_base.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/path.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/style.css create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/tags.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/tbl.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/u.vim create mode 100644 dot_vim/plugged/vimwiki/autoload/vimwiki/vars.vim create mode 100644 dot_vim/plugged/vimwiki/doc/design_notes.md create mode 100644 dot_vim/plugged/vimwiki/doc/entries.png create mode 100644 dot_vim/plugged/vimwiki/doc/lists.png create mode 100644 dot_vim/plugged/vimwiki/doc/logo.svg create mode 100644 dot_vim/plugged/vimwiki/doc/screenshot_1.png create mode 100644 dot_vim/plugged/vimwiki/doc/screenshot_2.png create mode 100644 dot_vim/plugged/vimwiki/doc/specification.wiki create mode 100644 dot_vim/plugged/vimwiki/doc/splash.png create mode 100644 dot_vim/plugged/vimwiki/doc/tags create mode 100644 dot_vim/plugged/vimwiki/doc/todos.png create mode 100644 dot_vim/plugged/vimwiki/doc/vertical-logo.svg create mode 100644 dot_vim/plugged/vimwiki/doc/vimwiki-emoji.txt create mode 100644 dot_vim/plugged/vimwiki/doc/vimwiki.txt create mode 100644 dot_vim/plugged/vimwiki/doc/wiki.png create mode 100644 dot_vim/plugged/vimwiki/dot_git/HEAD create mode 100644 dot_vim/plugged/vimwiki/dot_git/branches/.keep create mode 100644 dot_vim/plugged/vimwiki/dot_git/config create mode 100644 dot_vim/plugged/vimwiki/dot_git/description create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/applypatch-msg.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/commit-msg.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/fsmonitor-watchman.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/post-update.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/pre-applypatch.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/pre-commit.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/pre-merge-commit.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/pre-push.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/pre-rebase.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/pre-receive.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/prepare-commit-msg.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/push-to-checkout.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/hooks/update.sample create mode 100644 dot_vim/plugged/vimwiki/dot_git/index create mode 100644 dot_vim/plugged/vimwiki/dot_git/info/exclude create mode 100644 dot_vim/plugged/vimwiki/dot_git/logs/HEAD create mode 100644 dot_vim/plugged/vimwiki/dot_git/logs/refs/heads/dev create mode 100644 dot_vim/plugged/vimwiki/dot_git/logs/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vimwiki/dot_git/objects/info/.keep create mode 100644 dot_vim/plugged/vimwiki/dot_git/objects/pack/readonly_pack-3b3097a7ca1d11cc2b5825937c0a7df65d09ae6e.idx create mode 100644 dot_vim/plugged/vimwiki/dot_git/objects/pack/readonly_pack-3b3097a7ca1d11cc2b5825937c0a7df65d09ae6e.pack create mode 100644 dot_vim/plugged/vimwiki/dot_git/packed-refs create mode 100644 dot_vim/plugged/vimwiki/dot_git/refs/heads/dev create mode 100644 dot_vim/plugged/vimwiki/dot_git/refs/remotes/origin/HEAD create mode 100644 dot_vim/plugged/vimwiki/dot_git/refs/tags/.keep create mode 100644 dot_vim/plugged/vimwiki/dot_git/shallow create mode 100644 dot_vim/plugged/vimwiki/dot_github/issue_template.md create mode 100644 dot_vim/plugged/vimwiki/dot_github/pull_request_template.md create mode 100644 dot_vim/plugged/vimwiki/dot_gitignore create mode 100644 dot_vim/plugged/vimwiki/dot_travis.yml create mode 100644 dot_vim/plugged/vimwiki/ftplugin/vimwiki.vim create mode 100644 dot_vim/plugged/vimwiki/plugin/vimwiki.vim create mode 100644 dot_vim/plugged/vimwiki/syntax/vimwiki.vim create mode 100644 dot_vim/plugged/vimwiki/syntax/vimwiki_markdown_custom.vim create mode 100644 dot_vim/plugged/vimwiki/test/README.md create mode 100644 dot_vim/plugged/vimwiki/test/api_base_resolve_link.vader create mode 100644 dot_vim/plugged/vimwiki/test/config_commentstring.vader create mode 100644 dot_vim/plugged/vimwiki/test/config_vars.vader create mode 100644 dot_vim/plugged/vimwiki/test/executable_literal_run_tests.sh create mode 100644 dot_vim/plugged/vimwiki/test/file_goto.vader create mode 100644 dot_vim/plugged/vimwiki/test/file_system.vader create mode 100644 dot_vim/plugged/vimwiki/test/fold.vader create mode 100644 dot_vim/plugged/vimwiki/test/html_blockquote.vader create mode 100644 dot_vim/plugged/vimwiki/test/html_convert_default.vader create mode 100644 dot_vim/plugged/vimwiki/test/html_convert_title.vader create mode 100644 dot_vim/plugged/vimwiki/test/html_diary_rss_feed.vader create mode 100644 dot_vim/plugged/vimwiki/test/issue_markdown.vader create mode 100644 dot_vim/plugged/vimwiki/test/issue_profile_tabnext.vader create mode 100644 dot_vim/plugged/vimwiki/test/link_anchor.vader create mode 100644 dot_vim/plugged/vimwiki/test/link_creation.vader create mode 100644 dot_vim/plugged/vimwiki/test/link_generation.vader create mode 100644 dot_vim/plugged/vimwiki/test/link_renaming.vader create mode 100644 dot_vim/plugged/vimwiki/test/link_syntax_markdown.vader create mode 100644 dot_vim/plugged/vimwiki/test/link_syntax_vimwiki.vader create mode 100644 dot_vim/plugged/vimwiki/test/link_toc.vader create mode 100644 dot_vim/plugged/vimwiki/test/list_clean.vader create mode 100644 dot_vim/plugged/vimwiki/test/list_margin.vader create mode 100644 dot_vim/plugged/vimwiki/test/list_move.vader create mode 100644 dot_vim/plugged/vimwiki/test/list_return.vader create mode 100644 dot_vim/plugged/vimwiki/test/list_todo.vader create mode 100644 dot_vim/plugged/vimwiki/test/list_update.vader create mode 100644 dot_vim/plugged/vimwiki/test/list_update_nopropagate.vader create mode 100644 dot_vim/plugged/vimwiki/test/map.vader create mode 100644 dot_vim/plugged/vimwiki/test/resources/executable_delay.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/rtp_local.vim create mode 100644 dot_vim/plugged/vimwiki/test/resources/testmarkdown/buzz_bozz.md create mode 100644 dot_vim/plugged/vimwiki/test/resources/testmarkdown/diary/empty_2020-07-22.md create mode 100644 dot_vim/plugged/vimwiki/test/resources/testmarkdown/index.md create mode 100644 dot_vim/plugged/vimwiki/test/resources/testmarkdown/link_syntax.md create mode 100644 dot_vim/plugged/vimwiki/test/resources/testmarkdown/link_syntax/nested.md create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki space/buzz bozz.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki space/index.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki/buzz_bozz.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki/diary/2020-07-22.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki/diary/2020-07-23.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki/diary/2020-07-24.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki/diary/2020-07-25.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki/index.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki/link_syntax.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki/link_syntax/nested.wiki create mode 100644 dot_vim/plugged/vimwiki/test/resources/testwiki/templates/template_1073.tpl create mode 100644 dot_vim/plugged/vimwiki/test/search.vader create mode 100644 dot_vim/plugged/vimwiki/test/syntax.vader create mode 100644 dot_vim/plugged/vimwiki/test/table.vader create mode 100644 dot_vim/plugged/vimwiki/test/table_autoformat.vader create mode 100644 dot_vim/plugged/vimwiki/test/tag.vader create mode 100644 dot_vim/plugged/vimwiki/test/vimrc create mode 100644 dot_vim/plugged/vimwiki/test/z_success.vader create mode 100644 dot_vim/spell/en.utf-8.spl create mode 100644 dot_vim/spell/en.utf-8.sug create mode 100644 dot_vim/syntax/cpp11.vim create mode 100644 dot_vim/syntax/cpp11_cbase.vim diff --git a/dot_vim/after/ftplugin/coffee/folding.vim b/dot_vim/after/ftplugin/coffee/folding.vim new file mode 100644 index 0000000..a7007b8 --- /dev/null +++ b/dot_vim/after/ftplugin/coffee/folding.vim @@ -0,0 +1,37 @@ +function! CoffeeIndentLevel(lnum) + return indent(a:lnum) / &shiftwidth +endfunction + +function! NextNonBlankLine(lnum) + let numlines = line('$') + let current = a:lnum + 1 + + while current <= numlines + if getline(current) =~? '\v\S' + return current + endif + + let current += 1 + endwhile + + return -2 +endfunction + +function! CoffeeFolds() + if getline(v:lnum) =~ '\v^\s*$' + return '-1' + endif + + let this_indent = IndentLevel(a:lnum) + let next_indent = IndentLevel(NextNonBlankLine(a:lnum)) + + if next_indent == this_indent + return this_indent + elseif next_indent < this_indent + return this_indent + elseif next_indent > this_indent + return '>' . next_indent + endif +endfunction +setlocal foldmethod=expr +setlocal foldexpr=CoffeeFolds() diff --git a/dot_vim/after/plugin/ale.vim b/dot_vim/after/plugin/ale.vim new file mode 100644 index 0000000..dbde9f9 --- /dev/null +++ b/dot_vim/after/plugin/ale.vim @@ -0,0 +1,16 @@ +let g:ale_completion_enabled = 1 +let g:ale_completion_autoimport = 1 +let g:ale_fixers = { + \ '*': ['remove_trailing_lines', 'trim_whitespace'], +\ 'javascript': ['eslint'], +\ 'rust': ['rustfmt'], +\ 'dart': ['dartfmt'], +\} +let g:ale_rust_analyzer_executable = '/home/linly/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/rust-analyzer' +let g:ale_linters = {'rust': ['cargo', 'analyzer']} +let g:rustfmt_autosave = 1 +let g:rust_clip_command = 'xclip -selection clipboard' +let g:ale_fix_on_save = 1 +let g:ale_sign_error = '>>' +let g:ale_sign_warning = '--' +let g:ale_virtualtext_cursor = 'current' diff --git a/dot_vim/autoload/pathogen.vim b/dot_vim/autoload/pathogen.vim new file mode 100644 index 0000000..df4f22d --- /dev/null +++ b/dot_vim/autoload/pathogen.vim @@ -0,0 +1,245 @@ +" pathogen.vim - path option manipulation +" Maintainer: Tim Pope +" Version: 2.0 + +" Install in ~/.vim/autoload (or ~\vimfiles\autoload). +" +" For management of individually installed plugins in ~/.vim/bundle (or +" ~\vimfiles\bundle), adding `call pathogen#infect()` to your .vimrc +" prior to `filetype plugin indent on` is the only other setup necessary. +" +" The API is documented inline below. For maximum ease of reading, +" :set foldmethod=marker + +if exists("g:loaded_pathogen") || &cp + finish +endif +let g:loaded_pathogen = 1 + +" Point of entry for basic default usage. Give a directory name to invoke +" pathogen#runtime_append_all_bundles() (defaults to "bundle"), or a full path +" to invoke pathogen#runtime_prepend_subdirectories(). Afterwards, +" pathogen#cycle_filetype() is invoked. +function! pathogen#infect(...) abort " {{{1 + let source_path = a:0 ? a:1 : 'bundle' + if source_path =~# '[\\/]' + call pathogen#runtime_prepend_subdirectories(source_path) + else + call pathogen#runtime_append_all_bundles(source_path) + endif + call pathogen#cycle_filetype() +endfunction " }}}1 + +" Split a path into a list. +function! pathogen#split(path) abort " {{{1 + if type(a:path) == type([]) | return a:path | endif + let split = split(a:path,'\\\@]','\\&','') + endif +endfunction " }}}1 + +function! s:find(count,cmd,file,lcd) " {{{1 + let rtp = pathogen#join(1,pathogen#split(&runtimepath)) + let file = pathogen#runtime_findfile(a:file,a:count) + if file ==# '' + return "echoerr 'E345: Can''t find file \"".a:file."\" in runtimepath'" + elseif a:lcd + let path = file[0:-strlen(a:file)-2] + execute 'lcd `=path`' + return a:cmd.' '.pathogen#fnameescape(a:file) + else + return a:cmd.' '.pathogen#fnameescape(file) + endif +endfunction " }}}1 + +function! s:Findcomplete(A,L,P) " {{{1 + let sep = pathogen#separator() + let cheats = { + \'a': 'autoload', + \'d': 'doc', + \'f': 'ftplugin', + \'i': 'indent', + \'p': 'plugin', + \'s': 'syntax'} + if a:A =~# '^\w[\\/]' && has_key(cheats,a:A[0]) + let request = cheats[a:A[0]].a:A[1:-1] + else + let request = a:A + endif + let pattern = substitute(request,'\'.sep,'*'.sep,'g').'*' + let found = {} + for path in pathogen#split(&runtimepath) + let path = expand(path, ':p') + let matches = split(glob(path.sep.pattern),"\n") + call map(matches,'isdirectory(v:val) ? v:val.sep : v:val') + call map(matches,'expand(v:val, ":p")[strlen(path)+1:-1]') + for match in matches + let found[match] = 1 + endfor + endfor + return sort(keys(found)) +endfunction " }}}1 + +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Ve :execute s:find(,'edit',,0) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vedit :execute s:find(,'edit',,0) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vopen :execute s:find(,'edit',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vsplit :execute s:find(,'split',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vvsplit :execute s:find(,'vsplit',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vtabedit :execute s:find(,'tabedit',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vpedit :execute s:find(,'pedit',,1) +command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vread :execute s:find(,'read',,1) + +" vim:set ft=vim ts=8 sw=2 sts=2: diff --git a/dot_vim/autoload/plug.vim b/dot_vim/autoload/plug.vim new file mode 100644 index 0000000..652caa8 --- /dev/null +++ b/dot_vim/autoload/plug.vim @@ -0,0 +1,2812 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-default branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or ``-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be +" included in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +if s:is_win && &shellslash + set noshellslash + let s:me = resolve(expand(':p')) + set shellslash +else + let s:me = resolve(expand(':p')) +endif +let s:base_spec = { 'branch': '', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! s:is_powershell(shell) + return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$' +endfunction + +function! s:isabsolute(dir) abort + return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)') +endfunction + +function! s:git_dir(dir) abort + let gitdir = s:trim(a:dir) . '/.git' + if isdirectory(gitdir) + return gitdir + endif + if !filereadable(gitdir) + return '' + endif + let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*') + if len(gitdir) && !s:isabsolute(gitdir) + let gitdir = a:dir . '/' . gitdir + endif + return isdirectory(gitdir) ? gitdir : '' +endfunction + +function! s:git_origin_url(dir) abort + let gitdir = s:git_dir(a:dir) + let config = gitdir . '/config' + if empty(gitdir) || !filereadable(config) + return '' + endif + return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze') +endfunction + +function! s:git_revision(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + + let line = get(readfile(head), 0, '') + let ref = matchstr(line, '^ref: \zs.*') + if empty(ref) + return line + endif + + if filereadable(gitdir . '/' . ref) + return get(readfile(gitdir . '/' . ref), 0, '') + endif + + if filereadable(gitdir . '/packed-refs') + for line in readfile(gitdir . '/packed-refs') + if line =~# ' ' . ref + return matchstr(line, '^[0-9a-f]*') + endif + endfor + endif + + return '' +endfunction + +function! s:git_local_branch(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*') + return len(branch) ? branch : 'HEAD' +endfunction + +function! s:git_origin_branch(spec) + if len(a:spec.branch) + return a:spec.branch + endif + + " The file may not be present if this is a local repository + let gitdir = s:git_dir(a:spec.dir) + let origin_head = gitdir.'/refs/remotes/origin/HEAD' + if len(gitdir) && filereadable(origin_head) + return matchstr(get(readfile(origin_head), 0, ''), + \ '^ref: refs/remotes/origin/\zs.*') + endif + + " The command may not return the name of a branch in detached HEAD state + let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir)) + return v:shell_error ? '' : result[-1] +endfunction + +if s:is_win + function! s:plug_call(fn, ...) + let shellslash = &shellslash + try + set noshellslash + return call(a:fn, a:000) + finally + let &shellslash = shellslash + endtry + endfunction +else + function! s:plug_call(fn, ...) + return call(a:fn, a:000) + endfunction +endif + +function! s:plug_getcwd() + return s:plug_call('getcwd') +endfunction + +function! s:plug_fnamemodify(fname, mods) + return s:plug_call('fnamemodify', a:fname, a:mods) +endfunction + +function! s:plug_expand(fmt) + return s:plug_call('expand', a:fmt, 1) +endfunction + +function! s:plug_tempname() + return s:plug_call('tempname') +endfunction + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif has('nvim') + let home = stdpath('data') . '/plugged' + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#() + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + if has('win32') + \ && &shellslash + \ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell)) + return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') + endif + if !has('nvim') + \ && (has('win32') || has('win32unix')) + \ && !has('multi_byte') + return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) + command! -nargs=0 -bar -bang PlugClean call s:clean(0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(0, ) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('plug#end() called without calling plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if get(g:, 'did_load_filetypes', 0) + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or ``.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "", , , , %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap %s %s:call lod_map(%s, %s, %s, "%s")', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) +endfunction + +if s:is_win + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction + + " Copied from fzf + function! s:wrap_cmds(cmds) + let cmds = [ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + ['endlocal'] + if has('iconv') + if !exists('s:codepage') + let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) + endif + return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) + endif + return map(cmds, 'v:val."\r"') + endfunction + + function! s:batchfile(cmd) + let batchfile = s:plug_tempname().'.bat' + call writefile(s:wrap_cmds(a:cmd), batchfile) + let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) + if s:is_powershell(&shell) + let cmd = '& ' . cmd + endif + return [batchfile, cmd] + endfunction +else + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]) + for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^', "\", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(repo . ' ' . v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)' + if type == s:TYPE.string + if empty(a:arg) + throw printf(opt_errfmt, 'tag', 'string') + endif + let opts.tag = a:arg + elseif type == s:TYPE.dict + for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as'] + if has_key(a:arg, opt) + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string') + endif + endfor + for opt in ['on', 'for'] + if has_key(a:arg, opt) + \ && type(a:arg[opt]) != s:TYPE.list + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string or list') + endif + endfor + if has_key(a:arg, 'do') + \ && type(a:arg.do) != s:TYPE.funcref + \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do)) + throw printf(opt_errfmt, 'do', 'string or funcref') + endif + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(s:plug_expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(s:plug_expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-\{1}\ / + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn match plugH2 /^-\{2,}/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap R :call retry() + nnoremap D :PlugDiff + nnoremap S :PlugStatus + nnoremap U :call status_update() + xnoremap U :call status_update() + nnoremap ]] :silent! call section('') + nnoremap [[ :silent! call section('b') +endfunction + +function! s:prepare(...) + if empty(s:plug_getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap q :call close_pane() + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap ' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:close_pane() + if b:plug_preview == 1 + pc + let b:plug_preview = -1 + else + bd + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if !s:is_win + set shell=sh + endif + if a:swap + if s:is_powershell(&shell) + let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' + elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$' + set shellredir=>%s\ 2>&1 + endif + endif + return prev +endfunction + +function! s:bang(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\\" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + call s:load_plugin(spec) + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:git_revision(a:spec.dir) + if !empty(output) && !s:hash_match(sha, s:lines(output)[0]) + let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : '' + let output = s:system( + \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + " Set remote name, overriding a possible user git config's clone.defaultRemoteName + let s:clone_opt = ['--origin', 'origin'] + if get(g:, 'plug_shallow', 1) + call extend(s:clone_opt, ['--depth', '1']) + if s:git_version_requirement(1, 7, 10) + call add(s:clone_opt, '--no-single-branch') + endif + endif + + if has('win32unix') || has('wsl') + call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) + else + let branch = s:git_origin_branch(spec) + call s:log4(name, 'Merging origin/'.s:esc(branch)) + let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:rm_rf(g:plugs[name].dir) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return (a:event == 'stdout' || a:event == 'stderr') ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + + if s:nvim + if has_key(a:opts, 'dir') + let job.cwd = a:opts.dir + endif + let argv = a:cmd + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_stderr': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = s:plug_call('jobstart', argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) + if has_key(a:opts, 'dir') + let cmd = s:with_cd(cmd, a:opts.dir, 0) + endif + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'err_mode': 'raw', + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + let max = line('$') + for i in range(4, max > 4 ? max : 4) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, max > 5 ? max : 5) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch'] + if has_tag && !empty(globpath(spec.dir, '.git/shallow')) + call extend(cmd, ['--depth', '99999999']) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, cmd, { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + let cmd = ['git', 'clone'] + if !has_tag + call extend(cmd, s:clone_opt) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt').join(' ') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg, script) + let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') + return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') +endfunction + +function! s:shellesc_ps1(arg) + return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" +endfunction + +function! s:shellesc_sh(arg) + return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" +endfunction + +" Escape the shell argument based on the shell. +" Vim and Neovim's shellescape() are insufficient. +" 1. shellslash determines whether to use single/double quotes. +" Double-quote escaping is fragile for cmd.exe. +" 2. It does not work for powershell. +" 3. It does not work for *sh shells if the command is executed +" via cmd.exe (ie. cmd.exe /c sh -c command command_args) +" 4. It does not support batchfile syntax. +" +" Accepts an optional dictionary with the following keys: +" - shell: same as Vim/Neovim 'shell' option. +" If unset, fallback to 'cmd.exe' on Windows or 'sh'. +" - script: If truthy and shell is cmd.exe, escape for batchfile syntax. +function! plug#shellescape(arg, ...) + if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + endif + let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} + let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') + let script = get(opts, 'script', 1) + if shell =~# 'cmd\(\.exe\)\?$' + return s:shellesc_cmd(a:arg, script) + elseif s:is_powershell(shell) + return s:shellesc_ps1(a:arg) + endif + return s:shellesc_sh(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir, ...) + let script = a:0 > 0 ? a:1 : 1 + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) +endfunction + +function! s:system(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + if type(a:cmd) == s:TYPE.list + " Neovim's system() supports list argument to bypass the shell + " but it cannot set the working directory for the command. + " Assume that the command does not rely on the shell. + if has('nvim') && a:0 == 0 + return system(a:cmd) + endif + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) + if s:is_powershell(&shell) + let cmd = '& ' . cmd + endif + else + let cmd = a:cmd + endif + if a:0 > 0 + let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) + endif + if s:is_win && type(a:cmd) != s:TYPE.list + let [batchfile, cmd] = s:batchfile(cmd) + endif + return system(cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)] + let remote = result[-1] + if empty(remote) + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let sha = s:git_revision(a:spec.dir) + if empty(sha) + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let current_branch = result[0] + " Check tag + let origin_branch = s:git_origin_branch(a:spec) + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif origin_branch !=# current_branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ current_branch, origin_branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system([ + \ 'git', 'rev-list', '--count', '--left-right', + \ printf('HEAD...origin/%s', origin_branch) + \ ], a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ origin_branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + return s:system(s:is_win + \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) + \ : ['rm', '-rf', a:dir]) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap d :set opfunc=delete_opg@ + nmap dd d_ + xnoremap d :call delete_op(visualmode(), 1) + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + let err_count = 0 + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + let err = s:rm_rf(line[2:]) + setlocal modifiable + if empty(err) + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + else + delete _ + call append(l1 - 1, s:format_message('x', line[1:], err)) + let l2 += len(s:lines(err)) + let err_count += 1 + endif + let msg = printf('Removed %d directories.', s:clean_count) + if err_count > 0 + let msg .= printf(' Failed to remove %d directories.', err_count) + endif + call setline(4, msg) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = s:plug_tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap L :call status_load(line('.')) + xnoremap L :call status_load(line('.')) + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$') + if empty(name) + return + endif + let title = 'HEAD@{1}..' + let command = 'git diff --no-color HEAD@{1}' + else + let title = sha + let command = 'git show --no-color --pretty=medium '.sha + let name = s:find_name(line('.')) + endif + + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' title + else + execute 'pedit' title + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap q :q + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let branch = s:git_origin_branch(v) + if len(branch) + let range = origin ? '..origin/'.branch : 'HEAD@{1}..' + let cmd = ['git', 'log', '--graph', '--color=never'] + if s:git_version_requirement(2, 10, 0) + call add(cmd, '--no-show-signature') + endif + call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) + if has_key(v, 'rtp') + call extend(cmd, ['--', v.rtp]) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif + endif + if cnts[0] + nnoremap X :call revert() + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = s:plug_expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@= 1.5. Some older versions might work but it is recommeded to use at least version 1.5. + +## Platform-specific Plugins + +* [vim-vroom](https://github.com/skalnik/vim-vroom) runner for rspec, cucumber and test/unit; vimux support via `g:vroom_use_vimux` +* [vimux-ruby-test](https://github.com/pgr0ss/vimux-ruby-test) a set of commands to easily run ruby tests +* [vimux-cucumber](https://github.com/cloud8421/vimux-cucumber) run Cucumber Features through Vimux +* [vim-turbux](https://github.com/jgdavey/vim-turbux) Turbo Ruby testing with tmux +* [vimux-pyutils](https://github.com/julienr/vimux-pyutils) A set of functions for vimux that allow to run code blocks in ipython +* [vimux-nose-test](https://github.com/pitluga/vimux-nose-test) Run nose tests in vimux +* [vimux-golang](https://github.com/benmills/vimux-golang) Run go tests in vimux +* [vimux-zeus](https://github.com/jingweno/vimux-zeus) Run zeus commands in vimux +* [vimix](https://github.com/spiegela/vimix) Run Elixir mix commands in vimux + +## Usage + +The full documentation is available [online](https://raw.github.com/benmills/vimux/master/doc/vimux.txt) and accessible inside vim `:help vimux` diff --git a/dot_vim/bundle/vimux.git/doc/vimux.txt b/dot_vim/bundle/vimux.git/doc/vimux.txt new file mode 100644 index 0000000..6b2e1f1 --- /dev/null +++ b/dot_vim/bundle/vimux.git/doc/vimux.txt @@ -0,0 +1,355 @@ +*vimux.txt* easily interact with tmux + + Vimux + effortless vim and tmux interaction + +============================================================================== +CONTENTS *vimux-contents* + + 1. About............................ |VimuxAbout| + 2. Usage ........................... |VimuxUsage| + 2.1 .............................. |VimuxPromptCommand| + 2.2 .............................. |VimuxRunLastCommand| + 2.3 .............................. |VimuxInspectRunner| + 2.4 .............................. |VimuxCloseRunner| + 2.5 .............................. |VimuxInterruptRunner| + 2.6 .............................. |VimuxClearRunnerHistory| + 2.7 .............................. |VimuxZoomRunner| + 2.8 .............................. |VimuxRunCommandInDir| + 3. Misc ............................ |VimuxMisc| + 3.1 Example Keybinding............ |VimuxExampleKeybinding| + 3.2 Tslime Replacement............ |VimuxTslimeReplacement| + 4. Configuration ................... |VimuxConfiguration| + + +============================================================================== +ABOUT (1) *VimuxAbout* + +Vimux -- Easily interact with tmux from vim. + +What inspired me to write vimux was tslime.vim [1], a plugin that lets you +send input to tmux. While tslime.vim works well, I felt it wasn't optimized +for my primary use case which was having a smaller tmux pane that I would use +to run tests or play with a REPL. + +My goal with vimux is to make interacting with tmux from vim effortless. By +default when you call `VimuxRunCommand` vimux will create a 20% tall +horizontal pane under your current tmux pane and execute a command in it +without losing focus of vim. Once that pane exists whenever you call +`VimuxRunCommand` again the command will be executed in that pane. As I was +using vimux myself I wanted to rerun commands over and over. An example of +this was running the current file through rspec. Rather than typing that over +and over I wrote `VimuxRunLastCommand` that will execute the last command +you called with `VimuxRunCommand`. + +Other auxiliary functions and the ones I talked about above can be found +bellow with a full description and example key binds for your vimrc. + +[1] https://github.com/kikijump/tslime.vim + + +============================================================================== +USAGE (2) *VimuxUsage* + +The function VimuxRunCommand(command) is the core of Vimux. It will +create a split pane in the current window and run the passed command in it. +> + :call VimuxRunCommand("ls") +< +This will run the command in a split pane without losing focus of vim. If the +command takes a long time to return you can continue to use vim while the +process finishes and will see the output in the pane when it's finished. + +Furthermore there are several handy commands all starting with 'Vimux': + - |VimuxRunCommand| + - |VimuxSendText| + - |VimuxSendKeys| + - |VimuxOpenPane| + - |VimuxRunLastCommand| + - |VimuxCloseRunner| + - |VimuxInspectRunner| + - |VimuxInterruptRunner| + - |VimuxPromptCommand| + - |VimuxClearRunnerHistory| + - |VimuxZoomRunner| + - |VimuxRunCommandInDir| + +------------------------------------------------------------------------------ + *VimuxRunCommand* +VimuxRunCommand~ + +Run a system command in a small horizontal split bellow +the current pane vim is in. You can optionally pass a second argument to stop +vimux from automatically sending a return after the command. +> + " Run the current file with rspec + map rb :call VimuxRunCommand("clear; rspec " . bufname("%")) + " Run command without sending a return + map rq :call VimuxRunCommand("clear; rspec " . bufname("%"), 0) +< + +------------------------------------------------------------------------------ + *VimuxSendText* +VimuxSendText~ + +Send raw text to the runer pane. This command will not open a new pane if one +does not already exist. You will need to use VimuxOpenPane to do this. This +command can be used to interact with REPLs or other interactive terminal +programs that are not shells. + + +------------------------------------------------------------------------------ + *VimuxSendKeys* +VimuxSendKeys~ + +Send keys to the runner pane. This command will not open a new pane if one +does not already exist. You will need to use VimuxOpenPane to do this. You can +use this command to send keys such as "Enter" or "C-c" to the runner pane. + +------------------------------------------------------------------------------ + *VimuxOpenPane* +VimuxOpenPane~ + +This will either open a new pane or use the nearest pane and set it as the +vimux runner pane for the other vimux commands. You can control if this command +uses the nearest pane or always creates a new one with g:VimuxUseNearest + +------------------------------------------------------------------------------ + *VimuxPromptCommand* +VimuxPromptCommand~ + +Prompt for a command and run it in a small horizontal split bellow the current +pane. A parameter can be supplied to predefine a command or a part of the +command which can be edited in the prompt. +> + " Prompt for a command to run map + map vp :VimuxPromptCommand + map vm :VimuxPromptCommand("make ") +< + +------------------------------------------------------------------------------ + *VimuxRunLastCommand* +VimuxRunLastCommand~ + +Run the last command executed by `VimuxRunCommand` +> + " Run last command executed by VimuxRunCommand + map vl :VimuxRunLastCommand +< + +------------------------------------------------------------------------------ + *VimuxInspectRunner* +VimuxInspectRunner~ + +Move into the tmux runner pane created by `VimuxRunCommand` and enter copy +pmode (scroll mode). +> + " Inspect runner pane map + map vi :VimuxInspectRunner +< + +------------------------------------------------------------------------------ + *VimuxCloseRunner* +VimuxCloseRunner~ + +Close the tmux runner created by `VimuxRunCommand` +> + " Close vim tmux runner opened by VimuxRunCommand + map vq :VimuxCloseRunner +< + +------------------------------------------------------------------------------ + *VimuxInterruptRunner* +VimuxInterruptRunner~ + +Interrupt any command that is running inside the +runner pane. +> + " Interrupt any command running in the runner pane map + map vs :VimuxInterruptRunner +< + + + +------------------------------------------------------------------------------ + *VimuxClearRunnerHistory* +VimuxClearRunnerHistory~ + +Clear the tmux history of the runner pane for when +you enter tmux scroll mode inside the runner pane. +> + " Clear the tmux history of the runner pane + map vc :VimuxClearRunnerHistory +< + +------------------------------------------------------------------------------ + *VimuxZoomRunner* +VimuxZoomRunner~ + +Zoom the runner pane. Once its zoomed, you will need +to use tmux " z" to restore the runner pane. +Zoom requires tmux version >= 1.8 +> + + " Zoom the tmux runner page + map vz :VimuxZoomRunner +< + +------------------------------------------------------------------------------ + *VimuxRunCommandInDir* +VimuxRunCommandInDir~ + +Runs the specified command inside the directory of +the currently opened file. Takes two arguments. command and inFile + +command: The command to run +inFile: If 1 the filename will be appended to the command +> + + " Compile currently opened latex file to pdf + autocmd Filetype tex nnoremap rr :update:call VimuxRunCommandInDir('latexmk -pdf', 1) + " Push the repository of the currently opened file + nnoremap gp :call VimuxRunCommandInDir("git push", 0) +< + +============================================================================== +MISC (3) *VimuxMisc* + +------------------------------------------------------------------------------ + *VimuxExampleKeybinding* +Full Keybind Example~ + +> + " Run the current file with rspec + map rb :call VimuxRunCommand("clear; rspec " . bufname("%")) + + " Prompt for a command to run + map vp :VimuxPromptCommand + + " Run last command executed by VimuxRunCommand + map vl :VimuxRunLastCommand + + " Inspect runner pane + map vi :VimuxInspectRunner + + " Close vim tmux runner opened by VimuxRunCommand + map vq :VimuxCloseRunner + + " Interrupt any command running in the runner pane + map vx :VimuxInterruptRunner + + " Zoom the runner pane (use z to restore runner pane) + map vz :call VimuxZoomRunner() +> + +------------------------------------------------------------------------------ + *VimuxTslimeReplacement* +Vimux as tslime replacement~ + +Here is how to use vimux to send code to a REPL. This is similar to tslime. +First, add some helpful mappings. + +> + function! VimuxSlime() + call VimuxSendText(@v) + call VimuxSendKeys("Enter") + endfunction + + " If text is selected, save it in the v buffer and send that buffer it to tmux + vmap vs "vy :call VimuxSlime() + + " Select current paragraph and send it to tmux + nmap vs vipvs +< + +Now, open a clojure file. Let's say your leader is backslash (\). Type \vp, +and then type lein repl at the prompt. This opens a tmux split running a REPL. +Then, select text or put the cursor on a function and type \vs. This will send +it to the REPL and evaluate it. The reason we pass `0` to `VimuxRunCommand` +is to stop the normal return that is sent to the runner pane and use our own +new line so the clojure REPL will evaluate the selected text without adding an +extra return. Thanks to @trptcolin for discovering this issue. + + +============================================================================== +CONFIGURATION (4) *VimuxConfiguration* + +You can configure Vimux like this: + +------------------------------------------------------------------------------ + *VimuxConfiguration_height* +2.1 g:VimuxHeight~ + +The percent of the screen the split pane Vimux will spawn should take up. + + let g:VimuxHeight = "40" + +Default: "20" + +------------------------------------------------------------------------------ + *VimuxConfiguration_orientation* +2.2 g:VimuxOrientation~ + +The default orientation of the split tmux pane. This tells tmux to make the +pane either vertically or horizontally, which is backward from how Vim handles +creating splits. + + let g:VimuxOrientation = "h" + +Options: + "v": vertical + "h": horizontal + +Default: "v" + +------------------------------------------------------------------------------ + *VimuxConfiguration_use_nearest* +2.3 g:VimuxUseNearest + +Use exising pane or window (not used by vim) if found instead of running +split-window. + + let VimuxUseNearest = 1 + +Default: 1 + +------------------------------------------------------------------------------ + *VimuxConfiguration_reset_sequence* +2.4 g:VimuxResetSequence~ + +The keys sent to the runner pane before running a command. By default it sends +`q` to make sure the pane is not in scroll-mode and `C-u` to clear the line. + + let VimuxResetSequence = "" + +Default: "q C-u" + +------------------------------------------------------------------------------ + *VimuxPromptString* +2.5 g:VimuxPromptString~ + +The string presented in the vim command line when Vimux is invoked. Be sure +to put a space at the end of the string to allow for distinction between +the prompt and your input. + + let g:VimuxPromptString = "" + +Default: "Command? " + +------------------------------------------------------------------------------ + *VimuxRunnerType* +2.6 g:VimuxRunnerType~ + +The type of view object Vimux should use for the runner. For reference, a +tmux session is a group of windows, and a window is a layout of panes. + + let g:VimuxRunnerType = "window" + +Options: + "pane": for panes + "window": for windows + +Default: "pane" + +============================================================================== +vim:tw=78:ts=2:sw=2:expandtab:ft=help:norl: diff --git a/dot_vim/bundle/vimux.git/dot_gitignore b/dot_vim/bundle/vimux.git/dot_gitignore new file mode 100644 index 0000000..926ccaa --- /dev/null +++ b/dot_vim/bundle/vimux.git/dot_gitignore @@ -0,0 +1 @@ +doc/tags diff --git a/dot_vim/bundle/vimux.git/plugin/vimux.vim b/dot_vim/bundle/vimux.git/plugin/vimux.vim new file mode 100644 index 0000000..12ae004 --- /dev/null +++ b/dot_vim/bundle/vimux.git/plugin/vimux.vim @@ -0,0 +1,198 @@ +if exists("g:loaded_vimux") || &cp + finish +endif +let g:loaded_vimux = 1 + +command -nargs=* VimuxRunCommand :call VimuxRunCommand() +command VimuxRunLastCommand :call VimuxRunLastCommand() +command VimuxCloseRunner :call VimuxCloseRunner() +command VimuxZoomRunner :call VimuxZoomRunner() +command VimuxInspectRunner :call VimuxInspectRunner() +command VimuxScrollUpInspect :call VimuxScrollUpInspect() +command VimuxScrollDownInspect :call VimuxScrollDownInspect() +command VimuxInterruptRunner :call VimuxInterruptRunner() +command -nargs=? VimuxPromptCommand :call VimuxPromptCommand() +command VimuxClearRunnerHistory :call VimuxClearRunnerHistory() +command VimuxTogglePane :call VimuxTogglePane() + +function! VimuxRunCommandInDir(command, useFile) + let l:file = "" + if a:useFile ==# 1 + let l:file = shellescape(expand('%:t'), 1) + endif + call VimuxRunCommand("cd ".shellescape(expand('%:p:h'), 1)." && ".a:command." ".l:file." && cd - > /dev/null") +endfunction + +function! VimuxRunLastCommand() + if exists("g:VimuxRunnerIndex") + call VimuxRunCommand(g:VimuxLastCommand) + else + echo "No last vimux command." + endif +endfunction + +function! VimuxRunCommand(command, ...) + if !exists("g:VimuxRunnerIndex") || _VimuxHasRunner(g:VimuxRunnerIndex) == -1 + call VimuxOpenRunner() + endif + + let l:autoreturn = 1 + if exists("a:1") + let l:autoreturn = a:1 + endif + + let resetSequence = _VimuxOption("g:VimuxResetSequence", "q C-u") + let g:VimuxLastCommand = a:command + + call VimuxSendKeys(resetSequence) + call VimuxSendText(a:command) + + if l:autoreturn == 1 + call VimuxSendKeys("Enter") + endif +endfunction + +function! VimuxSendText(text) + call VimuxSendKeys('"'.escape(a:text, '"$').'"') +endfunction + +function! VimuxSendKeys(keys) + if exists("g:VimuxRunnerIndex") + call system("tmux send-keys -t ".g:VimuxRunnerIndex." ".a:keys) + else + echo "No vimux runner pane/window. Create one with VimuxOpenRunner" + endif +endfunction + +function! VimuxOpenRunner() + let nearestIndex = _VimuxNearestIndex() + + if _VimuxOption("g:VimuxUseNearest", 1) == 1 && nearestIndex != -1 + let g:VimuxRunnerIndex = nearestIndex + else + if _VimuxRunnerType() == "pane" + let height = _VimuxOption("g:VimuxHeight", 20) + let orientation = _VimuxOption("g:VimuxOrientation", "v") + call system("tmux split-window -p ".height." -".orientation) + elseif _VimuxRunnerType() == "window" + call system("tmux new-window") + endif + + let g:VimuxRunnerIndex = _VimuxTmuxIndex() + call system("tmux last-"._VimuxRunnerType()) + endif +endfunction + +function! VimuxCloseRunner() + if exists("g:VimuxRunnerIndex") + call system("tmux kill-"._VimuxRunnerType()." -t ".g:VimuxRunnerIndex) + unlet g:VimuxRunnerIndex + endif +endfunction + +function! VimuxTogglePane() + if exists("g:VimuxRunnerIndex") + if _VimuxRunnerType() == "window" + call system("tmux join-pane -d -s ".g:VimuxRunnerIndex." -p "._VimuxOption("g:VimuxHeight", 20)) + let g:VimuxRunnerType = "pane" + elseif _VimuxRunnerType() == "pane" + let g:VimuxRunnerIndex=substitute(system("tmux break-pane -d -t ".g:VimuxRunnerIndex." -P -F '#{window_index}'"), "\n", "", "") + let g:VimuxRunnerType = "window" + endif + endif +endfunction + +function! VimuxZoomRunner() + if exists("g:VimuxRunnerIndex") + if _VimuxRunnerType() == "pane" + call system("tmux resize-pane -Z -t ".g:VimuxRunnerIndex) + elseif _VimuxRunnerType() == "window" + call system("tmux select-window -t ".g:VimuxRunnerIndex) + endif + endif +endfunction + +function! VimuxInspectRunner() + call system("tmux select-"._VimuxRunnerType()." -t ".g:VimuxRunnerIndex) + call system("tmux copy-mode") +endfunction + +function! VimuxScrollUpInspect() + call VimuxInspectRunner() + call system("tmux last-"._VimuxRunnerType()) + call VimuxSendKeys("C-u") +endfunction + +function! VimuxScrollDownInspect() + call VimuxInspectRunner() + call system("tmux last-"._VimuxRunnerType()) + call VimuxSendKeys("C-d") +endfunction + +function! VimuxInterruptRunner() + call VimuxSendKeys("^c") +endfunction + +function! VimuxClearRunnerHistory() + if exists("g:VimuxRunnerIndex") + call system("tmux clear-history -t ".g:VimuxRunnerIndex) + endif +endfunction + +function! VimuxPromptCommand(...) + let command = a:0 == 1 ? a:1 : "" + let l:command = input(_VimuxOption("g:VimuxPromptString", "Command? "), command) + call VimuxRunCommand(l:command) +endfunction + +function! _VimuxTmuxSession() + return _VimuxTmuxProperty("#S") +endfunction + +function! _VimuxTmuxIndex() + if _VimuxRunnerType() == "pane" + return _VimuxTmuxPaneIndex() + else + return _VimuxTmuxWindowIndex() + end +endfunction + +function! _VimuxTmuxPaneIndex() + return _VimuxTmuxProperty("#I.#P") +endfunction + +function! _VimuxTmuxWindowIndex() + return _VimuxTmuxProperty("#I") +endfunction + +function! _VimuxNearestIndex() + let views = split(system("tmux list-"._VimuxRunnerType()."s"), "\n") + + for view in views + if match(view, "(active)") == -1 + return split(view, ":")[0] + endif + endfor + + return -1 +endfunction + +function! _VimuxRunnerType() + return _VimuxOption("g:VimuxRunnerType", "pane") +endfunction + +function! _VimuxOption(option, default) + if exists(a:option) + return eval(a:option) + else + return a:default + endif +endfunction + +function! _VimuxTmuxProperty(property) + return substitute(system("tmux display -p '".a:property."'"), '\n$', '', '') +endfunction + +function! _VimuxHasRunner(index) + return match(system("tmux list-"._VimuxRunnerType()."s -a"), a:index.":") +endfunction diff --git a/dot_vim/colors/Tomorrow-Night-Blue.vim b/dot_vim/colors/Tomorrow-Night-Blue.vim new file mode 100644 index 0000000..911c99d --- /dev/null +++ b/dot_vim/colors/Tomorrow-Night-Blue.vim @@ -0,0 +1,347 @@ +" Tomorrow Night Blue - Full Colour and 256 Colour +" http://chriskempson.com +" +" Hex colour conversion functions borrowed from the theme "Desert256"" + +" Default GUI Colours +let s:foreground = "ffffff" +let s:background = "002451" +let s:selection = "003f8e" +let s:line = "00346e" +let s:comment = "7285b7" +let s:red = "ff9da4" +let s:orange = "ffc58f" +let s:yellow = "ffeead" +let s:green = "d1f1a9" +let s:aqua = "99ffff" +let s:blue = "bbdaff" +let s:purple = "ebbbff" +let s:window = "4d5057" + +set background=dark +hi clear +syntax reset + +let g:colors_name = "Tomorrow-Night-Blue" + +if has("gui_running") || &t_Co == 88 || &t_Co == 256 + " Returns an approximate grey index for the given grey level + fun grey_number(x) + if &t_Co == 88 + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + else + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual grey level represented by the grey index + fun grey_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endif + endfun + + " Returns the palette index for the given grey index + fun grey_colour(n) + if &t_Co == 88 + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + else + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endif + endfun + + " Returns an approximate colour index for the given colour level + fun rgb_number(x) + if &t_Co == 88 + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + else + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual colour level for the given colour index + fun rgb_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endif + endfun + + " Returns the palette index for the given R/G/B colour indices + fun rgb_colour(x, y, z) + if &t_Co == 88 + return 16 + (a:x * 16) + (a:y * 4) + a:z + else + return 16 + (a:x * 36) + (a:y * 6) + a:z + endif + endfun + + " Returns the palette index to approximate the given R/G/B colour levels + fun colour(r, g, b) + " Get the closest grey + let l:gx = grey_number(a:r) + let l:gy = grey_number(a:g) + let l:gz = grey_number(a:b) + + " Get the closest colour + let l:x = rgb_number(a:r) + let l:y = rgb_number(a:g) + let l:z = rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " There are two possibilities + let l:dgr = grey_level(l:gx) - a:r + let l:dgg = grey_level(l:gy) - a:g + let l:dgb = grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = rgb_level(l:gx) - a:r + let l:dg = rgb_level(l:gy) - a:g + let l:db = rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " Use the grey + return grey_colour(l:gx) + else + " Use the colour + return rgb_colour(l:x, l:y, l:z) + endif + else + " Only one possibility + return rgb_colour(l:x, l:y, l:z) + endif + endfun + + " Returns the palette index to approximate the 'rrggbb' hex string + fun rgb(rgb) + let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 + + return colour(l:r, l:g, l:b) + endfun + + " Sets the highlighting for the given group + fun X(group, fg, bg, attr) + if a:fg != "" + exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . rgb(a:fg) + endif + if a:bg != "" + exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . rgb(a:bg) + endif + if a:attr != "" + exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr + endif + endfun + + " Vim Highlighting + call X("Normal", s:foreground, s:background, "") + call X("LineNr", s:selection, "", "") + call X("NonText", s:selection, "", "") + call X("SpecialKey", s:selection, "", "") + call X("Search", s:background, s:yellow, "") + call X("TabLine", s:foreground, s:background, "reverse") + call X("StatusLine", s:window, s:yellow, "reverse") + call X("StatusLineNC", s:window, s:foreground, "reverse") + call X("VertSplit", s:window, s:window, "none") + call X("Visual", "", s:selection, "") + call X("Directory", s:blue, "", "") + call X("ModeMsg", s:green, "", "") + call X("MoreMsg", s:green, "", "") + call X("Question", s:green, "", "") + call X("WarningMsg", s:red, "", "") + call X("MatchParen", "", s:selection, "") + call X("Folded", s:comment, s:background, "") + call X("FoldColumn", "", s:background, "") + if version >= 700 + call X("CursorLine", "", s:line, "none") + call X("CursorColumn", "", s:line, "none") + call X("PMenu", s:foreground, s:selection, "none") + call X("PMenuSel", s:foreground, s:selection, "reverse") + end + if version >= 703 + call X("ColorColumn", "", s:line, "none") + end + + " Standard Highlighting + call X("Comment", s:comment, "", "") + call X("Todo", s:comment, s:background, "") + call X("Title", s:comment, "", "") + call X("Identifier", s:red, "", "none") + call X("Statement", s:foreground, "", "") + call X("Conditional", s:foreground, "", "") + call X("Repeat", s:foreground, "", "") + call X("Structure", s:purple, "", "") + call X("Function", s:blue, "", "") + call X("Constant", s:orange, "", "") + call X("String", s:green, "", "") + call X("Special", s:foreground, "", "") + call X("PreProc", s:purple, "", "") + call X("Operator", s:aqua, "", "none") + call X("Type", s:blue, "", "none") + call X("Define", s:purple, "", "none") + call X("Include", s:blue, "", "") + "call X("Ignore", "666666", "", "") + + " Vim Highlighting + call X("vimCommand", s:red, "", "none") + + " C Highlighting + call X("cType", s:yellow, "", "") + call X("cStorageClass", s:purple, "", "") + call X("cConditional", s:purple, "", "") + call X("cRepeat", s:purple, "", "") + + " PHP Highlighting + call X("phpVarSelector", s:red, "", "") + call X("phpKeyword", s:purple, "", "") + call X("phpRepeat", s:purple, "", "") + call X("phpConditional", s:purple, "", "") + call X("phpStatement", s:purple, "", "") + call X("phpMemberSelector", s:foreground, "", "") + + " Ruby Highlighting + call X("rubySymbol", s:green, "", "") + call X("rubyConstant", s:yellow, "", "") + call X("rubyAttribute", s:blue, "", "") + call X("rubyInclude", s:blue, "", "") + call X("rubyLocalVariableOrMethod", s:orange, "", "") + call X("rubyCurlyBlock", s:orange, "", "") + call X("rubyStringDelimiter", s:green, "", "") + call X("rubyInterpolationDelimiter", s:orange, "", "") + call X("rubyConditional", s:purple, "", "") + call X("rubyRepeat", s:purple, "", "") + + " Python Highlighting + call X("pythonInclude", s:purple, "", "") + call X("pythonStatement", s:purple, "", "") + call X("pythonConditional", s:purple, "", "") + call X("pythonFunction", s:blue, "", "") + + " JavaScript Highlighting + call X("javaScriptBraces", s:foreground, "", "") + call X("javaScriptFunction", s:purple, "", "") + call X("javaScriptConditional", s:purple, "", "") + call X("javaScriptRepeat", s:purple, "", "") + call X("javaScriptNumber", s:orange, "", "") + call X("javaScriptMember", s:orange, "", "") + + " HTML Highlighting + call X("htmlTag", s:red, "", "") + call X("htmlTagName", s:red, "", "") + call X("htmlArg", s:red, "", "") + call X("htmlScriptTag", s:red, "", "") + + " Diff Highlighting + call X("diffAdded", s:green, "", "") + call X("diffRemoved", s:red, "", "") + + " Delete Functions + delf X + delf rgb + delf colour + delf rgb_colour + delf rgb_level + delf rgb_number + delf grey_colour + delf grey_level + delf grey_number +endif diff --git a/dot_vim/colors/Tomorrow-Night-Bright.vim b/dot_vim/colors/Tomorrow-Night-Bright.vim new file mode 100644 index 0000000..c222f4e --- /dev/null +++ b/dot_vim/colors/Tomorrow-Night-Bright.vim @@ -0,0 +1,347 @@ +" Tomorrow Night Bright - Full Colour and 256 Colour +" http://chriskempson.com +" +" Hex colour conversion functions borrowed from the theme "Desert256"" + +" Default GUI Colours +let s:foreground = "eaeaea" +let s:background = "000000" +let s:selection = "424242" +let s:line = "2a2a2a" +let s:comment = "969896" +let s:red = "d54e53" +let s:orange = "e78c45" +let s:yellow = "e7c547" +let s:green = "b9ca4a" +let s:aqua = "70c0b1" +let s:blue = "7aa6da" +let s:purple = "c397d8" +let s:window = "4d5057" + +set background=dark +hi clear +syntax reset + +let g:colors_name = "Tomorrow-Night-Bright" + +if has("gui_running") || &t_Co == 88 || &t_Co == 256 + " Returns an approximate grey index for the given grey level + fun grey_number(x) + if &t_Co == 88 + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + else + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual grey level represented by the grey index + fun grey_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endif + endfun + + " Returns the palette index for the given grey index + fun grey_colour(n) + if &t_Co == 88 + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + else + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endif + endfun + + " Returns an approximate colour index for the given colour level + fun rgb_number(x) + if &t_Co == 88 + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + else + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual colour level for the given colour index + fun rgb_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endif + endfun + + " Returns the palette index for the given R/G/B colour indices + fun rgb_colour(x, y, z) + if &t_Co == 88 + return 16 + (a:x * 16) + (a:y * 4) + a:z + else + return 16 + (a:x * 36) + (a:y * 6) + a:z + endif + endfun + + " Returns the palette index to approximate the given R/G/B colour levels + fun colour(r, g, b) + " Get the closest grey + let l:gx = grey_number(a:r) + let l:gy = grey_number(a:g) + let l:gz = grey_number(a:b) + + " Get the closest colour + let l:x = rgb_number(a:r) + let l:y = rgb_number(a:g) + let l:z = rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " There are two possibilities + let l:dgr = grey_level(l:gx) - a:r + let l:dgg = grey_level(l:gy) - a:g + let l:dgb = grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = rgb_level(l:gx) - a:r + let l:dg = rgb_level(l:gy) - a:g + let l:db = rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " Use the grey + return grey_colour(l:gx) + else + " Use the colour + return rgb_colour(l:x, l:y, l:z) + endif + else + " Only one possibility + return rgb_colour(l:x, l:y, l:z) + endif + endfun + + " Returns the palette index to approximate the 'rrggbb' hex string + fun rgb(rgb) + let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 + + return colour(l:r, l:g, l:b) + endfun + + " Sets the highlighting for the given group + fun X(group, fg, bg, attr) + if a:fg != "" + exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . rgb(a:fg) + endif + if a:bg != "" + exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . rgb(a:bg) + endif + if a:attr != "" + exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr + endif + endfun + + " Vim Highlighting + call X("Normal", s:foreground, s:background, "") + call X("LineNr", s:selection, "", "") + call X("NonText", s:selection, "", "") + call X("SpecialKey", s:selection, "", "") + call X("Search", s:background, s:yellow, "") + call X("TabLine", s:foreground, s:background, "reverse") + call X("StatusLine", s:window, s:yellow, "reverse") + call X("StatusLineNC", s:window, s:foreground, "reverse") + call X("VertSplit", s:window, s:window, "none") + call X("Visual", "", s:selection, "") + call X("Directory", s:blue, "", "") + call X("ModeMsg", s:green, "", "") + call X("MoreMsg", s:green, "", "") + call X("Question", s:green, "", "") + call X("WarningMsg", s:red, "", "") + call X("MatchParen", "", s:selection, "") + call X("Folded", s:comment, s:background, "") + call X("FoldColumn", "", s:background, "") + if version >= 700 + call X("CursorLine", "", s:line, "none") + call X("CursorColumn", "", s:line, "none") + call X("PMenu", s:foreground, s:selection, "none") + call X("PMenuSel", s:foreground, s:selection, "reverse") + end + if version >= 703 + call X("ColorColumn", "", s:line, "none") + end + + " Standard Highlighting + call X("Comment", s:comment, "", "") + call X("Todo", s:comment, s:background, "") + call X("Title", s:comment, "", "") + call X("Identifier", s:red, "", "none") + call X("Statement", s:foreground, "", "") + call X("Conditional", s:foreground, "", "") + call X("Repeat", s:foreground, "", "") + call X("Structure", s:purple, "", "") + call X("Function", s:blue, "", "") + call X("Constant", s:orange, "", "") + call X("String", s:green, "", "") + call X("Special", s:foreground, "", "") + call X("PreProc", s:purple, "", "") + call X("Operator", s:aqua, "", "none") + call X("Type", s:blue, "", "none") + call X("Define", s:purple, "", "none") + call X("Include", s:blue, "", "") + "call X("Ignore", "666666", "", "") + + " Vim Highlighting + call X("vimCommand", s:red, "", "none") + + " C Highlighting + call X("cType", s:yellow, "", "") + call X("cStorageClass", s:purple, "", "") + call X("cConditional", s:purple, "", "") + call X("cRepeat", s:purple, "", "") + + " PHP Highlighting + call X("phpVarSelector", s:red, "", "") + call X("phpKeyword", s:purple, "", "") + call X("phpRepeat", s:purple, "", "") + call X("phpConditional", s:purple, "", "") + call X("phpStatement", s:purple, "", "") + call X("phpMemberSelector", s:foreground, "", "") + + " Ruby Highlighting + call X("rubySymbol", s:green, "", "") + call X("rubyConstant", s:yellow, "", "") + call X("rubyAttribute", s:blue, "", "") + call X("rubyInclude", s:blue, "", "") + call X("rubyLocalVariableOrMethod", s:orange, "", "") + call X("rubyCurlyBlock", s:orange, "", "") + call X("rubyStringDelimiter", s:green, "", "") + call X("rubyInterpolationDelimiter", s:orange, "", "") + call X("rubyConditional", s:purple, "", "") + call X("rubyRepeat", s:purple, "", "") + + " Python Highlighting + call X("pythonInclude", s:purple, "", "") + call X("pythonStatement", s:purple, "", "") + call X("pythonConditional", s:purple, "", "") + call X("pythonFunction", s:blue, "", "") + + " JavaScript Highlighting + call X("javaScriptBraces", s:foreground, "", "") + call X("javaScriptFunction", s:purple, "", "") + call X("javaScriptConditional", s:purple, "", "") + call X("javaScriptRepeat", s:purple, "", "") + call X("javaScriptNumber", s:orange, "", "") + call X("javaScriptMember", s:orange, "", "") + + " HTML Highlighting + call X("htmlTag", s:red, "", "") + call X("htmlTagName", s:red, "", "") + call X("htmlArg", s:red, "", "") + call X("htmlScriptTag", s:red, "", "") + + " Diff Highlighting + call X("diffAdded", s:green, "", "") + call X("diffRemoved", s:red, "", "") + + " Delete Functions + delf X + delf rgb + delf colour + delf rgb_colour + delf rgb_level + delf rgb_number + delf grey_colour + delf grey_level + delf grey_number +endif diff --git a/dot_vim/colors/Tomorrow-Night-Eighties.vim b/dot_vim/colors/Tomorrow-Night-Eighties.vim new file mode 100644 index 0000000..7426924 --- /dev/null +++ b/dot_vim/colors/Tomorrow-Night-Eighties.vim @@ -0,0 +1,347 @@ +" Tomorrow Night Eighties - Full Colour and 256 Colour +" http://chriskempson.com +" +" Hex colour conversion functions borrowed from the theme "Desert256"" + +" Default GUI Colours +let s:foreground = "cccccc" +let s:background = "2d2d2d" +let s:selection = "515151" +let s:line = "393939" +let s:comment = "999999" +let s:red = "f2777a" +let s:orange = "f99157" +let s:yellow = "ffcc66" +let s:green = "99cc99" +let s:aqua = "009999" +let s:blue = "99cccc" +let s:purple = "cc99cc" +let s:window = "4d5057" + +set background=dark +hi clear +syntax reset + +let g:colors_name = "Tomorrow-Night-Eighties" + +if has("gui_running") || &t_Co == 88 || &t_Co == 256 + " Returns an approximate grey index for the given grey level + fun grey_number(x) + if &t_Co == 88 + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + else + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual grey level represented by the grey index + fun grey_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endif + endfun + + " Returns the palette index for the given grey index + fun grey_colour(n) + if &t_Co == 88 + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + else + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endif + endfun + + " Returns an approximate colour index for the given colour level + fun rgb_number(x) + if &t_Co == 88 + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + else + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual colour level for the given colour index + fun rgb_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endif + endfun + + " Returns the palette index for the given R/G/B colour indices + fun rgb_colour(x, y, z) + if &t_Co == 88 + return 16 + (a:x * 16) + (a:y * 4) + a:z + else + return 16 + (a:x * 36) + (a:y * 6) + a:z + endif + endfun + + " Returns the palette index to approximate the given R/G/B colour levels + fun colour(r, g, b) + " Get the closest grey + let l:gx = grey_number(a:r) + let l:gy = grey_number(a:g) + let l:gz = grey_number(a:b) + + " Get the closest colour + let l:x = rgb_number(a:r) + let l:y = rgb_number(a:g) + let l:z = rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " There are two possibilities + let l:dgr = grey_level(l:gx) - a:r + let l:dgg = grey_level(l:gy) - a:g + let l:dgb = grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = rgb_level(l:gx) - a:r + let l:dg = rgb_level(l:gy) - a:g + let l:db = rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " Use the grey + return grey_colour(l:gx) + else + " Use the colour + return rgb_colour(l:x, l:y, l:z) + endif + else + " Only one possibility + return rgb_colour(l:x, l:y, l:z) + endif + endfun + + " Returns the palette index to approximate the 'rrggbb' hex string + fun rgb(rgb) + let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 + + return colour(l:r, l:g, l:b) + endfun + + " Sets the highlighting for the given group + fun X(group, fg, bg, attr) + if a:fg != "" + exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . rgb(a:fg) + endif + if a:bg != "" + exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . rgb(a:bg) + endif + if a:attr != "" + exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr + endif + endfun + + " Vim Highlighting + call X("Normal", s:foreground, s:background, "") + call X("LineNr", s:selection, "", "") + call X("NonText", s:selection, "", "") + call X("SpecialKey", s:selection, "", "") + call X("Search", s:background, s:yellow, "") + call X("TabLine", s:foreground, s:background, "reverse") + call X("StatusLine", s:window, s:yellow, "reverse") + call X("StatusLineNC", s:window, s:foreground, "reverse") + call X("VertSplit", s:window, s:window, "none") + call X("Visual", "", s:selection, "") + call X("Directory", s:blue, "", "") + call X("ModeMsg", s:green, "", "") + call X("MoreMsg", s:green, "", "") + call X("Question", s:green, "", "") + call X("WarningMsg", s:red, "", "") + call X("MatchParen", "", s:selection, "") + call X("Folded", s:comment, s:background, "") + call X("FoldColumn", "", s:background, "") + if version >= 700 + call X("CursorLine", "", s:line, "none") + call X("CursorColumn", "", s:line, "none") + call X("PMenu", s:foreground, s:selection, "none") + call X("PMenuSel", s:foreground, s:selection, "reverse") + end + if version >= 703 + call X("ColorColumn", "", s:line, "none") + end + + " Standard Highlighting + call X("Comment", s:comment, "", "") + call X("Todo", s:comment, s:background, "") + call X("Title", s:comment, "", "") + call X("Identifier", s:red, "", "none") + call X("Statement", s:foreground, "", "") + call X("Conditional", s:foreground, "", "") + call X("Repeat", s:foreground, "", "") + call X("Structure", s:purple, "", "") + call X("Function", s:blue, "", "") + call X("Constant", s:orange, "", "") + call X("String", s:green, "", "") + call X("Special", s:foreground, "", "") + call X("PreProc", s:purple, "", "") + call X("Operator", s:aqua, "", "none") + call X("Type", s:blue, "", "none") + call X("Define", s:purple, "", "none") + call X("Include", s:blue, "", "") + "call X("Ignore", "666666", "", "") + + " Vim Highlighting + call X("vimCommand", s:red, "", "none") + + " C Highlighting + call X("cType", s:yellow, "", "") + call X("cStorageClass", s:purple, "", "") + call X("cConditional", s:purple, "", "") + call X("cRepeat", s:purple, "", "") + + " PHP Highlighting + call X("phpVarSelector", s:red, "", "") + call X("phpKeyword", s:purple, "", "") + call X("phpRepeat", s:purple, "", "") + call X("phpConditional", s:purple, "", "") + call X("phpStatement", s:purple, "", "") + call X("phpMemberSelector", s:foreground, "", "") + + " Ruby Highlighting + call X("rubySymbol", s:green, "", "") + call X("rubyConstant", s:yellow, "", "") + call X("rubyAttribute", s:blue, "", "") + call X("rubyInclude", s:blue, "", "") + call X("rubyLocalVariableOrMethod", s:orange, "", "") + call X("rubyCurlyBlock", s:orange, "", "") + call X("rubyStringDelimiter", s:green, "", "") + call X("rubyInterpolationDelimiter", s:orange, "", "") + call X("rubyConditional", s:purple, "", "") + call X("rubyRepeat", s:purple, "", "") + + " Python Highlighting + call X("pythonInclude", s:purple, "", "") + call X("pythonStatement", s:purple, "", "") + call X("pythonConditional", s:purple, "", "") + call X("pythonFunction", s:blue, "", "") + + " JavaScript Highlighting + call X("javaScriptBraces", s:foreground, "", "") + call X("javaScriptFunction", s:purple, "", "") + call X("javaScriptConditional", s:purple, "", "") + call X("javaScriptRepeat", s:purple, "", "") + call X("javaScriptNumber", s:orange, "", "") + call X("javaScriptMember", s:orange, "", "") + + " HTML Highlighting + call X("htmlTag", s:red, "", "") + call X("htmlTagName", s:red, "", "") + call X("htmlArg", s:red, "", "") + call X("htmlScriptTag", s:red, "", "") + + " Diff Highlighting + call X("diffAdded", s:green, "", "") + call X("diffRemoved", s:red, "", "") + + " Delete Functions + delf X + delf rgb + delf colour + delf rgb_colour + delf rgb_level + delf rgb_number + delf grey_colour + delf grey_level + delf grey_number +endif diff --git a/dot_vim/colors/Tomorrow-Night.vim b/dot_vim/colors/Tomorrow-Night.vim new file mode 100644 index 0000000..208b6d4 --- /dev/null +++ b/dot_vim/colors/Tomorrow-Night.vim @@ -0,0 +1,362 @@ +" Tomorrow Night - Full Colour and 256 Colour +" http://chriskempson.com +" +" Hex colour conversion functions borrowed from the theme "Desert256"" + +" Default GUI Colours +let s:foreground = "c5c8c6" +let s:background = "1d1f21" +let s:selection = "373b41" +let s:line = "282a2e" +let s:comment = "969896" +let s:red = "cc6666" +let s:orange = "de935f" +let s:yellow = "f0c674" +let s:green = "b5bd68" +let s:aqua = "8abeb7" +let s:blue = "81a2be" +let s:purple = "b294bb" +let s:window = "4d5057" + +" Console 256 Colours +if !has("gui_running") + let s:background = "303030" + let s:window = "5e5e5e" + let s:line = "3a3a3a" + let s:selection = "585858" +end + +set background=dark +hi clear +syntax reset + +let g:colors_name = "Tomorrow-Night" + +if has("gui_running") || &t_Co == 88 || &t_Co == 256 + " Returns an approximate grey index for the given grey level + fun grey_number(x) + if &t_Co == 88 + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + else + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual grey level represented by the grey index + fun grey_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endif + endfun + + " Returns the palette index for the given grey index + fun grey_colour(n) + if &t_Co == 88 + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + else + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endif + endfun + + " Returns an approximate colour index for the given colour level + fun rgb_number(x) + if &t_Co == 88 + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + else + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual colour level for the given colour index + fun rgb_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endif + endfun + + " Returns the palette index for the given R/G/B colour indices + fun rgb_colour(x, y, z) + if &t_Co == 88 + return 16 + (a:x * 16) + (a:y * 4) + a:z + else + return 16 + (a:x * 36) + (a:y * 6) + a:z + endif + endfun + + " Returns the palette index to approximate the given R/G/B colour levels + fun colour(r, g, b) + " Get the closest grey + let l:gx = grey_number(a:r) + let l:gy = grey_number(a:g) + let l:gz = grey_number(a:b) + + " Get the closest colour + let l:x = rgb_number(a:r) + let l:y = rgb_number(a:g) + let l:z = rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " There are two possibilities + let l:dgr = grey_level(l:gx) - a:r + let l:dgg = grey_level(l:gy) - a:g + let l:dgb = grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = rgb_level(l:gx) - a:r + let l:dg = rgb_level(l:gy) - a:g + let l:db = rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " Use the grey + return grey_colour(l:gx) + else + " Use the colour + return rgb_colour(l:x, l:y, l:z) + endif + else + " Only one possibility + return rgb_colour(l:x, l:y, l:z) + endif + endfun + + " Returns the palette index to approximate the 'rrggbb' hex string + fun rgb(rgb) + let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 + + return colour(l:r, l:g, l:b) + endfun + + " Sets the highlighting for the given group + fun X(group, fg, bg, attr) + if a:fg != "" + exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . rgb(a:fg) + endif + if a:bg != "" + exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . rgb(a:bg) + endif + if a:attr != "" + exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr + endif + endfun + + " Vim Highlighting + call X("Normal", s:foreground, s:background, "") + call X("LineNr", s:selection, "", "") + call X("NonText", s:selection, "", "") + call X("SpecialKey", s:selection, "", "") + call X("Search", s:background, s:yellow, "") + call X("TabLine", s:foreground, s:background, "reverse") + call X("StatusLine", s:window, s:yellow, "reverse") + call X("StatusLineNC", s:window, s:foreground, "reverse") + call X("VertSplit", s:window, s:window, "none") + call X("Visual", "", s:selection, "") + call X("Directory", s:blue, "", "") + call X("ModeMsg", s:green, "", "") + call X("MoreMsg", s:green, "", "") + call X("Question", s:green, "", "") + call X("WarningMsg", s:red, "", "") + call X("MatchParen", "", s:selection, "") + call X("Folded", s:comment, s:background, "") + call X("FoldColumn", "", s:background, "") + if version >= 700 + call X("CursorLine", "", s:line, "none") + call X("CursorColumn", "", s:line, "none") + call X("PMenu", s:foreground, s:selection, "none") + call X("PMenuSel", s:foreground, s:selection, "reverse") + call X("SignColumn", "", s:background, "none") + end + if version >= 703 + call X("ColorColumn", "", s:line, "none") + end + + " Standard Highlighting + call X("Comment", s:comment, "", "") + call X("Todo", s:comment, s:background, "") + call X("Title", s:comment, "", "") + call X("Identifier", s:red, "", "none") + call X("Statement", s:foreground, "", "") + call X("Conditional", s:foreground, "", "") + call X("Repeat", s:foreground, "", "") + call X("Structure", s:purple, "", "") + call X("Function", s:blue, "", "") + call X("Constant", s:orange, "", "") + call X("String", s:green, "", "") + call X("Special", s:foreground, "", "") + call X("PreProc", s:purple, "", "") + call X("Operator", s:aqua, "", "none") + call X("Type", s:blue, "", "none") + call X("Define", s:purple, "", "none") + call X("Include", s:blue, "", "") + "call X("Ignore", "666666", "", "") + + " Vim Highlighting + call X("vimCommand", s:red, "", "none") + + " C Highlighting + call X("cType", s:yellow, "", "") + call X("cStorageClass", s:purple, "", "") + call X("cConditional", s:purple, "", "") + call X("cRepeat", s:purple, "", "") + + " PHP Highlighting + call X("phpVarSelector", s:red, "", "") + call X("phpKeyword", s:purple, "", "") + call X("phpRepeat", s:purple, "", "") + call X("phpConditional", s:purple, "", "") + call X("phpStatement", s:purple, "", "") + call X("phpMemberSelector", s:foreground, "", "") + + " Ruby Highlighting + call X("rubySymbol", s:green, "", "") + call X("rubyConstant", s:yellow, "", "") + call X("rubyAttribute", s:blue, "", "") + call X("rubyInclude", s:blue, "", "") + call X("rubyLocalVariableOrMethod", s:orange, "", "") + call X("rubyCurlyBlock", s:orange, "", "") + call X("rubyStringDelimiter", s:green, "", "") + call X("rubyInterpolationDelimiter", s:orange, "", "") + call X("rubyConditional", s:purple, "", "") + call X("rubyRepeat", s:purple, "", "") + + " Python Highlighting + call X("pythonInclude", s:purple, "", "") + call X("pythonStatement", s:purple, "", "") + call X("pythonConditional", s:purple, "", "") + call X("pythonFunction", s:blue, "", "") + + " JavaScript Highlighting + call X("javaScriptBraces", s:foreground, "", "") + call X("javaScriptFunction", s:purple, "", "") + call X("javaScriptConditional", s:purple, "", "") + call X("javaScriptRepeat", s:purple, "", "") + call X("javaScriptNumber", s:orange, "", "") + call X("javaScriptMember", s:orange, "", "") + + " HTML Highlighting + call X("htmlTag", s:red, "", "") + call X("htmlTagName", s:red, "", "") + call X("htmlArg", s:red, "", "") + call X("htmlScriptTag", s:red, "", "") + + " Diff Highlighting + call X("diffAdded", s:green, "", "") + call X("diffRemoved", s:red, "", "") + + " ShowMarks Highlighting + call X("ShowMarksHLl", s:orange, s:background, "none") + call X("ShowMarksHLo", s:purple, s:background, "none") + call X("ShowMarksHLu", s:yellow, s:background, "none") + call X("ShowMarksHLm", s:aqua, s:background, "none") + + " Delete Functions + delf X + delf rgb + delf colour + delf rgb_colour + delf rgb_level + delf rgb_number + delf grey_colour + delf grey_level + delf grey_number +endif diff --git a/dot_vim/colors/Tomorrow.vim b/dot_vim/colors/Tomorrow.vim new file mode 100644 index 0000000..fb58c5f --- /dev/null +++ b/dot_vim/colors/Tomorrow.vim @@ -0,0 +1,347 @@ +" Tomorrow - Full Colour and 256 Colour +" http://chriskempson.com +" +" Hex colour conversion functions borrowed from the theme "Desert256"" + +" Default GUI Colours +let s:foreground = "4d4d4c" +let s:background = "fafafa" +let s:selection = "d6d6d6" +let s:line = "efefef" +let s:comment = "8e908c" +let s:red = "c82829" +let s:orange = "f5871f" +let s:yellow = "eab700" +let s:green = "718c00" +let s:aqua = "3e999f" +let s:blue = "4271ae" +let s:purple = "8959a8" +let s:window = "efefef" + +set background=light +hi clear +syntax reset + +let g:colors_name = "Tomorrow" + +if has("gui_running") || &t_Co == 88 || &t_Co == 256 + " Returns an approximate grey index for the given grey level + fun grey_number(x) + if &t_Co == 88 + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + else + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual grey level represented by the grey index + fun grey_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endif + endfun + + " Returns the palette index for the given grey index + fun grey_colour(n) + if &t_Co == 88 + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + else + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endif + endfun + + " Returns an approximate colour index for the given colour level + fun rgb_number(x) + if &t_Co == 88 + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + else + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " Returns the actual colour level for the given colour index + fun rgb_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endif + endfun + + " Returns the palette index for the given R/G/B colour indices + fun rgb_colour(x, y, z) + if &t_Co == 88 + return 16 + (a:x * 16) + (a:y * 4) + a:z + else + return 16 + (a:x * 36) + (a:y * 6) + a:z + endif + endfun + + " Returns the palette index to approximate the given R/G/B colour levels + fun colour(r, g, b) + " Get the closest grey + let l:gx = grey_number(a:r) + let l:gy = grey_number(a:g) + let l:gz = grey_number(a:b) + + " Get the closest colour + let l:x = rgb_number(a:r) + let l:y = rgb_number(a:g) + let l:z = rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " There are two possibilities + let l:dgr = grey_level(l:gx) - a:r + let l:dgg = grey_level(l:gy) - a:g + let l:dgb = grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = rgb_level(l:gx) - a:r + let l:dg = rgb_level(l:gy) - a:g + let l:db = rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " Use the grey + return grey_colour(l:gx) + else + " Use the colour + return rgb_colour(l:x, l:y, l:z) + endif + else + " Only one possibility + return rgb_colour(l:x, l:y, l:z) + endif + endfun + + " Returns the palette index to approximate the 'rrggbb' hex string + fun rgb(rgb) + let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 + + return colour(l:r, l:g, l:b) + endfun + + " Sets the highlighting for the given group + fun X(group, fg, bg, attr) + if a:fg != "" + exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . rgb(a:fg) + endif + if a:bg != "" + exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . rgb(a:bg) + endif + if a:attr != "" + exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr + endif + endfun + + " Vim Highlighting + call X("Normal", s:foreground, s:background, "") + highlight LineNr term=bold cterm=NONE ctermfg=DarkGrey ctermbg=NONE gui=NONE guifg=DarkGrey guibg=NONE + call X("NonText", s:selection, "", "") + call X("SpecialKey", s:selection, "", "") + call X("Search", s:foreground, s:yellow, "") + call X("TabLine", s:foreground, s:background, "reverse") + call X("StatusLine", s:window, s:yellow, "reverse") + call X("StatusLineNC", s:window, s:foreground, "reverse") + call X("VertSplit", s:window, s:window, "none") + call X("Visual", "", s:selection, "") + call X("Directory", s:blue, "", "") + call X("ModeMsg", s:green, "", "") + call X("MoreMsg", s:green, "", "") + call X("Question", s:green, "", "") + call X("WarningMsg", s:red, "", "") + call X("MatchParen", "", s:selection, "") + call X("Folded", s:comment, s:background, "") + call X("FoldColumn", "", s:background, "") + if version >= 700 + call X("CursorLine", "", s:line, "none") + call X("CursorColumn", "", s:line, "none") + call X("PMenu", s:foreground, s:selection, "none") + call X("PMenuSel", s:foreground, s:selection, "reverse") + end + if version >= 703 + call X("ColorColumn", "", s:line, "none") + end + + " Standard Highlighting + call X("Comment", s:comment, "", "") + call X("Todo", s:comment, s:background, "") + call X("Title", s:comment, "", "") + call X("Identifier", s:red, "", "none") + call X("Statement", s:foreground, "", "") + call X("Conditional", s:foreground, "", "") + call X("Repeat", s:foreground, "", "") + call X("Structure", s:purple, "", "") + call X("Function", s:blue, "", "") + call X("Constant", s:orange, "", "") + call X("String", s:green, "", "") + call X("Special", s:foreground, "", "") + call X("PreProc", s:purple, "", "") + call X("Operator", s:aqua, "", "none") + call X("Type", s:blue, "", "none") + call X("Define", s:purple, "", "none") + call X("Include", s:blue, "", "") + "call X("Ignore", "666666", "", "") + + " Vim Highlighting + call X("vimCommand", s:red, "", "none") + + " C Highlighting + call X("cType", s:yellow, "", "") + call X("cStorageClass", s:purple, "", "") + call X("cConditional", s:purple, "", "") + call X("cRepeat", s:purple, "", "") + + " PHP Highlighting + call X("phpVarSelector", s:red, "", "") + call X("phpKeyword", s:purple, "", "") + call X("phpRepeat", s:purple, "", "") + call X("phpConditional", s:purple, "", "") + call X("phpStatement", s:purple, "", "") + call X("phpMemberSelector", s:foreground, "", "") + + " Ruby Highlighting + call X("rubySymbol", s:green, "", "") + call X("rubyConstant", s:yellow, "", "") + call X("rubyAttribute", s:blue, "", "") + call X("rubyInclude", s:blue, "", "") + call X("rubyLocalVariableOrMethod", s:orange, "", "") + call X("rubyCurlyBlock", s:orange, "", "") + call X("rubyStringDelimiter", s:green, "", "") + call X("rubyInterpolationDelimiter", s:orange, "", "") + call X("rubyConditional", s:purple, "", "") + call X("rubyRepeat", s:purple, "", "") + + " Python Highlighting + call X("pythonInclude", s:purple, "", "") + call X("pythonStatement", s:purple, "", "") + call X("pythonConditional", s:purple, "", "") + call X("pythonFunction", s:blue, "", "") + + " JavaScript Highlighting + call X("javaScriptBraces", s:foreground, "", "") + call X("javaScriptFunction", s:purple, "", "") + call X("javaScriptConditional", s:purple, "", "") + call X("javaScriptRepeat", s:purple, "", "") + call X("javaScriptNumber", s:orange, "", "") + call X("javaScriptMember", s:orange, "", "") + + " HTML Highlighting + call X("htmlTag", s:red, "", "") + call X("htmlTagName", s:red, "", "") + call X("htmlArg", s:red, "", "") + call X("htmlScriptTag", s:red, "", "") + + " Diff Highlighting + call X("diffAdded", s:green, "", "") + call X("diffRemoved", s:red, "", "") + + " Delete Functions + delf X + delf rgb + delf colour + delf rgb_colour + delf rgb_level + delf rgb_number + delf grey_colour + delf grey_level + delf grey_number +endif diff --git a/dot_vim/doc/live-latex-preview.txt b/dot_vim/doc/live-latex-preview.txt new file mode 100644 index 0000000..5bf6aba --- /dev/null +++ b/dot_vim/doc/live-latex-preview.txt @@ -0,0 +1,109 @@ +*live-latex-preview.txt* For Vim version 7.4. Last change: 2014 Feb 01 + + *live-latex-preview* + +A plugin for creating a live-updating PDF preview for a LaTeX file in MuPDF + +Default key bindings:~ + +\o = Begin/end auto-compilation and live-updating (Note: + starting live compilation will also open PDF preview.) +\p = Open/close PDF preview window. (Note: closing the + PDF preview will also stop auto-compilation.) +\s = Check the result of the last compilation; + jump to first error in case of errors. +\f = Forward search to page in PDF matching cursor + position in source. +\r = Reverse/inverse search to position in source + matching active page in MuPDF. (Very approximate.) +\c = End any compilations in progress, and begin new compilation + now. (Useful for un-"stick"ing stalled compilations.) + Note: if auto-compilation is turned off, this will still + compile and show the results inside vim. + +\, \, \, \, \, \, \G + \m, \t, \-, \+, \= = Send the corresponding keystrokes + to the MuPDF preview without losing focus on vim Window + +The '\' can be changed by changing . + +To suppress the default key mappings, insert: + + let no_tex_maps = 1 + +into your .vimrc file. You may then define your own mappings which +execute the command :call FunctionName(). The important function +names defined by the plugin are: +*LaunchMuPDF()* which opens the PDF preview; +*CloseMuPDF()* which closes the PDF preview; +*PDFViewingToggle()* which toggles the PDF preview on/off; +*UpdatingToggle()* which toggles live-updating on/off; +*CheckLiveUpdateStatus()* which returns the results of the last +compilation, and jumps to the first error, if any; and +*MuPDFForward()* and *MuPDFReverse()* for forward and reverse search. + +Autosaving~ + +Be aware that when live updating is active, your file is saved whenever +the cursor moves. Be sure to take the appropriate measures to keep +back-up saves and undo files so you can undo changes if need be. If +you would like the file to save with each keystroke even when the +preview is not active, then put + + let tex_preview_always_autosave = 1 + +into your .vimrc file. + + *LaTeX-compilation* options + +Using XeLaTeX~ + +To compile with XeLaTeX rather than PDFLaTeX, include the string +'xelatex' somewhere in the first five lines of your file (e.g., in a +comment). + +Using LaTeX > dvips > ps2pdf (for, e.g., PSTricks support)~ + +If pstricks or related pst-* package is loaded in your preamble, this option +will be automatically used. Otherwise, pdflatex or xelatex will be used. +(Thanks to Hong Ying for implementing this.) + +(Support for LuaLaTeX may be added in the future.) + +Using biber instead of bibTeX~ + +To process bibliographic citations with biber instead of bibTeX, include +the string 'biber' somewhere in the first five lines of your file (e.g., +in a comment). + +Using -shell-escape~ + +To enable the -shell-escape command-line option, to allow +LaTeX's \write18{..} command (for, e.g., the minted package), include +the string 'shell-escape' somewhere in the first five lines of your file +(e.g., in a comment). + + LaTeX *subdocuments* + LaTeX *root* + +Working with subdocuments~ + +If you want to use the live preview feature while editing a +sub-document, i.e., a document included in another document by means +of LaTeX's \input{..} or \include{..} commands, then put a comment +in the first five lines of the subdocument containing the string +'root = main.tex' (replacing 'main.tex' with the actual name +of the master file). This is meant to be compatible with the convention +adopted by other editors such as TeXworks and TeXshop, which use +the convention: + + % !TeX root = main.tex + +to indicate that the master document for a given file is named "main.tex". + +All files should be in the same folder. + + +Contact Kevin C. Klement with bug reports. + + vim:tw=78:ts=8:ft=help:norl: diff --git a/dot_vim/doc/tags b/dot_vim/doc/tags new file mode 100644 index 0000000..aa848d4 --- /dev/null +++ b/dot_vim/doc/tags @@ -0,0 +1,77 @@ +CheckLiveUpdateStatus() live-latex-preview.txt /*CheckLiveUpdateStatus()* +CloseMuPDF() live-latex-preview.txt /*CloseMuPDF()* +LaTeX-compilation live-latex-preview.txt /*LaTeX-compilation* +LaunchMuPDF() live-latex-preview.txt /*LaunchMuPDF()* +MuPDFForward() live-latex-preview.txt /*MuPDFForward()* +MuPDFReverse() live-latex-preview.txt /*MuPDFReverse()* +PDFViewingToggle() live-latex-preview.txt /*PDFViewingToggle()* +UpdatingToggle() live-latex-preview.txt /*UpdatingToggle()* +clang_close-preview clang_complete.txt /*clang_close-preview* +clang_complete clang_complete.txt /*clang_complete* +clang_complete-author clang_complete.txt /*clang_complete-author* +clang_complete-auto_select clang_complete.txt /*clang_complete-auto_select* +clang_complete-auto_user_options clang_complete.txt /*clang_complete-auto_user_options* +clang_complete-cc_args clang_complete.txt /*clang_complete-cc_args* +clang_complete-clang_restore_cr_imap clang_complete.txt /*clang_complete-clang_restore_cr_imap* +clang_complete-clang_trailing_placeholder clang_complete.txt /*clang_complete-clang_trailing_placeholder* +clang_complete-compilation_database clang_complete.txt /*clang_complete-compilation_database* +clang_complete-compl_kinds clang_complete.txt /*clang_complete-compl_kinds* +clang_complete-complete_auto clang_complete.txt /*clang_complete-complete_auto* +clang_complete-complete_macros clang_complete.txt /*clang_complete-complete_macros* +clang_complete-complete_patterns clang_complete.txt /*clang_complete-complete_patterns* +clang_complete-conceal_snippets clang_complete.txt /*clang_complete-conceal_snippets* +clang_complete-configuration clang_complete.txt /*clang_complete-configuration* +clang_complete-copen clang_complete.txt /*clang_complete-copen* +clang_complete-description clang_complete.txt /*clang_complete-description* +clang_complete-faq clang_complete.txt /*clang_complete-faq* +clang_complete-hl_errors clang_complete.txt /*clang_complete-hl_errors* +clang_complete-issues clang_complete.txt /*clang_complete-issues* +clang_complete-jumpto_back_key clang_complete.txt /*clang_complete-jumpto_back_key* +clang_complete-jumpto_declaration_in_preview_key clang_complete.txt /*clang_complete-jumpto_declaration_in_preview_key* +clang_complete-jumpto_declaration_key clang_complete.txt /*clang_complete-jumpto_declaration_key* +clang_complete-keybindings clang_complete.txt /*clang_complete-keybindings* +clang_complete-library_path clang_complete.txt /*clang_complete-library_path* +clang_complete-license clang_complete.txt /*clang_complete-license* +clang_complete-loaded clang_complete.txt /*clang_complete-loaded* +clang_complete-make_default_keymappings clang_complete.txt /*clang_complete-make_default_keymappings* +clang_complete-omnicppcomplete_compliance clang_complete.txt /*clang_complete-omnicppcomplete_compliance* +clang_complete-optional_args_in_snippets clang_complete.txt /*clang_complete-optional_args_in_snippets* +clang_complete-options clang_complete.txt /*clang_complete-options* +clang_complete-periodic_quickfix clang_complete.txt /*clang_complete-periodic_quickfix* +clang_complete-snippets clang_complete.txt /*clang_complete-snippets* +clang_complete-snippets_engine clang_complete.txt /*clang_complete-snippets_engine* +clang_complete-sort_algo clang_complete.txt /*clang_complete-sort_algo* +clang_complete-todo clang_complete.txt /*clang_complete-todo* +clang_complete-use_library clang_complete.txt /*clang_complete-use_library* +clang_complete-user_options clang_complete.txt /*clang_complete-user_options* +clang_complete.txt clang_complete.txt /*clang_complete.txt* +g:clang_auto_select clang_complete.txt /*g:clang_auto_select* +g:clang_auto_user_options clang_complete.txt /*g:clang_auto_user_options* +g:clang_close_preview clang_complete.txt /*g:clang_close_preview* +g:clang_compilation_database clang_complete.txt /*g:clang_compilation_database* +g:clang_complete_auto clang_complete.txt /*g:clang_complete_auto* +g:clang_complete_copen clang_complete.txt /*g:clang_complete_copen* +g:clang_complete_loaded clang_complete.txt /*g:clang_complete_loaded* +g:clang_complete_macros clang_complete.txt /*g:clang_complete_macros* +g:clang_complete_optional_args_in_snippets clang_complete.txt /*g:clang_complete_optional_args_in_snippets* +g:clang_complete_patterns clang_complete.txt /*g:clang_complete_patterns* +g:clang_conceal_snippets clang_complete.txt /*g:clang_conceal_snippets* +g:clang_hl_errors clang_complete.txt /*g:clang_hl_errors* +g:clang_jumpto_back_key clang_complete.txt /*g:clang_jumpto_back_key* +g:clang_jumpto_declaration_in_preview_key clang_complete.txt /*g:clang_jumpto_declaration_in_preview_key* +g:clang_jumpto_declaration_key clang_complete.txt /*g:clang_jumpto_declaration_key* +g:clang_library_path clang_complete.txt /*g:clang_library_path* +g:clang_make_default_keymappings clang_complete.txt /*g:clang_make_default_keymappings* +g:clang_omnicppcomplete_compliance clang_complete.txt /*g:clang_omnicppcomplete_compliance* +g:clang_periodic_quickfix clang_complete.txt /*g:clang_periodic_quickfix* +g:clang_restore_cr_imap clang_complete.txt /*g:clang_restore_cr_imap* +g:clang_snippets clang_complete.txt /*g:clang_snippets* +g:clang_snippets_engine clang_complete.txt /*g:clang_snippets_engine* +g:clang_sort_algo clang_complete.txt /*g:clang_sort_algo* +g:clang_trailing_placeholder clang_complete.txt /*g:clang_trailing_placeholder* +g:clang_use_library clang_complete.txt /*g:clang_use_library* +g:clang_user_options clang_complete.txt /*g:clang_user_options* +live-latex-preview live-latex-preview.txt /*live-latex-preview* +live-latex-preview.txt live-latex-preview.txt /*live-latex-preview.txt* +root live-latex-preview.txt /*root* +subdocuments live-latex-preview.txt /*subdocuments* diff --git a/dot_vim/dot_gitignore b/dot_vim/dot_gitignore new file mode 100644 index 0000000..a0e76af --- /dev/null +++ b/dot_vim/dot_gitignore @@ -0,0 +1 @@ +.netrwhist diff --git a/dot_vim/dot_gitmodules b/dot_vim/dot_gitmodules new file mode 100644 index 0000000..4d24493 --- /dev/null +++ b/dot_vim/dot_gitmodules @@ -0,0 +1,27 @@ +[submodule "bundle/vim-colors-solarized"] + path = bundle/vim-colors-solarized + url = git://github.com/altercation/vim-colors-solarized.git +[submodule "bundle/ctrlp.vim"] + path = bundle/ctrlp.vim + url = https://github.com/kien/ctrlp.vim.git +[submodule "bundle/ctx"] + path = bundle/ctx + url = https://github.com/vim-scripts/ctx.git +[submodule "bundle/vim-surround"] + path = bundle/vim-surround + url = https://github.com/tpope/vim-surround.git +[submodule "bundle/vim-project"] + path = bundle/vim-project + url = https://github.com/shemerey/vim-project.git +[submodule "bundle/2048"] + path = bundle/2048 + url = https://github.com/AshyIsMe/2048 +[submodule "bundle/vim-coffee-script"] + path = bundle/vim-coffee-script + url = https://github.com/kchmck/vim-coffee-script.git +[submodule "bundle/nerdtree"] + path = bundle/nerdtree + url = https://github.com/scrooloose/nerdtree.git +[submodule "bundle/semantic-highlight.vim"] + path = bundle/semantic-highlight.vim + url = https://github.com/jaxbot/semantic-highlight.vim.git diff --git a/dot_vim/dot_netrwhist b/dot_vim/dot_netrwhist new file mode 100644 index 0000000..38db8ca --- /dev/null +++ b/dot_vim/dot_netrwhist @@ -0,0 +1,3 @@ +let g:netrw_dirhistmax =10 +let g:netrw_dirhistcnt =1 +let g:netrw_dirhist_1='/home/linly/Code/RMI_THINGS/RMIServer/lib/src/main/java/rmiserver' diff --git a/dot_vim/ftplugin/lisp/limp.vim b/dot_vim/ftplugin/lisp/limp.vim new file mode 100644 index 0000000..8c5a2ec --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp.vim @@ -0,0 +1,53 @@ +" +" limp/vim/limp.vim +" +" URL: +" http://mikael.jansson.be/hacking +" +" Description: +" Setup the Limp environment +" +" Version: +" 0.2 +" +" Date: +" 2008-04-28 +" +" Authors: +" Mikael Jansson +" +" Changelog: +" * 2008-04-28 by Mikael Jansson +" Only change colorscheme and nocompatible when not previously set. +" +" * 2008-04-25 by Mikael Jansson +" Catch-all key for Lisp boot, connect & display +" +" * 2008-04-20 by Mikael Jansson +" Initial version. + +"------------------------------------------------------------------- + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +"------------------------------------------------------------------- +" external dependencies +"------------------------------------------------------------------- +silent! runtime plugin/matchit.vim + +"------------------------------------------------------------------- +" the Limp library +"------------------------------------------------------------------- + +runtime ftplugin/lisp/limp/cursor.vim +runtime ftplugin/lisp/limp/highlight.vim +runtime ftplugin/lisp/limp/sexp.vim +runtime ftplugin/lisp/limp/bridge.vim +runtime ftplugin/lisp/limp/autoclose.vim +runtime ftplugin/lisp/limp/keys.vim +runtime ftplugin/lisp/limp/mode.vim + + diff --git a/dot_vim/ftplugin/lisp/limp/autoclose.vim b/dot_vim/ftplugin/lisp/limp/autoclose.vim new file mode 100644 index 0000000..c00ec29 --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/autoclose.vim @@ -0,0 +1,208 @@ +" +" limp/vim/autoclose.vim +" +" URL: +" http://mikael.jansson.be/hacking +" +" Description: +" AutoClose, closes what's opened. +" +" This plugin closes opened parenthesis, braces, brackets, quotes as you +" type them. As of 1.1, if you type the open brace twice ({{), the closing +" brace will be pushed down to a new line. +" +" You can enable or disable this plugin by typing \a (or a if +" you've redefined your leader character) in normal mode. You'll also +" probably want to know you can type ( if mswin is set) and the next +" character you type doesn't have mappings applied. This is useful when you +" want to insert only an opening paren or something. +" +" Version: +" 0.2 +" +" Date: +" September 20, 2007 +" +" Authors: +" Karl Guertin +" Mikael Jansson +" +" Changelog: +" 2008-04-20 by Mikael Jansson +" * Factored out start/stop functions. +" * Removed the default mappings to toggle autoclose +" +" 2007-09-20 by Karl Guertin +" 1.1.2 -- Fixed a mapping typo and caught a double brace problem +" 1.1.1 -- Missed a bug in 1.1, September 19, 2007 +" 1.1 -- When not inserting at the end, previous version would eat chars +" at end of line, added double open->newline, September 19, 2007 +" 1.0.1 -- Cruft from other parts of the mapping, knew I shouldn't have +" released the first as 1.0, April 3, 2007 + +" Setup -----------------------------------------------------{{{1 + +let s:omni_active = 0 +let s:cotstate = &completeopt + +if !exists('g:autoclose_on') + let g:autoclose_on = 0 +endif + +" assume everything has been defined already if one of the functions are +" defined. +if exists("*AutoClose_start") + finish +endif + +if !exists("*AutoClose_stop") +fun! AutoClose_stop() + if g:autoclose_on + iunmap " + iunmap ( + iunmap ) + iunmap [ + iunmap ] + iunmap { + iunmap } + iunmap + iunmap + iunmap + ""iunmap + let g:autoclose_on = 0 + endif +endfun +endif + +if !exists("*AutoClose_start") +fun! AutoClose_start() + if !g:autoclose_on + inoremap " =QuoteDelim('"') + inoremap ( (=CloseStackPush(')') + inoremap ) =CloseStackPop(')') + inoremap [ [=CloseStackPush(']') + inoremap ] =CloseStackPop(']') + inoremap { =OpenSpecial('{','}') + inoremap } =CloseStackPop('}') + inoremap =OpenCloseBackspace() + inoremap =OpenCloseBackspace() + inoremap =CloseStackPop('') + inoremap =CloseStackPop('') + let g:autoclose_on = 1 + endif +endfunction +endif +let s:closeStack = [] + +" AutoClose Utilities -----------------------------------------{{{1 +if !exists("*OpenSpecial") +function OpenSpecial(ochar,cchar) " ---{{{2 + let line = getline('.') + let col = col('.') - 2 + "echom string(col).':'.line[:(col)].'|'.line[(col+1):] + if a:ochar == line[(col)] && a:cchar == line[(col+1)] "&& strlen(line) - (col) == 2 + "echom string(s:closeStack) + while len(s:closeStack) > 0 + call remove(s:closeStack, 0) + endwhile + return "\a\a\".a:cchar."\\"_xk$\"_xa" + endif + return a:ochar.CloseStackPush(a:cchar) +endfunction +endif + +if !exists("*CloseStackPush") +function CloseStackPush(char) " ---{{{2 + "echom "push" + let line = getline('.') + let col = col('.')-2 + if (col) < 0 + call setline('.',a:char.line) + else + "echom string(col).':'.line[:(col)].'|'.line[(col+1):] + call setline('.',line[:(col)].a:char.line[(col+1):]) + endif + call insert(s:closeStack, a:char) + "echom join(s:closeStack,'').' -- '.a:char + return '' +endfunction +endif + +if !exists("*CloseStackPop") +function CloseStackPop(char) " ---{{{2 + "echom "pop" + if len(s:closeStack) == 0 + return a:char + endif + let popped = '' + let lastpop = '' + "echom join(s:closeStack,'').' || '.lastpop + while len(s:closeStack) > 0 && ((lastpop == '' && popped == '') || lastpop != a:char) + let lastpop = remove(s:closeStack,0) + let popped .= lastpop + "echom join(s:closeStack,'').' || '.lastpop.' || '.popped + endwhile + "echom ' --> '.popped + let col = col('.') - 2 + let line = getline('.') + let splits = split(line[:col],popped,1) + "echom string(splits) + "echom col.' '.line[(col+2):].' '.popped + call setline('.',join(splits,popped).line[(col+strlen(popped)+1):]) + return popped +endfunction +endif + +if !exists("*QuoteDelim") +function QuoteDelim(char) " ---{{{2 + let line = getline('.') + let col = col('.') + if line[col - 2] == "\\" + "Inserting a quoted quotation mark into the string + return a:char + elseif line[col - 1] == a:char + "Escaping out of the string + return "\=".s:SID()."CloseStackPop(\"\\".a:char."\")\" + else + "Starting a string + return a:char."\=".s:SID()."CloseStackPush(\"\\".a:char."\")\" + endif +endfunction +endif + +" The strings returned from QuoteDelim aren't in scope for , so I +" have to fake it using this function (from the Vim help, but tweaked) +" +if !exists("*s:SID") +function s:SID() + return matchstr(expand(''), '\d\+_\zeSID$') +endfun +endif + +if !exists("*OpenCloseBackspace") +function OpenCloseBackspace() " ---{{{2 + "if pumvisible() + " pclose + " call StopOmni() + " return "\" + "else + let curline = getline('.') + let curpos = col('.') + let curletter = curline[curpos-1] + let prevletter = curline[curpos-2] + if (prevletter == '"' && curletter == '"') || +\ (prevletter == "'" && curletter == "'") || +\ (prevletter == "(" && curletter == ")") || +\ (prevletter == "{" && curletter == "}") || +\ (prevletter == "[" && curletter == "]") + if len(s:closeStack) > 0 + call remove(s:closeStack,0) + endif + return "\\" + else + return "\" + endif + "endif +endf +endif + diff --git a/dot_vim/ftplugin/lisp/limp/bridge.vim b/dot_vim/ftplugin/lisp/limp/bridge.vim new file mode 100644 index 0000000..f8e0fb1 --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/bridge.vim @@ -0,0 +1,510 @@ +" +" limp/vim/bridge.vim +" +" URL: +" http://mikael.jansson.be/hacking +" +" Description: +" Handle communication between Vim and Lisp, including boot, connect and +" display. Relies on 'lisp.sh' from the Limp package. +" +" Version: +" 0.2 +" +" Date: +" 2008-04-25 +" +" Authors: +" Mikael Jansson +" Larry Clapp + +" Changelog: +" 2008-08-26 by Mikael Jansson +" * Optionally specify core at startup and exit. +" +" 2008-08-25 by Mikael Jansson +" * Now boots a new Lisp or connects to an existing via screen. +" No longer needs the funnel (although it does need a file to read to/from +" screen: it doesn't seem as if 'stuff' can handle very large amounts of +" texts) +" +" 2008-08-18 by Mikael Jansson +" * Tab-completed prompt that lets you choose the Lisp process to connect to. +" Moved the startup to before the loaded check. + +"------------------------------------------------------------------- +" startup +"------------------------------------------------------------------- +" only do these things once + +let s:Limp_version="0.3.4" + +let s:Limp_location = expand("$LIMPRUNTIME") +"if s:Limp_location == "" || s:Limp_location == "$LIMPRUNTIME" +if !filereadable(s:Limp_location . "/vim/limp.vim") + let s:Limp_location = "/usr/local/limp/" . s:Limp_version +endif + +" prefix for the pipe used for communication +let s:limp_bridge_channel_base = $HOME . "/.limp_bridge_channel-" +let s:limp_bridge_connected=0 +exe "setlocal complete+=s" . s:Limp_location . "/vim/thesaurus" + +"------------------------------------------------------------------- +" talk to multiple Lisps using LimpBridge_connect() +"------------------------------------------------------------------- +fun! LimpBridge_complete_lisp(A,L,P) + let prefix = s:limp_bridge_channel_base + "echom "ls -1 ".prefix."*" + let output = system("ls -1 ".prefix."*") + if stridx(output, prefix."*") >= 0 + echom "No Lisps started yet?" + return + endif + let files = split(output, "\n") + let names = [] + for f in files + let names += [f[strlen(prefix):]] + endfor + return names +endfun + +" optionally specify the screen id to connect to +" +" return values: +" +" -1 if user didn't want to connect +" 0 if connection wasn't possible +" 1 if the user did connect +" 2 if the user was already connected +" +fun! LimpBridge_connect(...) + if s:limp_bridge_connected == 1 + echom "Already connected to Lisp!" + return 2 + endif + if a:0 == 1 && a:1 != "" + " format: 7213.limp_listener-foo + let pid = a:1[:stridx(a:1, '.')-1] + let fullname = a:1[stridx(a:1, '.')+1:] + let name = fullname[strlen("limp_listener-"):] + + let s:limp_bridge_channel = s:limp_bridge_channel_base.name.".".pid + else + let s:limp_bridge_channel = s:limp_bridge_channel_base + let name = input("Connect to [boot new]: ", "", "customlist,LimpBridge_complete_lisp") + if name == "" + return -1 + endif + let s:limp_bridge_channel .= name + if 0 == filewritable(s:limp_bridge_channel) "|| s:limp_bridge_channel = s:limp_bridge_channel_base + echom "Not a Limp channel." + return 0 + endif + endif + " extract the PID from format: foo.104982 + " (backward from screen sty naming to ease tab completion) + + " bridge id is the file used for communication between Vim and screen + let s:limp_bridge_id = strpart(s:limp_bridge_channel, strlen(s:limp_bridge_channel_base)) + + " bridge screenid is the screen in which the Lisp is running + let s:limp_bridge_screenid = s:limp_bridge_id[strridx(s:limp_bridge_id, '.')+1:] + "let s:limp_bridge_scratch = $HOME . "/.limp_bridge_scratch-" . s:limp_bridge_id + let s:limp_bridge_test = $HOME . '/.limp_bridge_test-' . s:limp_bridge_id + + silent exe "new" s:limp_bridge_channel + if exists( "#BufEnter#*.lisp#" ) + doauto BufEnter x.lisp + endif + setlocal syntax=lisp + " XXX: in ViLisp, buftype=nowrite, but w/ limp_bridge_channel, vim + " complains about the file being write-only. + "setlocal buftype=nowrite + setlocal bufhidden=hide + setlocal nobuflisted + setlocal noswapfile + hide + + silent exe "new" s:limp_bridge_test + if exists( "#BufEnter#*.lisp#" ) + doauto BufEnter x.lisp + endif + setlocal syntax=lisp + " setlocal buftype=nofile + setlocal bufhidden=hide + setlocal nobuflisted + " setlocal noswapfile + hide + + " hide from the user that we created and deleted (hid, really) a couple of + " buffers + "normal! + redraw + + let s:limp_bridge_connected=1 + + echom "Welcome to Limp. May your journey be pleasant." + + return 1 +endfun + +fun! LimpBridge_connection_status() + if s:limp_bridge_connected == 1 + return "Connected to ".s:limp_bridge_id + else + return "Disconnected" + endif +endfun + +fun! LimpBridge_disconnect() + let s:limp_bridge_connected = 0 + let s:limp_bridge_id = "" +endfun + +" +" optionally, specify the path of the core to save to +" +fun! LimpBridge_quit_lisp(...) + " we were given a file + if a:0 == 1 && a:1 != "" + let core = a:1 + call LimpBridge_send_to_lisp("(sb-ext:save-lisp-and-die \"".core."\")\n") + echom "Lisp ".s:limp_bridge_id." is gone, core saved to ".core."." + else + call LimpBridge_send_to_lisp("(sb-ext:quit)\n") + echom "Lisp ".s:limp_bridge_id." is gone." + endif + call LimpBridge_disconnect() +endfun + +fun! LimpBridge_shutdown_lisp() + if s:limp_bridge_connected == 1 + let core = input("Name of core to save [none]: ", "", "file") + call LimpBridge_quit_lisp(core) + else + echom "Not connected." + endif +endfun + +" +" when not connected, start new or connect to existing +" otherwise, switch to Lisp (screen) +fun! LimpBridge_boot_or_connect_or_display() + if s:limp_bridge_connected + " is it still running? + let status = system("screen -ls") + if stridx(status, s:limp_bridge_screenid) == -1 + call LimpBridge_disconnect() + return + endif + let cmd = "screen -x ".s:limp_bridge_screenid + if has("gui_running") || b:listener_always_open_window == 1 + let cmd = "xterm -e " . cmd + if b:listener_keep_open == 1 + let cmd .= " &" + endif + endif + silent exe "!".cmd + redraw! + else + " connect to a fresh Lisp + let what = LimpBridge_connect() + if what <= 0 + " user didn't want to connect, let's boot! + let name = input("Name the Lisp: ") + if strlen(name) == 0 + " give up + return + endif + + let core = input("Path to core to boot [use system-default]: ", "", "file") + let core_opt = "" + if filereadable(core) + let core_opt = "-c ".core + echom "Booting ".core."..." + else + echom "Booting..." + endif + let styfile = tempname() + let cmd = s:Limp_location . "/bin/lisp.sh ".core_opt."-s ".styfile." -b ".name + call system(cmd) + while getfsize(styfile) <= len("limp_listener") + sleep 200m + endwhile + " needs to be binary, or readfile() expects a newline... + let lines = readfile(styfile, 'b') + if len(lines) < 1 + echom "Error getting screen ID!" + return + endif + + let sty = lines[0] + call delete(styfile) + call LimpBridge_connect(sty) + call LimpBridge_boot_or_connect_or_display() + endif + endif +endfun + +augroup LimpBridge + au! + autocmd BufLeave .LimpBridge_* setlocal nobuflisted + autocmd BufLeave *.lisp let g:limp_bridge_last_lisp = bufname( "%" ) +augroup END + + +"------------------------------------------------------------------- +" plugin <-> function mappings +"------------------------------------------------------------------- + +nnoremap LimpBootConnectDisplay :call LimpBridge_boot_or_connect_or_display() +nnoremap LimpDisconnect :call LimpBridge_disconnect() +nnoremap LimpShutdownLisp :call LimpBridge_shutdown_lisp() + +nnoremap EvalTop :call LimpBridge_eval_top_form() +nnoremap EvalCurrent :call LimpBridge_eval_current_form() +nnoremap EvalExpression :call LimpBridge_prompt_eval_expression() + +vnoremap EvalBlock :call LimpBridge_eval_block() + +nnoremap AbortReset :call LimpBridge_send_to_lisp( "ABORT\n" ) +nnoremap AbortInterrupt :call LimpBridge_send_to_lisp( "" ) + +nnoremap TestCurrent :call LimpBridge_stuff_current_form() +nnoremap TestTop :call LimpBridge_stuff_top_form() + +nnoremap LoadThisFile :call LimpBridge_send_to_lisp( "(load \"" . expand( "%:p" ) . "\")\n") +nnoremap LoadAnyFile :call LimpBridge_send_to_lisp( "(load \"" . expand( "%:p:r" ) . "\")\n") + +nnoremap CompileFile :w! call LimpBridge_send_to_lisp("(compile-file \"".expand("%:p")."\")\n") + +" XXX: What's the proprer syntax for calling >1 Plug? +""nnoremap CompileAndLoadFile CompileFile LoadAnyFile +nnoremap CompileAndLoadFile :w! call LimpBridge_send_to_lisp("(compile-file \"".expand("%:p")."\")\n") call LimpBridge_send_to_lisp( "(load \"" . expand( "%:p:r" ) . "\")\n") + +" Goto Test Buffer: +" Goto Split: split current buffer and goto test buffer +nnoremap GotoTestBuffer :call LimpBridge_goto_buffer_or_window(g:limp_bridge_test) +nnoremap GotoTestBufferAndSplit :sb call LimpBridge_goto_buffer_or_window(g:limp_bridge_test) + +" Goto Last: return to g:limp_bridge_last_lisp, i.e. last buffer +nnoremap GotoLastLispBuffer :call LimpBridge_goto_buffer_or_window(g:limp_bridge_last_lisp) + +" HyperSpec: +nnoremap HyperspecExact :call LimpBridge_hyperspec("exact", 0) +nnoremap HyperspecPrefix :call LimpBridge_hyperspec("prefix", 1) +nnoremap HyperspecSuffix :call LimpBridge_hyperspec("suffix", 1) +nnoremap HyperspecGrep :call LimpBridge_hyperspec("grep", 1) +nnoremap HyperspecFirstLetterIndex :call LimpBridge_hyperspec("index", 0) +nnoremap HyperspecFullIndex :call LimpBridge_hyperspec("index-page", 0) + +" Help Describe: ask Lisp about the current symbol +nnoremap HelpDescribe :call LimpBridge_send_to_lisp("(describe '".expand("").")") + + +"------------------------------------------------------------------- +" library +"------------------------------------------------------------------- +" assume that all of the file has been loaded & defined once +" if one of the functions are defined. +if exists("*LimpBridge_goto_buffer_or_window") + finish +endif + +function! LimpBridge_goto_buffer_or_window( buff ) + if -1 == bufwinnr( a:buff ) + exe "hide bu" a:buff + else + exe bufwinnr( a:buff ) . "wincmd w" + endif +endfunction + + +function! LimpBridge_get_pos() + " what buffer are we in? + let bufnr = bufnr( "%" ) + + " get current position + let c_cur = virtcol( "." ) + let l_cur = line( "." ) + normal! H + let l_top = line( "." ) + + let pos = bufnr . "|" . l_top . "," . l_cur . "," . c_cur + + " go back + exe "normal! " l_cur . "G" . c_cur . "|" + + return( pos ) +endfunction + + +function! LimpBridge_goto_pos( pos ) + let mx = '\(\d\+\)|\(\d\+\),\(\d\+\),\(\d\+\)' + let bufnr = substitute( a:pos, mx, '\1', '' ) + let l_top = substitute( a:pos, mx, '\2', '' ) + let l_cur = substitute( a:pos, mx, '\3', '' ) + let c_cur = substitute( a:pos, mx, '\4', '' ) + + silent exe "hide bu" bufnr + silent exe "normal! " . l_top . "Gzt" . l_cur . "G" . c_cur . "|" +endfunction + + +function! LimpBridge_yank( motion ) + let value = '' + + let p = LimpBridge_get_pos() + silent! exec 'normal!' a:motion + let new_p = LimpBridge_get_pos() + + " did we move? + if p != new_p + " go back + silent! exec 'normal!' a:motion + + let old_l = @l + exec 'normal! "ly' . a:motion + let value = @l + let @l = old_l + endif + + call LimpBridge_goto_pos( p ) + + return( value ) +endfunction + + +" copy an expression to a buffer +function! LimpBridge_send_sexp_to_buffer( sexp, buffer ) + let p = LimpBridge_get_pos() + + " go to the given buffer, go to the bottom + exe "hide bu" a:buffer + silent normal! G + + " tried append() -- doesn't work the way I need it to + let old_l = @l + let @l = a:sexp + silent exe "put l" + " normal! "lp + let @l = old_l + + call LimpBridge_goto_pos( p ) +endfunction + + +" destroys contents of LimpBridge_channel buffer +function! LimpBridge_send_to_lisp( sexp ) + if a:sexp == '' + return + endif + + if !s:limp_bridge_connected + echom "Not connected to Lisp!" + return + endif + + let p = LimpBridge_get_pos() + + " goto LimpBridge_channel, delete it, put s-exp, write it to lisp + try + exe "hide bu" s:limp_bridge_channel + exe "%d" + normal! 1G + + " tried append() -- doesn't work the way I need it to + let old_l = @l + let @l = a:sexp + normal! "lP + let @l = old_l + + silent exe 'w!' + call system('screen -x '.s:limp_bridge_screenid.' -p 0 -X eval "readbuf" "paste ."') + catch /^Vim:E211:/ + echom "Lisp is gone!" + " file not available, Lisp disappeared + call LimpBridge_disconnect() + endtry + + call LimpBridge_goto_pos( p ) +endfunction + +function! LimpBridge_prompt_eval_expression() + let whatwhat = input("Eval: ") + call LimpBridge_send_to_lisp(whatwhat) +endfun + + +" Actually evals current top level form +function! LimpBridge_eval_top_form() + " save position + let p = LimpBridge_get_pos() + + silent! exec "normal! 99[(" + call LimpBridge_send_to_lisp( LimpBridge_yank( "%" ) ) + + " fix cursor position, in case of error below + call LimpBridge_goto_pos( p ) +endfunction + + +function! LimpBridge_eval_current_form() + " save position + let pos = LimpBridge_get_pos() + + " find & yank current s-exp + normal! [( + let sexp = LimpBridge_yank( "%" ) + call LimpBridge_send_to_lisp( sexp ) + call LimpBridge_goto_pos( pos ) +endfunction + + +function! LimpBridge_eval_block() range + " save position + let pos = LimpBridge_get_pos() + + " yank current visual block + let old_l = @l + '<,'> yank l + let sexp = @l + let @l = old_l + + call LimpBridge_send_to_lisp( sexp ) + call LimpBridge_goto_pos( pos ) +endfunction + + +function! LimpBridge_stuff_current_form() + " save position + let pos = LimpBridge_get_pos() + + " find & yank current s-exp + normal! [( + call LimpBridge_send_sexp_to_buffer( LimpBridge_yank( "%" ), s:limp_bridge_test ) + + call LimpBridge_goto_pos( pos ) +endfunction + +function! LimpBridge_stuff_top_form() + " save position + let pos = LimpBridge_get_pos() + + " find & yank top-level s-exp + silent! exec "normal! 99[(" + call LimpBridge_send_sexp_to_buffer( LimpBridge_yank( "%" ), s:limp_bridge_test ) + + call LimpBridge_goto_pos( pos ) +endfunction + +function! LimpBridge_hyperspec(type, make_page) + " get current word under cursor + let word = expand( "" ) + let cmd = "! perl " . s:Limp_location . "/bin/limp-hyperspec.pl" + let cmd = cmd . " " . a:type . " " . a:make_page . " '" . word . "'" + silent! exe cmd + redraw! +endfunction + diff --git a/dot_vim/ftplugin/lisp/limp/cursor.vim b/dot_vim/ftplugin/lisp/limp/cursor.vim new file mode 100644 index 0000000..2890f8f --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/cursor.vim @@ -0,0 +1,207 @@ +" +" limp/vim/cursor.vim +" +" URL: +" http://mikael.jansson.be/hacking +" +" Description: +" Save/restore cursor position in window (mostly obsoleted by Vim7 though) +" +" Version: +" 0.2 +" +" Date: +" 2008-04-25 +" +" Authors: +" Mikael Jansson +" Charles E. Campbell, Jr. -NOSPAM +" +" Changelog: +" 2008-04-18 +" * Removed all leader mappings +" +" Usage: +" call Cursor_push() +" let cursor = Cursor_get() +" +" call Cursor_pop() +" call Cursor_set(cursor) +" + +" Load Once: {{{1 + +let s:keepcpo = &cpo +set cpo&vim + +" ----------------------- +" Public Interface: {{{1 +" ----------------------- +let s:modifier= "sil keepj " + + +" assume that all of the file has been loaded & defined once +" if one of the functions are defined. +if exists("*Cursor_get") + finish +endif + +" Cursor_get: {{{1 +" Return the current cursor (as an executable command!) +" +fun! Cursor_get() + if line(".") == 1 && getline(1) == "" + return "" + endif + + " disable various scrolling trickery + let so_keep = &so + let siso_keep = &siso + let ss_keep = &ss + set so=0 siso=0 ss=0 + + let swline = line(".") + let swcol = col(".") + let swwline = winline() - 1 + let swwcol = virtcol(".") - wincol() + let cursordata = "call Window_goto_by_buffer_number(".winbufnr(0).")|silent ".swline + let cursordata = cursordata."|".s:modifier."norm! 0z\" + if swwline > 0 + let cursordata = cursordata.":".s:modifier."norm! ".swwline."\\" + endif + if swwcol > 0 + let cursordata = cursordata.":".s:modifier."norm! 0".swwcol."zl\" + endif + let cursordata = cursordata.":".s:modifier."call cursor(".swline.",".swcol.")\" + + " restore scrolling flags + let &so = so_keep + let &siso = siso_keep + let &ss = ss_keep + + return cursordata +endfun + +" Cursor_set: {{{1 +" Set the current cursor to an old one +" +fun! Cursor_set(cursordata) + exe "silent ".a:cursordata +endfun + + +" --------------------------------------------------------------------- +" Cursor_push {{{1 +" let cursor = Cursor_push() save window position in b:cursor_position_{b:cursor_position_index} +" and return cursor. +fun! Cursor_push(...) + let cursordata = Cursor_get() + + " save window position in + " b:cursor_position_{b:cursor_position_index} (stack) + if !exists("b:cursor_position_index") + let b:cursor_position_index= 1 + else + let b:cursor_position_index = b:cursor_position_index + 1 + endif + + let b:cursor_position_{b:cursor_position_index} = cursordata + + return cursordata +endfun + +" --------------------------------------------------------------------- +" Cursor_pop: {{{1 +fun! Cursor_pop() + if line(".") == 1 && getline(1) == "" + return "" + endif + let so_keep = &so + let siso_keep = &siso + let ss_keep = &ss + set so=0 siso=0 ss=0 + + " use saved window position in b:cursor_position_{b:cursor_position_index} if it exists + if exists("b:cursor_position_index") && exists("b:cursor_position_{b:cursor_position_index}") + try + exe "silent! ".b:cursor_position_{b:cursor_position_index} + catch /^Vim\%((\a\+)\)\=:E749/ + " ignore empty buffer error messages + endtry + " normally drop top-of-stack by one + " but while new top-of-stack doesn't exist + " drop top-of-stack index by one again + if b:cursor_position_index >= 1 + unlet b:cursor_position_{b:cursor_position_index} + let b:cursor_position_index= b:cursor_position_index - 1 + while b:cursor_position_index >= 1 && !exists("b:cursor_position_{b:cursor_position_index}") + let b:cursor_position_index= b:cursor_position_index - 1 + endwhile + if b:cursor_position_index < 1 + unlet b:cursor_position_index + endif + endif + else + echohl WarningMsg + echomsg "***warning*** need to cursor_save() first!" + echohl None + endif + + " seems to be something odd: vertical motions after RWP + " cause jump to first column. Following fixes that + if wincol() > 1 + silent norm! hl + elseif virtcol(".") < virtcol("$") + silent norm! lh + endif + + let &so = so_keep + let &siso = siso_keep + let &ss = ss_keep +endfun + +" --------------------------------------------------------------------- +" Window_goto_by_buffer_number: go to window holding given buffer (by number) {{{1 +" Prefers current window; if its buffer number doesn't match, +" then will try from topleft to bottom right +fun! Window_goto_by_buffer_number(bufnum) + if winbufnr(0) == a:bufnum + return + endif + winc t + let first=1 + while winbufnr(0) != a:bufnum && (first || winnr() != 1) + winc w + let first= 0 + endwhile +endfun + + +" --------------------------------------------------------------------- +" ListWinPosn: +"fun! ListWinPosn() " Decho +" if !exists("b:cursor_position_index") || b:cursor_position_index == 0 " Decho +" call Decho("nothing on SWP stack") " Decho +" else " Decho +" let jwinposn= b:cursor_position_index " Decho +" while jwinposn >= 1 " Decho +" if exists("b:cursor_position{jwinposn}") " Decho +" call Decho("winposn{".jwinposn."}<".b:cursor_position{jwinposn}.">") " Decho +" else " Decho +" call Decho("winposn{".jwinposn."} -- doesn't exist") " Decho +" endif " Decho +" let jwinposn= jwinposn - 1 " Decho +" endwhile " Decho +" endif " Decho +"endfun " Decho +"com! -nargs=0 LWP call ListWinPosn() " Decho + + +" --------------------------------------------------------------------- +" Restore: {{{1 +let &cpo = s:keepcpo +unlet s:keepcpo + +" --------------------------------------------------------------------- +" Modelines: {{{1 +" vim: ts=4 fdm=marker diff --git a/dot_vim/ftplugin/lisp/limp/desert256.vim b/dot_vim/ftplugin/lisp/limp/desert256.vim new file mode 100644 index 0000000..7a97742 --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/desert256.vim @@ -0,0 +1,338 @@ +" Vim color file +" Maintainer: Henry So, Jr. + +" These are the colors of the "desert" theme by Hans Fugal with a few small +" modifications (namely that I lowered the intensity of the normal white and +" made the normal and nontext backgrounds black), modified to work with 88- +" and 256-color xterms. +" +" The original "desert" theme is available as part of the vim distribution or +" at http://hans.fugal.net/vim/colors/. +" +" The real feature of this color scheme, with a wink to the "inkpot" theme, is +" the programmatic approximation of the gui colors to the palettes of 88- and +" 256- color xterms. The functions that do this (folded away, for +" readability) are calibrated to the colors used for Thomas E. Dickey's xterm +" (version 200), which is available at http://dickey.his.com/xterm/xterm.html. +" +" I struggled with trying to parse the rgb.txt file to avoid the necessity of +" converting color names to #rrggbb form, but decided it was just not worth +" the effort. Maybe someone seeing this may decide otherwise... + +set background=dark +if version > 580 + " no guarantees for version 5.8 and below, but this makes it stop + " complaining + hi clear + if exists("syntax_on") + syntax reset + endif +endif +let g:colors_name="desert256" + +if has("gui_running") || &t_Co == 88 || &t_Co == 256 + " functions {{{ + " returns an approximate grey index for the given grey level + fun grey_number(x) + if &t_Co == 88 + if a:x < 23 + return 0 + elseif a:x < 69 + return 1 + elseif a:x < 103 + return 2 + elseif a:x < 127 + return 3 + elseif a:x < 150 + return 4 + elseif a:x < 173 + return 5 + elseif a:x < 196 + return 6 + elseif a:x < 219 + return 7 + elseif a:x < 243 + return 8 + else + return 9 + endif + else + if a:x < 14 + return 0 + else + let l:n = (a:x - 8) / 10 + let l:m = (a:x - 8) % 10 + if l:m < 5 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " returns the actual grey level represented by the grey index + fun grey_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 46 + elseif a:n == 2 + return 92 + elseif a:n == 3 + return 115 + elseif a:n == 4 + return 139 + elseif a:n == 5 + return 162 + elseif a:n == 6 + return 185 + elseif a:n == 7 + return 208 + elseif a:n == 8 + return 231 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 8 + (a:n * 10) + endif + endif + endfun + + " returns the palette index for the given grey index + fun grey_color(n) + if &t_Co == 88 + if a:n == 0 + return 16 + elseif a:n == 9 + return 79 + else + return 79 + a:n + endif + else + if a:n == 0 + return 16 + elseif a:n == 25 + return 231 + else + return 231 + a:n + endif + endif + endfun + + " returns an approximate color index for the given color level + fun rgb_number(x) + if &t_Co == 88 + if a:x < 69 + return 0 + elseif a:x < 172 + return 1 + elseif a:x < 230 + return 2 + else + return 3 + endif + else + if a:x < 75 + return 0 + else + let l:n = (a:x - 55) / 40 + let l:m = (a:x - 55) % 40 + if l:m < 20 + return l:n + else + return l:n + 1 + endif + endif + endif + endfun + + " returns the actual color level for the given color index + fun rgb_level(n) + if &t_Co == 88 + if a:n == 0 + return 0 + elseif a:n == 1 + return 139 + elseif a:n == 2 + return 205 + else + return 255 + endif + else + if a:n == 0 + return 0 + else + return 55 + (a:n * 40) + endif + endif + endfun + + " returns the palette index for the given R/G/B color indices + fun rgb_color(x, y, z) + if &t_Co == 88 + return 16 + (a:x * 16) + (a:y * 4) + a:z + else + return 16 + (a:x * 36) + (a:y * 6) + a:z + endif + endfun + + " returns the palette index to approximate the given R/G/B color levels + fun color(r, g, b) + " get the closest grey + let l:gx = grey_number(a:r) + let l:gy = grey_number(a:g) + let l:gz = grey_number(a:b) + + " get the closest color + let l:x = rgb_number(a:r) + let l:y = rgb_number(a:g) + let l:z = rgb_number(a:b) + + if l:gx == l:gy && l:gy == l:gz + " there are two possibilities + let l:dgr = grey_level(l:gx) - a:r + let l:dgg = grey_level(l:gy) - a:g + let l:dgb = grey_level(l:gz) - a:b + let l:dgrey = (l:dgr * l:dgr) + (l:dgg * l:dgg) + (l:dgb * l:dgb) + let l:dr = rgb_level(l:gx) - a:r + let l:dg = rgb_level(l:gy) - a:g + let l:db = rgb_level(l:gz) - a:b + let l:drgb = (l:dr * l:dr) + (l:dg * l:dg) + (l:db * l:db) + if l:dgrey < l:drgb + " use the grey + return grey_color(l:gx) + else + " use the color + return rgb_color(l:x, l:y, l:z) + endif + else + " only one possibility + return rgb_color(l:x, l:y, l:z) + endif + endfun + + " returns the palette index to approximate the 'rrggbb' hex string + fun rgb(rgb) + let l:r = ("0x" . strpart(a:rgb, 0, 2)) + 0 + let l:g = ("0x" . strpart(a:rgb, 2, 2)) + 0 + let l:b = ("0x" . strpart(a:rgb, 4, 2)) + 0 + + return color(l:r, l:g, l:b) + endfun + + " sets the highlighting for the given group + fun X(group, fg, bg, attr) + if a:fg != "" + exec "hi " . a:group . " guifg=#" . a:fg . " ctermfg=" . rgb(a:fg) + endif + if a:bg != "" + exec "hi " . a:group . " guibg=#" . a:bg . " ctermbg=" . rgb(a:bg) + endif + if a:attr != "" + exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr + endif + endfun + " }}} + + call X("Normal", "cccccc", "000000", "") + + " highlight groups + call X("Cursor", "708090", "f0e68c", "") + "CursorIM + "Directory + "DiffAdd + "DiffChange + "DiffDelete + "DiffText + "ErrorMsg + call X("VertSplit", "c2bfa5", "7f7f7f", "reverse") + call X("Folded", "ffd700", "4d4d4d", "") + call X("FoldColumn", "d2b48c", "4d4d4d", "") + call X("IncSearch", "708090", "f0e68c", "") + "LineNr + call X("ModeMsg", "daa520", "", "") + call X("MoreMsg", "2e8b57", "", "") + call X("NonText", "addbe7", "000000", "bold") + call X("Question", "00ff7f", "", "") + call X("Search", "f5deb3", "cd853f", "") + call X("SpecialKey", "9acd32", "", "") + call X("StatusLine", "c2bfa5", "000000", "reverse") + call X("StatusLineNC", "c2bfa5", "7f7f7f", "reverse") + call X("Title", "cd5c5c", "", "") + call X("Visual", "6b8e23", "f0e68c", "reverse") + "VisualNOS + call X("WarningMsg", "fa8072", "", "") + "WildMenu + "Menu + "Scrollbar + "Tooltip + + " syntax highlighting groups + call X("Comment", "87ceeb", "", "") + call X("Constant", "ffa0a0", "", "") + call X("Identifier", "98fb98", "", "none") + call X("Statement", "f0e68c", "", "bold") + call X("PreProc", "cd5c5c", "", "") + call X("Type", "bdb76b", "", "bold") + call X("Special", "ffdead", "", "") + "Underlined + call X("Ignore", "666666", "", "") + "Error + call X("Todo", "ff4500", "eeee00", "") + + " delete functions {{{ + delf X + delf rgb + delf color + delf rgb_color + delf rgb_level + delf rgb_number + delf grey_color + delf grey_level + delf grey_number + " }}} +else + " color terminal definitions + hi SpecialKey ctermfg=darkgreen + hi NonText cterm=bold ctermfg=darkblue + hi Directory ctermfg=darkcyan + hi ErrorMsg cterm=bold ctermfg=7 ctermbg=1 + hi IncSearch cterm=NONE ctermfg=yellow ctermbg=green + hi Search cterm=NONE ctermfg=grey ctermbg=blue + hi MoreMsg ctermfg=darkgreen + hi ModeMsg cterm=NONE ctermfg=brown + hi LineNr ctermfg=3 + hi Question ctermfg=green + hi StatusLine cterm=bold,reverse + hi StatusLineNC cterm=reverse + hi VertSplit cterm=reverse + hi Title ctermfg=5 + hi Visual cterm=reverse + hi VisualNOS cterm=bold,underline + hi WarningMsg ctermfg=1 + hi WildMenu ctermfg=0 ctermbg=3 + hi Folded ctermfg=darkgrey ctermbg=NONE + hi FoldColumn ctermfg=darkgrey ctermbg=NONE + hi DiffAdd ctermbg=4 + hi DiffChange ctermbg=5 + hi DiffDelete cterm=bold ctermfg=4 ctermbg=6 + hi DiffText cterm=bold ctermbg=1 + hi Comment ctermfg=darkcyan + hi Constant ctermfg=brown + hi Special ctermfg=5 + hi Identifier ctermfg=6 + hi Statement ctermfg=3 + hi PreProc ctermfg=5 + hi Type ctermfg=2 + hi Underlined cterm=underline ctermfg=5 + hi Ignore ctermfg=darkgrey + hi Error cterm=bold ctermfg=7 ctermbg=1 +endif + +" vim: set fdl=0 fdm=marker: diff --git a/dot_vim/ftplugin/lisp/limp/highlight.vim b/dot_vim/ftplugin/lisp/limp/highlight.vim new file mode 100644 index 0000000..893682b --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/highlight.vim @@ -0,0 +1,236 @@ +" +" limp/vim/highlight.vim +" +" URL: +" http://mikael.jansson.be/hacking +" +" Description: +" Highlight parens and containing s-exps +" +" Version: +" 0.2 +" +" Date: +" 2008-04-25 +" +" Authors: +" Mikael Jansson +" Charles E. Campbell, Jr. -NOSPAM +" +" Changelog: +" 2008-04-25 +" * Fixed regressions. Now properly highlights blocks again. +" +" 2008-04-18 +" * Removed all mappings +" * Removed < 7.00 compatibility +" * Renamed to Lim-Highlight +" * Changed from Search to Brackets[Block] +" +" Usage: {{{1 +" Before loading: +" let g:LimpHighlight = 1 +" or after loading: +" call LimpHighlight_start() +" +" --------------------------------------------------------------------- +" Load Once: {{{1 + +let s:keepcpo = &cpo +set cpo&vim + +" disable matchparen: we do that ourselves. +let g:loaded_matchparen = 1 + +" assume that all of the file has been loaded & defined once +" if one of the functions are defined. +if exists("*LimpHighlight_start") + finish +endif + +fun! LimpHighlight_start() + if exists("g:limp_highlight_active") + return + endif + let g:limp_highlight_active = 1 + + if !exists("*Cursor_get") + " due to loading order, may not have loaded yet. + " attempt to force a load now. Ditto for matchit! + silent! runtime limp/cursor.vim + endif + silent! runtime plugin/matchit.vim + + " set whichwrap + let s:wwkeep = &ww + set ww=b,s,<,>,[,] + + augroup LimpHighlight + au! + au CursorMoved * silent call s:LimpHighlight_handler() + augroup END + + set lz + call s:LimpHighlight_handler() + set nolz + +endfun + +fun! LimpHighlight_stop() + "echom "Stopping highlight" + set lz + if exists("g:limp_highlight_active") + unlet g:limp_highlight_active + endif + match none + 2match none + + " remove cursorhold event for highlighting matching bracket + augroup LimpHighlight + au! + augroup END + + let &ww = s:wwkeep + set nolz +endfun + + +" --------------------------------------------------------------------- +" LimpHighlight_handler: this routine actually performs the highlighting of {{{1 +" the matching bracket. +fun! LimpHighlight_handler() + if mode() =~ '['."\".'vV]' + " don't try to highlight matching/surrounding brackets while in + " visual-block mode + return + endif + + + " save + let magickeep = &magic + let regdq = @" + let regunnamed = @@ + let sokeep = &so + let sskeep = &ss + let sisokeep = &siso + let solkeep = &sol + let t_vbkeep = &t_vb + let vbkeep = &vb + silent! let regpaste = @* + + " turn beep/visual flash off + set nosol vb t_vb= so=0 siso=0 ss=0 magic + + " remove every other character from the mps option set + let mps = substitute(&mps,'\(.\).','\1','g') + + " grab a copy of the character under the cursor into @0 + silent! norm! yl + + " if the character grabbed in @0 is in the mps option set, then highlight + " the matching character + if stridx(mps,@0) != -1 + "------------------------------------------ + " We are at a bracket character + "------------------------------------------ + let curchr = @0 + " determine match line, column. + " Restrict search to currently visible portion of window. + if &mps =~ curchr.':' + let stopline = line("w$") + let chrmatch = substitute(&mps,'^.*'.curchr.':\(.\).*$','\1','') + let [mtchline,mtchcol] = searchpairpos(escape(curchr,'[]'),'',escape(chrmatch,'[]'),'n','synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"',stopline) + else + let stopline = line("w0") + let chrmatch = substitute(&mps,'^.*\(.\):'.curchr.'.*$','\1','') + let [mtchline,mtchcol] = searchpairpos(escape(chrmatch,'[]'),'',escape(curchr,'[]'),'bn','synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"',stopline) + endif + + if mtchline != 0 && mtchcol != 0 + let mtchline2 = line('.') + let mtchcol2 = col('.') + let mtchline1 = mtchline + let mtchcol1 = mtchcol + + call s:PerformMatch(mtchline1, mtchcol1, mtchline2, mtchcol2) + else + 2match none + match none + endif + + " if g:HiMtchBrkt_surround exists and is true, then highlight the surrounding brackets + "elseif exists("g:HiMtchBrkt_surround") && g:HiMtchBrkt_surround + else + "------------------------------------------ + " We are inside brackets! + "------------------------------------------ + let swp = Cursor_get() + let openers = '['.escape(substitute(&mps,':.,\=',"","g"),']').']' + let closers = '['.escape(substitute(&mps,',\=.:',"","g"),']').']' + call searchpair(openers,"",closers,'','synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"') + silent! norm! yl + if stridx(mps,@0) != -1 + let mtchline1 = line('.') + let mtchcol1 = virtcol('.') + keepj norm! % + let mtchline2 = line('.') + let mtchcol2 = virtcol('.') + call Cursor_set(swp) + + call s:PerformMatch(mtchline1, mtchcol1, mtchline2, mtchcol2) + else + match none + 2match none + endif + endif + + " restore + let &magic = magickeep + let @" = regdq + let @@ = regunnamed + let &sol = solkeep + let &so = sokeep + let &siso = sisokeep + let &ss = sskeep + let &t_vb = t_vbkeep + let &vb = vbkeep + silent! let @* = regpaste +endfun + +fun! s:PerformMatch(line1, col1, line2, col2) + let line1 = a:line1 + let col1 = a:col1 + let line2 = a:line2 + let col2 = a:col2 + + if line1 == line2 + " at a single line => sort points on columns + if col1 > col2 + let tmp = col2 + let col2 = col1 + let col1 = tmp + let tmp = line2 + let line2 = line1 + let line1 = tmp + endif + exe '2match BracketsBlock /\%'.line1.'l\%>'.col1.'v\%<'.col2.'v/' + else + " at a single line => sort points on lines + if line1 > line2 + let tmp = line2 + let line2 = line1 + let line1 = tmp + let tmp = col2 + let col2 = col1 + let col1 = tmp + endif + exe '2match BracketsBlock /\%'.line1.'l\%>'.col1.'v\|\%>'.line1.'l\%<'.line2.'l\|\%'.line2.'l\%<'.col2.'v/' + endif + + exe 'match Brackets /\%'.line1.'l\%'.col1.'v\|\%'.line2.'l\%'.col2.'v/' +endfun + +let &cpo = s:keepcpo +unlet s:keepcpo + + diff --git a/dot_vim/ftplugin/lisp/limp/keys.vim b/dot_vim/ftplugin/lisp/limp/keys.vim new file mode 100644 index 0000000..9ff3a01 --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/keys.vim @@ -0,0 +1,96 @@ +" +" limp/vim/keys.vim +" +" Description: +" Limp key bindings +" +" Authors: +" Mikael Jansson +" + +nmap LimpBootConnectDisplay +nmap LimpDisconnect +nmap LimpShutdownLisp + +" Eval Top: send top-level s-exp to Lisp +" Eval Current: send current s-exp to Lisp +" Eval Expression: send arbitrary code to Lisp +nmap et EvalTop +nmap ec EvalCurrent +nmap ex EvalExpression + +" Eval Block: visual mode +vmap et EvalBlock +vmap ec EvalBlock +vmap ex EvalBlock + +" SBCL Abort Reset: abort from the debugger +nmap ar AbortReset + +" Abort Interrupt: send ^C to interpreter +nmap ai AbortInterrupt + +" Test Current: copy current s-exp to test buffer +" Test Top: copy top s-exp to test buffer +nmap tc TestCurrent +nmap tt TestTop + +" Load File: load /this/ file into Lisp +" Load Any File: load whichever version of this file (.lisp not given) +nmap lf LoadThisFile +nmap la LoadAnyFile + +" Compile File: compile the current file +" Compile Load File: compile, then load the current file +nmap cf CompileFile +nmap cl CompileAndLoadFile + +" Goto Test Buffer: +" Goto Split: split current buffer and goto test buffer +nmap gt GotoTestBuffer +nmap gs GotoTestBufferAndSplit + +" Goto Last: return to last Lisp buffer +nmap gl GotoLastLispBuffer + +" HyperSpec: +nmap he HyperspecExact +nmap hp HyperspecPrefix +nmap hs HyperspecSuffix +nmap hg HyperspecGrep +nmap hi HyperspecFirstLetterIndex +nmap hI HyperspecFullIndex +nmap K HyperspecExact + +" Help Describe: ask Lisp about the current symbol +nmap hd HelpDescribe + +" Mark Top: mark visual block +nmap mt MarkTop + +" Format Current: reindent/format +" Format Top: +nmap fc FormatCurrent +nmap ft FormatTop + +" Sexp Wrap: wrap the current form in a list +" Sexp Peel: peel a list off the current form +nmap sw SexpWrap +nmap sp SexpPeel + +" Sexp Previous: navigate to previous s-exp +" Sexp Next: navigate to previous s-exp +nmap ( SexpPrevious +nmap ) SexpNext + +" Sexp Move Back: swap this and previous s-exp +" Sexp Move Forward: swap this and next s-exp +nmap { SexpMoveBack +nmap } SexpMoveForward + +" Sexp Comment: comment all the way from the top level +nmap sc SexpComment + +" Sexp Comment Current: comment current form +nmap sC SexpCommentCurrent + diff --git a/dot_vim/ftplugin/lisp/limp/limp.vim b/dot_vim/ftplugin/lisp/limp/limp.vim new file mode 100644 index 0000000..8c5a2ec --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/limp.vim @@ -0,0 +1,53 @@ +" +" limp/vim/limp.vim +" +" URL: +" http://mikael.jansson.be/hacking +" +" Description: +" Setup the Limp environment +" +" Version: +" 0.2 +" +" Date: +" 2008-04-28 +" +" Authors: +" Mikael Jansson +" +" Changelog: +" * 2008-04-28 by Mikael Jansson +" Only change colorscheme and nocompatible when not previously set. +" +" * 2008-04-25 by Mikael Jansson +" Catch-all key for Lisp boot, connect & display +" +" * 2008-04-20 by Mikael Jansson +" Initial version. + +"------------------------------------------------------------------- + +if exists("b:did_ftplugin") + finish +endif +let b:did_ftplugin = 1 + +"------------------------------------------------------------------- +" external dependencies +"------------------------------------------------------------------- +silent! runtime plugin/matchit.vim + +"------------------------------------------------------------------- +" the Limp library +"------------------------------------------------------------------- + +runtime ftplugin/lisp/limp/cursor.vim +runtime ftplugin/lisp/limp/highlight.vim +runtime ftplugin/lisp/limp/sexp.vim +runtime ftplugin/lisp/limp/bridge.vim +runtime ftplugin/lisp/limp/autoclose.vim +runtime ftplugin/lisp/limp/keys.vim +runtime ftplugin/lisp/limp/mode.vim + + diff --git a/dot_vim/ftplugin/lisp/limp/mode.vim b/dot_vim/ftplugin/lisp/limp/mode.vim new file mode 100644 index 0000000..a2884eb --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/mode.vim @@ -0,0 +1,118 @@ +" +" limp/vim/mode.vim +" +" URL: +" http://mikael.jansson.be +" +" Description: +" Lisp-mode specific functions +" +" Authors: +" Mikael Jansson +" +"Eval (say-hello 'mikael) +command! -buffer -nargs=* Eval silent call LimpBridge_send_to_lisp() + +let b:listener_always_open_window=0 +let b:listener_keep_open=0 + +let g:lisp_mode_active = 0 +fun! LimpMode_start() + if g:lisp_mode_active + return + endif + let g:lisp_mode_active = 1 + "------------------------------------------------------------------- + " coloring + "------------------------------------------------------------------- + let g:lisp_rainbow=1 + + set t_Co=256 + if !exists("g:colors_name") + colorscheme desert256 + endif + + hi Brackets ctermbg=53 ctermfg=white + hi BracketsBlock ctermbg=235 guibg=lightgray + hi StatusLine ctermbg=white ctermfg=160 + hi StatusLineNC ctermbg=black ctermfg=gray + hi Pmenu ctermbg=53 ctermfg=255 + hi PmenuSel ctermbg=255 ctermfg=53 + + " + " set all parens to gray + " + hi hlLevel0 ctermfg=238 + hi hlLevel1 ctermfg=238 + hi hlLevel2 ctermfg=238 + hi hlLevel3 ctermfg=238 + hi hlLevel4 ctermfg=238 + hi hlLevel5 ctermfg=238 + hi hlLevel6 ctermfg=238 + hi hlLevel7 ctermfg=238 + hi hlLevel8 ctermfg=238 + hi hlLevel9 ctermfg=238 + hi hlLevel10 ctermfg=238 + hi hlLevel11 ctermfg=238 + + call LimpHighlight_start() + call AutoClose_start() + + " for whatever reason, nocursorline isn't set after pressing F12... (i.e., + " switching back to the buffer) + setlocal nocursorline +endfun + +fun! LimpMode_stop() + let g:lisp_mode_active = 0 + call LimpHighlight_stop() + call AutoClose_stop() +endfun + +augroup LimpMode + au! + au BufEnter * :if &filetype == "lisp" | call LimpMode_start() | endif + au BufLeave * :if &filetype == "lisp" | call LimpMode_stop() | endif +augroup END + + +"------------------------------------------------------------------- +" init filetype plugin +"------------------------------------------------------------------- +syntax on +setlocal nocompatible nocursorline +setlocal lisp syntax=lisp +setlocal ls=2 bs=2 si et sw=2 ts=2 tw=0 +setlocal statusline=%<%f\ \(%{LimpBridge_connection_status()}\)\ %h%m%r%=%-14.(%l,%c%V%)\ %P\ of\ %L\ \(%.45{getcwd()}\) +setlocal iskeyword=&,*,+,45,/,48-57,:,<,=,>,@,A-Z,a-z,_ +setlocal cpoptions=-mp +setlocal foldmethod=marker foldmarker=(,) foldminlines=1 + + +" This allows gf and :find to work. Fix path to your needs +setlocal suffixesadd=.lisp,cl path=/home/mikael/hacking/lisp/** + +" This allows [d [i [D [I work across files if an ASDF buffer is opened +" If I used load, it would be there too. +setlocal include=(:file\ + +"------------------------------------------------------------------- +" reset to previous values +"------------------------------------------------------------------- + +let s:save_cpo = &cpo +set cpo&vim + +let b:undo_ftplugin = "setlocal syntax< lisp< ls< bs< si< et< sw< " + \ . "ts< tw< complete< nocursorline< nocompatible< statusline< iskeyword< " + \ . "cpoptions< foldmethod< foldmarker< foldminlines< " + \ . "suffixesadd< path< include< " + +let &cpo = s:save_cpo +unlet s:save_cpo + + +"------------- boot! + +call LimpMode_start() + diff --git a/dot_vim/ftplugin/lisp/limp/sexp.vim b/dot_vim/ftplugin/lisp/limp/sexp.vim new file mode 100644 index 0000000..0dd5415 --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/sexp.vim @@ -0,0 +1,308 @@ +" +" limp/vim/sexp.vim +" +" URL: +" http://mikael.jansson.be/hacking +" +" Description: +" Things to help you out with s-exps. +" +" Version: +" 0.2 +" +" Date: +" 2008-04-20 +" +" Authors: +" Mikael Jansson +" +" Changelog: +" 2008-04-20 +" * Initial version. +" * Based on ViLisp.vim by Larry Clapp + +" Mark Top: mark visual block +nnoremap MarkTop 99[(V% + +" Format Current: reindent/format +" Format Top: +nnoremap FormatCurrent [(=%`' +nnoremap FormatTop 99[(=%`' + +" Sexp Wrap: wrap the current form in a list +" Sexp Peel: peel a list off the current form +nnoremap SexpWrap :call Cursor_push()[(%a)h%i(:call Cursor_pop() +nnoremap SexpPeel :call Cursor_push()[(:call Cursor_push()%x:call Cursor_pop()x:call Cursor_pop() + +" Sexp Previous: navigate to previous s-exp +" Sexp Next: navigate to previous s-exp +nnoremap SexpPrevious :call Sexp_Previous() +nnoremap SexpNext :call Sexp_Next() + +" Sexp Move Back: swap this and previous s-exp +" Sexp Move Forward: swap this and next s-exp +nnoremap SexpMoveBack :call Sexp_MoveBack() +nnoremap SexpMoveForward :call Sexp_MoveForward() + +" Sexp Comment: comment all the way from the top level +nnoremap SexpComment :call Cursor_push()99[(%a\|#hh%i#\|:call Cursor_pop() + +" Sexp Comment Current: comment current form +nnoremap SexpCommentCurrent :call Cursor_push()[(%a\|#hh%i#\|:call Cursor_pop() + + +"------------------------------------------------------------------- + +fun! Sexp_Next() + let [l, c] = Sexp_get_Next() + call cursor(l, c) +endfun + +fun! Sexp_Previous() + let [l, c] = Sexp_get_Previous() + if l == 0 && c == 0 + return + endif + call cursor(l, c) + return +endfun + +" return the position of the next s-exp +fun! Sexp_get_Next() + return searchpos('(', 'nW') +endfun + +" return the position of the previous s-exp +fun! Sexp_get_Previous() + let p = getpos(".") + + " If outside of *any* s-exps, move to the previous s-exp first. + let [l, c] = searchpairpos('(', '', ')', 'bnW') + if l == 0 && c == 0 + call searchpos(')', 'Wb') + endif + + " now, move to the start of this s-exp, wherever it may be. + let [l, c] = searchpos('(', 'Wnb') + + call setpos(".", p) + + return [l, c] +endfun + +"XXX: MoveBack/MoveForward share much code + +fun! Sexp_MoveBack() + " Inside an s-exp? + let [l, c] = searchpairpos('(', '', ')', 'bcnW') + if l == 0 || c == 0 + " Nope, + return + endif + + silent! let regs = @* + + " mark the start of this s-exp + silent! norm! yl + if @0 != "(" + call Sexp_Previous() + endif + + " + " Find out if the previous s-exp is the parent of the current + " + " This by searching to the previous s-exp, doing a % and checking either + " of the following conditions: + " + " * prev_line2 == this_line2 && prev_col2 > this_col2 + " * prev_line2 > this_line2 + " + " where prev_line2/prev_col2 = the ) of the previous match, and + " this_line2/this_col2 = the ) of the current s-exp. + " + + " so we can get back. + silent! norm! ma + let [b, this_line1, this_col1, o] = getpos('.') + + " where does the *current* s-exp end? + silent! norm! % + let [b, this_line2, this_col2, o] = getpos('.') + silent! norm! % + + " where does the previous s-exp end? + call Sexp_Previous() + silent! norm! mb + + let [b, prev_line1, prev_col1, o] = getpos('.') + silent! norm! % + let [b, prev_line2, prev_col2, o] = getpos('.') + + if (prev_line2 == this_line2 && prev_col2 > this_col2) || (prev_line2 > this_line2) + " For now, just do nothing + echom "Error: Trying to transpose s-exp backwards with parent." + silent! norm! `a + return + endif + + " -------------------------------------------------------- + + " get the s-exps + silent! norm! `a + silent! norm! "ayab + silent! norm! `b + silent! norm! "byab + + " copy and replace current s-exp with whitespace + let @c = Fill(" ", len(@b)) + let @d = Fill(" ", len(@a)) + + silent! norm! `a"_dab + silent! norm! `a"cP + + silent! norm! `b"_dab + silent! norm! `b"dP + + if this_line1 == prev_line1 + + let diff = len(@a) - len(@b) + if diff > 0 + let movement = ''.diff.'l' + elseif diff < 0 + let movement = ''.(-diff).'h' + else + let movement = '' + endif + + silent! norm! `b"aPl + silent! exe 'norm! '.len(@a).'x' + + silent! exe 'norm! `a'.movement.'"bPl' + silent! exe 'norm! '.len(@b).'x' + + silent! norm! `b + else + " different lines, so a simple paste will do + + silent! norm! `a"bP + silent! exe 'norm! l'.len(@a).'x' + silent! norm! `b"aP + silent! exe 'norm! l'.len(@b).'x' + silent! norm! `b + endif + + silent! let @* = regs +endfun + +fun! Sexp_MoveForward() + " Inside an s-exp? + let [l, c] = searchpairpos('(', '', ')', 'bcnW') + if l == 0 || c == 0 + " Nope, + return + endif + + silent! let regs = @* + + " mark the start of this s-exp + silent! norm! yl + if @0 != "(" + call Sexp_Previous() + endif + + " + " Find out if the next s-exp is the parent of the current. + " + " Search for the next ')', then see where the matching '(' ends. + " Check for any of the following conditions. + " + " * prev_line1 == this_line1 && prev_col1 < this_col1 + " * prev_line1 < this_line1 + " + " where prev_line1/prev_col1 = the ( of the previous match, and + " this_line1/this_col1 = the ( of the current s-exp. + " + + " so we can get back. + silent! norm! ma + let [b, this_line1, this_col1, o] = getpos('.') + + " where does the *current* s-exp end? + silent! norm! % + let [b, this_line2, this_col2, o] = getpos('.') + + " where does the next s-exp end? + call search(')', 'W') + + let [b, prev_line2, prev_col2, o] = getpos('.') + silent! norm! % + + silent! norm! mb + let [b, prev_line1, prev_col1, o] = getpos('.') + + if (prev_line1 == this_line1 && prev_col1 < this_col1) || (prev_line1 < this_line1) + " For now, just do nothing + echom "Error: Trying to transpose s-exp forward with parent." + silent! norm! `a + return + endif + + " -------------------------------------------------------- + + " get the s-exps + silent! norm! `a + silent! norm! "ayab + silent! norm! `b + silent! norm! "byab + + " copy and replace current s-exp with whitespace + let @c = Fill(" ", len(@b)) + let @d = Fill(" ", len(@a)) + + silent! norm! `b"_dab + silent! norm! `b"dP + + silent! norm! `a"_dab + silent! norm! `a"cP + + if this_line1 == prev_line1 + + let diff = len(@a) - len(@b) + if diff > 0 + let movement = ''.diff.'h' + elseif diff < 0 + let movement = ''.(-diff).'l' + else + let movement = '' + endif + + silent! norm! `a"bPl + silent! exe 'norm! '.len(@b).'x' + + silent! exe 'norm! `b'.movement.'"aPl' + silent! exe 'norm! '.len(@a).'x' + + silent! exe 'norm! `b'.movement + else + " different lines, so a simple paste will do + + silent! norm! `a"bP + silent! exe 'norm! l'.len(@a).'x' + silent! norm! `b"aP + silent! exe 'norm! l'.len(@b).'x' + silent! norm! `b + endif + + silent! let @* = regs +endfun + +fun! Fill(c, n) + let s = "" + let n = a:n + while n > 0 + let s = s.a:c + let n = n-1 + endwhile + return s +endfun + diff --git a/dot_vim/ftplugin/lisp/limp/thesaurus b/dot_vim/ftplugin/lisp/limp/thesaurus new file mode 100644 index 0000000..94a3ca9 --- /dev/null +++ b/dot_vim/ftplugin/lisp/limp/thesaurus @@ -0,0 +1,1339 @@ +&aux +&key +acos +aref +asin +atan +atom +byte +caar +cadr +case +cdar +cddr +char +cond +cons +cosh +decf +endp +eval +expt +fill +find +flet +getf +incf +last +let* +list +load +loop +mapc +mapl +null +oddp +open +prog +push +read +real +remf +rest +room +sbit +setf +setq +sinh +some +sort +sqrt +step +tanh +time +type +warn +when +&body +&rest +abort +acons +acosh +apply +array +asinh +assoc +atanh +block +boole +break +caaar +caadr +cadar +caddr +catch +ccase +cdaar +cdadr +cddar +cdddr +char< +char= +char> +class +close +consp +count +debug +defun +ecase +equal +error +evenp +every +fifth +first +float +floor +ftype +isqrt +ldiff +list* +listp +merge +nconc +ninth +phase +plusp +prin1 +princ +print +prog* +prog1 +prog2 +progn +progv +psetf +psetq +quote +ratio +realp +round +schar +sixth +sleep +space +speed +subst +svref +tailp +tenth +third +throw +trace +typep +union +write +zerop +&whole +adjoin +append +arrayp +assert +bignum +boundp +caaaar +caaadr +caadar +caaddr +cadaar +cadadr +caddar +cadddr +cdaaar +cdaadr +cdadar +cdaddr +cddaar +cddadr +cdddar +cddddr +cerror +char/= +char<= +char>= +coerce +defvar +delete +dolist +eighth +equalp +export +ffloor +fixnum +floatp +format +fourth +fround +gensym +ignore +import +inline +intern +labels +lambda +length +listen +logand +logeqv +logior +lognor +lognot +logxor +mapcan +mapcar +mapcon +member +method +minusp +notany +nsubst +nthcdr +number +nunion +pprint +random +rassoc +reduce +remove +return +rplaca +rplacd +safety +search +second +shadow +shiftf +signal +signum +stream +string +sublis +subseq +sxhash +symbol +terpri +unless +values +vector +apropos +bit-and +bit-eqv +bit-ior +bit-nor +bit-not +bit-xor +boole-1 +boole-2 +boolean +butlast +ceiling +clrhash +compile +complex +declaim +declare +defsetf +deftype +dotimes +dribble +fboundp +find-if +funcall +gentemp +gethash +inspect +integer +keyword +locally +logbitp +lognand +logorc1 +logorc2 +logtest +maphash +maplist +nreconc +nsublis +numberp +package +pairlis +provide +pushnew +remhash +remprop +replace +require +restart +reverse +rotatef +seventh +special +streamp +string< +string= +string> +stringp +subsetp +symbolp +tagbody +type-of +untrace +vectorp +warning +assoc-if +bit-nand +bit-orc1 +bit-orc2 +boole-c1 +boole-c2 +char-int +class-of +complexp +continue +copy-seq +count-if +defclass +defmacro +describe +fceiling +function +identity +imagpart +integerp +keywordp +ldb-test +logandc1 +logandc2 +logcount +macrolet +map-into +mismatch +nbutlast +notevery +nreverse +optimize +packagep +pathname +position +proclaim +rational +realpart +sequence +standard +string/= +string<= +string>= +subst-if +subtypep +truename +truncate +typecase +unexport +unintern +variable +y-or-n-p +&optional +*modules* +*package* +base-char +bit-andc1 +bit-andc2 +boole-and +boole-clr +boole-eqv +boole-ior +boole-nor +boole-set +boole-xor +byte-size +char-code +char-name +character +code-char +condition +conjugate +constantp +copy-list +copy-tree +ctypecase +defmethod +defstruct +delete-if +directory +etypecase +eval-when +formatter +ftruncate +functionp +ignorable +make-list +member-if +name-char +notinline +nsubst-if +nth-value +numerator +otherwise +pathnamep +peek-char +rassoc-if +rationalp +read-byte +read-char +read-line +readtable +remove-if +revappend +satisfies +structure +use-value +*debug-io* +*features* +*query-io* +add-method +array-rank +bit-vector +boole-nand +boole-orc1 +boole-orc2 +cell-error +char-equal +char-lessp +characterp +check-type +class-name +complement +constantly +copy-alist +defgeneric +defpackage +digit-char +do-symbols +file-error +find-class +float-sign +fresh-line +hash-table +in-package +long-float +make-array +makunbound +mask-field +namestring +pprint-pop +pprint-tab +probe-file +readtablep +slot-value +substitute +tree-equal +type-error +vector-pop +with-slots +write-byte +write-char +write-line +*read-base* +*read-eval* +*readtable* +base-string +boole-andc1 +boole-andc2 +both-case-p +call-method +char-upcase +clear-input +concatenate +copy-symbol +declaration +defconstant +delete-file +denominator +disassemble +echo-stream +end-of-file +fdefinition +file-author +file-length +file-stream +find-if-not +find-method +find-symbol +float-radix +fmakunbound +list-length +loop-finish +macroexpand +make-method +make-string +make-symbol +nsubstitute +parse-error +position-if +pprint-fill +rationalize +rename-file +return-from +scale-float +short-float +signed-byte +slot-boundp +stable-sort +store-value +string-trim +symbol-name +unread-char +use-package +values-list +vector-push +yes-or-no-p +&environment +*load-print* +*print-base* +*print-case* +adjust-array +alpha-char-p +apropos-list +assoc-if-not +bit-vector-p +change-class +clear-output +compile-file +count-if-not +decode-float +defparameter +digit-char-p +double-float +fill-pointer +find-package +find-restart +float-digits +force-output +handler-bind +handler-case +hash-table-p +intersection +lower-case-p +machine-type +make-package +package-name +print-object +random-state +reader-error +restart-bind +restart-case +restart-name +simple-array +simple-error +single-float +slot-missing +slot-unbound +stream-error +string-equal +string-lessp +subst-if-not +symbol-plist +symbol-value +unbound-slot +upper-case-p +write-string +*print-array* +*print-level* +*print-lines* +*print-radix* +*terminal-io* +alphanumericp +byte-position +char-downcase +char-greaterp +control-error +delete-if-not +deposit-field +documentation +extended-char +file-position +finish-output +ignore-errors +macroexpand-1 +make-instance +make-pathname +make-sequence +member-if-not +next-method-p +nintersection +nsubst-if-not +open-stream-p +package-error +parse-integer +pathname-host +pathname-name +pathname-type +pprint-indent +pprint-linear +program-error +rassoc-if-not +read-sequence +remove-if-not +remove-method +simple-string +simple-vector +slot-exists-p +software-type +standard-char +string-stream +string-upcase +style-warning +substitute-if +unsigned-byte +unuse-package +*error-output* +*load-verbose* +*print-circle* +*print-escape* +*print-gensym* +*print-length* +*print-pretty* +*random-state* +*trace-output* +built-in-class +char-not-equal +char-not-lessp +compiler-macro +copy-readtable +copy-structure +delete-package +do-all-symbols +dynamic-extent +get-properties +graphic-char-p +input-stream-p +integer-length +invoke-restart +long-site-name +macro-function +make-condition +make-load-form +muffle-warning +no-next-method +nstring-upcase +nsubstitute-if +pprint-newline +pprint-tabular +random-state-p +readtable-case +rename-package +row-major-aref +set-difference +simple-warning +standard-class +symbol-package +synonym-stream +two-way-stream +unwind-protect +with-accessors +with-open-file +write-sequence +*compile-print* +*debugger-hook* +*load-pathname* +*load-truename* +*read-suppress* +array-dimension +cell-error-name +char-code-limit +describe-object +file-namestring +file-write-date +float-precision +hash-table-size +hash-table-test +host-namestring +invoke-debugger +load-time-value +machine-version +make-hash-table +merge-pathnames +nset-difference +output-stream-p +pathname-device +position-if-not +pprint-dispatch +prin1-to-string +princ-to-string +short-site-name +simple-string-p +simple-vector-p +slot-makunbound +standard-char-p +standard-method +standard-object +string-downcase +string-greaterp +structure-class +symbol-function +symbol-macrolet +wild-pathname-p +write-to-string +*gensym-counter* +*print-readably* +*standard-input* +arithmetic-error +array-dimensions +array-rank-limit +array-total-size +broadcast-stream +call-next-method +compute-restarts +define-condition +division-by-zero +find-all-symbols +generic-function +get-decoded-time +hash-table-count +logical-pathname +machine-instance +make-echo-stream +nstring-downcase +package-use-list +parse-namestring +pathname-match-p +pathname-version +read-from-string +set-exclusive-or +shadowing-import +simple-condition +software-version +string-left-trim +string-not-equal +string-not-lessp +structure-object +type-error-datum +unbound-variable +with-open-stream +&allow-other-keys +*compile-verbose* +*standard-output* +allocate-instance +array-in-bounds-p +char-not-greaterp +compilation-speed +compiled-function +delete-duplicates +enough-namestring +function-keywords +list-all-packages +make-random-state +method-qualifiers +nset-exclusive-or +package-nicknames +read-char-no-hang +remove-duplicates +serious-condition +shared-initialize +simple-bit-vector +simple-type-error +storage-condition +string-capitalize +string-right-trim +substitute-if-not +*break-on-signals* +*macroexpand-hook* +adjustable-array-p +array-displacement +array-element-type +destructuring-bind +file-string-length +get-setf-expansion +get-universal-time +long-float-epsilon +method-combination +nstring-capitalize +nsubstitute-if-not +pathname-directory +print-not-readable +simple-base-string +special-operator-p +translate-pathname +undefined-function +vector-push-extend +*print-miser-width* +compiled-function-p +concatenated-stream +define-modify-macro +define-symbol-macro +do-external-symbols +file-error-pathname +get-macro-character +initialize-instance +make-synonym-stream +make-two-way-stream +multiple-value-bind +multiple-value-call +multiple-value-list +multiple-value-setq +read-delimited-list +set-macro-character +set-pprint-dispatch +short-float-epsilon +simple-bit-vector-p +stream-element-type +stream-error-stream +string-not-greaterp +with-simple-restart +*print-right-margin* +call-arguments-limit +copy-pprint-dispatch +define-setf-expander +directory-namestring +double-float-epsilon +integer-decode-float +interactive-stream-p +invalid-method-error +lambda-list-keywords +most-negative-fixnum +most-positive-fixnum +multiple-value-prog1 +no-applicable-method +package-used-by-list +pprint-logical-block +set-syntax-from-char +single-float-epsilon +array-dimension-limit +array-row-major-index +compile-file-pathname +decode-universal-time +define-compiler-macro +encode-universal-time +get-internal-run-time +make-broadcast-stream +multiple-values-limit +package-error-package +reinitialize-instance +synonym-stream-symbol +unbound-slot-instance +user-homedir-pathname +with-compilation-unit +with-output-to-string +with-package-iterator +array-total-size-limit +floating-point-inexact +get-internal-real-time +hash-table-rehash-size +stream-external-format +with-input-from-string +*compile-file-pathname* +*compile-file-truename* +*print-pprint-dispatch* +compiler-macro-function +ensure-generic-function +floating-point-overflow +lambda-parameters-limit +make-instances-obsolete +print-unreadable-object +with-condition-restarts +with-standard-io-syntax +array-has-fill-pointer-p +broadcast-stream-streams +echo-stream-input-stream +ensure-directories-exist +floating-point-underflow +get-output-stream-string +lisp-implementation-type +make-concatenated-stream +make-string-input-stream +method-combination-error +most-negative-long-float +most-positive-long-float +type-error-expected-type +with-hash-table-iterator +arithmetic-error-operands +define-method-combination +echo-stream-output-stream +least-negative-long-float +least-positive-long-float +make-string-output-stream +most-negative-short-float +most-positive-short-float +package-shadowing-symbols +print-not-readable-object +standard-generic-function +arithmetic-error-operation +compute-applicable-methods +function-lambda-expression +least-negative-short-float +least-positive-short-float +most-negative-double-float +most-negative-single-float +most-positive-double-float +most-positive-single-float +read-preserving-whitespace +translate-logical-pathname +upgraded-complex-part-type +*default-pathname-defaults* +*read-default-float-format* +concatenated-stream-streams +hash-table-rehash-threshold +least-negative-double-float +least-negative-single-float +least-positive-double-float +least-positive-single-float +lisp-implementation-version +long-float-negative-epsilon +make-load-form-saving-slots +two-way-stream-input-stream +upgraded-array-element-type +get-dispatch-macro-character +invoke-restart-interactively +set-dispatch-macro-character +short-float-negative-epsilon +two-way-stream-output-stream +double-float-negative-epsilon +logical-pathname-translations +make-dispatch-macro-character +pprint-exit-if-list-exhausted +single-float-negative-epsilon +internal-time-units-per-second +simple-condition-format-control +floating-point-invalid-operation +simple-condition-format-arguments +load-logical-pathname-translations +update-instance-for-different-class +update-instance-for-redefined-class +least-negative-normalized-long-float +least-positive-normalized-long-float +least-negative-normalized-short-float +least-positive-normalized-short-float +least-negative-normalized-double-float +least-negative-normalized-single-float +least-positive-normalized-double-float +least-positive-normalized-single-float +&a-o-k &allow-other-keys +*b-o-s *break-on-signals* +*c-f-p *compile-file-pathname* +*c-f-t *compile-file-truename* +*c-p *compile-print* +*c-v *compile-verbose* +*d-h *debugger-hook* +*d-i *debug-io* +*d-p-d *default-pathname-defaults* +*e-o *error-output* +*g-c *gensym-counter* +*l-p *load-print* *load-pathname* +*l-t *load-truename* +*l-v *load-verbose* +*m-h *macroexpand-hook* +*p-a *print-array* +*p-b *print-base* +*p-c *print-case* *print-circle* +*p-e *print-escape* +*p-g *print-gensym* +*p-l *print-level* *print-lines* *print-length* +*p-m-w *print-miser-width* +*p-p *print-pretty* +*p-p-d *print-pprint-dispatch* +*p-r *print-radix* *print-readably* +*p-r-m *print-right-margin* +*q-i *query-io* +*r-b *read-base* +*r-d-f-f *read-default-float-format* +*r-e *read-eval* +*r-s *random-state* *read-suppress* +*s-i *standard-input* +*s-o *standard-output* +*t-i *terminal-io* +*t-o *trace-output* +a-a adjust-array +a-a-p adjustable-array-p +a-c-p alpha-char-p +a-d array-dimension array-dimensions array-displacement +a-d-l array-dimension-limit +a-e arithmetic-error +a-e-o arithmetic-error-operands arithmetic-error-operation +a-e-t array-element-type +a-h-f-p-p array-has-fill-pointer-p +a-i assoc-if allocate-instance +a-i-b-p array-in-bounds-p +a-i-n assoc-if-not +a-l apropos-list +a-m add-method +a-o-k &allow-other-keys +a-r array-rank +a-r-l array-rank-limit +a-r-m-i array-row-major-index +a-t-s array-total-size +a-t-s-l array-total-size-limit +b-1 boole-1 +b-2 boole-2 +b-a bit-and bit-andc1 bit-andc2 boole-and boole-andc1 boole-andc2 +b-c boole-c1 boole-c2 base-char boole-clr +b-c-p both-case-p +b-e bit-eqv boole-eqv +b-i bit-ior boole-ior +b-i-c built-in-class +b-n bit-nor bit-not bit-nand boole-nor boole-nand +b-o bit-orc1 bit-orc2 boole-orc1 boole-orc2 +b-o-s *break-on-signals* +b-p byte-position +b-s boole-set byte-size base-string broadcast-stream +b-s-s broadcast-stream-streams +b-v bit-vector +b-v-p bit-vector-p +b-x bit-xor boole-xor +c-a copy-alist +c-a-l call-arguments-limit +c-a-m compute-applicable-methods +c-c char-code code-char change-class +c-c-l char-code-limit +c-d char-downcase +c-e cell-error char-equal control-error +c-e-n cell-error-name +c-f compile-file compiled-function +c-f-p compiled-function-p compile-file-pathname *compile-file-pathname* +c-f-t *compile-file-truename* +c-g char-greaterp +c-i char-int count-if clear-input +c-i-n count-if-not +c-l copy-list char-lessp +c-m call-method compiler-macro +c-m-f compiler-macro-function +c-n char-name class-name +c-n-e char-not-equal +c-n-g char-not-greaterp +c-n-l char-not-lessp +c-n-m call-next-method +c-o class-of clear-output +c-p *compile-print* +c-p-d copy-pprint-dispatch +c-r copy-readtable compute-restarts +c-s copy-seq copy-symbol copy-structure compilation-speed concatenated-stream +c-s-s concatenated-stream-streams +c-t copy-tree check-type +c-u char-upcase +c-v *compile-verbose* +d-a-s do-all-symbols +d-b destructuring-bind +d-b-z division-by-zero +d-c digit-char define-condition +d-c-m define-compiler-macro +d-c-p digit-char-p +d-d delete-duplicates +d-e dynamic-extent +d-e-s do-external-symbols +d-f delete-file decode-float double-float deposit-field +d-f-e double-float-epsilon +d-f-n-e double-float-negative-epsilon +d-h *debugger-hook* +d-i delete-if *debug-io* +d-i-n delete-if-not +d-m-c define-method-combination +d-m-m define-modify-macro +d-n directory-namestring +d-o describe-object +d-p delete-package +d-p-d *default-pathname-defaults* +d-s do-symbols +d-s-e define-setf-expander +d-s-m define-symbol-macro +d-u-t decode-universal-time +e-c extended-char +e-d-e ensure-directories-exist +e-g-f ensure-generic-function +e-n enough-namestring +e-o *error-output* +e-o-f end-of-file +e-s echo-stream +e-s-i-s echo-stream-input-stream +e-s-o-s echo-stream-output-stream +e-u-t encode-universal-time +e-w eval-when +f-a file-author +f-a-s find-all-symbols +f-c find-class +f-d float-digits +f-e file-error +f-e-p file-error-pathname +f-i find-if +f-i-n find-if-not +f-k function-keywords +f-l fresh-line file-length +f-l-e function-lambda-expression +f-m find-method +f-n file-namestring +f-o force-output finish-output +f-p fill-pointer find-package file-position float-precision +f-p-i floating-point-inexact +f-p-i-o floating-point-invalid-operation +f-p-o floating-point-overflow +f-p-u floating-point-underflow +f-r float-radix find-restart +f-s float-sign file-stream find-symbol +f-s-l file-string-length +f-w-d file-write-date +g-c *gensym-counter* +g-c-p graphic-char-p +g-d-m-c get-dispatch-macro-character +g-d-t get-decoded-time +g-f generic-function +g-i-r-t get-internal-run-time get-internal-real-time +g-m-c get-macro-character +g-o-s-s get-output-stream-string +g-p get-properties +g-s-e get-setf-expansion +g-u-t get-universal-time +h-b handler-bind +h-c handler-case +h-n host-namestring +h-t hash-table +h-t-c hash-table-count +h-t-p hash-table-p +h-t-r-s hash-table-rehash-size +h-t-r-t hash-table-rehash-threshold +h-t-s hash-table-size +h-t-t hash-table-test +i-d invoke-debugger +i-d-f integer-decode-float +i-e ignore-errors +i-i initialize-instance +i-l integer-length +i-m-e invalid-method-error +i-p in-package +i-r invoke-restart +i-r-i invoke-restart-interactively +i-s-p input-stream-p interactive-stream-p +i-t-u-p-s internal-time-units-per-second +l-a-p list-all-packages +l-c-p lower-case-p +l-f long-float loop-finish +l-f-e long-float-epsilon +l-f-n-e long-float-negative-epsilon +l-i-t lisp-implementation-type +l-i-v lisp-implementation-version +l-l list-length +l-l-k lambda-list-keywords +l-l-p-t load-logical-pathname-translations +l-n-d-f least-negative-double-float +l-n-l-f least-negative-long-float +l-n-n-d-f least-negative-normalized-double-float +l-n-n-l-f least-negative-normalized-long-float +l-n-n-s-f least-negative-normalized-short-float least-negative-normalized-single-float +l-n-s-f least-negative-short-float least-negative-single-float +l-p *load-print* *load-pathname* logical-pathname +l-p-d-f least-positive-double-float +l-p-l lambda-parameters-limit +l-p-l-f least-positive-long-float +l-p-n-d-f least-positive-normalized-double-float +l-p-n-l-f least-positive-normalized-long-float +l-p-n-s-f least-positive-normalized-short-float least-positive-normalized-single-float +l-p-s-f least-positive-short-float least-positive-single-float +l-p-t logical-pathname-translations +l-s-n long-site-name +l-t ldb-test *load-truename* +l-t-v load-time-value +l-v *load-verbose* +m-1 macroexpand-1 +m-a make-array +m-b-s make-broadcast-stream +m-c make-condition method-combination +m-c-e method-combination-error +m-c-s make-concatenated-stream +m-d-m-c make-dispatch-macro-character +m-e-s make-echo-stream +m-f mask-field macro-function +m-h *macroexpand-hook* +m-h-t make-hash-table +m-i map-into member-if make-instance machine-instance +m-i-n member-if-not +m-i-o make-instances-obsolete +m-l make-list +m-l-f make-load-form +m-l-f-s-s make-load-form-saving-slots +m-m make-method +m-n-d-f most-negative-double-float +m-n-f most-negative-fixnum +m-n-l-f most-negative-long-float +m-n-s-f most-negative-short-float most-negative-single-float +m-p make-package make-pathname merge-pathnames +m-p-d-f most-positive-double-float +m-p-f most-positive-fixnum +m-p-l-f most-positive-long-float +m-p-s-f most-positive-short-float most-positive-single-float +m-q method-qualifiers +m-r-s make-random-state +m-s make-string make-symbol make-sequence +m-s-i-s make-string-input-stream +m-s-o-s make-string-output-stream +m-s-s make-synonym-stream +m-t machine-type +m-t-w-s make-two-way-stream +m-v machine-version +m-v-b multiple-value-bind +m-v-c multiple-value-call +m-v-l multiple-value-list multiple-values-limit +m-v-p multiple-value-prog1 +m-v-s multiple-value-setq +m-w muffle-warning +n-a-m no-applicable-method +n-c name-char nstring-capitalize +n-d nset-difference nstring-downcase +n-e-o nset-exclusive-or +n-i nsubst-if nsubstitute-if +n-i-n nsubst-if-not nsubstitute-if-not +n-m-p next-method-p +n-n-m no-next-method +n-u nstring-upcase +n-v nth-value +o-s-p open-stream-p output-stream-p +p-a *print-array* +p-b *print-base* +p-c peek-char *print-case* *print-circle* +p-d pathname-device pprint-dispatch pathname-directory +p-e parse-error package-error program-error *print-escape* +p-e-i-l-e pprint-exit-if-list-exhausted +p-e-p package-error-package +p-f probe-file pprint-fill +p-g *print-gensym* +p-h pathname-host +p-i position-if parse-integer pprint-indent +p-i-n position-if-not +p-l *print-level* *print-lines* pprint-linear *print-length* +p-l-b pprint-logical-block +p-m-p pathname-match-p +p-m-w *print-miser-width* +p-n package-name pathname-name pprint-newline parse-namestring package-nicknames +p-n-r print-not-readable +p-n-r-o print-not-readable-object +p-o print-object +p-p pprint-pop *print-pretty* +p-p-d *print-pprint-dispatch* +p-r *print-radix* *print-readably* +p-r-m *print-right-margin* +p-s-s package-shadowing-symbols +p-t pprint-tab pathname-type pprint-tabular +p-t-s prin1-to-string princ-to-string +p-u-b-l package-used-by-list +p-u-l package-use-list +p-u-o print-unreadable-object +p-v pathname-version +q-i *query-io* +r-b read-byte *read-base* restart-bind +r-c read-char restart-case readtable-case +r-c-n-h read-char-no-hang +r-d remove-duplicates +r-d-f-f *read-default-float-format* +r-d-l read-delimited-list +r-e *read-eval* reader-error +r-f rename-file return-from +r-f-s read-from-string +r-i rassoc-if remove-if reinitialize-instance +r-i-n rassoc-if-not remove-if-not +r-l read-line +r-m remove-method +r-m-a row-major-aref +r-n restart-name +r-p rename-package +r-p-w read-preserving-whitespace +r-s random-state read-sequence *random-state* *read-suppress* +r-s-p random-state-p +s-a simple-array +s-b signed-byte slot-boundp +s-b-s simple-base-string +s-b-v simple-bit-vector +s-b-v-p simple-bit-vector-p +s-c standard-char standard-class structure-class simple-condition serious-condition storage-condition string-capitalize +s-c-f-a simple-condition-format-arguments +s-c-f-c simple-condition-format-control +s-c-p standard-char-p +s-d set-difference string-downcase +s-d-m-c set-dispatch-macro-character +s-e simple-error stream-error string-equal +s-e-f stream-external-format +s-e-o set-exclusive-or +s-e-p slot-exists-p +s-e-s stream-error-stream +s-e-t stream-element-type +s-f scale-float short-float single-float symbol-function +s-f-e short-float-epsilon single-float-epsilon +s-f-n-e short-float-negative-epsilon single-float-negative-epsilon +s-g string-greaterp +s-g-f standard-generic-function +s-i subst-if substitute-if *standard-input* shadowing-import shared-initialize +s-i-n subst-if-not substitute-if-not +s-l string-lessp +s-l-t string-left-trim +s-m slot-missing slot-makunbound standard-method symbol-macrolet +s-m-c set-macro-character +s-n symbol-name +s-n-e string-not-equal +s-n-g string-not-greaterp +s-n-l string-not-lessp +s-o standard-object structure-object *standard-output* +s-o-p special-operator-p +s-p symbol-plist symbol-package +s-p-d set-pprint-dispatch +s-r-t string-right-trim +s-s stable-sort simple-string string-stream synonym-stream +s-s-f-c set-syntax-from-char +s-s-n short-site-name +s-s-p simple-string-p +s-s-s synonym-stream-symbol +s-t string-trim software-type +s-t-e simple-type-error +s-u slot-unbound string-upcase +s-v slot-value store-value symbol-value simple-vector software-version +s-v-p simple-vector-p +s-w style-warning simple-warning +t-e tree-equal type-error +t-e-d type-error-datum +t-e-e-t type-error-expected-type +t-i *terminal-io* +t-l-p translate-logical-pathname +t-o type-of *trace-output* +t-p translate-pathname +t-w-s two-way-stream +t-w-s-i-s two-way-stream-input-stream +t-w-s-o-s two-way-stream-output-stream +u-a-e-t upgraded-array-element-type +u-b unsigned-byte +u-c unread-char +u-c-p upper-case-p +u-c-p-t upgraded-complex-part-type +u-f undefined-function +u-h-p user-homedir-pathname +u-i-f-d-c update-instance-for-different-class +u-i-f-r-c update-instance-for-redefined-class +u-p use-package unuse-package unwind-protect +u-s unbound-slot +u-s-i unbound-slot-instance +u-v use-value unbound-variable +v-l values-list +v-p vector-pop vector-push +v-p-e vector-push-extend +w-a with-accessors +w-b write-byte +w-c write-char +w-c-r with-condition-restarts +w-c-u with-compilation-unit +w-h-t-i with-hash-table-iterator +w-i-f-s with-input-from-string +w-l write-line +w-o-f with-open-file +w-o-s with-open-stream +w-o-t-s with-output-to-string +w-p-i with-package-iterator +w-p-p wild-pathname-p +w-s with-slots write-string write-sequence +w-s-i-s with-standard-io-syntax +w-s-r with-simple-restart +w-t-s write-to-string +y-o-n-p y-or-n-p yes-or-no-p diff --git a/dot_vim/gvimrc b/dot_vim/gvimrc new file mode 100644 index 0000000..35d703f --- /dev/null +++ b/dot_vim/gvimrc @@ -0,0 +1,5 @@ +runtime vimrc + +set gfn=Source\ Code\ Pro\ 9 +set go-=T + diff --git a/dot_vim/indent/cpp.vim b/dot_vim/indent/cpp.vim new file mode 100644 index 0000000..8609692 --- /dev/null +++ b/dot_vim/indent/cpp.vim @@ -0,0 +1,43 @@ +" Vim indent file +" Language: C++ +" Maintainer: Charles Banas +" Last Change: 2010 May 27 +" Version: 1.0.1 + +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +function! GreyfadeCppIndent() + let l:cline_num = line('.') + let l:pline_num = prevnonblank(l:cline_num - 1) + let l:pline = getline(l:pline_num) + while l:pline =~# '\(^\s*{\s*\|^\s*//\|^\s*/\*\|\*/\s*$\)' + let l:pline_num = prevnonblank(l:pline_num - 1) + let l:pline = getline(l:pline_num) + endwhile + let l:retv = cindent('.') + if l:pline =~# '^\s*template.*' + let l:retv = cindent(l:pline_num) + elseif l:pline =~# '^\s*namespace.*' + let l:retv = 0 + endif + + return l:retv +endfunction + +setlocal shiftwidth=4 +setlocal tabstop=4 +setlocal softtabstop=4 +setlocal noexpandtab +setlocal textwidth=80 +setlocal nowrap + +setlocal cindent +setlocal cinoptions=l1,g0,t0,i6,+6,(0,w1,W6 + +setlocal indentexpr=GreyfadeCppIndent() + +let b:undo_indent = "setl sw< ts< sts< et< tw< wrap< cin< cino< inde<" + diff --git a/dot_vim/init.vim b/dot_vim/init.vim new file mode 100644 index 0000000..8a14ef1 --- /dev/null +++ b/dot_vim/init.vim @@ -0,0 +1 @@ +runtime vimrc diff --git a/dot_vim/plugged/ale/Dockerfile b/dot_vim/plugged/ale/Dockerfile new file mode 100644 index 0000000..2985ecc --- /dev/null +++ b/dot_vim/plugged/ale/Dockerfile @@ -0,0 +1,27 @@ +FROM testbed/vim:24 + +RUN install_vim -tag v8.0.0027 -build \ + -tag v9.0.0297 -build \ + -tag neovim:v0.2.0 -build \ + -tag neovim:v0.8.0 -build + +ENV PACKAGES="\ + bash \ + git \ + python2 \ + python3 \ + py3-pip \ + grep \ + sed \ +" +RUN apk --update add $PACKAGES && \ + rm -rf /var/cache/apk/* /tmp/* /var/tmp/* + +RUN pip install vim-vint==0.3.21 + +RUN git clone https://github.com/junegunn/vader.vim vader && \ + cd vader && git checkout c6243dd81c98350df4dec608fa972df98fa2a3af + +ARG GIT_VERSION +LABEL Version=${GIT_VERSION} +LABEL Name=denseanalysis/ale diff --git a/dot_vim/plugged/ale/LICENSE b/dot_vim/plugged/ale/LICENSE new file mode 100644 index 0000000..584cc5b --- /dev/null +++ b/dot_vim/plugged/ale/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2016-2023, Dense Analysis +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/dot_vim/plugged/ale/README.md b/dot_vim/plugged/ale/README.md new file mode 100644 index 0000000..0236944 --- /dev/null +++ b/dot_vim/plugged/ale/README.md @@ -0,0 +1,963 @@ +# Asynchronous Lint Engine [![GitHub Build Status](https://github.com/dense-analysis/ale/workflows/CI/badge.svg)](https://github.com/dense-analysis/ale/actions?query=event%3Apush+workflow%3ACI+branch%3Amaster++) [![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/r0ef1xu8xjmik58d/branch/master?svg=true)](https://ci.appveyor.com/project/dense-analysis/ale) [![Join the Dense Analysis Discord server](https://img.shields.io/badge/chat-Discord-5865F2)](https://discord.gg/5zFD6pQxDk) + + +![ALE Logo by Mark Grealish - https://www.bhalash.com/](https://user-images.githubusercontent.com/3518142/59195920-2c339500-8b85-11e9-9c22-f6b7f69637b8.jpg) + +ALE (Asynchronous Lint Engine) is a plugin providing linting (syntax checking +and semantic errors) in NeoVim 0.2.0+ and Vim 8 while you edit your text files, +and acts as a Vim [Language Server Protocol](https://langserver.org/) client. + + + +ALE makes use of NeoVim and Vim 8 job control functions and timers to +run linters on the contents of text buffers and return errors as +text is changed in Vim. This allows for displaying warnings and +errors in files being edited in Vim before files have been saved +back to a filesystem. + +In other words, this plugin allows you to lint while you type. + +ALE offers support for fixing code with command line tools in a non-blocking +manner with the `:ALEFix` feature, supporting tools in many languages, like +`prettier`, `eslint`, `autopep8`, and more. + +ALE acts as a "language client" to support a variety of Language Server Protocol +features, including: + +* Diagnostics (via Language Server Protocol linters) +* Go To Definition (`:ALEGoToDefinition`) +* Completion (Built in completion support, or with Deoplete) +* Finding references (`:ALEFindReferences`) +* Hover information (`:ALEHover`) +* Symbol search (`:ALESymbolSearch`) + +If you don't care about Language Server Protocol, ALE won't load any of the code +for working with it unless needed. One of ALE's general missions is that you +won't pay for the features that you don't use. + +**Help Wanted:** If you would like to help maintain this plugin by managing the +many issues and pull requests that are submitted, please send the author an +email at [dev@w0rp.com](mailto:dev@w0rp.com?subject=Helping%20with%20ALE). + +If you enjoy this plugin, feel free to contribute or check out the author's +other content at [w0rp.com](https://w0rp.com). + +## Table of Contents + +1. [Supported Languages and Tools](#supported-languages) +2. [Usage](#usage) + 1. [Linting](#usage-linting) + 2. [Fixing](#usage-fixing) + 3. [Completion](#usage-completion) + 4. [Go To Definition](#usage-go-to-definition) + 5. [Find References](#usage-find-references) + 6. [Hovering](#usage-hover) + 7. [Symbol Search](#usage-symbol-search) + 8. [Refactoring: Rename, Actions](#usage-refactoring) +3. [Installation](#installation) + 1. [Installation with Vim package management](#standard-installation) + 2. [Installation with Pathogen](#installation-with-pathogen) + 3. [Installation with Vundle](#installation-with-vundle) + 4. [Installation with Vim-Plug](#installation-with-vim-plug) +4. [Contributing](#contributing) +5. [FAQ](#faq) + 1. [How do I disable particular linters?](#faq-disable-linters) + 2. [How can I see what ALE has configured for the current file?](#faq-get-info) + 3. [How can I use ALE and coc.nvim together?](#faq-coc-nvim) + 4. [How can I keep the sign gutter open?](#faq-keep-signs) + 5. [How can I change the signs ALE uses?](#faq-change-signs) + 6. [How can I change or disable the highlights ALE uses?](#faq-change-highlights) + 7. [How can I show errors or warnings in my statusline?](#faq-statusline) + 8. [How can I show errors or warnings in my lightline?](#faq-lightline) + 9. [How can I change the format for echo messages?](#faq-echo-format) + 10. [How can I execute some code when ALE starts or stops linting?](#faq-autocmd) + 11. [How can I navigate between errors quickly?](#faq-navigation) + 12. [How can I run linters only when I save files?](#faq-lint-on-save) + 13. [How can I use the quickfix list instead of the loclist?](#faq-quickfix) + 14. [How can I check JSX files with both stylelint and eslint?](#faq-jsx-stylelint-eslint) + 15. [How can I check Vue files with ESLint?](#faq-vue-eslint) + 16. [Will this plugin eat all of my laptop battery power?](#faq-my-battery-is-sad) + 17. [How can I configure my C or C++ project?](#faq-c-configuration) + 18. [How can I configure ALE differently for different buffers?](#faq-buffer-configuration) + 19. [How can I configure the height of the list in which ALE displays errors?](#faq-list-window-height) + 20. [How can I run linters or fixers via Docker or a VM?](#faq-vm) + 21. [How can I change the borders for floating preview windows?](#faq-window-borders) + 22. [How can I use ALE and vim-lsp together?](#faq-vim-lsp) + + + +## 1. Supported Languages and Tools + +ALE supports a wide variety of languages and tools. See the +[full list](supported-tools.md) in the +[Supported Languages and Tools](supported-tools.md) page. + + + +## 2. Usage + + + +### 2.i Linting + +Once this plugin is installed, while editing your files in supported +languages and tools which have been correctly installed, +this plugin will send the contents of your text buffers to a variety of +programs for checking the syntax and semantics of your programs. By default, +linters will be re-run in the background to check your syntax when you open +new buffers or as you make edits to your files. + +The behavior of linting can be configured with a variety of options, +documented in [the Vim help file](doc/ale.txt). For more information on the +options ALE offers, consult `:help ale-options` for global options and `:help +ale-integration-options` for options specified to particular linters. + + + +### 2.ii Fixing + +ALE can fix files with the `ALEFix` command. Functions need to be configured +either in each buffer with a `b:ale_fixers`, or globally with `g:ale_fixers`. + +The recommended way to configure fixers is to define a List in an ftplugin file. + +```vim +" In ~/.vim/ftplugin/javascript.vim, or somewhere similar. + +" Fix files with prettier, and then ESLint. +let b:ale_fixers = ['prettier', 'eslint'] +" Equivalent to the above. +let b:ale_fixers = {'javascript': ['prettier', 'eslint']} +``` + +You can also configure your fixers from vimrc using `g:ale_fixers`, before or +after ALE has been loaded. + +A `*` in place of the filetype will apply a List of fixers to all files which +do not match some filetype in the Dictionary. + +Note that using a plain List for `g:ale_fixers` is not supported. + +```vim +" In ~/.vim/vimrc, or somewhere similar. +let g:ale_fixers = { +\ '*': ['remove_trailing_lines', 'trim_whitespace'], +\ 'javascript': ['eslint'], +\} +``` + +If you want to automatically fix files when you save them, you need to turn +a setting on in vimrc. + +```vim +" Set this variable to 1 to fix files when you save them. +let g:ale_fix_on_save = 1 +``` + +The `:ALEFixSuggest` command will suggest some supported tools for fixing code. +Both `g:ale_fixers` and `b:ale_fixers` can also accept functions, including +lambda functions, as fixers, for fixing files with custom tools. + +See `:help ale-fix` for complete information on how to fix files with ALE. + + + +### 2.iii Completion + +ALE offers some support for completion via hijacking of omnicompletion while you +type. All of ALE's completion information must come from Language Server +Protocol linters, or from `tsserver` for TypeScript. + +ALE integrates with [Deoplete](https://github.com/Shougo/deoplete.nvim) as a +completion source, named `'ale'`. You can configure Deoplete to only use ALE as +the source of completion information, or mix it with other sources. + +```vim +" Use ALE and also some plugin 'foobar' as completion sources for all code. +call deoplete#custom#option('sources', { +\ '_': ['ale', 'foobar'], +\}) +``` + +ALE also offers its own automatic completion support, which does not require any +other plugins, and can be enabled by changing a setting before ALE is loaded. + +```vim +" Enable completion where available. +" This setting must be set before ALE is loaded. +" +" You should not turn this setting on if you wish to use ALE as a completion +" source for other completion plugins, like Deoplete. +let g:ale_completion_enabled = 1 +``` + +ALE provides an omni-completion function you can use for triggering +completion manually with ``. + +```vim +set omnifunc=ale#completion#OmniFunc +``` + +ALE supports automatic imports from external modules. This behavior is enabled +by default and can be disabled by setting: + +```vim +let g:ale_completion_autoimport = 0 +``` + +Note that disabling auto import can result in missing completion items from some +LSP servers (e.g. eclipselsp). See `:help ale-completion` for more information. + + + +### 2.iv Go To Definition + +ALE supports jumping to the definition of words under your cursor with the +`:ALEGoToDefinition` command using any enabled Language Server Protocol linters +and `tsserver`. + +See `:help ale-go-to-definition` for more information. + + + +### 2.v Find References + +ALE supports finding references for words under your cursor with the +`:ALEFindReferences` command using any enabled Language Server Protocol linters +and `tsserver`. + +See `:help ale-find-references` for more information. + + + +### 2.vi Hovering + +ALE supports "hover" information for printing brief information about symbols at +the cursor taken from Language Server Protocol linters and `tsserver` with the +`ALEHover` command. + +Truncated information will be displayed when the cursor rests on a symbol by +default, as long as there are no problems on the same line. + +The information can be displayed in a `balloon` tooltip in Vim or GVim by +hovering your mouse over symbols. Mouse hovering is enabled by default in GVim, +and needs to be configured for Vim 8.1+ in terminals. + +See `:help ale-hover` for more information. + + + +### 2.vii Symbol Search + +ALE supports searching for workspace symbols via Language Server Protocol +linters with the `ALESymbolSearch` command. + +Search queries can be performed to find functions, types, and more which are +similar to a given query string. + +See `:help ale-symbol-search` for more information. + + + +### 2.viii Refactoring: Rename, Actions + +ALE supports renaming symbols in symbols in code such as variables or class +names with the `ALERename` command. + +`ALEFileRename` will rename file and fix import paths (tsserver +only). + +`ALECodeAction` will execute actions on the cursor or applied to a visual +range selection, such as automatically fixing errors. + +See `:help ale-refactor` for more information. + + + +## 3. Installation + +To install this plugin, you should use one of the following methods. +For Windows users, replace usage of the Unix `~/.vim` directory with +`%USERPROFILE%\vimfiles`, or another directory if you have configured +Vim differently. On Windows, your `~/.vimrc` file will be similarly +stored in `%USERPROFILE%\_vimrc`. + + + +### 3.i. Installation with Vim package management + +In Vim 8 and NeoVim, you can install plugins easily without needing to use +any other tools. Simply clone the plugin into your `pack` directory. + +#### Vim 8 on Unix + +```bash +mkdir -p ~/.vim/pack/git-plugins/start +git clone --depth 1 https://github.com/dense-analysis/ale.git ~/.vim/pack/git-plugins/start/ale +``` + +#### NeoVim on Unix + +```bash +mkdir -p ~/.local/share/nvim/site/pack/git-plugins/start +git clone --depth 1 https://github.com/dense-analysis/ale.git ~/.local/share/nvim/site/pack/git-plugins/start/ale +``` + +#### Vim 8 on Windows + +```bash +# Run these commands in the "Git for Windows" Bash terminal +mkdir -p ~/vimfiles/pack/git-plugins/start +git clone --depth 1 https://github.com/dense-analysis/ale.git ~/vimfiles/pack/git-plugins/start/ale +``` + +#### Generating Vim help files + +You can add the following line to your vimrc files to generate documentation +tags automatically, if you don't have something similar already, so you can use +the `:help` command to consult ALE's online documentation: + +```vim +" Put these lines at the very end of your vimrc file. + +" Load all plugins now. +" Plugins need to be added to runtimepath before helptags can be generated. +packloadall +" Load all of the helptags now, after plugins have been loaded. +" All messages and errors will be ignored. +silent! helptags ALL +``` + + + +### 3.ii. Installation with Pathogen + +To install this module with [Pathogen](https://github.com/tpope/vim-pathogen), +you should clone this repository to your bundle directory, and ensure +you have the line `execute pathogen#infect()` in your `~/.vimrc` file. +You can run the following commands in your terminal to do so: + +```bash +cd ~/.vim/bundle +git clone https://github.com/dense-analysis/ale.git +``` + + + +### 3.iii. Installation with Vundle + +You can install this plugin using [Vundle](https://github.com/VundleVim/Vundle.vim) +by adding the GitHub path for this repository to your `~/.vimrc`: + +```vim +Plugin 'dense-analysis/ale' +``` + +Then run the command `:PluginInstall` in Vim. + +See the Vundle documentation for more information. + + + +### 3.iv. Installation with Vim-Plug + +You can install this plugin using [Vim-Plug](https://github.com/junegunn/vim-plug) +by adding the GitHub path for this repository to your `~/.vimrc`: + +```vim +Plug 'dense-analysis/ale' +``` + +Then run the command `:PlugInstall` in Vim. + +See the Vim-Plug documentation for more information. + + + +## 4. Contributing + +If you would like to see support for more languages and tools, please +[create an issue](https://github.com/dense-analysis/ale/issues) +or [create a pull request](https://github.com/dense-analysis/ale/pulls). +If your tool can read from stdin or you have code to suggest which is good, +support can be happily added for it. + +If you are interested in the general direction of the project, check out the +[wiki home page](https://github.com/dense-analysis/ale/wiki). The wiki includes +a Roadmap for the future, and more. + +If you'd liked to discuss ALE and more check out the Dense Analysis Discord +server here: https://discord.gg/5zFD6pQxDk + + + +## 5. FAQ + + + +### 5.i. How do I disable particular linters? + +By default, all available tools for all supported languages will be run. If you +want to only select a subset of the tools, you can define `b:ale_linters` for a +single buffer, or `g:ale_linters` globally. + +The recommended way to configure linters is to define a List in an ftplugin +file. + +```vim +" In ~/.vim/ftplugin/javascript.vim, or somewhere similar. + +" Enable ESLint only for JavaScript. +let b:ale_linters = ['eslint'] + +" Equivalent to the above. +let b:ale_linters = {'javascript': ['eslint']} +``` + +You can also declare which linters you want to run in your vimrc file, before or +after ALE has been loaded. + +```vim +" In ~/.vim/vimrc, or somewhere similar. +let g:ale_linters = { +\ 'javascript': ['eslint'], +\} +``` + +For all languages unspecified in the dictionary, all possible linters will +be run for those languages, just as when the dictionary is not defined. +Running many linters should not typically obstruct editing in Vim, +as they will all be executed in separate processes simultaneously. + +If you don't want ALE to run anything other than what you've explicitly asked +for, you can set `g:ale_linters_explicit` to `1`. + +```vim +" Only run linters named in ale_linters settings. +let g:ale_linters_explicit = 1 +``` + +This plugin will look for linters in the [`ale_linters`](ale_linters) directory. +Each directory within corresponds to a particular filetype in Vim, and each file +in each directory corresponds to the name of a particular linter. + + + +### 5.ii. How can I see what ALE has configured for the current file? + +Run the following to see what is currently configured: + +```vim +:ALEInfo +``` + + + +### 5.iii. How can I use ALE and coc.nvim together? + +[coc.nvim](https://github.com/neoclide/coc.nvim) is a popular Vim plugin written +in TypeScript and dependent on the [npm](https://www.npmjs.com/) ecosystem for +providing full IDE features to Vim. Both ALE and coc.nvim implement +[Language Server Protocol](https://microsoft.github.io/language-server-protocol/) +(LSP) clients for supporting diagnostics (linting with a live server), and other +features like auto-completion, and others listed above. + +ALE is primarily focused on integrating with external programs through virtually +any means, provided the plugin remains almost entirely written in Vim script. +coc.nvim is primarily focused on bringing IDE features to Vim. If you want to +run external programs on your files to check for errors, and also use the most +advanced IDE features, you might want to use both plugins at the same time. + +The easiest way to get both plugins to work together is to configure coc.nvim to +send diagnostics to ALE, so ALE controls how all problems are presented to you, +and to disable all LSP features in ALE, so ALE doesn't try to provide LSP +features already provided by coc.nvim, such as auto-completion. + +1. Open your coc.nvim configuration file with `:CocConfig` and add + `"diagnostic.displayByAle": true` to your settings. +2. Add `let g:ale_disable_lsp = 1` to your vimrc file, before plugins are + loaded. + +You can also use `b:ale_disable_lsp` in your ftplugin files to enable or disable +LSP features in ALE for different filetypes. After you configure coc.nvim and +ALE this way, you can further configure how problems appear to you by using all +of the settings mentioned in ALE's help file, including how often diagnostics +are requested. See `:help ale-lint`. + +The integration between ALE and coc.nvim works using an API ALE offers for +letting any other plugin integrate with ALE. If you are interested in writing a +similar integration, see `:help ale-lint-other-sources`. + + + +### 5.iv. How can I keep the sign gutter open? + +You can keep the sign gutter open at all times by setting the +`g:ale_sign_column_always` to 1 + +```vim +let g:ale_sign_column_always = 1 +``` + + + +### 5.v. How can I change the signs ALE uses? + +Use these options to specify what text should be used for signs: + +```vim +let g:ale_sign_error = '>>' +let g:ale_sign_warning = '--' +``` + +ALE sets some background colors automatically for warnings and errors +in the sign gutter, with the names `ALEErrorSign` and `ALEWarningSign`. +These colors can be customised, or even removed completely: + +```vim +highlight clear ALEErrorSign +highlight clear ALEWarningSign +``` + + + +### 5.vi. How can I change or disable the highlights ALE uses? + +ALE's highlights problems with highlight groups which link to `SpellBad`, +`SpellCap`, `error`, and `todo` groups by default. The characters that are +highlighted depend on the linters being used, and the information provided to +ALE. + +Highlighting can be disabled completely by setting `g:ale_set_highlights` to +`0`. + +```vim +" Set this in your vimrc file to disabling highlighting +let g:ale_set_highlights = 0 +``` + +You can control all of the highlights ALE uses, say if you are using a different +color scheme which produces ugly highlights. For example: + +```vim +highlight ALEWarning ctermbg=DarkMagenta +``` + +See `:help ale-highlights` for more information. + + + +### 5.vii. How can I show errors or warnings in my statusline? + +[vim-airline](https://github.com/vim-airline/vim-airline) integrates with ALE +for displaying error information in the status bar. If you want to see the +status for ALE in a nice format, it is recommended to use vim-airline with ALE. +The airline extension can be enabled by adding the following to your vimrc: + +```vim +" Set this. Airline will handle the rest. +let g:airline#extensions#ale#enabled = 1 +``` + +If you don't want to use vim-airline, you can implement your own statusline +function without adding any other plugins. ALE provides some functions to +assist in this endeavour, including: + +* `ale#statusline#Count`: Which returns the number of problems found by ALE + for a specified buffer. +* `ale#statusline#FirstProblem`: Which returns a dictionary containing the + full loclist details of the first problem of a specified type found by ALE + in a buffer. (e.g. The first style warning in the current buffer.) + This can be useful for displaying more detailed information such as the + line number of the first problem in a file. + +Say you want to display all errors as one figure, and all non-errors as another +figure. You can do the following: + +```vim +function! LinterStatus() abort + let l:counts = ale#statusline#Count(bufnr('')) + + let l:all_errors = l:counts.error + l:counts.style_error + let l:all_non_errors = l:counts.total - l:all_errors + + return l:counts.total == 0 ? 'OK' : printf( + \ '%dW %dE', + \ all_non_errors, + \ all_errors + \) +endfunction + +set statusline=%{LinterStatus()} +``` + +See `:help ale#statusline#Count()` or `:help ale#statusline#FirstProblem()` +for more information. + + + +### 5.viii. How can I show errors or warnings in my lightline? + +[lightline](https://github.com/itchyny/lightline.vim) does not have built-in +support for ALE, nevertheless there is a plugin that adds this functionality: [maximbaz/lightline-ale](https://github.com/maximbaz/lightline-ale). + +For more information, check out the sources of that plugin, `:help ale#statusline#Count()` and [lightline documentation](https://github.com/itchyny/lightline.vim#advanced-configuration). + + + +### 5.ix. How can I change the format for echo messages? + +There are 3 global options that allow customizing the echoed message. + +- `g:ale_echo_msg_format` where: + * `%s` is the error message itself + * `%...code...%` is an optional error code, and most characters can be + written between the `%` characters. + * `%linter%` is the linter name + * `%severity%` is the severity type +- `g:ale_echo_msg_error_str` is the string used for error severity. +- `g:ale_echo_msg_warning_str` is the string used for warning severity. + +So for example this: + +```vim +let g:ale_echo_msg_error_str = 'E' +let g:ale_echo_msg_warning_str = 'W' +let g:ale_echo_msg_format = '[%linter%] %s [%severity%]' +``` + +Will give you: + +![Echoed message](https://user-images.githubusercontent.com/3518142/59195927-348bd000-8b85-11e9-88b6-508a094f1548.png) + +See `:help g:ale_echo_msg_format` for more information. + + + +### 5.x. How can I execute some code when ALE starts or stops linting? + +ALE runs its own [autocmd](http://vimdoc.sourceforge.net/htmldoc/autocmd.html) +events when a lint or fix cycle are started and stopped. There is also an event +that runs when a linter job has been successfully started. These events can be +used to call arbitrary functions during these respective parts of the ALE's +operation. + +```vim +augroup YourGroup + autocmd! + autocmd User ALELintPre call YourFunction() + autocmd User ALELintPost call YourFunction() + + autocmd User ALEJobStarted call YourFunction() + + autocmd User ALEFixPre call YourFunction() + autocmd User ALEFixPost call YourFunction() +augroup END +``` + + + +### 5.xi. How can I navigate between errors quickly? + +ALE offers some commands with `` keybinds for moving between warnings and +errors quickly. You can map the keys Ctrl+j and Ctrl+k to moving between errors +for example: + +```vim +nmap (ale_previous_wrap) +nmap (ale_next_wrap) +``` + +For more information, consult the online documentation with +`:help ale-navigation-commands`. + + + +### 5.xii. How can I run linters only when I save files? + +ALE offers an option `g:ale_lint_on_save` for enabling running the linters +when files are saved. This option is enabled by default. If you only +wish to run linters when files are saved, you can turn the other +options off. + +```vim +" Write this in your vimrc file +let g:ale_lint_on_text_changed = 'never' +let g:ale_lint_on_insert_leave = 0 +" You can disable this option too +" if you don't want linters to run on opening a file +let g:ale_lint_on_enter = 0 +``` + +If for whatever reason you don't wish to run linters again when you save +files, you can set `g:ale_lint_on_save` to `0`. + + + +### 5.xiii. How can I use the quickfix list instead of the loclist? + +The quickfix list can be enabled by turning the `g:ale_set_quickfix` +option on. If you wish to also disable the loclist, you can disable +the `g:ale_set_loclist` option. + +```vim +" Write this in your vimrc file +let g:ale_set_loclist = 0 +let g:ale_set_quickfix = 1 +``` + +If you wish to show Vim windows for the loclist or quickfix items +when a file contains warnings or errors, `g:ale_open_list` can be +set to `1`. `g:ale_keep_list_window_open` can be set to `1` +if you wish to keep the window open even after errors disappear. + +```vim +let g:ale_open_list = 1 +" Set this if you want to. +" This can be useful if you are combining ALE with +" some other plugin which sets quickfix errors, etc. +let g:ale_keep_list_window_open = 1 +``` + +You can also set `let g:ale_list_vertical = 1` to open the windows vertically +instead of the default horizontally. + + + +### 5.xiv. How can I check JSX files with both stylelint and eslint? + +If you configure ALE options correctly in your vimrc file, and install +the right tools, you can check JSX files with stylelint and eslint. + +First, install eslint and install stylelint with +[stylelint-processor-styled-components](https://github.com/styled-components/stylelint-processor-styled-components). + +Supposing you have installed both tools correctly, configure your .jsx files so +`jsx` is included in the filetype. You can use an `autocmd` for this. + +```vim +augroup FiletypeGroup + autocmd! + au BufNewFile,BufRead *.jsx set filetype=javascript.jsx +augroup END +``` + +Supposing the filetype has been set correctly, you can set the following +options in a jsx.vim ftplugin file. + +```vim +" In ~/.vim/ftplugin/jsx.vim, or somewhere similar. +let b:ale_linter_aliases = ['css', 'javascript'] +let b:ale_linters = ['stylelint', 'eslint'] +``` + +Or if you want, you can configure the linters from your vimrc file. + +```vim +" In ~/.vim/vimrc, or somewhere similar. +let g:ale_linter_aliases = {'jsx': ['css', 'javascript']} +let g:ale_linters = {'jsx': ['stylelint', 'eslint']} +``` + +ALE will alias the `jsx` filetype so it uses the `css` filetype linters, and +use the original Array of selected linters for `jsx` from the `g:ale_linters` +object. All available linters will be used for the filetype `javascript`, and +no linter will be run twice for the same file. + + + +### 5.xv. How can I check Vue files with ESLint? + +To check Vue files with ESLint, your ESLint project configuration file must be +configured to use the [Vue plugin](https://github.com/vuejs/eslint-plugin-vue). +After that, you need to configure ALE so it will run the JavaScript ESLint +linter on your files. The settings you need are similar to the settings needed +for checking JSX code with both stylelint and ESLint, in the previous section. + +```vim +" In ~/.vim/ftplugin/vue.vim, or somewhere similar. + +" Run both javascript and vue linters for vue files. +let b:ale_linter_aliases = ['javascript', 'vue'] +" Select the eslint and vls linters. +let b:ale_linters = ['eslint', 'vls'] +``` + +Run `:ALEInfo` to see which linters are available after telling ALE to run +JavaScript linters on Vue files. Not all linters support checking Vue files. + +If you don't want to configure your linters in ftplugin files for some reason, +you can configure them from your vimrc file instead. + +```vim +" In ~/.vim/vimrc, or somewhere similar. +let g:ale_linter_aliases = {'vue': ['vue', 'javascript']} +let g:ale_linters = {'vue': ['eslint', 'vls']} +``` + + + +### 5.xvi. Will this plugin eat all of my laptop battery power? + +ALE takes advantage of the power of various tools to check your code. This of +course means that CPU time will be used to continuously check your code. If you +are concerned about the CPU time ALE will spend, which will of course imply +some cost to battery life, you can adjust your settings to make your CPU do +less work. + +First, consider increasing the delay before which ALE will run any linters +while you type. ALE uses a timeout which is cancelled and reset every time you +type, and this delay can be increased so linters are run less often. See +`:help g:ale_lint_delay` for more information. + +If you don't wish to run linters while you type, you can disable that behavior. +Set `g:ale_lint_on_text_changed` to `never`. You won't get as frequent error +checking, but ALE shouldn't block your ability to edit a document after you save +a file, so the asynchronous nature of the plugin will still be an advantage. + +If you are still concerned, you can turn the automatic linting off altogether, +including the option `g:ale_lint_on_enter`, and you can run ALE manually with +`:ALELint`. + + + +### 5.xvii. How can I configure my C or C++ project? + +The structure of C and C++ projects varies wildly from project to project, with +many different build tools being used for building them, and many different +formats for project configuration files. ALE can run compilers easily, but +ALE cannot easily detect which compiler flags to use. + +Some tools and build configurations can generate +[compile_commands.json](https://clang.llvm.org/docs/JSONCompilationDatabase.html) +files. The `cppcheck`, `clangcheck`, `clangtidy` and `cquery` linters can read +these files for automatically determining the appropriate compiler flags to +use. + +For linting with compilers like `gcc` and `clang`, and with other tools, you +will need to tell ALE which compiler flags to use yourself. You can use +different options for different projects with the `g:ale_pattern_options` +setting. Consult the documentation for that setting for more information. +`b:ale_linters` can be used to select which tools you want to run, say if you +want to use only `gcc` for one project, and only `clang` for another. + +ALE will attempt to parse `compile_commands.json` files to discover compiler +flags to use when linting code. See `:help g:ale_c_parse_compile_commands` for +more information. See Clang's documentation for +[compile_commands.json files](https://clang.llvm.org/docs/JSONCompilationDatabase.html). +You should strongly consider generating them in your builds, which is easy to do +with CMake. + +You can also configure ALE to automatically run `make -n` to run dry runs on +`Makefile`s to discover compiler flags. This can execute arbitrary code, so the +option is disabled by default. See `:help g:ale_c_parse_makefile`. + +You may also configure buffer-local settings for linters with project-specific +vimrc files. [local_vimrc](https://github.com/LucHermitte/local_vimrc) can be +used for executing local vimrc files which can be shared in your project. + + + +### 5.xviii. How can I configure ALE differently for different buffers? + +ALE offers various ways to configure which linters or fixers are run, and +other settings. For the majority of ALE's settings, they can either be +configured globally with a `g:` variable prefix, or for a specific buffer +with a `b:` variable prefix. For example, you can configure a Python ftplugin +file like so. + +```vim +" In ~/.vim/ftplugin/python.vim + +" Check Python files with flake8 and pylint. +let b:ale_linters = ['flake8', 'pylint'] +" Fix Python files with autopep8 and yapf. +let b:ale_fixers = ['autopep8', 'yapf'] +" Disable warnings about trailing whitespace for Python files. +let b:ale_warn_about_trailing_whitespace = 0 +``` + +For configuring files based on regular expression patterns matched against the +absolute path to a file, you can use `g:ale_pattern_options`. + +```vim +" Do not lint or fix minified files. +let g:ale_pattern_options = { +\ '\.min\.js$': {'ale_linters': [], 'ale_fixers': []}, +\ '\.min\.css$': {'ale_linters': [], 'ale_fixers': []}, +\} +" If you configure g:ale_pattern_options outside of vimrc, you need this. +let g:ale_pattern_options_enabled = 1 +``` + +Buffer-local variables for settings always override the global settings. + + + +### 5.xix. How can I configure the height of the list in which ALE displays errors? + +To set a default height for the error list, use the `g:ale_list_window_size` variable. + +```vim +" Show 5 lines of errors (default: 10) +let g:ale_list_window_size = 5 +``` + + + +### 5.xx. How can I run linters or fixers via Docker or a VM? + +ALE supports running linters or fixers via Docker, virtual machines, or in +combination with any remote machine with a different file system, so long as the +tools are well-integrated with ALE, and ALE is properly configured to run the +correct commands and map filename paths between different file systems. See +`:help ale-lint-other-machines` for the full documentation on how to configure +ALE to support this. + + + +### 5.xxi. How can I change the borders for floating preview windows? + +Borders for floating preview windows are enabled by default. You can use the +`g:ale_floating_window_border` setting to configure them. + +You could disable the border with an empty list. + +```vim +let g:ale_floating_window_border = [] +``` + +If the terminal supports Unicode, you might try setting the value like below, to +make it look nicer. + +```vim +let g:ale_floating_window_border = ['│', '─', '╭', '╮', '╯', '╰', '│', '─'] +``` + +Since vim's default uses nice unicode characters when possible, you can trick +ale into using that default with + +```vim +let g:ale_floating_window_border = repeat([''], 8) +``` + + + +### 5.xxii. How can I use ALE and vim-lsp together? + +[vim-lsp](https://github.com/prabirshrestha/vim-lsp) is a popular plugin as +implementation of Language Server Protocol (LSP) client for Vim. It provides +all the LSP features including auto completion, diagnostics, go to definitions, +etc. + +ALE also provides LSP support for diagnostics. When you use both ALE and +vim-lsp, one option is disabling ALE's LSP support by +`let g:ale_disable_lsp = 1`. However ALE provides integration of external +programs. Showing errors from language servers by vim-lsp and showing errors +from other external programs by ALE are confusing and problematic. + +[vim-lsp-ale](https://github.com/rhysd/vim-lsp-ale) is a bridge plugin to solve +the problem when using both ALE and vim-lsp. With the plugin, diagnostics are +provided by vim-lsp and ALE can handle all the errors. Please read +[vim-lsp-ale's documentation](https://github.com/rhysd/vim-lsp-ale/blob/master/doc/vim-lsp-ale.txt) +for more details. diff --git a/dot_vim/plugged/ale/ale_linters/ada/adals.vim b/dot_vim/plugged/ale/ale_linters/ada/adals.vim new file mode 100644 index 0000000..9a41e1d --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ada/adals.vim @@ -0,0 +1,26 @@ +" Author: Bartek Jasicki http://github.com/thindil +" Description: Support for Ada Language Server + +call ale#Set('ada_adals_executable', 'ada_language_server') +call ale#Set('ada_adals_project', 'default.gpr') +call ale#Set('ada_adals_encoding', 'utf-8') + +function! ale_linters#ada#adals#GetAdaLSConfig(buffer) abort + return { + \ 'ada.projectFile': ale#Var(a:buffer, 'ada_adals_project'), + \ 'ada.defaultCharset': ale#Var(a:buffer, 'ada_adals_encoding') + \} +endfunction + +function! ale_linters#ada#adals#GetRootDirectory(buffer) abort + return fnamemodify(bufname(a:buffer), ':p:h') +endfunction + +call ale#linter#Define('ada', { +\ 'name': 'adals', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'ada_adals_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale_linters#ada#adals#GetRootDirectory'), +\ 'lsp_config': function('ale_linters#ada#adals#GetAdaLSConfig') +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ada/cspell.vim b/dot_vim/plugged/ale/ale_linters/ada/cspell.vim new file mode 100644 index 0000000..7342d2b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ada/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Ada files. + +call ale#handlers#cspell#DefineLinter('ada') diff --git a/dot_vim/plugged/ale/ale_linters/ada/gcc.vim b/dot_vim/plugged/ale/ale_linters/ada/gcc.vim new file mode 100644 index 0000000..5afc9ae --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ada/gcc.vim @@ -0,0 +1,54 @@ +" Author: Martino Pilia +" Description: Lint Ada files with GCC + +call ale#Set('ada_gcc_executable', 'gcc') + +" -gnatwa: activate most optional warnings +" -gnatq: try semantic analysis even if syntax errors have been found +call ale#Set('ada_gcc_options', '-gnatwa -gnatq') + +function! ale_linters#ada#gcc#GetCommand(buffer) abort + " Build a suitable output file name. The output file is specified because + " the .ali file may be created even if no code generation is attempted. + " The output file name must match the source file name (except for the + " extension), so here we cannot use the null file as output. + let l:tmp_dir = fnamemodify(ale#command#CreateDirectory(a:buffer), ':p') + let l:out_file = l:tmp_dir . fnamemodify(bufname(a:buffer), ':t:r') . '.o' + + " -gnatc: Check syntax and semantics only (no code generation attempted) + return '%e -x ada -c -gnatc' + \ . ' -o ' . ale#Escape(l:out_file) + \ . ' -I %s:h' + \ . ale#Pad(ale#Var(a:buffer, 'ada_gcc_options')) + \ . ' %t' +endfunction + +" For the message format please refer to: +" https://gcc.gnu.org/onlinedocs/gnat_ugn/Output-and-Error-Message-Control.html +" https://gcc.gnu.org/onlinedocs/gnat_ugn/Warning-Message-Control.html +function! ale_linters#ada#gcc#Handle(buffer, lines) abort + " Error format: ::: + " Warning format: ::: warning: + let l:re = '\v(.+):([0-9]+):([0-9]+):\s+(warning:)?\s*(.+)\s*' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:re) + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': str2nr(l:match[2]), + \ 'col': str2nr(l:match[3]), + \ 'type': l:match[4] is# 'warning:' ? 'W' : 'E', + \ 'text': l:match[5], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('ada', { +\ 'name': 'gcc', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'ada_gcc_executable')}, +\ 'command': function('ale_linters#ada#gcc#GetCommand'), +\ 'callback': 'ale_linters#ada#gcc#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ansible/ansible_language_server.vim b/dot_vim/plugged/ale/ale_linters/ansible/ansible_language_server.vim new file mode 100644 index 0000000..d1f3fb7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ansible/ansible_language_server.vim @@ -0,0 +1,46 @@ +" Author: Horacio Sanson +" Description: Support ansible language server https://github.com/ansible/ansible-language-server/ + +call ale#Set('ansible_language_server_executable', 'ansible-language-server') +call ale#Set('ansible_language_server_config', {}) + +function! ale_linters#ansible#ansible_language_server#Executable(buffer) abort + return ale#Var(a:buffer, 'ansible_language_server_executable') +endfunction + +function! ale_linters#ansible#ansible_language_server#GetCommand(buffer) abort + let l:executable = ale_linters#ansible#ansible_language_server#Executable(a:buffer) + + return ale#Escape(l:executable) . ' --stdio' +endfunction + +function! ale_linters#ansible#ansible_language_server#FindProjectRoot(buffer) abort + let l:dir = fnamemodify( + \ ale#path#FindNearestFile(a:buffer, 'ansible.cfg'), + \ ':h' + \) + + if l:dir isnot# '.' && isdirectory(l:dir) + return l:dir + endif + + let l:dir = fnamemodify( + \ ale#path#FindNearestDirectory(a:buffer, '.git'), + \ ':h:h' + \) + + if l:dir isnot# '.' && isdirectory(l:dir) + return l:dir + endif + + return '' +endfunction + +call ale#linter#Define('ansible', { +\ 'name': 'ansible-language-server', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#ansible#ansible_language_server#Executable'), +\ 'command': function('ale_linters#ansible#ansible_language_server#GetCommand'), +\ 'project_root': function('ale_linters#ansible#ansible_language_server#FindProjectRoot'), +\ 'lsp_config': {b -> ale#Var(b, 'ansible_language_server_config')} +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ansible/ansible_lint.vim b/dot_vim/plugged/ale/ale_linters/ansible/ansible_lint.vim new file mode 100644 index 0000000..bdfbee3 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ansible/ansible_lint.vim @@ -0,0 +1,128 @@ +" Authors: Bjorn Neergaard , Vytautas Macionis +" Description: ansible-lint for ansible-yaml files + +call ale#Set('ansible_ansible_lint_executable', 'ansible-lint') + +function! ale_linters#ansible#ansible_lint#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'ansible_ansible_lint_executable') +endfunction + +function! ale_linters#ansible#ansible_lint#Handle(buffer, version, lines) abort + for l:line in a:lines[:10] + if match(l:line, '^Traceback') >= 0 + return [{ + \ 'lnum': 1, + \ 'text': 'An exception was thrown. See :ALEDetail', + \ 'detail': join(a:lines, "\n"), + \}] + endif + endfor + + let l:version_group = ale#semver#GTE(a:version, [6, 0, 0]) ? '>=6.0.0' : + \ ale#semver#GTE(a:version, [5, 0, 0]) ? '>=5.0.0' : + \ '<5.0.0' + let l:output = [] + + if '>=6.0.0' is# l:version_group + let l:error_codes = { 'blocker': 'E', 'critical': 'E', 'major': 'W', 'minor': 'W', 'info': 'I' } + let l:linter_issues = ale#util#FuzzyJSONDecode(a:lines, []) + + for l:issue in l:linter_issues + if ale#path#IsBufferPath(a:buffer, l:issue.location.path) + call add(l:output, { + \ 'lnum': exists('l:issue.location.lines.begin.column') ? l:issue.location.lines.begin.line : + \ l:issue.location.lines.begin, + \ 'col': exists('l:issue.location.lines.begin.column') ? l:issue.location.lines.begin.column : 0, + \ 'text': l:issue.check_name, + \ 'detail': l:issue.description, + \ 'code': l:issue.severity, + \ 'type': l:error_codes[l:issue.severity], + \}) + endif + endfor + endif + + if '>=5.0.0' is# l:version_group + " Matches patterns line the following: + " test.yml:3:148: syntax-check 'var' is not a valid attribute for a Play + " roles/test/tasks/test.yml:8: [package-latest] [VERY_LOW] Package installs should not use latest + " D:\test\tasks\test.yml:8: [package-latest] [VERY_LOW] package installs should not use latest + let l:pattern = '\v^(%([a-zA-Z]:)?[^:]+):(\d+):%((\d+):)? %(\[([-[:alnum:]]+)\]) %(\[([_[:alnum:]]+)\]) (.*)$' + let l:error_codes = { 'VERY_HIGH': 'E', 'HIGH': 'E', 'MEDIUM': 'W', 'LOW': 'W', 'VERY_LOW': 'W', 'INFO': 'I' } + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if ale#path#IsBufferPath(a:buffer, l:match[1]) + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[6], + \ 'code': l:match[4], + \ 'type': l:error_codes[l:match[5]], + \}) + endif + endfor + endif + + if '<5.0.0' is# l:version_group + " Matches patterns line the following: + " test.yml:35: [EANSIBLE0002] Trailing whitespace + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?: \[?([[:alnum:]]+)\]? (.*)$' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:code = l:match[4] + + if l:code is# 'EANSIBLE0002' + \&& !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + " Skip warnings for trailing whitespace if the option is off. + continue + endif + + if ale#path#IsBufferPath(a:buffer, l:match[1]) + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[5], + \ 'code': l:code, + \ 'type': l:code[:0] is# 'E' ? 'E' : 'W', + \}) + endif + endfor + endif + + return l:output +endfunction + +function! ale_linters#ansible#ansible_lint#GetCommand(buffer, version) abort + let l:commands = { + \ '>=6.0.0': '%e --nocolor -f json -x yaml %s', + \ '>=5.0.0': '%e --nocolor --parseable-severity -x yaml %s', + \ '<5.0.0': '%e --nocolor -p %t' + \} + let l:command = ale#semver#GTE(a:version, [6, 0]) ? l:commands['>=6.0.0'] : + \ ale#semver#GTE(a:version, [5, 0]) ? l:commands['>=5.0.0'] : + \ l:commands['<5.0.0'] + + return l:command +endfunction + +call ale#linter#Define('ansible', { +\ 'name': 'ansible_lint', +\ 'aliases': ['ansible', 'ansible-lint'], +\ 'executable': function('ale_linters#ansible#ansible_lint#GetExecutable'), +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale_linters#ansible#ansible_lint#GetExecutable(buffer), +\ '%e --version', +\ function('ale_linters#ansible#ansible_lint#GetCommand'), +\ )}, +\ 'lint_file': 1, +\ 'callback': {buffer, lines -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale_linters#ansible#ansible_lint#GetExecutable(buffer), +\ '%e --version', +\ {buffer, version -> ale_linters#ansible#ansible_lint#Handle( +\ buffer, +\ l:version, +\ lines)}, +\ )}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/apiblueprint/drafter.vim b/dot_vim/plugged/ale/ale_linters/apiblueprint/drafter.vim new file mode 100644 index 0000000..5d40c53 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/apiblueprint/drafter.vim @@ -0,0 +1,38 @@ +" Author: nametake https://nametake.github.io +" Description: apiblueprint parser + +function! ale_linters#apiblueprint#drafter#HandleErrors(buffer, lines) abort + " Matches patterns line the following: + " + " warning: (3) unable to parse response signature, expected 'response [] [()]'; line 4, column 3k - line 4, column 22 + " warning: (10) message-body asset is expected to be a pre-formatted code block, separate it by a newline and indent every of its line by 12 spaces or 3 tabs; line 30, column 5 - line 30, column 9; line 31, column 9 - line 31, column 14; line 32, column 9 - line 32, column 14 + let l:pattern = '\(^.*\): (\d\+) \(.\{-\}\); line \(\d\+\), column \(\d\+\) - line \d\+, column \d\+\(.*; line \d\+, column \d\+ - line \(\d\+\), column \(\d\+\)\)\{-\}$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines[2:], l:pattern) + let l:item = { + \ 'type': l:match[1] is# 'warning' ? 'W' : 'E', + \ 'text': l:match[2], + \ 'lnum': l:match[3] + 0, + \ 'col': l:match[4] + 0, + \} + + if l:match[5] isnot# '' + let l:item.end_lnum = l:match[6] + 0 + let l:item.end_col = l:match[7] + 0 + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + + +call ale#linter#Define('apiblueprint', { +\ 'name': 'drafter', +\ 'output_stream': 'stderr', +\ 'executable': 'drafter', +\ 'command': 'drafter --use-line-num --validate', +\ 'callback': 'ale_linters#apiblueprint#drafter#HandleErrors', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/apkbuild/apkbuild_lint.vim b/dot_vim/plugged/ale/ale_linters/apkbuild/apkbuild_lint.vim new file mode 100644 index 0000000..285f553 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/apkbuild/apkbuild_lint.vim @@ -0,0 +1,12 @@ +" Author: Leo +" Description: apkbuild-lint from atools linter for APKBUILDs + +call ale#Set('apkbuild_apkbuild_lint_executable', 'apkbuild-lint') + +call ale#linter#Define('apkbuild', { +\ 'name': 'apkbuild_lint', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'apkbuild_apkbuild_lint_executable')}, +\ 'command': '%e %t', +\ 'callback': 'ale#handlers#atools#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/apkbuild/secfixes_check.vim b/dot_vim/plugged/ale/ale_linters/apkbuild/secfixes_check.vim new file mode 100644 index 0000000..c65267f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/apkbuild/secfixes_check.vim @@ -0,0 +1,12 @@ +" Author: Leo +" Description: secfixes-check from atools linter for APKBUILDs + +call ale#Set('apkbuild_secfixes_check_executable', 'secfixes-check') + +call ale#linter#Define('apkbuild', { +\ 'name': 'secfixes_check', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'apkbuild_secfixes_check_executable')}, +\ 'command': '%e %t', +\ 'callback': 'ale#handlers#atools#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/asciidoc/alex.vim b/dot_vim/plugged/ale/ale_linters/asciidoc/alex.vim new file mode 100644 index 0000000..97976b2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/asciidoc/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for asciidoc files + +call ale#handlers#alex#DefineLinter('asciidoc', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/asciidoc/cspell.vim b/dot_vim/plugged/ale/ale_linters/asciidoc/cspell.vim new file mode 100644 index 0000000..b228b2e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/asciidoc/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for ASCIIDoc files. + +call ale#handlers#cspell#DefineLinter('asciidoc') diff --git a/dot_vim/plugged/ale/ale_linters/asciidoc/languagetool.vim b/dot_vim/plugged/ale/ale_linters/asciidoc/languagetool.vim new file mode 100644 index 0000000..8e8de7f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/asciidoc/languagetool.vim @@ -0,0 +1,5 @@ +" Author: Horacio Sanson (hsanson [ät] gmail.com) +" Description: languagetool for asciidoc files, copied from markdown. + + +call ale#handlers#languagetool#DefineLinter('asciidoc') diff --git a/dot_vim/plugged/ale/ale_linters/asciidoc/proselint.vim b/dot_vim/plugged/ale/ale_linters/asciidoc/proselint.vim new file mode 100644 index 0000000..b636c06 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/asciidoc/proselint.vim @@ -0,0 +1,9 @@ +" Author: Daniel M. Capella https://github.com/polyzen +" Description: proselint for AsciiDoc files + +call ale#linter#Define('asciidoc', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/asciidoc/redpen.vim b/dot_vim/plugged/ale/ale_linters/asciidoc/redpen.vim new file mode 100644 index 0000000..819e385 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/asciidoc/redpen.vim @@ -0,0 +1,9 @@ +" Author: rhysd https://rhysd.github.io +" Description: Redpen, a proofreading tool (http://redpen.cc) + +call ale#linter#Define('asciidoc', { +\ 'name': 'redpen', +\ 'executable': 'redpen', +\ 'command': 'redpen -f asciidoc -r json %t', +\ 'callback': 'ale#handlers#redpen#HandleRedpenOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/asciidoc/textlint.vim b/dot_vim/plugged/ale/ale_linters/asciidoc/textlint.vim new file mode 100644 index 0000000..308a3a2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/asciidoc/textlint.vim @@ -0,0 +1,9 @@ +" Author: TANIGUCHI Masaya +" Description: textlint for AsciiDoc files + +call ale#linter#Define('asciidoc', { +\ 'name': 'textlint', +\ 'executable': function('ale#handlers#textlint#GetExecutable'), +\ 'command': function('ale#handlers#textlint#GetCommand'), +\ 'callback': 'ale#handlers#textlint#HandleTextlintOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/asciidoc/vale.vim b/dot_vim/plugged/ale/ale_linters/asciidoc/vale.vim new file mode 100644 index 0000000..b3cf454 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/asciidoc/vale.vim @@ -0,0 +1,9 @@ +" Author: Jeff Kreeftmeijer https://github.com/jeffkreeftmeijer +" Description: vale for AsciiDoc files + +call ale#linter#Define('asciidoc', { +\ 'name': 'vale', +\ 'executable': 'vale', +\ 'command': 'vale --output=line %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/asciidoc/writegood.vim b/dot_vim/plugged/ale/ale_linters/asciidoc/writegood.vim new file mode 100644 index 0000000..a29b7e9 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/asciidoc/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for AsciiDoc files + +call ale#handlers#writegood#DefineLinter('asciidoc') diff --git a/dot_vim/plugged/ale/ale_linters/asm/gcc.vim b/dot_vim/plugged/ale/ale_linters/asm/gcc.vim new file mode 100644 index 0000000..cda3892 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/asm/gcc.vim @@ -0,0 +1,37 @@ +" Author: Lucas Kolstad +" Description: gcc linter for asm files + +call ale#Set('asm_gcc_executable', 'gcc') +call ale#Set('asm_gcc_options', '-Wall') + +function! ale_linters#asm#gcc#GetCommand(buffer) abort + " `-o /dev/null` or `-o null` is needed to catch all errors, + " -fsyntax-only doesn't catch everything. + return '%e -x assembler' + \ . ' -o ' . g:ale#util#nul_file + \ . '-iquote %s:h' + \ . ' ' . ale#Var(a:buffer, 'asm_gcc_options') . ' -' +endfunction + +function! ale_linters#asm#gcc#Handle(buffer, lines) abort + let l:pattern = '^.\+:\(\d\+\): \([^:]\+\): \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'type': l:match[2] =~? 'error' ? 'E' : 'W', + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('asm', { +\ 'name': 'gcc', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'asm_gcc_executable')}, +\ 'command': function('ale_linters#asm#gcc#GetCommand'), +\ 'callback': 'ale_linters#asm#gcc#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/avra/avra.vim b/dot_vim/plugged/ale/ale_linters/avra/avra.vim new file mode 100644 index 0000000..edf15c0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/avra/avra.vim @@ -0,0 +1,36 @@ +" Author: Utkarsh Verma +" Description: AVRA linter for avra syntax. + +call ale#Set('avra_avra_executable', 'avra') +call ale#Set('avra_avra_options', '') + +function! ale_linters#avra#avra#GetCommand(buffer) abort + return '%e' + \ . ' %t' + \ . ale#Pad(ale#Var(a:buffer, 'avra_avra_options')) + \ . ' -o ' . g:ale#util#nul_file +endfunction + +function! ale_linters#avra#avra#Handle(buffer, lines) abort + " Note that we treat 'fatal' as errors. + let l:pattern = '^\S\+(\(\d\+\))\s\+:\s\+\(\S\+\)\s\+:\s\+\(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'type': l:match[2] =~? 'Error' ? 'E' : 'W', + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('avra', { +\ 'name': 'avra', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'avra_avra_executable')}, +\ 'command': function('ale_linters#avra#avra#GetCommand'), +\ 'callback': 'ale_linters#avra#avra#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/awk/gawk.vim b/dot_vim/plugged/ale/ale_linters/awk/gawk.vim new file mode 100644 index 0000000..0c3212f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/awk/gawk.vim @@ -0,0 +1,23 @@ +" Author: kmarc +" Description: This file adds support for using GNU awk with scripts. + +call ale#Set('awk_gawk_executable', 'gawk') +call ale#Set('awk_gawk_options', '') + +function! ale_linters#awk#gawk#GetCommand(buffer) abort + " note the --source 'BEGIN ...' is to prevent + " gawk from attempting to execute the body of the script + " it is linting. + return '%e --source ' . ale#Escape('BEGIN { exit } END { exit 1 }') + \ . ' --lint' + \ . ale#Pad(ale#Var(a:buffer, 'awk_gawk_options')) + \ . ' -f %t /dev/null' +endfunction + +call ale#linter#Define('awk', { +\ 'name': 'gawk', +\ 'executable': {b -> ale#Var(b, 'awk_gawk_executable')}, +\ 'command': function('ale_linters#awk#gawk#GetCommand'), +\ 'callback': 'ale#handlers#gawk#HandleGawkFormat', +\ 'output_stream': 'both' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/bats/shellcheck.vim b/dot_vim/plugged/ale/ale_linters/bats/shellcheck.vim new file mode 100644 index 0000000..5c2a0ea --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/bats/shellcheck.vim @@ -0,0 +1,4 @@ +" Author: Ian2020 +" Description: shellcheck linter for bats scripts. + +call ale#handlers#shellcheck#DefineLinter('bats') diff --git a/dot_vim/plugged/ale/ale_linters/bib/bibclean.vim b/dot_vim/plugged/ale/ale_linters/bib/bibclean.vim new file mode 100644 index 0000000..f1610e0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/bib/bibclean.vim @@ -0,0 +1,80 @@ +" Author: Horacio Sanson - https://github.com/hsanson +" Description: Support for bibclean linter for BibTeX files. + +call ale#Set('bib_bibclean_executable', 'bibclean') + +function! ale_linters#bib#bibclean#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'bib_bibclean_executable') + + return ale#Escape(l:executable) . ' -file-position ' +endfunction + +function! ale_linters#bib#bibclean#get_type(str) abort + if a:str is# '??' + return 'E' + else + return 'W' + endif +endfunction + +function! ale_linters#bib#bibclean#match_msg(line) abort + " Legacy message pattern works for bibclean <= v2.11.4. If empty, try + " the new message pattern for bibtex > v2.11.4 + let l:matches_legacy = matchlist(a:line, '^\(.*\) "stdin", line \(\d\+\): \(.*\)$') + + return ! empty(l:matches_legacy) ? l:matches_legacy + \ : matchlist(a:line, '^\(.*\) stdin:\(\d\+\):\(.*\)$') +endfunction + +function! ale_linters#bib#bibclean#match_entry(line) abort + return matchlist(a:line, 'Entry input byte=.* line=\(.*\) column=\(.*\) output .*$') +endfunction + +function! ale_linters#bib#bibclean#match_value(line) abort + return matchlist(a:line, 'Value input byte=.* line=\(.*\) column=\(.*\) output .*$') +endfunction + +function! ale_linters#bib#bibclean#Handle(buffer, lines) abort + let l:output = [] + + let l:type = 'E' + let l:msg = '' + + for l:line in a:lines + if empty(l:msg) + let l:mlist = ale_linters#bib#bibclean#match_msg(l:line) + + if !empty(l:mlist) + let l:msg = l:mlist[3] + let l:type = ale_linters#bib#bibclean#get_type(l:mlist[1]) + endif + else + if l:type is# 'E' + let l:mlist = ale_linters#bib#bibclean#match_entry(l:line) + else + let l:mlist = ale_linters#bib#bibclean#match_value(l:line) + endif + + if !empty(l:mlist) + call add(l:output, { + \ 'lnum': l:mlist[1], + \ 'col': l:mlist[2], + \ 'text': l:msg, + \ 'type': l:type + \}) + + let l:msg = '' + endif + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('bib', { +\ 'name': 'bibclean', +\ 'executable': {b -> ale#Var(b, 'bib_bibclean_executable')}, +\ 'command': function('ale_linters#bib#bibclean#GetCommand'), +\ 'output_stream': 'stderr', +\ 'callback': 'ale_linters#bib#bibclean#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/bicep/bicep.vim b/dot_vim/plugged/ale/ale_linters/bicep/bicep.vim new file mode 100644 index 0000000..91cc198 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/bicep/bicep.vim @@ -0,0 +1,64 @@ +" Author: Carl Smedstad +" Description: bicep for bicep files + +let g:ale_bicep_bicep_executable = +\ get(g:, 'ale_bicep_bicep_executable', 'bicep') + +let g:ale_bicep_bicep_options = +\ get(g:, 'ale_bicep_bicep_options', '') + +function! ale_linters#bicep#bicep#Executable(buffer) abort + return ale#Var(a:buffer, 'bicep_bicep_executable') +endfunction + +function! ale_linters#bicep#bicep#Command(buffer) abort + let l:executable = ale_linters#bicep#bicep#Executable(a:buffer) + let l:options = ale#Var(a:buffer, 'bicep_bicep_options') + + if has('win32') + let l:nullfile = 'NUL' + else + let l:nullfile = '/dev/null' + endif + + return ale#Escape(l:executable) + \ . ' build --outfile ' + \ . l:nullfile + \ . ' ' + \ . l:options + \ . ' %s' +endfunction + +function! ale_linters#bicep#bicep#Handle(buffer, lines) abort + let l:pattern = '\v^.*\((\d+),(\d+)\)\s:\s([a-zA-Z]*)\s([-a-zA-Z0-9]*):\s(.*)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if l:match[3] is# 'Error' + let l:type = 'E' + elseif l:match[3] is# 'Warning' + let l:type = 'W' + else + let l:type = 'I' + endif + + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:type, + \ 'code': l:match[4], + \ 'text': l:match[5], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('bicep', { +\ 'name': 'bicep', +\ 'executable': function('ale_linters#bicep#bicep#Executable'), +\ 'command': function('ale_linters#bicep#bicep#Command'), +\ 'callback': 'ale_linters#bicep#bicep#Handle', +\ 'output_stream': 'both', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/bitbake/oelint_adv.vim b/dot_vim/plugged/ale/ale_linters/bitbake/oelint_adv.vim new file mode 100644 index 0000000..fb85a9b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/bitbake/oelint_adv.vim @@ -0,0 +1,47 @@ +" Author: offa +" Description: oelint-adv for BitBake files + +call ale#Set('bitbake_oelint_adv_executable', 'oelint-adv') +call ale#Set('bitbake_oelint_adv_options', '') +call ale#Set('bitbake_oelint_adv_config', '.oelint.cfg') + +function! ale_linters#bitbake#oelint_adv#Command(buffer) abort + let l:config_file = ale#path#FindNearestFile(a:buffer, + \ ale#Var(a:buffer, 'bitbake_oelint_adv_config')) + + return ((!empty(l:config_file)) + \ ? 'OELINT_CONFIG=' . ale#Escape(l:config_file) . ' ' + \ : '') + \ . '%e --quiet ' + \ . ale#Pad(ale#Var(a:buffer, 'bitbake_oelint_adv_options')) . '%s' +endfunction + +function! ale_linters#bitbake#oelint_adv#Handle(buffer, lines) abort + let l:pattern = '\v^(.+):(.+):(.+):(.+):(.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': str2nr(l:match[2]), + \ 'type': l:match[3] is# 'error' + \ ? 'E' : (l:match[3] is# 'warning' ? 'W' : 'I'), + \ 'text': StripAnsiCodes(l:match[5]), + \ 'code': l:match[4] + \ }) + endfor + + return l:output +endfunction + +function! StripAnsiCodes(line) abort + return substitute(a:line, '\e\[[0-9;]\+[mK]', '', 'g') +endfunction + +call ale#linter#Define('bitbake', { +\ 'name': 'oelint_adv', +\ 'output_stream': 'both', +\ 'executable': {b -> ale#Var(b, 'bitbake_oelint_adv_executable')}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#bitbake#oelint_adv#Command'), +\ 'callback': 'ale_linters#bitbake#oelint_adv#Handle', +\ }) diff --git a/dot_vim/plugged/ale/ale_linters/c/cc.vim b/dot_vim/plugged/ale/ale_linters/c/cc.vim new file mode 100644 index 0000000..35125f2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/c/cc.vim @@ -0,0 +1,67 @@ +" Author: w0rp +" Description: A C compiler linter for C files with gcc/clang, etc. + +call ale#Set('c_cc_executable', '') +call ale#Set('c_cc_options', '-std=c11 -Wall') +call ale#Set('c_cc_use_header_lang_flag', -1) +call ale#Set('c_cc_header_exts', ['h']) + +function! ale_linters#c#cc#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'c_cc_executable') + + " Default to either clang or gcc. + if l:executable is# '' + if ale#engine#IsExecutable(a:buffer, 'clang') + let l:executable = 'clang' + else + let l:executable = 'gcc' + endif + endif + + return l:executable +endfunction + +function! ale_linters#c#cc#GetCommand(buffer, output) abort + let l:cflags = ale#c#GetCFlags(a:buffer, a:output) + let l:ale_flags = ale#Var(a:buffer, 'c_cc_options') + + if l:cflags =~# '-std=' + let l:ale_flags = substitute( + \ l:ale_flags, + \ '-std=\(c\|gnu\)[0-9]\{2\}', + \ '', + \ 'g') + endif + + " Select the correct language flag depending on the executable, options + " and file extension + let l:executable = ale_linters#c#cc#GetExecutable(a:buffer) + let l:use_header_lang_flag = ale#Var(a:buffer, 'c_cc_use_header_lang_flag') + let l:header_exts = ale#Var(a:buffer, 'c_cc_header_exts') + let l:lang_flag = ale#c#GetLanguageFlag( + \ a:buffer, + \ l:executable, + \ l:use_header_lang_flag, + \ l:header_exts, + \ 'c') + + " -iquote with the directory the file is in makes #include work for + " headers in the same directory. + " + " `-o /dev/null` or `-o null` is needed to catch all errors, + " -fsyntax-only doesn't catch everything. + return '%e -S -x ' . l:lang_flag + \ . ' -o ' . g:ale#util#nul_file + \ . ' -iquote %s:h' + \ . ale#Pad(l:cflags) + \ . ale#Pad(l:ale_flags) . ' -' +endfunction + +call ale#linter#Define('c', { +\ 'name': 'cc', +\ 'aliases': ['gcc', 'clang'], +\ 'output_stream': 'stderr', +\ 'executable': function('ale_linters#c#cc#GetExecutable'), +\ 'command': {b -> ale#c#RunMakeCommand(b, function('ale_linters#c#cc#GetCommand'))}, +\ 'callback': 'ale#handlers#gcc#HandleGCCFormatWithIncludes', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/c/ccls.vim b/dot_vim/plugged/ale/ale_linters/c/ccls.vim new file mode 100644 index 0000000..9f10571 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/c/ccls.vim @@ -0,0 +1,15 @@ +" Author: Ye Jingchen , Ben Falconer , jtalowell +" Description: A language server for C + +call ale#Set('c_ccls_executable', 'ccls') +call ale#Set('c_ccls_init_options', {}) +call ale#Set('c_build_dir', '') + +call ale#linter#Define('c', { +\ 'name': 'ccls', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'c_ccls_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale#handlers#ccls#GetProjectRoot'), +\ 'initialization_options': {b -> ale#handlers#ccls#GetInitOpts(b, 'c_ccls_init_options')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/c/clangd.vim b/dot_vim/plugged/ale/ale_linters/c/clangd.vim new file mode 100644 index 0000000..c42d449 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/c/clangd.vim @@ -0,0 +1,22 @@ +" Author: Andrey Melentyev +" Description: Clangd language server + +call ale#Set('c_clangd_executable', 'clangd') +call ale#Set('c_clangd_options', '') +call ale#Set('c_build_dir', '') + +function! ale_linters#c#clangd#GetCommand(buffer) abort + let l:build_dir = ale#c#GetBuildDirectory(a:buffer) + + return '%e' + \ . ale#Pad(ale#Var(a:buffer, 'c_clangd_options')) + \ . (!empty(l:build_dir) ? ' -compile-commands-dir=' . ale#Escape(l:build_dir) : '') +endfunction + +call ale#linter#Define('c', { +\ 'name': 'clangd', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'c_clangd_executable')}, +\ 'command': function('ale_linters#c#clangd#GetCommand'), +\ 'project_root': function('ale#c#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/c/clangtidy.vim b/dot_vim/plugged/ale/ale_linters/c/clangtidy.vim new file mode 100644 index 0000000..553cc23 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/c/clangtidy.vim @@ -0,0 +1,52 @@ +" Author: vdeurzen , w0rp , +" gagbo , Andrej Radovic +" Description: clang-tidy linter for c files + +call ale#Set('c_clangtidy_executable', 'clang-tidy') +" Set this option to check the checks clang-tidy will apply. +" The number of checks that can be applied to C files is limited in contrast to +" C++ +" +" Consult the check list in clang-tidy's documentation: +" http://clang.llvm.org/extra/clang-tidy/checks/list.html + +call ale#Set('c_clangtidy_checks', []) +" Set this option to manually set some options for clang-tidy to use as compile +" flags. +" This will disable compile_commands.json detection. +call ale#Set('c_clangtidy_options', '') +" Set this option to manually set options for clang-tidy directly. +call ale#Set('c_clangtidy_extra_options', '') +call ale#Set('c_build_dir', '') + +function! ale_linters#c#clangtidy#GetCommand(buffer, output) abort + let l:checks = join(ale#Var(a:buffer, 'c_clangtidy_checks'), ',') + let l:build_dir = ale#c#GetBuildDirectory(a:buffer) + let l:options = '' + + " Get the extra options if we couldn't find a build directory. + if empty(l:build_dir) + let l:options = ale#Var(a:buffer, 'c_clangtidy_options') + let l:cflags = ale#c#GetCFlags(a:buffer, a:output) + let l:options .= !empty(l:options) ? ale#Pad(l:cflags) : l:cflags + endif + + " Get the options to pass directly to clang-tidy + let l:extra_options = ale#Var(a:buffer, 'c_clangtidy_extra_options') + + return '%e' + \ . (!empty(l:checks) ? ' -checks=' . ale#Escape(l:checks) : '') + \ . (!empty(l:extra_options) ? ' ' . ale#Escape(l:extra_options) : '') + \ . ' %s' + \ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') + \ . (!empty(l:options) ? ' -- ' . l:options : '') +endfunction + +call ale#linter#Define('c', { +\ 'name': 'clangtidy', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'c_clangtidy_executable')}, +\ 'command': {b -> ale#c#RunMakeCommand(b, function('ale_linters#c#clangtidy#GetCommand'))}, +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/c/cppcheck.vim b/dot_vim/plugged/ale/ale_linters/c/cppcheck.vim new file mode 100644 index 0000000..28c2861 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/c/cppcheck.vim @@ -0,0 +1,29 @@ +" Author: Bart Libert +" Description: cppcheck linter for c files + +call ale#Set('c_cppcheck_executable', 'cppcheck') +call ale#Set('c_cppcheck_options', '--enable=style') + +function! ale_linters#c#cppcheck#GetCommand(buffer) abort + let l:compile_commands_option = ale#handlers#cppcheck#GetCompileCommandsOptions(a:buffer) + let l:buffer_path_include = empty(l:compile_commands_option) + \ ? ale#handlers#cppcheck#GetBufferPathIncludeOptions(a:buffer) + \ : '' + let l:template = ' --template=' . ale#Escape('{file}:{line}:{column}: {severity}:{inconclusive:inconclusive:} {message} [{id}]\\n{code}') + + return '%e -q --language=c' + \ . l:template + \ . ale#Pad(l:compile_commands_option) + \ . ale#Pad(ale#Var(a:buffer, 'c_cppcheck_options')) + \ . l:buffer_path_include + \ . ' %t' +endfunction + +call ale#linter#Define('c', { +\ 'name': 'cppcheck', +\ 'output_stream': 'both', +\ 'executable': {b -> ale#Var(b, 'c_cppcheck_executable')}, +\ 'cwd': function('ale#handlers#cppcheck#GetCwd'), +\ 'command': function('ale_linters#c#cppcheck#GetCommand'), +\ 'callback': 'ale#handlers#cppcheck#HandleCppCheckFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/c/cpplint.vim b/dot_vim/plugged/ale/ale_linters/c/cpplint.vim new file mode 100644 index 0000000..4b99794 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/c/cpplint.vim @@ -0,0 +1,20 @@ +" Author: Justin Huang +" Description: cpplint for c files + +call ale#Set('c_cpplint_executable', 'cpplint') +call ale#Set('c_cpplint_options', '') + +function! ale_linters#c#cpplint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'c_cpplint_options') + + return '%e' . ale#Pad(l:options) . ' %s' +endfunction + +call ale#linter#Define('c', { +\ 'name': 'cpplint', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'c_cpplint_executable')}, +\ 'command': function('ale_linters#c#cpplint#GetCommand'), +\ 'callback': 'ale#handlers#cpplint#HandleCppLintFormat', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/c/cquery.vim b/dot_vim/plugged/ale/ale_linters/c/cquery.vim new file mode 100644 index 0000000..ff0f34a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/c/cquery.vim @@ -0,0 +1,30 @@ +" Author: Ben Falconer , jtalowell +" Description: A language server for C + +call ale#Set('c_cquery_executable', 'cquery') +call ale#Set('c_cquery_cache_directory', expand('~/.cache/cquery')) + +function! ale_linters#c#cquery#GetProjectRoot(buffer) abort + " Try to find cquery configuration files first. + let l:config = ale#path#FindNearestFile(a:buffer, '.cquery') + + if !empty(l:config) + return fnamemodify(l:config, ':h') + endif + + " Fall back on default project root detection. + return ale#c#FindProjectRoot(a:buffer) +endfunction + +function! ale_linters#c#cquery#GetInitializationOptions(buffer) abort + return {'cacheDirectory': ale#Var(a:buffer, 'c_cquery_cache_directory')} +endfunction + +call ale#linter#Define('c', { +\ 'name': 'cquery', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'c_cquery_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale_linters#c#cquery#GetProjectRoot'), +\ 'initialization_options': function('ale_linters#c#cquery#GetInitializationOptions'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/c/cspell.vim b/dot_vim/plugged/ale/ale_linters/c/cspell.vim new file mode 100644 index 0000000..5f01654 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/c/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for C files. + +call ale#handlers#cspell#DefineLinter('c') diff --git a/dot_vim/plugged/ale/ale_linters/c/flawfinder.vim b/dot_vim/plugged/ale/ale_linters/c/flawfinder.vim new file mode 100644 index 0000000..53c3671 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/c/flawfinder.vim @@ -0,0 +1,25 @@ +" Author: Christian Gibbons +" Description: flawfinder linter for c files + +call ale#Set('c_flawfinder_executable', 'flawfinder') +call ale#Set('c_flawfinder_options', '') +call ale#Set('c_flawfinder_minlevel', 1) +call ale#Set('c_flawfinder_error_severity', 6) + +function! ale_linters#c#flawfinder#GetCommand(buffer) abort + " Set the minimum vulnerability level for flawfinder to bother with + let l:minlevel = ' --minlevel=' . ale#Var(a:buffer, 'c_flawfinder_minlevel') + + return '%e -CDQS' + \ . ale#Pad(ale#Var(a:buffer, 'c_flawfinder_options')) + \ . l:minlevel + \ . ' %t' +endfunction + +call ale#linter#Define('c', { +\ 'name': 'flawfinder', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'c_flawfinder_executable')}, +\ 'command': function('ale_linters#c#flawfinder#GetCommand'), +\ 'callback': 'ale#handlers#flawfinder#HandleFlawfinderFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cairo/starknet.vim b/dot_vim/plugged/ale/ale_linters/cairo/starknet.vim new file mode 100644 index 0000000..990bda6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cairo/starknet.vim @@ -0,0 +1,37 @@ +" Author: 0xHyoga <0xHyoga@gmx.com> +" Description: Report starknet-compile errors in cairo code + +call ale#Set('cairo_starknet_executable', 'starknet-compile') +call ale#Set('cairo_starknet_options', '') + +function! ale_linters#cairo#starknet#Handle(buffer, lines) abort + " Error always on the first line + " e.g ex01.cairo:20:6: Could not find module 'contracts.utils.ex00_base'. Searched in the following paths: + let l:pattern = '\v\.cairo:(\d+):(\d+):+ (.*)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': str2nr(l:match[1]), + \ 'col': str2nr(l:match[2]), + \ 'type': 'E', + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +function! ale_linters#cairo#starknet#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'cairo_starknet_executable') + + return l:executable . ale#Pad(ale#Var(a:buffer, 'cairo_starknet_options')) . ' %s' +endfunction + +call ale#linter#Define('cairo', { +\ 'name': 'starknet', +\ 'executable': {b -> ale#Var(b, 'cairo_starknet_executable')}, +\ 'command': function('ale_linters#cairo#starknet#GetCommand'), +\ 'callback': 'ale_linters#cairo#starknet#Handle', +\ 'output_stream': 'stderr', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/chef/cookstyle.vim b/dot_vim/plugged/ale/ale_linters/chef/cookstyle.vim new file mode 100644 index 0000000..50bae2a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/chef/cookstyle.vim @@ -0,0 +1,54 @@ +" Author: Raphael Hoegger - https://github.com/pfuender +" Description: Cookstyle (RuboCop based), a code style analyzer for Ruby files + +call ale#Set('chef_cookstyle_executable', 'cookstyle') +call ale#Set('chef_cookstyle_options', '') + +function! ale_linters#chef#cookstyle#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'chef_cookstyle_options') + + return '%e' . ale#Pad(escape(l:options, '~')) . ' --force-exclusion --format json --stdin ' . ' %s' +endfunction + +function! ale_linters#chef#cookstyle#Handle(buffer, lines) abort + if len(a:lines) == 0 + return [] + endif + + let l:errors = ale#util#FuzzyJSONDecode(a:lines[0], {}) + + if !has_key(l:errors, 'summary') + \|| l:errors['summary']['offense_count'] == 0 + \|| empty(l:errors['files']) + return [] + endif + + let l:output = [] + + for l:error in l:errors['files'][0]['offenses'] + let l:start_col = str2nr(l:error['location']['start_column']) + let l:end_col = str2nr(l:error['location']['last_column']) + + if !l:end_col + let l:end_col = l:start_col + 1 + endif + + call add(l:output, { + \ 'lnum': str2nr(l:error['location']['line']), + \ 'col': l:start_col, + \ 'end_col': l:end_col, + \ 'code': l:error['cop_name'], + \ 'text': l:error['message'], + \ 'type': l:error['severity'] is? 'convention' ? 'W' : 'E', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('chef', { +\ 'name': 'cookstyle', +\ 'executable': {b -> ale#Var(b, 'chef_cookstyle_executable')}, +\ 'command': function('ale_linters#chef#cookstyle#GetCommand'), +\ 'callback': 'ale_linters#chef#cookstyle#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/chef/foodcritic.vim b/dot_vim/plugged/ale/ale_linters/chef/foodcritic.vim new file mode 100644 index 0000000..48beba7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/chef/foodcritic.vim @@ -0,0 +1,41 @@ +" Author: Edward Larkey +" Author: Jose Junior +" Author: w0rp +" Description: This file adds the foodcritic linter for Chef files. + +call ale#Set('chef_foodcritic_executable', 'foodcritic') +call ale#Set('chef_foodcritic_options', '') + +function! ale_linters#chef#foodcritic#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'chef_foodcritic_options') + + return '%e' . ale#Pad(escape(l:options, '~')) . ' %s' +endfunction + +function! ale_linters#chef#foodcritic#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " FC002: Avoid string interpolation where not required: httpd.rb:13 + let l:pattern = '\v([^:]+): (.+): ([a-zA-Z]?:?[^:]+):(\d+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'code': l:match[1], + \ 'text': l:match[2], + \ 'filename': l:match[3], + \ 'lnum': l:match[4] + 0, + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('chef', { +\ 'name': 'foodcritic', +\ 'executable': {b -> ale#Var(b, 'chef_foodcritic_executable')}, +\ 'command': function('ale_linters#chef#foodcritic#GetCommand'), +\ 'callback': 'ale_linters#chef#foodcritic#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/clojure/clj_kondo.vim b/dot_vim/plugged/ale/ale_linters/clojure/clj_kondo.vim new file mode 100644 index 0000000..b470cf0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/clojure/clj_kondo.vim @@ -0,0 +1,47 @@ +" Author: Masashi Iizuka +" Description: linter for clojure using clj-kondo https://github.com/borkdude/clj-kondo + +call ale#Set('clojure_clj_kondo_options', '--cache') + +function! ale_linters#clojure#clj_kondo#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'clojure_clj_kondo_options') + + let l:command = 'clj-kondo' + \ . ale#Pad(l:options) + \ . ' --lint -' + \ . ' --filename %s' + + return l:command +endfunction + +function! ale_linters#clojure#clj_kondo#HandleCljKondoFormat(buffer, lines) abort + " output format + " ::: : + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+)?:(\d+)?:? ((Exception|error|warning): ?(.+))$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:type = 'E' + + if l:match[4] is? 'warning' + let l:type = 'W' + endif + + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3], + \ 'type': l:type, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('clojure', { +\ 'name': 'clj-kondo', +\ 'output_stream': 'stdout', +\ 'executable': 'clj-kondo', +\ 'command': function('ale_linters#clojure#clj_kondo#GetCommand'), +\ 'callback': 'ale_linters#clojure#clj_kondo#HandleCljKondoFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/clojure/joker.vim b/dot_vim/plugged/ale/ale_linters/clojure/joker.vim new file mode 100644 index 0000000..1f17cd3 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/clojure/joker.vim @@ -0,0 +1,34 @@ +" Author: Nic West +" Description: linter for clojure using joker https://github.com/candid82/joker + +function! ale_linters#clojure#joker#HandleJokerFormat(buffer, lines) abort + " output format + " ::: : + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+):? ((Read error|Parse error|Parse warning|Exception): ?(.+))$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:type = 'E' + + if l:match[4] is? 'Parse warning' + let l:type = 'W' + endif + + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3], + \ 'type': l:type, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('clojure', { +\ 'name': 'joker', +\ 'output_stream': 'stderr', +\ 'executable': 'joker', +\ 'command': 'joker --working-dir %s --lint %t', +\ 'callback': 'ale_linters#clojure#joker#HandleJokerFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cloudformation/cfn_python_lint.vim b/dot_vim/plugged/ale/ale_linters/cloudformation/cfn_python_lint.vim new file mode 100644 index 0000000..1684143 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cloudformation/cfn_python_lint.vim @@ -0,0 +1,36 @@ +" Author: Yasuhiro Kiyota +" Description: Support cfn-python-lint for AWS Cloudformation template file + +function! ale_linters#cloudformation#cfn_python_lint#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " sample.template.yaml:96:7:96:15:E3012:Property Resources/Sample/Properties/FromPort should be of type Integer + let l:pattern = '\v^(.*):(\d+):(\d+):(\d+):(\d+):([[:alnum:]]+):(.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:code = l:match[6] + + if ale#path#IsBufferPath(a:buffer, l:match[1]) + call add(l:output, { + \ 'lnum': l:match[2], + \ 'col': l:match[3], + \ 'end_lnum': l:match[4], + \ 'end_col': l:match[5], + \ 'code': l:code, + \ 'type': l:code[:0] is# 'E' ? 'E' : 'W', + \ 'text': l:match[7] + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('cloudformation', { +\ 'name': 'cloudformation', +\ 'aliases': ['cfn-lint'], +\ 'executable': 'cfn-lint', +\ 'command': 'cfn-lint --template %t --format parseable', +\ 'callback': 'ale_linters#cloudformation#cfn_python_lint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cmake/cmake_lint.vim b/dot_vim/plugged/ale/ale_linters/cmake/cmake_lint.vim new file mode 100644 index 0000000..3c44c92 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cmake/cmake_lint.vim @@ -0,0 +1,43 @@ +" Author: Carl Smedstad +" Description: cmake-lint for cmake files + +let g:ale_cmake_cmake_lint_executable = +\ get(g:, 'ale_cmake_cmake_lint_executable', 'cmake-lint') + +let g:ale_cmake_cmake_lint_options = +\ get(g:, 'ale_cmake_cmake_lint_options', '') + +function! ale_linters#cmake#cmake_lint#Executable(buffer) abort + return ale#Var(a:buffer, 'cmake_cmake_lint_executable') +endfunction + +function! ale_linters#cmake#cmake_lint#Command(buffer) abort + let l:executable = ale_linters#cmake#cmake_lint#Executable(a:buffer) + let l:options = ale#Var(a:buffer, 'cmake_cmake_lint_options') + + return ale#Escape(l:executable) . ' ' . l:options . ' %t' +endfunction + +function! ale_linters#cmake#cmake_lint#Handle(buffer, lines) abort + let l:pattern = '\v^[^:]+:(\d+),?(\d+)?:\s\[([A-Z]\d+)\]\s(.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': 'W', + \ 'code': l:match[3], + \ 'text': l:match[4], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('cmake', { +\ 'name': 'cmake_lint', +\ 'executable': function('ale_linters#cmake#cmake_lint#Executable'), +\ 'command': function('ale_linters#cmake#cmake_lint#Command'), +\ 'callback': 'ale_linters#cmake#cmake_lint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cmake/cmakelint.vim b/dot_vim/plugged/ale/ale_linters/cmake/cmakelint.vim new file mode 100644 index 0000000..d955a26 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cmake/cmakelint.vim @@ -0,0 +1,24 @@ +" Author: Kenneth Benzie +" Description: cmakelint for cmake files + +let g:ale_cmake_cmakelint_executable = +\ get(g:, 'ale_cmake_cmakelint_executable', 'cmakelint') + +let g:ale_cmake_cmakelint_options = +\ get(g:, 'ale_cmake_cmakelint_options', '') + +function! ale_linters#cmake#cmakelint#Executable(buffer) abort + return ale#Var(a:buffer, 'cmake_cmakelint_executable') +endfunction + +function! ale_linters#cmake#cmakelint#Command(buffer) abort + return ale_linters#cmake#cmakelint#Executable(a:buffer) + \ . ' ' . ale#Var(a:buffer, 'cmake_cmakelint_options') . ' %t' +endfunction + +call ale#linter#Define('cmake', { +\ 'name': 'cmakelint', +\ 'executable': function('ale_linters#cmake#cmakelint#Executable'), +\ 'command': function('ale_linters#cmake#cmakelint#Command'), +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/coffee/coffee.vim b/dot_vim/plugged/ale/ale_linters/coffee/coffee.vim new file mode 100644 index 0000000..8e89163 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/coffee/coffee.vim @@ -0,0 +1,23 @@ +" Author: KabbAmine - https://github.com/KabbAmine +" Description: Coffee for checking coffee files + +function! ale_linters#coffee#coffee#GetExecutable(buffer) abort + return ale#path#ResolveLocalPath( + \ a:buffer, + \ 'node_modules/.bin/coffee', + \ 'coffee' + \) +endfunction + +function! ale_linters#coffee#coffee#GetCommand(buffer) abort + return ale_linters#coffee#coffee#GetExecutable(a:buffer) + \ . ' -cp -s' +endfunction + +call ale#linter#Define('coffee', { +\ 'name': 'coffee', +\ 'executable': function('ale_linters#coffee#coffee#GetExecutable'), +\ 'command': function('ale_linters#coffee#coffee#GetCommand'), +\ 'output_stream': 'stderr', +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/coffee/coffeelint.vim b/dot_vim/plugged/ale/ale_linters/coffee/coffeelint.vim new file mode 100644 index 0000000..b7c85fa --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/coffee/coffeelint.vim @@ -0,0 +1,43 @@ +" Author: Prashanth Chandra https://github.com/prashcr +" Description: coffeelint linter for coffeescript files + +function! ale_linters#coffee#coffeelint#GetExecutable(buffer) abort + return ale#path#ResolveLocalPath( + \ a:buffer, + \ 'node_modules/.bin/coffeelint', + \ 'coffeelint' + \) +endfunction + +function! ale_linters#coffee#coffeelint#GetCommand(buffer) abort + return ale_linters#coffee#coffeelint#GetExecutable(a:buffer) + \ . ' --stdin --reporter csv' +endfunction + +function! ale_linters#coffee#coffeelint#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " path,lineNumber,lineNumberEnd,level,message + " stdin,14,,error,Throwing strings is forbidden + " + " Note that we currently ignore lineNumberEnd for multiline errors + let l:pattern = 'stdin,\(\d\+\),\(\d*\),\(.\{-1,}\),\(.\+\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': str2nr(l:match[1]), + \ 'type': l:match[3] is# 'error' ? 'E' : 'W', + \ 'text': l:match[4], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('coffee', { +\ 'name': 'coffeelint', +\ 'executable': function('ale_linters#coffee#coffeelint#GetExecutable'), +\ 'command': function('ale_linters#coffee#coffeelint#GetCommand'), +\ 'callback': 'ale_linters#coffee#coffeelint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/cc.vim b/dot_vim/plugged/ale/ale_linters/cpp/cc.vim new file mode 100644 index 0000000..1d35bb6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/cc.vim @@ -0,0 +1,67 @@ +" Author: w0rp +" Description: A C++ compiler linter for C++ files with gcc/clang, etc. + +call ale#Set('cpp_cc_executable', '') +call ale#Set('cpp_cc_options', '-std=c++14 -Wall') +call ale#Set('cpp_cc_use_header_lang_flag', -1) +call ale#Set('cpp_cc_header_exts', ['h', 'hpp']) + +function! ale_linters#cpp#cc#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'cpp_cc_executable') + + " Default to either clang++ or gcc. + if l:executable is# '' + if ale#engine#IsExecutable(a:buffer, 'clang++') + let l:executable = 'clang++' + else + let l:executable = 'gcc' + endif + endif + + return l:executable +endfunction + +function! ale_linters#cpp#cc#GetCommand(buffer, output) abort + let l:cflags = ale#c#GetCFlags(a:buffer, a:output) + let l:ale_flags = ale#Var(a:buffer, 'cpp_cc_options') + + if l:cflags =~# '-std=' + let l:ale_flags = substitute( + \ l:ale_flags, + \ '-std=\(c\|gnu\)++[0-9]\{2\}', + \ '', + \ 'g') + endif + + " Select the correct language flag depending on the executable, options + " and file extension + let l:executable = ale_linters#cpp#cc#GetExecutable(a:buffer) + let l:use_header_lang_flag = ale#Var(a:buffer, 'cpp_cc_use_header_lang_flag') + let l:header_exts = ale#Var(a:buffer, 'cpp_cc_header_exts') + let l:lang_flag = ale#c#GetLanguageFlag( + \ a:buffer, + \ l:executable, + \ l:use_header_lang_flag, + \ l:header_exts, + \ 'c++') + + " -iquote with the directory the file is in makes #include work for + " headers in the same directory. + " + " `-o /dev/null` or `-o null` is needed to catch all errors, + " -fsyntax-only doesn't catch everything. + return '%e -S -x ' . l:lang_flag + \ . ' -o ' . g:ale#util#nul_file + \ . ' -iquote %s:h' + \ . ale#Pad(l:cflags) + \ . ale#Pad(l:ale_flags) . ' -' +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'cc', +\ 'aliases': ['gcc', 'clang', 'g++', 'clang++'], +\ 'output_stream': 'stderr', +\ 'executable': function('ale_linters#cpp#cc#GetExecutable'), +\ 'command': {b -> ale#c#RunMakeCommand(b, function('ale_linters#cpp#cc#GetCommand'))}, +\ 'callback': 'ale#handlers#gcc#HandleGCCFormatWithIncludes', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/ccls.vim b/dot_vim/plugged/ale/ale_linters/cpp/ccls.vim new file mode 100644 index 0000000..38f8df9 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/ccls.vim @@ -0,0 +1,15 @@ +" Author: Ye Jingchen , Ben Falconer , jtalowell +" Description: A language server for C++ + +call ale#Set('cpp_ccls_executable', 'ccls') +call ale#Set('cpp_ccls_init_options', {}) +call ale#Set('c_build_dir', '') + +call ale#linter#Define('cpp', { +\ 'name': 'ccls', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'cpp_ccls_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale#handlers#ccls#GetProjectRoot'), +\ 'initialization_options': {b -> ale#handlers#ccls#GetInitOpts(b, 'cpp_ccls_init_options')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/clangcheck.vim b/dot_vim/plugged/ale/ale_linters/cpp/clangcheck.vim new file mode 100644 index 0000000..4cb0486 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/clangcheck.vim @@ -0,0 +1,35 @@ +" Author: gagbo +" Description: clang-check linter for cpp files + +call ale#Set('cpp_clangcheck_executable', 'clang-check') +call ale#Set('cpp_clangcheck_options', '') +call ale#Set('c_build_dir', '') + +function! ale_linters#cpp#clangcheck#GetCommand(buffer) abort + let l:user_options = ale#Var(a:buffer, 'cpp_clangcheck_options') + + " Try to find compilation database to link automatically + let l:build_dir = ale#Var(a:buffer, 'c_build_dir') + + if empty(l:build_dir) + let [l:root, l:json_file] = ale#c#FindCompileCommands(a:buffer) + let l:build_dir = ale#path#Dirname(l:json_file) + endif + + " The extra arguments in the command are used to prevent .plist files from + " being generated. These are only added if no build directory can be + " detected. + return '%e -analyze %s' + \ . (empty(l:build_dir) ? ' --extra-arg=-Xclang --extra-arg=-analyzer-output=text --extra-arg=-fno-color-diagnostics': '') + \ . ale#Pad(l:user_options) + \ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'clangcheck', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'cpp_clangcheck_executable')}, +\ 'command': function('ale_linters#cpp#clangcheck#GetCommand'), +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/clangd.vim b/dot_vim/plugged/ale/ale_linters/cpp/clangd.vim new file mode 100644 index 0000000..14f3fe5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/clangd.vim @@ -0,0 +1,22 @@ +" Author: Andrey Melentyev +" Description: Clangd language server + +call ale#Set('cpp_clangd_executable', 'clangd') +call ale#Set('cpp_clangd_options', '') +call ale#Set('c_build_dir', '') + +function! ale_linters#cpp#clangd#GetCommand(buffer) abort + let l:build_dir = ale#c#GetBuildDirectory(a:buffer) + + return '%e' + \ . ale#Pad(ale#Var(a:buffer, 'cpp_clangd_options')) + \ . (!empty(l:build_dir) ? ' -compile-commands-dir=' . ale#Escape(l:build_dir) : '') +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'clangd', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'cpp_clangd_executable')}, +\ 'command': function('ale_linters#cpp#clangd#GetCommand'), +\ 'project_root': function('ale#c#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/clangtidy.vim b/dot_vim/plugged/ale/ale_linters/cpp/clangtidy.vim new file mode 100644 index 0000000..fa9f8e3 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/clangtidy.vim @@ -0,0 +1,53 @@ +" Author: vdeurzen , w0rp , +" gagbo +" Description: clang-tidy linter for cpp files + +call ale#Set('cpp_clangtidy_executable', 'clang-tidy') +" Set this option to check the checks clang-tidy will apply. +call ale#Set('cpp_clangtidy_checks', []) +" Set this option to manually set some options for clang-tidy to use as compile +" flags. +" This will disable compile_commands.json detection. +call ale#Set('cpp_clangtidy_options', '') +" Set this option to manually set options for clang-tidy directly. +call ale#Set('cpp_clangtidy_extra_options', '') +call ale#Set('c_build_dir', '') + +function! ale_linters#cpp#clangtidy#GetCommand(buffer, output) abort + let l:checks = join(ale#Var(a:buffer, 'cpp_clangtidy_checks'), ',') + let l:build_dir = ale#c#GetBuildDirectory(a:buffer) + let l:options = '' + + " Get the extra options if we couldn't find a build directory. + if empty(l:build_dir) + let l:options = ale#Var(a:buffer, 'cpp_clangtidy_options') + let l:cflags = ale#c#GetCFlags(a:buffer, a:output) + let l:options .= !empty(l:options) ? ale#Pad(l:cflags) : l:cflags + + " Tell clang-tidy a .h header with a C++ filetype in Vim is a C++ file + " only when compile-commands.json file is not there. Adding these + " flags makes clang-tidy completely ignore compile commands. + if expand('#' . a:buffer) =~# '\.h$' + let l:options .= !empty(l:options) ? ' -x c++' : '-x c++' + endif + endif + + " Get the options to pass directly to clang-tidy + let l:extra_options = ale#Var(a:buffer, 'cpp_clangtidy_extra_options') + + return '%e' + \ . (!empty(l:checks) ? ' -checks=' . ale#Escape(l:checks) : '') + \ . (!empty(l:extra_options) ? ' ' . ale#Escape(l:extra_options) : '') + \ . ' %s' + \ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') + \ . (!empty(l:options) ? ' -- ' . l:options : '') +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'clangtidy', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'cpp_clangtidy_executable')}, +\ 'command': {b -> ale#c#RunMakeCommand(b, function('ale_linters#cpp#clangtidy#GetCommand'))}, +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/clazy.vim b/dot_vim/plugged/ale/ale_linters/cpp/clazy.vim new file mode 100644 index 0000000..9b29ac9 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/clazy.vim @@ -0,0 +1,32 @@ +" Description: clazy linter for cpp files (clang-based and Qt-oriented) + +call ale#Set('cpp_clazy_executable', 'clazy-standalone') +" Set this option to check the checks clazy will apply. +call ale#Set('cpp_clazy_checks', ['level1']) +" Set this option to manually set some options for clazy. +" This will disable compile_commands.json detection. +call ale#Set('cpp_clazy_options', '') +call ale#Set('c_build_dir', '') + +function! ale_linters#cpp#clazy#GetCommand(buffer) abort + let l:checks = join(ale#Var(a:buffer, 'cpp_clazy_checks'), ',') + let l:build_dir = ale#c#GetBuildDirectory(a:buffer) + + " Get the extra options if we couldn't find a build directory. + let l:options = ale#Var(a:buffer, 'cpp_clazy_options') + + return '%e' + \ . (!empty(l:checks) ? ' -checks=' . ale#Escape(l:checks) : '') + \ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %s' +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'clazy', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'cpp_clazy_executable')}, +\ 'command': function('ale_linters#cpp#clazy#GetCommand'), +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/cppcheck.vim b/dot_vim/plugged/ale/ale_linters/cpp/cppcheck.vim new file mode 100644 index 0000000..eb86adf --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/cppcheck.vim @@ -0,0 +1,29 @@ +" Author: Bart Libert +" Description: cppcheck linter for cpp files + +call ale#Set('cpp_cppcheck_executable', 'cppcheck') +call ale#Set('cpp_cppcheck_options', '--enable=style') + +function! ale_linters#cpp#cppcheck#GetCommand(buffer) abort + let l:compile_commands_option = ale#handlers#cppcheck#GetCompileCommandsOptions(a:buffer) + let l:buffer_path_include = empty(l:compile_commands_option) + \ ? ale#handlers#cppcheck#GetBufferPathIncludeOptions(a:buffer) + \ : '' + let l:template = ' --template=' . ale#Escape('{file}:{line}:{column}: {severity}:{inconclusive:inconclusive:} {message} [{id}]\\n{code}') + + return '%e -q --language=c++' + \ . l:template + \ . ale#Pad(l:compile_commands_option) + \ . ale#Pad(ale#Var(a:buffer, 'cpp_cppcheck_options')) + \ . l:buffer_path_include + \ . ' %t' +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'cppcheck', +\ 'output_stream': 'both', +\ 'executable': {b -> ale#Var(b, 'cpp_cppcheck_executable')}, +\ 'cwd': function('ale#handlers#cppcheck#GetCwd'), +\ 'command': function('ale_linters#cpp#cppcheck#GetCommand'), +\ 'callback': 'ale#handlers#cppcheck#HandleCppCheckFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/cpplint.vim b/dot_vim/plugged/ale/ale_linters/cpp/cpplint.vim new file mode 100644 index 0000000..f1f6ce7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/cpplint.vim @@ -0,0 +1,20 @@ +" Author: Dawid Kurek https://github.com/dawikur +" Description: cpplint for cpp files + +call ale#Set('cpp_cpplint_executable', 'cpplint') +call ale#Set('cpp_cpplint_options', '') + +function! ale_linters#cpp#cpplint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'cpp_cpplint_options') + + return '%e' . ale#Pad(l:options) . ' %s' +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'cpplint', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'cpp_cpplint_executable')}, +\ 'command': function('ale_linters#cpp#cpplint#GetCommand'), +\ 'callback': 'ale#handlers#cpplint#HandleCppLintFormat', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/cquery.vim b/dot_vim/plugged/ale/ale_linters/cpp/cquery.vim new file mode 100644 index 0000000..2971cdc --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/cquery.vim @@ -0,0 +1,30 @@ +" Author: Ben Falconer +" Description: A language server for C++ + +call ale#Set('cpp_cquery_executable', 'cquery') +call ale#Set('cpp_cquery_cache_directory', expand('~/.cache/cquery')) + +function! ale_linters#cpp#cquery#GetProjectRoot(buffer) abort + " Try to find cquery configuration files first. + let l:config = ale#path#FindNearestFile(a:buffer, '.cquery') + + if !empty(l:config) + return fnamemodify(l:config, ':h') + endif + + " Fall back on default project root detection. + return ale#c#FindProjectRoot(a:buffer) +endfunction + +function! ale_linters#cpp#cquery#GetInitializationOptions(buffer) abort + return {'cacheDirectory': ale#Var(a:buffer, 'cpp_cquery_cache_directory')} +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'cquery', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'cpp_cquery_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale_linters#cpp#cquery#GetProjectRoot'), +\ 'initialization_options': function('ale_linters#cpp#cquery#GetInitializationOptions'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cpp/cspell.vim b/dot_vim/plugged/ale/ale_linters/cpp/cspell.vim new file mode 100644 index 0000000..ace4c3b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for C++ files. + +call ale#handlers#cspell#DefineLinter('cpp') diff --git a/dot_vim/plugged/ale/ale_linters/cpp/flawfinder.vim b/dot_vim/plugged/ale/ale_linters/cpp/flawfinder.vim new file mode 100644 index 0000000..5bfdea2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cpp/flawfinder.vim @@ -0,0 +1,25 @@ +" Author: Christian Gibbons +" Description: flawfinder linter for c++ files + +call ale#Set('cpp_flawfinder_executable', 'flawfinder') +call ale#Set('cpp_flawfinder_options', '') +call ale#Set('cpp_flawfinder_minlevel', 1) +call ale#Set('c_flawfinder_error_severity', 6) + +function! ale_linters#cpp#flawfinder#GetCommand(buffer) abort + " Set the minimum vulnerability level for flawfinder to bother with + let l:minlevel = ' --minlevel=' . ale#Var(a:buffer, 'cpp_flawfinder_minlevel') + + return '%e -CDQS' + \ . ale#Var(a:buffer, 'cpp_flawfinder_options') + \ . l:minlevel + \ . ' %t' +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'flawfinder', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'cpp_flawfinder_executable')}, +\ 'command': function('ale_linters#cpp#flawfinder#GetCommand'), +\ 'callback': 'ale#handlers#flawfinder#HandleFlawfinderFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/crystal/ameba.vim b/dot_vim/plugged/ale/ale_linters/crystal/ameba.vim new file mode 100644 index 0000000..5dfc7f4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/crystal/ameba.vim @@ -0,0 +1,57 @@ +" Author: Harrison Bachrach - https://github.com/HarrisonB +" Description: Ameba, a linter for crystal files + +call ale#Set('crystal_ameba_executable', 'bin/ameba') + +function! ale_linters#crystal#ameba#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'crystal_ameba_executable') + + return ale#Escape(l:executable) + \ . ' --format json ' + \ . ale#Escape(expand('#' . a:buffer . ':p')) +endfunction + +" Handle output from ameba +function! ale_linters#crystal#ameba#HandleAmebaOutput(buffer, lines) abort + if len(a:lines) == 0 + return [] + endif + + let l:errors = ale#util#FuzzyJSONDecode(a:lines[0], {}) + + if !has_key(l:errors, 'summary') + \|| l:errors['summary']['issues_count'] == 0 + \|| empty(l:errors['sources']) + return [] + endif + + let l:output = [] + + for l:error in l:errors['sources'][0]['issues'] + let l:start_col = str2nr(l:error['location']['column']) + let l:end_col = str2nr(l:error['end_location']['column']) + + if !l:end_col + let l:end_col = l:start_col + 1 + endif + + call add(l:output, { + \ 'lnum': str2nr(l:error['location']['line']), + \ 'col': l:start_col, + \ 'end_col': l:end_col, + \ 'code': l:error['rule_name'], + \ 'text': l:error['message'], + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('crystal', { +\ 'name': 'ameba', +\ 'executable': {b -> ale#Var(b, 'crystal_ameba_executable')}, +\ 'command': function('ale_linters#crystal#ameba#GetCommand'), +\ 'callback': 'ale_linters#crystal#ameba#HandleAmebaOutput', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/crystal/crystal.vim b/dot_vim/plugged/ale/ale_linters/crystal/crystal.vim new file mode 100644 index 0000000..8a905b1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/crystal/crystal.vim @@ -0,0 +1,35 @@ +" Author: Jordan Andree , David Alexander +" Description: This file adds support for checking Crystal with crystal build + +function! ale_linters#crystal#crystal#Handle(buffer, lines) abort + let l:output = [] + + for l:error in ale#util#FuzzyJSONDecode(a:lines, []) + if !has_key(l:error, 'file') + continue + endif + + call add(l:output, { + \ 'lnum': l:error.line + 0, + \ 'col': l:error.column + 0, + \ 'text': l:error.message, + \}) + endfor + + return l:output +endfunction + +function! ale_linters#crystal#crystal#GetCommand(buffer) abort + return 'crystal build -f json --no-codegen --no-color -o ' + \ . ale#Escape(g:ale#util#nul_file) + \ . ' %s' +endfunction + +call ale#linter#Define('crystal', { +\ 'name': 'crystal', +\ 'executable': 'crystal', +\ 'output_stream': 'both', +\ 'lint_file': 1, +\ 'command': function('ale_linters#crystal#crystal#GetCommand'), +\ 'callback': 'ale_linters#crystal#crystal#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cs/csc.vim b/dot_vim/plugged/ale/ale_linters/cs/csc.vim new file mode 100644 index 0000000..5ee3de2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cs/csc.vim @@ -0,0 +1,90 @@ +call ale#Set('cs_csc_options', '') +call ale#Set('cs_csc_source', '') +call ale#Set('cs_csc_assembly_path', []) +call ale#Set('cs_csc_assemblies', []) + +function! ale_linters#cs#csc#GetCwd(buffer) abort + let l:cwd = ale#Var(a:buffer, 'cs_csc_source') + + return !empty(l:cwd) ? l:cwd : expand('#' . a:buffer . ':p:h') +endfunction + +function! ale_linters#cs#csc#GetCommand(buffer) abort + " Pass assembly paths via the -lib: parameter. + let l:path_list = ale#Var(a:buffer, 'cs_csc_assembly_path') + + let l:lib_option = !empty(l:path_list) + \ ? '/lib:' . join(map(copy(l:path_list), 'ale#Escape(v:val)'), ',') + \ : '' + + " Pass paths to DLL files via the -r: parameter. + let l:assembly_list = ale#Var(a:buffer, 'cs_csc_assemblies') + + let l:r_option = !empty(l:assembly_list) + \ ? '/r:' . join(map(copy(l:assembly_list), 'ale#Escape(v:val)'), ',') + \ : '' + + " register temporary module target file with ale + " register temporary module target file with ALE. + let l:out = ale#command#CreateFile(a:buffer) + + " The code is compiled as a module and the output is redirected to a + " temporary file. + return 'csc /unsafe' + \ . ale#Pad(ale#Var(a:buffer, 'cs_csc_options')) + \ . ale#Pad(l:lib_option) + \ . ale#Pad(l:r_option) + \ . ' /out:' . l:out + \ . ' /t:module' + \ . ' /recurse:' . ale#Escape('*.cs') +endfunction + +function! ale_linters#cs#csc#Handle(buffer, lines) abort + " Look for lines like the following. + " + " Tests.cs(12,29): error CSXXXX: ; expected + " + " NOTE: pattern also captures file name as linter compiles all + " files within the source tree rooted at the specified source + " path and not just the file loaded in the buffer + let l:patterns = [ + \ '^\v(.+\.cs)\((\d+),(\d+)\)\:\s+([^ ]+)\s+([cC][sS][^ ]+):\s(.+)$', + \ '^\v([^ ]+)\s+([Cc][sS][^ ]+):\s+(.+)$', + \] + let l:output = [] + let l:dir = ale_linters#cs#csc#GetCwd(a:buffer) + + for l:match in ale#util#GetMatches(a:lines, l:patterns) + if len(l:match) > 6 && strlen(l:match[5]) > 2 && l:match[5][:1] is? 'CS' + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'type': l:match[4] is# 'error' ? 'E' : 'W', + \ 'code': l:match[5], + \ 'text': l:match[6] , + \}) + elseif strlen(l:match[2]) > 2 && l:match[2][:1] is? 'CS' + call add(l:output, { + \ 'filename':'', + \ 'lnum': -1, + \ 'col': -1, + \ 'type': l:match[1] is# 'error' ? 'E' : 'W', + \ 'code': l:match[2], + \ 'text': l:match[3], + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('cs',{ +\ 'name': 'csc', +\ 'output_stream': 'stdout', +\ 'executable': 'csc', +\ 'cwd': function('ale_linters#cs#csc#GetCwd'), +\ 'command': function('ale_linters#cs#csc#GetCommand'), +\ 'callback': 'ale_linters#cs#csc#Handle', +\ 'lint_file': 1 +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cs/cspell.vim b/dot_vim/plugged/ale/ale_linters/cs/cspell.vim new file mode 100644 index 0000000..c62dd11 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cs/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for C# files. + +call ale#handlers#cspell#DefineLinter('cs') diff --git a/dot_vim/plugged/ale/ale_linters/cs/mcs.vim b/dot_vim/plugged/ale/ale_linters/cs/mcs.vim new file mode 100644 index 0000000..1b373e7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cs/mcs.vim @@ -0,0 +1,37 @@ +let g:ale_cs_mcs_options = get(g:, 'ale_cs_mcs_options', '') + +function! ale_linters#cs#mcs#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'cs_mcs_options') + + return 'mcs -unsafe --parse' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %t' +endfunction + +function! ale_linters#cs#mcs#Handle(buffer, lines) abort + " Look for lines like the following. + " + " Tests.cs(12,29): error CSXXXX: ; expected + let l:pattern = '^\v(.+\.cs)\((\d+),(\d+)\)\: ([^ ]+) ([^ ]+): (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'type': l:match[4] is# 'error' ? 'E' : 'W', + \ 'code': l:match[5], + \ 'text': l:match[6], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('cs',{ +\ 'name': 'mcs', +\ 'output_stream': 'stderr', +\ 'executable': 'mcs', +\ 'command': function('ale_linters#cs#mcs#GetCommand'), +\ 'callback': 'ale_linters#cs#mcs#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cs/mcsc.vim b/dot_vim/plugged/ale/ale_linters/cs/mcsc.vim new file mode 100644 index 0000000..2dd4666 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cs/mcsc.vim @@ -0,0 +1,91 @@ +call ale#Set('cs_mcsc_options', '') +call ale#Set('cs_mcsc_source', '') +call ale#Set('cs_mcsc_assembly_path', []) +call ale#Set('cs_mcsc_assemblies', []) + +function! ale_linters#cs#mcsc#GetCwd(buffer) abort + let l:cwd = ale#Var(a:buffer, 'cs_mcsc_source') + + return !empty(l:cwd) ? l:cwd : expand('#' . a:buffer . ':p:h') +endfunction + +function! ale_linters#cs#mcsc#GetCommand(buffer) abort + " Pass assembly paths via the -lib: parameter. + let l:path_list = ale#Var(a:buffer, 'cs_mcsc_assembly_path') + + let l:lib_option = !empty(l:path_list) + \ ? '-lib:' . join(map(copy(l:path_list), 'ale#Escape(v:val)'), ',') + \ : '' + + " Pass paths to DLL files via the -r: parameter. + let l:assembly_list = ale#Var(a:buffer, 'cs_mcsc_assemblies') + + let l:r_option = !empty(l:assembly_list) + \ ? '-r:' . join(map(copy(l:assembly_list), 'ale#Escape(v:val)'), ',') + \ : '' + + " register temporary module target file with ale + " register temporary module target file with ALE. + let l:out = ale#command#CreateFile(a:buffer) + + " The code is compiled as a module and the output is redirected to a + " temporary file. + return 'mcs -unsafe' + \ . ale#Pad(ale#Var(a:buffer, 'cs_mcsc_options')) + \ . ale#Pad(l:lib_option) + \ . ale#Pad(l:r_option) + \ . ' -out:' . l:out + \ . ' -t:module' + \ . ' -recurse:' . ale#Escape('*.cs') +endfunction + +function! ale_linters#cs#mcsc#Handle(buffer, lines) abort + " Look for lines like the following. + " + " Tests.cs(12,29): error CSXXXX: ; expected + " + " NOTE: pattern also captures file name as linter compiles all + " files within the source tree rooted at the specified source + " path and not just the file loaded in the buffer + let l:patterns = [ + \ '^\v(.+\.cs)\((\d+),(\d+)\)\:\s+([^ ]+)\s+([cC][sS][^ ]+):\s(.+)$', + \ '^\v([^ ]+)\s+([Cc][sS][^ ]+):\s+(.+)$', + \] + let l:output = [] + + let l:dir = ale_linters#cs#mcsc#GetCwd(a:buffer) + + for l:match in ale#util#GetMatches(a:lines, l:patterns) + if len(l:match) > 6 && strlen(l:match[5]) > 2 && l:match[5][:1] is? 'CS' + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'type': l:match[4] is# 'error' ? 'E' : 'W', + \ 'code': l:match[5], + \ 'text': l:match[6] , + \}) + elseif strlen(l:match[2]) > 2 && l:match[2][:1] is? 'CS' + call add(l:output, { + \ 'filename':'', + \ 'lnum': -1, + \ 'col': -1, + \ 'type': l:match[1] is# 'error' ? 'E' : 'W', + \ 'code': l:match[2], + \ 'text': l:match[3], + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('cs',{ +\ 'name': 'mcsc', +\ 'output_stream': 'stderr', +\ 'executable': 'mcs', +\ 'cwd': function('ale_linters#cs#mcsc#GetCwd'), +\ 'command': function('ale_linters#cs#mcsc#GetCommand'), +\ 'callback': 'ale_linters#cs#mcsc#Handle', +\ 'lint_file': 1 +\}) diff --git a/dot_vim/plugged/ale/ale_linters/css/cspell.vim b/dot_vim/plugged/ale/ale_linters/css/cspell.vim new file mode 100644 index 0000000..d42375b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/css/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for CSS files. + +call ale#handlers#cspell#DefineLinter('css') diff --git a/dot_vim/plugged/ale/ale_linters/css/csslint.vim b/dot_vim/plugged/ale/ale_linters/css/csslint.vim new file mode 100644 index 0000000..50c21ce --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/css/csslint.vim @@ -0,0 +1,18 @@ +" Author: w0rp +" Description: This file adds support for checking CSS code with csslint. + +function! ale_linters#css#csslint#GetCommand(buffer) abort + let l:csslintrc = ale#path#FindNearestFile(a:buffer, '.csslintrc') + let l:config_option = !empty(l:csslintrc) + \ ? '--config=' . ale#Escape(l:csslintrc) + \ : '' + + return 'csslint --format=compact ' . l:config_option . ' %t' +endfunction + +call ale#linter#Define('css', { +\ 'name': 'csslint', +\ 'executable': 'csslint', +\ 'command': function('ale_linters#css#csslint#GetCommand'), +\ 'callback': 'ale#handlers#css#HandleCSSLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/css/fecs.vim b/dot_vim/plugged/ale/ale_linters/css/fecs.vim new file mode 100644 index 0000000..511847c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/css/fecs.vim @@ -0,0 +1,9 @@ +" Author: harttle +" Description: fecs for CSS files + +call ale#linter#Define('css', { +\ 'name': 'fecs', +\ 'executable': function('ale#handlers#fecs#GetExecutable'), +\ 'command': function('ale#handlers#fecs#GetCommand'), +\ 'callback': 'ale#handlers#fecs#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/css/stylelint.vim b/dot_vim/plugged/ale/ale_linters/css/stylelint.vim new file mode 100644 index 0000000..e508f39 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/css/stylelint.vim @@ -0,0 +1,19 @@ +" Author: diartyz + +call ale#Set('css_stylelint_executable', 'stylelint') +call ale#Set('css_stylelint_options', '') +call ale#Set('css_stylelint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#css#stylelint#GetCommand(buffer) abort + return '%e ' . ale#Pad(ale#Var(a:buffer, 'css_stylelint_options')) + \ . ' --stdin-filename %s' +endfunction + +call ale#linter#Define('css', { +\ 'name': 'stylelint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'css_stylelint', [ +\ 'node_modules/.bin/stylelint', +\ ])}, +\ 'command': function('ale_linters#css#stylelint#GetCommand'), +\ 'callback': 'ale#handlers#css#HandleStyleLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/css/vscodecss.vim b/dot_vim/plugged/ale/ale_linters/css/vscodecss.vim new file mode 100644 index 0000000..2d59adf --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/css/vscodecss.vim @@ -0,0 +1,16 @@ +" Author: Dalius Dobravolskas +" Description: VSCode css language server + +function! ale_linters#css#vscodecss#GetProjectRoot(buffer) abort + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +call ale#linter#Define('css', { +\ 'name': 'vscodecss', +\ 'lsp': 'stdio', +\ 'executable': 'vscode-css-language-server', +\ 'command': '%e --stdio', +\ 'project_root': function('ale_linters#css#vscodecss#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cucumber/cucumber.vim b/dot_vim/plugged/ale/ale_linters/cucumber/cucumber.vim new file mode 100644 index 0000000..0cfd815 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cucumber/cucumber.vim @@ -0,0 +1,46 @@ +" Author: Eddie Lebow https://github.com/elebow +" Description: Cucumber, a BDD test tool + +function! ale_linters#cucumber#cucumber#GetCommand(buffer) abort + let l:features_dir = ale#path#FindNearestDirectory(a:buffer, 'features') + + if !empty(l:features_dir) + let l:features_arg = '-r ' . ale#Escape(l:features_dir) + else + let l:features_arg = '' + endif + + return 'cucumber --dry-run --quiet --strict --format=json ' + \ . l:features_arg . ' %t' +endfunction + +function! ale_linters#cucumber#cucumber#Handle(buffer, lines) abort + try + let l:json = ale#util#FuzzyJSONDecode(a:lines, {})[0] + catch + return [] + endtry + + let l:output = [] + + for l:element in get(l:json, 'elements', []) + for l:step in l:element['steps'] + if l:step['result']['status'] is# 'undefined' + call add(l:output, { + \ 'lnum': l:step['line'], + \ 'code': 'E', + \ 'text': 'Undefined step' + \}) + endif + endfor + endfor + + return l:output +endfunction + +call ale#linter#Define('cucumber', { +\ 'name': 'cucumber', +\ 'executable': 'cucumber', +\ 'command': function('ale_linters#cucumber#cucumber#GetCommand'), +\ 'callback': 'ale_linters#cucumber#cucumber#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cuda/clangd.vim b/dot_vim/plugged/ale/ale_linters/cuda/clangd.vim new file mode 100644 index 0000000..bfda821 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cuda/clangd.vim @@ -0,0 +1,23 @@ +" Author: Tommy Chiang +" Description: Clangd language server for CUDA (modified from Andrey +" Melentyev's implementation for C++) + +call ale#Set('cuda_clangd_executable', 'clangd') +call ale#Set('cuda_clangd_options', '') +call ale#Set('c_build_dir', '') + +function! ale_linters#cuda#clangd#GetCommand(buffer) abort + let l:build_dir = ale#c#GetBuildDirectory(a:buffer) + + return '%e' + \ . ale#Pad(ale#Var(a:buffer, 'cuda_clangd_options')) + \ . (!empty(l:build_dir) ? ' -compile-commands-dir=' . ale#Escape(l:build_dir) : '') +endfunction + +call ale#linter#Define('cuda', { +\ 'name': 'clangd', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'cuda_clangd_executable')}, +\ 'command': function('ale_linters#cuda#clangd#GetCommand'), +\ 'project_root': function('ale#c#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cuda/nvcc.vim b/dot_vim/plugged/ale/ale_linters/cuda/nvcc.vim new file mode 100644 index 0000000..2734f6e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cuda/nvcc.vim @@ -0,0 +1,46 @@ +" Author: blahgeek +" Description: NVCC linter for cuda files + +call ale#Set('cuda_nvcc_executable', 'nvcc') +call ale#Set('cuda_nvcc_options', '-std=c++11') + +function! ale_linters#cuda#nvcc#GetCommand(buffer) abort + return '%e -cuda' + \ . ale#Pad(ale#c#IncludeOptions(ale#c#FindLocalHeaderPaths(a:buffer))) + \ . ale#Pad(ale#Var(a:buffer, 'cuda_nvcc_options')) + \ . ' %s -o ' . g:ale#util#nul_file +endfunction + +function! ale_linters#cuda#nvcc#HandleNVCCFormat(buffer, lines) abort + " Look for lines like the following. + " + " test.cu(8): error: argument of type "void *" is incompatible with parameter of type "int *" + let l:pattern = '\v^([^:\(\)]+):?\(?(\d+)\)?:(\d+)?:?\s*\w*\s*(error|warning): (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': str2nr(l:match[2]), + \ 'type': l:match[4] =~# 'error' ? 'E' : 'W', + \ 'text': l:match[5], + \ 'filename': fnamemodify(l:match[1], ':p'), + \} + + if !empty(l:match[3]) + let l:item.col = str2nr(l:match[3]) + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('cuda', { +\ 'name': 'nvcc', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'cuda_nvcc_executable')}, +\ 'command': function('ale_linters#cuda#nvcc#GetCommand'), +\ 'callback': 'ale_linters#cuda#nvcc#HandleNVCCFormat', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/cypher/cypher_lint.vim b/dot_vim/plugged/ale/ale_linters/cypher/cypher_lint.vim new file mode 100644 index 0000000..408ddd6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/cypher/cypher_lint.vim @@ -0,0 +1,26 @@ +" Author: Francisco Lopes +" Description: Linting for Neo4j's Cypher + +function! ale_linters#cypher#cypher_lint#Handle(buffer, lines) abort + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+): (.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[4], + \ 'type': 'E', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('cypher', { +\ 'name': 'cypher_lint', +\ 'executable': 'cypher-lint', +\ 'command': 'cypher-lint', +\ 'output_stream': 'stderr', +\ 'callback': 'ale_linters#cypher#cypher_lint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/d/dls.vim b/dot_vim/plugged/ale/ale_linters/d/dls.vim new file mode 100644 index 0000000..78d1c15 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/d/dls.vim @@ -0,0 +1,22 @@ +" Author: aurieh +" Description: A Language Server implementation for D + +call ale#Set('d_dls_executable', 'dls') + +function! ale_linters#d#dls#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'd_dls_executable') +endfunction + +function! ale_linters#d#dls#FindProjectRoot(buffer) abort + " Note: this will return . if dub config is empty + " dls can run outside DUB projects just fine + return fnamemodify(ale#d#FindDUBConfig(a:buffer), ':h') +endfunction + +call ale#linter#Define('d', { +\ 'name': 'dls', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#d#dls#GetExecutable'), +\ 'command': function('ale_linters#d#dls#GetExecutable'), +\ 'project_root': function('ale_linters#d#dls#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/d/dmd.vim b/dot_vim/plugged/ale/ale_linters/d/dmd.vim new file mode 100644 index 0000000..f38e812 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/d/dmd.vim @@ -0,0 +1,116 @@ +" Author: w0rp +" Description: "dmd for D files" + +function! s:GetDUBCommand(buffer) abort + " If we can't run dub, then skip this command. + if executable('dub') + " Returning an empty string skips to the DMD command. + let l:config = ale#d#FindDUBConfig(a:buffer) + + " To support older dub versions, we just change the directory to the + " directory where we found the dub config, and then run `dub describe` + " from that directory. + if !empty(l:config) + return [fnamemodify(l:config, ':h'), 'dub describe --data-list + \ --data=import-paths + \ --data=string-import-paths + \ --data=versions + \ --data=debug-versions + \'] + endif + endif + + return ['', ''] +endfunction + +function! ale_linters#d#dmd#RunDUBCommand(buffer) abort + let [l:cwd, l:command] = s:GetDUBCommand(a:buffer) + + if empty(l:command) + " If we can't run DUB, just run DMD. + return ale_linters#d#dmd#DMDCommand(a:buffer, [], {}) + endif + + return ale#command#Run( + \ a:buffer, + \ l:command, + \ function('ale_linters#d#dmd#DMDCommand'), + \ {'cwd': l:cwd}, + \) +endfunction + +function! ale_linters#d#dmd#DMDCommand(buffer, dub_output, meta) abort + let l:import_list = [] + let l:str_import_list = [] + let l:versions_list = [] + let l:deb_versions_list = [] + let l:list_ind = 1 + let l:seen_line = 0 + + " Build a list of options generated from DUB, if available. + " DUB output each path or version on a single line. + " Each list is separated by a blank line. + " Empty list are represented by a blank line (followed and/or + " preceded by a separation blank line) + for l:line in a:dub_output + " line still has end of line char on windows + let l:line = substitute(l:line, '[\r\n]*$', '', '') + + if !empty(l:line) + if l:list_ind == 1 + call add(l:import_list, '-I' . ale#Escape(l:line)) + elseif l:list_ind == 2 + call add(l:str_import_list, '-J' . ale#Escape(l:line)) + elseif l:list_ind == 3 + call add(l:versions_list, '-version=' . ale#Escape(l:line)) + elseif l:list_ind == 4 + call add(l:deb_versions_list, '-debug=' . ale#Escape(l:line)) + endif + + let l:seen_line = 1 + elseif !l:seen_line + " if list is empty must skip one empty line + let l:seen_line = 1 + else + let l:seen_line = 0 + let l:list_ind += 1 + endif + endfor + + return 'dmd ' . join(l:import_list) . ' ' . + \ join(l:str_import_list) . ' ' . + \ join(l:versions_list) . ' ' . + \ join(l:deb_versions_list) . ' -o- -wi -vcolumns -c %t' +endfunction + +function! ale_linters#d#dmd#Handle(buffer, lines) abort + " Matches patterns lines like the following: + " /tmp/tmp.qclsa7qLP7/file.d(1): Error: function declaration without return type. (Note that constructors are always named 'this') + " /tmp/tmp.G1L5xIizvB.d(8,8): Error: module weak_reference is in file 'dstruct/weak_reference.d' which cannot be read + let l:pattern = '\v^(\f+)\((\d+)(,(\d+))?\): (\w+): (.+)$' + let l:output = [] + let l:dir = expand('#' . a:buffer . ':p:h') + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + " If dmd was invoked with relative path, match[1] is relative, otherwise it is absolute. + " As we invoke dmd with the buffer path (in /tmp), this will generally be absolute already + let l:fname = ale#path#GetAbsPath(l:dir, l:match[1]) + call add(l:output, { + \ 'filename': l:fname, + \ 'lnum': l:match[2], + \ 'col': l:match[4], + \ 'type': l:match[5] is# 'Warning' || l:match[5] is# 'Deprecation' ? 'W' : 'E', + \ 'text': l:match[6], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('d', { +\ 'name': 'dmd', +\ 'executable': 'dmd', +\ 'command': function('ale_linters#d#dmd#RunDUBCommand'), +\ 'callback': 'ale_linters#d#dmd#Handle', +\ 'output_stream': 'stderr', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/dafny/dafny.vim b/dot_vim/plugged/ale/ale_linters/dafny/dafny.vim new file mode 100644 index 0000000..2a9f761 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/dafny/dafny.vim @@ -0,0 +1,41 @@ +" Author: Taylor Blau + +function! ale_linters#dafny#dafny#Handle(buffer, lines) abort + let l:pattern = '\v(.*)\((\d+),(\d+)\): (.*): (.*)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'filename': l:match[1], + \ 'col': l:match[3] + 0, + \ 'lnum': l:match[2] + 0, + \ 'text': l:match[5], + \ 'type': l:match[4] =~# '^Error' ? 'E' : 'W' + \ }) + endfor + + for l:match in ale#util#GetMatches(a:lines, '\v(.*)\((\d+),(\d+)\): (Verification of .{-} timed out after \d+ seconds)') + call add(l:output, { + \ 'filename': l:match[1], + \ 'col': l:match[3] + 0, + \ 'lnum': l:match[2] + 0, + \ 'text': l:match[4], + \ 'type': 'E', + \ }) + endfor + + return l:output +endfunction + +function! ale_linters#dafny#dafny#GetCommand(buffer) abort + return printf('dafny %%s /compile:0 /timeLimit:%d', ale#Var(a:buffer, 'dafny_dafny_timelimit')) +endfunction + +call ale#Set('dafny_dafny_timelimit', 10) +call ale#linter#Define('dafny', { +\ 'name': 'dafny', +\ 'executable': 'dafny', +\ 'command': function('ale_linters#dafny#dafny#GetCommand'), +\ 'callback': 'ale_linters#dafny#dafny#Handle', +\ 'lint_file': 1, +\ }) diff --git a/dot_vim/plugged/ale/ale_linters/dart/analysis_server.vim b/dot_vim/plugged/ale/ale_linters/dart/analysis_server.vim new file mode 100644 index 0000000..a6870da --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/dart/analysis_server.vim @@ -0,0 +1,29 @@ +" Author: Nelson Yeung +" Description: Check Dart files with dart analysis server LSP + +call ale#Set('dart_analysis_server_executable', 'dart') + +function! ale_linters#dart#analysis_server#GetProjectRoot(buffer) abort + " Note: pub only looks for pubspec.yaml, there's no point in adding + " support for pubspec.yml + let l:pubspec = ale#path#FindNearestFile(a:buffer, 'pubspec.yaml') + + return !empty(l:pubspec) ? fnamemodify(l:pubspec, ':h:h') : '.' +endfunction + +function! ale_linters#dart#analysis_server#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'dart_analysis_server_executable') + let l:dart = resolve(exepath(l:executable)) + + return '%e ' + \ . fnamemodify(l:dart, ':h') . '/snapshots/analysis_server.dart.snapshot' + \ . ' --lsp' +endfunction + +call ale#linter#Define('dart', { +\ 'name': 'analysis_server', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'dart_analysis_server_executable')}, +\ 'command': function('ale_linters#dart#analysis_server#GetCommand'), +\ 'project_root': function('ale_linters#dart#analysis_server#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/dart/dart_analyze.vim b/dot_vim/plugged/ale/ale_linters/dart/dart_analyze.vim new file mode 100644 index 0000000..7d67c31 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/dart/dart_analyze.vim @@ -0,0 +1,29 @@ +" Author: ghsang +" Description: Check Dart files with dart analyze + +call ale#Set('dart_analyze_executable', 'dart') + +function! ale_linters#dart#dart_analyze#Handle(buffer, lines) abort + let l:pattern = '\v([a-z]+) - (.+):(\d+):(\d+) - (.+) - (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let [l:type, l:filename, l:lnum, l:col, l:message, l:code] = l:match[1:6] + call add(l:output, { + \ 'type': l:type is# 'error' ? 'E' : l:type is# 'info' ? 'I' : 'W', + \ 'text': l:code . ': ' . l:message, + \ 'lnum': str2nr(l:lnum), + \ 'col': str2nr(l:col), + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('dart', { +\ 'name': 'dart_analyze', +\ 'executable': {b -> ale#Var(b, 'dart_analyze_executable')}, +\ 'command': '%e analyze --fatal-infos %s', +\ 'callback': 'ale_linters#dart#dart_analyze#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/dart/language_server.vim b/dot_vim/plugged/ale/ale_linters/dart/language_server.vim new file mode 100644 index 0000000..d0e639c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/dart/language_server.vim @@ -0,0 +1,20 @@ +" Author: aurieh +" Description: A language server for dart + +call ale#Set('dart_language_server_executable', 'dart_language_server') + +function! ale_linters#dart#language_server#GetProjectRoot(buffer) abort + " Note: pub only looks for pubspec.yaml, there's no point in adding + " support for pubspec.yml + let l:pubspec = ale#path#FindNearestFile(a:buffer, 'pubspec.yaml') + + return !empty(l:pubspec) ? fnamemodify(l:pubspec, ':h:h') : '' +endfunction + +call ale#linter#Define('dart', { +\ 'name': 'language_server', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'dart_language_server_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale_linters#dart#language_server#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/desktop/desktop_file_validate.vim b/dot_vim/plugged/ale/ale_linters/desktop/desktop_file_validate.vim new file mode 100644 index 0000000..5a97d31 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/desktop/desktop_file_validate.vim @@ -0,0 +1,31 @@ +call ale#Set('desktop_desktop_file_validate_options', '') + +" Example matches for pattern: +" +" foo.desktop: warning: key "TerminalOptions" in group ... +" foo.desktop: error: action "new-private-window" is defined, ... +let s:pattern = '\v^(.+): ([a-z]+): (.+)$' + +function! ale_linters#desktop#desktop_file_validate#Handle(buffer, lines) abort + " The error format doesn't specify lines, so we can just put all of the + " errors on line 1. + return ale#util#MapMatches(a:lines, s:pattern, {match -> { + \ 'lnum': 1, + \ 'col': 1, + \ 'type': match[2] is? 'error' ? 'E' : 'W', + \ 'text': match[3], + \}}) +endfunction + +call ale#linter#Define('desktop', { +\ 'name': 'desktop_file_validate', +\ 'aliases': ['desktop-file-validate'], +\ 'executable': 'desktop-file-validate', +\ 'command': {b -> +\ '%e' +\ . ale#Pad(ale#Var(b, 'desktop_desktop_file_validate_options')) +\ . ' %t' +\ }, +\ 'callback': 'ale_linters#desktop#desktop_file_validate#Handle', +\ 'output_stream': 'both', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/dockerfile/dockerfile_lint.vim b/dot_vim/plugged/ale/ale_linters/dockerfile/dockerfile_lint.vim new file mode 100644 index 0000000..0c0ad53 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/dockerfile/dockerfile_lint.vim @@ -0,0 +1,76 @@ +" Author: Alexander Olofsson + +call ale#Set('dockerfile_dockerfile_lint_executable', 'dockerfile_lint') +call ale#Set('dockerfile_dockerfile_lint_options', '') + +function! ale_linters#dockerfile#dockerfile_lint#GetType(type) abort + if a:type is? 'error' + return 'E' + elseif a:type is? 'warn' + return 'W' + endif + + return 'I' +endfunction + +function! ale_linters#dockerfile#dockerfile_lint#Handle(buffer, lines) abort + try + let l:data = json_decode(join(a:lines, '')) + catch + return [] + endtry + + if empty(l:data) + " Should never happen, but it's better to be on the safe side + return [] + endif + + let l:messages = [] + + for l:type in ['error', 'warn', 'info'] + for l:object in l:data[l:type]['data'] + let l:line = get(l:object, 'line', -1) + let l:message = l:object['message'] + + let l:link = get(l:object, 'reference_url', '') + + if type(l:link) == v:t_list + " Somehow, reference_url is returned as two-part list. + " Anchor markers in that list are sometimes duplicated. + " See https://github.com/projectatomic/dockerfile_lint/issues/134 + let l:link = join(l:link, '') + let l:link = substitute(l:link, '##', '#', '') + endif + + let l:detail = l:message + + if get(l:object, 'description', 'None') isnot# 'None' + let l:detail .= "\n\n" . l:object['description'] + endif + + let l:detail .= "\n\n" . l:link + + call add(l:messages, { + \ 'lnum': l:line, + \ 'text': l:message, + \ 'type': ale_linters#dockerfile#dockerfile_lint#GetType(l:type), + \ 'detail': l:detail, + \}) + endfor + endfor + + return l:messages +endfunction + +function! ale_linters#dockerfile#dockerfile_lint#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'dockerfile_dockerfile_lint_options')) + \ . ' -p -j -f' + \ . ' %t' +endfunction + +call ale#linter#Define('dockerfile', { +\ 'name': 'dockerfile_lint', +\ 'executable': {b -> ale#Var(b, 'dockerfile_dockerfile_lint_executable')}, +\ 'command': function('ale_linters#dockerfile#dockerfile_lint#GetCommand'), +\ 'callback': 'ale_linters#dockerfile#dockerfile_lint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/dockerfile/hadolint.vim b/dot_vim/plugged/ale/ale_linters/dockerfile/hadolint.vim new file mode 100644 index 0000000..9a6a625 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/dockerfile/hadolint.vim @@ -0,0 +1,123 @@ +" Author: hauleth - https://github.com/hauleth + +" always, yes, never +call ale#Set('dockerfile_hadolint_use_docker', 'never') +call ale#Set('dockerfile_hadolint_docker_image', 'hadolint/hadolint') +call ale#Set('dockerfile_hadolint_options', '') + +function! ale_linters#dockerfile#hadolint#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " -:19 DL3001 warning: Pipe chain should start with a raw value. + " /dev/stdin:19:3 unexpected thing + let l:pattern = '\v^%(/dev/stdin|-):(\d+):?(\d+)? ((DL|SC)(\d+) )?((.+)?: )?(.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:lnum = 0 + let l:colnum = 0 + + if l:match[1] isnot# '' + let l:lnum = l:match[1] + 0 + endif + + if l:match[2] isnot# '' + let l:colnum = l:match[2] + 0 + endif + + " Shellcheck knows a 'style' severity - pin it to info level as well. + if l:match[7] is# 'style' + let l:type = 'I' + elseif l:match[7] is# 'info' + let l:type = 'I' + elseif l:match[7] is# 'warning' + let l:type = 'W' + else + let l:type = 'E' + endif + + let l:text = l:match[8] + let l:detail = l:match[8] + let l:domain = 'https://github.com/hadolint/hadolint/wiki/' + let l:code = '' + let l:link = '' + + if l:match[4] is# 'SC' + let l:domain = 'https://github.com/koalaman/shellcheck/wiki/' + endif + + if l:match[5] isnot# '' + let l:code = l:match[4] . l:match[5] + let l:link = ' ( ' . l:domain . l:code . ' )' + let l:text = l:code . ': ' . l:detail + let l:detail = l:code . l:link . "\n\n" . l:detail + else + let l:type = 'E' + let l:detail = 'hadolint could not parse the file because of a syntax error.' + endif + + let l:line_output = { + \ 'lnum': l:lnum, + \ 'col': l:colnum, + \ 'type': l:type, + \ 'text': l:text, + \ 'detail': l:detail + \} + + if l:code isnot# '' + let l:line_output['code'] = l:code + endif + + call add(l:output, l:line_output) + endfor + + return l:output +endfunction + +" This is a little different than the typical 'executable' callback. We want +" to afford the user the chance to say always use docker, never use docker, +" and use docker if the hadolint executable is not present on the system. +" +" In the case of neither docker nor hadolint executables being present, it +" really doesn't matter which we return -- either will have the effect of +" 'nope, can't use this linter!'. + +function! ale_linters#dockerfile#hadolint#GetExecutable(buffer) abort + let l:use_docker = ale#Var(a:buffer, 'dockerfile_hadolint_use_docker') + + " check for mandatory directives + if l:use_docker is# 'never' + return 'hadolint' + elseif l:use_docker is# 'always' + return 'docker' + endif + + " if we reach here, we want to use 'hadolint' if present... + if executable('hadolint') + return 'hadolint' + endif + + "... and 'docker' as a fallback. + return 'docker' +endfunction + +function! ale_linters#dockerfile#hadolint#GetCommand(buffer) abort + let l:command = ale_linters#dockerfile#hadolint#GetExecutable(a:buffer) + let l:opts = ale#Var(a:buffer, 'dockerfile_hadolint_options') . ' --no-color -' + + if l:command is# 'docker' + return printf('docker run --rm -i %s hadolint %s', + \ ale#Var(a:buffer, 'dockerfile_hadolint_docker_image'), + \ l:opts) + endif + + return 'hadolint ' . l:opts +endfunction + + +call ale#linter#Define('dockerfile', { +\ 'name': 'hadolint', +\ 'executable': function('ale_linters#dockerfile#hadolint#GetExecutable'), +\ 'command': function('ale_linters#dockerfile#hadolint#GetCommand'), +\ 'callback': 'ale_linters#dockerfile#hadolint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/elixir/credo.vim b/dot_vim/plugged/ale/ale_linters/elixir/credo.vim new file mode 100644 index 0000000..d6a861f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/elixir/credo.vim @@ -0,0 +1,71 @@ +" Author: hauleth - https://github.com/hauleth + +function! ale_linters#elixir#credo#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " lib/filename.ex:19:7: F: Pipe chain should start with a raw value. + let l:pattern = '\v:(\d+):?(\d+)?: (.): (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:type = l:match[3] + let l:text = l:match[4] + + " Refactoring opportunities + if l:type is# 'F' + let l:type = 'W' + " Consistency + elseif l:type is# 'C' + let l:type = 'W' + " Software Design + elseif l:type is# 'D' + let l:type = 'I' + " Code Readability + elseif l:type is# 'R' + let l:type = 'I' + endif + + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:type, + \ 'text': l:text, + \}) + endfor + + return l:output +endfunction + +function! ale_linters#elixir#credo#GetMode() abort + if get(g:, 'ale_elixir_credo_strict', 0) + return '--strict' + else + return 'suggest' + endif +endfunction + +function! ale_linters#elixir#credo#GetConfigFile() abort + let l:config_file = get(g:, 'ale_elixir_credo_config_file', '') + + if empty(l:config_file) + return '' + endif + + return ' --config-file ' . l:config_file +endfunction + +function! ale_linters#elixir#credo#GetCommand(buffer) abort + return 'mix help credo && ' + \ . 'mix credo ' . ale_linters#elixir#credo#GetMode() + \ . ale_linters#elixir#credo#GetConfigFile() + \ . ' --format=flycheck --read-from-stdin %s' +endfunction + +call ale#linter#Define('elixir', { +\ 'name': 'credo', +\ 'executable': 'mix', +\ 'cwd': function('ale#handlers#elixir#FindMixUmbrellaRoot'), +\ 'command': function('ale_linters#elixir#credo#GetCommand'), +\ 'callback': 'ale_linters#elixir#credo#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/elixir/cspell.vim b/dot_vim/plugged/ale/ale_linters/elixir/cspell.vim new file mode 100644 index 0000000..12dc271 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/elixir/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Elixir files. + +call ale#handlers#cspell#DefineLinter('elixir') diff --git a/dot_vim/plugged/ale/ale_linters/elixir/dialyxir.vim b/dot_vim/plugged/ale/ale_linters/elixir/dialyxir.vim new file mode 100644 index 0000000..9b8a5cd --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/elixir/dialyxir.vim @@ -0,0 +1,34 @@ +" Author: Fran C. - https://github.com/franciscoj +" Description: Add dialyzer support for elixir through dialyxir +" https://github.com/jeremyjh/dialyxir + +function! ale_linters#elixir#dialyxir#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " lib/filename.ex:19: Function fname/1 has no local return + let l:pattern = '\v(.+):(\d+): (.+)$' + let l:output = [] + let l:type = 'W' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if bufname(a:buffer) == l:match[1] + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:match[2] + 0, + \ 'col': 0, + \ 'type': l:type, + \ 'text': l:match[3], + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('elixir', { +\ 'name': 'dialyxir', +\ 'executable': 'mix', +\ 'cwd': function('ale#handlers#elixir#FindMixProjectRoot'), +\ 'command': 'mix help dialyzer && mix dialyzer', +\ 'callback': 'ale_linters#elixir#dialyxir#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/elixir/dogma.vim b/dot_vim/plugged/ale/ale_linters/elixir/dogma.vim new file mode 100644 index 0000000..28e7f42 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/elixir/dogma.vim @@ -0,0 +1,39 @@ +" Author: archseer - https://github.com/archSeer + +function! ale_linters#elixir#dogma#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " lib/filename.ex:19:7: F: Pipe chain should start with a raw value. + let l:pattern = '\v:(\d+):?(\d+)?: (.): (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:type = l:match[3] + let l:text = l:match[4] + + if l:type is# 'C' + let l:type = 'E' + elseif l:type is# 'R' + let l:type = 'W' + endif + + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:type, + \ 'text': l:text, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('elixir', { +\ 'name': 'dogma', +\ 'executable': 'mix', +\ 'cwd': function('ale#handlers#elixir#FindMixProjectRoot'), +\ 'command': 'mix help dogma && mix dogma %s --format=flycheck', +\ 'lint_file': 1, +\ 'callback': 'ale_linters#elixir#dogma#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/elixir/elixir_ls.vim b/dot_vim/plugged/ale/ale_linters/elixir/elixir_ls.vim new file mode 100644 index 0000000..d5517de --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/elixir/elixir_ls.vim @@ -0,0 +1,21 @@ +" Author: Jon Parise +" Description: ElixirLS integration (https://github.com/JakeBecker/elixir-ls) + +call ale#Set('elixir_elixir_ls_release', 'elixir-ls') +call ale#Set('elixir_elixir_ls_config', {}) + +function! ale_linters#elixir#elixir_ls#GetExecutable(buffer) abort + let l:dir = ale#path#Simplify(ale#Var(a:buffer, 'elixir_elixir_ls_release')) + let l:cmd = has('win32') ? '\language_server.bat' : '/language_server.sh' + + return l:dir . l:cmd +endfunction + +call ale#linter#Define('elixir', { +\ 'name': 'elixir-ls', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#elixir#elixir_ls#GetExecutable'), +\ 'command': function('ale_linters#elixir#elixir_ls#GetExecutable'), +\ 'project_root': function('ale#handlers#elixir#FindMixUmbrellaRoot'), +\ 'lsp_config': {b -> ale#Var(b, 'elixir_elixir_ls_config')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/elixir/mix.vim b/dot_vim/plugged/ale/ale_linters/elixir/mix.vim new file mode 100644 index 0000000..948c6d3 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/elixir/mix.vim @@ -0,0 +1,45 @@ +" Author: evnu - https://github.com/evnu +" Author: colbydehart - https://github.com/colbydehart +" Description: Mix compile checking for Elixir files + +function! ale_linters#elixir#mix#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " Error format + " ** (CompileError) apps/sim/lib/sim/server.ex:87: undefined function update_in/4 + " + " TODO: Warning format + " warning: variable "foobar" does not exist and is being expanded to "foobar()", please use parentheses to remove the ambiguity or change the variable name + let l:pattern = '\v\(([^\)]+Error)\) ([^:]+):([^:]+): (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:type = 'E' + let l:text = l:match[4] + + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:match[3] + 0, + \ 'col': 0, + \ 'type': l:type, + \ 'text': l:text, + \}) + endfor + + return l:output +endfunction + +function! ale_linters#elixir#mix#GetCommand(buffer) abort + let l:temp_dir = ale#command#CreateDirectory(a:buffer) + + return ale#Env('MIX_BUILD_PATH', l:temp_dir) . 'mix compile %s' +endfunction + +call ale#linter#Define('elixir', { +\ 'name': 'mix', +\ 'executable': 'mix', +\ 'cwd': function('ale#handlers#elixir#FindMixProjectRoot'), +\ 'command': function('ale_linters#elixir#mix#GetCommand'), +\ 'callback': 'ale_linters#elixir#mix#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/elm/elm_ls.vim b/dot_vim/plugged/ale/ale_linters/elm/elm_ls.vim new file mode 100644 index 0000000..a02dbf4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/elm/elm_ls.vim @@ -0,0 +1,40 @@ +" Author: antew - https://github.com/antew +" Description: elm-language-server integration for elm (diagnostics, formatting, and more) + +call ale#Set('elm_ls_executable', 'elm-language-server') +call ale#Set('elm_ls_use_global', get(g:, 'ale_use_global_executables', 1)) + +" elm-language-server will search for local and global binaries, if empty +call ale#Set('elm_ls_elm_path', '') +call ale#Set('elm_ls_elm_format_path', '') +call ale#Set('elm_ls_elm_test_path', '') +call ale#Set('elm_ls_elm_analyse_trigger', 'change') + +function! elm_ls#GetRootDir(buffer) abort + let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm.json') + + return !empty(l:elm_json) ? fnamemodify(l:elm_json, ':p:h') : '' +endfunction + +function! elm_ls#GetOptions(buffer) abort + return { + \ 'elmPath': ale#Var(a:buffer, 'elm_ls_elm_path'), + \ 'elmFormatPath': ale#Var(a:buffer, 'elm_ls_elm_format_path'), + \ 'elmTestPath': ale#Var(a:buffer, 'elm_ls_elm_test_path'), + \ 'elmAnalyseTrigger': ale#Var(a:buffer, 'elm_ls_elm_analyse_trigger'), + \} +endfunction + +call ale#linter#Define('elm', { +\ 'name': 'elm_ls', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#path#FindExecutable(b, 'elm_ls', [ +\ 'node_modules/.bin/elm-language-server', +\ 'node_modules/.bin/elm-lsp', +\ 'elm-lsp' +\ ])}, +\ 'command': '%e --stdio', +\ 'project_root': function('elm_ls#GetRootDir'), +\ 'language': 'elm', +\ 'initialization_options': function('elm_ls#GetOptions') +\}) diff --git a/dot_vim/plugged/ale/ale_linters/elm/make.vim b/dot_vim/plugged/ale/ale_linters/elm/make.vim new file mode 100644 index 0000000..a7f9ea7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/elm/make.vim @@ -0,0 +1,242 @@ +" Author: buffalocoder - https://github.com/buffalocoder, soywod - https://github.com/soywod, hecrj - https://github.com/hecrj +" Description: Elm linting in Ale. Closely follows the Syntastic checker in https://github.com/ElmCast/elm-vim. + +call ale#Set('elm_make_executable', 'elm') +call ale#Set('elm_make_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#elm#make#Handle(buffer, lines) abort + let l:output = [] + let l:unparsed_lines = [] + + for l:line in a:lines + if l:line[0] is# '{' + " Elm 0.19 + call ale_linters#elm#make#HandleElm019Line(l:line, l:output) + elseif l:line[0] is# '[' + " Elm 0.18 + call ale_linters#elm#make#HandleElm018Line(l:line, l:output) + elseif l:line isnot# 'Successfully generated /dev/null' + call add(l:unparsed_lines, l:line) + endif + endfor + + if len(l:unparsed_lines) > 0 + call add(l:output, { + \ 'lnum': 1, + \ 'type': 'E', + \ 'text': l:unparsed_lines[0], + \ 'detail': join(l:unparsed_lines, "\n") + \}) + endif + + return l:output +endfunction + +function! ale_linters#elm#make#HandleElm019Line(line, output) abort + let l:report = json_decode(a:line) + + if l:report.type is? 'error' + " General problem + let l:details = ale_linters#elm#make#ParseMessage(l:report.message) + + if empty(l:report.path) + let l:report.path = 'Elm' + endif + + if ale_linters#elm#make#FileIsBuffer(l:report.path) + call add(a:output, { + \ 'lnum': 1, + \ 'type': 'E', + \ 'text': l:details, + \}) + else + call add(a:output, { + \ 'lnum': 1, + \ 'type': 'E', + \ 'text': l:report.path .' - '. l:details, + \ 'detail': l:report.path ." ----------\n\n". l:details, + \}) + endif + else + " Compilation errors + for l:error in l:report.errors + let l:file_is_buffer = ale_linters#elm#make#FileIsBuffer(l:error.path) + + for l:problem in l:error.problems + let l:details = ale_linters#elm#make#ParseMessage(l:problem.message) + + if l:file_is_buffer + " Buffer module has problems + call add(a:output, { + \ 'lnum': l:problem.region.start.line, + \ 'col': l:problem.region.start.column, + \ 'end_lnum': l:problem.region.end.line, + \ 'end_col': l:problem.region.end.column, + \ 'type': 'E', + \ 'text': l:details, + \}) + else + " Imported module has problems + let l:location = l:error.path .':'. l:problem.region.start.line + call add(a:output, { + \ 'lnum': 1, + \ 'type': 'E', + \ 'text': l:location .' - '. l:details, + \ 'detail': l:location ." ----------\n\n". l:details, + \}) + endif + endfor + endfor + endif +endfunction + +function! ale_linters#elm#make#HandleElm018Line(line, output) abort + let l:errors = json_decode(a:line) + + for l:error in l:errors + let l:file_is_buffer = ale_linters#elm#make#FileIsBuffer(l:error.file) + + if l:file_is_buffer + " Current buffer has problems + call add(a:output, { + \ 'lnum': l:error.region.start.line, + \ 'col': l:error.region.start.column, + \ 'end_lnum': l:error.region.end.line, + \ 'end_col': l:error.region.end.column, + \ 'type': (l:error.type is? 'error') ? 'E' : 'W', + \ 'text': l:error.overview, + \ 'detail': l:error.overview . "\n\n" . l:error.details + \}) + elseif l:error.type is? 'error' + " Imported module has errors + let l:location = l:error.file .':'. l:error.region.start.line + + call add(a:output, { + \ 'lnum': 1, + \ 'type': 'E', + \ 'text': l:location .' - '. l:error.overview, + \ 'detail': l:location ." ----------\n\n". l:error.overview . "\n\n" . l:error.details + \}) + endif + endfor +endfunction + +function! ale_linters#elm#make#FileIsBuffer(path) abort + return ale#path#IsTempName(a:path) +endfunction + +function! ale_linters#elm#make#ParseMessage(message) abort + return join(map(copy(a:message), 'ale_linters#elm#make#ParseMessageItem(v:val)'), '') +endfunction + +function! ale_linters#elm#make#ParseMessageItem(item) abort + if type(a:item) is v:t_string + return a:item + else + return a:item.string + endif +endfunction + +function! ale_linters#elm#make#GetPackageFile(buffer) abort + let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm.json') + + if empty(l:elm_json) + " Fallback to Elm 0.18 + let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm-package.json') + endif + + return l:elm_json +endfunction + +function! ale_linters#elm#make#IsVersionGte19(buffer) abort + let l:elm_json = ale_linters#elm#make#GetPackageFile(a:buffer) + + if l:elm_json =~# '-package' + return 0 + else + return 1 + endif +endfunction + +function! ale_linters#elm#make#GetRootDir(buffer) abort + let l:elm_json = ale_linters#elm#make#GetPackageFile(a:buffer) + + if empty(l:elm_json) + return '' + else + return fnamemodify(l:elm_json, ':p:h') + endif +endfunction + +function! ale_linters#elm#make#IsTest(buffer) abort + let l:root_dir = ale_linters#elm#make#GetRootDir(a:buffer) + + if empty(l:root_dir) + return 0 + endif + + let l:tests_dir = join([l:root_dir, 'tests', ''], has('win32') ? '\' : '/') + + let l:buffer_path = fnamemodify(bufname(a:buffer), ':p') + + if stridx(l:buffer_path, l:tests_dir) == 0 + return 1 + else + return 0 + endif +endfunction + +function! ale_linters#elm#make#GetCwd(buffer) abort + let l:root_dir = ale_linters#elm#make#GetRootDir(a:buffer) + + return !empty(l:root_dir) ? l:root_dir : '' +endfunction + +" Return the command to execute the linter in the projects directory. +" If it doesn't, then this will fail when imports are needed. +function! ale_linters#elm#make#GetCommand(buffer) abort + let l:executable = ale_linters#elm#make#GetExecutable(a:buffer) + let l:is_v19 = ale_linters#elm#make#IsVersionGte19(a:buffer) + let l:is_using_elm_test = l:executable =~# 'elm-test$' + + " elm-test needs to know the path of elm-make if elm isn't installed globally. + " https://github.com/rtfeldman/node-test-runner/blob/57728f10668f2d2ab3179e7e3208bcfa9a1f19aa/README.md#--compiler + if l:is_v19 && l:is_using_elm_test + let l:elm_make_executable = ale#path#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm']) + let l:elm_test_compiler_flag = ' --compiler ' . l:elm_make_executable . ' ' + else + let l:elm_test_compiler_flag = ' ' + endif + + " The elm compiler, at the time of this writing, uses '/dev/null' as + " a sort of flag to tell the compiler not to generate an output file, + " which is why this is hard coded here. + " Source: https://github.com/elm-lang/elm-compiler/blob/19d5a769b30ec0b2fc4475985abb4cd94cd1d6c3/builder/src/Generate/Output.hs#L253 + return '%e make --report=json --output=/dev/null' + \ . l:elm_test_compiler_flag + \ . '%t' +endfunction + +function! ale_linters#elm#make#GetExecutable(buffer) abort + let l:is_test = ale_linters#elm#make#IsTest(a:buffer) + let l:is_v19 = ale_linters#elm#make#IsVersionGte19(a:buffer) + + if l:is_test && l:is_v19 + return ale#path#FindExecutable( + \ a:buffer, + \ 'elm_make', + \ ['node_modules/.bin/elm-test', 'node_modules/.bin/elm'] + \) + else + return ale#path#FindExecutable(a:buffer, 'elm_make', ['node_modules/.bin/elm']) + endif +endfunction + +call ale#linter#Define('elm', { +\ 'name': 'make', +\ 'executable': function('ale_linters#elm#make#GetExecutable'), +\ 'output_stream': 'both', +\ 'cwd': function('ale_linters#elm#make#GetCwd'), +\ 'command': function('ale_linters#elm#make#GetCommand'), +\ 'callback': 'ale_linters#elm#make#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/erlang/dialyzer.vim b/dot_vim/plugged/ale/ale_linters/erlang/dialyzer.vim new file mode 100644 index 0000000..a97c952 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/erlang/dialyzer.vim @@ -0,0 +1,97 @@ +" Author: Autoine Gagne - https://github.com/AntoineGagne +" Description: Define a checker that runs dialyzer on Erlang files. + +let g:ale_erlang_dialyzer_executable = +\ get(g:, 'ale_erlang_dialyzer_executable', 'dialyzer') +let g:ale_erlang_dialyzer_options = +\ get(g:, 'ale_erlang_dialyzer_options', '-Wunmatched_returns' +\ . ' -Werror_handling' +\ . ' -Wrace_conditions' +\ . ' -Wunderspecs') +let g:ale_erlang_dialyzer_plt_file = +\ get(g:, 'ale_erlang_dialyzer_plt_file', '') +let g:ale_erlang_dialyzer_rebar3_profile = +\ get(g:, 'ale_erlang_dialyzer_rebar3_profile', 'default') + +function! ale_linters#erlang#dialyzer#GetRebar3Profile(buffer) abort + return ale#Var(a:buffer, 'erlang_dialyzer_rebar3_profile') +endfunction + +function! ale_linters#erlang#dialyzer#FindPlt(buffer) abort + let l:plt_file = '' + let l:rebar3_profile = ale_linters#erlang#dialyzer#GetRebar3Profile(a:buffer) + let l:plt_file_directory = ale#path#FindNearestDirectory(a:buffer, '_build/' . l:rebar3_profile) + + if !empty(l:plt_file_directory) + let l:plt_file = globpath(l:plt_file_directory, '*_plt', 0, 1) + endif + + if !empty(l:plt_file) + return l:plt_file[0] + endif + + if !empty($REBAR_PLT_DIR) + return expand('$REBAR_PLT_DIR/dialyzer/plt') + endif + + return expand('$HOME/.dialyzer_plt') +endfunction + +function! ale_linters#erlang#dialyzer#GetPlt(buffer) abort + let l:plt_file = ale#Var(a:buffer, 'erlang_dialyzer_plt_file') + + if !empty(l:plt_file) + return l:plt_file + endif + + return ale_linters#erlang#dialyzer#FindPlt(a:buffer) +endfunction + +function! ale_linters#erlang#dialyzer#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'erlang_dialyzer_executable') +endfunction + +function! ale_linters#erlang#dialyzer#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'erlang_dialyzer_options') + + let l:command = ale#Escape(ale_linters#erlang#dialyzer#GetExecutable(a:buffer)) + \ . ' -n' + \ . ' --plt ' . ale#Escape(ale_linters#erlang#dialyzer#GetPlt(a:buffer)) + \ . ' ' . l:options + \ . ' %s' + + return l:command +endfunction + +function! ale_linters#erlang#dialyzer#Handle(buffer, lines) abort + " Match patterns like the following: + " + " erl_tidy_prv_fmt.erl:3: Callback info about the provider behaviour is not available + let l:pattern = '^\S\+:\(\d\+\): \(.\+\)$' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) != 0 + let l:code = l:match[2] + + call add(l:output, { + \ 'lnum': str2nr(l:match[1]), + \ 'lcol': 0, + \ 'text': l:code, + \ 'type': 'W' + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('erlang', { +\ 'name': 'dialyzer', +\ 'executable': function('ale_linters#erlang#dialyzer#GetExecutable'), +\ 'command': function('ale_linters#erlang#dialyzer#GetCommand'), +\ 'callback': function('ale_linters#erlang#dialyzer#Handle'), +\ 'lint_file': 1 +\}) diff --git a/dot_vim/plugged/ale/ale_linters/erlang/elvis.vim b/dot_vim/plugged/ale/ale_linters/erlang/elvis.vim new file mode 100644 index 0000000..0fb85c0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/erlang/elvis.vim @@ -0,0 +1,40 @@ +" Author: Dmitri Vereshchagin +" Description: Elvis linter for Erlang files + +call ale#Set('erlang_elvis_executable', 'elvis') + +function! ale_linters#erlang#elvis#Handle(buffer, lines) abort + let l:pattern = '\v:(\d+):[^:]+:(.+)' + let l:loclist = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:loclist, { + \ 'lnum': str2nr(l:match[1]), + \ 'text': s:AbbreviateMessage(l:match[2]), + \ 'type': 'W', + \ 'sub_type': 'style', + \}) + endfor + + return l:loclist +endfunction + +function! s:AbbreviateMessage(text) abort + let l:pattern = '\v\c^(line \d+ is too long):.*$' + + return substitute(a:text, l:pattern, '\1.', '') +endfunction + +function! s:GetCommand(buffer) abort + let l:file = ale#Escape(expand('#' . a:buffer . ':.')) + + return '%e rock --output-format=parsable ' . l:file +endfunction + +call ale#linter#Define('erlang', { +\ 'name': 'elvis', +\ 'callback': 'ale_linters#erlang#elvis#Handle', +\ 'executable': {b -> ale#Var(b, 'erlang_elvis_executable')}, +\ 'command': function('s:GetCommand'), +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/erlang/erlang_ls.vim b/dot_vim/plugged/ale/ale_linters/erlang/erlang_ls.vim new file mode 100644 index 0000000..b747e45 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/erlang/erlang_ls.vim @@ -0,0 +1,49 @@ +" Author: Dmitri Vereshchagin +" Description: LSP linter for Erlang files + +call ale#Set('erlang_erlang_ls_executable', 'erlang_ls') +call ale#Set('erlang_erlang_ls_log_dir', '') +call ale#Set('erlang_erlang_ls_log_level', 'info') + +function! s:GetCommand(buffer) abort + let l:log_dir = ale#Var(a:buffer, 'erlang_erlang_ls_log_dir') + let l:log_level = ale#Var(a:buffer, 'erlang_erlang_ls_log_level') + + let l:command = '%e' + + if !empty(l:log_dir) + let l:command .= ' --log-dir=' . ale#Escape(l:log_dir) + endif + + let l:command .= ' --log-level=' . ale#Escape(l:log_level) + + return l:command +endfunction + +function! s:FindProjectRoot(buffer) abort + let l:markers = ['_build/', 'erlang_ls.config', 'rebar.lock'] + + " This is a way to find Erlang/OTP root (the one that is managed + " by kerl or asdf). Useful if :ALEGoToDefinition takes us there. + let l:markers += ['.kerl_config'] + + for l:marker in l:markers + let l:path = l:marker[-1:] is# '/' + \ ? ale#path#FindNearestDirectory(a:buffer, l:marker) + \ : ale#path#FindNearestFile(a:buffer, l:marker) + + if !empty(l:path) + return ale#path#Dirname(l:path) + endif + endfor + + return '' +endfunction + +call ale#linter#Define('erlang', { +\ 'name': 'erlang_ls', +\ 'executable': {b -> ale#Var(b, 'erlang_erlang_ls_executable')}, +\ 'command': function('s:GetCommand'), +\ 'lsp': 'stdio', +\ 'project_root': function('s:FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/erlang/erlc.vim b/dot_vim/plugged/ale/ale_linters/erlang/erlc.vim new file mode 100644 index 0000000..0c67a73 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/erlang/erlc.vim @@ -0,0 +1,104 @@ +" Author: Magnus Ottenklinger - https://github.com/evnu + +let g:ale_erlang_erlc_executable = get(g:, 'ale_erlang_erlc_executable', 'erlc') +let g:ale_erlang_erlc_options = get(g:, 'ale_erlang_erlc_options', '') + +function! ale_linters#erlang#erlc#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'erlang_erlc_executable') +endfunction + +function! ale_linters#erlang#erlc#GetCommand(buffer) abort + let l:output_file = ale#util#Tempname() + call ale#command#ManageFile(a:buffer, l:output_file) + + let l:command = ale#Escape(ale_linters#erlang#erlc#GetExecutable(a:buffer)) + \ . ' -o ' . ale#Escape(l:output_file) + \ . ' ' . ale#Var(a:buffer, 'erlang_erlc_options') + \ . ' %t' + + return l:command +endfunction + +function! ale_linters#erlang#erlc#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " error.erl:4: variable 'B' is unbound + " error.erl:3: Warning: function main/0 is unused + " error.erl:4: Warning: variable 'A' is unused + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+:)? (Warning: )?(.+)$' + + " parse_transforms are a special case. The error message does not indicate a location: + " error.erl: undefined parse transform 'some_parse_transform' + let l:pattern_parse_transform = '\v(undefined parse transform .*)$' + let l:output = [] + + let l:pattern_no_module_definition = '\v(no module definition)$' + let l:pattern_unused = '\v(.* is unused)$' + + let l:is_hrl = fnamemodify(bufname(a:buffer), ':e') is# 'hrl' + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + " Determine if the output indicates an error. We distinguish between two cases: + " + " 1) normal errors match l:pattern + " 2) parse_transform errors match l:pattern_parse_transform + " + " If none of the patterns above match, the line can be ignored + if len(l:match) == 0 " not a 'normal' warning or error + let l:match_parse_transform = matchlist(l:line, l:pattern_parse_transform) + + if len(l:match_parse_transform) == 0 " also not a parse_transform error + continue + endif + + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': 0, + \ 'col': 0, + \ 'type': 'E', + \ 'text': l:match_parse_transform[0], + \}) + + continue + endif + + let l:line = l:match[2] + let l:warning_or_text = l:match[4] + let l:text = l:match[5] + + " If this file is a header .hrl, ignore the following expected messages: + " - 'no module definition' + " - 'X is unused' + if l:is_hrl && ( + \ match(l:text, l:pattern_no_module_definition) != -1 + \ || match(l:text, l:pattern_unused) != -1 + \) + continue + endif + + if !empty(l:warning_or_text) + let l:type = 'W' + else + let l:type = 'E' + endif + + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:line, + \ 'col': 0, + \ 'type': l:type, + \ 'text': l:text, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('erlang', { +\ 'name': 'erlc', +\ 'executable': function('ale_linters#erlang#erlc#GetExecutable'), +\ 'command': function('ale_linters#erlang#erlc#GetCommand'), +\ 'callback': 'ale_linters#erlang#erlc#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/erlang/syntaxerl.vim b/dot_vim/plugged/ale/ale_linters/erlang/syntaxerl.vim new file mode 100644 index 0000000..5d555a8 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/erlang/syntaxerl.vim @@ -0,0 +1,42 @@ +" Author: Dmitri Vereshchagin +" Description: SyntaxErl linter for Erlang files + +call ale#Set('erlang_syntaxerl_executable', 'syntaxerl') + +function! ale_linters#erlang#syntaxerl#RunHelpCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'erlang_syntaxerl_executable') + + return ale#command#Run( + \ a:buffer, + \ ale#Escape(l:executable) . ' -h', + \ function('ale_linters#erlang#syntaxerl#GetCommand'), + \) +endfunction + +function! ale_linters#erlang#syntaxerl#GetCommand(buffer, output, meta) abort + let l:use_b_option = match(a:output, '\C\V-b, --base\>') > -1 + + return '%e' . (l:use_b_option ? ' -b %s %t' : ' %t') +endfunction + +function! ale_linters#erlang#syntaxerl#Handle(buffer, lines) abort + let l:pattern = '\v\C:(\d+):( warning:)? (.+)' + let l:loclist = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:loclist, { + \ 'lnum': l:match[1] + 0, + \ 'text': l:match[3], + \ 'type': empty(l:match[2]) ? 'E' : 'W', + \}) + endfor + + return l:loclist +endfunction + +call ale#linter#Define('erlang', { +\ 'name': 'syntaxerl', +\ 'executable': {b -> ale#Var(b, 'erlang_syntaxerl_executable')}, +\ 'command': {b -> ale_linters#erlang#syntaxerl#RunHelpCommand(b)}, +\ 'callback': 'ale_linters#erlang#syntaxerl#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/eruby/erb.vim b/dot_vim/plugged/ale/ale_linters/eruby/erb.vim new file mode 100644 index 0000000..f343832 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/eruby/erb.vim @@ -0,0 +1,25 @@ +" Author: Matthias Guenther - https://wikimatze.de, Eddie Lebow https://github.com/elebow +" Description: ERB from the Ruby standard library, for eruby/erb files + +function! ale_linters#eruby#erb#GetCommand(buffer) abort + let l:rails_root = ale#ruby#FindRailsRoot(a:buffer) + + if empty(l:rails_root) + return 'erb -P -T - -x %t | ruby -c' + endif + + " Rails-flavored eRuby does not comply with the standard as understood by + " ERB, so we'll have to do some substitution. This does not reduce the + " effectiveness of the linter—the translated code is still evaluated. + return 'ruby -r erb -e ' . ale#Escape('puts ERB.new($stdin.read.gsub(%{<%=},%{<%}), nil, %{-}).src') . '< %t | ruby -c' +endfunction + +call ale#linter#Define('eruby', { +\ 'name': 'erb', +\ 'aliases': ['erubylint'], +\ 'executable': 'erb', +\ 'output_stream': 'stderr', +\ 'command': function('ale_linters#eruby#erb#GetCommand'), +\ 'callback': 'ale#handlers#ruby#HandleSyntaxErrors', +\}) + diff --git a/dot_vim/plugged/ale/ale_linters/eruby/erblint.vim b/dot_vim/plugged/ale/ale_linters/eruby/erblint.vim new file mode 100644 index 0000000..1996018 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/eruby/erblint.vim @@ -0,0 +1,51 @@ +" Author: Roeland Moors - https://github.com/roelandmoors +" based on the ale ruumba and robocop linters +" Description: ERB Lint, support for https://github.com/Shopify/erb-lint + +call ale#Set('eruby_erblint_executable', 'erblint') +call ale#Set('eruby_erblint_options', '') + +function! ale_linters#eruby#erblint#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'eruby_erblint_executable') + + return ale#ruby#EscapeExecutable(l:executable, 'erblint') + \ . ' --format json ' + \ . ale#Var(a:buffer, 'eruby_erblint_options') + \ . ' --stdin %s' +endfunction + +function! ale_linters#eruby#erblint#Handle(buffer, lines) abort + if empty(a:lines) + return [] + endif + + let l:errors = ale#util#FuzzyJSONDecode(a:lines[0], []) + + if !has_key(l:errors, 'summary') + \|| l:errors['summary']['offenses'] == 0 + \|| empty(l:errors['files']) + return [] + endif + + let l:output = [] + + for l:error in l:errors['files'][0]['offenses'] + call add(l:output, { + \ 'lnum': l:error['location']['start_line'] + 0, + \ 'col': l:error['location']['start_column'] + 0, + \ 'end_col': l:error['location']['last_column'] + 0, + \ 'code': l:error['linter'], + \ 'text': l:error['message'], + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('eruby', { +\ 'name': 'erblint', +\ 'executable': {b -> ale#Var(b, 'eruby_erblint_executable')}, +\ 'command': function('ale_linters#eruby#erblint#GetCommand'), +\ 'callback': 'ale_linters#eruby#erblint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/eruby/erubi.vim b/dot_vim/plugged/ale/ale_linters/eruby/erubi.vim new file mode 100644 index 0000000..ddca3f6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/eruby/erubi.vim @@ -0,0 +1,32 @@ +" Author: Eddie Lebow https://github.com/elebow +" Description: eruby checker using `erubi` + +function! ale_linters#eruby#erubi#GetCommand(buffer, output, meta) abort + let l:rails_root = ale#ruby#FindRailsRoot(a:buffer) + + if !empty(a:output) + " The empty command in CheckErubi returns nothing if erubi runs and + " emits an error if erubi is not present + return '' + endif + + if empty(l:rails_root) + return 'ruby -r erubi/capture_end -e ' . ale#Escape('puts Erubi::CaptureEndEngine.new($stdin.read).src') . '< %t | ruby -c' + endif + + " Rails-flavored eRuby does not comply with the standard as understood by + " Erubi, so we'll have to do some substitution. This does not reduce the + " effectiveness of the linter---the translated code is still evaluated. + return 'ruby -r erubi/capture_end -e ' . ale#Escape('puts Erubi::CaptureEndEngine.new($stdin.read.gsub(%{<%=},%{<%}), nil, %{-}).src') . '< %t | ruby -c' +endfunction + +call ale#linter#Define('eruby', { +\ 'name': 'erubi', +\ 'executable': 'ruby', +\ 'command': {buffer -> ale#command#Run( +\ buffer, +\ 'ruby -r erubi/capture_end -e ' . ale#Escape('""'), +\ function('ale_linters#eruby#erubi#GetCommand'), +\ )}, +\ 'callback': 'ale#handlers#ruby#HandleSyntaxErrors', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/eruby/erubis.vim b/dot_vim/plugged/ale/ale_linters/eruby/erubis.vim new file mode 100644 index 0000000..755c580 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/eruby/erubis.vim @@ -0,0 +1,23 @@ +" Author: Jake Zimmerman , Eddie Lebow https://github.com/elebow +" Description: eruby checker using `erubis`, instead of `erb` + +function! ale_linters#eruby#erubis#GetCommand(buffer) abort + let l:rails_root = ale#ruby#FindRailsRoot(a:buffer) + + if empty(l:rails_root) + return 'erubis -x %t | ruby -c' + endif + + " Rails-flavored eRuby does not comply with the standard as understood by + " Erubis, so we'll have to do some substitution. This does not reduce the + " effectiveness of the linter - the translated code is still evaluated. + return 'ruby -r erubis -e ' . ale#Escape('puts Erubis::Eruby.new($stdin.read.gsub(%{<%=},%{<%})).src') . '< %t | ruby -c' +endfunction + +call ale#linter#Define('eruby', { +\ 'name': 'erubis', +\ 'executable': 'erubis', +\ 'output_stream': 'stderr', +\ 'command': function('ale_linters#eruby#erubis#GetCommand'), +\ 'callback': 'ale#handlers#ruby#HandleSyntaxErrors', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/eruby/ruumba.vim b/dot_vim/plugged/ale/ale_linters/eruby/ruumba.vim new file mode 100644 index 0000000..f415f1a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/eruby/ruumba.vim @@ -0,0 +1,62 @@ +" Author: aclemons - https://github.com/aclemons +" based on the ale rubocop linter +" Description: Ruumba, RuboCop linting for ERB templates. + +call ale#Set('eruby_ruumba_executable', 'ruumba') +call ale#Set('eruby_ruumba_options', '') + +function! ale_linters#eruby#ruumba#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'eruby_ruumba_executable') + + return ale#ruby#EscapeExecutable(l:executable, 'ruumba') + \ . ' --format json --force-exclusion ' + \ . ale#Var(a:buffer, 'eruby_ruumba_options') + \ . ' --stdin %s' +endfunction + +function! ale_linters#eruby#ruumba#Handle(buffer, lines) abort + try + let l:errors = json_decode(a:lines[0]) + catch + return [] + endtry + + if !has_key(l:errors, 'summary') + \|| l:errors['summary']['offense_count'] == 0 + \|| empty(l:errors['files']) + return [] + endif + + let l:output = [] + + for l:error in l:errors['files'][0]['offenses'] + let l:start_col = l:error['location']['column'] + 0 + call add(l:output, { + \ 'lnum': l:error['location']['line'] + 0, + \ 'col': l:start_col, + \ 'end_col': l:start_col + l:error['location']['length'] - 1, + \ 'code': l:error['cop_name'], + \ 'text': l:error['message'], + \ 'type': ale_linters#eruby#ruumba#GetType(l:error['severity']), + \}) + endfor + + return l:output +endfunction + +function! ale_linters#eruby#ruumba#GetType(severity) abort + if a:severity is? 'convention' + \|| a:severity is? 'warning' + \|| a:severity is? 'refactor' + return 'W' + endif + + return 'E' +endfunction + +call ale#linter#Define('eruby', { +\ 'name': 'ruumba', +\ 'executable': {b -> ale#Var(b, 'eruby_ruumba_executable')}, +\ 'command': function('ale_linters#eruby#ruumba#GetCommand'), +\ 'callback': 'ale_linters#eruby#ruumba#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/fish/fish.vim b/dot_vim/plugged/ale/ale_linters/fish/fish.vim new file mode 100644 index 0000000..87ede29 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/fish/fish.vim @@ -0,0 +1,67 @@ +" Author: Niraj Thapaliya - https://github.com/nthapaliya +" Description: Lints fish files using fish -n + +function! ale_linters#fish#fish#Handle(buffer, lines) abort + " Matches patterns such as: + " + " home/.config/fish/functions/foo.fish (line 1): Missing end to balance this function definition + " function foo + " ^ + " + " OR, patterns such as: + " + " Unsupported use of '||'. In fish, please use 'COMMAND; or COMMAND'. + " /tmp/vLz620o/258/test.fish (line 2): if set -q SSH_CLIENT || set -q SSH_TTY + " ^ + " + " fish -n can return errors in either format. + let l:pattern = '^\(.* (line \(\d\+\)): \)\(.*\)$' + let l:column_pattern = '^ *\^' + let l:output = [] + let l:column_offset = 0 + let l:last_line_with_message = '' + + for l:line in a:lines + " Look for error lines first. + let l:match = matchlist(l:line, l:pattern) + + if !empty(l:match) + if !empty(l:last_line_with_message) + let l:text = l:last_line_with_message + else + let l:text = l:match[3] + endif + + let l:column_offset = len(l:match[1]) + + let l:last_line_with_message = '' + call add(l:output, { + \ 'col': 0, + \ 'lnum': str2nr(l:match[2]), + \ 'text': l:text, + \}) + else + " Look for column markers like ' ^' second. + " The column index will be set according to how long the line is. + let l:column_match = matchstr(l:line, l:column_pattern) + + if !empty(l:column_match) && !empty(l:output) + let l:output[-1].col = len(l:column_match) - l:column_offset + let l:last_line_with_message = '' + else + let l:last_line_with_message = l:line + let l:column_offset = 0 + endif + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('fish', { +\ 'name': 'fish', +\ 'output_stream': 'stderr', +\ 'executable': 'fish', +\ 'command': 'fish -n %t', +\ 'callback': 'ale_linters#fish#fish#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/fortran/gcc.vim b/dot_vim/plugged/ale/ale_linters/fortran/gcc.vim new file mode 100644 index 0000000..6e97d6f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/fortran/gcc.vim @@ -0,0 +1,72 @@ +" Author: w0rp +" Description: gcc for Fortran files + +" This option can be set to 0 to use -ffixed-form +call ale#Set('fortran_gcc_use_free_form', 1) +call ale#Set('fortran_gcc_executable', 'gcc') +" Set this option to change the GCC options for warnings for Fortran. +call ale#Set('fortran_gcc_options', '-Wall') + +function! ale_linters#fortran#gcc#Handle(buffer, lines) abort + " We have to match a starting line and a later ending line together, + " like so. + " + " :21.34: + " Error: Expected comma in I/O list at (1) + let l:line_marker_pattern = ':\(\d\+\)[.:]\=\(\d\+\)\=:\=$' + let l:message_pattern = '^\(Error\|Warning\): \(.\+\)$' + let l:looking_for_message = 0 + let l:last_loclist_obj = {} + + let l:output = [] + + for l:line in a:lines + if l:looking_for_message + let l:match = matchlist(l:line, l:message_pattern) + else + let l:match = matchlist(l:line, l:line_marker_pattern) + endif + + if len(l:match) == 0 + continue + endif + + if l:looking_for_message + let l:looking_for_message = 0 + + " Now we have the text, we can set it and add the error. + let l:last_loclist_obj.text = l:match[2] + let l:last_loclist_obj.type = l:match[1] is# 'Warning' ? 'W' : 'E' + call add(l:output, l:last_loclist_obj) + else + let l:last_loclist_obj = { + \ 'bufnr': a:buffer, + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \} + + " Start looking for the message and error type. + let l:looking_for_message = 1 + endif + endfor + + return l:output +endfunction + +function! ale_linters#fortran#gcc#GetCommand(buffer) abort + let l:layout_option = ale#Var(a:buffer, 'fortran_gcc_use_free_form') + \ ? '-ffree-form' + \ : '-ffixed-form' + + return '%e -S -x f95 -fsyntax-only ' . l:layout_option + \ . ale#Pad(ale#Var(a:buffer, 'fortran_gcc_options')) + \ . ' -' +endfunction + +call ale#linter#Define('fortran', { +\ 'name': 'gcc', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'fortran_gcc_executable')}, +\ 'command': function('ale_linters#fortran#gcc#GetCommand'), +\ 'callback': 'ale_linters#fortran#gcc#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/fortran/language_server.vim b/dot_vim/plugged/ale/ale_linters/fortran/language_server.vim new file mode 100644 index 0000000..00aa057 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/fortran/language_server.vim @@ -0,0 +1,19 @@ +" Author: unpairedbracket ben.spiers22@gmail.com +" Description: A language server for fortran + +call ale#Set('fortran_language_server_executable', 'fortls') +call ale#Set('fortran_language_server_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#fortran#language_server#GetProjectRoot(buffer) abort + let l:fortls_file = ale#path#FindNearestFile(a:buffer, '.fortls') + + return !empty(l:fortls_file) ? fnamemodify(l:fortls_file, ':h') : '' +endfunction + +call ale#linter#Define('fortran', { +\ 'name': 'language_server', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'fortran_language_server_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale_linters#fortran#language_server#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/fountain/proselint.vim b/dot_vim/plugged/ale/ale_linters/fountain/proselint.vim new file mode 100644 index 0000000..353a2e5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/fountain/proselint.vim @@ -0,0 +1,9 @@ +" Author: Jansen Mitchell https://github.com/JansenMitchell +" Description: proselint for Fountain files + +call ale#linter#Define('fountain', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/fuse/fusionlint.vim b/dot_vim/plugged/ale/ale_linters/fuse/fusionlint.vim new file mode 100644 index 0000000..ffb25d3 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/fuse/fusionlint.vim @@ -0,0 +1,33 @@ +" Author: RyanSquared +" Description: `fusion-lint` linter for FusionScript files + +call ale#Set('fuse_fusionlint_executable', 'fusion-lint') +call ale#Set('fuse_fusionlint_options', '') + +function! ale_linters#fuse#fusionlint#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'fuse_fusionlint_options')) + \ . ' --filename %s -i' +endfunction + +function! ale_linters#fuse#fusionlint#Handle(buffer, lines) abort + let l:pattern = '^.*:\(\d\+\):\(\d\+\): (\([WE]\)\d\+) \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[4], + \ 'type': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('fuse', { +\ 'name': 'fusionlint', +\ 'executable': {b -> ale#Var(b, 'fuse_fusionlint_executable')}, +\ 'command': function('ale_linters#fuse#fusionlint#GetCommand'), +\ 'callback': 'ale_linters#fuse#fusionlint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/gitcommit/gitlint.vim b/dot_vim/plugged/ale/ale_linters/gitcommit/gitlint.vim new file mode 100644 index 0000000..4b9cec6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/gitcommit/gitlint.vim @@ -0,0 +1,51 @@ +" Author: Nick Yamane +" Description: gitlint for git commit message files + +call ale#Set('gitcommit_gitlint_executable', 'gitlint') +call ale#Set('gitcommit_gitlint_options', '') +call ale#Set('gitcommit_gitlint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#gitcommit#gitlint#GetExecutable(buffer) abort + return ale#python#FindExecutable(a:buffer, 'gitcommit_gitlint', ['gitlint']) +endfunction + +function! ale_linters#gitcommit#gitlint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'gitcommit_gitlint_options') + + return '%e' . ale#Pad(l:options) . ' lint' +endfunction + +function! ale_linters#gitcommit#gitlint#Handle(buffer, lines) abort + " Matches patterns line the following: + let l:pattern = '\v^(\d+): (\w+) (.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:code = l:match[2] + + if !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + if l:code is# 'T2' || l:code is# 'B2' + continue + endif + endif + + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'text': l:match[3], + \ 'code': l:code, + \ 'type': 'E', + \} + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('gitcommit', { +\ 'name': 'gitlint', +\ 'output_stream': 'stderr', +\ 'executable': function('ale_linters#gitcommit#gitlint#GetExecutable'), +\ 'command': function('ale_linters#gitcommit#gitlint#GetCommand'), +\ 'callback': 'ale_linters#gitcommit#gitlint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/glsl/glslang.vim b/dot_vim/plugged/ale/ale_linters/glsl/glslang.vim new file mode 100644 index 0000000..bbddce9 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/glsl/glslang.vim @@ -0,0 +1,40 @@ +" Author: Sven-Hendrik Haase +" Description: glslang-based linter for glsl files +" +" TODO: Once https://github.com/KhronosGroup/glslang/pull/1047 is accepted, +" we can use stdin. + +call ale#Set('glsl_glslang_executable', 'glslangValidator') +call ale#Set('glsl_glslang_options', '') + +function! ale_linters#glsl#glslang#GetCommand(buffer) abort + return '%e' + \ . ale#Pad(ale#Var(a:buffer, 'glsl_glslang_options')) + \ . ' -C %t' +endfunction + +function! ale_linters#glsl#glslang#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " ERROR: 0:5: 'foo' : undeclared identifier + let l:pattern = '^\(.\+\): \(\d\+\):\(\d\+\): \(.\+\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': str2nr(l:match[3]), + \ 'col': str2nr(l:match[2]), + \ 'text': l:match[4], + \ 'type': l:match[1] is# 'ERROR' ? 'E' : 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('glsl', { +\ 'name': 'glslang', +\ 'executable': {b -> ale#Var(b, 'glsl_glslang_executable')}, +\ 'command': function('ale_linters#glsl#glslang#GetCommand'), +\ 'callback': 'ale_linters#glsl#glslang#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/glsl/glslls.vim b/dot_vim/plugged/ale/ale_linters/glsl/glslls.vim new file mode 100644 index 0000000..b62844c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/glsl/glslls.vim @@ -0,0 +1,30 @@ +" Author: Sven-Hendrik Haase +" Description: A language server for glsl + +call ale#Set('glsl_glslls_executable', 'glslls') +call ale#Set('glsl_glslls_logfile', '') + +function! ale_linters#glsl#glslls#GetCommand(buffer) abort + let l:logfile = ale#Var(a:buffer, 'glsl_glslls_logfile') + let l:logfile_args = '' + + if l:logfile isnot# '' + let l:logfile_args = ' --verbose -l ' . l:logfile + endif + + return '%e' . l:logfile_args . ' --stdin' +endfunction + +function! ale_linters#glsl#glslls#GetProjectRoot(buffer) abort + let l:project_root = ale#c#FindProjectRoot(a:buffer) + + return !empty(l:project_root) ? fnamemodify(l:project_root, ':h:h') : '' +endfunction + +call ale#linter#Define('glsl', { +\ 'name': 'glslls', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'glsl_glslls_executable')}, +\ 'command': function('ale_linters#glsl#glslls#GetCommand'), +\ 'project_root': function('ale_linters#glsl#glslls#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/bingo.vim b/dot_vim/plugged/ale/ale_linters/go/bingo.vim new file mode 100644 index 0000000..1e43f8e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/bingo.vim @@ -0,0 +1,31 @@ +" Author: Jerko Steiner +" Description: https://github.com/saibing/bingo + +call ale#Set('go_bingo_executable', 'bingo') +call ale#Set('go_bingo_options', '--mode stdio') + +function! ale_linters#go#bingo#GetCommand(buffer) abort + return ale#go#EnvString(a:buffer) . '%e' . ale#Pad(ale#Var(a:buffer, 'go_bingo_options')) +endfunction + +function! ale_linters#go#bingo#FindProjectRoot(buffer) abort + let l:go_modules_off = ale#Var(a:buffer, 'go_go111module') is# 'off' + let l:project_root = l:go_modules_off ? + \ '' : ale#path#FindNearestFile(a:buffer, 'go.mod') + let l:mods = ':h' + + if empty(l:project_root) + let l:project_root = ale#path#FindNearestDirectory(a:buffer, '.git') + let l:mods = ':h:h' + endif + + return !empty(l:project_root) ? fnamemodify(l:project_root, l:mods) : '' +endfunction + +call ale#linter#Define('go', { +\ 'name': 'bingo', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'go_bingo_executable')}, +\ 'command': function('ale_linters#go#bingo#GetCommand'), +\ 'project_root': function('ale_linters#go#bingo#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/cspell.vim b/dot_vim/plugged/ale/ale_linters/go/cspell.vim new file mode 100644 index 0000000..f986a31 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Go files. + +call ale#handlers#cspell#DefineLinter('go') diff --git a/dot_vim/plugged/ale/ale_linters/go/gobuild.vim b/dot_vim/plugged/ale/ale_linters/go/gobuild.vim new file mode 100644 index 0000000..5210c5a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/gobuild.vim @@ -0,0 +1,57 @@ +" Author: Joshua Rubin , Ben Reedy , +" Jeff Willette +" Description: go build for Go files +" inspired by work from dzhou121 + +call ale#Set('go_go_executable', 'go') +call ale#Set('go_gobuild_options', '') + +function! ale_linters#go#gobuild#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'go_gobuild_options') + + " Run go test in local directory with relative path + return ale#go#EnvString(a:buffer) + \ . ale#Var(a:buffer, 'go_go_executable') . ' test' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' -c -o /dev/null ./' +endfunction + +function! ale_linters#go#gobuild#GetMatches(lines) abort + " Matches patterns like the following: + " + " file.go:27: missing argument for Printf("%s"): format reads arg 2, have only 1 args + " file.go:53:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) + " file.go:5:2: expected declaration, found 'STRING' "log" + " go test returns relative paths so use tail of filename as part of pattern matcher + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?:? (.+)$' + + return ale#util#GetMatches(a:lines, l:pattern) +endfunction + +function! ale_linters#go#gobuild#Handler(buffer, lines) abort + let l:dir = expand('#' . a:buffer . ':p:h') + let l:output = [] + + for l:match in ale_linters#go#gobuild#GetMatches(a:lines) + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[4], + \ 'type': 'E', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('go', { +\ 'name': 'gobuild', +\ 'aliases': ['go build'], +\ 'executable': {b -> ale#Var(b, 'go_go_executable')}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#go#gobuild#GetCommand'), +\ 'output_stream': 'stderr', +\ 'callback': 'ale_linters#go#gobuild#Handler', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/gofmt.vim b/dot_vim/plugged/ale/ale_linters/go/gofmt.vim new file mode 100644 index 0000000..b313f9c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/gofmt.vim @@ -0,0 +1,15 @@ +" Author: neersighted +" Description: gofmt for Go files + +function! ale_linters#go#gofmt#GetCommand(buffer) abort + return ale#go#EnvString(a:buffer) + \ . '%e -e %t' +endfunction + +call ale#linter#Define('go', { +\ 'name': 'gofmt', +\ 'output_stream': 'stderr', +\ 'executable': 'gofmt', +\ 'command': function('ale_linters#go#gofmt#GetCommand'), +\ 'callback': 'ale#handlers#unix#HandleAsError', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/golangci_lint.vim b/dot_vim/plugged/ale/ale_linters/go/golangci_lint.vim new file mode 100644 index 0000000..80431b9 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/golangci_lint.vim @@ -0,0 +1,64 @@ +" Author: Sascha Grunert +" Description: Adds support of golangci-lint + +call ale#Set('go_golangci_lint_options', '--enable-all') +call ale#Set('go_golangci_lint_executable', 'golangci-lint') +call ale#Set('go_golangci_lint_package', 0) + +function! ale_linters#go#golangci_lint#GetCommand(buffer) abort + let l:filename = expand('#' . a:buffer . ':t') + let l:options = ale#Var(a:buffer, 'go_golangci_lint_options') + let l:lint_package = ale#Var(a:buffer, 'go_golangci_lint_package') + + + if l:lint_package + return ale#go#EnvString(a:buffer) + \ . '%e run ' + \ . l:options + endif + + return ale#go#EnvString(a:buffer) + \ . '%e run ' + \ . ale#Escape(l:filename) + \ . ' ' . l:options +endfunction + +function! ale_linters#go#golangci_lint#GetMatches(lines) abort + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?:?:?:?\s\*?(.+)\s+\((.+)\)$' + + return ale#util#GetMatches(a:lines, l:pattern) +endfunction + +function! ale_linters#go#golangci_lint#Handler(buffer, lines) abort + let l:dir = expand('#' . a:buffer . ':p:h') + let l:output = [] + + for l:match in ale_linters#go#golangci_lint#GetMatches(a:lines) + if l:match[5] is# 'typecheck' + let l:msg_type = 'E' + else + let l:msg_type = 'W' + endif + + " l:match[1] will already be an absolute path, output from + " golangci_lint + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'type': l:msg_type, + \ 'text': l:match[4] . ' (' . l:match[5] . ')', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('go', { +\ 'name': 'golangci-lint', +\ 'executable': {b -> ale#Var(b, 'go_golangci_lint_executable')}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#go#golangci_lint#GetCommand'), +\ 'callback': 'ale_linters#go#golangci_lint#Handler', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/golint.vim b/dot_vim/plugged/ale/ale_linters/go/golint.vim new file mode 100644 index 0000000..79bfaeb --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/golint.vim @@ -0,0 +1,21 @@ +" Author: neersighted +" Description: golint for Go files + +call ale#Set('go_golint_executable', 'golint') +call ale#Set('go_golint_options', '') + +function! ale_linters#go#golint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'go_golint_options') + + return ale#go#EnvString(a:buffer) . '%e' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %t' +endfunction + +call ale#linter#Define('go', { +\ 'name': 'golint', +\ 'output_stream': 'both', +\ 'executable': {b -> ale#Var(b, 'go_golint_executable')}, +\ 'command': function('ale_linters#go#golint#GetCommand'), +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/gometalinter.vim b/dot_vim/plugged/ale/ale_linters/go/gometalinter.vim new file mode 100644 index 0000000..ac33a9f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/gometalinter.vim @@ -0,0 +1,58 @@ +" Author: Ben Reedy , Jeff Willette +" Description: Adds support for the gometalinter suite for Go files + +call ale#Set('go_gometalinter_options', '') +call ale#Set('go_gometalinter_executable', 'gometalinter') +call ale#Set('go_gometalinter_lint_package', 0) + +function! ale_linters#go#gometalinter#GetCommand(buffer) abort + let l:filename = expand('#' . a:buffer . ':t') + let l:options = ale#Var(a:buffer, 'go_gometalinter_options') + let l:lint_package = ale#Var(a:buffer, 'go_gometalinter_lint_package') + + " BufferCdString is used so that we can be sure the paths output from gometalinter can + " be calculated to absolute paths in the Handler + if l:lint_package + return ale#go#EnvString(a:buffer) + \ . '%e' + \ . (!empty(l:options) ? ' ' . l:options : '') . ' .' + endif + + return ale#go#EnvString(a:buffer) + \ . '%e' + \ . ' --include=' . ale#Escape(ale#util#EscapePCRE(l:filename)) + \ . (!empty(l:options) ? ' ' . l:options : '') . ' .' +endfunction + +function! ale_linters#go#gometalinter#GetMatches(lines) abort + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?:?:?(warning|error):?\s\*?(.+)$' + + return ale#util#GetMatches(a:lines, l:pattern) +endfunction + +function! ale_linters#go#gometalinter#Handler(buffer, lines) abort + let l:dir = expand('#' . a:buffer . ':p:h') + let l:output = [] + + for l:match in ale_linters#go#gometalinter#GetMatches(a:lines) + " l:match[1] will already be an absolute path, output from gometalinter + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'type': tolower(l:match[4]) is# 'warning' ? 'W' : 'E', + \ 'text': l:match[5], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('go', { +\ 'name': 'gometalinter', +\ 'executable': {b -> ale#Var(b, 'go_gometalinter_executable')}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#go#gometalinter#GetCommand'), +\ 'callback': 'ale_linters#go#gometalinter#Handler', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/gopls.vim b/dot_vim/plugged/ale/ale_linters/go/gopls.vim new file mode 100644 index 0000000..8090983 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/gopls.vim @@ -0,0 +1,39 @@ +" Author: w0rp +" Author: Jerko Steiner +" Description: https://github.com/saibing/gopls + +call ale#Set('go_gopls_executable', 'gopls') +call ale#Set('go_gopls_options', '--mode stdio') +call ale#Set('go_gopls_init_options', {}) +call ale#Set('go_gopls_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#go#gopls#GetCommand(buffer) abort + return ale#go#EnvString(a:buffer) + \ . '%e' + \ . ale#Pad(ale#Var(a:buffer, 'go_gopls_options')) +endfunction + +function! ale_linters#go#gopls#FindProjectRoot(buffer) abort + let l:go_modules_off = ale#Var(a:buffer, 'go_go111module') is# 'off' + let l:project_root = l:go_modules_off ? + \ '' : ale#path#FindNearestFile(a:buffer, 'go.mod') + let l:mods = ':h' + + if empty(l:project_root) + let l:project_root = ale#path#FindNearestDirectory(a:buffer, '.git') + let l:mods = ':h:h' + endif + + return !empty(l:project_root) ? fnamemodify(l:project_root, l:mods) : '' +endfunction + +call ale#linter#Define('go', { +\ 'name': 'gopls', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#path#FindExecutable(b, 'go_gopls', [ +\ ale#go#GetGoPathExecutable('bin/gopls'), +\ ])}, +\ 'command': function('ale_linters#go#gopls#GetCommand'), +\ 'project_root': function('ale_linters#go#gopls#FindProjectRoot'), +\ 'initialization_options': {b -> ale#Var(b, 'go_gopls_init_options')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/gosimple.vim b/dot_vim/plugged/ale/ale_linters/go/gosimple.vim new file mode 100644 index 0000000..490d15a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/gosimple.vim @@ -0,0 +1,12 @@ +" Author: Ben Reedy +" Description: gosimple for Go files + +call ale#linter#Define('go', { +\ 'name': 'gosimple', +\ 'executable': 'gosimple', +\ 'cwd': '%s:h', +\ 'command': {b -> ale#go#EnvString(b) . 'gosimple .'}, +\ 'callback': 'ale#handlers#go#Handler', +\ 'output_stream': 'both', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/gotype.vim b/dot_vim/plugged/ale/ale_linters/go/gotype.vim new file mode 100644 index 0000000..8fd6df2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/gotype.vim @@ -0,0 +1,24 @@ +" Author: Jelte Fennema +" Description: gotype for Go files + +function! ale_linters#go#gotype#GetExecutable(buffer) abort + if expand('#' . a:buffer . ':p') =~# '_test\.go$' + return '' + endif + + return 'gotype' +endfunction + +function! ale_linters#go#gotype#GetCommand(buffer) abort + return ale#go#EnvString(a:buffer) . 'gotype -e .' +endfunction + +call ale#linter#Define('go', { +\ 'name': 'gotype', +\ 'output_stream': 'stderr', +\ 'executable': function('ale_linters#go#gotype#GetExecutable'), +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#go#gotype#GetCommand'), +\ 'callback': 'ale#handlers#go#Handler', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/govet.vim b/dot_vim/plugged/ale/ale_linters/go/govet.vim new file mode 100644 index 0000000..5da8261 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/govet.vim @@ -0,0 +1,28 @@ +" Author: neersighted +" Description: go vet for Go files +" +" Author: John Eikenberry +" Description: updated to work with go1.10 + +call ale#Set('go_go_executable', 'go') +call ale#Set('go_govet_options', '') + +function! ale_linters#go#govet#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'go_govet_options') + + return ale#go#EnvString(a:buffer) + \ . ale#Var(a:buffer, 'go_go_executable') . ' vet ' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' .' +endfunction + +call ale#linter#Define('go', { +\ 'name': 'govet', +\ 'aliases': ['go vet'], +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'go_go_executable')}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#go#govet#GetCommand'), +\ 'callback': 'ale#handlers#go#Handler', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/langserver.vim b/dot_vim/plugged/ale/ale_linters/go/langserver.vim new file mode 100644 index 0000000..7130db4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/langserver.vim @@ -0,0 +1,29 @@ +" Author: Horacio Sanson +" Description: Support for go-langserver https://github.com/sourcegraph/go-langserver + +call ale#Set('go_langserver_executable', 'go-langserver') +call ale#Set('go_langserver_options', '') + +function! ale_linters#go#langserver#GetCommand(buffer) abort + let l:executable = [ale#Escape(ale#Var(a:buffer, 'go_langserver_executable'))] + let l:options = ale#Var(a:buffer, 'go_langserver_options') + let l:options = substitute(l:options, '-gocodecompletion', '', 'g') + let l:options = filter(split(l:options, ' '), 'empty(v:val) != 1') + + if ale#Var(a:buffer, 'completion_enabled') + call add(l:options, '-gocodecompletion') + endif + + let l:options = uniq(sort(l:options)) + let l:env = ale#go#EnvString(a:buffer) + + return l:env . join(extend(l:executable, l:options), ' ') +endfunction + +call ale#linter#Define('go', { +\ 'name': 'golangserver', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'go_langserver_executable')}, +\ 'command': function('ale_linters#go#langserver#GetCommand'), +\ 'project_root': function('ale#go#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/revive.vim b/dot_vim/plugged/ale/ale_linters/go/revive.vim new file mode 100644 index 0000000..b14b5ab --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/revive.vim @@ -0,0 +1,21 @@ +" Author: Penghui Liao +" Description: Adds support for revive + +call ale#Set('go_revive_executable', 'revive') +call ale#Set('go_revive_options', '') + +function! ale_linters#go#revive#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'go_revive_options') + + return ale#go#EnvString(a:buffer) . '%e' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %t' +endfunction + +call ale#linter#Define('go', { +\ 'name': 'revive', +\ 'output_stream': 'both', +\ 'executable': {b -> ale#Var(b, 'go_revive_executable')}, +\ 'command': function('ale_linters#go#revive#GetCommand'), +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/go/staticcheck.vim b/dot_vim/plugged/ale/ale_linters/go/staticcheck.vim new file mode 100644 index 0000000..3662244 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/go/staticcheck.vim @@ -0,0 +1,34 @@ +" Author: Ben Reedy +" Description: staticcheck for Go files + +call ale#Set('go_staticcheck_executable', 'staticcheck') +call ale#Set('go_staticcheck_options', '') +call ale#Set('go_staticcheck_lint_package', 1) +call ale#Set('go_staticcheck_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#go#staticcheck#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'go_staticcheck_options') + let l:lint_package = ale#Var(a:buffer, 'go_staticcheck_lint_package') + let l:env = ale#go#EnvString(a:buffer) + + if l:lint_package + return l:env . '%e' + \ . (!empty(l:options) ? ' ' . l:options : '') . ' .' + endif + + return l:env . '%e' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %s:t' +endfunction + +call ale#linter#Define('go', { +\ 'name': 'staticcheck', +\ 'executable': {b -> ale#path#FindExecutable(b, 'go_staticcheck', [ +\ ale#go#GetGoPathExecutable('bin/staticcheck'), +\ ])}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#go#staticcheck#GetCommand'), +\ 'callback': 'ale#handlers#go#Handler', +\ 'output_stream': 'both', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/graphql/eslint.vim b/dot_vim/plugged/ale/ale_linters/graphql/eslint.vim new file mode 100644 index 0000000..a98233e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/graphql/eslint.vim @@ -0,0 +1,10 @@ +" Author: Benjie Gillam +" Description: eslint for GraphQL files + +call ale#linter#Define('graphql', { +\ 'name': 'eslint', +\ 'executable': function('ale#handlers#eslint#GetExecutable'), +\ 'cwd': function('ale#handlers#eslint#GetCwd'), +\ 'command': function('ale#handlers#eslint#GetCommand'), +\ 'callback': 'ale#handlers#eslint#HandleJSON', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/graphql/gqlint.vim b/dot_vim/plugged/ale/ale_linters/graphql/gqlint.vim new file mode 100644 index 0000000..6f1ca54 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/graphql/gqlint.vim @@ -0,0 +1,10 @@ +" Author: Michiel Westerbeek +" Description: Linter for GraphQL Schemas + +call ale#linter#Define('graphql', { +\ 'name': 'gqlint', +\ 'executable': 'gqlint', +\ 'cwd': '%s:h', +\ 'command': 'gqlint --reporter=simple %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/hack/hack.vim b/dot_vim/plugged/ale/ale_linters/hack/hack.vim new file mode 100644 index 0000000..822b5c8 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/hack/hack.vim @@ -0,0 +1,22 @@ +" Author: Fred Emmott +" Description: Hack support via `hack lsp` + +call ale#Set('hack_hack_executable', 'hh_client') + +function! ale_linters#hack#hack#GetProjectRoot(buffer) abort + let l:hhconfig = ale#path#FindNearestFile(a:buffer, '.hhconfig') + + return !empty(l:hhconfig) ? fnamemodify(l:hhconfig, ':h') : '' +endfunction + +function! ale_linters#hack#hack#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'hack_hack_executable') +endfunction + +call ale#linter#Define('hack', { +\ 'name': 'hack', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#hack#hack#GetExecutable'), +\ 'command': '%e lsp --from vim-ale', +\ 'project_root': function('ale_linters#hack#hack#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/hack/hhast.vim b/dot_vim/plugged/ale/ale_linters/hack/hhast.vim new file mode 100644 index 0000000..5e6d4de --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/hack/hhast.vim @@ -0,0 +1,40 @@ +" Author: Fred Emmott +" Description: Hack support via `hhast lsp` + +call ale#Set('hack_hhast_executable', 'vendor/bin/hhast-lint') + +function! ale_linters#hack#hhast#GetProjectRoot(buffer) abort + " Find the hack root, then figure out if it's also an HHAST root. + " Don't try to use lint configurations from vendor/foo/bar/hhast-lint.json + let l:hhconfig = ale#path#FindNearestFile(a:buffer, '.hhconfig') + + if empty(l:hhconfig) + return '' + endif + + let l:root = fnamemodify(l:hhconfig, ':h') + let l:hhast_config = findfile('hhast-lint.json', l:root) + + return !empty(l:hhast_config) ? l:root : '' +endfunction + +function! ale_linters#hack#hhast#GetExecutable(buffer) abort + let l:root = ale_linters#hack#hhast#GetProjectRoot(a:buffer) + let l:relative = ale#Var(a:buffer, 'hack_hhast_executable') + let l:absolute = findfile(l:relative, l:root) + + return !empty(l:absolute) ? l:absolute : '' +endfunction + +function! ale_linters#hack#hhast#GetInitializationOptions(buffer) abort + return {'lintMode': 'open-files'} +endfunction + +call ale#linter#Define('hack', { +\ 'name': 'hhast', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#hack#hhast#GetExecutable'), +\ 'command': '%e --mode lsp --from vim-ale', +\ 'project_root': function('ale_linters#hack#hhast#GetProjectRoot'), +\ 'initialization_options': function('ale_linters#hack#hhast#GetInitializationOptions'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haml/hamllint.vim b/dot_vim/plugged/ale/ale_linters/haml/hamllint.vim new file mode 100644 index 0000000..9fcd999 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haml/hamllint.vim @@ -0,0 +1,57 @@ +" Author: Patrick Lewis - https://github.com/patricklewis, thenoseman - https://github.com/thenoseman +" Description: haml-lint for Haml files + +call ale#Set('haml_hamllint_executable', 'haml-lint') + +function! ale_linters#haml#hamllint#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'haml_hamllint_executable') +endfunction + +function! ale_linters#haml#hamllint#GetCommand(buffer) abort + let l:prefix = '' + + let l:rubocop_config_file_path = ale#path#FindNearestFile(a:buffer, '.rubocop.yml') + let l:hamllint_config_file_path = ale#path#FindNearestFile(a:buffer, '.haml-lint.yml') + + " Set HAML_LINT_RUBOCOP_CONF variable as it is needed for haml-lint to + " pick up the rubocop config. + " + " See https://github.com/brigade/haml-lint/blob/master/lib/haml_lint/linter/rubocop.rb#L89 + " HamlLint::Linter::RuboCop#rubocop_flags + if !empty(l:rubocop_config_file_path) + if has('win32') + let l:prefix = 'set HAML_LINT_RUBOCOP_CONF=' . ale#Escape(l:rubocop_config_file_path) . ' &&' + else + let l:prefix = 'HAML_LINT_RUBOCOP_CONF=' . ale#Escape(l:rubocop_config_file_path) + endif + endif + + return (!empty(l:prefix) ? l:prefix . ' ' : '') + \ . ale_linters#haml#hamllint#GetExecutable(a:buffer) + \ . (!empty(l:hamllint_config_file_path) ? ' --config ' . ale#Escape(l:hamllint_config_file_path) : '') + \ . ' %t' +endfunction + +function! ale_linters#haml#hamllint#Handle(buffer, lines) abort + " Matches patterns like the following: + " :51 [W] RuboCop: Use the new Ruby 1.9 hash syntax. + let l:pattern = '\v^.*:(\d+) \[([EW])\] (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'type': l:match[2], + \ 'text': l:match[3] + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('haml', { +\ 'name': 'hamllint', +\ 'executable': function('ale_linters#haml#hamllint#GetExecutable'), +\ 'command': function('ale_linters#haml#hamllint#GetCommand'), +\ 'callback': 'ale_linters#haml#hamllint#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/handlebars/embertemplatelint.vim b/dot_vim/plugged/ale/ale_linters/handlebars/embertemplatelint.vim new file mode 100644 index 0000000..17c4d08 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/handlebars/embertemplatelint.vim @@ -0,0 +1,67 @@ +" Author: Adrian Zalewski +" Description: Ember-template-lint for checking Handlebars files + +call ale#Set('handlebars_embertemplatelint_executable', 'ember-template-lint') +call ale#Set('handlebars_embertemplatelint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#handlebars#embertemplatelint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'handlebars_embertemplatelint', [ + \ 'node_modules/.bin/ember-template-lint', + \]) +endfunction + +function! ale_linters#handlebars#embertemplatelint#GetCommand(buffer, version) abort + if ale#semver#GTE(a:version, [4, 0, 0]) + " --json was removed in favor of --format=json in ember-template-lint@4.0.0 + return '%e --format=json --filename %s' + endif + + if ale#semver#GTE(a:version, [1, 6, 0]) + " Reading from stdin was introduced in ember-template-lint@1.6.0 + return '%e --json --filename %s' + endif + + return '%e --json %t' +endfunction + +function! ale_linters#handlebars#embertemplatelint#GetCommandWithVersionCheck(buffer) abort + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ ale_linters#handlebars#embertemplatelint#GetExecutable(a:buffer), + \ '%e --version', + \ function('ale_linters#handlebars#embertemplatelint#GetCommand'), + \) +endfunction + +function! ale_linters#handlebars#embertemplatelint#Handle(buffer, lines) abort + let l:output = [] + let l:json = ale#util#FuzzyJSONDecode(a:lines, {}) + + for l:error in get(values(l:json), 0, []) + if has_key(l:error, 'fatal') + call add(l:output, { + \ 'lnum': get(l:error, 'line', 1), + \ 'col': get(l:error, 'column', 1), + \ 'text': l:error.message, + \ 'type': l:error.severity == 1 ? 'W' : 'E', + \}) + else + call add(l:output, { + \ 'lnum': l:error.line, + \ 'col': l:error.column, + \ 'text': l:error.rule . ': ' . l:error.message, + \ 'type': l:error.severity == 1 ? 'W' : 'E', + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('handlebars', { +\ 'name': 'embertemplatelint', +\ 'aliases': ['ember-template-lint'], +\ 'executable': function('ale_linters#handlebars#embertemplatelint#GetExecutable'), +\ 'command': function('ale_linters#handlebars#embertemplatelint#GetCommandWithVersionCheck'), +\ 'callback': 'ale_linters#handlebars#embertemplatelint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haskell/cabal_ghc.vim b/dot_vim/plugged/ale/ale_linters/haskell/cabal_ghc.vim new file mode 100644 index 0000000..1bb31eb --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/cabal_ghc.vim @@ -0,0 +1,20 @@ +" Author: Eric Wolf +" Description: ghc for Haskell files called with cabal exec + +call ale#Set('haskell_cabal_ghc_options', '-fno-code -v0') + +function! ale_linters#haskell#cabal_ghc#GetCommand(buffer) abort + return 'cabal exec -- ghc ' + \ . ale#Var(a:buffer, 'haskell_cabal_ghc_options') + \ . ' %t' +endfunction + +call ale#linter#Define('haskell', { +\ 'name': 'cabal_ghc', +\ 'aliases': ['cabal-ghc'], +\ 'output_stream': 'stderr', +\ 'executable': 'cabal', +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#haskell#cabal_ghc#GetCommand'), +\ 'callback': 'ale#handlers#haskell#HandleGHCFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haskell/cspell.vim b/dot_vim/plugged/ale/ale_linters/haskell/cspell.vim new file mode 100644 index 0000000..b0971a9 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Haskell files. + +call ale#handlers#cspell#DefineLinter('haskell') diff --git a/dot_vim/plugged/ale/ale_linters/haskell/ghc.vim b/dot_vim/plugged/ale/ale_linters/haskell/ghc.vim new file mode 100644 index 0000000..9c3906b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/ghc.vim @@ -0,0 +1,18 @@ +" Author: w0rp +" Description: ghc for Haskell files + +call ale#Set('haskell_ghc_options', '-fno-code -v0') + +function! ale_linters#haskell#ghc#GetCommand(buffer) abort + return 'ghc ' + \ . ale#Var(a:buffer, 'haskell_ghc_options') + \ . ' %t' +endfunction + +call ale#linter#Define('haskell', { +\ 'name': 'ghc', +\ 'output_stream': 'stderr', +\ 'executable': 'ghc', +\ 'command': function('ale_linters#haskell#ghc#GetCommand'), +\ 'callback': 'ale#handlers#haskell#HandleGHCFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haskell/ghc_mod.vim b/dot_vim/plugged/ale/ale_linters/haskell/ghc_mod.vim new file mode 100644 index 0000000..30e96b4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/ghc_mod.vim @@ -0,0 +1,19 @@ +" Author: wizzup +" Description: ghc-mod for Haskell files + +call ale#Set('haskell_ghc_mod_executable', 'ghc-mod') + +function! ale_linters#haskell#ghc_mod#GetCommand (buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_ghc_mod_executable') + + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'ghc-mod') + \ . ' --map-file %s=%t check %s' +endfunction + +call ale#linter#Define('haskell', { +\ 'name': 'ghc_mod', +\ 'aliases': ['ghc-mod'], +\ 'executable': {b -> ale#Var(b, 'haskell_ghc_mod_executable')}, +\ 'command': function('ale_linters#haskell#ghc_mod#GetCommand'), +\ 'callback': 'ale#handlers#haskell#HandleGHCFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haskell/hdevtools.vim b/dot_vim/plugged/ale/ale_linters/haskell/hdevtools.vim new file mode 100644 index 0000000..3e55e4f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/hdevtools.vim @@ -0,0 +1,20 @@ +" Author: rob-b, Takano Akio +" Description: hdevtools for Haskell files + +call ale#Set('haskell_hdevtools_executable', 'hdevtools') +call ale#Set('haskell_hdevtools_options', get(g:, 'hdevtools_options', '-g -Wall')) + +function! ale_linters#haskell#hdevtools#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_hdevtools_executable') + + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'hdevtools') + \ . ' check' . ale#Pad(ale#Var(a:buffer, 'haskell_hdevtools_options')) + \ . ' -p %s %t' +endfunction + +call ale#linter#Define('haskell', { +\ 'name': 'hdevtools', +\ 'executable': {b -> ale#Var(b, 'haskell_hdevtools_executable')}, +\ 'command': function('ale_linters#haskell#hdevtools#GetCommand'), +\ 'callback': 'ale#handlers#haskell#HandleGHCFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haskell/hie.vim b/dot_vim/plugged/ale/ale_linters/haskell/hie.vim new file mode 100644 index 0000000..c4b5f1d --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/hie.vim @@ -0,0 +1,41 @@ +" Author: Luxed +" Description: A language server for Haskell + +call ale#Set('haskell_hie_executable', 'hie') + +function! ale_linters#haskell#hie#GetProjectRoot(buffer) abort + " Search for the stack file first + let l:project_file = ale#path#FindNearestFile(a:buffer, 'stack.yaml') + + " If it's empty, search for the cabal file + if empty(l:project_file) + " Search all of the paths except for the root filesystem path. + let l:paths = join( + \ ale#path#Upwards(expand('#' . a:buffer . ':p:h'))[:-2], + \ ',' + \) + let l:project_file = globpath(l:paths, '*.cabal') + endif + + " If we still can't find one, use the current file. + if empty(l:project_file) + let l:project_file = expand('#' . a:buffer . ':p') + endif + + return fnamemodify(l:project_file, ':h') +endfunction + +function! ale_linters#haskell#hie#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_hie_executable') + + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'hie') + \ . ' --lsp' +endfunction + +call ale#linter#Define('haskell', { +\ 'name': 'hie', +\ 'lsp': 'stdio', +\ 'command': function('ale_linters#haskell#hie#GetCommand'), +\ 'executable': {b -> ale#Var(b, 'haskell_hie_executable')}, +\ 'project_root': function('ale_linters#haskell#hie#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haskell/hlint.vim b/dot_vim/plugged/ale/ale_linters/haskell/hlint.vim new file mode 100644 index 0000000..1425251 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/hlint.vim @@ -0,0 +1,46 @@ +" Author: jparoz +" Description: hlint for Haskell files + +call ale#Set('haskell_hlint_executable', 'hlint') +call ale#Set('haskell_hlint_options', get(g:, 'hlint_options', '')) + +function! ale_linters#haskell#hlint#Handle(buffer, lines) abort + let l:output = [] + + for l:error in ale#util#FuzzyJSONDecode(a:lines, []) + if l:error.severity is# 'Error' + let l:type = 'E' + elseif l:error.severity is# 'Suggestion' + let l:type = 'I' + else + let l:type = 'W' + endif + + call add(l:output, { + \ 'lnum': str2nr(l:error.startLine), + \ 'col': str2nr(l:error.startColumn), + \ 'end_lnum': str2nr(l:error.endLine), + \ 'end_col': str2nr(l:error.endColumn), + \ 'text': l:error.severity . ': ' . l:error.hint . '. Found: ' . l:error.from . ' Why not: ' . l:error.to, + \ 'type': l:type, + \}) + endfor + + return l:output +endfunction + +function! ale_linters#haskell#hlint#GetCommand(buffer) abort + let l:hlintopts = '--color=never --json' + + return ale#handlers#hlint#GetExecutable(a:buffer) + \ . ' ' . ale#Var(a:buffer, 'haskell_hlint_options') + \ . ' ' . l:hlintopts + \ . ' -' +endfunction + +call ale#linter#Define('haskell', { +\ 'name': 'hlint', +\ 'executable': {b -> ale#Var(b, 'haskell_hlint_executable')}, +\ 'command': function('ale_linters#haskell#hlint#GetCommand') , +\ 'callback': 'ale_linters#haskell#hlint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haskell/hls.vim b/dot_vim/plugged/ale/ale_linters/haskell/hls.vim new file mode 100644 index 0000000..7f9efc3 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/hls.vim @@ -0,0 +1,65 @@ +" Author: Yen3 +" Description: A language server for haskell +" The file is based on hie.vim (author: Luxed +" ). It search more project root files. +" +call ale#Set('haskell_hls_executable', 'haskell-language-server-wrapper') +call ale#Set('haskell_hls_config', {}) + +function! ale_linters#haskell#hls#FindRootFile(buffer) abort + let l:serach_root_files = [ + \ 'stack.yaml', + \ 'cabal.project', + \ 'package.yaml', + \ 'hie.yaml' + \ ] + + for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + for l:root_file in l:serach_root_files + if filereadable(l:path . l:root_file) + return l:path + endif + endfor + endfor + + return '' +endfunction + +function! ale_linters#haskell#hls#GetProjectRoot(buffer) abort + " Search for the project file first + let l:project_file = ale_linters#haskell#hls#FindRootFile(a:buffer) + + " If it's empty, search for the cabal file + if empty(l:project_file) + " Search all of the paths except for the root filesystem path. + let l:paths = join( + \ ale#path#Upwards(expand('#' . a:buffer . ':p:h'))[:-2], + \ ',' + \) + let l:project_file = globpath(l:paths, '*.cabal') + endif + + " If we still can't find one, use the current file. + if empty(l:project_file) + let l:project_file = expand('#' . a:buffer . ':p') + endif + + return fnamemodify(l:project_file, ':h') +endfunction + +function! ale_linters#haskell#hls#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_hls_executable') + + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, + \ 'haskell-language-server-wrapper') + \ . ' --lsp' +endfunction + +call ale#linter#Define('haskell', { +\ 'name': 'hls', +\ 'lsp': 'stdio', +\ 'command': function('ale_linters#haskell#hls#GetCommand'), +\ 'executable': {b -> ale#Var(b, 'haskell_hls_executable')}, +\ 'project_root': function('ale_linters#haskell#hls#GetProjectRoot'), +\ 'lsp_config': {b -> ale#Var(b, 'haskell_hls_config')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haskell/stack_build.vim b/dot_vim/plugged/ale/ale_linters/haskell/stack_build.vim new file mode 100644 index 0000000..8f2d9fd --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/stack_build.vim @@ -0,0 +1,23 @@ +" Author: Jake Zimmerman +" Description: Like stack-ghc, but for entire projects +" +" Note: Ideally, this would *only* typecheck. Right now, it also does codegen. +" See . + +call ale#Set('haskell_stack_build_options', '--fast') + +function! ale_linters#haskell#stack_build#GetCommand(buffer) abort + let l:flags = ale#Var(a:buffer, 'haskell_stack_build_options') + + return 'stack build ' . l:flags +endfunction + +call ale#linter#Define('haskell', { +\ 'name': 'stack_build', +\ 'aliases': ['stack-build'], +\ 'output_stream': 'stderr', +\ 'executable': function('ale#handlers#haskell#GetStackExecutable'), +\ 'command': function('ale_linters#haskell#stack_build#GetCommand'), +\ 'lint_file': 1, +\ 'callback': 'ale#handlers#haskell#HandleGHCFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/haskell/stack_ghc.vim b/dot_vim/plugged/ale/ale_linters/haskell/stack_ghc.vim new file mode 100644 index 0000000..51ecc74 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/haskell/stack_ghc.vim @@ -0,0 +1,21 @@ +" Author: w0rp +" Description: ghc for Haskell files, using Stack + +call ale#Set('haskell_stack_ghc_options', '-fno-code -v0') + +function! ale_linters#haskell#stack_ghc#GetCommand(buffer) abort + return ale#handlers#haskell#GetStackExecutable(a:buffer) + \ . ' ghc -- ' + \ . ale#Var(a:buffer, 'haskell_stack_ghc_options') + \ . ' %t' +endfunction + +call ale#linter#Define('haskell', { +\ 'name': 'stack_ghc', +\ 'aliases': ['stack-ghc'], +\ 'output_stream': 'stderr', +\ 'executable': function('ale#handlers#haskell#GetStackExecutable'), +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#haskell#stack_ghc#GetCommand'), +\ 'callback': 'ale#handlers#haskell#HandleGHCFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/help/alex.vim b/dot_vim/plugged/ale/ale_linters/help/alex.vim new file mode 100644 index 0000000..9be00a8 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/help/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for help files + +call ale#handlers#alex#DefineLinter('help', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/help/cspell.vim b/dot_vim/plugged/ale/ale_linters/help/cspell.vim new file mode 100644 index 0000000..92eb950 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/help/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for help files. + +call ale#handlers#cspell#DefineLinter('help') diff --git a/dot_vim/plugged/ale/ale_linters/help/proselint.vim b/dot_vim/plugged/ale/ale_linters/help/proselint.vim new file mode 100644 index 0000000..6212450 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/help/proselint.vim @@ -0,0 +1,9 @@ +" Author: Daniel M. Capella https://github.com/polyzen +" Description: proselint for Vim help files + +call ale#linter#Define('help', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/help/writegood.vim b/dot_vim/plugged/ale/ale_linters/help/writegood.vim new file mode 100644 index 0000000..eeb21a7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/help/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for vim Help files + +call ale#handlers#writegood#DefineLinter('help') diff --git a/dot_vim/plugged/ale/ale_linters/html/alex.vim b/dot_vim/plugged/ale/ale_linters/html/alex.vim new file mode 100644 index 0000000..9775675 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for HTML files + +call ale#handlers#alex#DefineLinter('html', '--html') diff --git a/dot_vim/plugged/ale/ale_linters/html/angular.vim b/dot_vim/plugged/ale/ale_linters/html/angular.vim new file mode 100644 index 0000000..4f368fb --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/angular.vim @@ -0,0 +1,56 @@ +" Author: w0rp +" Description: tsserver integration for ALE + +call ale#Set('html_angular_executable', 'ngserver') +call ale#Set('html_angular_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#html#angular#GetProjectRoot(buffer) abort + return ale#path#Dirname( + \ ale#path#FindNearestDirectory(a:buffer, 'node_modules') + \) +endfunction + +function! ale_linters#html#angular#GetExecutable(buffer) abort + return 'node' +endfunction + +function! ale_linters#html#angular#GetCommand(buffer) abort + let l:language_service_dir = ale#path#Simplify( + \ ale#path#FindNearestDirectory( + \ a:buffer, + \ 'node_modules/@angular/language-service' + \ ) + \) + + if empty(l:language_service_dir) + return '' + endif + + let l:language_service_dir = fnamemodify(l:language_service_dir, ':h') + let l:typescript_dir = ale#path#Simplify( + \ fnamemodify(l:language_service_dir, ':h:h') + \ . '/typescript' + \) + let l:script = ale#path#FindExecutable(a:buffer, 'html_angular', [ + \ 'node_modules/@angular/language-server/bin/ngserver', + \ 'node_modules/@angular/language-server/index.js', + \]) + + if !filereadable(l:script) + return '' + endif + + return ale#Escape('node') . ' ' . ale#Escape(l:script) + \ . ' --ngProbeLocations ' . ale#Escape(l:language_service_dir) + \ . ' --tsProbeLocations ' . ale#Escape(l:typescript_dir) + \ . ' --stdio' +endfunction + +call ale#linter#Define('html', { +\ 'name': 'angular', +\ 'aliases': ['angular-language-server'], +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#html#angular#GetExecutable'), +\ 'command': function('ale_linters#html#angular#GetCommand'), +\ 'project_root': function('ale_linters#html#angular#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/html/cspell.vim b/dot_vim/plugged/ale/ale_linters/html/cspell.vim new file mode 100644 index 0000000..743350e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for HTML files. + +call ale#handlers#cspell#DefineLinter('html') diff --git a/dot_vim/plugged/ale/ale_linters/html/fecs.vim b/dot_vim/plugged/ale/ale_linters/html/fecs.vim new file mode 100644 index 0000000..15e00e1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/fecs.vim @@ -0,0 +1,9 @@ +" Author: harttle +" Description: fecs for HTMl files + +call ale#linter#Define('html', { +\ 'name': 'fecs', +\ 'executable': function('ale#handlers#fecs#GetExecutable'), +\ 'command': function('ale#handlers#fecs#GetCommand'), +\ 'callback': 'ale#handlers#fecs#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/html/htmlhint.vim b/dot_vim/plugged/ale/ale_linters/html/htmlhint.vim new file mode 100644 index 0000000..25bf513 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/htmlhint.vim @@ -0,0 +1,32 @@ +" Author: KabbAmine , deathmaz <00maz1987@gmail.com>, diartyz +" Description: HTMLHint for checking html files + +call ale#Set('html_htmlhint_options', '') +call ale#Set('html_htmlhint_executable', 'htmlhint') +call ale#Set('html_htmlhint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#html#htmlhint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'html_htmlhint_options') + let l:config = l:options !~# '--config' + \ ? ale#path#FindNearestFile(a:buffer, '.htmlhintrc') + \ : '' + + if !empty(l:config) + let l:options .= ' --config ' . ale#Escape(l:config) + endif + + if !empty(l:options) + let l:options = substitute(l:options, '--format=unix', '', '') + endif + + return '%e' . ale#Pad(l:options) . ' --format=unix %t' +endfunction + +call ale#linter#Define('html', { +\ 'name': 'htmlhint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'html_htmlhint', [ +\ 'node_modules/.bin/htmlhint', +\ ])}, +\ 'command': function('ale_linters#html#htmlhint#GetCommand'), +\ 'callback': 'ale#handlers#unix#HandleAsError', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/html/proselint.vim b/dot_vim/plugged/ale/ale_linters/html/proselint.vim new file mode 100644 index 0000000..9fd7d67 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/proselint.vim @@ -0,0 +1,9 @@ +" Author: Daniel M. Capella https://github.com/polyzen +" Description: proselint for HTML files + +call ale#linter#Define('html', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/html/stylelint.vim b/dot_vim/plugged/ale/ale_linters/html/stylelint.vim new file mode 100644 index 0000000..6b7aba4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/stylelint.vim @@ -0,0 +1,27 @@ +" Author: Filipe Kiss http://github.com/filipekiss + +call ale#Set('html_stylelint_executable', 'stylelint') +call ale#Set('html_stylelint_options', '') +call ale#Set('html_stylelint_use_global', 0) + +function! ale_linters#html#stylelint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'html_stylelint', [ + \ 'node_modules/.bin/stylelint', + \]) +endfunction + +function! ale_linters#html#stylelint#GetCommand(buffer) abort + let l:executable = ale_linters#html#stylelint#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'html_stylelint_options') + + return ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --stdin-filename %s' +endfunction + +call ale#linter#Define('html', { +\ 'name': 'stylelint', +\ 'executable': function('ale_linters#html#stylelint#GetExecutable'), +\ 'command': function('ale_linters#html#stylelint#GetCommand'), +\ 'callback': 'ale#handlers#css#HandleStyleLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/html/tidy.vim b/dot_vim/plugged/ale/ale_linters/html/tidy.vim new file mode 100644 index 0000000..1e476d4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/tidy.vim @@ -0,0 +1,70 @@ +" Author: KabbAmine +" Description: This file adds support for checking HTML code with tidy. + +let g:ale_html_tidy_executable = get(g:, 'ale_html_tidy_executable', 'tidy') +let g:ale_html_tidy_options = get(g:, 'ale_html_tidy_options', '-q -e -language en') + +function! ale_linters#html#tidy#GetCommand(buffer) abort + " Specify file encoding in options + " (Idea taken from https://github.com/scrooloose/syntastic/blob/master/syntax_checkers/html/tidy.vim) + let l:file_encoding = get({ + \ 'ascii': '-ascii', + \ 'big5': '-big5', + \ 'cp1252': '-win1252', + \ 'cp850': '-ibm858', + \ 'cp932': '-shiftjis', + \ 'iso-2022-jp': '-iso-2022', + \ 'latin1': '-latin1', + \ 'macroman': '-mac', + \ 'sjis': '-shiftjis', + \ 'utf-16le': '-utf16le', + \ 'utf-16': '-utf16', + \ 'utf-8': '-utf8', + \ }, &fileencoding, '-utf8') + + " On macOS, old tidy (released on 31 Oct 2006) is installed. It does not + " consider HTML5 so we should avoid it. + let l:executable = ale#Var(a:buffer, 'html_tidy_executable') + + if has('mac') && l:executable is# 'tidy' && exists('*exepath') + \ && exepath(l:executable) is# '/usr/bin/tidy' + return '' + endif + + return printf('%s %s %s -', + \ l:executable, + \ ale#Var(a:buffer, 'html_tidy_options'), + \ l:file_encoding + \) +endfunction + +function! ale_linters#html#tidy#Handle(buffer, lines) abort + " Matches patterns lines like the following: + " line 7 column 5 - Warning: missing before + let l:pattern = '^line \(\d\+\) column \(\d\+\) - \(Warning\|Error\): \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:line = l:match[1] + 0 + let l:col = l:match[2] + 0 + let l:type = l:match[3] is# 'Error' ? 'E' : 'W' + let l:text = l:match[4] + + call add(l:output, { + \ 'lnum': l:line, + \ 'col': l:col, + \ 'text': l:text, + \ 'type': l:type, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('html', { +\ 'name': 'tidy', +\ 'executable': {b -> ale#Var(b, 'html_tidy_executable')}, +\ 'output_stream': 'stderr', +\ 'command': function('ale_linters#html#tidy#GetCommand'), +\ 'callback': 'ale_linters#html#tidy#Handle', +\ }) diff --git a/dot_vim/plugged/ale/ale_linters/html/vscodehtml.vim b/dot_vim/plugged/ale/ale_linters/html/vscodehtml.vim new file mode 100644 index 0000000..46814a0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/vscodehtml.vim @@ -0,0 +1,16 @@ +" Author: Dalius Dobravolskas +" Description: VSCode html language server + +function! ale_linters#html#vscodehtml#GetProjectRoot(buffer) abort + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +call ale#linter#Define('html', { +\ 'name': 'vscodehtml', +\ 'lsp': 'stdio', +\ 'executable': 'vscode-html-language-server', +\ 'command': '%e --stdio', +\ 'project_root': function('ale_linters#html#vscodehtml#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/html/writegood.vim b/dot_vim/plugged/ale/ale_linters/html/writegood.vim new file mode 100644 index 0000000..6a2bd8e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/html/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for html files + +call ale#handlers#writegood#DefineLinter('html') diff --git a/dot_vim/plugged/ale/ale_linters/idris/idris.vim b/dot_vim/plugged/ale/ale_linters/idris/idris.vim new file mode 100644 index 0000000..879e92f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/idris/idris.vim @@ -0,0 +1,81 @@ +" Author: Scott Bonds +" Description: default Idris compiler + +call ale#Set('idris_idris_executable', 'idris') +call ale#Set('idris_idris_options', '--total --warnpartial --warnreach --warnipkg') + +function! ale_linters#idris#idris#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'idris_idris_options') + + return '%e' . ale#Pad(l:options) . ' --check %s' +endfunction + +function! ale_linters#idris#idris#Handle(buffer, lines) abort + " This was copied almost verbatim from ale#handlers#haskell#HandleGHCFormat + " + " Look for lines like the following: + " foo.idr:2:6:When checking right hand side of main with expected type + " bar.idr:11:11-13: + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)(-\d+)?:(.*)?$' + let l:output = [] + + let l:corrected_lines = [] + + for l:line in a:lines + if len(matchlist(l:line, l:pattern)) > 0 + call add(l:corrected_lines, l:line) + elseif len(l:corrected_lines) > 0 + if l:line is# '' + let l:corrected_lines[-1] .= ' ' " turn a blank line into a space + else + let l:corrected_lines[-1] .= l:line + endif + + let l:corrected_lines[-1] = substitute(l:corrected_lines[-1], '\s\+', ' ', 'g') + endif + endfor + + for l:line in l:corrected_lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + continue + endif + + if !ale#path#IsBufferPath(a:buffer, l:match[1]) + continue + endif + + let l:errors = matchlist(l:match[5], '\v([wW]arning|[eE]rror) - ?(.*)') + + if len(l:errors) > 0 + let l:ghc_type = l:errors[1] + let l:text = l:errors[2] + else + let l:ghc_type = '' + let l:text = l:match[5][:0] is# ' ' ? l:match[5][1:] : l:match[5] + endif + + if l:ghc_type is? 'Warning' + let l:type = 'W' + else + let l:type = 'E' + endif + + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:text, + \ 'type': l:type, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('idris', { +\ 'name': 'idris', +\ 'executable': {b -> ale#Var(b, 'idris_idris_executable')}, +\ 'command': function('ale_linters#idris#idris#GetCommand'), +\ 'callback': 'ale_linters#idris#idris#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ink/ls.vim b/dot_vim/plugged/ale/ale_linters/ink/ls.vim new file mode 100644 index 0000000..00b2f32 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ink/ls.vim @@ -0,0 +1,35 @@ +" Author: Andreww Hayworth +" Description: Integrate ALE with ink-language-server + +call ale#Set('ink_ls_executable', 'ink-language-server') +call ale#Set('ink_ls_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('ink_ls_initialization_options', {}) + +function! ale_linters#ink#ls#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'ink_ls', [ + \ 'ink-language-server', + \ 'node_modules/.bin/ink-language-server', + \]) +endfunction + +function! ale_linters#ink#ls#GetCommand(buffer) abort + let l:executable = ale_linters#ink#ls#GetExecutable(a:buffer) + + return ale#Escape(l:executable) . ' --stdio' +endfunction + +function! ale_linters#ink#ls#FindProjectRoot(buffer) abort + let l:main_file = get(ale#Var(a:buffer, 'ink_ls_initialization_options'), 'mainStoryPath', 'main.ink') + let l:config = ale#path#ResolveLocalPath(a:buffer, l:main_file, expand('#' . a:buffer . ':p')) + + return ale#path#Dirname(l:config) +endfunction + +call ale#linter#Define('ink', { +\ 'name': 'ink-language-server', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#ink#ls#GetExecutable'), +\ 'command': function('ale_linters#ink#ls#GetCommand'), +\ 'project_root': function('ale_linters#ink#ls#FindProjectRoot'), +\ 'initialization_options': {b -> ale#Var(b, 'ink_ls_initialization_options')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/inko/inko.vim b/dot_vim/plugged/ale/ale_linters/inko/inko.vim new file mode 100644 index 0000000..1155889 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/inko/inko.vim @@ -0,0 +1,33 @@ +" Author: Yorick Peterse +" Description: linting of Inko source code using the Inko compiler + +call ale#Set('inko_inko_executable', 'inko') + +function! ale_linters#inko#inko#GetCommand(buffer) abort + let l:include = '' + + " Include the tests source directory, but only for test files. + if expand('#' . a:buffer . ':p') =~? '\vtests[/\\]test[/\\]' + let l:test_dir = ale#path#FindNearestDirectory(a:buffer, 'tests') + + if isdirectory(l:test_dir) + let l:include = '--include ' . ale#Escape(l:test_dir) + endif + endif + + " We use %s instead of %t so the compiler determines the correct module + " names for the file being edited. Not doing so may lead to errors in + " certain cases. + return '%e build --check --format=json' + \ . ale#Pad(l:include) + \ . ' %s' +endfunction + +call ale#linter#Define('inko', { +\ 'name': 'inko', +\ 'executable': {b -> ale#Var(b, 'inko_inko_executable')}, +\ 'command': function('ale_linters#inko#inko#GetCommand'), +\ 'callback': 'ale#handlers#inko#Handle', +\ 'output_stream': 'stderr', +\ 'lint_file': 1 +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ispc/ispc.vim b/dot_vim/plugged/ale/ale_linters/ispc/ispc.vim new file mode 100644 index 0000000..eb36511 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ispc/ispc.vim @@ -0,0 +1,45 @@ +" Author: Martino Pilia +" Description: Lint ispc files with the Intel(R) SPMD Program Compiler + +call ale#Set('ispc_ispc_executable', 'ispc') +call ale#Set('ispc_ispc_options', '') + +function! ale_linters#ispc#ispc#GetCommand(buffer) abort + " --nowrap: do not wrap message lines + return '%e --nowrap' + \ . ale#Pad(ale#c#IncludeOptions(ale#c#FindLocalHeaderPaths(a:buffer))) + \ . ale#Pad(ale#Var(a:buffer, 'ispc_ispc_options')) + \ . ' %s' +endfunction + +" Note that we ignore the two warnings in the beginning of the compiler output +" ('no output file specified' and 'no --target specified'), since they have +" nothing to do with linting. +function! ale_linters#ispc#ispc#Handle(buffer, lines) abort + " Message format: :: : + " As far as I know, can be any of: + " 'error', 'Error', 'fatal error', 'Warning', 'Performance Warning' + let l:re = '\v.+:([0-9]+):([0-9]+):\s+([^:]+):\s+(.+)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:re) + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': str2nr(l:match[1]), + \ 'col': str2nr(l:match[2]), + \ 'type': l:match[3] =~? 'error' ? 'E' : 'W', + \ 'text': l:match[4], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('ispc', { +\ 'name': 'ispc', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'ispc_ispc_executable')}, +\ 'command': function('ale_linters#ispc#ispc#GetCommand'), +\ 'callback': 'ale_linters#ispc#ispc#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/java/checkstyle.vim b/dot_vim/plugged/ale/ale_linters/java/checkstyle.vim new file mode 100644 index 0000000..1ccbc50 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/java/checkstyle.vim @@ -0,0 +1,73 @@ +" Author: Devon Meunier +" Description: checkstyle for Java files + +call ale#Set('java_checkstyle_executable', 'checkstyle') +call ale#Set('java_checkstyle_config', '/google_checks.xml') +call ale#Set('java_checkstyle_options', '') + +function! ale_linters#java#checkstyle#Handle(buffer, lines) abort + let l:output = [] + + " modern checkstyle versions + let l:pattern = '\v\[(WARN|ERROR)\] [a-zA-Z]?:?[^:]+:(\d+):(\d+)?:? (.*) \[(.+)\]' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'type': l:match[1] is? 'WARN' ? 'W' : 'E', + \ 'sub_type': 'style', + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[4], + \ 'code': l:match[5], + \}) + endfor + + if !empty(l:output) + return l:output + endif + + " old checkstyle versions + let l:pattern = '\v(.+):(\d+): ([^:]+): (.+)$' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'type': l:match[3] is? 'warning' ? 'W' : 'E', + \ 'sub_type': 'style', + \ 'lnum': l:match[2] + 0, + \ 'text': l:match[4], + \}) + endfor + + return l:output +endfunction + +function! s:GetConfig(buffer, config) abort + if ale#path#IsAbsolute(a:config) + return a:config + endif + + let s:file = ale#path#FindNearestFile(a:buffer, a:config) + + return !empty(s:file) ? s:file : a:config +endfunction + +function! ale_linters#java#checkstyle#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'java_checkstyle_options') + let l:config_option = ale#Var(a:buffer, 'java_checkstyle_config') + let l:config = l:options !~# '\v(^| )-c ' && !empty(l:config_option) + \ ? s:GetConfig(a:buffer, l:config_option) + \ : '' + + return '%e' + \ . ale#Pad(l:options) + \ . (!empty(l:config) ? ' -c ' . ale#Escape(l:config) : '') + \ . ' %s' +endfunction + +call ale#linter#Define('java', { +\ 'name': 'checkstyle', +\ 'executable': {b -> ale#Var(b, 'java_checkstyle_executable')}, +\ 'command': function('ale_linters#java#checkstyle#GetCommand'), +\ 'callback': 'ale_linters#java#checkstyle#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/java/cspell.vim b/dot_vim/plugged/ale/ale_linters/java/cspell.vim new file mode 100644 index 0000000..a6eecc0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/java/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Java files. + +call ale#handlers#cspell#DefineLinter('java') diff --git a/dot_vim/plugged/ale/ale_linters/java/eclipselsp.vim b/dot_vim/plugged/ale/ale_linters/java/eclipselsp.vim new file mode 100644 index 0000000..ad7cbeb --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/java/eclipselsp.vim @@ -0,0 +1,200 @@ +" Author: Horacio Sanson +" Description: Support for the Eclipse language server https://github.com/eclipse/eclipse.jdt.ls + +let s:version_cache = {} + +call ale#Set('java_eclipselsp_path', ale#path#Simplify($HOME . '/eclipse.jdt.ls')) +call ale#Set('java_eclipselsp_config_path', '') +call ale#Set('java_eclipselsp_workspace_path', '') +call ale#Set('java_eclipselsp_executable', 'java') +call ale#Set('java_eclipselsp_javaagent', '') + +function! ale_linters#java#eclipselsp#Executable(buffer) abort + return ale#Var(a:buffer, 'java_eclipselsp_executable') +endfunction + +function! ale_linters#java#eclipselsp#TargetPath(buffer) abort + return ale#Var(a:buffer, 'java_eclipselsp_path') +endfunction + +function! ale_linters#java#eclipselsp#JarPath(buffer) abort + let l:path = ale_linters#java#eclipselsp#TargetPath(a:buffer) + + if has('win32') + let l:platform = 'win32' + elseif has('macunix') + let l:platform = 'macosx' + else + let l:platform = 'linux' + endif + + " Search jar file within repository path when manually built using mvn + let l:files = globpath(l:path, '**/'.l:platform.'/**/plugins/org.eclipse.equinox.launcher_*\.jar', 1, 1) + + if len(l:files) >= 1 + return l:files[0] + endif + + " Search jar file within VSCode extensions folder. + let l:files = globpath(l:path, '**/'.l:platform.'/plugins/org.eclipse.equinox.launcher_*\.jar', 1, 1) + + if len(l:files) >= 1 + return l:files[0] + endif + + " Search jar file within unzipped tar.gz file + let l:files = globpath(l:path, 'plugins/org.eclipse.equinox.launcher_*\.jar', 1, 1) + + if len(l:files) >= 1 + return l:files[0] + endif + + " Search jar file within system package path + let l:files = globpath('/usr/share/java/jdtls/plugins', 'org.eclipse.equinox.launcher_*\.jar', 1, 1) + + if len(l:files) >= 1 + return l:files[0] + endif + + return '' +endfunction + +function! ale_linters#java#eclipselsp#ConfigurationPath(buffer) abort + let l:path = fnamemodify(ale_linters#java#eclipselsp#JarPath(a:buffer), ':p:h:h') + let l:config_path = ale#Var(a:buffer, 'java_eclipselsp_config_path') + + if !empty(l:config_path) + return ale#path#Simplify(l:config_path) + endif + + if has('win32') + let l:path = l:path . '/config_win' + elseif has('macunix') + let l:path = l:path . '/config_mac' + else + let l:path = l:path . '/config_linux' + endif + + return ale#path#Simplify(l:path) +endfunction + +function! ale_linters#java#eclipselsp#VersionCheck(version_lines) abort + return s:GetVersion('', a:version_lines) +endfunction + +function! s:GetVersion(executable, version_lines) abort + let l:version = [] + + for l:line in a:version_lines + let l:match = matchlist(l:line, '\(\d\+\)\.\(\d\+\)\.\(\d\+\)') + + if !empty(l:match) + let l:version = [l:match[1] + 0, l:match[2] + 0, l:match[3] + 0] + let s:version_cache[a:executable] = l:version + break + endif + endfor + + return l:version +endfunction + +function! ale_linters#java#eclipselsp#CommandWithVersion(buffer, version_lines, meta) abort + let l:executable = ale_linters#java#eclipselsp#Executable(a:buffer) + let l:version = s:GetVersion(l:executable, a:version_lines) + + return ale_linters#java#eclipselsp#Command(a:buffer, l:version) +endfunction + +function! ale_linters#java#eclipselsp#WorkspacePath(buffer) abort + let l:wspath = ale#Var(a:buffer, 'java_eclipselsp_workspace_path') + + if !empty(l:wspath) + return l:wspath + endif + + return ale#path#Dirname(ale#java#FindProjectRoot(a:buffer)) +endfunction + +function! ale_linters#java#eclipselsp#Javaagent(buffer) abort + let l:rets = [] + let l:raw = ale#Var(a:buffer, 'java_eclipselsp_javaagent') + + if empty(l:raw) + return '' + endif + + let l:jars = split(l:raw) + + for l:jar in l:jars + call add(l:rets, ale#Escape('-javaagent:' . l:jar)) + endfor + + return join(l:rets, ' ') +endfunction + +function! ale_linters#java#eclipselsp#Command(buffer, version) abort + let l:path = ale#Var(a:buffer, 'java_eclipselsp_path') + + let l:executable = ale_linters#java#eclipselsp#Executable(a:buffer) + + let l:cmd = [ ale#Escape(l:executable), + \ ale_linters#java#eclipselsp#Javaagent(a:buffer), + \ '-Declipse.application=org.eclipse.jdt.ls.core.id1', + \ '-Dosgi.bundles.defaultStartLevel=4', + \ '-Declipse.product=org.eclipse.jdt.ls.core.product', + \ '-Dlog.level=ALL', + \ '-noverify', + \ '-Xmx1G', + \ '-jar', + \ ale#Escape(ale_linters#java#eclipselsp#JarPath(a:buffer)), + \ '-configuration', + \ ale#Escape(ale_linters#java#eclipselsp#ConfigurationPath(a:buffer)), + \ '-data', + \ ale#Escape(ale_linters#java#eclipselsp#WorkspacePath(a:buffer)) + \ ] + + if ale#semver#GTE(a:version, [1, 9]) + call add(l:cmd, '--add-modules=ALL-SYSTEM') + call add(l:cmd, '--add-opens java.base/java.util=ALL-UNNAMED') + call add(l:cmd, '--add-opens java.base/java.lang=ALL-UNNAMED') + endif + + return join(l:cmd, ' ') +endfunction + +function! ale_linters#java#eclipselsp#RunWithVersionCheck(buffer) abort + let l:executable = ale_linters#java#eclipselsp#Executable(a:buffer) + + if empty(l:executable) + return '' + endif + + let l:cache = s:version_cache + + if has_key(s:version_cache, l:executable) + return ale_linters#java#eclipselsp#Command(a:buffer, s:version_cache[l:executable]) + endif + + let l:command = ale#Escape(l:executable) . ' -version' + + return ale#command#Run( + \ a:buffer, + \ l:command, + \ function('ale_linters#java#eclipselsp#CommandWithVersion'), + \ { 'output_stream': 'both' } + \) +endfunction + +call ale#linter#Define('java', { +\ 'name': 'eclipselsp', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#java#eclipselsp#Executable'), +\ 'command': function('ale_linters#java#eclipselsp#RunWithVersionCheck'), +\ 'language': 'java', +\ 'project_root': function('ale#java#FindProjectRoot'), +\ 'initialization_options': { +\ 'extendedClientCapabilities': { +\ 'classFileContentsSupport': v:true +\ } +\ } +\}) diff --git a/dot_vim/plugged/ale/ale_linters/java/javac.vim b/dot_vim/plugged/ale/ale_linters/java/javac.vim new file mode 100644 index 0000000..971e8de --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/java/javac.vim @@ -0,0 +1,163 @@ +" Author: farenjihn , w0rp +" Description: Lints java files using javac + +let s:classpath_sep = has('unix') ? ':' : ';' + +call ale#Set('java_javac_executable', 'javac') +call ale#Set('java_javac_options', '') +call ale#Set('java_javac_classpath', '') +call ale#Set('java_javac_sourcepath', '') + +function! ale_linters#java#javac#RunWithImportPaths(buffer) abort + let [l:cwd, l:command] = ale#maven#BuildClasspathCommand(a:buffer) + + " Try to use Gradle if Maven isn't available. + if empty(l:command) + let [l:cwd, l:command] = ale#gradle#BuildClasspathCommand(a:buffer) + endif + + " Try to use Ant if Gradle and Maven aren't available + if empty(l:command) + let [l:cwd, l:command] = ale#ant#BuildClasspathCommand(a:buffer) + endif + + if empty(l:command) + return ale_linters#java#javac#GetCommand(a:buffer, [], {}) + endif + + return ale#command#Run( + \ a:buffer, + \ l:command, + \ function('ale_linters#java#javac#GetCommand'), + \ {'cwd': l:cwd}, + \) +endfunction + +function! s:BuildClassPathOption(buffer, import_paths) abort + " Filter out lines like [INFO], etc. + let l:class_paths = filter(a:import_paths[:], 'v:val !~# ''[''') + let l:cls_path = ale#Var(a:buffer, 'java_javac_classpath') + + if !empty(l:cls_path) && type(l:cls_path) is v:t_string + call extend(l:class_paths, split(l:cls_path, s:classpath_sep)) + endif + + if !empty(l:cls_path) && type(l:cls_path) is v:t_list + call extend(l:class_paths, l:cls_path) + endif + + return !empty(l:class_paths) + \ ? '-cp ' . ale#Escape(join(l:class_paths, s:classpath_sep)) + \ : '' +endfunction + +function! ale_linters#java#javac#GetCommand(buffer, import_paths, meta) abort + let l:cp_option = s:BuildClassPathOption(a:buffer, a:import_paths) + let l:sp_option = '' + + " Find the src directory, for files in this project. + let l:src_dir = ale#path#FindNearestDirectory(a:buffer, 'src/main/java') + let l:sp_dirs = [] + + if !empty(l:src_dir) + call add(l:sp_dirs, l:src_dir) + + " Automatically include the jaxb directory too, if it's there. + let l:jaxb_dir = fnamemodify(l:src_dir, ':h:h') + \ . (has('win32') ? '\jaxb\' : '/jaxb/') + + if isdirectory(l:jaxb_dir) + call add(l:sp_dirs, l:jaxb_dir) + endif + endif + + " Automatically include the test directory, but only for test code. + if expand('#' . a:buffer . ':p') =~? '\vsrc[/\\]test[/\\]java' + let l:test_dir = ale#path#FindNearestDirectory(a:buffer, 'src/test/java') + + if isdirectory(l:test_dir) + call add(l:sp_dirs, l:test_dir) + endif + endif + + let l:source_paths = [] + let l:source_path = ale#Var(a:buffer, 'java_javac_sourcepath') + + if !empty(l:source_path) && type(l:source_path) is v:t_string + let l:source_paths = split(l:source_path, s:classpath_sep) + endif + + if !empty(l:source_path) && type(l:source_path) is v:t_list + let l:source_paths = l:source_path + endif + + if !empty(l:source_paths) + for l:path in l:source_paths + let l:sp_path = ale#path#FindNearestDirectory(a:buffer, l:path) + + if !empty(l:sp_path) + call add(l:sp_dirs, l:sp_path) + endif + endfor + endif + + if !empty(l:sp_dirs) + let l:sp_option = '-sourcepath ' + \ . ale#Escape(join(l:sp_dirs, s:classpath_sep)) + endif + + " Create .class files in a temporary directory, which we will delete later. + let l:class_file_directory = ale#command#CreateDirectory(a:buffer) + + " Always run javac from the directory the file is in, so we can resolve + " relative paths correctly. + return '%e -Xlint' + \ . ale#Pad(l:cp_option) + \ . ale#Pad(l:sp_option) + \ . ' -d ' . ale#Escape(l:class_file_directory) + \ . ale#Pad(ale#Var(a:buffer, 'java_javac_options')) + \ . ' %t' +endfunction + +function! ale_linters#java#javac#Handle(buffer, lines) abort + " Look for lines like the following. + " + " Main.java:13: warning: [deprecation] donaught() in Testclass has been deprecated + " Main.java:16: error: ';' expected + let l:directory = expand('#' . a:buffer . ':p:h') + let l:pattern = '\v^(.*):(\d+): (.{-1,}):(.+)$' + let l:col_pattern = '\v^(\s*\^)$' + let l:symbol_pattern = '\v^ +symbol: *(class|method) +([^ ]+)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, [l:pattern, l:col_pattern, l:symbol_pattern]) + if empty(l:match[2]) && empty(l:match[3]) + if !empty(l:match[1]) && !empty(l:output) + let l:output[-1].col = len(l:match[1]) + endif + elseif empty(l:match[3]) + " Add symbols to 'cannot find symbol' errors. + if l:output[-1].text is# 'error: cannot find symbol' + let l:output[-1].text .= ': ' . l:match[2] + endif + else + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:directory, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'text': l:match[3] . ':' . l:match[4], + \ 'type': l:match[3] is# 'error' ? 'E' : 'W', + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('java', { +\ 'name': 'javac', +\ 'executable': {b -> ale#Var(b, 'java_javac_executable')}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#java#javac#RunWithImportPaths'), +\ 'output_stream': 'stderr', +\ 'callback': 'ale_linters#java#javac#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/java/javalsp.vim b/dot_vim/plugged/ale/ale_linters/java/javalsp.vim new file mode 100644 index 0000000..baf584c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/java/javalsp.vim @@ -0,0 +1,55 @@ +" Author: Horacio Sanson +" Description: Support for the Java language server https://github.com/georgewfraser/vscode-javac + +call ale#Set('java_javalsp_executable', '') +call ale#Set('java_javalsp_config', {}) + +function! ale_linters#java#javalsp#Executable(buffer) abort + return ale#Var(a:buffer, 'java_javalsp_executable') +endfunction + +function! ale_linters#java#javalsp#Config(buffer) abort + let l:defaults = { 'java': { 'classPath': [], 'externalDependencies': [] } } + let l:config = ale#Var(a:buffer, 'java_javalsp_config') + + " Ensure the config dictionary contains both classPath and + " externalDependencies keys to avoid a NPE crash on Java Language Server. + call extend(l:config, l:defaults, 'keep') + call extend(l:config['java'], l:defaults['java'], 'keep') + + return l:config +endfunction + +function! ale_linters#java#javalsp#Command(buffer) abort + let l:executable = ale_linters#java#javalsp#Executable(a:buffer) + + if fnamemodify(l:executable, ':t') is# 'java' + " For backward compatibility. + let l:cmd = [ + \ ale#Escape(l:executable), + \ '--add-exports jdk.compiler/com.sun.tools.javac.api=javacs', + \ '--add-exports jdk.compiler/com.sun.tools.javac.code=javacs', + \ '--add-exports jdk.compiler/com.sun.tools.javac.comp=javacs', + \ '--add-exports jdk.compiler/com.sun.tools.javac.main=javacs', + \ '--add-exports jdk.compiler/com.sun.tools.javac.tree=javacs', + \ '--add-exports jdk.compiler/com.sun.tools.javac.model=javacs', + \ '--add-exports jdk.compiler/com.sun.tools.javac.util=javacs', + \ '--add-opens jdk.compiler/com.sun.tools.javac.api=javacs', + \ '-m javacs/org.javacs.Main', + \] + + return join(l:cmd, ' ') + else + return ale#Escape(l:executable) + endif +endfunction + +call ale#linter#Define('java', { +\ 'name': 'javalsp', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#java#javalsp#Executable'), +\ 'command': function('ale_linters#java#javalsp#Command'), +\ 'language': 'java', +\ 'project_root': function('ale#java#FindProjectRoot'), +\ 'lsp_config': function('ale_linters#java#javalsp#Config') +\}) diff --git a/dot_vim/plugged/ale/ale_linters/java/pmd.vim b/dot_vim/plugged/ale/ale_linters/java/pmd.vim new file mode 100644 index 0000000..a1f4c93 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/java/pmd.vim @@ -0,0 +1,36 @@ +" Author: Johannes Wienke +" Description: PMD for Java files + +function! ale_linters#java#pmd#Handle(buffer, lines) abort + let l:pattern = '"\(\d\+\)",".*","\(.\+\)","\(\d\+\)","\(\d\+\)","\(.\+\)","\(.\+\)","\(.\+\)"$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'type': 'W', + \ 'lnum': l:match[4] + 0, + \ 'text': l:match[5], + \ 'code': l:match[6] . ' - ' . l:match[7], + \}) + endfor + + return l:output +endfunction + +function! ale_linters#java#pmd#GetCommand(buffer) abort + return 'pmd ' + \ . ale#Var(a:buffer, 'java_pmd_options') + \ . ' -f csv' + \ . ' -d %t' +endfunction + +if !exists('g:ale_java_pmd_options') + let g:ale_java_pmd_options = '-R category/java/bestpractices.xml' +endif + +call ale#linter#Define('java', { +\ 'name': 'pmd', +\ 'executable': 'pmd', +\ 'command': function('ale_linters#java#pmd#GetCommand'), +\ 'callback': 'ale_linters#java#pmd#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/cspell.vim b/dot_vim/plugged/ale/ale_linters/javascript/cspell.vim new file mode 100644 index 0000000..5a49677 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for JavaScript files. + +call ale#handlers#cspell#DefineLinter('javascript') diff --git a/dot_vim/plugged/ale/ale_linters/javascript/deno.vim b/dot_vim/plugged/ale/ale_linters/javascript/deno.vim new file mode 100644 index 0000000..659eb85 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/deno.vim @@ -0,0 +1,11 @@ +" Author: Arnold Chand +" Description: Deno lsp linter for JavaScript files. + +call ale#linter#Define('javascript', { +\ 'name': 'deno', +\ 'lsp': 'stdio', +\ 'executable': function('ale#handlers#deno#GetExecutable'), +\ 'command': '%e lsp', +\ 'project_root': function('ale#handlers#deno#GetProjectRoot'), +\ 'initialization_options': function('ale#handlers#deno#GetInitializationOptions'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/eslint.vim b/dot_vim/plugged/ale/ale_linters/javascript/eslint.vim new file mode 100644 index 0000000..cf4de6e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/eslint.vim @@ -0,0 +1,11 @@ +" Author: w0rp +" Description: eslint for JavaScript files + +call ale#linter#Define('javascript', { +\ 'name': 'eslint', +\ 'output_stream': 'both', +\ 'executable': function('ale#handlers#eslint#GetExecutable'), +\ 'cwd': function('ale#handlers#eslint#GetCwd'), +\ 'command': function('ale#handlers#eslint#GetCommand'), +\ 'callback': 'ale#handlers#eslint#HandleJSON', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/fecs.vim b/dot_vim/plugged/ale/ale_linters/javascript/fecs.vim new file mode 100644 index 0000000..e47c0a0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/fecs.vim @@ -0,0 +1,10 @@ +" Author: harttle +" Description: fecs for JavaScript files + +call ale#linter#Define('javascript', { +\ 'name': 'fecs', +\ 'executable': function('ale#handlers#fecs#GetExecutable'), +\ 'command': function('ale#handlers#fecs#GetCommand'), +\ 'read_buffer': 0, +\ 'callback': 'ale#handlers#fecs#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/flow.vim b/dot_vim/plugged/ale/ale_linters/javascript/flow.vim new file mode 100644 index 0000000..601bac3 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/flow.vim @@ -0,0 +1,160 @@ +" Author: Zach Perrault -- @zperrault +" Author: Florian Beeres +" Description: FlowType checking for JavaScript files + +call ale#Set('javascript_flow_executable', 'flow') +call ale#Set('javascript_flow_use_home_config', 0) +call ale#Set('javascript_flow_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('javascript_flow_use_respect_pragma', 1) + +function! ale_linters#javascript#flow#GetExecutable(buffer) abort + let l:flow_config = ale#path#FindNearestFile(a:buffer, '.flowconfig') + + if empty(l:flow_config) + " Don't run Flow if we can't find a .flowconfig file. + return '' + endif + + " Don't run Flow with a configuration file from the home directory by + " default, which can eat all of your RAM. + if fnamemodify(l:flow_config, ':h') is? $HOME + \&& !ale#Var(a:buffer, 'javascript_flow_use_home_config') + return '' + endif + + return ale#path#FindExecutable(a:buffer, 'javascript_flow', [ + \ 'node_modules/.bin/flow', + \]) +endfunction + +function! ale_linters#javascript#flow#GetCommand(buffer, version) abort + " If we can parse the version number, then only use --respect-pragma + " if the version is >= 0.36.0, which added the argument. + let l:use_respect_pragma = ale#Var(a:buffer, 'javascript_flow_use_respect_pragma') + \ && (empty(a:version) || ale#semver#GTE(a:version, [0, 36])) + + return '%e check-contents' + \ . (l:use_respect_pragma ? ' --respect-pragma': '') + \ . ' --json --from ale %s < %t' + \ . (!has('win32') ? '; echo' : '') +endfunction + +" Filter lines of flow output until we find the first line where the JSON +" output starts. +function! s:GetJSONLines(lines) abort + let l:start_index = 0 + + for l:line in a:lines + if l:line[:0] is# '{' + break + endif + + let l:start_index += 1 + endfor + + return a:lines[l:start_index :] +endfunction + +function! s:ExtraErrorMsg(current, new) abort + let l:newMsg = '' + + if a:current is# '' + " extra messages appear to already have a : + let l:newMsg = a:new + else + let l:newMsg = a:current . ' ' . a:new + endif + + return l:newMsg +endfunction + +function! s:GetDetails(error) abort + let l:detail = '' + + for l:extra_error in a:error.extra + if has_key(l:extra_error, 'message') + for l:extra_message in l:extra_error.message + let l:detail = s:ExtraErrorMsg(l:detail, l:extra_message.descr) + endfor + endif + + if has_key(l:extra_error, 'children') + for l:child in l:extra_error.children + for l:child_message in l:child.message + let l:detail = l:detail . ' ' . l:child_message.descr + endfor + endfor + endif + endfor + + return l:detail +endfunction + +function! ale_linters#javascript#flow#Handle(buffer, lines) abort + let l:str = join(s:GetJSONLines(a:lines), '') + + if empty(l:str) + return [] + endif + + let l:flow_output = json_decode(l:str) + let l:output = [] + + for l:error in get(l:flow_output, 'errors', []) + " Each error is broken up into parts + let l:text = '' + let l:line = 0 + let l:col = 0 + + for l:message in l:error.message + " Comments have no line of column information, so we skip them. + " In certain cases, `l:message.loc.source` points to a different path + " than the buffer one, thus we skip this loc information too. + if has_key(l:message, 'loc') + \&& l:line is# 0 + \&& ale#path#IsBufferPath(a:buffer, l:message.loc.source) + let l:line = l:message.loc.start.line + 0 + let l:col = l:message.loc.start.column + 0 + endif + + if l:text is# '' + let l:text = l:message.descr . ':' + else + let l:text = l:text . ' ' . l:message.descr + endif + endfor + + if has_key(l:error, 'operation') + let l:text = l:text . ' See also: ' . l:error.operation.descr + endif + + let l:errorToAdd = { + \ 'lnum': l:line, + \ 'col': l:col, + \ 'text': l:text, + \ 'type': has_key(l:error, 'level') && l:error.level is# 'error' ? 'E' : 'W', + \} + + if has_key(l:error, 'extra') + let l:errorToAdd.detail = l:errorToAdd.text + \ . "\n" . s:GetDetails(l:error) + endif + + call add(l:output, l:errorToAdd) + endfor + + return l:output +endfunction + +call ale#linter#Define('javascript', { +\ 'name': 'flow', +\ 'executable': function('ale_linters#javascript#flow#GetExecutable'), +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale_linters#javascript#flow#GetExecutable(buffer), +\ '%e --version', +\ function('ale_linters#javascript#flow#GetCommand'), +\ )}, +\ 'callback': 'ale_linters#javascript#flow#Handle', +\ 'read_buffer': 0, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/flow_ls.vim b/dot_vim/plugged/ale/ale_linters/javascript/flow_ls.vim new file mode 100644 index 0000000..fec3401 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/flow_ls.vim @@ -0,0 +1,28 @@ +" Author: t_t +" Description: Integrate ALE with flow-language-server. + +call ale#Set('javascript_flow_ls_executable', 'flow') +call ale#Set('javascript_flow_ls_use_global', +\ get(g:, 'ale_use_global_executables', 0) +\) + +function! ale_linters#javascript#flow_ls#FindProjectRoot(buffer) abort + let l:flow_config = ale#path#FindNearestFile(a:buffer, '.flowconfig') + + if !empty(l:flow_config) + return fnamemodify(l:flow_config, ':h') + endif + + return '' +endfunction + +call ale#linter#Define('javascript', { +\ 'name': 'flow-language-server', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#path#FindExecutable(b, 'javascript_flow_ls', [ +\ 'node_modules/.bin/flow', +\ ])}, +\ 'command': '%e lsp --from ale-lsp', +\ 'project_root': function('ale_linters#javascript#flow_ls#FindProjectRoot'), +\ 'language': 'javascript', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/jscs.vim b/dot_vim/plugged/ale/ale_linters/javascript/jscs.vim new file mode 100644 index 0000000..ae3be68 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/jscs.vim @@ -0,0 +1,61 @@ +" Author: Chris Kyrouac - https://github.com/fijshion +" Description: jscs for JavaScript files + +call ale#Set('javascript_jscs_executable', 'jscs') +call ale#Set('javascript_jscs_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#javascript#jscs#GetCommand(buffer) abort + " Search for a local JShint config locaation, and default to a global one. + let l:jscs_config = ale#path#ResolveLocalPath( + \ a:buffer, + \ '.jscsrc', + \ get(g:, 'ale_jscs_config_loc', '') + \) + + let l:command = '%e --reporter inline --no-colors' + + if !empty(l:jscs_config) + let l:command .= ' --config ' . ale#Escape(l:jscs_config) + endif + + let l:command .= ' -' + + return l:command +endfunction + +function! ale_linters#javascript#jscs#Handle(buffer, lines) abort + " Matches patterns looking like the following + " + " foobar.js: line 2, col 1, Expected indentation of 1 characters + " + let l:pattern = '\v^.*:\s+line (\d+),\s+col\s+(\d+),\s+(.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:obj = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3] + \} + + let l:code_match = matchlist(l:match[3], '\v([^ :]+): (.+)$') + + if !empty(l:code_match) + let l:obj.code = l:code_match[1] + let l:obj.text = l:code_match[2] + endif + + call add(l:output, l:obj) + endfor + + return l:output +endfunction + +call ale#linter#Define('javascript', { +\ 'name': 'jscs', +\ 'executable': {b -> ale#path#FindExecutable(b, 'javascript_jscs', [ +\ 'node_modules/.bin/jscs', +\ ])}, +\ 'command': function('ale_linters#javascript#jscs#GetCommand'), +\ 'callback': 'ale_linters#javascript#jscs#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/jshint.vim b/dot_vim/plugged/ale/ale_linters/javascript/jshint.vim new file mode 100644 index 0000000..26d4fda --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/jshint.vim @@ -0,0 +1,33 @@ +" Author: Chris Kyrouac - https://github.com/fijshion +" Description: JSHint for Javascript files + +call ale#Set('javascript_jshint_executable', 'jshint') +call ale#Set('javascript_jshint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#javascript#jshint#GetCommand(buffer) abort + " Search for a local JShint config locaation, and default to a global one. + let l:jshint_config = ale#path#ResolveLocalPath( + \ a:buffer, + \ '.jshintrc', + \ get(g:, 'ale_jshint_config_loc', '') + \) + + let l:command = '%e --reporter unix --extract auto' + + if !empty(l:jshint_config) + let l:command .= ' --config ' . ale#Escape(l:jshint_config) + endif + + let l:command .= ' --filename %s -' + + return l:command +endfunction + +call ale#linter#Define('javascript', { +\ 'name': 'jshint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'javascript_jshint', [ +\ 'node_modules/.bin/jshint', +\ ])}, +\ 'command': function('ale_linters#javascript#jshint#GetCommand'), +\ 'callback': 'ale#handlers#unix#HandleAsError', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/standard.vim b/dot_vim/plugged/ale/ale_linters/javascript/standard.vim new file mode 100644 index 0000000..addf41d --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/standard.vim @@ -0,0 +1,32 @@ +" Author: Ahmed El Gabri <@ahmedelgabri> +" Description: standardjs for JavaScript files + +call ale#Set('javascript_standard_executable', 'standard') +call ale#Set('javascript_standard_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('javascript_standard_options', '') + +function! ale_linters#javascript#standard#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'javascript_standard', [ + \ 'node_modules/standardx/bin/cmd.js', + \ 'node_modules/standard/bin/cmd.js', + \ 'node_modules/semistandard/bin/cmd.js', + \ 'node_modules/.bin/standard', + \]) +endfunction + +function! ale_linters#javascript#standard#GetCommand(buffer) abort + let l:executable = ale_linters#javascript#standard#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'javascript_standard_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --stdin %s' +endfunction + +" standard uses eslint and the output format is the same +call ale#linter#Define('javascript', { +\ 'name': 'standard', +\ 'executable': function('ale_linters#javascript#standard#GetExecutable'), +\ 'command': function('ale_linters#javascript#standard#GetCommand'), +\ 'callback': 'ale#handlers#eslint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/tsserver.vim b/dot_vim/plugged/ale/ale_linters/javascript/tsserver.vim new file mode 100644 index 0000000..caf6972 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/tsserver.vim @@ -0,0 +1,17 @@ +" Author: Chaucerbao, w0rp +" Description: tsserver integration for ALE + +call ale#Set('javascript_tsserver_executable', 'tsserver') +call ale#Set('javascript_tsserver_config_path', '') +call ale#Set('javascript_tsserver_use_global', get(g:, 'ale_use_global_executables', 0)) + +call ale#linter#Define('javascript', { +\ 'name': 'tsserver', +\ 'lsp': 'tsserver', +\ 'executable': {b -> ale#path#FindExecutable(b, 'javascript_tsserver', [ +\ 'node_modules/.bin/tsserver', +\ ])}, +\ 'command': '%e', +\ 'project_root': function('ale#handlers#tsserver#GetProjectRoot'), +\ 'language': '', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/javascript/xo.vim b/dot_vim/plugged/ale/ale_linters/javascript/xo.vim new file mode 100644 index 0000000..5e04ad5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/javascript/xo.vim @@ -0,0 +1,9 @@ +" Author: Daniel Lupu +" Description: xo for JavaScript files + +call ale#linter#Define('javascript', { +\ 'name': 'xo', +\ 'executable': function('ale#handlers#xo#GetExecutable'), +\ 'command': function('ale#handlers#xo#GetLintCommand'), +\ 'callback': 'ale#handlers#xo#HandleJSON', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/json/cspell.vim b/dot_vim/plugged/ale/ale_linters/json/cspell.vim new file mode 100644 index 0000000..0d7314a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/json/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for JSON files. + +call ale#handlers#cspell#DefineLinter('json') diff --git a/dot_vim/plugged/ale/ale_linters/json/eslint.vim b/dot_vim/plugged/ale/ale_linters/json/eslint.vim new file mode 100644 index 0000000..bdabb9f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/json/eslint.vim @@ -0,0 +1,16 @@ +" Author: João Pesce +" Description: eslint for JSON files. +" +" Requires eslint-plugin-jsonc or a similar plugin to work +" +" Uses the same funtcions as ale_linters/javascript/eslint.vim by w0rp +" + +call ale#linter#Define('json', { +\ 'name': 'eslint', +\ 'output_stream': 'both', +\ 'executable': function('ale#handlers#eslint#GetExecutable'), +\ 'cwd': function('ale#handlers#eslint#GetCwd'), +\ 'command': function('ale#handlers#eslint#GetCommand'), +\ 'callback': 'ale#handlers#eslint#HandleJSON', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/json/jq.vim b/dot_vim/plugged/ale/ale_linters/json/jq.vim new file mode 100644 index 0000000..2f36a29 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/json/jq.vim @@ -0,0 +1,24 @@ +" Author: jD91mZM2 +call ale#Set('json_jq_executable', 'jq') +call ale#Set('json_jq_options', '') +call ale#Set('json_jq_filters', '.') + +" Matches patterns like the following: +" parse error: Expected another key-value pair at line 4, column 3 +let s:pattern = '^parse error: \(.\+\) at line \(\d\+\), column \(\d\+\)$' + +function! ale_linters#json#jq#Handle(buffer, lines) abort + return ale#util#MapMatches(a:lines, s:pattern, {match -> { + \ 'text': match[1], + \ 'lnum': match[2] + 0, + \ 'col': match[3] + 0, + \}}) +endfunction + +call ale#linter#Define('json', { +\ 'name': 'jq', +\ 'executable': {b -> ale#Var(b, 'json_jq_executable')}, +\ 'output_stream': 'stderr', +\ 'command': '%e', +\ 'callback': 'ale_linters#json#jq#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/json/jsonlint.vim b/dot_vim/plugged/ale/ale_linters/json/jsonlint.vim new file mode 100644 index 0000000..812540a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/json/jsonlint.vim @@ -0,0 +1,43 @@ +" Author: KabbAmine , David Sierra + +call ale#Set('json_jsonlint_executable', 'jsonlint') +call ale#Set('json_jsonlint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#json#jsonlint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'json_jsonlint', [ + \ 'node_modules/.bin/jsonlint', + \ 'node_modules/jsonlint/lib/cli.js', + \]) +endfunction + +function! ale_linters#json#jsonlint#GetCommand(buffer) abort + let l:executable = ale_linters#json#jsonlint#GetExecutable(a:buffer) + + return ale#node#Executable(a:buffer, l:executable) + \ . ' --compact -' +endfunction + +function! ale_linters#json#jsonlint#Handle(buffer, lines) abort + " Matches patterns like the following: + " line 2, col 15, found: 'STRING' - expected: 'EOF', '}', ',', ']'. + let l:pattern = '^line \(\d\+\), col \(\d*\), \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('json', { +\ 'name': 'jsonlint', +\ 'executable': function('ale_linters#json#jsonlint#GetExecutable'), +\ 'output_stream': 'stderr', +\ 'command': function('ale_linters#json#jsonlint#GetCommand'), +\ 'callback': 'ale_linters#json#jsonlint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/json/spectral.vim b/dot_vim/plugged/ale/ale_linters/json/spectral.vim new file mode 100644 index 0000000..14129c5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/json/spectral.vim @@ -0,0 +1,14 @@ +" Author: t2h5 +" Description: Integration of Stoplight Spectral CLI with ALE. + +call ale#Set('json_spectral_executable', 'spectral') +call ale#Set('json_spectral_use_global', get(g:, 'ale_use_global_executables', 0)) + +call ale#linter#Define('json', { +\ 'name': 'spectral', +\ 'executable': {b -> ale#path#FindExecutable(b, 'json_spectral', [ +\ 'node_modules/.bin/spectral', +\ ])}, +\ 'command': '%e lint --ignore-unknown-format -q -f text %t', +\ 'callback': 'ale#handlers#spectral#HandleSpectralOutput' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/json/vscodejson.vim b/dot_vim/plugged/ale/ale_linters/json/vscodejson.vim new file mode 100644 index 0000000..dcaee01 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/json/vscodejson.vim @@ -0,0 +1,16 @@ +" Author: Dalius Dobravolskas +" Description: VSCode json language server + +function! ale_linters#json#vscodejson#GetProjectRoot(buffer) abort + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +call ale#linter#Define('json', { +\ 'name': 'vscodejson', +\ 'lsp': 'stdio', +\ 'executable': 'vscode-json-language-server', +\ 'command': '%e --stdio', +\ 'project_root': function('ale_linters#json#vscodejson#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/json5/eslint.vim b/dot_vim/plugged/ale/ale_linters/json5/eslint.vim new file mode 100644 index 0000000..6207f2d --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/json5/eslint.vim @@ -0,0 +1,16 @@ +" Author: João Pesce +" Description: eslint for JSON5 files. +" +" Requires eslint-plugin-jsonc or a similar plugin to work +" +" Uses the same funtcions as ale_linters/javascript/eslint.vim by w0rp +" + +call ale#linter#Define('json5', { +\ 'name': 'eslint', +\ 'output_stream': 'both', +\ 'executable': function('ale#handlers#eslint#GetExecutable'), +\ 'cwd': function('ale#handlers#eslint#GetCwd'), +\ 'command': function('ale#handlers#eslint#GetCommand'), +\ 'callback': 'ale#handlers#eslint#HandleJSON', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/jsonc/eslint.vim b/dot_vim/plugged/ale/ale_linters/jsonc/eslint.vim new file mode 100644 index 0000000..1a5cc52 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/jsonc/eslint.vim @@ -0,0 +1,16 @@ +" Author: João Pesce +" Description: eslint for JSONC files. +" +" Requires eslint-plugin-jsonc or a similar plugin to work +" +" Uses the same funtcions as ale_linters/javascript/eslint.vim by w0rp +" + +call ale#linter#Define('jsonc', { +\ 'name': 'eslint', +\ 'output_stream': 'both', +\ 'executable': function('ale#handlers#eslint#GetExecutable'), +\ 'cwd': function('ale#handlers#eslint#GetCwd'), +\ 'command': function('ale#handlers#eslint#GetCommand'), +\ 'callback': 'ale#handlers#eslint#HandleJSON', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/jsonnet/jsonnet_lint.vim b/dot_vim/plugged/ale/ale_linters/jsonnet/jsonnet_lint.vim new file mode 100644 index 0000000..a5ebdc3 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/jsonnet/jsonnet_lint.vim @@ -0,0 +1,59 @@ +" Author: Trevor Whitney +" Description: jsonnet-lint for jsonnet files + +call ale#Set('jsonnet_jsonnet_lint_executable', 'jsonnet-lint') +call ale#Set('jsonnet_jsonnet_lint_options', '') + +function! ale_linters#jsonnet#jsonnet_lint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'jsonnet_jsonnet_lint_options') + + return '%e' + \ . ale#Pad(l:options) + \ . ' %t' +endfunction + + +function! ale_linters#jsonnet#jsonnet_lint#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " ERROR: foo.jsonnet:22:3-12 expected token OPERATOR but got (IDENTIFIER, "bar") + " ERROR: hoge.jsonnet:20:3 unexpected: "}" while parsing terminal + " ERROR: main.jsonnet:212:1-14 Expected , or ; but got (IDENTIFIER, "older_cluster") + let l:pattern = '^ERROR: [^:]*:\(\d\+\):\(\d\+\)\(-\d\+\)* \(.*\)' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + continue + endif + + let line_number = l:match[1] + 0 + let column = l:match[2] + 0 + " l:match[3] has optional -14, when linter is showing a range + let text = l:match[4] + + + " vcol is Needed to indicate that the column is a character. + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': line_number, + \ 'vcol': 0, + \ 'col': column, + \ 'text': text, + \ 'type': 'E', + \ 'nr': -1, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('jsonnet', { +\ 'name': 'jsonnet_lint', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'jsonnet_jsonnet_lint_executable')}, +\ 'command': function('ale_linters#jsonnet#jsonnet_lint#GetCommand'), +\ 'callback': 'ale_linters#jsonnet#jsonnet_lint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/jsonnet/jsonnetfmt.vim b/dot_vim/plugged/ale/ale_linters/jsonnet/jsonnetfmt.vim new file mode 100644 index 0000000..8904019 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/jsonnet/jsonnetfmt.vim @@ -0,0 +1,52 @@ +" Authors: Trevor Whitney and Takuya Kosugiyama +" Description: jsonnetfmt for jsonnet files + +call ale#Set('jsonnet_jsonnetfmt_executable', 'jsonnetfmt') +call ale#Set('jsonnet_jsonnetfmt_options', '') + +function! ale_linters#jsonnet#jsonnetfmt#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'jsonnet_jsonnetfmt_options') + + return '%e' + \ . ale#Pad(l:options) + \ . ' %t' +endfunction + + +function! ale_linters#jsonnet#jsonnetfmt#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " STATIC ERROR: foo.jsonnet:22:3-12: expected token OPERATOR but got (IDENTIFIER, "bar") + " STATIC ERROR: hoge.jsonnet:20:3: unexpected: "}" while parsing terminal + let l:pattern = '^STATIC ERROR:[^:]*:\(\d\+\):\(\d\+\):*\(-\d\+\)* \(.*\)' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + continue + endif + + " vcol is Needed to indicate that the column is a character. + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:match[1] + 0, + \ 'vcol': 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[4], + \ 'type': 'E', + \ 'nr': -1, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('jsonnet', { +\ 'name': 'jsonnetfmt', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'jsonnet_jsonnetfmt_executable')}, +\ 'command': function('ale_linters#jsonnet#jsonnetfmt#GetCommand'), +\ 'callback': 'ale_linters#jsonnet#jsonnetfmt#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/julia/languageserver.vim b/dot_vim/plugged/ale/ale_linters/julia/languageserver.vim new file mode 100644 index 0000000..999ad81 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/julia/languageserver.vim @@ -0,0 +1,21 @@ +" Author: Bartolomeo Stellato +" Description: A language server for Julia + +" Set julia executable variable +call ale#Set('julia_executable', 'julia') + +function! ale_linters#julia#languageserver#GetCommand(buffer) abort + let l:julia_executable = ale#Var(a:buffer, 'julia_executable') + let l:cmd_string = 'using LanguageServer; using Pkg; import StaticLint; import SymbolServer; server = LanguageServer.LanguageServerInstance(isdefined(Base, :stdin) ? stdin : STDIN, isdefined(Base, :stdout) ? stdout : STDOUT, dirname(Pkg.Types.Context().env.project_file)); server.runlinter = true; run(server);' + + return ale#Escape(l:julia_executable) . ' --project=@. --startup-file=no --history-file=no -e ' . ale#Escape(l:cmd_string) +endfunction + +call ale#linter#Define('julia', { +\ 'name': 'languageserver', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'julia_executable')}, +\ 'command': function('ale_linters#julia#languageserver#GetCommand'), +\ 'language': 'julia', +\ 'project_root': function('ale#julia#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/kotlin/kotlinc.vim b/dot_vim/plugged/ale/ale_linters/kotlin/kotlinc.vim new file mode 100644 index 0000000..e8bc924 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/kotlin/kotlinc.vim @@ -0,0 +1,177 @@ +" Author: Francis Agyapong +" Description: A linter for the Kotlin programming language that uses kotlinc + +let g:ale_kotlin_kotlinc_options = get(g:, 'ale_kotlin_kotlinc_options', '') +let g:ale_kotlin_kotlinc_enable_config = get(g:, 'ale_kotlin_kotlinc_enable_config', 0) +let g:ale_kotlin_kotlinc_config_file = get(g:, 'ale_kotlin_kotlinc_config_file', '.ale_kotlinc_config') +let g:ale_kotlin_kotlinc_classpath = get(g:, 'ale_kotlin_kotlinc_classpath', '') +let g:ale_kotlin_kotlinc_sourcepath = get(g:, 'ale_kotlin_kotlinc_sourcepath', '') +let g:ale_kotlin_kotlinc_use_module_file = get(g:, 'ale_kotlin_kotlinc_use_module_file', 0) +let g:ale_kotlin_kotlinc_module_filename = get(g:, 'ale_kotlin_kotlinc_module_filename', 'module.xml') + +let s:classpath_sep = has('unix') ? ':' : ';' + +function! ale_linters#kotlin#kotlinc#RunWithImportPaths(buffer) abort + let l:command = '' + + " exec maven/gradle only if classpath is not set + if !empty(ale#Var(a:buffer, 'kotlin_kotlinc_classpath')) + return ale_linters#kotlin#kotlinc#GetCommand(a:buffer, [], {}) + endif + + let [l:cwd, l:command] = ale#maven#BuildClasspathCommand(a:buffer) + + " Try to use Gradle if Maven isn't available. + if empty(l:command) + let [l:cwd, l:command] = ale#gradle#BuildClasspathCommand(a:buffer) + endif + + if empty(l:command) + return ale_linters#kotlin#kotlinc#GetCommand(a:buffer, [], {}) + endif + + return ale#command#Run( + \ a:buffer, + \ l:command, + \ function('ale_linters#kotlin#kotlinc#GetCommand'), + \ {'cwd': l:cwd}, + \) +endfunction + +function! s:BuildClassPathOption(buffer, import_paths) abort + " Filter out lines like [INFO], etc. + let l:class_paths = filter(a:import_paths[:], 'v:val !~# ''[''') + call extend( + \ l:class_paths, + \ split(ale#Var(a:buffer, 'kotlin_kotlinc_classpath'), s:classpath_sep), + \) + + return !empty(l:class_paths) + \ ? ' -cp ' . ale#Escape(join(l:class_paths, s:classpath_sep)) + \ : '' +endfunction + +function! ale_linters#kotlin#kotlinc#GetCommand(buffer, import_paths, meta) abort + let l:kotlinc_opts = ale#Var(a:buffer, 'kotlin_kotlinc_options') + let l:command = 'kotlinc ' + + " If the config file is enabled and readable, source it + if ale#Var(a:buffer, 'kotlin_kotlinc_enable_config') + let l:conf = expand(ale#Var(a:buffer, 'kotlin_kotlinc_config_file'), 1) + + if filereadable(l:conf) + execute 'source ' . fnameescape(l:conf) + endif + endif + + " If use module and module file is readable use that and return + if ale#Var(a:buffer, 'kotlin_kotlinc_use_module_file') + let l:module_filename = ale#Escape(expand(ale#Var(a:buffer, 'kotlin_kotlinc_module_filename'), 1)) + + if filereadable(l:module_filename) + let l:kotlinc_opts .= ' -module ' . l:module_filename + let l:command .= 'kotlinc ' . l:kotlinc_opts + + return l:command + endif + endif + + " We only get here if not using module or the module file not readable + if ale#Var(a:buffer, 'kotlin_kotlinc_classpath') isnot# '' + let l:kotlinc_opts .= ' -cp ' . ale#Var(a:buffer, 'kotlin_kotlinc_classpath') + else + " get classpath from maven/gradle + let l:kotlinc_opts .= s:BuildClassPathOption(a:buffer, a:import_paths) + endif + + let l:fname = '' + + if ale#Var(a:buffer, 'kotlin_kotlinc_sourcepath') isnot# '' + let l:fname .= expand(ale#Var(a:buffer, 'kotlin_kotlinc_sourcepath'), 1) . ' ' + else + " Find the src directory for files in this project. + let l:project_root = ale#gradle#FindProjectRoot(a:buffer) + + if !empty(l:project_root) + let l:src_dir = l:project_root + else + let l:src_dir = ale#path#FindNearestDirectory(a:buffer, 'src/main/java') + \ . ' ' . ale#path#FindNearestDirectory(a:buffer, 'src/main/kotlin') + endif + + let l:fname .= expand(l:src_dir, 1) . ' ' + endif + + let l:fname .= ale#Escape(expand('#' . a:buffer . ':p')) + let l:command .= l:kotlinc_opts . ' ' . l:fname + + return l:command +endfunction + +function! ale_linters#kotlin#kotlinc#Handle(buffer, lines) abort + let l:code_pattern = '^\(.*\):\([0-9]\+\):\([0-9]\+\):\s\+\(error\|warning\):\s\+\(.*\)' + let l:general_pattern = '^\(warning\|error\|info\):\s*\(.*\)' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:code_pattern) + + if len(l:match) == 0 + continue + endif + + let l:file = l:match[1] + let l:line = l:match[2] + 0 + let l:column = l:match[3] + 0 + let l:type = l:match[4] + let l:text = l:match[5] + + let l:buf_abspath = fnamemodify(l:file, ':p') + let l:curbuf_abspath = expand('#' . a:buffer . ':p') + + " Skip if file is not loaded + if l:buf_abspath isnot# l:curbuf_abspath + continue + endif + + let l:type_marker_str = l:type is# 'warning' ? 'W' : 'E' + + call add(l:output, { + \ 'lnum': l:line, + \ 'col': l:column, + \ 'text': l:text, + \ 'type': l:type_marker_str, + \}) + endfor + + " Non-code related messages + for l:line in a:lines + let l:match = matchlist(l:line, l:general_pattern) + + if len(l:match) == 0 + continue + endif + + let l:type = l:match[1] + let l:text = l:match[2] + + let l:type_marker_str = l:type is# 'warning' || l:type is# 'info' ? 'W' : 'E' + + call add(l:output, { + \ 'lnum': 1, + \ 'text': l:text, + \ 'type': l:type_marker_str, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('kotlin', { +\ 'name': 'kotlinc', +\ 'executable': 'kotlinc', +\ 'output_stream': 'stderr', +\ 'command': function('ale_linters#kotlin#kotlinc#RunWithImportPaths'), +\ 'callback': 'ale_linters#kotlin#kotlinc#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/kotlin/ktlint.vim b/dot_vim/plugged/ale/ale_linters/kotlin/ktlint.vim new file mode 100644 index 0000000..0bb64b1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/kotlin/ktlint.vim @@ -0,0 +1,10 @@ +" Author: Francis Agyapong +" Description: Lint kotlin files using ktlint + +call ale#linter#Define('kotlin', { +\ 'name': 'ktlint', +\ 'executable': 'ktlint', +\ 'command': function('ale#handlers#ktlint#GetCommand'), +\ 'callback': 'ale#handlers#ktlint#Handle', +\ 'output_stream': 'stderr' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/kotlin/languageserver.vim b/dot_vim/plugged/ale/ale_linters/kotlin/languageserver.vim new file mode 100644 index 0000000..af78c0e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/kotlin/languageserver.vim @@ -0,0 +1,29 @@ +" Author: MTDL9 +" Description: Support for the Kotlin language server https://github.com/fwcd/KotlinLanguageServer + +call ale#Set('kotlin_languageserver_executable', 'kotlin-language-server') + +function! ale_linters#kotlin#languageserver#GetProjectRoot(buffer) abort + let l:gradle_root = ale#gradle#FindProjectRoot(a:buffer) + + if !empty(l:gradle_root) + return l:gradle_root + endif + + let l:maven_pom_file = ale#path#FindNearestFile(a:buffer, 'pom.xml') + + if !empty(l:maven_pom_file) + return fnamemodify(l:maven_pom_file, ':h') + endif + + return '' +endfunction + +call ale#linter#Define('kotlin', { +\ 'name': 'languageserver', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'kotlin_languageserver_executable')}, +\ 'command': '%e', +\ 'language': 'kotlin', +\ 'project_root': function('ale_linters#kotlin#languageserver#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/less/lessc.vim b/dot_vim/plugged/ale/ale_linters/less/lessc.vim new file mode 100644 index 0000000..8e21f5b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/less/lessc.vim @@ -0,0 +1,47 @@ +" Author: zanona , w0rp +" Description: This file adds support for checking Less code with lessc. + +call ale#Set('less_lessc_executable', 'lessc') +call ale#Set('less_lessc_options', '') +call ale#Set('less_lessc_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#less#lessc#GetCommand(buffer) abort + return '%e --no-color --lint' + \ . ' --include-path=' . ale#Escape(expand('#' . a:buffer . ':p:h')) + \ . ale#Pad(ale#Var(a:buffer, 'less_lessc_options')) + \ . ' -' +endfunction + +function! ale_linters#less#lessc#Handle(buffer, lines) abort + let l:dir = expand('#' . a:buffer . ':p:h') + " Matches patterns like the following: + let l:pattern = '^\(\w\+\): \(.\{-}\) in \(.\{-}\) on line \(\d\+\), column \(\d\+\):$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': l:match[4] + 0, + \ 'col': l:match[5] + 0, + \ 'text': l:match[2], + \ 'type': 'E', + \} + + if l:match[3] isnot# '-' + let l:item.filename = ale#path#GetAbsPath(l:dir, l:match[3]) + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('less', { +\ 'name': 'lessc', +\ 'executable': {b -> ale#path#FindExecutable(b, 'less_lessc', [ +\ 'node_modules/.bin/lessc', +\ ])}, +\ 'command': function('ale_linters#less#lessc#GetCommand'), +\ 'callback': 'ale_linters#less#lessc#Handle', +\ 'output_stream': 'stderr', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/less/stylelint.vim b/dot_vim/plugged/ale/ale_linters/less/stylelint.vim new file mode 100644 index 0000000..83f784c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/less/stylelint.vim @@ -0,0 +1,20 @@ +" Author: diartyz , w0rp + +call ale#Set('less_stylelint_executable', 'stylelint') +call ale#Set('less_stylelint_options', '') +call ale#Set('less_stylelint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#less#stylelint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'less_stylelint_options') + + return '%e' . ale#Pad(l:options) . ' --stdin-filename %s' +endfunction + +call ale#linter#Define('less', { +\ 'name': 'stylelint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'less_stylelint', [ +\ 'node_modules/.bin/stylelint', +\ ])}, +\ 'command': function('ale_linters#less#stylelint#GetCommand'), +\ 'callback': 'ale#handlers#css#HandleStyleLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/llvm/llc.vim b/dot_vim/plugged/ale/ale_linters/llvm/llc.vim new file mode 100644 index 0000000..594be06 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/llvm/llc.vim @@ -0,0 +1,24 @@ +" Author: rhysd +" Description: Support for checking LLVM IR with llc + +call ale#Set('llvm_llc_executable', 'llc') + +function! ale_linters#llvm#llc#HandleErrors(buffer, lines) abort + " Handle '{path}: {file}:{line}:{col}: error: {message}' format + let l:pattern = '\v^[a-zA-Z]?:?[^:]+: [^:]+:(\d+):(\d+): (.+)$' + + return map(ale#util#GetMatches(a:lines, l:pattern), "{ + \ 'lnum': str2nr(v:val[1]), + \ 'col': str2nr(v:val[2]), + \ 'text': v:val[3], + \ 'type': 'E', + \}") +endfunction + +call ale#linter#Define('llvm', { +\ 'name': 'llc', +\ 'executable': {b -> ale#Var(b, 'llvm_llc_executable')}, +\ 'output_stream': 'stderr', +\ 'command': {-> '%e -filetype=null -o=' . g:ale#util#nul_file}, +\ 'callback': 'ale_linters#llvm#llc#HandleErrors', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/lua/cspell.vim b/dot_vim/plugged/ale/ale_linters/lua/cspell.vim new file mode 100644 index 0000000..215b82f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/lua/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Lua files. + +call ale#handlers#cspell#DefineLinter('lua') diff --git a/dot_vim/plugged/ale/ale_linters/lua/luac.vim b/dot_vim/plugged/ale/ale_linters/lua/luac.vim new file mode 100644 index 0000000..41674a4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/lua/luac.vim @@ -0,0 +1,31 @@ +" Author: Jon Xie https://github.com/xiejiangzhi +" Description: luac linter for lua files + +call ale#Set('lua_luac_executable', 'luac') + +function! ale_linters#lua#luac#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " luac: stdin:5: '=' expected near ')' + " luac: stdin:8: ')' expected (to close '(' at line 6) near '123' + let l:pattern = '\v^.*:(\d+): (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'type': 'E', + \ 'text': l:match[2], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('lua', { +\ 'name': 'luac', +\ 'executable': {b -> ale#Var(b, 'lua_luac_executable')}, +\ 'command': '%e -p -', +\ 'output_stream': 'stderr', +\ 'callback': 'ale_linters#lua#luac#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/lua/luacheck.vim b/dot_vim/plugged/ale/ale_linters/lua/luacheck.vim new file mode 100644 index 0000000..34be2b5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/lua/luacheck.vim @@ -0,0 +1,44 @@ +" Author: Sol Bekic https://github.com/s-ol +" Description: luacheck linter for lua files + +call ale#Set('lua_luacheck_executable', 'luacheck') +call ale#Set('lua_luacheck_options', '') + +function! ale_linters#lua#luacheck#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'lua_luacheck_options')) + \ . ' --formatter plain --codes --filename %s -' +endfunction + +function! ale_linters#lua#luacheck#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " artal.lua:159:17: (W111) shadowing definition of loop variable 'i' on line 106 + " artal.lua:182:7: (W213) unused loop variable 'i' + let l:pattern = '^.*:\(\d\+\):\(\d\+\): (\([WE]\)\(\d\+\)) \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + \ && l:match[3] is# 'W' + \ && index(range(611, 614), str2nr(l:match[4])) >= 0 + continue + endif + + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:match[3], + \ 'code': l:match[3] . l:match[4], + \ 'text': l:match[5], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('lua', { +\ 'name': 'luacheck', +\ 'executable': {b -> ale#Var(b, 'lua_luacheck_executable')}, +\ 'command': function('ale_linters#lua#luacheck#GetCommand'), +\ 'callback': 'ale_linters#lua#luacheck#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/lua/selene.vim b/dot_vim/plugged/ale/ale_linters/lua/selene.vim new file mode 100644 index 0000000..6b33cbf --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/lua/selene.vim @@ -0,0 +1,46 @@ +call ale#Set('lua_selene_executable', 'selene') +call ale#Set('lua_selene_options', '') + +function! ale_linters#lua#selene#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'lua_selene_options')) + \ . ' --display-style=json -' +endfunction + +function! ale_linters#lua#selene#Handle(buffer, lines) abort + let l:output = [] + + for l:line in a:lines + " as of version 0.17.0, selene has no way to suppress summary + " information when outputting json, so stop processing when we hit it + " (PR for this here: https://github.com/Kampfkarren/selene/pull/356) + if l:line is# 'Results:' + break + endif + + let l:json = json_decode(l:line) + let l:lint = { + \ 'lnum': l:json.primary_label.span.start_line + 1, + \ 'end_lnum': l:json.primary_label.span.end_line + 1, + \ 'col': l:json.primary_label.span.start_column + 1, + \ 'end_col': l:json.primary_label.span.end_column, + \ 'text': l:json.message, + \ 'code': l:json.code, + \ 'type': l:json.severity is# 'Warning' ? 'W' : 'E', + \} + + if has_key(l:json, 'notes') && len(l:json.notes) > 0 + let l:lint.detail = l:lint.text . "\n\n" . join(l:json.notes, "\n") + endif + + call add(l:output, l:lint) + endfor + + return l:output +endfunction + +call ale#linter#Define('lua', { +\ 'name': 'selene', +\ 'executable': {b -> ale#Var(b, 'lua_selene_executable')}, +\ 'command': function('ale_linters#lua#selene#GetCommand'), +\ 'callback': 'ale_linters#lua#selene#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/mail/alex.vim b/dot_vim/plugged/ale/ale_linters/mail/alex.vim new file mode 100644 index 0000000..0fceea7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/mail/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for mail files + +call ale#handlers#alex#DefineLinter('mail', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/mail/languagetool.vim b/dot_vim/plugged/ale/ale_linters/mail/languagetool.vim new file mode 100644 index 0000000..f68dab7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/mail/languagetool.vim @@ -0,0 +1,5 @@ +" Author: Vincent (wahrwolf [at] wolfpit.net) +" Description: languagetool for mails + + +call ale#handlers#languagetool#DefineLinter('mail') diff --git a/dot_vim/plugged/ale/ale_linters/mail/proselint.vim b/dot_vim/plugged/ale/ale_linters/mail/proselint.vim new file mode 100644 index 0000000..82c8d1f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/mail/proselint.vim @@ -0,0 +1,9 @@ +" Author: Daniel M. Capella https://github.com/polyzen +" Description: proselint for mail files + +call ale#linter#Define('mail', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/mail/vale.vim b/dot_vim/plugged/ale/ale_linters/mail/vale.vim new file mode 100644 index 0000000..e6dfd2e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/mail/vale.vim @@ -0,0 +1,9 @@ +" Author: chew-z https://github.com/chew-z +" Description: vale for Markdown files + +call ale#linter#Define('mail', { +\ 'name': 'vale', +\ 'executable': 'vale', +\ 'command': 'vale --output=JSON %t', +\ 'callback': 'ale#handlers#vale#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/make/checkmake.vim b/dot_vim/plugged/ale/ale_linters/make/checkmake.vim new file mode 100644 index 0000000..fed01b5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/make/checkmake.vim @@ -0,0 +1,37 @@ +" Author: aurieh - https://github.com/aurieh + +call ale#Set('make_checkmake_config', '') + +function! ale_linters#make#checkmake#Handle(buffer, lines) abort + let l:pattern = '\v^(\d+):(.+):(.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:match[1] + 0, + \ 'type': 'E', + \ 'code': l:match[2], + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +function! ale_linters#make#checkmake#GetCommand(buffer) abort + let l:config = ale#Var(a:buffer, 'make_checkmake_config') + let l:cmd = 'checkmake' + \ . ' --format="{{.LineNumber}}:{{.Rule}}:{{.Violation}}{{\"\r\n\"}}"' + \ . (!empty(l:config) ? ' --config="' . l:config . '"' : '') + \ . ' %s' + + return l:cmd +endfunction + +call ale#linter#Define('make', { +\ 'name': 'checkmake', +\ 'executable': 'checkmake', +\ 'command': function('ale_linters#make#checkmake#GetCommand'), +\ 'callback': 'ale_linters#make#checkmake#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/markdown/alex.vim b/dot_vim/plugged/ale/ale_linters/markdown/alex.vim new file mode 100644 index 0000000..63769b5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for markdown files + +call ale#handlers#alex#DefineLinter('markdown', '') diff --git a/dot_vim/plugged/ale/ale_linters/markdown/cspell.vim b/dot_vim/plugged/ale/ale_linters/markdown/cspell.vim new file mode 100644 index 0000000..45c586c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Markdown files. + +call ale#handlers#cspell#DefineLinter('markdown') diff --git a/dot_vim/plugged/ale/ale_linters/markdown/languagetool.vim b/dot_vim/plugged/ale/ale_linters/markdown/languagetool.vim new file mode 100644 index 0000000..422a38c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/languagetool.vim @@ -0,0 +1,5 @@ +" Author: Vincent (wahrwolf [at] wolfpit.net) +" Description: languagetool for markdown files + + +call ale#handlers#languagetool#DefineLinter('markdown') diff --git a/dot_vim/plugged/ale/ale_linters/markdown/markdownlint.vim b/dot_vim/plugged/ale/ale_linters/markdown/markdownlint.vim new file mode 100644 index 0000000..424c9f2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/markdownlint.vim @@ -0,0 +1,27 @@ +" Author: Ty-Lucas Kelley +" Description: Adds support for markdownlint + +call ale#Set('markdown_markdownlint_executable', 'markdownlint') +call ale#Set('markdown_markdownlint_options', '') + +function! ale_linters#markdown#markdownlint#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'markdown_markdownlint_executable') +endfunction + +function! ale_linters#markdown#markdownlint#GetCommand(buffer) abort + let l:executable = ale_linters#markdown#markdownlint#GetExecutable(a:buffer) + + let l:options = ale#Var(a:buffer, 'markdown_markdownlint_options') + + return ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') . ' %s' +endfunction + +call ale#linter#Define('markdown', { +\ 'name': 'markdownlint', +\ 'executable': function('ale_linters#markdown#markdownlint#GetExecutable'), +\ 'lint_file': 1, +\ 'output_stream': 'both', +\ 'command': function('ale_linters#markdown#markdownlint#GetCommand'), +\ 'callback': 'ale#handlers#markdownlint#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/markdown/mdl.vim b/dot_vim/plugged/ale/ale_linters/markdown/mdl.vim new file mode 100644 index 0000000..fd44de6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/mdl.vim @@ -0,0 +1,43 @@ +" Author: Steve Dignam , Josh Leeb-du Toit +" Description: Support for mdl, a markdown linter. + +call ale#Set('markdown_mdl_executable', 'mdl') +call ale#Set('markdown_mdl_options', '') + +function! ale_linters#markdown#mdl#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'markdown_mdl_executable') +endfunction + +function! ale_linters#markdown#mdl#GetCommand(buffer) abort + let l:executable = ale_linters#markdown#mdl#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'bundle$' + \ ? ' exec mdl' + \ : '' + + let l:options = ale#Var(a:buffer, 'markdown_mdl_options') + + return ale#Escape(l:executable) . l:exec_args + \ . ' -j' . (!empty(l:options) ? ' ' . l:options : '') +endfunction + +function! ale_linters#markdown#mdl#Handle(buffer, lines) abort + let l:output = [] + + for l:error in ale#util#FuzzyJSONDecode(a:lines, []) + call add(l:output, { + \ 'lnum': l:error['line'], + \ 'code': l:error['rule'] . '/' . join(l:error['aliases'], '/'), + \ 'text': l:error['description'], + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('markdown', { +\ 'name': 'mdl', +\ 'executable': function('ale_linters#markdown#mdl#GetExecutable'), +\ 'command': function('ale_linters#markdown#mdl#GetCommand'), +\ 'callback': 'ale_linters#markdown#mdl#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/markdown/proselint.vim b/dot_vim/plugged/ale/ale_linters/markdown/proselint.vim new file mode 100644 index 0000000..289d881 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/proselint.vim @@ -0,0 +1,9 @@ +" Author: poohzrn https://github.com/poohzrn +" Description: proselint for Markdown files + +call ale#linter#Define('markdown', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/markdown/redpen.vim b/dot_vim/plugged/ale/ale_linters/markdown/redpen.vim new file mode 100644 index 0000000..ff2cbaf --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/redpen.vim @@ -0,0 +1,9 @@ +" Author: rhysd https://rhysd.github.io +" Description: Redpen, a proofreading tool (http://redpen.cc) + +call ale#linter#Define('markdown', { +\ 'name': 'redpen', +\ 'executable': 'redpen', +\ 'command': 'redpen -f markdown -r json %t', +\ 'callback': 'ale#handlers#redpen#HandleRedpenOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/markdown/remark_lint.vim b/dot_vim/plugged/ale/ale_linters/markdown/remark_lint.vim new file mode 100644 index 0000000..6085e7e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/remark_lint.vim @@ -0,0 +1,48 @@ +scriptencoding utf-8 +" Author rhysd https://rhysd.github.io/, Dirk Roorda (dirkroorda), Adrián González Rus (@adrigzr) +" Description: remark-lint for Markdown files +call ale#Set('markdown_remark_lint_executable', 'remark') +call ale#Set('markdown_remark_lint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('markdown_remark_lint_options', '') + +function! ale_linters#markdown#remark_lint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'markdown_remark_lint_options') + + return '%e' . ale#Pad(l:options) . ' --no-stdout --no-color' +endfunction + +function! ale_linters#markdown#remark_lint#Handle(buffer, lines) abort + " matches: ' 1:4 warning Incorrect list-item indent: add 1 space list-item-indent remark-lint' + " matches: ' 18:71-19:1 error Missing new line after list item list-item-spacing remark-lint', + let l:pattern = '^ \+\(\d\+\):\(\d\+\)\(-\(\d\+\):\(\d\+\)\)\? \(warning\|error\) \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:match[6] is# 'error' ? 'E' : 'W', + \ 'text': l:match[7], + \} + + if l:match[3] isnot# '' + let l:item.end_lnum = l:match[4] + 0 + let l:item.end_col = l:match[5] + 0 + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('markdown', { +\ 'name': 'remark_lint', +\ 'aliases': ['remark-lint'], +\ 'executable': {b -> ale#path#FindExecutable(b, 'markdown_remark_lint', [ +\ 'node_modules/.bin/remark', +\ ])}, +\ 'command': function('ale_linters#markdown#remark_lint#GetCommand'), +\ 'callback': 'ale_linters#markdown#remark_lint#Handle', +\ 'output_stream': 'stderr', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/markdown/textlint.vim b/dot_vim/plugged/ale/ale_linters/markdown/textlint.vim new file mode 100644 index 0000000..613c841 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/textlint.vim @@ -0,0 +1,9 @@ +" Author: tokida https://rouger.info, Yasuhiro Kiyota +" Description: textlint, a proofreading tool (https://textlint.github.io/) + +call ale#linter#Define('markdown', { +\ 'name': 'textlint', +\ 'executable': function('ale#handlers#textlint#GetExecutable'), +\ 'command': function('ale#handlers#textlint#GetCommand'), +\ 'callback': 'ale#handlers#textlint#HandleTextlintOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/markdown/vale.vim b/dot_vim/plugged/ale/ale_linters/markdown/vale.vim new file mode 100644 index 0000000..06a6441 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/vale.vim @@ -0,0 +1,24 @@ +" Author: chew-z https://github.com/chew-z +" Description: vale for Markdown files + +call ale#Set('markdown_vale_executable', 'vale') +call ale#Set('markdown_vale_input_file', '%t') +call ale#Set('markdown_vale_options', '') + +function! ale_linters#markdown#vale#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'markdown_vale_executable') + let l:input_file = ale#Var(a:buffer, 'markdown_vale_input_file') + + " Defaults to `vale --output=JSON %t` + return ale#Escape(l:executable) + \ . ' --output=JSON ' + \ . ale#Var(a:buffer, 'markdown_vale_options') + \ . ' ' . l:input_file +endfunction + +call ale#linter#Define('markdown', { +\ 'name': 'vale', +\ 'executable': {b -> ale#Var(b, 'markdown_vale_executable')}, +\ 'command': function('ale_linters#markdown#vale#GetCommand'), +\ 'callback': 'ale#handlers#vale#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/markdown/writegood.vim b/dot_vim/plugged/ale/ale_linters/markdown/writegood.vim new file mode 100644 index 0000000..7108e7a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/markdown/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for Markdown files + +call ale#handlers#writegood#DefineLinter('markdown') diff --git a/dot_vim/plugged/ale/ale_linters/matlab/mlint.vim b/dot_vim/plugged/ale/ale_linters/matlab/mlint.vim new file mode 100644 index 0000000..e7daf37 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/matlab/mlint.vim @@ -0,0 +1,44 @@ +" Author: awlayton +" Description: mlint for MATLAB files + +call ale#Set('matlab_mlint_executable', 'mlint') + +function! ale_linters#matlab#mlint#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " L 27 (C 1): FNDEF: Terminate statement with semicolon to suppress output. + " L 30 (C 13-15): FNDEF: A quoted string is unterminated. + let l:pattern = '^L \(\d\+\) (C \([0-9-]\+\)): \([A-Z]\+\): \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:lnum = l:match[1] + 0 + let l:col = l:match[2] + 0 + let l:code = l:match[3] + let l:text = l:match[4] + + " Suppress erroneous warning about filename + " TODO: Enable this error when copying filename is supported + if l:code is# 'FNDEF' + continue + endif + + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:lnum, + \ 'col': l:col, + \ 'text': l:text, + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('matlab', { +\ 'name': 'mlint', +\ 'executable': {b -> ale#Var(b, 'matlab_mlint_executable')}, +\ 'command': '%e -id %t', +\ 'output_stream': 'stderr', +\ 'callback': 'ale_linters#matlab#mlint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/mercury/mmc.vim b/dot_vim/plugged/ale/ale_linters/mercury/mmc.vim new file mode 100644 index 0000000..85969e1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/mercury/mmc.vim @@ -0,0 +1,38 @@ +" Author: stewy33 +" Description: Lints mercury files using mmc + +call ale#Set('mercury_mmc_executable', 'mmc') +call ale#Set('mercury_mmc_options', '--make --output-compile-error-lines 100') + +function! ale_linters#mercury#mmc#GetCommand(buffer) abort + return '%e --errorcheck-only ' + \ . ale#Var(a:buffer, 'mercury_mmc_options') + \ . ' %s:t:r' +endfunction + +function! ale_linters#mercury#mmc#Handle(buffer, lines) abort + " output format + " :: : + let l:pattern = '\v^\w+\.m:(\d+):\s+([W|w]arning|.*[E|e]rror.*): (.*)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': substitute(l:match[1], '\v^0*', '', '') + 0, + \ 'type': l:match[2][0] =~? 'W' ? 'W' : 'E', + \ 'text': l:match[2] . ': ' . l:match[3] + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('mercury', { +\ 'name': 'mmc', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'mercury_mmc_executable')}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#mercury#mmc#GetCommand'), +\ 'callback': 'ale_linters#mercury#mmc#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/nasm/nasm.vim b/dot_vim/plugged/ale/ale_linters/nasm/nasm.vim new file mode 100644 index 0000000..c4f5362 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/nasm/nasm.vim @@ -0,0 +1,41 @@ +" Author: Oyvind Ingvaldsen +" Description: NASM linter for asmsyntax nasm. + +call ale#Set('nasm_nasm_executable', 'nasm') +call ale#Set('nasm_nasm_options', '') + +function! ale_linters#nasm#nasm#GetCommand(buffer) abort + " Note that NASM requires a trailing slash for the -I option. + let l:separator = has('win32') ? '\' : '/' + let l:output_null = has('win32') ? 'NUL' : '/dev/null' + + return '%e -X gnu -I %s:h' . l:separator + \ . ale#Pad(ale#Var(a:buffer, 'nasm_nasm_options')) + \ . ' %s' + \ . ' -o ' . l:output_null +endfunction + +function! ale_linters#nasm#nasm#Handle(buffer, lines) abort + " Note that we treat 'fatal' as errors. + let l:pattern = '^.\+:\(\d\+\): \([^:]\+\): \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'type': l:match[2] =~? 'error\|fatal' ? 'E' : 'W', + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('nasm', { +\ 'name': 'nasm', +\ 'output_stream': 'stderr', +\ 'lint_file': 1, +\ 'executable': {b -> ale#Var(b, 'nasm_nasm_executable')}, +\ 'command': function('ale_linters#nasm#nasm#GetCommand'), +\ 'callback': 'ale_linters#nasm#nasm#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/nim/nimcheck.vim b/dot_vim/plugged/ale/ale_linters/nim/nimcheck.vim new file mode 100644 index 0000000..b739ca0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/nim/nimcheck.vim @@ -0,0 +1,79 @@ +" Author: Baabelfish +" Description: Typechecking for nim files + +let s:end_col_patterns = [ +\ '\v''([^'']+)'' is declared but not used.*', +\ '\videntifier expected, but found ''([^'']+)''', +\ '\vimported and not used: ''([^'']+)''.*', +\ '\vundeclared identifier: ''([^'']+)''', +\ '\v''([^'']+)'' cannot be assigned to', +\ '\vredefinition of ''([^'']+)'';', +\] + +function! ale_linters#nim#nimcheck#Handle(buffer, lines) abort + let l:buffer_filename = fnamemodify(bufname(a:buffer), ':p:t') + let l:pattern = '^\(.\+\.nim\)(\(\d\+\), \(\d\+\)) \(.\+\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + " Only show errors of the current buffer + " NOTE: Checking filename only is OK because nim enforces unique + " module names. + let l:temp_buffer_filename = fnamemodify(l:match[1], ':p:t') + + if l:buffer_filename isnot# '' && l:temp_buffer_filename isnot# l:buffer_filename + continue + endif + + let l:item = { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[4], + \ 'type': 'W', + \} + + " Extract error type from message of type 'Error: Some error message' + let l:error_match = matchlist(l:item.text, '^\(.\{-}\): \(.\+\)$') + + if !empty(l:error_match) + if l:error_match[1] is# 'Error' + let l:item.type = 'E' + let l:item.text = l:error_match[2] + elseif l:error_match[1] is# 'Warning' + \|| l:error_match[1] is# 'Hint' + let l:item.text = l:error_match[2] + endif + endif + + let l:code_match = matchlist(l:item.text, '\v^(.+) \[([^ \[]+)\]$') + + if !empty(l:code_match) + let l:item.text = l:code_match[1] + let l:item.code = l:code_match[2] + endif + + " Find position end_col. + for l:col_match in ale#util#GetMatches(l:item.text, s:end_col_patterns) + let l:item.end_col = l:item.col + len(l:col_match[1]) - 1 + endfor + + call add(l:output, l:item) + endfor + + return l:output +endfunction + + +function! ale_linters#nim#nimcheck#GetCommand(buffer) abort + return 'nim check --verbosity:0 --colors:off --listFullPaths %s' +endfunction + + +call ale#linter#Define('nim', { +\ 'name': 'nimcheck', +\ 'executable': 'nim', +\ 'output_stream': 'both', +\ 'command': function('ale_linters#nim#nimcheck#GetCommand'), +\ 'callback': 'ale_linters#nim#nimcheck#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/nim/nimlsp.vim b/dot_vim/plugged/ale/ale_linters/nim/nimlsp.vim new file mode 100644 index 0000000..5d04104 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/nim/nimlsp.vim @@ -0,0 +1,33 @@ +" Author: jeremija +" Description: Support for nimlsp (language server for nim) + +call ale#Set('nim_nimlsp_nim_sources', '') + +function! ale_linters#nim#nimlsp#GetProjectRoot(buffer) abort + let l:project_root = ale#path#FindNearestDirectory(a:buffer, '.git') + + if !empty(l:project_root) + return fnamemodify(l:project_root, ':h:h') + endif + + return '' +endfunction + +function! ale_linters#nim#nimlsp#GetCommand(buffer) abort + let l:nim_sources = ale#Var(a:buffer, 'nim_nimlsp_nim_sources') + + if !empty(l:nim_sources) + let l:nim_sources = ale#Escape(l:nim_sources) + endif + + return '%e' . ale#Pad(l:nim_sources) +endfunction + +call ale#linter#Define('nim', { +\ 'name': 'nimlsp', +\ 'lsp': 'stdio', +\ 'executable': 'nimlsp', +\ 'command': function('ale_linters#nim#nimlsp#GetCommand'), +\ 'language': 'nim', +\ 'project_root': function('ale_linters#nim#nimlsp#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/nix/nix.vim b/dot_vim/plugged/ale/ale_linters/nix/nix.vim new file mode 100644 index 0000000..5d80f65 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/nix/nix.vim @@ -0,0 +1,63 @@ +" Author: Alistair Bill <@alibabzo> +" Author: Maximilian Bosch +" Description: nix-instantiate linter for nix files + +function! ale_linters#nix#nix#Command(buffer, output, meta) abort + let l:version = a:output[0][22:] + + if l:version =~# '^\(1\|2.[0-3]\.\).*' + return 'nix-instantiate --parse -' + else + return 'nix-instantiate --log-format internal-json --parse -' + endif +endfunction + +function! ale_linters#nix#nix#Handle(buffer, lines) abort + let l:output = [] + + if empty(a:lines) + return l:output + endif + + if a:lines[0] =~# '^@nix .*' + for l:line in a:lines + if l:line =~# '^@nix .*' + let l:result = json_decode(strpart(l:line, 4)) + + if has_key(l:result, 'column') + call add(l:output, { + \ 'type': 'E', + \ 'lnum': l:result.line, + \ 'col': l:result.column, + \ 'text': l:result.raw_msg + \}) + endif + endif + endfor + else + let l:pattern = '^\(.\+\): \(.\+\) at .*:\(\d\+\):\(\d\+\)$' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[3] + 0, + \ 'col': l:match[4] + 0, + \ 'text': l:match[1] . ': ' . substitute(l:match[2], ',$', '', ''), + \ 'type': l:match[1] =~# '^error' ? 'E' : 'W', + \}) + endfor + endif + + return l:output +endfunction + +call ale#linter#Define('nix', { +\ 'name': 'nix', +\ 'output_stream': 'stderr', +\ 'executable': 'nix-instantiate', +\ 'command': {buffer -> ale#command#Run( +\ buffer, +\ 'nix-instantiate --version', +\ function('ale_linters#nix#nix#Command') +\ )}, +\ 'callback': 'ale_linters#nix#nix#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/nix/rnix_lsp.vim b/dot_vim/plugged/ale/ale_linters/nix/rnix_lsp.vim new file mode 100644 index 0000000..949bed1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/nix/rnix_lsp.vim @@ -0,0 +1,16 @@ +" Author: jD91mZM2 +" Description: rnix-lsp language client + +function! ale_linters#nix#rnix_lsp#GetProjectRoot(buffer) abort + " rnix-lsp does not yet use the project root, so getting it right is not + " important + return fnamemodify(a:buffer, ':h') +endfunction + +call ale#linter#Define('nix', { +\ 'name': 'rnix_lsp', +\ 'lsp': 'stdio', +\ 'executable': 'rnix-lsp', +\ 'command': '%e', +\ 'project_root': function('ale_linters#nix#rnix_lsp#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/nix/statix.vim b/dot_vim/plugged/ale/ale_linters/nix/statix.vim new file mode 100644 index 0000000..a90a68a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/nix/statix.vim @@ -0,0 +1,18 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: statix analysis and suggestions for Nix files + +call ale#Set('nix_statix_check_executable', 'statix') +call ale#Set('nix_statix_check_options', '') + +function! ale_linters#nix#statix#GetCommand(buffer) abort + return '%e check -o errfmt --stdin' + \ . ale#Pad(ale#Var(a:buffer, 'nix_statix_check_options')) +endfunction + +call ale#linter#Define('nix', { +\ 'name': 'statix', +\ 'executable': {b -> ale#Var(b, 'nix_statix_check_executable')}, +\ 'command': function('ale_linters#nix#statix#GetCommand'), +\ 'callback': 'ale#handlers#statix#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/nroff/alex.vim b/dot_vim/plugged/ale/ale_linters/nroff/alex.vim new file mode 100644 index 0000000..3f06af2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/nroff/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for nroff files + +call ale#handlers#alex#DefineLinter('nroff', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/nroff/proselint.vim b/dot_vim/plugged/ale/ale_linters/nroff/proselint.vim new file mode 100644 index 0000000..a23e56b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/nroff/proselint.vim @@ -0,0 +1,9 @@ +" Author: Daniel M. Capella https://github.com/polyzen +" Description: proselint for nroff files + +call ale#linter#Define('nroff', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/nroff/writegood.vim b/dot_vim/plugged/ale/ale_linters/nroff/writegood.vim new file mode 100644 index 0000000..bcf344f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/nroff/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for nroff files + +call ale#handlers#writegood#DefineLinter('nroff') diff --git a/dot_vim/plugged/ale/ale_linters/objc/ccls.vim b/dot_vim/plugged/ale/ale_linters/objc/ccls.vim new file mode 100644 index 0000000..7aef532 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/objc/ccls.vim @@ -0,0 +1,15 @@ +" Author: Ye Jingchen , Ben Falconer , jtalowell +" Description: A language server for Objective-C + +call ale#Set('objc_ccls_executable', 'ccls') +call ale#Set('objc_ccls_init_options', {}) +call ale#Set('c_build_dir', '') + +call ale#linter#Define('objc', { +\ 'name': 'ccls', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'objc_ccls_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale#handlers#ccls#GetProjectRoot'), +\ 'initialization_options': {b -> ale#handlers#ccls#GetInitOpts(b, 'objc_ccls_init_options')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/objc/clang.vim b/dot_vim/plugged/ale/ale_linters/objc/clang.vim new file mode 100644 index 0000000..cafb97d --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/objc/clang.vim @@ -0,0 +1,23 @@ +" Author: Bang Lee +" Description: clang linter for objc files + +" Set this option to change the Clang options for warnings for ObjC. +if !exists('g:ale_objc_clang_options') + let g:ale_objc_clang_options = '-std=c11 -Wall' +endif + +function! ale_linters#objc#clang#GetCommand(buffer) abort + " -iquote with the directory the file is in makes #include work for + " headers in the same directory. + return 'clang -S -x objective-c -fsyntax-only ' + \ . '-iquote %s:h' + \ . ' ' . ale#Var(a:buffer, 'objc_clang_options') . ' -' +endfunction + +call ale#linter#Define('objc', { +\ 'name': 'clang', +\ 'output_stream': 'stderr', +\ 'executable': 'clang', +\ 'command': function('ale_linters#objc#clang#GetCommand'), +\ 'callback': 'ale#handlers#gcc#HandleGCCFormatWithIncludes', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/objc/clangd.vim b/dot_vim/plugged/ale/ale_linters/objc/clangd.vim new file mode 100644 index 0000000..318d85b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/objc/clangd.vim @@ -0,0 +1,17 @@ +" Author: Andrey Melentyev +" Description: Clangd language server + +call ale#Set('objc_clangd_executable', 'clangd') +call ale#Set('objc_clangd_options', '') + +function! ale_linters#objc#clangd#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'objc_clangd_options')) +endfunction + +call ale#linter#Define('objc', { +\ 'name': 'clangd', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'objc_clangd_executable')}, +\ 'command': function('ale_linters#objc#clangd#GetCommand'), +\ 'project_root': function('ale#c#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/objcpp/clang.vim b/dot_vim/plugged/ale/ale_linters/objcpp/clang.vim new file mode 100644 index 0000000..35a40c6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/objcpp/clang.vim @@ -0,0 +1,23 @@ +" Author: Bang Lee +" Description: clang linter for objcpp files + +" Set this option to change the Clang options for warnings for ObjCPP. +if !exists('g:ale_objcpp_clang_options') + let g:ale_objcpp_clang_options = '-std=c++14 -Wall' +endif + +function! ale_linters#objcpp#clang#GetCommand(buffer) abort + " -iquote with the directory the file is in makes #include work for + " headers in the same directory. + return 'clang++ -S -x objective-c++ -fsyntax-only ' + \ . '-iquote %s:h' + \ . ' ' . ale#Var(a:buffer, 'objcpp_clang_options') . ' -' +endfunction + +call ale#linter#Define('objcpp', { +\ 'name': 'clang', +\ 'output_stream': 'stderr', +\ 'executable': 'clang++', +\ 'command': function('ale_linters#objcpp#clang#GetCommand'), +\ 'callback': 'ale#handlers#gcc#HandleGCCFormatWithIncludes', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/objcpp/clangd.vim b/dot_vim/plugged/ale/ale_linters/objcpp/clangd.vim new file mode 100644 index 0000000..2945532 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/objcpp/clangd.vim @@ -0,0 +1,17 @@ +" Author: Andrey Melentyev +" Description: Clangd language server + +call ale#Set('objcpp_clangd_executable', 'clangd') +call ale#Set('objcpp_clangd_options', '') + +function! ale_linters#objcpp#clangd#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'objcpp_clangd_options')) +endfunction + +call ale#linter#Define('objcpp', { +\ 'name': 'clangd', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'objcpp_clangd_executable')}, +\ 'command': function('ale_linters#objcpp#clangd#GetCommand'), +\ 'project_root': function('ale#c#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ocaml/merlin.vim b/dot_vim/plugged/ale/ale_linters/ocaml/merlin.vim new file mode 100644 index 0000000..cfec996 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ocaml/merlin.vim @@ -0,0 +1,17 @@ +" Author: Andrey Popp -- @andreypopp +" Description: Report errors in OCaml code with Merlin + +if !exists('g:merlin') + finish +endif + +function! ale_linters#ocaml#merlin#Handle(buffer, lines) abort + return merlin#ErrorLocList() +endfunction + +call ale#linter#Define('ocaml', { +\ 'name': 'merlin', +\ 'executable': 'ocamlmerlin', +\ 'command': 'true', +\ 'callback': 'ale_linters#ocaml#merlin#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ocaml/ocamllsp.vim b/dot_vim/plugged/ale/ale_linters/ocaml/ocamllsp.vim new file mode 100644 index 0000000..4ff7419 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ocaml/ocamllsp.vim @@ -0,0 +1,13 @@ +" Author: Risto Stevcev +" Description: The official language server for OCaml + +call ale#Set('ocaml_ocamllsp_use_opam', 1) + +call ale#linter#Define('ocaml', { +\ 'name': 'ocamllsp', +\ 'lsp': 'stdio', +\ 'executable': function('ale#handlers#ocamllsp#GetExecutable'), +\ 'command': function('ale#handlers#ocamllsp#GetCommand'), +\ 'language': function('ale#handlers#ocamllsp#GetLanguage'), +\ 'project_root': function('ale#handlers#ocamllsp#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ocaml/ols.vim b/dot_vim/plugged/ale/ale_linters/ocaml/ols.vim new file mode 100644 index 0000000..ec71bdb --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ocaml/ols.vim @@ -0,0 +1,14 @@ +" Author: Michael Jungo +" Description: A language server for OCaml + +call ale#Set('ocaml_ols_executable', 'ocaml-language-server') +call ale#Set('ocaml_ols_use_global', get(g:, 'ale_use_global_executables', 0)) + +call ale#linter#Define('ocaml', { +\ 'name': 'ols', +\ 'lsp': 'stdio', +\ 'executable': function('ale#handlers#ols#GetExecutable'), +\ 'command': function('ale#handlers#ols#GetCommand'), +\ 'language': function('ale#handlers#ols#GetLanguage'), +\ 'project_root': function('ale#handlers#ols#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ocamlinterface/merlin.vim b/dot_vim/plugged/ale/ale_linters/ocamlinterface/merlin.vim new file mode 100644 index 0000000..799490f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ocamlinterface/merlin.vim @@ -0,0 +1,17 @@ +" Author: Andrey Popp -- @andreypopp +" Description: Report errors in OCaml code with Merlin + +if !exists('g:merlin') + finish +endif + +function! ale_linters#ocamlinterface#merlin#Handle(buffer, lines) abort + return merlin#ErrorLocList() +endfunction + +call ale#linter#Define('ocamlinterface', { +\ 'name': 'merlin', +\ 'executable': 'ocamlmerlin', +\ 'command': 'true', +\ 'callback': 'ale_linters#ocamlinterface#merlin#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ocamlinterface/ocamllsp.vim b/dot_vim/plugged/ale/ale_linters/ocamlinterface/ocamllsp.vim new file mode 100644 index 0000000..cd4bea8 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ocamlinterface/ocamllsp.vim @@ -0,0 +1,13 @@ +" Author: Risto Stevcev +" Description: The official language server for OCaml + +call ale#Set('ocaml_ocamllsp_use_opam', 1) + +call ale#linter#Define('ocamlinterface', { +\ 'name': 'ocamllsp', +\ 'lsp': 'stdio', +\ 'executable': function('ale#handlers#ocamllsp#GetExecutable'), +\ 'command': function('ale#handlers#ocamllsp#GetCommand'), +\ 'language': function('ale#handlers#ocamllsp#GetLanguage'), +\ 'project_root': function('ale#handlers#ocamllsp#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/openapi/ibm_validator.vim b/dot_vim/plugged/ale/ale_linters/openapi/ibm_validator.vim new file mode 100644 index 0000000..446931a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/openapi/ibm_validator.vim @@ -0,0 +1,58 @@ +" Author: Horacio Sanson + +call ale#Set('openapi_ibm_validator_executable', 'lint-openapi') +call ale#Set('openapi_ibm_validator_options', '') + +function! ale_linters#openapi#ibm_validator#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'openapi_ibm_validator_options')) + \ . ' %t' +endfunction + +function! ale_linters#openapi#ibm_validator#Handle(buffer, lines) abort + let l:output = [] + let l:type = 'E' + let l:message = '' + let l:nr = -1 + + for l:line in a:lines + let l:match = matchlist(l:line, '^errors$') + + if !empty(l:match) + let l:type = 'E' + endif + + let l:match = matchlist(l:line, '^warnings$') + + if !empty(l:match) + let l:type = 'W' + endif + + let l:match = matchlist(l:line, '^ *Message : *\(.\+\)$') + + if !empty(l:match) + let l:message = l:match[1] + endif + + let l:match = matchlist(l:line, '^ *Line *: *\(\d\+\)$') + + if !empty(l:match) + let l:nr = l:match[1] + + call add(l:output, { + \ 'lnum': l:nr + 0, + \ 'col': 0, + \ 'text': l:message, + \ 'type': l:type, + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('openapi', { +\ 'name': 'ibm_validator', +\ 'executable': {b -> ale#Var(b, 'openapi_ibm_validator_executable')}, +\ 'command': function('ale_linters#openapi#ibm_validator#GetCommand'), +\ 'callback': 'ale_linters#openapi#ibm_validator#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/openapi/yamllint.vim b/dot_vim/plugged/ale/ale_linters/openapi/yamllint.vim new file mode 100644 index 0000000..2b8952c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/openapi/yamllint.vim @@ -0,0 +1,9 @@ +call ale#Set('yaml_yamllint_executable', 'yamllint') +call ale#Set('yaml_yamllint_options', '') + +call ale#linter#Define('openapi', { +\ 'name': 'yamllint', +\ 'executable': {b -> ale#Var(b, 'yaml_yamllint_executable')}, +\ 'command': function('ale#handlers#yamllint#GetCommand'), +\ 'callback': 'ale#handlers#yamllint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/openscad/sca2d.vim b/dot_vim/plugged/ale/ale_linters/openscad/sca2d.vim new file mode 100644 index 0000000..60804a1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/openscad/sca2d.vim @@ -0,0 +1,24 @@ +" Description: SCA2D linter for OpenSCAD files + +call ale#Set('openscad_sca2d_executable', 'sca2d') +call ale#Set('openscad_sca2d_options', '') + +function! ale_linters#openscad#sca2d#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'openscad_sca2d_executable') +endfunction + +function! ale_linters#openscad#sca2d#GetCommand(buffer) abort + let l:executable = ale_linters#openscad#sca2d#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'openscad_sca2d_options') + + return ale#Escape(l:executable) . ale#Pad(l:options) . ' %s' +endfunction + +call ale#linter#Define('openscad', { +\ 'name': 'SCA2D', +\ 'aliases': ['sca2d'], +\ 'executable': function('ale_linters#openscad#sca2d#GetExecutable'), +\ 'command': function('ale_linters#openscad#sca2d#GetCommand'), +\ 'callback': 'ale#handlers#openscad#SCA2D_callback', +\ 'lint_file': 1, +\ }) diff --git a/dot_vim/plugged/ale/ale_linters/perl/perl.vim b/dot_vim/plugged/ale/ale_linters/perl/perl.vim new file mode 100644 index 0000000..0f06528 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/perl/perl.vim @@ -0,0 +1,64 @@ +" Author: Vincent Lequertier +" Description: This file adds support for checking perl syntax + +call ale#Set('perl_perl_executable', 'perl') +call ale#Set('perl_perl_options', '-c -Mwarnings -Ilib') + +function! ale_linters#perl#perl#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'perl_perl_options')) . ' %t' +endfunction + +let s:begin_failed_skip_pattern = '\v' . join([ +\ '^Compilation failed in require', +\ '^Can''t locate', +\], '|') + +function! ale_linters#perl#perl#Handle(buffer, lines) abort + if empty(a:lines) + return [] + endif + + let l:pattern = '\(..\{-}\) at \(..\{-}\) line \(\d\+\)' + let l:output = [] + let l:basename = expand('#' . a:buffer . ':t') + + let l:type = 'E' + + if a:lines[-1] =~# 'syntax OK' + let l:type = 'W' + endif + + let l:seen = {} + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:line = l:match[3] + let l:file = l:match[2] + let l:text = l:match[1] + + if ale#path#IsBufferPath(a:buffer, l:file) + \ && !has_key(l:seen,l:line) + \ && ( + \ l:text isnot# 'BEGIN failed--compilation aborted' + \ || empty(l:output) + \ || match(l:output[-1].text, s:begin_failed_skip_pattern) < 0 + \ ) + call add(l:output, { + \ 'lnum': l:line, + \ 'text': l:text, + \ 'type': l:type, + \}) + + let l:seen[l:line] = 1 + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('perl', { +\ 'name': 'perl', +\ 'executable': {b -> ale#Var(b, 'perl_perl_executable')}, +\ 'output_stream': 'both', +\ 'command': function('ale_linters#perl#perl#GetCommand'), +\ 'callback': 'ale_linters#perl#perl#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/perl/perlcritic.vim b/dot_vim/plugged/ale/ale_linters/perl/perlcritic.vim new file mode 100644 index 0000000..f3154c0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/perl/perlcritic.vim @@ -0,0 +1,61 @@ +" Author: Vincent Lequertier , Chris Weyl +" Description: This file adds support for checking perl with perl critic + +call ale#Set('perl_perlcritic_executable', 'perlcritic') +call ale#Set('perl_perlcritic_profile', '.perlcriticrc') +call ale#Set('perl_perlcritic_options', '') +call ale#Set('perl_perlcritic_showrules', 0) + +function! ale_linters#perl#perlcritic#GetProfile(buffer) abort + " first see if we've been overridden + let l:profile = ale#Var(a:buffer, 'perl_perlcritic_profile') + + if l:profile is? '' + return '' + endif + + " otherwise, iterate upwards to find it + return ale#path#FindNearestFile(a:buffer, l:profile) +endfunction + +function! ale_linters#perl#perlcritic#GetCommand(buffer) abort + let l:critic_verbosity = '%l:%c %m\n' + + if ale#Var(a:buffer, 'perl_perlcritic_showrules') + let l:critic_verbosity = '%l:%c %m [%p]\n' + endif + + let l:profile = ale_linters#perl#perlcritic#GetProfile(a:buffer) + let l:options = ale#Var(a:buffer, 'perl_perlcritic_options') + + return '%e' + \ . ' --verbose ' . ale#Escape(l:critic_verbosity) + \ . ' --nocolor' + \ . (!empty(l:profile) ? ' --profile ' . ale#Escape(l:profile) : '') + \ . ale#Pad(l:options) +endfunction + + +function! ale_linters#perl#perlcritic#Handle(buffer, lines) abort + let l:pattern = '\(\d\+\):\(\d\+\) \(.\+\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1], + \ 'col': l:match[2], + \ 'text': l:match[3], + \ 'type': 'W' + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('perl', { +\ 'name': 'perlcritic', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'perl_perlcritic_executable')}, +\ 'command': function('ale_linters#perl#perlcritic#GetCommand'), +\ 'callback': 'ale_linters#perl#perlcritic#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/perl6/perl6.vim b/dot_vim/plugged/ale/ale_linters/perl6/perl6.vim new file mode 100644 index 0000000..444ae4d --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/perl6/perl6.vim @@ -0,0 +1,166 @@ +" Author:Travis Gibson +" Description: This file adds support for checking perl6 syntax + +let g:ale_perl6_perl6_executable = +\ get(g:, 'ale_perl6_perl6_executable', 'perl6') + +let g:ale_perl6_perl6_options = +\ get(g:, 'ale_perl6_perl6_options', '-c -Ilib') + +let $PERL6_EXCEPTIONS_HANDLER = 'JSON' + +let $RAKUDO_ERROR_COLOR = 0 + +function! ale_linters#perl6#perl6#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'perl6_perl6_executable') +endfunction + +function! ale_linters#perl6#perl6#GetCommand(buffer) abort + return ale_linters#perl6#perl6#GetExecutable(a:buffer) + \ . ' ' . ale#Var(a:buffer, 'perl6_perl6_options') + \ . ' %t' +endfunction + +function! ale_linters#perl6#perl6#ExtractError(dict, item, type, buffer) abort + let l:file = '' + let l:line = 1 + let l:column = '' + let l:text = '' + let l:pre = '' + let l:counter = 2 + let l:end_line = '' + let l:linepatternmessage = 'at\s\+line\s\+\(\d\+\)' + + if has_key(a:dict[a:item], 'filename') && !empty(a:dict[a:item]['filename']) + let l:file = a:dict[a:item]['filename'] + endif + + if has_key(a:dict[a:item], 'line') && !empty(a:dict[a:item]['line']) + let l:line = a:dict[a:item]['line'] + let l:counter -= 1 + endif + + if has_key(a:dict[a:item], 'column') && !empty(a:dict[a:item]['column']) + let l:column = a:dict[a:item]['column'] + endif + + if has_key(a:dict[a:item], 'message') && !empty(a:dict[a:item]['message']) + let l:text = substitute(a:dict[a:item]['message'], '\s*\n\s*', ' ', 'g') + let l:counter -= 1 + endif + + if has_key(a:dict[a:item], 'line-real') && !empty(a:dict[a:item]['line-real']) + let l:end_line = l:line + let l:line = a:dict[a:item]['line-real'] + endif + + for l:match in ale#util#GetMatches(l:text, l:linepatternmessage) + let l:line = l:match[1] + let l:counter -= 1 + endfor + +" Currently, filenames and line numbers are not always given in the error output + if l:counter < 2 + \&& ( ale#path#IsBufferPath(a:buffer, l:file) || l:file is# '' ) + return { + \ 'lnum': '' . l:line, + \ 'text': l:text, + \ 'type': a:type, + \ 'col': l:column, + \ 'end_lnum': l:end_line, + \ 'code': a:item, + \} + endif + + return '' +endfunction + +function! ale_linters#perl6#perl6#Handle(buffer, lines) abort + let l:output = [] + + if empty(a:lines) + return l:output + endif + + if a:lines[0] is# 'Syntax OK' + return l:output + endif + + try + let l:json = json_decode(join(a:lines, '')) + catch /E474\|E491/ + call add(l:output, { + \ 'lnum': '1', + \ 'text': 'Received output in the default Perl6 error format. See :ALEDetail for details', + \ 'detail': join(a:lines, "\n"), + \ 'type': 'W', + \ }) + + return l:output + endtry + + if type(l:json) is v:t_dict + for l:key in keys(l:json) + if has_key(l:json[l:key], 'sorrows') + \&& has_key(l:json[l:key], 'worries') + if !empty(l:json[l:key]['sorrows']) + for l:dictionary in get(l:json[l:key], 'sorrows') + for l:item in keys(l:dictionary) + let l:result = + \ ale_linters#perl6#perl6#ExtractError( + \ l:dictionary, + \ l:item, + \ 'E', + \ a:buffer, + \ ) + + if l:result isnot# '' + call add(l:output, l:result) + endif + endfor + endfor + endif + + if !empty(l:json[l:key]['worries']) + for l:dictionary in get(l:json[l:key], 'worries') + for l:item in keys(l:dictionary) + let l:result = + \ ale_linters#perl6#perl6#ExtractError( + \ l:dictionary, + \ l:item, + \ 'W', + \ a:buffer, + \ ) + + if l:result isnot# '' + call add(l:output, l:result) + endif + endfor + endfor + endif + else + let l:result = ale_linters#perl6#perl6#ExtractError( + \ l:json, + \ l:key, + \ 'E', + \ a:buffer, + \ ) + + if l:result isnot# '' + call add(l:output, l:result) + endif + endif + endfor + endif + + return l:output +endfunction + +call ale#linter#Define('perl6', { +\ 'name': 'perl6', +\ 'executable': function('ale_linters#perl6#perl6#GetExecutable'), +\ 'output_stream': 'both', +\ 'command': function('ale_linters#perl6#perl6#GetCommand'), +\ 'callback': 'ale_linters#perl6#perl6#Handle', +\}) + diff --git a/dot_vim/plugged/ale/ale_linters/php/cspell.vim b/dot_vim/plugged/ale/ale_linters/php/cspell.vim new file mode 100644 index 0000000..574df57 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for PHP files. + +call ale#handlers#cspell#DefineLinter('php') diff --git a/dot_vim/plugged/ale/ale_linters/php/executable_intelephense.vim b/dot_vim/plugged/ale/ale_linters/php/executable_intelephense.vim new file mode 100644 index 0000000..0fdcc93 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/executable_intelephense.vim @@ -0,0 +1,32 @@ +" Author: Eric Stern , +" Arnold Chand +" Description: Intelephense language server integration for ALE + +call ale#Set('php_intelephense_executable', 'intelephense') +call ale#Set('php_intelephense_use_global', 1) +call ale#Set('php_intelephense_config', {}) + +function! ale_linters#php#intelephense#GetProjectRoot(buffer) abort + let l:composer_path = ale#path#FindNearestFile(a:buffer, 'composer.json') + + if (!empty(l:composer_path)) + return fnamemodify(l:composer_path, ':h') + endif + + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +function! ale_linters#php#intelephense#GetInitializationOptions(buffer) abort + return ale#Var(a:buffer, 'php_intelephense_config') +endfunction + +call ale#linter#Define('php', { +\ 'name': 'intelephense', +\ 'lsp': 'stdio', +\ 'initialization_options': function('ale_linters#php#intelephense#GetInitializationOptions'), +\ 'executable': {b -> ale#path#FindExecutable(b, 'php_intelephense', [])}, +\ 'command': '%e --stdio', +\ 'project_root': function('ale_linters#php#intelephense#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/php/langserver.vim b/dot_vim/plugged/ale/ale_linters/php/langserver.vim new file mode 100644 index 0000000..c3d89a0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/langserver.vim @@ -0,0 +1,27 @@ +" Author: Eric Stern +" Description: PHP Language server integration for ALE + +call ale#Set('php_langserver_executable', 'php-language-server.php') +call ale#Set('php_langserver_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#php#langserver#GetProjectRoot(buffer) abort + let l:composer_path = ale#path#FindNearestFile(a:buffer, 'composer.json') + + if (!empty(l:composer_path)) + return fnamemodify(l:composer_path, ':h') + endif + + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +call ale#linter#Define('php', { +\ 'name': 'langserver', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#path#FindExecutable(b, 'php_langserver', [ +\ 'vendor/bin/php-language-server.php', +\ ])}, +\ 'command': 'php %e', +\ 'project_root': function('ale_linters#php#langserver#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/php/phan.vim b/dot_vim/plugged/ale/ale_linters/php/phan.vim new file mode 100644 index 0000000..50c6d6e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/phan.vim @@ -0,0 +1,75 @@ +" Author: diegoholiveira , haginaga +" Description: static analyzer for PHP + +" Define the minimum severity +let g:ale_php_phan_minimum_severity = get(g:, 'ale_php_phan_minimum_severity', 0) + +let g:ale_php_phan_executable = get(g:, 'ale_php_phan_executable', 'phan') +let g:ale_php_phan_use_client = get(g:, 'ale_php_phan_use_client', 0) + +function! ale_linters#php#phan#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'php_phan_executable') + + if ale#Var(a:buffer, 'php_phan_use_client') == 1 && l:executable is# 'phan' + let l:executable = 'phan_client' + endif + + return l:executable +endfunction + +function! ale_linters#php#phan#GetCommand(buffer) abort + if ale#Var(a:buffer, 'php_phan_use_client') == 1 + let l:args = '-l ' + \ . ' %s' + else + let l:args = '-y ' + \ . ale#Var(a:buffer, 'php_phan_minimum_severity') + \ . ' %s' + endif + + let l:executable = ale_linters#php#phan#GetExecutable(a:buffer) + + return ale#Escape(l:executable) . ' ' . l:args +endfunction + +function! ale_linters#php#phan#Handle(buffer, lines) abort + " Matches against lines like the following: + if ale#Var(a:buffer, 'php_phan_use_client') == 1 + " Phan error: ERRORTYPE: message in /path/to/some-filename.php on line nnn + let l:pattern = '^Phan error: \(\w\+\): \(.\+\) in \(.\+\) on line \(\d\+\)$' + else + " /path/to/some-filename.php:18 ERRORTYPE message + let l:pattern = '^\(.*\):\(\d\+\)\s\(\w\+\)\s\(.\+\)$' + endif + + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if ale#Var(a:buffer, 'php_phan_use_client') == 1 + let l:dict = { + \ 'lnum': l:match[4] + 0, + \ 'text': l:match[2], + \ 'filename': l:match[3], + \ 'type': 'W', + \} + else + let l:dict = { + \ 'lnum': l:match[2] + 0, + \ 'text': l:match[4], + \ 'type': 'W', + \ 'filename': l:match[1], + \} + endif + + call add(l:output, l:dict) + endfor + + return l:output +endfunction + +call ale#linter#Define('php', { +\ 'name': 'phan', +\ 'executable': function('ale_linters#php#phan#GetExecutable'), +\ 'command': function('ale_linters#php#phan#GetCommand'), +\ 'callback': 'ale_linters#php#phan#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/php/php.vim b/dot_vim/plugged/ale/ale_linters/php/php.vim new file mode 100644 index 0000000..51a109b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/php.vim @@ -0,0 +1,39 @@ +" Author: Spencer Wood , Adriaan Zonnenberg +" Description: This file adds support for checking PHP with php-cli + +call ale#Set('php_php_executable', 'php') + +function! ale_linters#php#php#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " PHP 7.1<= - Parse error: syntax error, unexpected ';', expecting ']' in - on line 15 + " PHP 7.2>= - Parse error: syntax error, unexpected ';', expecting ']' in Standard input code on line 15 + let l:pattern = '\v^%(Fatal|Parse) error:\s+(.+unexpected ''(.+)%(expecting.+)@ ale#Var(b, 'php_php_executable')}, +\ 'output_stream': 'stdout', +\ 'command': '%e -l -d error_reporting=E_ALL -d display_errors=1 -d log_errors=0 --', +\ 'callback': 'ale_linters#php#php#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/php/phpactor.vim b/dot_vim/plugged/ale/ale_linters/php/phpactor.vim new file mode 100644 index 0000000..b137eaf --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/phpactor.vim @@ -0,0 +1,23 @@ +" Author: Arizard +" Description: PHPactor integration for ALE + +" Copied from langserver.vim +function! ale_linters#php#phpactor#GetProjectRoot(buffer) abort + let l:composer_path = ale#path#FindNearestFile(a:buffer, 'composer.json') + + if (!empty(l:composer_path)) + return fnamemodify(l:composer_path, ':h') + endif + + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +call ale#linter#Define('php', { +\ 'name': 'phpactor', +\ 'lsp': 'stdio', +\ 'executable': 'phpactor', +\ 'command': '%e language-server', +\ 'project_root': function('ale_linters#php#phpactor#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/php/phpcs.vim b/dot_vim/plugged/ale/ale_linters/php/phpcs.vim new file mode 100644 index 0000000..ce47a13 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/phpcs.vim @@ -0,0 +1,54 @@ +" Author: jwilliams108 , Eric Stern +" Description: phpcs for PHP files + +let g:ale_php_phpcs_standard = get(g:, 'ale_php_phpcs_standard', '') + +call ale#Set('php_phpcs_options', '') +call ale#Set('php_phpcs_executable', 'phpcs') +call ale#Set('php_phpcs_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#php#phpcs#GetCommand(buffer) abort + let l:standard = ale#Var(a:buffer, 'php_phpcs_standard') + let l:standard_option = !empty(l:standard) + \ ? '--standard=' . ale#Escape(l:standard) + \ : '' + + return '%e -s --report=emacs --stdin-path=%s' + \ . ale#Pad(l:standard_option) + \ . ale#Pad(ale#Var(a:buffer, 'php_phpcs_options')) +endfunction + +function! ale_linters#php#phpcs#Handle(buffer, lines) abort + " Matches against lines like the following: + " + " /path/to/some-filename.php:18:3: error - Line indented incorrectly; expected 4 spaces, found 2 (Generic.WhiteSpace.ScopeIndent.IncorrectExact) + let l:pattern = '^.*:\(\d\+\):\(\d\+\): \(.\+\) - \(.\+\) (\(.\+\)).*$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:code = l:match[5] + let l:text = l:match[4] . ' (' . l:code . ')' + let l:type = l:match[3] + + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:text, + \ 'type': l:type is# 'error' ? 'E' : 'W', + \ 'sub_type': 'style', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('php', { +\ 'name': 'phpcs', +\ 'executable': {b -> ale#path#FindExecutable(b, 'php_phpcs', [ +\ 'vendor/bin/phpcs', +\ 'phpcs' +\ ])}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#php#phpcs#GetCommand'), +\ 'callback': 'ale_linters#php#phpcs#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/php/phpmd.vim b/dot_vim/plugged/ale/ale_linters/php/phpmd.vim new file mode 100644 index 0000000..9b1d1e4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/phpmd.vim @@ -0,0 +1,38 @@ +" Author: medains , David Sierra +" Description: phpmd for PHP files + +let g:ale_php_phpmd_executable = get(g:, 'ale_php_phpmd_executable', 'phpmd') + +" Set to change the ruleset +let g:ale_php_phpmd_ruleset = get(g:, 'ale_php_phpmd_ruleset', 'cleancode,codesize,controversial,design,naming,unusedcode') + +function! ale_linters#php#phpmd#GetCommand(buffer) abort + return '%e %s text' + \ . ale#Pad(ale#Var(a:buffer, 'php_phpmd_ruleset')) + \ . ' --ignore-violations-on-exit %t' +endfunction + +function! ale_linters#php#phpmd#Handle(buffer, lines) abort + " Matches against lines like the following: + " + " /path/to/some-filename.php:18 message + let l:pattern = '^.*:\(\d\+\)\s\+\(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'text': l:match[2], + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('php', { +\ 'name': 'phpmd', +\ 'executable': {b -> ale#Var(b, 'php_phpmd_executable')}, +\ 'command': function('ale_linters#php#phpmd#GetCommand'), +\ 'callback': 'ale_linters#php#phpmd#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/php/phpstan.vim b/dot_vim/plugged/ale/ale_linters/php/phpstan.vim new file mode 100644 index 0000000..4dce5d5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/phpstan.vim @@ -0,0 +1,89 @@ +" Author: medains , ardis , Arizard +" Description: phpstan for PHP files + +" Set to change the ruleset +let g:ale_php_phpstan_executable = get(g:, 'ale_php_phpstan_executable', 'phpstan') +let g:ale_php_phpstan_level = get(g:, 'ale_php_phpstan_level', '') +let g:ale_php_phpstan_configuration = get(g:, 'ale_php_phpstan_configuration', '') +let g:ale_php_phpstan_autoload = get(g:, 'ale_php_phpstan_autoload', '') +let g:ale_php_phpstan_memory_limit = get(g:, 'ale_php_phpstan_memory_limit', '') +call ale#Set('php_phpstan_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#php#phpstan#GetCommand(buffer, version) abort + let l:configuration = ale#Var(a:buffer, 'php_phpstan_configuration') + let l:configuration_option = !empty(l:configuration) + \ ? ' -c ' . ale#Escape(l:configuration) + \ : '' + + let l:autoload = ale#Var(a:buffer, 'php_phpstan_autoload') + let l:autoload_option = !empty(l:autoload) + \ ? ' -a ' . ale#Escape(l:autoload) + \ : '' + + let l:memory_limit = ale#Var(a:buffer, 'php_phpstan_memory_limit') + let l:memory_limit_option = !empty(l:memory_limit) + \ ? ' --memory-limit ' . ale#Escape(l:memory_limit) + \ : '' + + let l:level = ale#Var(a:buffer, 'php_phpstan_level') + let l:config_file_exists = ale#path#FindNearestFile(a:buffer, 'phpstan.neon') + let l:dist_config_file_exists = ale#path#FindNearestFile(a:buffer, 'phpstan.neon.dist') + + if empty(l:level) && empty(l:config_file_exists) && empty(l:dist_config_file_exists) + " if no configuration file is found, then use 4 as a default level + let l:level = '4' + endif + + let l:level_option = !empty(l:level) + \ ? ' -l ' . ale#Escape(l:level) + \ : '' + + let l:error_format = ale#semver#GTE(a:version, [0, 10, 3]) + \ ? ' --error-format json' + \ : ' --errorFormat json' + + return '%e analyze --no-progress' + \ . l:error_format + \ . l:configuration_option + \ . l:autoload_option + \ . l:level_option + \ . l:memory_limit_option + \ . ' %s' +endfunction + +function! ale_linters#php#phpstan#Handle(buffer, lines) abort + let l:res = ale#util#FuzzyJSONDecode(a:lines, {'files': []}) + let l:output = [] + + if type(l:res.files) is v:t_list + return l:output + endif + + for l:err in l:res.files[expand('#' . a:buffer .':p')].messages + call add(l:output, { + \ 'lnum': l:err.line, + \ 'text': l:err.message, + \ 'type': 'E', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('php', { +\ 'name': 'phpstan', +\ 'executable': {buffer -> ale#path#FindExecutable(buffer, 'php_phpstan', [ +\ 'vendor/bin/phpstan', +\ 'phpstan' +\ ])}, +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale#path#FindExecutable(buffer, 'php_phpstan', [ +\ 'vendor/bin/phpstan', +\ 'phpstan' +\ ]), +\ '%e --version', +\ function('ale_linters#php#phpstan#GetCommand'), +\ )}, +\ 'callback': 'ale_linters#php#phpstan#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/php/psalm.vim b/dot_vim/plugged/ale/ale_linters/php/psalm.vim new file mode 100644 index 0000000..f128005 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/psalm.vim @@ -0,0 +1,32 @@ +" Author: Matt Brown +" Description: plugin for Psalm, static analyzer for PHP + +call ale#Set('php_psalm_executable', 'psalm') +call ale#Set('php_psalm_options', '') +call ale#Set('php_psalm_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#php#psalm#GetProjectRoot(buffer) abort + let l:composer_path = ale#path#FindNearestFile(a:buffer, 'composer.json') + + if (!empty(l:composer_path)) + return fnamemodify(l:composer_path, ':h') + endif + + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +function! ale_linters#php#psalm#GetCommand(buffer) abort + return '%e --language-server' . ale#Pad(ale#Var(a:buffer, 'php_psalm_options')) +endfunction + +call ale#linter#Define('php', { +\ 'name': 'psalm', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#path#FindExecutable(b, 'php_psalm', [ +\ 'vendor/bin/psalm', +\ ])}, +\ 'command': function('ale_linters#php#psalm#GetCommand'), +\ 'project_root': function('ale_linters#php#psalm#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/php/tlint.vim b/dot_vim/plugged/ale/ale_linters/php/tlint.vim new file mode 100644 index 0000000..80bdd1f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/php/tlint.vim @@ -0,0 +1,80 @@ +" Author: Jose Soto +" +" Description: Tighten Opinionated PHP Linting +" Website: https://github.com/tightenco/tlint + +call ale#Set('php_tlint_executable', 'tlint') +call ale#Set('php_tlint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('php_tlint_options', '') + +function! ale_linters#php#tlint#GetProjectRoot(buffer) abort + let l:composer_path = ale#path#FindNearestFile(a:buffer, 'composer.json') + + if !empty(l:composer_path) + return fnamemodify(l:composer_path, ':h') + endif + + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +function! ale_linters#php#tlint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'php_tlint', [ + \ 'vendor/bin/tlint', + \ 'tlint', + \]) +endfunction + +function! ale_linters#php#tlint#GetCommand(buffer) abort + let l:executable = ale_linters#php#tlint#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'php_tlint_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' lint %s' +endfunction + +function! ale_linters#php#tlint#Handle(buffer, lines) abort + " Matches against lines like the following: + " + " ! There should be 1 space around `.` concatenations, and additional lines should always start with a `.` + " 22 : ` $something = 'a'.'name';` + " + let l:loop_count = 0 + let l:messages_pattern = '^\! \(.*\)' + let l:output = [] + let l:pattern = '^\(\d\+\) \:' + let l:temp_messages = [] + + for l:message in ale#util#GetMatches(a:lines, l:messages_pattern) + call add(l:temp_messages, l:message) + endfor + + let l:loop_count = 0 + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:num = l:match[1] + let l:text = l:temp_messages[l:loop_count] + + call add(l:output, { + \ 'lnum': l:num, + \ 'col': 0, + \ 'text': l:text, + \ 'type': 'W', + \ 'sub_type': 'style', + \}) + + let l:loop_count += 1 + endfor + + return l:output +endfunction + +call ale#linter#Define('php', { +\ 'name': 'tlint', +\ 'executable': function('ale_linters#php#tlint#GetExecutable'), +\ 'command': function('ale_linters#php#tlint#GetCommand'), +\ 'callback': 'ale_linters#php#tlint#Handle', +\ 'project_root': function('ale_linters#php#tlint#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/po/alex.vim b/dot_vim/plugged/ale/ale_linters/po/alex.vim new file mode 100644 index 0000000..05c67f1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/po/alex.vim @@ -0,0 +1,4 @@ +" Author: Cian Butler https://github.com/butlerx +" Description: alex for PO files + +call ale#handlers#alex#DefineLinter('po', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/po/msgfmt.vim b/dot_vim/plugged/ale/ale_linters/po/msgfmt.vim new file mode 100644 index 0000000..8279ccd --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/po/msgfmt.vim @@ -0,0 +1,30 @@ +" Author: Cian Butler https://github.com/butlerx +" Description: msgfmt for PO files + +function! ale_linters#po#msgfmt#Handle(buffer, lines) abort + let l:results = ale#handlers#unix#HandleAsWarning(a:buffer, a:lines) + let l:index = 0 + + for l:item in l:results + if l:index > 0 && l:item.text =~? 'this is the location of the first definition' + let l:last_item = l:results[l:index - 1] + + if l:last_item.text =~? 'duplicate message definition' + let l:last_item.text = 'duplicate of message at line ' . l:item.lnum + let l:item.text = 'first location of duplicate of message at line ' . l:last_item.lnum + endif + endif + + let l:index += 1 + endfor + + return l:results +endfunction + +call ale#linter#Define('po', { +\ 'name': 'msgfmt', +\ 'executable': 'msgfmt', +\ 'output_stream': 'stderr', +\ 'command': 'msgfmt --statistics --output-file=- %t', +\ 'callback': 'ale_linters#po#msgfmt#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/po/proselint.vim b/dot_vim/plugged/ale/ale_linters/po/proselint.vim new file mode 100644 index 0000000..ce13250 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/po/proselint.vim @@ -0,0 +1,9 @@ +" Author: Cian Butler https://github.com/butlerx +" Description: proselint for PO files + +call ale#linter#Define('po', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/po/writegood.vim b/dot_vim/plugged/ale/ale_linters/po/writegood.vim new file mode 100644 index 0000000..1468647 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/po/writegood.vim @@ -0,0 +1,4 @@ +" Author: Cian Butler https://github.com/butlerx +" Description: write-good for PO files + +call ale#handlers#writegood#DefineLinter('po') diff --git a/dot_vim/plugged/ale/ale_linters/pod/alex.vim b/dot_vim/plugged/ale/ale_linters/pod/alex.vim new file mode 100644 index 0000000..c89f833 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/pod/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for pod files + +call ale#handlers#alex#DefineLinter('pod', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/pod/proselint.vim b/dot_vim/plugged/ale/ale_linters/pod/proselint.vim new file mode 100644 index 0000000..2eb83f5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/pod/proselint.vim @@ -0,0 +1,9 @@ +" Author: Daniel M. Capella https://github.com/polyzen +" Description: proselint for Pod files + +call ale#linter#Define('pod', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/pod/writegood.vim b/dot_vim/plugged/ale/ale_linters/pod/writegood.vim new file mode 100644 index 0000000..9f5461e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/pod/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for Pod files + +call ale#handlers#writegood#DefineLinter('pod') diff --git a/dot_vim/plugged/ale/ale_linters/pony/ponyc.vim b/dot_vim/plugged/ale/ale_linters/pony/ponyc.vim new file mode 100644 index 0000000..6d4594f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/pony/ponyc.vim @@ -0,0 +1,16 @@ +" Description: ponyc linter for pony files + +call ale#Set('pony_ponyc_executable', 'ponyc') +call ale#Set('pony_ponyc_options', '--pass paint') + +function! ale_linters#pony#ponyc#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'pony_ponyc_options')) +endfunction + +call ale#linter#Define('pony', { +\ 'name': 'ponyc', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'pony_ponyc_executable')}, +\ 'command': function('ale_linters#pony#ponyc#GetCommand'), +\ 'callback': 'ale#handlers#pony#HandlePonycFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/powershell/cspell.vim b/dot_vim/plugged/ale/ale_linters/powershell/cspell.vim new file mode 100644 index 0000000..4a66dba --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/powershell/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for PowerShell files. + +call ale#handlers#cspell#DefineLinter('powershell') diff --git a/dot_vim/plugged/ale/ale_linters/powershell/powershell.vim b/dot_vim/plugged/ale/ale_linters/powershell/powershell.vim new file mode 100644 index 0000000..5f49f72 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/powershell/powershell.vim @@ -0,0 +1,100 @@ +" Author: Jesse Harris - https://github.com/zigford +" Description: This file adds support for powershell scripts synatax errors + +call ale#Set('powershell_powershell_executable', 'pwsh') + +function! ale_linters#powershell#powershell#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'powershell_powershell_executable') +endfunction + +" Some powershell magic to show syntax errors without executing the script +" thanks to keith hill: +" https://rkeithhill.wordpress.com/2007/10/30/powershell-quicktip-preparsing-scripts-to-check-for-syntax-errors/ +function! ale_linters#powershell#powershell#GetCommand(buffer) abort + let l:script = ['Param($Script); + \ $ErrorView = "Normal"; + \ trap {$_;continue} & { + \ $Contents = Get-Content -Path $Script; + \ $Contents = [string]::Join([Environment]::NewLine, $Contents); + \ [void]$ExecutionContext.InvokeCommand.NewScriptBlock($Contents); + \ };'] + + return ale#powershell#RunPowerShell( + \ a:buffer, 'powershell_powershell', l:script) +endfunction + +" Parse powershell error output using regex into a list of dicts +function! ale_linters#powershell#powershell#Handle(buffer, lines) abort + let l:output = [] + " Our 3 patterns we need to scrape the data for the dicts + let l:patterns = [ + \ '\v^At line:(\d+) char:(\d+)', + \ '\v^(At|\+| )@!.*', + \ '\vFullyQualifiedErrorId : (\w+)', + \] + + let l:matchcount = 0 + + for l:match in ale#util#GetMatches(a:lines, l:patterns) + " We want to work with 3 matches per syntax error + let l:matchcount = l:matchcount + 1 + + if l:matchcount == 1 || str2nr(l:match[1]) + " First match consists of 2 capture groups, and + " can capture the line and col + if exists('l:item') + " We may be here because the last syntax + " didn't emit a code, and so only had 2 + " matches + call add(l:output, l:item) + let l:matchcount = 1 + endif + + " If the match is 0, it was a failed match + " probably due to an unexpected token which + " contained a newline. Reset matchcount. to + " continue to the next match + if !empty(l:match[1]) + let l:item = { + \ 'lnum': str2nr(l:match[1]), + \ 'col': str2nr(l:match[2]), + \ 'type': 'E', + \} + else + let l:matchcount = 0 + endif + elseif l:matchcount == 2 + " Second match[0] grabs the full line in order + " to handles the text + let l:item['text'] = l:match[0] + else + " Final match handles the code, however + " powershell only emits 1 code for all errors + " so, we get the final code on the last error + " and loop over the previously added items to + " append the code we now know + call add(l:output, l:item) + unlet l:item + + if len(l:match[1]) > 0 + for l:i in l:output + let l:i['code'] = l:match[1] + endfor + endif + + " Reset the matchcount so we can begin gathering + " matches for the next syntax error + let l:matchcount = 0 + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('powershell', { +\ 'name': 'powershell', +\ 'executable': function('ale_linters#powershell#powershell#GetExecutable'), +\ 'command': function('ale_linters#powershell#powershell#GetCommand'), +\ 'output_stream': 'stdout', +\ 'callback': 'ale_linters#powershell#powershell#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/powershell/psscriptanalyzer.vim b/dot_vim/plugged/ale/ale_linters/powershell/psscriptanalyzer.vim new file mode 100644 index 0000000..8a8b4b4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/powershell/psscriptanalyzer.vim @@ -0,0 +1,76 @@ +" Author: Jesse Harris - https://github.com/zigford +" Description: This file adds support for lintng powershell scripts +" using the PSScriptAnalyzer module. + +" let g:ale_powershell_psscriptanalyzer_exclusions = +" \ 'PSAvoidUsingWriteHost,PSAvoidGlobalVars' +call ale#Set('powershell_psscriptanalyzer_exclusions', '') +call ale#Set('powershell_psscriptanalyzer_executable', 'pwsh') +call ale#Set('powershell_psscriptanalyzer_module', +\ 'psscriptanalyzer') + +function! ale_linters#powershell#psscriptanalyzer#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'powershell_psscriptanalyzer_executable') +endfunction + +" Run Invoke-ScriptAnalyzer and output each linting message as 4 separate lines +" for each parsing +function! ale_linters#powershell#psscriptanalyzer#GetCommand(buffer) abort + let l:exclude_option = ale#Var( + \ a:buffer, 'powershell_psscriptanalyzer_exclusions') + let l:module = ale#Var( + \ a:buffer, 'powershell_psscriptanalyzer_module') + let l:script = ['Param($Script); + \ Invoke-ScriptAnalyzer "$Script" ' + \ . (!empty(l:exclude_option) ? '-Exclude ' . l:exclude_option : '') + \ . '| ForEach-Object { + \ $_.Line; + \ $_.Severity; + \ $_.Message; + \ $_.RuleName}'] + + return ale#powershell#RunPowerShell( + \ a:buffer, + \ 'powershell_psscriptanalyzer', + \ l:script) +endfunction + +" add every 4 lines to an item(Dict) and every item to a list +" return the list +function! ale_linters#powershell#psscriptanalyzer#Handle(buffer, lines) abort + let l:output = [] + let l:lcount = 0 + + for l:line in a:lines + if l:lcount is# 0 + " the very first line + let l:item = {'lnum': str2nr(l:line)} + elseif l:lcount is# 1 + if l:line is# 'Error' + let l:item['type'] = 'E' + elseif l:line is# 'Information' + let l:item['type'] = 'I' + else + let l:item['type'] = 'W' + endif + elseif l:lcount is# 2 + let l:item['text'] = l:line + elseif l:lcount is# 3 + let l:item['code'] = l:line + call add(l:output, l:item) + let l:lcount = -1 + endif + + let l:lcount = l:lcount + 1 + endfor + + return l:output +endfunction + +call ale#linter#Define('powershell', { +\ 'name': 'psscriptanalyzer', +\ 'executable': function('ale_linters#powershell#psscriptanalyzer#GetExecutable'), +\ 'command': function('ale_linters#powershell#psscriptanalyzer#GetCommand'), +\ 'output_stream': 'stdout', +\ 'callback': 'ale_linters#powershell#psscriptanalyzer#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/prolog/swipl.vim b/dot_vim/plugged/ale/ale_linters/prolog/swipl.vim new file mode 100644 index 0000000..82859eb --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/prolog/swipl.vim @@ -0,0 +1,110 @@ +" Author: Takuya Fujiwara +" Description: swipl syntax / semantic check for Prolog files + +call ale#Set('prolog_swipl_executable', 'swipl') +call ale#Set('prolog_swipl_load', 'current_prolog_flag(argv, [File]), load_files(File, [sandboxed(true)]), halt.') +call ale#Set('prolog_swipl_timeout', 3) +call ale#Set('prolog_swipl_alarm', 'alarm(%t, (%h), _, [])') +call ale#Set('prolog_swipl_alarm_handler', 'writeln(user_error, "ERROR: Exceeded %t seconds, Please change g:prolog_swipl_timeout to modify the limit."), halt(1)') + +function! ale_linters#prolog#swipl#GetCommand(buffer) abort + let l:goals = ale#Var(a:buffer, 'prolog_swipl_load') + let l:goals = l:goals =~# '^\s*$' ? 'halt' : l:goals + let l:timeout = ale#Var(a:buffer, 'prolog_swipl_timeout') + 0 + + if l:timeout > 0 + let l:goals = s:GetAlarm(a:buffer, l:timeout) . ', ' . l:goals + endif + + return '%e -g ' . ale#Escape(l:goals) . ' -- %s' +endfunction + +function! s:GetAlarm(buffer, timeout) abort + let l:handler = ale#Var(a:buffer, 'prolog_swipl_alarm_handler') + let l:handler = s:Subst(l:handler, {'t': a:timeout}) + let l:alarm = ale#Var(a:buffer, 'prolog_swipl_alarm') + let l:alarm = s:Subst(l:alarm, {'t': a:timeout, 'h': l:handler}) + + return l:alarm +endfunction + +function! s:Subst(format, vars) abort + let l:vars = extend(copy(a:vars), {'%': '%'}) + + return substitute(a:format, '%\(.\)', '\=get(l:vars, submatch(1), "")', 'g') +endfunction + +function! ale_linters#prolog#swipl#Handle(buffer, lines) abort + let l:output = [] + let l:i = 0 + + let l:pattern = '\v^(ERROR|Warning)+%(:\s*[^:]+:(\d+)%(:(\d+))?)?:\s*(.*)$' + + while l:i < len(a:lines) + let l:match = matchlist(a:lines[l:i], l:pattern) + + if empty(l:match) + let l:i += 1 + continue + endif + + let [l:i, l:text] = s:GetErrMsg(l:i, a:lines, l:match[4]) + let l:item = { + \ 'lnum': (l:match[2] + 0 ? l:match[2] + 0 : 1), + \ 'col': l:match[3] + 0, + \ 'text': l:text, + \ 'type': (l:match[1] is# 'ERROR' ? 'E' : 'W'), + \} + + if !s:Ignore(l:item) + call add(l:output, l:item) + endif + endwhile + + return l:output +endfunction + +" This returns [, ] +function! s:GetErrMsg(i, lines, text) abort + if a:text !~# '^\s*$' + return [a:i + 1, a:text] + endif + + let l:i = a:i + 1 + let l:text = [] + + let l:pattern = '\v^(ERROR|Warning)?:?(.*)$' + + while l:i < len(a:lines) + let l:match = matchlist(a:lines[l:i], l:pattern) + + if empty(l:match) || empty(l:match[2]) + let l:i += 1 + break + endif + + call add(l:text, s:Trim(l:match[2])) + let l:i += 1 + endwhile + + return [l:i, join(l:text, '. ')] +endfunction + +function! s:Trim(str) abort + return substitute(a:str, '\v^\s+|\s+$', '', 'g') +endfunction + +" Skip sandbox error which is caused by directives +" because what we want is syntactic or semantic check. +function! s:Ignore(item) abort + return a:item.type is# 'E' + \ && a:item.text =~# '\vNo permission to (call|directive|assert) sandboxed' +endfunction + +call ale#linter#Define('prolog', { +\ 'name': 'swipl', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'prolog_swipl_executable')}, +\ 'command': function('ale_linters#prolog#swipl#GetCommand'), +\ 'callback': 'ale_linters#prolog#swipl#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/proto/buf_lint.vim b/dot_vim/plugged/ale/ale_linters/proto/buf_lint.vim new file mode 100644 index 0000000..a22f8e5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/proto/buf_lint.vim @@ -0,0 +1,26 @@ +" Author: Alex McKinney +" Description: Run buf lint. + +call ale#Set('proto_buf_lint_executable', 'buf') +call ale#Set('proto_buf_lint_config', '') +call ale#Set('proto_buf_lint_options', '') + +function! ale_linters#proto#buf_lint#GetCommand(buffer) abort + let l:config = ale#Var(a:buffer, 'proto_buf_lint_config') + let l:options = ale#Var(a:buffer, 'proto_buf_lint_options') + + return '%e lint' + \ . (!empty(l:config) ? ' --config=' . ale#Escape(l:config) : '') + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %s#include_package_files=true' +endfunction + +call ale#linter#Define('proto', { +\ 'name': 'buf_lint', +\ 'aliases': ['buf-lint'], +\ 'lint_file': 1, +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'proto_buf_lint_executable')}, +\ 'command': function('ale_linters#proto#buf_lint#GetCommand'), +\ 'callback': 'ale#handlers#go#Handler', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/proto/protoc_gen_lint.vim b/dot_vim/plugged/ale/ale_linters/proto/protoc_gen_lint.vim new file mode 100644 index 0000000..c3d1093 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/proto/protoc_gen_lint.vim @@ -0,0 +1,27 @@ +" Author: Jeff Willette +" Description: run the protoc-gen-lint plugin for the protoc binary + +call ale#Set('proto_protoc_gen_lint_options', '') + +function! ale_linters#proto#protoc_gen_lint#GetCommand(buffer) abort + let l:dirname = expand('#' . a:buffer . ':p:h') + + let l:options = ['-I ' . ale#Escape(l:dirname)] + + if !empty(ale#Var(a:buffer, 'proto_protoc_gen_lint_options')) + let l:options += [ale#Var(a:buffer, 'proto_protoc_gen_lint_options')] + endif + + let l:options += ['--lint_out=. ' . '%s'] + + return 'protoc' . ' ' . join(l:options) +endfunction + +call ale#linter#Define('proto', { +\ 'name': 'protoc-gen-lint', +\ 'lint_file': 1, +\ 'output_stream': 'stderr', +\ 'executable': 'protoc', +\ 'command': function('ale_linters#proto#protoc_gen_lint#GetCommand'), +\ 'callback': 'ale#handlers#unix#HandleAsError', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/proto/protolint.vim b/dot_vim/plugged/ale/ale_linters/proto/protolint.vim new file mode 100644 index 0000000..2754c7b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/proto/protolint.vim @@ -0,0 +1,24 @@ +" Author: Yohei Yoshimuta +" Description: run the protolint for Protocol Buffer files + +call ale#Set('proto_protolint_executable', 'protolint') +call ale#Set('proto_protolint_config', '') + +function! ale_linters#proto#protolint#GetCommand(buffer) abort + let l:config = ale#Var(a:buffer, 'proto_protolint_config') + + return '%e lint' + \ . (!empty(l:config) ? ' -config_path=' . ale#Escape(l:config) : '') + \ . ' -reporter=unix' + \ . ' %s' +endfunction + +call ale#linter#Define('proto', { +\ 'name': 'protolint', +\ 'lint_file': 1, +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'proto_protolint_executable')}, +\ 'command': function('ale_linters#proto#protolint#GetCommand'), +\ 'callback': 'ale#handlers#unix#HandleAsError', +\}) + diff --git a/dot_vim/plugged/ale/ale_linters/pug/puglint.vim b/dot_vim/plugged/ale/ale_linters/pug/puglint.vim new file mode 100644 index 0000000..b552cc0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/pug/puglint.vim @@ -0,0 +1,56 @@ +" Author: w0rp - +" Description: pug-lint for checking Pug/Jade files. + +call ale#Set('pug_puglint_options', '') +call ale#Set('pug_puglint_executable', 'pug-lint') +call ale#Set('pug_puglint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! s:FindConfig(buffer) abort + for l:filename in [ + \ '.pug-lintrc', + \ '.pug-lintrc.js', + \ '.pug-lintrc.json', + \ 'package.json', + \] + let l:config = ale#path#FindNearestFile(a:buffer, l:filename) + + if !empty(l:config) + return l:config + endif + endfor + + return '' +endfunction + +function! ale_linters#pug#puglint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'pug_puglint_options') + let l:config = s:FindConfig(a:buffer) + + return '%e' . ale#Pad(l:options) + \ . (!empty(l:config) ? ' -c ' . ale#Escape(l:config) : '') + \ . ' -r inline %t' +endfunction + +function! ale_linters#pug#puglint#Handle(buffer, lines) abort + for l:line in a:lines[:10] + if l:line =~# '^SyntaxError: ' + return [{ + \ 'lnum': 1, + \ 'text': 'puglint configuration error (type :ALEDetail for more information)', + \ 'detail': join(a:lines, "\n"), + \}] + endif + endfor + + return ale#handlers#unix#HandleAsError(a:buffer, a:lines) +endfunction + +call ale#linter#Define('pug', { +\ 'name': 'puglint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'pug_puglint', [ +\ 'node_modules/.bin/pug-lint', +\ ])}, +\ 'output_stream': 'stderr', +\ 'command': function('ale_linters#pug#puglint#GetCommand'), +\ 'callback': 'ale_linters#pug#puglint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/puppet/languageserver.vim b/dot_vim/plugged/ale/ale_linters/puppet/languageserver.vim new file mode 100644 index 0000000..2078695 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/puppet/languageserver.vim @@ -0,0 +1,37 @@ +" Author: Alexander Olofsson +" Description: Puppet Language Server integration for ALE + +call ale#Set('puppet_languageserver_executable', 'puppet-languageserver') + +function! ale_linters#puppet#languageserver#GetProjectRoot(buffer) abort + " Note: The metadata.json file is recommended for Puppet 4+ modules, but + " there's no requirement to have it, so fall back to the other possible + " Puppet module directories + let l:root_path = ale#path#FindNearestFile(a:buffer, 'metadata.json') + + if !empty(l:root_path) + return fnamemodify(l:root_path, ':h') + endif + + for l:test_path in [ + \ 'manifests', + \ 'templates', + \] + let l:root_path = ale#path#FindNearestDirectory(a:buffer, l:test_path) + + if !empty(l:root_path) + return fnamemodify(l:root_path, ':h:h') + endif + endfor + + return '' +endfunction + +call ale#linter#Define('puppet', { +\ 'name': 'languageserver', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'puppet_languageserver_executable')}, +\ 'command': '%e --stdio', +\ 'language': 'puppet', +\ 'project_root': function('ale_linters#puppet#languageserver#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/puppet/puppet.vim b/dot_vim/plugged/ale/ale_linters/puppet/puppet.vim new file mode 100644 index 0000000..59228dc --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/puppet/puppet.vim @@ -0,0 +1,39 @@ +" Author: Alexander Olofsson + +call ale#Set('puppet_puppet_executable', 'puppet') +call ale#Set('puppet_puppet_options', '') + +function! ale_linters#puppet#puppet#Handle(buffer, lines) abort + " Matches patterns like the following: + " Error: Could not parse for environment production: Syntax error at ':' at /root/puppetcode/modules/nginx/manifests/init.pp:43:12 + " Error: Could not parse for environment production: Syntax error at '='; expected '}' at /root/puppetcode/modules/pancakes/manifests/init.pp:5" + " Error: Could not parse for environment production: Syntax error at 'parameter1' (file: /tmp/modules/mariadb/manifests/slave.pp, line: 4, column: 5) + " Error: Illegal attempt to assign to 'a Name'. Not an assignable reference (file: /tmp/modules/waffles/manifests/syrup.pp, line: 5, column: 11) + " Error: Could not parse for environment production: Syntax error at end of input (file: /tmp/modules/bob/manifests/init.pp) + let l:pattern = '^Error:\%(.*:\)\? \(.\+\) \((file:\|at\) .\+\.pp\(\(, line: \|:\)\(\d\+\)\(, column: \|:\)\=\(\d*\)\|)$\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[5] + 0, + \ 'col': l:match[7] + 0, + \ 'text': l:match[1], + \}) + endfor + + return l:output +endfunction + +function! ale_linters#puppet#puppet#GetCommand(buffer) abort + return '%e parser validate --color=false ' + \ . ale#Pad(ale#Var(a:buffer, 'puppet_puppet_options')) + \ . ' %t' +endfunction + +call ale#linter#Define('puppet', { +\ 'name': 'puppet', +\ 'executable': {b -> ale#Var(b, 'puppet_puppet_executable')}, +\ 'output_stream': 'stderr', +\ 'command': function('ale_linters#puppet#puppet#GetCommand'), +\ 'callback': 'ale_linters#puppet#puppet#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/puppet/puppetlint.vim b/dot_vim/plugged/ale/ale_linters/puppet/puppetlint.vim new file mode 100644 index 0000000..985d6a4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/puppet/puppetlint.vim @@ -0,0 +1,18 @@ +" Author: Alexander Olofsson , Robert Flechtner +" Description: puppet-lint for puppet files + +call ale#Set('puppet_puppetlint_executable', 'puppet-lint') +call ale#Set('puppet_puppetlint_options', '--no-autoloader_layout-check') + +function! ale_linters#puppet#puppetlint#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'puppet_puppetlint_options')) + \ . ' --log-format "-:%{line}:%{column}: %{kind}: [%{check}] %{message}"' + \ . ' %t' +endfunction + +call ale#linter#Define('puppet', { +\ 'name': 'puppetlint', +\ 'executable': {b -> ale#Var(b, 'puppet_puppetlint_executable')}, +\ 'command': function('ale_linters#puppet#puppetlint#GetCommand'), +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/purescript/ls.vim b/dot_vim/plugged/ale/ale_linters/purescript/ls.vim new file mode 100644 index 0000000..a20fae4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/purescript/ls.vim @@ -0,0 +1,49 @@ +" Author: Drew Olson +" Description: Integrate ALE with purescript-language-server. + +call ale#Set('purescript_ls_executable', 'purescript-language-server') +call ale#Set('purescript_ls_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('purescript_ls_config', {}) + +function! ale_linters#purescript#ls#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'purescript_ls', [ + \ 'node_modules/.bin/purescript-language-server', + \]) +endfunction + +function! ale_linters#purescript#ls#GetCommand(buffer) abort + let l:executable = ale_linters#purescript#ls#GetExecutable(a:buffer) + + return ale#Escape(l:executable) . ' --stdio' +endfunction + +function! ale_linters#purescript#ls#FindProjectRoot(buffer) abort + let l:config = ale#path#FindNearestFile(a:buffer, 'bower.json') + + if !empty(l:config) + return fnamemodify(l:config, ':h') + endif + + let l:config = ale#path#FindNearestFile(a:buffer, 'psc-package.json') + + if !empty(l:config) + return fnamemodify(l:config, ':h') + endif + + let l:config = ale#path#FindNearestFile(a:buffer, 'spago.dhall') + + if !empty(l:config) + return fnamemodify(l:config, ':h') + endif + + return '' +endfunction + +call ale#linter#Define('purescript', { +\ 'name': 'purescript-language-server', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#purescript#ls#GetExecutable'), +\ 'command': function('ale_linters#purescript#ls#GetCommand'), +\ 'project_root': function('ale_linters#purescript#ls#FindProjectRoot'), +\ 'lsp_config': {b -> ale#Var(b, 'purescript_ls_config')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/pyrex/cython.vim b/dot_vim/plugged/ale/ale_linters/pyrex/cython.vim new file mode 100644 index 0000000..247c306 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/pyrex/cython.vim @@ -0,0 +1,36 @@ +" Author: w0rp , +" Nicolas Pauss +" Description: cython syntax checking for cython files. + +call ale#Set('pyrex_cython_executable', 'cython') +call ale#Set('pyrex_cython_options', '--warning-extra') + +function! ale_linters#pyrex#cython#GetCommand(buffer) abort + return '%e --working %s:h --include-dir %s:h' + \ . ale#Pad(ale#Var(a:buffer, 'pyrex_cython_options')) + \ . ' --output-file ' . g:ale#util#nul_file . ' %t' +endfunction + +function! ale_linters#pyrex#cython#Handle(buffer, lines) abort + let l:pattern = '\v^(\w+: )?[^:]+:(\d+):?(\d+)?:? ?(.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[4], + \ 'type': l:match[1][0] is# 'w' ? 'W' : 'E', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('pyrex', { +\ 'name': 'cython', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'pyrex_cython_executable')}, +\ 'command': function('ale_linters#pyrex#cython#GetCommand'), +\ 'callback': 'ale_linters#pyrex#cython#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/bandit.vim b/dot_vim/plugged/ale/ale_linters/python/bandit.vim new file mode 100644 index 0000000..9cfca7c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/bandit.vim @@ -0,0 +1,76 @@ +" Author: Martino Pilia +" Description: bandit linting for python files + +call ale#Set('python_bandit_executable', 'bandit') +call ale#Set('python_bandit_options', '') +call ale#Set('python_bandit_use_config', 1) +call ale#Set('python_bandit_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_bandit_auto_pipenv', 0) +call ale#Set('python_bandit_auto_poetry', 0) + +function! ale_linters#python#bandit#GetExecutable(buffer) abort + if ( + \ ale#Var(a:buffer, 'python_auto_pipenv') + \ || ale#Var(a:buffer, 'python_bandit_auto_pipenv') + \) && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if ( + \ ale#Var(a:buffer, 'python_auto_poetry') + \ || ale#Var(a:buffer, 'python_bandit_auto_poetry') + \) && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_bandit', ['bandit']) +endfunction + +function! ale_linters#python#bandit#GetCommand(buffer) abort + let l:executable = ale_linters#python#bandit#GetExecutable(a:buffer) + let l:flags = ' --format custom' + \ . ' --msg-template "{line}:{test_id}:{severity}:{msg}" ' + + if ale#Var(a:buffer, 'python_bandit_use_config') + let l:config_path = ale#path#FindNearestFile(a:buffer, '.bandit') + + if !empty(l:config_path) + let l:flags = ' --ini ' . ale#Escape(l:config_path) . l:flags + endif + endif + + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run bandit' + \ : '' + + return ale#Escape(l:executable) . l:exec_args + \ . l:flags + \ . ale#Pad(ale#Var(a:buffer, 'python_bandit_options')) + \ . ' -' +endfunction + +function! ale_linters#python#bandit#Handle(buffer, lines) abort + " Custom format defined in GetCommand via --msg-template + let l:pattern = '\v^([0-9]+):(B[0-9]+):([A-Z]+):(.*)$' + let l:severity = {'LOW': 'I', 'MEDIUM': 'W', 'HIGH': 'E'} + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': str2nr(l:match[1]), + \ 'code': l:match[2], + \ 'type': l:severity[l:match[3]], + \ 'text': l:match[4], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'bandit', +\ 'executable': function('ale_linters#python#bandit#GetExecutable'), +\ 'command': function('ale_linters#python#bandit#GetCommand'), +\ 'callback': 'ale_linters#python#bandit#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/cspell.vim b/dot_vim/plugged/ale/ale_linters/python/cspell.vim new file mode 100644 index 0000000..a232531 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Python files. + +call ale#handlers#cspell#DefineLinter('python') diff --git a/dot_vim/plugged/ale/ale_linters/python/flake8.vim b/dot_vim/plugged/ale/ale_linters/python/flake8.vim new file mode 100644 index 0000000..9950614 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/flake8.vim @@ -0,0 +1,170 @@ +" Author: w0rp +" Description: flake8 for python files + +call ale#Set('python_flake8_executable', 'flake8') +call ale#Set('python_flake8_options', '') +call ale#Set('python_flake8_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_flake8_change_directory', 'project') +call ale#Set('python_flake8_auto_pipenv', 0) +call ale#Set('python_flake8_auto_poetry', 0) + +function! s:UsingModule(buffer) abort + return ale#Var(a:buffer, 'python_flake8_options') =~# ' *-m flake8' +endfunction + +function! ale_linters#python#flake8#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_flake8_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_flake8_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + if !s:UsingModule(a:buffer) + return ale#python#FindExecutable(a:buffer, 'python_flake8', ['flake8']) + endif + + return ale#Var(a:buffer, 'python_flake8_executable') +endfunction + +function! ale_linters#python#flake8#RunWithVersionCheck(buffer) abort + let l:executable = ale_linters#python#flake8#GetExecutable(a:buffer) + + let l:module_string = s:UsingModule(a:buffer) ? ' -m flake8' : '' + let l:command = ale#Escape(l:executable) . l:module_string . ' --version' + + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ l:executable, + \ l:command, + \ function('ale_linters#python#flake8#GetCommand'), + \) +endfunction + +function! ale_linters#python#flake8#GetCwd(buffer) abort + let l:change_directory = ale#Var(a:buffer, 'python_flake8_change_directory') + let l:cwd = '' + + if l:change_directory is# 'project' + let l:project_root = ale#python#FindProjectRootIni(a:buffer) + + if !empty(l:project_root) + let l:cwd = l:project_root + endif + endif + + if (l:change_directory is# 'project' && empty(l:cwd)) + \|| l:change_directory is# 1 + \|| l:change_directory is# 'file' + let l:cwd = '%s:h' + endif + + return l:cwd +endfunction + +function! ale_linters#python#flake8#GetCommand(buffer, version) abort + let l:executable = ale_linters#python#flake8#GetExecutable(a:buffer) + + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run flake8' + \ : '' + + " Only include the --stdin-display-name argument if we can parse the + " flake8 version, and it is recent enough to support it. + let l:display_name_args = ale#semver#GTE(a:version, [3, 0, 0]) + \ ? ' --stdin-display-name %s' + \ : '' + + let l:options = ale#Var(a:buffer, 'python_flake8_options') + + return ale#Escape(l:executable) . l:exec_args + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --format=default' + \ . l:display_name_args . ' -' +endfunction + +let s:end_col_pattern_map = { +\ 'F405': '\(.\+\) may be undefined', +\ 'F821': 'undefined name ''\([^'']\+\)''', +\ 'F999': '^''\([^'']\+\)''', +\ 'F841': 'local variable ''\([^'']\+\)''', +\} + +function! ale_linters#python#flake8#Handle(buffer, lines) abort + let l:output = ale#python#HandleTraceback(a:lines, 10) + + if !empty(l:output) + return l:output + endif + + " Matches patterns line the following: + " + " Matches patterns line the following: + " + " stdin:6:6: E111 indentation is not a multiple of four + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):?(\d+)?: ([[:alnum:]]+):? (.*)$' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:code = l:match[3] + + if (l:code is# 'W291' || l:code is# 'W293') + \ && !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + " Skip warnings for trailing whitespace if the option is off. + continue + endif + + if l:code is# 'W391' + \&& !ale#Var(a:buffer, 'warn_about_trailing_blank_lines') + " Skip warnings for trailing blank lines if the option is off + continue + endif + + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'vcol': 1, + \ 'text': l:match[4], + \ 'code': l:code, + \ 'type': 'W', + \} + + if l:code[:0] is# 'F' + if l:code isnot# 'F401' + let l:item.type = 'E' + endif + elseif l:code[:0] is# 'E' + let l:item.type = 'E' + + if l:code isnot# 'E999' && l:code isnot# 'E112' + let l:item.sub_type = 'style' + endif + elseif l:code[:0] is# 'W' + let l:item.sub_type = 'style' + endif + + let l:end_col_pattern = get(s:end_col_pattern_map, l:code, '') + + if !empty(l:end_col_pattern) + let l:end_col_match = matchlist(l:match[4], l:end_col_pattern) + + if !empty(l:end_col_match) + let l:item.end_col = l:item.col + len(l:end_col_match[1]) - 1 + endif + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'flake8', +\ 'executable': function('ale_linters#python#flake8#GetExecutable'), +\ 'cwd': function('ale_linters#python#flake8#GetCwd'), +\ 'command': function('ale_linters#python#flake8#RunWithVersionCheck'), +\ 'callback': 'ale_linters#python#flake8#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/flakehell.vim b/dot_vim/plugged/ale/ale_linters/python/flakehell.vim new file mode 100644 index 0000000..ffe87e2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/flakehell.vim @@ -0,0 +1,175 @@ +" Author: w0rp +" Description: flakehell for python files + +call ale#Set('python_flakehell_executable', 'flakehell') +call ale#Set('python_flakehell_options', '') +call ale#Set('python_flakehell_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_flakehell_change_directory', 'project') +call ale#Set('python_flakehell_auto_pipenv', 0) +call ale#Set('python_flakehell_auto_poetry', 0) + +function! s:UsingModule(buffer) abort + return ale#Var(a:buffer, 'python_flakehell_executable') is? 'python' +endfunction + +function! ale_linters#python#flakehell#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_flakehell_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_flakehell_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + if !s:UsingModule(a:buffer) + return ale#python#FindExecutable(a:buffer, 'python_flakehell', ['flakehell']) + endif + + return ale#Var(a:buffer, 'python_flakehell_executable') +endfunction + +function! ale_linters#python#flakehell#RunWithVersionCheck(buffer) abort + let l:executable = ale_linters#python#flakehell#GetExecutable(a:buffer) + + let l:module_string = s:UsingModule(a:buffer) ? ' -m flakehell' : '' + let l:command = ale#Escape(l:executable) . l:module_string . ' --version' + + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ l:executable, + \ l:command, + \ function('ale_linters#python#flakehell#GetCommand'), + \) +endfunction + +function! ale_linters#python#flakehell#GetCwd(buffer) abort + let l:change_directory = ale#Var(a:buffer, 'python_flakehell_change_directory') + let l:cwd = '' + + if l:change_directory is# 'project' + let l:project_root = ale#python#FindProjectRootIni(a:buffer) + + if !empty(l:project_root) + let l:cwd = l:project_root + endif + endif + + if (l:change_directory is# 'project' && empty(l:cwd)) + \|| l:change_directory is# 1 + \|| l:change_directory is# 'file' + let l:cwd = '%s:h' + endif + + return l:cwd +endfunction + +function! ale_linters#python#flakehell#GetCommand(buffer, version) abort + let l:executable = ale_linters#python#flakehell#GetExecutable(a:buffer) + + if (l:executable =~? 'pipenv\|poetry$') + let l:exec_args = ' run flakehell' + elseif (l:executable is? 'python') + let l:exec_args = ' -m flakehell' + else + let l:exec_args = '' + endif + + " Only include the --stdin-display-name argument if we can parse the + " flakehell version, and it is recent enough to support it. + let l:display_name_args = ale#semver#GTE(a:version, [0, 8, 0]) + \ ? ' --stdin-display-name %s' + \ : '' + + let l:options = ale#Var(a:buffer, 'python_flakehell_options') + + return ale#Escape(l:executable) + \ . l:exec_args + \ . (!empty(l:options) ? ' lint ' . l:options : ' lint') + \ . ' --format=default' + \ . l:display_name_args . ' -' +endfunction + +let s:end_col_pattern_map = { +\ 'F405': '\(.\+\) may be undefined', +\ 'F821': 'undefined name ''\([^'']\+\)''', +\ 'F999': '^''\([^'']\+\)''', +\ 'F841': 'local variable ''\([^'']\+\)''', +\} + +function! ale_linters#python#flakehell#Handle(buffer, lines) abort + let l:output = ale#python#HandleTraceback(a:lines, 10) + + if !empty(l:output) + return l:output + endif + + " Matches patterns line the following: + " + " Matches patterns line the following: + " + " stdin:6:6: E111 indentation is not a multiple of four + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):?(\d+)?: ([[:alnum:]]+):? (.*)$' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:code = l:match[3] + + if (l:code is# 'W291' || l:code is# 'W293') + \ && !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + " Skip warnings for trailing whitespace if the option is off. + continue + endif + + if l:code is# 'W391' + \&& !ale#Var(a:buffer, 'warn_about_trailing_blank_lines') + " Skip warnings for trailing blank lines if the option is off + continue + endif + + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'vcol': 1, + \ 'text': l:match[4], + \ 'code': l:code, + \ 'type': 'W', + \} + + if l:code[:0] is# 'F' + if l:code isnot# 'F401' + let l:item.type = 'E' + endif + elseif l:code[:0] is# 'E' + let l:item.type = 'E' + + if l:code isnot# 'E999' && l:code isnot# 'E112' + let l:item.sub_type = 'style' + endif + elseif l:code[:0] is# 'W' + let l:item.sub_type = 'style' + endif + + let l:end_col_pattern = get(s:end_col_pattern_map, l:code, '') + + if !empty(l:end_col_pattern) + let l:end_col_match = matchlist(l:match[4], l:end_col_pattern) + + if !empty(l:end_col_match) + let l:item.end_col = l:item.col + len(l:end_col_match[1]) - 1 + endif + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'flakehell', +\ 'executable': function('ale_linters#python#flakehell#GetExecutable'), +\ 'cwd': function('ale_linters#python#flakehell#GetCwd'), +\ 'command': function('ale_linters#python#flakehell#RunWithVersionCheck'), +\ 'callback': 'ale_linters#python#flakehell#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/jedils.vim b/dot_vim/plugged/ale/ale_linters/python/jedils.vim new file mode 100644 index 0000000..eae5fb0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/jedils.vim @@ -0,0 +1,34 @@ +" Author: Dalius Dobravolskas +" Description: https://github.com/pappasam/jedi-language-server + +call ale#Set('python_jedils_executable', 'jedi-language-server') +call ale#Set('python_jedils_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_jedils_auto_pipenv', 0) + +function! ale_linters#python#jedils#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_jedils_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + return ale#python#FindExecutable(a:buffer, 'python_jedils', ['jedi-language-server']) +endfunction + +function! ale_linters#python#jedils#GetCommand(buffer) abort + let l:executable = ale_linters#python#jedils#GetExecutable(a:buffer) + + let l:exec_args = l:executable =~? 'pipenv$' + \ ? ' run jedi-language-server' + \ : '' + + return ale#Escape(l:executable) . l:exec_args +endfunction + +call ale#linter#Define('python', { +\ 'name': 'jedils', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#python#jedils#GetExecutable'), +\ 'command': function('ale_linters#python#jedils#GetCommand'), +\ 'project_root': function('ale#python#FindProjectRoot'), +\ 'completion_filter': 'ale#completion#python#CompletionItemFilter', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/mypy.vim b/dot_vim/plugged/ale/ale_linters/python/mypy.vim new file mode 100644 index 0000000..9d469a1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/mypy.vim @@ -0,0 +1,103 @@ +" Author: Keith Smiley , w0rp +" Description: mypy support for optional python typechecking + +call ale#Set('python_mypy_executable', 'mypy') +call ale#Set('python_mypy_ignore_invalid_syntax', 0) +call ale#Set('python_mypy_show_notes', 1) +call ale#Set('python_mypy_options', '') +call ale#Set('python_mypy_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_mypy_auto_pipenv', 0) +call ale#Set('python_mypy_auto_poetry', 0) + +function! ale_linters#python#mypy#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_mypy_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_mypy_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_mypy', ['mypy']) +endfunction + +" The directory to change to before running mypy +function! ale_linters#python#mypy#GetCwd(buffer) abort + " If we find a directory with "mypy.ini" in it use that, + " else try and find the "python project" root, or failing + " that, run from the same folder as the current file + for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + if filereadable(l:path . '/mypy.ini') + return l:path + endif + endfor + + let l:project_root = ale#python#FindProjectRoot(a:buffer) + + return !empty(l:project_root) + \ ? l:project_root + \ : expand('#' . a:buffer . ':p:h') +endfunction + +function! ale_linters#python#mypy#GetCommand(buffer) abort + let l:executable = ale_linters#python#mypy#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run mypy' + \ : '' + + return '%e' . l:exec_args + \ . ale#Pad(ale#Var(a:buffer, 'python_mypy_options')) + \ . ' --show-column-numbers' + \ . ' --shadow-file %s %t %s' +endfunction + +function! ale_linters#python#mypy#Handle(buffer, lines) abort + let l:dir = ale_linters#python#mypy#GetCwd(a:buffer) + " Look for lines like the following: + " + " file.py:4: error: No library stub file for module 'django.db' + " + " Lines like these should be ignored below: + " + " file.py:4: note: (Stub files are from https://github.com/python/typeshed) + + let l:types = 'error|warning' + + if ale#Var(a:buffer, 'python_mypy_show_notes') + let l:types = 'error|warning|note' + endif + + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?: (' + \ . l:types + \ . '): (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + " Skip invalid syntax errors if the option is on. + if l:match[5] is# 'invalid syntax' + \&& ale#Var(a:buffer, 'python_mypy_ignore_invalid_syntax') + continue + endif + + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'type': l:match[4] is# 'error' ? 'E' : (l:match[4] is# 'note' ? 'I': 'W'), + \ 'text': l:match[5], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'mypy', +\ 'executable': function('ale_linters#python#mypy#GetExecutable'), +\ 'cwd': function('ale_linters#python#mypy#GetCwd'), +\ 'command': function('ale_linters#python#mypy#GetCommand'), +\ 'callback': 'ale_linters#python#mypy#Handle', +\ 'output_stream': 'both' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/prospector.vim b/dot_vim/plugged/ale/ale_linters/python/prospector.vim new file mode 100644 index 0000000..3623bda --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/prospector.vim @@ -0,0 +1,106 @@ +" Author: chocoelho +" Description: prospector linter python files + +call ale#Set('python_prospector_auto_pipenv', 0) +call ale#Set('python_prospector_auto_poetry', 0) + +let g:ale_python_prospector_executable = +\ get(g:, 'ale_python_prospector_executable', 'prospector') + +let g:ale_python_prospector_options = +\ get(g:, 'ale_python_prospector_options', '') + +let g:ale_python_prospector_use_global = get(g:, 'ale_python_prospector_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#python#prospector#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_prospector_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_prospector_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_prospector', ['prospector']) +endfunction + +function! ale_linters#python#prospector#GetCommand(buffer) abort + let l:executable = ale_linters#python#prospector#GetExecutable(a:buffer) + + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run prospector' + \ : '' + + return ale#Escape(l:executable) + \ . l:exec_args + \ . ' ' . ale#Var(a:buffer, 'python_prospector_options') + \ . ' --messages-only --absolute-paths --zero-exit --output-format json' + \ . ' %s' +endfunction + +function! ale_linters#python#prospector#Handle(buffer, lines) abort + let l:output = [] + + if empty(a:lines) + return [] + endif + + let l:prospector_error = json_decode(join(a:lines, '')) + + for l:error in l:prospector_error.messages + if (l:error.code is# 'W291' || l:error.code is# 'W293' || l:error.code is# 'trailing-whitespace') + \ && !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + " Skip warnings for trailing whitespace if the option is off. + continue + endif + + if l:error.code is# 'W391' + \&& !ale#Var(a:buffer, 'warn_about_trailing_blank_lines') + " Skip warnings for trailing blank lines if the option is off + continue + endif + + if l:error.source =~# '\v\[%(dodgy|mccabe|pep8|pep257|pyroma)\]$' + let l:sub_type = 'style' + else + let l:sub_type = '' + endif + + if l:error.source =~# '\v\[pylint\]$' + let l:type = l:error.code =~? '\m^[CRW]' ? 'W' : 'E' + elseif l:error.source =~# '\v\[%(frosted|pep8)\]$' + let l:type = l:error.code =~? '\m^W' ? 'W' : 'E' + elseif l:error.source =~# '\v\[%(dodgy|pyroma|vulture)\]$' + let l:type = 'W' + else + let l:type = 'E' + endif + + let l:item = { + \ 'lnum': l:error.location.line, + \ 'col': l:error.location.character + 1, + \ 'text': l:error.message, + \ 'code': printf('(%s) %s', l:error.source, l:error.code), + \ 'type': l:type, + \ 'sub_type': l:sub_type, + \} + + if l:sub_type is# '' + unlet l:item.sub_type + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'prospector', +\ 'executable': function('ale_linters#python#prospector#GetExecutable'), +\ 'command': function('ale_linters#python#prospector#GetCommand'), +\ 'callback': 'ale_linters#python#prospector#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/pycodestyle.vim b/dot_vim/plugged/ale/ale_linters/python/pycodestyle.vim new file mode 100644 index 0000000..3fb94d6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/pycodestyle.vim @@ -0,0 +1,81 @@ +" Author: Michael Thiesen +" Description: pycodestyle linting for python files + +call ale#Set('python_pycodestyle_executable', 'pycodestyle') +call ale#Set('python_pycodestyle_options', '') +call ale#Set('python_pycodestyle_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_pycodestyle_auto_pipenv', 0) +call ale#Set('python_pycodestyle_auto_poetry', 0) + +function! ale_linters#python#pycodestyle#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pycodestyle_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pycodestyle_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_pycodestyle', ['pycodestyle']) +endfunction + +function! ale_linters#python#pycodestyle#GetCommand(buffer) abort + let l:executable = ale_linters#python#pycodestyle#GetExecutable(a:buffer) + + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run pycodestyle' + \ : '' + + return ale#Escape(l:executable) . l:exec_args + \ . ' ' + \ . ale#Var(a:buffer, 'python_pycodestyle_options') + \ . ' -' +endfunction + +function! ale_linters#python#pycodestyle#Handle(buffer, lines) abort + let l:pattern = '\v^(\S*):(\d*):(\d*): ([EW]\d+) (.*)$' + let l:output = [] + + " lines are formatted as follows: + " file.py:21:26: W291 trailing whitespace + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if(l:match[4] is# 'W291' || l:match[4] is# 'W293') + \&& !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + " Skip warnings for trailing whitespace if the option is off. + continue + endif + + if l:match[4] is# 'W391' + \&& !ale#Var(a:buffer, 'warn_about_trailing_blank_lines') + " Skip warnings for trailing blank lines if the option is off + continue + endif + + let l:item = { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'type': l:match[4][0], + \ 'sub_type': 'style', + \ 'text': l:match[5], + \ 'code': l:match[4], + \} + + " E999 and E112 are syntax errors. + if l:match[4] is# 'E999' || l:match[4] is# 'E112' + unlet l:item.sub_type + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'pycodestyle', +\ 'executable': function('ale_linters#python#pycodestyle#GetExecutable'), +\ 'command': function('ale_linters#python#pycodestyle#GetCommand'), +\ 'callback': 'ale_linters#python#pycodestyle#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/pydocstyle.vim b/dot_vim/plugged/ale/ale_linters/python/pydocstyle.vim new file mode 100644 index 0000000..ef0d818 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/pydocstyle.vim @@ -0,0 +1,77 @@ +" Author: Pablo Acosta +" Description: pydocstyle for python files + +call ale#Set('python_pydocstyle_executable', 'pydocstyle') +call ale#Set('python_pydocstyle_options', '') +call ale#Set('python_pydocstyle_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_pydocstyle_auto_pipenv', 0) +call ale#Set('python_pydocstyle_auto_poetry', 0) + +function! ale_linters#python#pydocstyle#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pydocstyle_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pydocstyle_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_pydocstyle', ['pydocstyle']) +endfunction + +function! ale_linters#python#pydocstyle#GetCommand(buffer) abort + let l:executable = ale_linters#python#pydocstyle#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run pydocstyle' + \ : '' + + return ale#Escape(l:executable) . l:exec_args + \ . ale#Pad(ale#Var(a:buffer, 'python_pydocstyle_options')) + \ . ' %s' +endfunction + +function! ale_linters#python#pydocstyle#Handle(buffer, lines) abort + " Matches patterns like the following: + " mydir/myfile.py:33 in public function `myfunction`: + " DXXX: Error description + let l:line1_pattern = '\v^.*:\s*(\d+)\s+.*$' + let l:line2_pattern = '\v^.*([a-zA-Z]\d+):\s*(.*)$' + let l:output = [] + + let l:num_lines = len(a:lines) + let l:index = 0 + + while l:index < l:num_lines + let l:lnum = matchlist(a:lines[l:index], l:line1_pattern) + + if !empty(l:lnum) && (l:index + 1 < l:num_lines) + let l:desc = matchlist(a:lines[l:index + 1], l:line2_pattern) + + if !empty(l:desc) + call add(l:output, { + \ 'lnum': l:lnum[1] + 0, + \ 'col': 1, + \ 'type': 'W', + \ 'text': l:desc[2], + \ 'code': l:desc[1], + \}) + endif + + let l:index = l:index + 2 + else + let l:index = l:index + 1 + endif + endwhile + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'pydocstyle', +\ 'executable': function('ale_linters#python#pydocstyle#GetExecutable'), +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#python#pydocstyle#GetCommand'), +\ 'callback': 'ale_linters#python#pydocstyle#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/pyflakes.vim b/dot_vim/plugged/ale/ale_linters/python/pyflakes.vim new file mode 100644 index 0000000..2567c53 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/pyflakes.vim @@ -0,0 +1,56 @@ +" Author: w0rp +" Description: pyflakes for python files + +call ale#Set('python_pyflakes_executable', 'pyflakes') +call ale#Set('python_pyflakes_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_pyflakes_auto_pipenv', 0) +call ale#Set('python_pyflakes_auto_poetry', 0) + +function! ale_linters#python#pyflakes#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pyflakes_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pyflakes_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_pyflakes', ['pyflakes']) +endfunction + +function! ale_linters#python#pyflakes#GetCommand(buffer) abort + let l:executable = ale_linters#python#pyflakes#GetExecutable(a:buffer) + + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run pyflakes' + \ : '' + + return ale#Escape(l:executable) + \ . l:exec_args + \ . ' %t' +endfunction + +function! ale_linters#python#pyflakes#Handle(buffer, lines) abort + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+)?:? (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'pyflakes', +\ 'executable': function('ale_linters#python#pyflakes#GetExecutable'), +\ 'command': function('ale_linters#python#pyflakes#GetCommand'), +\ 'callback': 'ale_linters#python#pyflakes#Handle', +\ 'output_stream': 'both', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/pylama.vim b/dot_vim/plugged/ale/ale_linters/python/pylama.vim new file mode 100644 index 0000000..14f8071 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/pylama.vim @@ -0,0 +1,154 @@ +" Author: Kevin Locke +" Description: pylama for python files + +call ale#Set('python_pylama_executable', 'pylama') +call ale#Set('python_pylama_options', '') +call ale#Set('python_pylama_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_pylama_auto_pipenv', 0) +call ale#Set('python_pylama_auto_poetry', 0) +call ale#Set('python_pylama_change_directory', 1) + +function! ale_linters#python#pylama#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pylama_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pylama_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_pylama', ['pylama']) +endfunction + +function! ale_linters#python#pylama#RunWithVersionCheck(buffer) abort + let l:executable = ale_linters#python#pylama#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run pylama' + \ : '' + + let l:command = ale#Escape(l:executable) . l:exec_args . ' --version' + + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ l:executable, + \ l:command, + \ function('ale_linters#python#pylama#GetCommand'), + \) +endfunction + +function! ale_linters#python#pylama#GetCwd(buffer) abort + if ale#Var(a:buffer, 'python_pylama_change_directory') + " Pylama loads its configuration from the current directory only, and + " applies file masks using paths relative to the current directory. + " Run from project root, if found, otherwise buffer dir. + let l:project_root = ale#python#FindProjectRoot(a:buffer) + + return !empty(l:project_root) ? l:project_root : '%s:h' + endif + + return '' +endfunction + +function! ale_linters#python#pylama#GetCommand(buffer, version) abort + let l:executable = ale_linters#python#pylama#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run pylama' + \ : '' + + " json format is added in version 8.1.4 + " https://github.com/klen/pylama/blob/develop/Changelog + let l:format_json_args = ale#semver#GTE(a:version, [8, 1, 4]) + \ ? ' --format json' + \ : '' + + " Note: Using %t to lint changes would be preferable, but many pylama + " checks use surrounding paths (e.g. C0103 module name, E0402 relative + " import beyond top, etc.). Neither is ideal. + return ale#Escape(l:executable) . l:exec_args + \ . ale#Pad(ale#Var(a:buffer, 'python_pylama_options')) + \ . l:format_json_args + \ . ' %s' +endfunction + +function! ale_linters#python#pylama#Handle(buffer, version, lines) abort + if empty(a:lines) + return [] + endif + + let l:output = ale#python#HandleTraceback(a:lines, 1) + + " First letter of error code is a pylint-compatible message type + " http://pylint.pycqa.org/en/latest/user_guide/output.html#source-code-analysis-section + " D is for Documentation (pydocstyle) + let l:pylint_type_to_ale_type = { + \ 'I': 'I', + \ 'R': 'W', + \ 'C': 'W', + \ 'W': 'W', + \ 'E': 'E', + \ 'F': 'E', + \ 'D': 'W', + \} + let l:pylint_type_to_ale_sub_type = { + \ 'R': 'style', + \ 'C': 'style', + \ 'D': 'style', + \} + + if ale#semver#GTE(a:version, [8, 1, 4]) + try + let l:errors = json_decode(join(a:lines, '')) + catch + return l:output + endtry + + if empty(l:errors) + return l:output + endif + + for l:error in l:errors + call add(l:output, { + \ 'lnum': l:error['lnum'], + \ 'col': l:error['col'], + \ 'code': l:error['number'], + \ 'type': get(l:pylint_type_to_ale_type, l:error['etype'], 'W'), + \ 'sub_type': get(l:pylint_type_to_ale_sub_type, l:error['etype'], ''), + \ 'text': printf('%s [%s]', l:error['message'], l:error['source']), + \}) + endfor + else + let l:pattern = '\v^.{-}:([0-9]+):([0-9]+): +%(([A-Z][0-9]+):? +)?(.*)$' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': str2nr(l:match[1]), + \ 'col': str2nr(l:match[2]), + \ 'code': l:match[3], + \ 'type': get(l:pylint_type_to_ale_type, l:match[3][0], 'W'), + \ 'sub_type': get(l:pylint_type_to_ale_sub_type, l:match[3][0], ''), + \ 'text': l:match[4], + \}) + endfor + endif + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'pylama', +\ 'executable': function('ale_linters#python#pylama#GetExecutable'), +\ 'cwd': function('ale_linters#python#pylama#GetCwd'), +\ 'command': function('ale_linters#python#pylama#RunWithVersionCheck'), +\ 'callback': {buffer, lines -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale_linters#python#pylama#GetExecutable(buffer), +\ '%e --version', +\ {buffer, version -> ale_linters#python#pylama#Handle( +\ buffer, +\ l:version, +\ lines)}, +\ )}, +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/pylint.vim b/dot_vim/plugged/ale/ale_linters/python/pylint.vim new file mode 100644 index 0000000..2ce5376 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/pylint.vim @@ -0,0 +1,120 @@ +" Author: keith +" Description: pylint for python files + +call ale#Set('python_pylint_executable', 'pylint') +call ale#Set('python_pylint_options', '') +call ale#Set('python_pylint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_pylint_change_directory', 1) +call ale#Set('python_pylint_auto_pipenv', 0) +call ale#Set('python_pylint_auto_poetry', 0) +call ale#Set('python_pylint_use_msg_id', 0) + +function! ale_linters#python#pylint#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pylint_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pylint_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_pylint', ['pylint']) +endfunction + +function! ale_linters#python#pylint#GetCwd(buffer) abort + if ale#Var(a:buffer, 'python_pylint_change_directory') + " pylint only checks for pylintrc in the packages above its current + " directory before falling back to user and global pylintrc. + " Run from project root, if found, otherwise buffer dir. + let l:project_root = ale#python#FindProjectRoot(a:buffer) + + return !empty(l:project_root) ? l:project_root : '%s:h' + endif + + return '' +endfunction + +function! ale_linters#python#pylint#GetCommand(buffer, version) abort + let l:executable = ale_linters#python#pylint#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run pylint' + \ : '' + + return ale#Escape(l:executable) . l:exec_args + \ . ale#Pad(ale#Var(a:buffer, 'python_pylint_options')) + \ . ' --output-format text --msg-template="{path}:{line}:{column}: {msg_id} ({symbol}) {msg}" --reports n' + \ . (ale#semver#GTE(a:version, [2, 4, 0]) ? ' --from-stdin' : '') + \ . ' %s' +endfunction + +function! ale_linters#python#pylint#Handle(buffer, lines) abort + let l:output = ale#python#HandleTraceback(a:lines, 10) + + if !empty(l:output) + return l:output + endif + + " Matches patterns like the following: + " + " test.py:4:4: W0101 (unreachable) Unreachable code + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+): ([[:alnum:]]+) \(([^(]*)\) (.*)$' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + "let l:failed = append(0, l:match) + let l:code = l:match[3] + + if (l:code is# 'C0303') + \ && !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + " Skip warnings for trailing whitespace if the option is off. + continue + endif + + if l:code is# 'I0011' + " Skip 'Locally disabling' message + continue + endif + + if ale#Var(a:buffer, 'python_pylint_use_msg_id') is# 1 + let l:code_out = l:code + else + let l:code_out = l:match[4] + endif + + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 1, + \ 'text': l:match[5], + \ 'code': l:code_out, + \ 'type': 'W', + \} + + if l:code[:0] is# 'E' + let l:item.type = 'E' + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'pylint', +\ 'executable': function('ale_linters#python#pylint#GetExecutable'), +\ 'lint_file': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale#Var(buffer, 'python_pylint_executable'), +\ '%e --version', +\ {buffer, version -> !ale#semver#GTE(version, [2, 4, 0])}, +\ )}, +\ 'cwd': function('ale_linters#python#pylint#GetCwd'), +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale#Var(buffer, 'python_pylint_executable'), +\ '%e --version', +\ function('ale_linters#python#pylint#GetCommand'), +\ )}, +\ 'callback': 'ale_linters#python#pylint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/pylsp.vim b/dot_vim/plugged/ale/ale_linters/python/pylsp.vim new file mode 100644 index 0000000..a699e4f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/pylsp.vim @@ -0,0 +1,57 @@ +" Author: aurieh +" Description: A language server for Python + +call ale#Set('python_pylsp_executable', 'pylsp') +call ale#Set('python_pylsp_options', '') +call ale#Set('python_pylsp_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_pylsp_auto_pipenv', 0) +call ale#Set('python_pylsp_auto_poetry', 0) +call ale#Set('python_pylsp_config', {}) + +function! ale_linters#python#pylsp#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pylsp_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pylsp_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_pylsp', ['pylsp']) +endfunction + +" Force the cwd of the server to be the same as the project root to +" fix issues with treating local files matching first or third party library +" names being imported incorrectly. +function! ale_linters#python#pylsp#GetCwd(buffer) abort + let l:fake_linter = { + \ 'name': 'pylsp', + \ 'project_root': function('ale#python#FindProjectRoot'), + \} + let l:root = ale#lsp_linter#FindProjectRoot(a:buffer, l:fake_linter) + + return !empty(l:root) ? l:root : v:null +endfunction + +function! ale_linters#python#pylsp#GetCommand(buffer) abort + let l:executable = ale_linters#python#pylsp#GetExecutable(a:buffer) + + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run pylsp' + \ : '' + + return ale#Escape(l:executable) . l:exec_args . ale#Pad(ale#Var(a:buffer, 'python_pylsp_options')) +endfunction + +call ale#linter#Define('python', { +\ 'name': 'pylsp', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#python#pylsp#GetExecutable'), +\ 'cwd': function('ale_linters#python#pylsp#GetCwd'), +\ 'command': function('ale_linters#python#pylsp#GetCommand'), +\ 'project_root': function('ale#python#FindProjectRoot'), +\ 'completion_filter': 'ale#completion#python#CompletionItemFilter', +\ 'lsp_config': {b -> ale#Var(b, 'python_pylsp_config')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/pyre.vim b/dot_vim/plugged/ale/ale_linters/python/pyre.vim new file mode 100644 index 0000000..5e5786f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/pyre.vim @@ -0,0 +1,44 @@ +" Author: dsifford +" Description: A performant type-checker supporting LSP for Python 3 created by Facebook + +call ale#Set('python_pyre_executable', 'pyre') +call ale#Set('python_pyre_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_pyre_auto_pipenv', 0) +call ale#Set('python_pyre_auto_poetry', 0) + +function! ale_linters#python#pyre#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pyre_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pyre_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_pyre', ['pyre']) +endfunction + +function! ale_linters#python#pyre#GetCommand(buffer) abort + let l:executable = ale_linters#python#pyre#GetExecutable(a:buffer) + let l:exec_args = (l:executable =~? 'pipenv\|poetry$' ? ' run pyre' : '') . ' persistent' + + return ale#Escape(l:executable) . l:exec_args +endfunction + +function! ale_linters#python#pyre#GetCwd(buffer) abort + let l:local_config = ale#path#FindNearestFile(a:buffer, '.pyre_configuration.local') + + return fnamemodify(l:local_config, ':h') +endfunction + +call ale#linter#Define('python', { +\ 'name': 'pyre', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#python#pyre#GetExecutable'), +\ 'command': function('ale_linters#python#pyre#GetCommand'), +\ 'project_root': function('ale#python#FindProjectRoot'), +\ 'completion_filter': 'ale#completion#python#CompletionItemFilter', +\ 'cwd': function('ale_linters#python#pyre#GetCwd'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/pyright.vim b/dot_vim/plugged/ale/ale_linters/python/pyright.vim new file mode 100644 index 0000000..5ce4660 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/pyright.vim @@ -0,0 +1,57 @@ +call ale#Set('python_pyright_executable', 'pyright-langserver') +call ale#Set('python_pyright_config', {}) + +function! ale_linters#python#pyright#GetConfig(buffer) abort + let l:config = deepcopy(ale#Var(a:buffer, 'python_pyright_config')) + + if !has_key(l:config, 'python') + let l:config.python = {} + endif + + if type(l:config.python) is v:t_dict + " Automatically detect the virtualenv path and use it. + if !has_key(l:config.python, 'venvPath') + let l:venv = ale#python#FindVirtualenv(a:buffer) + + if !empty(l:venv) + let l:config.python.venvPath = l:venv + endif + endif + + " Automatically use the version of Python in virtualenv. + if type(get(l:config.python, 'venvPath')) is v:t_string + \&& !empty(l:config.python.venvPath) + \&& !has_key(l:config.python, 'pythonPath') + let l:config.python.pythonPath = ale#path#Simplify( + \ l:config.python.venvPath + \ . (has('win32') ? '/Scripts/python' : '/bin/python') + \) + endif + endif + + return l:config +endfunction + +" Force the cwd of the server to be the same as the project root to +" fix issues with treating local files matching first or third party library +" names being imported incorrectly. +function! ale_linters#python#pyright#GetCwd(buffer) abort + let l:fake_linter = { + \ 'name': 'pyright', + \ 'project_root': function('ale#python#FindProjectRoot'), + \} + let l:root = ale#lsp_linter#FindProjectRoot(a:buffer, l:fake_linter) + + return !empty(l:root) ? l:root : v:null +endfunction + +call ale#linter#Define('python', { +\ 'name': 'pyright', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'python_pyright_executable')}, +\ 'cwd': function('ale_linters#python#pyright#GetCwd'), +\ 'command': '%e --stdio', +\ 'project_root': function('ale#python#FindProjectRoot'), +\ 'completion_filter': 'ale#completion#python#CompletionItemFilter', +\ 'lsp_config': function('ale_linters#python#pyright#GetConfig'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/refurb.vim b/dot_vim/plugged/ale/ale_linters/python/refurb.vim new file mode 100644 index 0000000..1ae77b7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/refurb.vim @@ -0,0 +1,73 @@ +" Author: Yining +" Description: refurb as linter for python files + +call ale#Set('python_refurb_executable', 'refurb') +call ale#Set('python_refurb_options', '') +call ale#Set('python_refurb_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_refurb_change_directory', 1) +call ale#Set('python_refurb_auto_pipenv', 0) +call ale#Set('python_refurb_auto_poetry', 0) + +function! ale_linters#python#refurb#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_refurb_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_refurb_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_refurb', ['refurb']) +endfunction + +function! ale_linters#python#refurb#GetCwd(buffer) abort + if ale#Var(a:buffer, 'python_refurb_change_directory') + " Run from project root if found, else from buffer dir. + let l:project_root = ale#python#FindProjectRoot(a:buffer) + + return !empty(l:project_root) ? l:project_root : '%s:h' + endif + + return '' +endfunction + +function! ale_linters#python#refurb#GetCommand(buffer) abort + let l:executable = ale_linters#python#refurb#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run refurb' + \ : '' + + return ale#Escape(l:executable) . l:exec_args + \ . ale#Pad(ale#Var(a:buffer, 'python_refurb_options')) + \ . ' %s' +endfunction + +function! ale_linters#python#refurb#Handle(buffer, lines) abort + "Example: path/to/file.py:3:17 [FURB109]: Replace `in [x, y, z]` with `in (x, y, z)` + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+)?:?\s*\[FURB(\d+)\]:\s*(.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'code': l:match[3] + 0, + \ 'text': l:match[4], + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'refurb', +\ 'executable': function('ale_linters#python#refurb#GetExecutable'), +\ 'cwd': function('ale_linters#python#refurb#GetCwd'), +\ 'command': function('ale_linters#python#refurb#GetCommand'), +\ 'callback': 'ale_linters#python#refurb#Handle', +\ 'output_stream': 'both', +\ 'read_buffer': 0, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/ruff.vim b/dot_vim/plugged/ale/ale_linters/python/ruff.vim new file mode 100644 index 0000000..67595fe --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/ruff.vim @@ -0,0 +1,84 @@ +" Author: Yining +" Description: ruff as linter for python files + +call ale#Set('python_ruff_executable', 'ruff') +call ale#Set('python_ruff_options', '') +call ale#Set('python_ruff_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_ruff_change_directory', 1) +call ale#Set('python_ruff_auto_pipenv', 0) +call ale#Set('python_ruff_auto_poetry', 0) + +call ale#fix#registry#Add('ruff', +\ 'ale#fixers#ruff#Fix', +\ ['python'], +\ 'A python linter/fixer for Python written in Rust' +\) + +function! ale_linters#python#ruff#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_ruff_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_ruff_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_ruff', ['ruff']) +endfunction + +function! ale_linters#python#ruff#GetCwd(buffer) abort + if ale#Var(a:buffer, 'python_ruff_change_directory') + " Run from project root if found, else from buffer dir. + let l:project_root = ale#python#FindProjectRoot(a:buffer) + + return !empty(l:project_root) ? l:project_root : '%s:h' + endif + + return '' +endfunction + +function! ale_linters#python#ruff#GetCommand(buffer, version) abort + let l:executable = ale_linters#python#ruff#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run ruff' + \ : '' + + " NOTE: ruff version `0.0.69` supports liniting input from stdin + return ale#Escape(l:executable) . l:exec_args + \ . ale#Pad(ale#Var(a:buffer, 'python_ruff_options')) + \ . ' --format text' + \ . (ale#semver#GTE(a:version, [0, 0, 69]) ? ' -' : ' %s') +endfunction + +function! ale_linters#python#ruff#Handle(buffer, lines) abort + "Example: path/to/file.py:10:5: E999 SyntaxError: unexpected indent + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+)?:? (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('python', { +\ 'name': 'ruff', +\ 'executable': function('ale_linters#python#ruff#GetExecutable'), +\ 'cwd': function('ale_linters#python#ruff#GetCwd'), +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale_linters#python#ruff#GetExecutable(buffer), +\ '%e --version', +\ function('ale_linters#python#ruff#GetCommand'), +\ )}, +\ 'callback': 'ale_linters#python#ruff#Handle', +\ 'output_stream': 'both', +\ 'read_buffer': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/unimport.vim b/dot_vim/plugged/ale/ale_linters/python/unimport.vim new file mode 100644 index 0000000..71fd80f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/unimport.vim @@ -0,0 +1,75 @@ +" Author: Author: Jon Parise + +call ale#Set('python_unimport_executable', 'unimport') +call ale#Set('python_unimport_options', '') +call ale#Set('python_unimport_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_unimport_auto_pipenv', 0) +call ale#Set('python_unimport_auto_poetry', 0) + +function! ale_linters#python#unimport#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_unimport_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_unimport_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_unimport', ['unimport']) +endfunction + +function! ale_linters#python#unimport#GetCommand(buffer) abort + let l:executable = ale_linters#python#unimport#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run unimport' + \ : '' + + return '%e' . l:exec_args + \ . ale#Pad(ale#Var(a:buffer, 'python_unimport_options')) + \ . ' --check' + \ . ' %t' +endfunction + + +function! ale_linters#python#unimport#GetCwd(buffer) abort + let l:project_root = ale#python#FindProjectRoot(a:buffer) + + return !empty(l:project_root) + \ ? l:project_root + \ : expand('#' . a:buffer . ':p:h') +endfunction + + +function! ale_linters#python#unimport#Handle(buffer, lines) abort + let l:output = ale#python#HandleTraceback(a:lines, 10) + + if !empty(l:output) + return l:output + endif + + " Matches lines like: + " + " urllib.parse at path/to/file.py:9 + let l:pattern = '\v(.+) at [^:]+:(\d+)$' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'type': 'W', + \ 'text': 'unused: ' . l:match[1], + \}) + endfor + + return l:output +endfunction + + +call ale#linter#Define('python', { +\ 'name': 'unimport', +\ 'executable': function('ale_linters#python#unimport#GetExecutable'), +\ 'cwd': function('ale_linters#python#unimport#GetCwd'), +\ 'command': function('ale_linters#python#unimport#GetCommand'), +\ 'callback': 'ale_linters#python#unimport#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/python/vulture.vim b/dot_vim/plugged/ale/ale_linters/python/vulture.vim new file mode 100644 index 0000000..a7ba186 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/python/vulture.vim @@ -0,0 +1,79 @@ +" Author: Yauheni Kirylau +" Description: vulture linting for python files + +call ale#Set('python_vulture_executable', 'vulture') +call ale#Set('python_vulture_options', '') +call ale#Set('python_vulture_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_vulture_change_directory', 1) + +" The directory to change to before running vulture +function! s:GetDir(buffer) abort + let l:project_root = ale#python#FindProjectRoot(a:buffer) + + return !empty(l:project_root) + \ ? l:project_root + \ : expand('#' . a:buffer . ':p:h') +endfunction + +function! ale_linters#python#vulture#GetExecutable(buffer) abort + return ale#python#FindExecutable(a:buffer, 'python_vulture', ['vulture']) +endfunction + +function! ale_linters#python#vulture#GetCwd(buffer) abort + if !ale#Var(a:buffer, 'python_vulture_change_directory') + return '' + endif + + return s:GetDir(a:buffer) +endfunction + +function! ale_linters#python#vulture#GetCommand(buffer) abort + let l:executable = ale_linters#python#vulture#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run vulture' + \ : '' + let l:lint_dest = ale#Var(a:buffer, 'python_vulture_change_directory') + \ ? ' .' + \ : ' %s' + + return ale#Escape(l:executable) . l:exec_args + \ . ' ' + \ . ale#Var(a:buffer, 'python_vulture_options') + \ . l:lint_dest +endfunction + + +function! ale_linters#python#vulture#Handle(buffer, lines) abort + let l:output = ale#python#HandleTraceback(a:lines, 10) + + if !empty(l:output) + return l:output + endif + + " Matches patterns line the following: + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+): (.*)$' + let l:dir = s:GetDir(a:buffer) + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:abspath = ale#path#GetAbsPath(l:dir, l:match[1]) + let l:item = { + \ 'filename': l:abspath, + \ 'lnum': l:match[2] + 0, + \ 'text': l:match[3], + \ 'type': 'W', + \} + call add(l:output, l:item) + endfor + + return l:output +endfunction + + +call ale#linter#Define('python', { +\ 'name': 'vulture', +\ 'executable': function('ale_linters#python#vulture#GetExecutable'), +\ 'cwd': function('ale_linters#python#vulture#GetCwd'), +\ 'command': function('ale_linters#python#vulture#GetCommand'), +\ 'callback': 'ale_linters#python#vulture#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/qml/qmlfmt.vim b/dot_vim/plugged/ale/ale_linters/qml/qmlfmt.vim new file mode 100644 index 0000000..11cc941 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/qml/qmlfmt.vim @@ -0,0 +1,25 @@ +" Author: pylipp (www.github.com/pylipp) +" Description: qmlfmt for QML files + +call ale#Set('qml_qmlfmt_executable', 'qmlfmt') + +" Find lines like +" Error:11:1: Expected token `}' +function! ale_linters#qml#qmlfmt#Handle(buffer, lines) abort + let l:pattern = '\v^(Error|Warning):(\d+):(\d+): (.+)$' + + return map(ale#util#GetMatches(a:lines, l:pattern), "{ + \ 'lnum': v:val[2] + 0, + \ 'col': v:val[3] + 0, + \ 'text': v:val[4], + \ 'type': v:val[1] is# 'Warning' ? 'W' : 'E', + \}") +endfunction + +call ale#linter#Define('qml', { +\ 'name': 'qmlfmt', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'qml_qmlfmt_executable')}, +\ 'command': '%e -e', +\ 'callback': 'ale_linters#qml#qmlfmt#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/qml/qmllint.vim b/dot_vim/plugged/ale/ale_linters/qml/qmllint.vim new file mode 100644 index 0000000..c2258a1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/qml/qmllint.vim @@ -0,0 +1,29 @@ +" Author: pylipp (www.github.com/pylipp) +" Description: qmllint for QML files + +" Find lines like +" /home/foo_user42/code-base/qml/Screen.qml:11 : Expected token `}' +function! ale_linters#qml#qmllint#Handle(buffer, lines) abort + let l:pattern = '\v^[/_-a-zA-z0-9\. ]+:(\d+) : (.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'col': 0, + \ 'text': l:match[2], + \ 'type': 'E', + \} + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('qml', { +\ 'name': 'qmllint', +\ 'output_stream': 'stderr', +\ 'executable': 'qmllint', +\ 'command': 'qmllint %t', +\ 'callback': 'ale_linters#qml#qmllint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/r/languageserver.vim b/dot_vim/plugged/ale/ale_linters/r/languageserver.vim new file mode 100644 index 0000000..bab869d --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/r/languageserver.vim @@ -0,0 +1,27 @@ +" Author: Eric Zhao <21zhaoe@protonmail.com> +" Author: ourigen +" Description: Implementation of the Language Server Protocol for R. + +call ale#Set('r_languageserver_cmd', 'languageserver::run()') +call ale#Set('r_languageserver_config', {}) + +function! ale_linters#r#languageserver#GetCommand(buffer) abort + let l:cmd_string = ale#Var(a:buffer, 'r_languageserver_cmd') + + return 'Rscript --no-save --no-restore --no-site-file --no-init-file -e ' . ale#Escape(l:cmd_string) +endfunction + +function! ale_linters#r#languageserver#GetProjectRoot(buffer) abort + let l:project_root = ale#path#FindNearestFile(a:buffer, '.Rprofile') + + return !empty(l:project_root) ? fnamemodify(l:project_root, ':h') : fnamemodify(a:buffer, ':h') +endfunction + +call ale#linter#Define('r', { +\ 'name': 'languageserver', +\ 'lsp': 'stdio', +\ 'lsp_config': {b -> ale#Var(b, 'r_languageserver_config')}, +\ 'executable': 'Rscript', +\ 'command': function('ale_linters#r#languageserver#GetCommand'), +\ 'project_root': function('ale_linters#r#languageserver#GetProjectRoot') +\}) diff --git a/dot_vim/plugged/ale/ale_linters/r/lintr.vim b/dot_vim/plugged/ale/ale_linters/r/lintr.vim new file mode 100644 index 0000000..339ad2b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/r/lintr.vim @@ -0,0 +1,35 @@ +" Author: Michel Lang , w0rp , +" Fenner Macrae , +" ourigen +" Description: This file adds support for checking R code with lintr. + +let g:ale_r_lintr_options = get(g:, 'ale_r_lintr_options', 'with_defaults()') +" A reasonable alternative default: +" get(g:, 'ale_r_lintr_options', 'with_defaults(object_usage_linter = NULL)') + + +let g:ale_r_lintr_lint_package = get(g:, 'ale_r_lintr_lint_package', 0) + +function! ale_linters#r#lintr#GetCommand(buffer) abort + if ale#Var(a:buffer, 'r_lintr_lint_package') + let l:lint_cmd = 'lint_package(cache = FALSE, linters = ' + \ . ale#Var(a:buffer, 'r_lintr_options') . ')' + else + let l:lint_cmd = 'lint(cache = FALSE, commandArgs(TRUE), ' + \ . ale#Var(a:buffer, 'r_lintr_options') . ')' + endif + + let l:cmd_string = 'suppressPackageStartupMessages(library(lintr));' + \ . l:lint_cmd + + return 'Rscript --no-save --no-restore --no-site-file --no-init-file -e ' . ale#Escape(l:cmd_string) . ' %t' +endfunction + +call ale#linter#Define('r', { +\ 'name': 'lintr', +\ 'executable': 'Rscript', +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#r#lintr#GetCommand'), +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\ 'output_stream': 'both', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/racket/langserver.vim b/dot_vim/plugged/ale/ale_linters/racket/langserver.vim new file mode 100644 index 0000000..ec80ed7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/racket/langserver.vim @@ -0,0 +1,7 @@ +call ale#linter#Define('racket', { +\ 'name': 'racket_langserver', +\ 'lsp': 'stdio', +\ 'executable': 'racket', +\ 'command': '%e -l racket-langserver', +\ 'project_root': function('ale#racket#FindProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/racket/raco.vim b/dot_vim/plugged/ale/ale_linters/racket/raco.vim new file mode 100644 index 0000000..5b26065 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/racket/raco.vim @@ -0,0 +1,34 @@ +" Author: aqui18 +" Description: This file adds support for checking Racket code with raco. +" This is the same form of syntax-checking used by DrRacket as well. The +" downside is that it will only catch the first error, but none of the +" subsequent ones. This is due to how evaluation in Racket works. + +function! ale_linters#racket#raco#Handle(buffer, lines) abort + " Matches patterns + " :: + " eg: + " info.rkt:4:0: infotab-module: not a well-formed definition + let l:pattern = '^\(\s\)\@!\(.\+\):\(\d\+\):\(\d\+\): \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'filename': l:match[2], + \ 'lnum': l:match[3] + 0, + \ 'col': l:match[4] + 0, + \ 'type': 'E', + \ 'text': l:match[5], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('racket', { +\ 'name': 'raco', +\ 'executable': 'raco', +\ 'output_stream': 'stderr', +\ 'command': 'raco expand %s', +\ 'callback': 'ale_linters#racket#raco#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/reason/ls.vim b/dot_vim/plugged/ale/ale_linters/reason/ls.vim new file mode 100644 index 0000000..fb1114a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/reason/ls.vim @@ -0,0 +1,23 @@ +" Author: David Buchan-Swanson +" Description: Integrate ALE with reason-language-server. + +call ale#Set('reason_ls_executable', '') + +function! ale_linters#reason#ls#FindProjectRoot(buffer) abort + let l:reason_config = ale#path#FindNearestFile(a:buffer, 'bsconfig.json') + + if !empty(l:reason_config) + return fnamemodify(l:reason_config, ':h') + endif + + return '' +endfunction + +call ale#linter#Define('reason', { +\ 'name': 'reason-language-server', +\ 'lsp': 'stdio', +\ 'executable': {buffer -> ale#Var(buffer, 'reason_ls_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale_linters#reason#ls#FindProjectRoot'), +\ 'language': 'reason', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/reason/merlin.vim b/dot_vim/plugged/ale/ale_linters/reason/merlin.vim new file mode 100644 index 0000000..7bef7df --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/reason/merlin.vim @@ -0,0 +1,17 @@ +" Author: Andrey Popp -- @andreypopp +" Description: Report errors in ReasonML code with Merlin + +if !exists('g:merlin') + finish +endif + +function! ale_linters#reason#merlin#Handle(buffer, lines) abort + return merlin#ErrorLocList() +endfunction + +call ale#linter#Define('reason', { +\ 'name': 'merlin', +\ 'executable': 'ocamlmerlin', +\ 'command': 'true', +\ 'callback': 'ale_linters#reason#merlin#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/reason/ols.vim b/dot_vim/plugged/ale/ale_linters/reason/ols.vim new file mode 100644 index 0000000..9fbd9b4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/reason/ols.vim @@ -0,0 +1,14 @@ +" Author: Michael Jungo +" Description: A language server for Reason + +call ale#Set('reason_ols_executable', 'ocaml-language-server') +call ale#Set('reason_ols_use_global', get(g:, 'ale_use_global_executables', 0)) + +call ale#linter#Define('reason', { +\ 'name': 'ols', +\ 'lsp': 'stdio', +\ 'executable': function('ale#handlers#ols#GetExecutable'), +\ 'command': function('ale#handlers#ols#GetCommand'), +\ 'language': function('ale#handlers#ols#GetLanguage'), +\ 'project_root': function('ale#handlers#ols#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rego/cspell.vim b/dot_vim/plugged/ale/ale_linters/rego/cspell.vim new file mode 100644 index 0000000..a54a537 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rego/cspell.vim @@ -0,0 +1,4 @@ +scriptencoding utf-8 +" Description: cspell support for rego files. + +call ale#handlers#cspell#DefineLinter('rego') diff --git a/dot_vim/plugged/ale/ale_linters/rego/opacheck.vim b/dot_vim/plugged/ale/ale_linters/rego/opacheck.vim new file mode 100644 index 0000000..77d8c93 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rego/opacheck.vim @@ -0,0 +1,56 @@ +" Description: opa check for rego files + +call ale#Set('rego_opacheck_executable', 'opa') +call ale#Set('rego_opacheck_options', '') + +function! ale_linters#rego#opacheck#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'rego_opacheck_executable') +endfunction + +function! ale_linters#rego#opacheck#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'rego_opacheck_options') + + return ale#Escape(ale_linters#rego#opacheck#GetExecutable(a:buffer)) + \ . ' check %s --format json ' + \ . (!empty(l:options) ? ' ' . l:options : '') +endfunction + +function! ale_linters#rego#opacheck#Handle(buffer, lines) abort + let l:output = [] + + let l:errors = ale#util#FuzzyJSONDecode(a:lines, {'errors': []}) + let l:dir = expand('#' . a:buffer . ':p:h') + let l:file = expand('#' . a:buffer . ':p') + + for l:error in l:errors['errors'] + if has_key(l:error, 'location') + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:error['location']['file']), + \ 'lnum': l:error['location']['row'], + \ 'col': l:error['location']['col'], + \ 'text': l:error['message'], + \ 'code': l:error['code'], + \ 'type': 'E', + \}) + else + call add(l:output, { + \ 'filename': l:file, + \ 'lnum': 0, + \ 'col': 0, + \ 'text': l:error['message'], + \ 'code': l:error['code'], + \ 'type': 'E', + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('rego', { +\ 'name': 'opacheck', +\ 'output_stream': 'both', +\ 'executable': function('ale_linters#rego#opacheck#GetExecutable'), +\ 'command': function('ale_linters#rego#opacheck#GetCommand'), +\ 'callback': 'ale_linters#rego#opacheck#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/review/redpen.vim b/dot_vim/plugged/ale/ale_linters/review/redpen.vim new file mode 100644 index 0000000..0006cab --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/review/redpen.vim @@ -0,0 +1,9 @@ +" Author: rhysd https://rhysd.github.io +" Description: Redpen, a proofreading tool (http://redpen.cc) + +call ale#linter#Define('review', { +\ 'name': 'redpen', +\ 'executable': 'redpen', +\ 'command': 'redpen -f review -r json %t', +\ 'callback': 'ale#handlers#redpen#HandleRedpenOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/robot/rflint.vim b/dot_vim/plugged/ale/ale_linters/robot/rflint.vim new file mode 100644 index 0000000..8fe2d79 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/robot/rflint.vim @@ -0,0 +1,46 @@ +" Author: Samuel Branisa +" Description: rflint linting for robot framework files + +call ale#Set('robot_rflint_executable', 'rflint') + +function! ale_linters#robot#rflint#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'robot_rflint_executable') +endfunction + +function! ale_linters#robot#rflint#GetCommand(buffer) abort + let l:executable = ale_linters#robot#rflint#GetExecutable(a:buffer) + let l:flags = '--format' + \ . ' "{filename}:{severity}:{linenumber}:{char}:{rulename}:{message}"' + + return l:executable + \ . ' ' + \ . l:flags + \ . ' %s' +endfunction + +function! ale_linters#robot#rflint#Handle(buffer, lines) abort + let l:pattern = '\v^([[:alnum:][:punct:]]+):(W|E):([[:digit:]]+):([[:digit:]]+):([[:alnum:]]+):(.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'filename': l:match[1], + \ 'type': l:match[2], + \ 'lnum': str2nr(l:match[3]), + \ 'col': str2nr(l:match[4]), + \ 'text': l:match[5], + \ 'detail': l:match[6], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('robot', { +\ 'name': 'rflint', +\ 'executable': function('ale_linters#robot#rflint#GetExecutable'), +\ 'command': function('ale_linters#robot#rflint#GetCommand'), +\ 'callback': 'ale_linters#robot#rflint#Handle', +\}) + diff --git a/dot_vim/plugged/ale/ale_linters/rst/alex.vim b/dot_vim/plugged/ale/ale_linters/rst/alex.vim new file mode 100644 index 0000000..e7ca6fa --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rst/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for rst files + +call ale#handlers#alex#DefineLinter('rst', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/rst/cspell.vim b/dot_vim/plugged/ale/ale_linters/rst/cspell.vim new file mode 100644 index 0000000..14cfb42 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rst/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for ReStructuredText files. + +call ale#handlers#cspell#DefineLinter('rst') diff --git a/dot_vim/plugged/ale/ale_linters/rst/proselint.vim b/dot_vim/plugged/ale/ale_linters/rst/proselint.vim new file mode 100644 index 0000000..018347a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rst/proselint.vim @@ -0,0 +1,9 @@ +" Author: Daniel M. Capella https://github.com/polyzen +" Description: proselint for reStructuredText files + +call ale#linter#Define('rst', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rst/redpen.vim b/dot_vim/plugged/ale/ale_linters/rst/redpen.vim new file mode 100644 index 0000000..ac966c5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rst/redpen.vim @@ -0,0 +1,9 @@ +" Author: rhysd https://rhysd.github.io +" Description: Redpen, a proofreading tool (http://redpen.cc) + +call ale#linter#Define('rst', { +\ 'name': 'redpen', +\ 'executable': 'redpen', +\ 'command': 'redpen -f rest -r json %t', +\ 'callback': 'ale#handlers#redpen#HandleRedpenOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rst/rstcheck.vim b/dot_vim/plugged/ale/ale_linters/rst/rstcheck.vim new file mode 100644 index 0000000..e0cf079 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rst/rstcheck.vim @@ -0,0 +1,31 @@ +" Author: John Nduli https://github.com/jnduli +" Description: Rstcheck for reStructuredText files + +function! ale_linters#rst#rstcheck#Handle(buffer, lines) abort + " matches: 'bad_rst.rst:1: (SEVERE/4) Title overline & underline + " mismatch.' + let l:pattern = '\v^(.+):(\d*): \(([a-zA-Z]*)/\d*\) (.+)$' + let l:dir = expand('#' . a:buffer . ':p:h') + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'col': 0, + \ 'type': l:match[3] is# 'SEVERE' ? 'E' : 'W', + \ 'text': l:match[4], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('rst', { +\ 'name': 'rstcheck', +\ 'executable': 'rstcheck', +\ 'cwd': '%s:h', +\ 'command': 'rstcheck %t', +\ 'callback': 'ale_linters#rst#rstcheck#Handle', +\ 'output_stream': 'both', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rst/textlint.vim b/dot_vim/plugged/ale/ale_linters/rst/textlint.vim new file mode 100644 index 0000000..56dd8db --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rst/textlint.vim @@ -0,0 +1,9 @@ +" Author: hokorobi +" Description: textlint, a proofreading tool (https://textlint.github.io/) + +call ale#linter#Define('rst', { +\ 'name': 'textlint', +\ 'executable': function('ale#handlers#textlint#GetExecutable'), +\ 'command': function('ale#handlers#textlint#GetCommand'), +\ 'callback': 'ale#handlers#textlint#HandleTextlintOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rst/vale.vim b/dot_vim/plugged/ale/ale_linters/rst/vale.vim new file mode 100644 index 0000000..2e654dc --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rst/vale.vim @@ -0,0 +1,9 @@ +" Author: chew-z https://github.com/chew-z +" Description: vale for RST files + +call ale#linter#Define('rst', { +\ 'name': 'vale', +\ 'executable': 'vale', +\ 'command': 'vale --output=JSON %t', +\ 'callback': 'ale#handlers#vale#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rst/writegood.vim b/dot_vim/plugged/ale/ale_linters/rst/writegood.vim new file mode 100644 index 0000000..26b1152 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rst/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for reStructuredText files + +call ale#handlers#writegood#DefineLinter('rst') diff --git a/dot_vim/plugged/ale/ale_linters/ruby/brakeman.vim b/dot_vim/plugged/ale/ale_linters/ruby/brakeman.vim new file mode 100644 index 0000000..2dc4874 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/brakeman.vim @@ -0,0 +1,51 @@ +" Author: Eddie Lebow https://github.com/elebow +" Description: Brakeman, a static analyzer for Rails security + +call ale#Set('ruby_brakeman_options', '') +call ale#Set('ruby_brakeman_executable', 'brakeman') +call ale#Set('ruby_brakeman_options', '') + +function! ale_linters#ruby#brakeman#Handle(buffer, lines) abort + let l:output = [] + let l:json = ale#util#FuzzyJSONDecode(a:lines, {}) + let l:sep = has('win32') ? '\' : '/' + " Brakeman always outputs paths relative to the Rails app root + let l:rails_root = ale#ruby#FindRailsRoot(a:buffer) + + for l:warning in get(l:json, 'warnings', []) + let l:text = l:warning.warning_type . ' ' . l:warning.message . ' (' . l:warning.confidence . ')' + let l:line = l:warning.line != v:null ? l:warning.line : 1 + + call add(l:output, { + \ 'filename': l:rails_root . l:sep . l:warning.file, + \ 'lnum': l:line, + \ 'type': 'W', + \ 'text': l:text, + \}) + endfor + + return l:output +endfunction + +function! ale_linters#ruby#brakeman#GetCommand(buffer) abort + let l:rails_root = ale#ruby#FindRailsRoot(a:buffer) + + if l:rails_root is? '' + return '' + endif + + let l:executable = ale#Var(a:buffer, 'ruby_brakeman_executable') + + return ale#ruby#EscapeExecutable(l:executable, 'brakeman') + \ . ' -f json -q ' + \ . ale#Var(a:buffer, 'ruby_brakeman_options') + \ . ' -p ' . ale#Escape(l:rails_root) +endfunction + +call ale#linter#Define('ruby', { +\ 'name': 'brakeman', +\ 'executable': {b -> ale#Var(b, 'ruby_brakeman_executable')}, +\ 'command': function('ale_linters#ruby#brakeman#GetCommand'), +\ 'callback': 'ale_linters#ruby#brakeman#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ruby/cspell.vim b/dot_vim/plugged/ale/ale_linters/ruby/cspell.vim new file mode 100644 index 0000000..780356b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Ruby files. + +call ale#handlers#cspell#DefineLinter('ruby') diff --git a/dot_vim/plugged/ale/ale_linters/ruby/debride.vim b/dot_vim/plugged/ale/ale_linters/ruby/debride.vim new file mode 100644 index 0000000..3b2cc44 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/debride.vim @@ -0,0 +1,42 @@ +" Author: Eddie Lebow https://github.com/elebow +" Description: debride, a dead method detector for Ruby files + +call ale#Set('ruby_debride_executable', 'debride') +call ale#Set('ruby_debride_options', '') + +function! ale_linters#ruby#debride#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'ruby_debride_executable') + + return ale#ruby#EscapeExecutable(l:executable, 'debride') + \ . ale#Var(a:buffer, 'ruby_debride_options') + \ . ' %s' +endfunction + +function! ale_linters#ruby#debride#HandleOutput(buffer, lines) abort + let l:output = [] + + for l:line in a:lines + if l:line !~# '^ ' + continue + endif + + let l:elements = split(l:line) + let l:method_name = l:elements[0] + let l:lnum = split(l:elements[1], ':')[1] + + call add(l:output, { + \ 'lnum': 0 + l:lnum, + \ 'text': 'Possible unused method: ' . l:method_name, + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('ruby', { +\ 'name': 'debride', +\ 'executable': {b -> ale#Var(b, 'ruby_debride_executable')}, +\ 'command': function('ale_linters#ruby#debride#GetCommand'), +\ 'callback': 'ale_linters#ruby#debride#HandleOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ruby/rails_best_practices.vim b/dot_vim/plugged/ale/ale_linters/ruby/rails_best_practices.vim new file mode 100644 index 0000000..3664664 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/rails_best_practices.vim @@ -0,0 +1,49 @@ +" Author: Eddie Lebow https://github.com/elebow +" Description: rails_best_practices, a code metric tool for rails projects + +call ale#Set('ruby_rails_best_practices_options', '') +call ale#Set('ruby_rails_best_practices_executable', 'rails_best_practices') + +function! ale_linters#ruby#rails_best_practices#Handle(buffer, lines) abort + let l:output = [] + + for l:warning in ale#util#FuzzyJSONDecode(a:lines, []) + if !ale#path#IsBufferPath(a:buffer, l:warning.filename) + continue + endif + + call add(l:output, { + \ 'lnum': l:warning.line_number + 0, + \ 'type': 'W', + \ 'text': l:warning.message, + \}) + endfor + + return l:output +endfunction + +function! ale_linters#ruby#rails_best_practices#GetCommand(buffer) abort + let l:rails_root = ale#ruby#FindRailsRoot(a:buffer) + + if l:rails_root is? '' + return '' + endif + + let l:executable = ale#Var(a:buffer, 'ruby_rails_best_practices_executable') + let l:output_file = has('win32') ? '%t ' : '/dev/stdout ' + let l:cat_file = has('win32') ? '; type %t' : '' + + return ale#ruby#EscapeExecutable(l:executable, 'rails_best_practices') + \ . ' --silent -f json --output-file ' . l:output_file + \ . ale#Var(a:buffer, 'ruby_rails_best_practices_options') + \ . ale#Escape(l:rails_root) + \ . l:cat_file +endfunction + +call ale#linter#Define('ruby', { +\ 'name': 'rails_best_practices', +\ 'executable': {b -> ale#Var(b, 'ruby_rails_best_practices_executable')}, +\ 'command': function('ale_linters#ruby#rails_best_practices#GetCommand'), +\ 'callback': 'ale_linters#ruby#rails_best_practices#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ruby/reek.vim b/dot_vim/plugged/ale/ale_linters/ruby/reek.vim new file mode 100644 index 0000000..b6fa9d7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/reek.vim @@ -0,0 +1,69 @@ +" Author: Eddie Lebow https://github.com/elebow +" Description: Reek, a code smell detector for Ruby files + +call ale#Set('ruby_reek_show_context', 0) +call ale#Set('ruby_reek_show_wiki_link', 0) +call ale#Set('ruby_reek_options', '') +call ale#Set('ruby_reek_executable', 'reek') + +function! ale_linters#ruby#reek#GetCommand(buffer, version) abort + let l:executable = ale#Var(a:buffer, 'ruby_reek_executable') + + " Tell reek what the filename is if the version of reek is new enough. + let l:display_name_args = ale#semver#GTE(a:version, [5, 0, 0]) + \ ? ' --stdin-filename %s' + \ : '' + + return ale#ruby#EscapeExecutable(l:executable, 'reek') + \ . ' -f json --no-progress --no-color --force-exclusion' + \ . l:display_name_args +endfunction + +function! s:GetDocumentationLink(error) abort + return get(a:error, 'documentation_link', get(a:error, 'wiki_link', '')) +endfunction + +function! s:BuildText(buffer, error) abort + let l:parts = [] + + if ale#Var(a:buffer, 'ruby_reek_show_context') + call add(l:parts, a:error.context) + endif + + call add(l:parts, a:error.message) + + if ale#Var(a:buffer, 'ruby_reek_show_wiki_link') + call add(l:parts, '[' . s:GetDocumentationLink(a:error) . ']') + endif + + return join(l:parts, ' ') +endfunction + +function! ale_linters#ruby#reek#Handle(buffer, lines) abort + let l:output = [] + + for l:error in ale#util#FuzzyJSONDecode(a:lines, []) + for l:location in l:error.lines + call add(l:output, { + \ 'lnum': l:location, + \ 'type': 'W', + \ 'text': s:BuildText(a:buffer, l:error), + \ 'code': l:error.smell_type, + \}) + endfor + endfor + + return l:output +endfunction + +call ale#linter#Define('ruby', { +\ 'name': 'reek', +\ 'executable': {b -> ale#Var(b, 'ruby_reek_executable')}, +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale#Var(buffer, 'ruby_reek_executable'), +\ '%e --version', +\ function('ale_linters#ruby#reek#GetCommand'), +\ )}, +\ 'callback': 'ale_linters#ruby#reek#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ruby/rubocop.vim b/dot_vim/plugged/ale/ale_linters/ruby/rubocop.vim new file mode 100644 index 0000000..483806a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/rubocop.vim @@ -0,0 +1,31 @@ +" Author: ynonp - https://github.com/ynonp, Eddie Lebow https://github.com/elebow +" Description: RuboCop, a code style analyzer for Ruby files + +call ale#Set('ruby_rubocop_executable', 'rubocop') +call ale#Set('ruby_rubocop_options', '') + +function! ale_linters#ruby#rubocop#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'ruby_rubocop_executable') + + return ale#ruby#EscapeExecutable(l:executable, 'rubocop') + \ . ' --format json --force-exclusion ' + \ . ale#Var(a:buffer, 'ruby_rubocop_options') + \ . ' --stdin %s' +endfunction + +function! ale_linters#ruby#rubocop#GetType(severity) abort + if a:severity is? 'convention' + \|| a:severity is? 'warning' + \|| a:severity is? 'refactor' + return 'W' + endif + + return 'E' +endfunction + +call ale#linter#Define('ruby', { +\ 'name': 'rubocop', +\ 'executable': {b -> ale#Var(b, 'ruby_rubocop_executable')}, +\ 'command': function('ale_linters#ruby#rubocop#GetCommand'), +\ 'callback': 'ale#ruby#HandleRubocopOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ruby/ruby.vim b/dot_vim/plugged/ale/ale_linters/ruby/ruby.vim new file mode 100644 index 0000000..621fcbc --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/ruby.vim @@ -0,0 +1,12 @@ +" Author: Brandon Roehl - https://github.com/BrandonRoehl +" Description: Ruby MRI for Ruby files + +call ale#Set('ruby_ruby_executable', 'ruby') + +call ale#linter#Define('ruby', { +\ 'name': 'ruby', +\ 'executable': {b -> ale#Var(b, 'ruby_ruby_executable')}, +\ 'command': '%e -w -c %t', +\ 'output_stream': 'stderr', +\ 'callback': 'ale#handlers#ruby#HandleSyntaxErrors', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ruby/solargraph.vim b/dot_vim/plugged/ale/ale_linters/ruby/solargraph.vim new file mode 100644 index 0000000..bf54a55 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/solargraph.vim @@ -0,0 +1,22 @@ +" Author: Horacio Sanson - https://github.com/hsanson +" Description: Solargraph Language Server https://solargraph.org/ +" +" Author: Devon Meunier +" Description: updated to use stdio + +call ale#Set('ruby_solargraph_executable', 'solargraph') +call ale#Set('ruby_solargraph_options', {}) + +function! ale_linters#ruby#solargraph#GetCommand(buffer) abort + return '%e' . ale#Pad('stdio') +endfunction + +call ale#linter#Define('ruby', { +\ 'name': 'solargraph', +\ 'lsp': 'stdio', +\ 'language': 'ruby', +\ 'executable': {b -> ale#Var(b, 'ruby_solargraph_executable')}, +\ 'command': function('ale_linters#ruby#solargraph#GetCommand'), +\ 'project_root': function('ale#ruby#FindProjectRoot'), +\ 'initialization_options': {b -> ale#Var(b, 'ruby_solargraph_options')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/ruby/sorbet.vim b/dot_vim/plugged/ale/ale_linters/ruby/sorbet.vim new file mode 100644 index 0000000..c67e20c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/sorbet.vim @@ -0,0 +1,26 @@ +call ale#Set('ruby_sorbet_executable', 'srb') +call ale#Set('ruby_sorbet_options', '') +call ale#Set('ruby_sorbet_enable_watchman', 0) + +function! ale_linters#ruby#sorbet#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'ruby_sorbet_executable') + let l:options = ale#Var(a:buffer, 'ruby_sorbet_options') + let l:enable_watchman = ale#Var(a:buffer, 'ruby_sorbet_enable_watchman') + + return ale#ruby#EscapeExecutable(l:executable, 'srb') + \ . ' tc' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --lsp' + \ . (l:enable_watchman ? '' : ' --disable-watchman') +endfunction + +call ale#linter#Define('ruby', { +\ 'name': 'sorbet', +\ 'aliases': ['srb'], +\ 'lsp': 'stdio', +\ 'language': 'ruby', +\ 'executable': {b -> ale#Var(b, 'ruby_sorbet_executable')}, +\ 'command': function('ale_linters#ruby#sorbet#GetCommand'), +\ 'project_root': function('ale#ruby#FindProjectRoot') +\}) + diff --git a/dot_vim/plugged/ale/ale_linters/ruby/standardrb.vim b/dot_vim/plugged/ale/ale_linters/ruby/standardrb.vim new file mode 100644 index 0000000..6ccfd2d --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/ruby/standardrb.vim @@ -0,0 +1,23 @@ +" Author: Justin Searls https://github.com/searls, ynonp - https://github.com/ynonp, Eddie Lebow https://github.com/elebow +" based on the ale rubocop linter +" Description: StandardRB - Ruby Style Guide, with linter & automatic code fixer + +call ale#Set('ruby_standardrb_executable', 'standardrb') +call ale#Set('ruby_standardrb_options', '') + +function! ale_linters#ruby#standardrb#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'ruby_standardrb_executable') + + return ale#ruby#EscapeExecutable(l:executable, 'standardrb') + \ . ' --format json --force-exclusion ' + \ . ale#Var(a:buffer, 'ruby_standardrb_options') + \ . ' --stdin %s' +endfunction + +" standardrb is based on RuboCop so the callback is the same +call ale#linter#Define('ruby', { +\ 'name': 'standardrb', +\ 'executable': {b -> ale#Var(b, 'ruby_standardrb_executable')}, +\ 'command': function('ale_linters#ruby#standardrb#GetCommand'), +\ 'callback': 'ale#ruby#HandleRubocopOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rust/analyzer.vim b/dot_vim/plugged/ale/ale_linters/rust/analyzer.vim new file mode 100644 index 0000000..3ead387 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rust/analyzer.vim @@ -0,0 +1,36 @@ +" Author: Jon Gjengset +" Description: The next generation language server for Rust + +call ale#Set('rust_analyzer_executable', 'rust-analyzer') +call ale#Set('rust_analyzer_config', {}) + +function! ale_linters#rust#analyzer#GetCommand(buffer) abort + return '%e' +endfunction + +function! ale_linters#rust#analyzer#GetProjectRoot(buffer) abort + " Try to find nearest Cargo.toml for cargo projects + let l:cargo_file = ale#path#FindNearestFile(a:buffer, 'Cargo.toml') + + if !empty(l:cargo_file) + return fnamemodify(l:cargo_file, ':h') + endif + + " Try to find nearest rust-project.json for non-cargo projects + let l:rust_project = ale#path#FindNearestFile(a:buffer, 'rust-project.json') + + if !empty(l:rust_project) + return fnamemodify(l:rust_project, ':h') + endif + + return '' +endfunction + +call ale#linter#Define('rust', { +\ 'name': 'analyzer', +\ 'lsp': 'stdio', +\ 'initialization_options': {b -> ale#Var(b, 'rust_analyzer_config')}, +\ 'executable': {b -> ale#Var(b, 'rust_analyzer_executable')}, +\ 'command': function('ale_linters#rust#analyzer#GetCommand'), +\ 'project_root': function('ale_linters#rust#analyzer#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rust/cargo.vim b/dot_vim/plugged/ale/ale_linters/rust/cargo.vim new file mode 100644 index 0000000..37fd10a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rust/cargo.vim @@ -0,0 +1,110 @@ +" Author: Daniel Schemala , +" Ivan Petkov +" Description: rustc invoked by cargo for rust files + +call ale#Set('rust_cargo_use_check', 1) +call ale#Set('rust_cargo_check_all_targets', 0) +call ale#Set('rust_cargo_check_examples', 0) +call ale#Set('rust_cargo_check_tests', 0) +call ale#Set('rust_cargo_avoid_whole_workspace', 1) +call ale#Set('rust_cargo_default_feature_behavior', 'default') +call ale#Set('rust_cargo_include_features', '') +call ale#Set('rust_cargo_use_clippy', 0) +call ale#Set('rust_cargo_clippy_options', '') +call ale#Set('rust_cargo_target_dir', '') + +function! ale_linters#rust#cargo#GetCargoExecutable(bufnr) abort + if ale#path#FindNearestFile(a:bufnr, 'Cargo.toml') isnot# '' + return 'cargo' + else + " if there is no Cargo.toml file, we don't use cargo even if it exists, + " so we return '', because executable('') apparently always fails + return '' + endif +endfunction + +function! ale_linters#rust#cargo#GetCwd(buffer) abort + if ale#Var(a:buffer, 'rust_cargo_avoid_whole_workspace') + let l:nearest_cargo = ale#path#FindNearestFile(a:buffer, 'Cargo.toml') + let l:nearest_cargo_dir = fnamemodify(l:nearest_cargo, ':h') + + if l:nearest_cargo_dir isnot# '.' + return l:nearest_cargo_dir + endif + endif + + return '' +endfunction + +function! ale_linters#rust#cargo#GetCommand(buffer, version) abort + let l:use_check = ale#Var(a:buffer, 'rust_cargo_use_check') + \ && ale#semver#GTE(a:version, [0, 17, 0]) + let l:use_all_targets = ale#Var(a:buffer, 'rust_cargo_check_all_targets') + \ && ale#semver#GTE(a:version, [0, 22, 0]) + let l:use_examples = ale#Var(a:buffer, 'rust_cargo_check_examples') + \ && ale#semver#GTE(a:version, [0, 22, 0]) + let l:use_tests = ale#Var(a:buffer, 'rust_cargo_check_tests') + \ && ale#semver#GTE(a:version, [0, 22, 0]) + let l:target_dir = ale#Var(a:buffer, 'rust_cargo_target_dir') + let l:use_target_dir = !empty(l:target_dir) + \ && ale#semver#GTE(a:version, [0, 17, 0]) + + let l:include_features = ale#Var(a:buffer, 'rust_cargo_include_features') + + if !empty(l:include_features) + let l:include_features = ' --features ' . ale#Escape(l:include_features) + endif + + let l:default_feature_behavior = ale#Var(a:buffer, 'rust_cargo_default_feature_behavior') + + if l:default_feature_behavior is# 'all' + let l:include_features = '' + let l:default_feature = ' --all-features' + elseif l:default_feature_behavior is# 'none' + let l:default_feature = ' --no-default-features' + else + let l:default_feature = '' + endif + + let l:subcommand = l:use_check ? 'check' : 'build' + let l:clippy_options = '' + + if ale#Var(a:buffer, 'rust_cargo_use_clippy') + let l:subcommand = 'clippy' + let l:clippy_options = ale#Var(a:buffer, 'rust_cargo_clippy_options') + + if l:clippy_options =~# '^-- ' + let l:clippy_options = join(split(l:clippy_options, '-- ')) + endif + + if l:clippy_options isnot# '' + let l:clippy_options = ' -- ' . l:clippy_options + endif + endif + + return 'cargo ' + \ . l:subcommand + \ . (l:use_all_targets ? ' --all-targets' : '') + \ . (l:use_examples ? ' --examples' : '') + \ . (l:use_tests ? ' --tests' : '') + \ . (l:use_target_dir ? (' --target-dir ' . ale#Escape(l:target_dir)) : '') + \ . ' --frozen --message-format=json -q' + \ . l:default_feature + \ . l:include_features + \ . l:clippy_options +endfunction + +call ale#linter#Define('rust', { +\ 'name': 'cargo', +\ 'executable': function('ale_linters#rust#cargo#GetCargoExecutable'), +\ 'cwd': function('ale_linters#rust#cargo#GetCwd'), +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale_linters#rust#cargo#GetCargoExecutable(buffer), +\ '%e --version', +\ function('ale_linters#rust#cargo#GetCommand'), +\ )}, +\ 'callback': 'ale#handlers#rust#HandleRustErrors', +\ 'output_stream': 'both', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rust/cspell.vim b/dot_vim/plugged/ale/ale_linters/rust/cspell.vim new file mode 100644 index 0000000..d2523c7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rust/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Rust files. + +call ale#handlers#cspell#DefineLinter('rust') diff --git a/dot_vim/plugged/ale/ale_linters/rust/rls.vim b/dot_vim/plugged/ale/ale_linters/rust/rls.vim new file mode 100644 index 0000000..111d755 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rust/rls.vim @@ -0,0 +1,27 @@ +" Author: w0rp +" Description: A language server for Rust + +call ale#Set('rust_rls_executable', 'rls') +call ale#Set('rust_rls_toolchain', '') +call ale#Set('rust_rls_config', {}) + +function! ale_linters#rust#rls#GetCommand(buffer) abort + let l:toolchain = ale#Var(a:buffer, 'rust_rls_toolchain') + + return '%e' . (!empty(l:toolchain) ? ' +' . ale#Escape(l:toolchain) : '') +endfunction + +function! ale_linters#rust#rls#GetProjectRoot(buffer) abort + let l:cargo_file = ale#path#FindNearestFile(a:buffer, 'Cargo.toml') + + return !empty(l:cargo_file) ? fnamemodify(l:cargo_file, ':h') : '' +endfunction + +call ale#linter#Define('rust', { +\ 'name': 'rls', +\ 'lsp': 'stdio', +\ 'lsp_config': {b -> ale#Var(b, 'rust_rls_config')}, +\ 'executable': {b -> ale#Var(b, 'rust_rls_executable')}, +\ 'command': function('ale_linters#rust#rls#GetCommand'), +\ 'project_root': function('ale_linters#rust#rls#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/rust/rustc.vim b/dot_vim/plugged/ale/ale_linters/rust/rustc.vim new file mode 100644 index 0000000..bc6431b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/rust/rustc.vim @@ -0,0 +1,33 @@ +" Author: Daniel Schemala +" Description: rustc for rust files + +call ale#Set('rust_rustc_options', '--emit=mir -o /dev/null') + +function! ale_linters#rust#rustc#RustcCommand(buffer) abort + " Try to guess the library search path. If the project is managed by cargo, + " it's usually /target/debug/deps/ or + " /target/release/deps/ + let l:cargo_file = ale#path#FindNearestFile(a:buffer, 'Cargo.toml') + + if l:cargo_file isnot# '' + let l:root = fnamemodify(l:cargo_file, ':h') + let l:dependencies = ' -L ' . ale#Escape(ale#path#GetAbsPath(l:root, 'target/debug/deps')) + \ . ' -L ' . ale#Escape(ale#path#GetAbsPath(l:root, 'target/release/deps')) + else + let l:dependencies = '' + endif + + let l:options = ale#Var(a:buffer, 'rust_rustc_options') + + return 'rustc --error-format=json' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . l:dependencies . ' -' +endfunction + +call ale#linter#Define('rust', { +\ 'name': 'rustc', +\ 'executable': 'rustc', +\ 'command': function('ale_linters#rust#rustc#RustcCommand'), +\ 'callback': 'ale#handlers#rust#HandleRustErrors', +\ 'output_stream': 'stderr', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/salt/salt_lint.vim b/dot_vim/plugged/ale/ale_linters/salt/salt_lint.vim new file mode 100644 index 0000000..47f66d8 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/salt/salt_lint.vim @@ -0,0 +1,33 @@ +" Author: Benjamin BINIER +" Description: salt-lint, saltstack linter + +call ale#Set('salt_salt_lint_executable', 'salt-lint') +call ale#Set('salt_salt_lint_options', '') + +function! ale_linters#salt#salt_lint#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'salt_salt_lint_options')) + \ . ' --json' +endfunction + +function! ale_linters#salt#salt_lint#Handle(buffer, lines) abort + let l:output = [] + + for l:error in ale#util#FuzzyJSONDecode(a:lines, []) + call add(l:output, { + \ 'lnum': l:error.linenumber + 0, + \ 'code': l:error.id + 0, + \ 'text': l:error.message, + \ 'type': l:error.severity is# 'HIGH' ? 'E' : 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('salt', { +\ 'name': 'salt_lint', +\ 'aliases': ['salt-lint'], +\ 'executable': {b -> ale#Var(b, 'salt_salt_lint_executable')}, +\ 'command': function('ale_linters#salt#salt_lint#GetCommand'), +\ 'callback': 'ale_linters#salt#salt_lint#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sass/sasslint.vim b/dot_vim/plugged/ale/ale_linters/sass/sasslint.vim new file mode 100644 index 0000000..ff396e6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sass/sasslint.vim @@ -0,0 +1,28 @@ +" Author: sQVe - https://github.com/sQVe + +call ale#Set('sass_sasslint_executable', 'sass-lint') +call ale#Set('sass_sasslint_options', '') +call ale#Set('sass_sasslint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#sass#sasslint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'sass_sasslint', [ + \ 'node_modules/sass-lint/bin/sass-lint.js', + \ 'node_modules/.bin/sass-lint', + \]) +endfunction + +function! ale_linters#sass#sasslint#GetCommand(buffer) abort + let l:executable = ale_linters#sass#sasslint#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'sass_sasslint_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' -v -q -f compact %t' +endfunction + +call ale#linter#Define('sass', { +\ 'name': 'sasslint', +\ 'executable': function('ale_linters#sass#sasslint#GetExecutable'), +\ 'command': function('ale_linters#sass#sasslint#GetCommand'), +\ 'callback': 'ale#handlers#css#HandleCSSLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sass/stylelint.vim b/dot_vim/plugged/ale/ale_linters/sass/stylelint.vim new file mode 100644 index 0000000..22abef9 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sass/stylelint.vim @@ -0,0 +1,13 @@ +" Author: diartyz + +call ale#Set('sass_stylelint_executable', 'stylelint') +call ale#Set('sass_stylelint_use_global', get(g:, 'ale_use_global_executables', 0)) + +call ale#linter#Define('sass', { +\ 'name': 'stylelint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'sass_stylelint', [ +\ 'node_modules/.bin/stylelint', +\ ])}, +\ 'command': '%e --stdin-filename %s', +\ 'callback': 'ale#handlers#css#HandleStyleLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/scala/cspell.vim b/dot_vim/plugged/ale/ale_linters/scala/cspell.vim new file mode 100644 index 0000000..fa09d42 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/scala/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Scala files. + +call ale#handlers#cspell#DefineLinter('scala') diff --git a/dot_vim/plugged/ale/ale_linters/scala/fsc.vim b/dot_vim/plugged/ale/ale_linters/scala/fsc.vim new file mode 100644 index 0000000..9413523 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/scala/fsc.vim @@ -0,0 +1,14 @@ +" Author: Nils Leuzinger - https://github.com/PawkyPenguin +" Description: Basic scala support using fsc + +function! s:IsSbt(buffer) abort + return index(split(getbufvar(a:buffer, '&filetype'), '\.'), 'sbt') >= 0 +endfunction + +call ale#linter#Define('scala', { +\ 'name': 'fsc', +\ 'executable': {buf -> s:IsSbt(buf) ? '' : 'fsc'}, +\ 'command': '%e -Ystop-after:parser %t', +\ 'callback': 'ale#handlers#scala#HandleScalacLintFormat', +\ 'output_stream': 'stderr', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/scala/metals.vim b/dot_vim/plugged/ale/ale_linters/scala/metals.vim new file mode 100644 index 0000000..da9e855 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/scala/metals.vim @@ -0,0 +1,50 @@ +" Author: Jeffrey Lau - https://github.com/zoonfafer +" Description: Metals Language Server for Scala https://scalameta.org/metals/ + +call ale#Set('scala_metals_executable', 'metals-vim') +call ale#Set('scala_metals_project_root', '') + +function! ale_linters#scala#metals#GetProjectRoot(buffer) abort + let l:project_root = ale#Var(a:buffer, 'scala_metals_project_root') + + if !empty(l:project_root) + return l:project_root + endif + + let l:potential_roots = [ + \ 'build.sc', + \ 'build.sbt', + \ '.bloop', + \ '.metals', + \] + + for l:root in l:potential_roots + let l:project_root = ale#path#ResolveLocalPath( + \ a:buffer, + \ l:root, + \ '' + \) + + if !empty(l:project_root) + return fnamemodify( + \ l:project_root, + \ ':h', + \) + endif + endfor + + return '' +endfunction + +function! ale_linters#scala#metals#GetCommand(buffer) abort + return '%e' . ale#Pad('stdio') +endfunction + +call ale#linter#Define('scala', { +\ 'name': 'metals', +\ 'lsp': 'stdio', +\ 'language': 'scala', +\ 'executable': {b -> ale#Var(b, 'scala_metals_executable')}, +\ 'command': function('ale_linters#scala#metals#GetCommand'), +\ 'project_root': function('ale_linters#scala#metals#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/scala/sbtserver.vim b/dot_vim/plugged/ale/ale_linters/scala/sbtserver.vim new file mode 100644 index 0000000..d4f137c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/scala/sbtserver.vim @@ -0,0 +1,31 @@ +" Author: ophirr33 +" Description: TCP lsp client for sbt Server + +call ale#Set('scala_sbtserver_address', '127.0.0.1:4273') +call ale#Set('scala_sbtserver_project_root', '') + +function! ale_linters#scala#sbtserver#GetProjectRoot(buffer) abort + let l:project_root = ale#Var(a:buffer, 'scala_sbtserver_project_root') + + if l:project_root is? '' + let l:project_root = ale#path#FindNearestFile(a:buffer, 'build.sbt') + + return !empty(l:project_root) ? fnamemodify(l:project_root, ':h') : '' + endif + + return l:project_root +endfunction + +function! ale_linters#scala#sbtserver#GetAddress(buffer) abort + let l:address = ale#Var(a:buffer, 'scala_sbtserver_address') + + return l:address +endfunction + +call ale#linter#Define('scala', { +\ 'name': 'sbtserver', +\ 'lsp': 'socket', +\ 'address': function('ale_linters#scala#sbtserver#GetAddress'), +\ 'language': 'scala', +\ 'project_root': function('ale_linters#scala#sbtserver#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/scala/scalac.vim b/dot_vim/plugged/ale/ale_linters/scala/scalac.vim new file mode 100644 index 0000000..1dd579b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/scala/scalac.vim @@ -0,0 +1,15 @@ +" Author: Zoltan Kalmar - https://github.com/kalmiz, +" w0rp +" Description: Basic scala support using scalac + +function! s:IsSbt(buffer) abort + return index(split(getbufvar(a:buffer, '&filetype'), '\.'), 'sbt') >= 0 +endfunction + +call ale#linter#Define('scala', { +\ 'name': 'scalac', +\ 'executable': {buf -> s:IsSbt(buf) ? '' : 'scalac'}, +\ 'command': '%e -Ystop-after:parser %t', +\ 'callback': 'ale#handlers#scala#HandleScalacLintFormat', +\ 'output_stream': 'stderr', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/scala/scalastyle.vim b/dot_vim/plugged/ale/ale_linters/scala/scalastyle.vim new file mode 100644 index 0000000..6e9e4c1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/scala/scalastyle.vim @@ -0,0 +1,86 @@ +" Author: Kevin Kays - https://github.com/okkays +" Description: Support for the scalastyle checker. + +call ale#Set('scala_scalastyle_options', '') +" TODO: Remove support for the old option name in ALE 3.0. +call ale#Set('scala_scalastyle_config', +\ get(g:, 'ale_scalastyle_config_loc', '') +\) + +function! ale_linters#scala#scalastyle#Handle(buffer, lines) abort + " Look for help output from scalastyle first, which indicates that no + " configuration file was found. + for l:line in a:lines[:10] + if l:line =~# '-c, --config' + return [{ + \ 'lnum': 1, + \ 'text': '(See :help ale-scala-scalastyle)' + \ . ' No scalastyle configuration file was found.', + \}] + endif + endfor + + " Matches patterns like the following: + " + " warning file=/home/blurble/Doop.scala message=Missing or badly formed ScalaDoc: Extra @param foobles line=190 + let l:patterns = [ + \ '^\(.\+\) .\+ message=\(.\+\) line=\(\d\+\)$', + \ '^\(.\+\) .\+ message=\(.\+\) line=\(\d\+\) column=\(\d\+\)$', + \] + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:patterns) + let l:args = { + \ 'lnum': l:match[3] + 0, + \ 'type': l:match[1] =~? 'error' ? 'E' : 'W', + \ 'text': l:match[2] + \} + + if !empty(l:match[4]) + let l:args['col'] = l:match[4] + 1 + endif + + call add(l:output, l:args) + endfor + + return l:output +endfunction + +function! ale_linters#scala#scalastyle#GetCommand(buffer) abort + " Search for scalastyle config in parent directories. + let l:scalastyle_config = '' + let l:potential_configs = [ + \ 'scalastyle_config.xml', + \ 'scalastyle-config.xml' + \] + + for l:config in l:potential_configs + let l:scalastyle_config = ale#path#ResolveLocalPath( + \ a:buffer, + \ l:config, + \ '' + \) + + if !empty(l:scalastyle_config) + break + endif + endfor + + " If all else fails, try the global config. + if empty(l:scalastyle_config) + let l:scalastyle_config = ale#Var(a:buffer, 'scala_scalastyle_config') + endif + + return 'scalastyle' + \ . (!empty(l:scalastyle_config) ? ' --config ' . ale#Escape(l:scalastyle_config) : '') + \ . ale#Pad(ale#Var(a:buffer, 'scala_scalastyle_options')) + \ . ' %t' +endfunction + +call ale#linter#Define('scala', { +\ 'name': 'scalastyle', +\ 'executable': 'scalastyle', +\ 'output_stream': 'stdout', +\ 'command': function('ale_linters#scala#scalastyle#GetCommand'), +\ 'callback': 'ale_linters#scala#scalastyle#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/scss/sasslint.vim b/dot_vim/plugged/ale/ale_linters/scss/sasslint.vim new file mode 100644 index 0000000..9902705 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/scss/sasslint.vim @@ -0,0 +1,28 @@ +" Author: sQVe - https://github.com/sQVe + +call ale#Set('scss_sasslint_executable', 'sass-lint') +call ale#Set('scss_sasslint_options', '') +call ale#Set('scss_sasslint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#scss#sasslint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'scss_sasslint', [ + \ 'node_modules/sass-lint/bin/sass-lint.js', + \ 'node_modules/.bin/sass-lint', + \]) +endfunction + +function! ale_linters#scss#sasslint#GetCommand(buffer) abort + let l:executable = ale_linters#scss#sasslint#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'scss_sasslint_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' -v -q -f compact %t' +endfunction + +call ale#linter#Define('scss', { +\ 'name': 'sasslint', +\ 'executable': function('ale_linters#scss#sasslint#GetExecutable'), +\ 'command': function('ale_linters#scss#sasslint#GetCommand'), +\ 'callback': 'ale#handlers#css#HandleCSSLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/scss/scsslint.vim b/dot_vim/plugged/ale/ale_linters/scss/scsslint.vim new file mode 100644 index 0000000..7ce5724 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/scss/scsslint.vim @@ -0,0 +1,34 @@ +" Author: w0rp +" Description: This file add scsslint support for SCSS support + +function! ale_linters#scss#scsslint#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " test.scss:2:1 [W] Indentation: Line should be indented 2 spaces, but was indented 4 spaces + let l:pattern = '^.*:\(\d\+\):\(\d*\) \[\([^\]]\+\)\] \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + \&& l:match[4] =~# '^TrailingWhitespace' + " Skip trailing whitespace warnings if that option is off. + continue + endif + + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[4], + \ 'type': l:match[3] is# 'E' ? 'E' : 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('scss', { +\ 'name': 'scsslint', +\ 'executable': 'scss-lint', +\ 'command': 'scss-lint --stdin-file-path=%s', +\ 'callback': 'ale_linters#scss#scsslint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/scss/stylelint.vim b/dot_vim/plugged/ale/ale_linters/scss/stylelint.vim new file mode 100644 index 0000000..fea4ea8 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/scss/stylelint.vim @@ -0,0 +1,19 @@ +" Author: diartyz + +call ale#Set('scss_stylelint_executable', 'stylelint') +call ale#Set('scss_stylelint_options', '') +call ale#Set('scss_stylelint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#scss#stylelint#GetCommand(buffer) abort + return '%e ' . ale#Pad(ale#Var(a:buffer, 'scss_stylelint_options')) + \ . ' --stdin-filename %s' +endfunction + +call ale#linter#Define('scss', { +\ 'name': 'stylelint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'scss_stylelint', [ +\ 'node_modules/.bin/stylelint', +\ ])}, +\ 'command': function('ale_linters#scss#stylelint#GetCommand'), +\ 'callback': 'ale#handlers#css#HandleStyleLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sh/bashate.vim b/dot_vim/plugged/ale/ale_linters/sh/bashate.vim new file mode 100644 index 0000000..3cd8424 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sh/bashate.vim @@ -0,0 +1,43 @@ +" Author: hsanson +" Description: Lints sh files using bashate +" URL: https://github.com/openstack/bashate + +call ale#Set('sh_bashate_executable', 'bashate') +call ale#Set('sh_bashate_options', '') + +function! ale_linters#sh#bashate#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'sh_bashate_executable') +endfunction + +function! ale_linters#sh#bashate#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'sh_bashate_options') + let l:executable = ale_linters#sh#bashate#GetExecutable(a:buffer) + + return ale#Escape(l:executable) . ' ' . l:options . ' ' . '%t' +endfunction + +function! ale_linters#sh#bashate#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " /path/to/script/file:694:1: E003 Indent not multiple of 4 + let l:pattern = ':\(\d\+\):\(\d\+\): \(.*\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': str2nr(l:match[1]), + \ 'col': str2nr(l:match[2]), + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('sh', { +\ 'name': 'bashate', +\ 'output_stream': 'stdout', +\ 'executable': function('ale_linters#sh#bashate#GetExecutable'), +\ 'command': function('ale_linters#sh#bashate#GetCommand'), +\ 'callback': 'ale_linters#sh#bashate#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sh/cspell.vim b/dot_vim/plugged/ale/ale_linters/sh/cspell.vim new file mode 100644 index 0000000..e3c5a6f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sh/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for shell scripts. + +call ale#handlers#cspell#DefineLinter('sh') diff --git a/dot_vim/plugged/ale/ale_linters/sh/language_server.vim b/dot_vim/plugged/ale/ale_linters/sh/language_server.vim new file mode 100644 index 0000000..c678158 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sh/language_server.vim @@ -0,0 +1,32 @@ +" Author: Christian Höltje (https://docwhat.org/) +" Description: BASH Language server integration for ALE +scriptencoding utf-8 + +call ale#Set('sh_language_server_executable', 'bash-language-server') +call ale#Set('sh_language_server_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#sh#language_server#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'sh_language_server', [ + \ 'node_modules/.bin/bash-language-server', + \]) +endfunction + +function! ale_linters#sh#language_server#GetCommand(buffer) abort + let l:exe = ale#Escape(ale_linters#sh#language_server#GetExecutable(a:buffer)) + + return l:exe . ' start' +endfunction + +function! ale_linters#sh#language_server#GetProjectRoot(buffer) abort + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +call ale#linter#Define('sh', { +\ 'name': 'language_server', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#sh#language_server#GetExecutable'), +\ 'command': function('ale_linters#sh#language_server#GetCommand'), +\ 'project_root': function('ale_linters#sh#language_server#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sh/shell.vim b/dot_vim/plugged/ale/ale_linters/sh/shell.vim new file mode 100644 index 0000000..73ab360 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sh/shell.vim @@ -0,0 +1,59 @@ +" Author: w0rp +" Description: Lints shell files by invoking the shell with -n + +" Backwards compatibility +if exists('g:ale_linters_sh_shell_default_shell') + let g:ale_sh_shell_default_shell = g:ale_linters_sh_shell_default_shell +endif + +" This option can be changed to change the default shell when the shell +" cannot be taken from the hashbang line. +if !exists('g:ale_sh_shell_default_shell') + let g:ale_sh_shell_default_shell = fnamemodify($SHELL, ':t') + + if g:ale_sh_shell_default_shell is# '' || g:ale_sh_shell_default_shell is# 'fish' + let g:ale_sh_shell_default_shell = 'bash' + endif +endif + +function! ale_linters#sh#shell#GetExecutable(buffer) abort + let l:shell_type = ale#handlers#sh#GetShellType(a:buffer) + + if !empty(l:shell_type) + return l:shell_type + endif + + return ale#Var(a:buffer, 'sh_shell_default_shell') +endfunction + +function! ale_linters#sh#shell#GetCommand(buffer) abort + return ale_linters#sh#shell#GetExecutable(a:buffer) . ' -n %t' +endfunction + +function! ale_linters#sh#shell#Handle(buffer, lines) abort + " Matches patterns line the following: + " + " bash: line 13: syntax error near unexpected token `d' + " bash:行0: 未预期的符å·â€œdoneâ€é™„近有语法错误 + " bash: 列 90: 尋找匹é…的「"ã€æ™‚é‡åˆ°äº†æœªé æœŸçš„æª”æ¡ˆçµæŸç¬¦ + " sh: 11: Syntax error: "(" unexpected + let l:pattern = '\v([^:]+:\D*)(\d+): (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': str2nr(l:match[2]), + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('sh', { +\ 'name': 'shell', +\ 'output_stream': 'stderr', +\ 'executable': function('ale_linters#sh#shell#GetExecutable'), +\ 'command': function('ale_linters#sh#shell#GetCommand'), +\ 'callback': 'ale_linters#sh#shell#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sh/shellcheck.vim b/dot_vim/plugged/ale/ale_linters/sh/shellcheck.vim new file mode 100644 index 0000000..d994512 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sh/shellcheck.vim @@ -0,0 +1,4 @@ +" Author: w0rp +" Description: shellcheck linter for shell scripts. + +call ale#handlers#shellcheck#DefineLinter('sh') diff --git a/dot_vim/plugged/ale/ale_linters/slim/slimlint.vim b/dot_vim/plugged/ale/ale_linters/slim/slimlint.vim new file mode 100644 index 0000000..1b365e2 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/slim/slimlint.vim @@ -0,0 +1,55 @@ +" Author: Markus Doits - https://github.com/doits +" Description: slim-lint for Slim files + +function! ale_linters#slim#slimlint#GetCommand(buffer) abort + let l:command = 'slim-lint %t' + + let l:rubocop_config = ale#path#FindNearestFile(a:buffer, '.rubocop.yml') + + " Set SLIM_LINT_RUBOCOP_CONF variable as it is needed for slim-lint to + " pick up the rubocop config. + " + " See https://github.com/sds/slim-lint/blob/master/lib/slim_lint/linter/README.md#rubocop + if !empty(l:rubocop_config) + if has('win32') + let l:command = 'set SLIM_LINT_RUBOCOP_CONF=' . ale#Escape(l:rubocop_config) . ' && ' . l:command + else + let l:command = 'SLIM_LINT_RUBOCOP_CONF=' . ale#Escape(l:rubocop_config) . ' ' . l:command + endif + endif + + return l:command +endfunction + +function! ale_linters#slim#slimlint#Handle(buffer, lines) abort + " Matches patterns like the following: + " :5 [W] LineLength: Line is too long. [150/120] + let l:pattern = '\v^.*:(\d+) \[([EW])\] (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'type': l:match[2], + \ 'text': l:match[3] + \} + + let l:code_match = matchlist(l:item.text, '\v^([^:]+): (.+)$') + + if !empty(l:code_match) + let l:item.code = l:code_match[1] + let l:item.text = l:code_match[2] + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('slim', { +\ 'name': 'slimlint', +\ 'executable': 'slim-lint', +\ 'command': function('ale_linters#slim#slimlint#GetCommand'), +\ 'callback': 'ale_linters#slim#slimlint#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sml/smlnj.vim b/dot_vim/plugged/ale/ale_linters/sml/smlnj.vim new file mode 100644 index 0000000..852ea17 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sml/smlnj.vim @@ -0,0 +1,9 @@ +" Author: Paulo Alem , Jake Zimmerman +" Description: Single-file SML checking with SML/NJ compiler + +call ale#linter#Define('sml', { +\ 'name': 'smlnj', +\ 'executable': function('ale#handlers#sml#GetExecutableSmlnjFile'), +\ 'command': 'sml', +\ 'callback': 'ale#handlers#sml#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sml/smlnj_cm.vim b/dot_vim/plugged/ale/ale_linters/sml/smlnj_cm.vim new file mode 100644 index 0000000..9ad24af --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sml/smlnj_cm.vim @@ -0,0 +1,21 @@ +" Author: Jake Zimmerman +" Description: SML checking with SML/NJ Compilation Manager + +function! ale_linters#sml#smlnj_cm#GetCommand(buffer) abort + let l:cmfile = ale#handlers#sml#GetCmFile(a:buffer) + + return 'sml -m ' . l:cmfile . ' < /dev/null' +endfunction + +" Using CM requires that we set "lint_file: 1", since it reads the files +" from the disk itself. +call ale#linter#Define('sml', { +\ 'name': 'smlnj_cm', +\ 'aliases': ['smlnj-cm'], +\ 'executable': function('ale#handlers#sml#GetExecutableSmlnjCm'), +\ 'lint_file': 1, +\ 'command': function('ale_linters#sml#smlnj_cm#GetCommand'), +\ 'callback': 'ale#handlers#sml#Handle', +\}) + +" vim:ts=4:sts=4:sw=4 diff --git a/dot_vim/plugged/ale/ale_linters/solidity/solc.vim b/dot_vim/plugged/ale/ale_linters/solidity/solc.vim new file mode 100644 index 0000000..2897708 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/solidity/solc.vim @@ -0,0 +1,53 @@ +" Author: Karl Bartel - http://karl.berlin/ +" Description: Report solc compiler errors in Solidity code + +call ale#Set('solidity_solc_executable', 'solc') +call ale#Set('solidity_solc_options', '') + +function! ale_linters#solidity#solc#Handle(buffer, lines) abort + " Matches patterns like the following: + " Error: Expected ';' but got '(' + " --> /path/to/file/file.sol:1:10:) + let l:pattern = '\v(Error|Warning): (.*)$' + let l:line_and_column_pattern = '\v\.sol:(\d+):(\d+):' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + let l:match = matchlist(l:line, l:line_and_column_pattern) + + if len(l:match) > 0 + let l:index = len(l:output) - 1 + let l:output[l:index]['lnum'] = l:match[1] + 0 + let l:output[l:index]['col'] = l:match[2] + 0 + endif + else + let l:isError = l:match[1] is? 'Error' + + call add(l:output, { + \ 'lnum': 0, + \ 'col': 0, + \ 'text': l:match[2], + \ 'type': l:isError ? 'E' : 'W', + \}) + endif + endfor + + return l:output +endfunction + +function! ale_linters#solidity#solc#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'solidity_solc_executable') + + return l:executable . ale#Pad(ale#Var(a:buffer, 'solidity_solc_options')) . ' %s' +endfunction + +call ale#linter#Define('solidity', { +\ 'name': 'solc', +\ 'executable': {b -> ale#Var(b, 'solidity_solc_executable')}, +\ 'command': function('ale_linters#solidity#solc#GetCommand'), +\ 'callback': 'ale_linters#solidity#solc#Handle', +\ 'output_stream': 'stderr', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/solidity/solhint.vim b/dot_vim/plugged/ale/ale_linters/solidity/solhint.vim new file mode 100644 index 0000000..505bd5b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/solidity/solhint.vim @@ -0,0 +1,12 @@ +" Authors: Franco Victorio - https://github.com/fvictorio, Henrique Barcelos +" https://github.com/hbarcelos +" Description: Report errors in Solidity code with solhint + +call ale#linter#Define('solidity', { +\ 'name': 'solhint', +\ 'output_stream': 'both', +\ 'executable': function('ale#handlers#solhint#GetExecutable'), +\ 'cwd': function('ale#handlers#solhint#GetCwd'), +\ 'command': function('ale#handlers#solhint#GetCommand'), +\ 'callback': 'ale#handlers#solhint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/solidity/solium.vim b/dot_vim/plugged/ale/ale_linters/solidity/solium.vim new file mode 100644 index 0000000..61ab184 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/solidity/solium.vim @@ -0,0 +1,9 @@ +" Author: Jeff Sutherland - https://github.com/jdsutherland +" Description: Report errors in Solidity code with solium + +call ale#linter#Define('solidity', { +\ 'name': 'solium', +\ 'executable': 'solium', +\ 'command': 'solium --reporter gcc --file %t', +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/spec/rpmlint.vim b/dot_vim/plugged/ale/ale_linters/spec/rpmlint.vim new file mode 100644 index 0000000..5594e3b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/spec/rpmlint.vim @@ -0,0 +1,90 @@ +" Author: Jason Tibbitts +" Description: Adds support for checking RPM spec files with rpmlint + +" rpmlint will produce varions types of output: +" +" Lines like the following are output when the file is simply not able to be +" parsed by rpmspec -P: +" apcupsd.spec: E: specfile-error warning: bogus date in %changelog: Mon Oct 1 2005 - Foo +" apcupsd.spec: E: specfile-error error: %changelog not in descending chronological order +" They do not contain a line number, and there's not a whole lot that can be +" done to locate them besides grep for them. rpmlint is just passing the +" output from rpm along with the filename, an error indicator, and an error +" type. +" +" Lines like the following: +" cyrus-imapd.spec:23: W: macro-in-comment %version +" cyrus-imapd.spec:18: E: hardcoded-library-path in %_prefix/lib/%name +" indicate warnings and errors, respectively. No column numbers are provided +" +" Lines like: +" apcupsd.spec: I: checking +" apcupsd.spec: I: checking-url https://downloads.sourceforge.net/apcupsd/apcupsd-3.14.14.tar.gz (timeout 10 seconds) +" are merely informational and are only output when -v is passed. But they +" may be useful in a log to know why things are taking so long. +" +" And this is always output at the end and should just be ignored: +" 0 packages and 1 specfiles checked; 4 errors, 0 warnings. + +call ale#Set('spec_rpmlint_executable', 'rpmlint') +call ale#Set('spec_rpmlint_options', '') + +function! ale_linters#spec#rpmlint#GetCommand(buffer, version) abort + if ale#semver#GTE(a:version, [2, 0, 0]) + " The -o/--option flag was removed in version 2.0.0 + let l:version_dependent_args = '' + else + let l:version_dependent_args = ' -o "NetworkEnabled False"' + endif + + return '%e' + \ . ale#Pad(ale#Var(a:buffer, 'spec_rpmlint_options')) + \ . ' -v' + \ . l:version_dependent_args + \ . ' %t' +endfunction + +function! ale_linters#spec#rpmlint#Handle(buffer, lines) abort + " let l:pat_inform = '^.\+: I: \(.+\)' + let l:pat_errwarn = '^.\+:\(\d\+\): \([EW]\): \(.\+\)' + let l:pat_baderr = '^.\+: E: \(.\+\)' + let l:output = [] + + for l:line in a:lines + let l:match_errwarn = matchlist(l:line, l:pat_errwarn) + let l:match_baderr = matchlist(l:line, l:pat_baderr) + + if len(l:match_errwarn) > 0 + let l:text = l:match_errwarn[3] + let l:type = l:match_errwarn[2] + let l:lnum = l:match_errwarn[1] + 0 + elseif len(l:match_baderr) > 0 + let l:text = l:match_baderr[1] + let l:type = 'E' + let l:lnum = 1 + else + continue + endif + + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:lnum, + \ 'text': l:text, + \ 'type': l:type, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('spec', { +\ 'name': 'rpmlint', +\ 'executable': {b -> ale#Var(b, 'spec_rpmlint_executable')}, +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale#Var(buffer, 'spec_rpmlint_executable'), +\ '%e --version', +\ function('ale_linters#spec#rpmlint#GetCommand'), +\ )}, +\ 'callback': 'ale_linters#spec#rpmlint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sql/sqlfluff.vim b/dot_vim/plugged/ale/ale_linters/sql/sqlfluff.vim new file mode 100644 index 0000000..0ec062b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sql/sqlfluff.vim @@ -0,0 +1,72 @@ +" Author: Carl Smedstad +" Description: sqlfluff for SQL files + +let g:ale_sql_sqlfluff_executable = +\ get(g:, 'ale_sql_sqlfluff_executable', 'sqlfluff') + +let g:ale_sql_sqlfluff_options = +\ get(g:, 'ale_sql_sqlfluff_options', '') + +function! ale_linters#sql#sqlfluff#Executable(buffer) abort + return ale#Var(a:buffer, 'sql_sqlfluff_executable') +endfunction + +function! ale_linters#sql#sqlfluff#Command(buffer) abort + let l:executable = ale_linters#sql#sqlfluff#Executable(a:buffer) + let l:options = ale#Var(a:buffer, 'sql_sqlfluff_options') + + let l:cmd = + \ ale#Escape(l:executable) + \ . ' lint' + + let l:config_file = ale#path#FindNearestFile(a:buffer, '.sqlfluff') + + if !empty(l:config_file) + let l:cmd .= ' --config ' . ale#Escape(l:config_file) + else + let l:cmd .= ' --dialect ansi' + endif + + let l:cmd .= + \ ' --format json ' + \ . l:options + \ . ' %t' + + return l:cmd +endfunction + +function! ale_linters#sql#sqlfluff#Handle(buffer, lines) abort + let l:output = [] + let l:json_lines = ale#util#FuzzyJSONDecode(a:lines, []) + + if empty(l:json_lines) + return l:output + endif + + let l:json = l:json_lines[0] + + " if there's no warning, 'result' is `null`. + if empty(get(l:json, 'violations')) + return l:output + endif + + for l:violation in get(l:json, 'violations', []) + call add(l:output, { + \ 'filename': l:json.filepath, + \ 'lnum': l:violation.line_no, + \ 'col': l:violation.line_pos, + \ 'text': l:violation.description, + \ 'code': l:violation.code, + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('sql', { +\ 'name': 'sqlfluff', +\ 'executable': function('ale_linters#sql#sqlfluff#Executable'), +\ 'command': function('ale_linters#sql#sqlfluff#Command'), +\ 'callback': 'ale_linters#sql#sqlfluff#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sql/sqlint.vim b/dot_vim/plugged/ale/ale_linters/sql/sqlint.vim new file mode 100644 index 0000000..ca89372 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sql/sqlint.vim @@ -0,0 +1,28 @@ +" Author: Adriaan Zonnenberg +" Description: sqlint for SQL files + +function! ale_linters#sql#sqlint#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " stdin:3:1:ERROR syntax error at or near "WIBBLE" + let l:pattern = '\v^[^:]+:(\d+):(\d+):(\u+) (.*)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:match[3][0], + \ 'text': l:match[4], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('sql', { +\ 'name': 'sqlint', +\ 'executable': 'sqlint', +\ 'command': 'sqlint', +\ 'callback': 'ale_linters#sql#sqlint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sql/sqllint.vim b/dot_vim/plugged/ale/ale_linters/sql/sqllint.vim new file mode 100644 index 0000000..78396fe --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sql/sqllint.vim @@ -0,0 +1,33 @@ +" ale_linters/sql/sqllint.vim +" Author: Joe Reynolds +" Description: sql-lint for SQL files. +" sql-lint can be found at +" https://www.npmjs.com/package/sql-lint +" https://github.com/joereynolds/sql-lint + +function! ale_linters#sql#sqllint#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " stdin:1 [ER_NO_DB_ERROR] No database selected + let l:pattern = '\v^[^:]+:(\d+) (.*)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:match[3][0], + \ 'text': l:match[0], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('sql', { +\ 'name': 'sqllint', +\ 'aliases': ['sql-lint'], +\ 'executable': 'sql-lint', +\ 'command': 'sql-lint', +\ 'callback': 'ale_linters#sql#sqllint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/stylus/stylelint.vim b/dot_vim/plugged/ale/ale_linters/stylus/stylelint.vim new file mode 100644 index 0000000..b60e38e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/stylus/stylelint.vim @@ -0,0 +1,20 @@ +" Author: diartyz , w0rp + +call ale#Set('stylus_stylelint_executable', 'stylelint') +call ale#Set('stylus_stylelint_options', '') +call ale#Set('stylus_stylelint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#stylus#stylelint#GetCommand(buffer) abort + return '%e' + \ . ale#Pad(ale#Var(a:buffer, 'stylus_stylelint_options')) + \ . ' --stdin-filename %s' +endfunction + +call ale#linter#Define('stylus', { +\ 'name': 'stylelint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'stylus_stylelint', [ +\ 'node_modules/.bin/stylelint', +\ ])}, +\ 'command': function('ale_linters#stylus#stylelint#GetCommand'), +\ 'callback': 'ale#handlers#css#HandleStyleLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/sugarss/stylelint.vim b/dot_vim/plugged/ale/ale_linters/sugarss/stylelint.vim new file mode 100644 index 0000000..879ff0c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/sugarss/stylelint.vim @@ -0,0 +1,21 @@ +" Author: toastal +" Description: `stylelint` linter for SugarSS files + +call ale#Set('sugarss_stylelint_executable', 'stylelint') +call ale#Set('sugarss_stylelint_options', '') +call ale#Set('sugarss_stylelint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#sugarss#stylelint#GetCommand(buffer) abort + return '%e ' . ale#Pad(ale#Var(a:buffer, 'sugarss_stylelint_options')) + \ . ' --syntax=sugarss' + \ . ' --stdin-filename %s' +endfunction + +call ale#linter#Define('sugarss', { +\ 'name': 'stylelint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'sugarss_stylelint', [ +\ 'node_modules/.bin/stylelint', +\ ])}, +\ 'command': function('ale_linters#sugarss#stylelint#GetCommand'), +\ 'callback': 'ale#handlers#css#HandleStyleLintFormat', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/svelte/svelteserver.vim b/dot_vim/plugged/ale/ale_linters/svelte/svelteserver.vim new file mode 100644 index 0000000..2200b58 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/svelte/svelteserver.vim @@ -0,0 +1,21 @@ +" Author: Joakim Repomaa +" Description: Svelte Language Server integration for ALE + +call ale#Set('svelte_svelteserver_executable', 'svelteserver') +call ale#Set('svelte_svelteserver_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#svelte#svelteserver#GetProjectRoot(buffer) abort + let l:package_path = ale#path#FindNearestFile(a:buffer, 'package.json') + + return !empty(l:package_path) ? fnamemodify(l:package_path, ':h') : '' +endfunction + +call ale#linter#Define('svelte', { +\ 'name': 'svelteserver', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#path#FindExecutable(b, 'svelte_svelteserver', [ +\ 'node_modules/.bin/svelteserver', +\ ])}, +\ 'command': '%e --stdio', +\ 'project_root': function('ale_linters#svelte#svelteserver#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/swift/appleswiftformat.vim b/dot_vim/plugged/ale/ale_linters/swift/appleswiftformat.vim new file mode 100644 index 0000000..4c61764 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/swift/appleswiftformat.vim @@ -0,0 +1,43 @@ +" Authors: Klaas Pieter Annema , bosr +" Description: Support for swift-format https://github.com/apple/swift-format + +function! ale_linters#swift#appleswiftformat#GetLinterCommand(buffer) abort + let l:command_args = ale#swift#GetAppleSwiftFormatCommand(a:buffer) . ' lint %t' + let l:config_args = ale#swift#GetAppleSwiftFormatConfigArgs(a:buffer) + + if l:config_args isnot# '' + let l:command_args = l:command_args . ' ' . l:config_args + endif + + return l:command_args +endfunction + +function! ale_linters#swift#appleswiftformat#Handle(buffer, lines) abort + " Matches the typical output of swift-format, that is lines of the following pattern: + " + " Sources/main.swift:4:21: warning: [DoNotUseSemicolons] remove ';' and move the next statement to the new line + " Sources/main.swift:3:12: warning: [Spacing] remove 1 space + let l:pattern = '\v^.*:(\d+):(\d+): (\S+): \[(\S+)\] (.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:match[3] is# 'error' ? 'E' : 'W', + \ 'code': l:match[4], + \ 'text': l:match[5], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('swift', { +\ 'name': 'apple-swift-format', +\ 'executable': function('ale#swift#GetAppleSwiftFormatExecutable'), +\ 'command': function('ale_linters#swift#appleswiftformat#GetLinterCommand'), +\ 'output_stream': 'stderr', +\ 'language': 'swift', +\ 'callback': 'ale_linters#swift#appleswiftformat#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/swift/cspell.vim b/dot_vim/plugged/ale/ale_linters/swift/cspell.vim new file mode 100644 index 0000000..25451e9 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/swift/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Swift files. + +call ale#handlers#cspell#DefineLinter('swift') diff --git a/dot_vim/plugged/ale/ale_linters/swift/sourcekitlsp.vim b/dot_vim/plugged/ale/ale_linters/swift/sourcekitlsp.vim new file mode 100644 index 0000000..560893b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/swift/sourcekitlsp.vim @@ -0,0 +1,13 @@ +" Author: Dan Loman +" Description: Support for sourcekit-lsp https://github.com/apple/sourcekit-lsp + +call ale#Set('sourcekit_lsp_executable', 'sourcekit-lsp') + +call ale#linter#Define('swift', { +\ 'name': 'sourcekitlsp', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'sourcekit_lsp_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale#swift#FindProjectRoot'), +\ 'language': 'swift', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/swift/swiftlint.vim b/dot_vim/plugged/ale/ale_linters/swift/swiftlint.vim new file mode 100644 index 0000000..d08c68f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/swift/swiftlint.vim @@ -0,0 +1,69 @@ +" Author: David Mohundro , Gordon Fontenot +" Description: swiftlint for swift files + +call ale#Set('swift_swiftlint_executable', 'swiftlint') +call ale#Set('swift_swiftlint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#swift#swiftlint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'swift_swiftlint', [ + \ 'Pods/SwiftLint/swiftlint', + \ 'ios/Pods/SwiftLint/swiftlint', + \ 'swiftlint', + \]) +endfunction + +function! ale_linters#swift#swiftlint#GetCommand(buffer) abort + let l:executable = ale_linters#swift#swiftlint#GetExecutable(a:buffer) + let l:args = 'lint --use-stdin' + + return ale#Escape(l:executable) + \ . ' ' .l:args +endfunction + +function! ale_linters#swift#swiftlint#Handle(buffer, lines) abort + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)?:? ([^:]+): (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': str2nr(l:match[2]), + \ 'type': l:match[4] is# 'error' ? 'E' : 'W', + \ 'text': l:match[5], + \} + + if l:match[4] is# 'error' + let l:item.type = 'E' + elseif l:match[4] is# 'note' + let l:item.type = 'I' + endif + + if !empty(l:match[3]) + let l:item.col = str2nr(l:match[3]) + endif + + " If the filename is something like , or -, then + " this is an error for the file we checked. + if l:match[1] isnot# '-' && l:match[1][0] isnot# '<' + let l:item['filename'] = l:match[1] + endif + + " Parse the code if it's there. + let l:code_match = matchlist(l:item.text, '\v^(.+) \(([^ (]+)\)$') + + if !empty(l:code_match) + let l:item.text = l:code_match[1] + let l:item.code = l:code_match[2] + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('swift', { +\ 'name': 'swiftlint', +\ 'executable': function('ale_linters#swift#swiftlint#GetExecutable'), +\ 'command': function('ale_linters#swift#swiftlint#GetCommand'), +\ 'callback': 'ale_linters#swift#swiftlint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/systemd/systemd_analyze.vim b/dot_vim/plugged/ale/ale_linters/systemd/systemd_analyze.vim new file mode 100644 index 0000000..64eef8c --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/systemd/systemd_analyze.vim @@ -0,0 +1,18 @@ +function! ale_linters#systemd#systemd_analyze#Handle(buffer, lines) abort + return ale#util#MapMatches(a:lines, '\v(.+):([0-9]+): (.+)', {match -> { + \ 'lnum': str2nr(match[2]), + \ 'col': 1, + \ 'type': 'W', + \ 'text': match[3], + \}}) +endfunction + +call ale#linter#Define('systemd', { +\ 'name': 'systemd_analyze', +\ 'aliases': ['systemd-analyze'], +\ 'executable': 'systemd-analyze', +\ 'command': 'SYSTEMD_LOG_COLOR=0 %e --user verify %s', +\ 'callback': 'ale_linters#systemd#systemd_analyze#Handle', +\ 'output_stream': 'both', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/tcl/nagelfar.vim b/dot_vim/plugged/ale/ale_linters/tcl/nagelfar.vim new file mode 100644 index 0000000..5a4940e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tcl/nagelfar.vim @@ -0,0 +1,39 @@ +" Author: Nick James +" Description: nagelfar linter for tcl files + +call ale#Set('tcl_nagelfar_executable', 'nagelfar.tcl') +call ale#Set('tcl_nagelfar_options', '') + +function! ale_linters#tcl#nagelfar#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'tcl_nagelfar_options') + + return '%e' . ale#Pad(l:options) . ' %s' +endfunction + +function! ale_linters#tcl#nagelfar#Handle(buffer, lines) abort + " Matches patterns like the following: + " Line 5: W Found constant "bepa" which is also a variable. + " Line 13: E Wrong number of arguments (3) to "set" + " Line 93: N Close brace not aligned with line 90 (4 0) + let l:pattern = '^Line\s\+\([0-9]\+\): \([NEW]\) \(.*\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'type': l:match[2] is# 'N' ? 'W' : l:match[2], + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('tcl', { +\ 'name': 'nagelfar', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'tcl_nagelfar_executable')}, +\ 'command': function('ale_linters#tcl#nagelfar#GetCommand'), +\ 'callback': 'ale_linters#tcl#nagelfar#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/terraform/checkov.vim b/dot_vim/plugged/ale/ale_linters/terraform/checkov.vim new file mode 100644 index 0000000..568b46e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/terraform/checkov.vim @@ -0,0 +1,41 @@ +" Author: Thyme-87 +" Description: use checkov for providing warnings via ale + +call ale#Set('terraform_checkov_executable', 'checkov') +call ale#Set('terraform_checkov_options', '') + +function! ale_linters#terraform#checkov#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'terraform_checkov_executable') +endfunction + +function! ale_linters#terraform#checkov#GetCommand(buffer) abort + return '%e ' . '-f %t -o json --quiet ' . ale#Var(a:buffer, 'terraform_checkov_options') +endfunction + +function! ale_linters#terraform#checkov#Handle(buffer, lines) abort + let l:output = [] + + let l:results = get(get(ale#util#FuzzyJSONDecode(a:lines, {}), 'results', []), 'failed_checks', []) + + for l:violation in l:results + call add(l:output, { + \ 'filename': l:violation['file_path'], + \ 'lnum': l:violation['file_line_range'][0], + \ 'end_lnum': l:violation['file_line_range'][1], + \ 'text': l:violation['check_name'] . ' [' . l:violation['check_id'] . ']', + \ 'detail': l:violation['check_id'] . ': ' . l:violation['check_name'] . "\n" . + \ 'For more information, see: '. l:violation['guideline'], + \ 'type': 'W', + \ }) + endfor + + return l:output +endfunction + +call ale#linter#Define('terraform', { +\ 'name': 'checkov', +\ 'output_stream': 'stdout', +\ 'executable': function('ale_linters#terraform#checkov#GetExecutable'), +\ 'command': function('ale_linters#terraform#checkov#GetCommand'), +\ 'callback': 'ale_linters#terraform#checkov#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/terraform/terraform.vim b/dot_vim/plugged/ale/ale_linters/terraform/terraform.vim new file mode 100644 index 0000000..1beb850 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/terraform/terraform.vim @@ -0,0 +1,69 @@ +" Author: Keith Maxwell +" Description: terraform fmt to check for errors + +call ale#Set('terraform_terraform_executable', 'terraform') + +function! ale_linters#terraform#terraform#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'terraform_terraform_executable') +endfunction + +function! ale_linters#terraform#terraform#GetCommand(buffer) abort + return ale#Escape(ale_linters#terraform#terraform#GetExecutable(a:buffer)) + \ . ' validate -no-color -json ' +endfunction + +function! ale_linters#terraform#terraform#GetType(severity) abort + if a:severity is? 'warning' + return 'W' + endif + + return 'E' +endfunction + +function! ale_linters#terraform#terraform#GetDetail(error) abort + let l:detail = get(a:error, 'detail', '') + + if strlen(l:detail) > 0 + return l:detail + else + return get(a:error, 'summary', '') + endif +endfunction + +function! ale_linters#terraform#terraform#Handle(buffer, lines) abort + let l:output = [] + + let l:errors = ale#util#FuzzyJSONDecode(a:lines, {'diagnostics': []}) + let l:dir = expand('#' . a:buffer . ':p:h') + let l:file = expand('#' . a:buffer . ':p') + + for l:error in l:errors['diagnostics'] + if has_key(l:error, 'range') + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:error['range']['filename']), + \ 'lnum': l:error['range']['start']['line'], + \ 'col': l:error['range']['start']['column'], + \ 'text': ale_linters#terraform#terraform#GetDetail(l:error), + \ 'type': ale_linters#terraform#terraform#GetType(l:error['severity']), + \}) + else + call add(l:output, { + \ 'filename': l:file, + \ 'lnum': 0, + \ 'col': 0, + \ 'text': ale_linters#terraform#terraform#GetDetail(l:error), + \ 'type': ale_linters#terraform#terraform#GetType(l:error['severity']), + \}) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('terraform', { +\ 'name': 'terraform', +\ 'output_stream': 'stdout', +\ 'executable': function('ale_linters#terraform#terraform#GetExecutable'), +\ 'command': function('ale_linters#terraform#terraform#GetCommand'), +\ 'callback': 'ale_linters#terraform#terraform#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/terraform/terraform_ls.vim b/dot_vim/plugged/ale/ale_linters/terraform/terraform_ls.vim new file mode 100644 index 0000000..ab35126 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/terraform/terraform_ls.vim @@ -0,0 +1,38 @@ +" Author: Horacio Sanson +" Description: terraform-ls integration for ALE (cf. https://github.com/hashicorp/terraform-ls) + +call ale#Set('terraform_terraform_executable', 'terraform') +call ale#Set('terraform_ls_executable', 'terraform-ls') +call ale#Set('terraform_ls_options', '') + +function! ale_linters#terraform#terraform_ls#GetTerraformExecutable(buffer) abort + let l:terraform_executable = ale#Var(a:buffer, 'terraform_terraform_executable') + + if(ale#path#IsAbsolute(l:terraform_executable)) + return '-tf-exec ' . l:terraform_executable + endif + + return '' +endfunction + +function! ale_linters#terraform#terraform_ls#GetCommand(buffer) abort + return '%e' + \ . ale#Pad('serve') + \ . ale#Pad(ale_linters#terraform#terraform_ls#GetTerraformExecutable(a:buffer)) + \ . ale#Pad(ale#Var(a:buffer, 'terraform_ls_options')) +endfunction + +function! ale_linters#terraform#terraform_ls#GetProjectRoot(buffer) abort + let l:tf_dir = ale#path#FindNearestDirectory(a:buffer, '.terraform') + + return !empty(l:tf_dir) ? fnamemodify(l:tf_dir, ':h:h') : '' +endfunction + +call ale#linter#Define('terraform', { +\ 'name': 'terraform_ls', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'terraform_ls_executable')}, +\ 'command': function('ale_linters#terraform#terraform_ls#GetCommand'), +\ 'project_root': function('ale_linters#terraform#terraform_ls#GetProjectRoot'), +\ 'language': 'terraform', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/terraform/terraform_lsp.vim b/dot_vim/plugged/ale/ale_linters/terraform/terraform_lsp.vim new file mode 100644 index 0000000..e2408c1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/terraform/terraform_lsp.vim @@ -0,0 +1,25 @@ +" Author: OJFord +" Description: terraform-lsp integration for ALE (cf. https://github.com/juliosueiras/terraform-lsp) + +call ale#Set('terraform_langserver_executable', 'terraform-lsp') +call ale#Set('terraform_langserver_options', '') + +function! ale_linters#terraform#terraform_lsp#GetCommand(buffer) abort + return '%e' + \ . ale#Pad(ale#Var(a:buffer, 'terraform_langserver_options')) +endfunction + +function! ale_linters#terraform#terraform_lsp#GetProjectRoot(buffer) abort + let l:tf_dir = ale#path#FindNearestDirectory(a:buffer, '.terraform') + + return !empty(l:tf_dir) ? fnamemodify(l:tf_dir, ':h:h') : '' +endfunction + +call ale#linter#Define('terraform', { +\ 'name': 'terraform_lsp', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'terraform_langserver_executable')}, +\ 'command': function('ale_linters#terraform#terraform_lsp#GetCommand'), +\ 'project_root': function('ale_linters#terraform#terraform_lsp#GetProjectRoot'), +\ 'language': 'terraform', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/terraform/tflint.vim b/dot_vim/plugged/ale/ale_linters/terraform/tflint.vim new file mode 100644 index 0000000..86b5b74 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/terraform/tflint.vim @@ -0,0 +1,105 @@ +" Author: Nat Williams +" Description: tflint for Terraform files +" +" See: https://www.terraform.io/ +" https://github.com/wata727/tflint + +call ale#Set('terraform_tflint_options', '') +call ale#Set('terraform_tflint_executable', 'tflint') + +function! ale_linters#terraform#tflint#Handle(buffer, lines) abort + let l:output = [] + let l:pattern = '\v^(.*):(\d+),(\d+)-(\d+)?,?(\d+): (.{-1,}); (.+)$' + let l:json = ale#util#FuzzyJSONDecode(a:lines, {}) + + " This is a rough test for tflint's output format + " On versions prior to 0.11 it outputs all errors as a single level list + if type(l:json) is v:t_list + for l:error in l:json + if l:error.type is# 'ERROR' + let l:type = 'E' + elseif l:error.type is# 'NOTICE' + let l:type = 'I' + else + let l:type = 'W' + endif + + call add(l:output, { + \ 'lnum': l:error.line, + \ 'text': l:error.message, + \ 'type': l:type, + \ 'code': l:error.detector, + \}) + endfor + else + for l:error in get(l:json, 'errors', []) + for l:match in ale#util#GetMatches(l:error.message, [l:pattern]) + if l:match[4] is# '' + let l:match[4] = l:match[2] + endif + + call add(l:output, { + \ 'filename': l:match[1], + \ 'lnum': str2nr(l:match[2]), + \ 'col': str2nr(l:match[3]), + \ 'end_lnum': str2nr(l:match[4]), + \ 'end_col': str2nr(l:match[5]), + \ 'text': l:match[7], + \ 'code': l:match[6], + \ 'type': 'E', + \}) + endfor + endfor + + for l:error in get(l:json, 'issues', []) + if l:error.rule.severity is# 'ERROR' + let l:type = 'E' + elseif l:error.rule.severity is# 'NOTICE' + let l:type = 'I' + else + let l:type = 'W' + endif + + call add(l:output, { + \ 'filename': l:error.range.filename, + \ 'lnum': l:error.range.start.line, + \ 'col': l:error.range.start.column, + \ 'end_lnum': l:error.range.end.line, + \ 'end_col': l:error.range.end.column, + \ 'text': l:error.message, + \ 'code': l:error.rule.name, + \ 'type': l:type, + \}) + endfor + endif + + return l:output +endfunction + +function! ale_linters#terraform#tflint#GetCommand(buffer) abort + let l:cmd = '%e' + + let l:config_file = ale#path#FindNearestFile(a:buffer, '.tflint.hcl') + + if !empty(l:config_file) + let l:cmd .= ' --config ' . ale#Escape(l:config_file) + endif + + let l:opts = ale#Var(a:buffer, 'terraform_tflint_options') + + if !empty(l:opts) + let l:cmd .= ' ' . l:opts + endif + + let l:cmd .= ' -f json' + + return l:cmd +endfunction + +call ale#linter#Define('terraform', { +\ 'name': 'tflint', +\ 'executable': {b -> ale#Var(b, 'terraform_tflint_executable')}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#terraform#tflint#GetCommand'), +\ 'callback': 'ale_linters#terraform#tflint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/terraform/tfsec.vim b/dot_vim/plugged/ale/ale_linters/terraform/tfsec.vim new file mode 100644 index 0000000..d29cdd1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/terraform/tfsec.vim @@ -0,0 +1,87 @@ +" Description: tfsec for Terraform files +" +" See: https://www.terraform.io/ +" https://github.com/aquasecurity/tfsec + +call ale#Set('terraform_tfsec_options', '') +call ale#Set('terraform_tfsec_executable', 'tfsec') + +let s:separator = has('win32') ? '\' : '/' + +function! ale_linters#terraform#tfsec#Handle(buffer, lines) abort + let l:output = [] + let l:json = ale#util#FuzzyJSONDecode(a:lines, {}) + + " if there's no warning, 'result' is `null`. + if empty(get(l:json, 'results')) + return l:output + endif + + for l:result in get(l:json, 'results', []) + if l:result.severity is# 'LOW' + let l:type = 'I' + elseif l:result.severity is# 'CRITICAL' + let l:type = 'E' + else + let l:type = 'W' + endif + + call add(l:output, { + \ 'filename': l:result.location.filename, + \ 'lnum': l:result.location.start_line, + \ 'end_lnum': l:result.location.end_line, + \ 'text': l:result.description, + \ 'code': l:result.long_id, + \ 'type': l:type, + \}) + endfor + + return l:output +endfunction + +" Construct command arguments to tfsec with `terraform_tfsec_options`. +function! ale_linters#terraform#tfsec#GetCommand(buffer) abort + let l:cmd = '%e' + + let l:config = ale_linters#terraform#tfsec#FindConfig(a:buffer) + + if !empty(l:config) + let l:cmd .= ' --config-file ' . l:config + endif + + let l:opts = ale#Var(a:buffer, 'terraform_tfsec_options') + + if !empty(l:opts) + let l:cmd .= ' ' . l:opts + endif + + let l:cmd .= ' --format json' + + return l:cmd +endfunction + +" Find the nearest configuration file of tfsec. +function! ale_linters#terraform#tfsec#FindConfig(buffer) abort + let l:config_dir = ale#path#FindNearestDirectory(a:buffer, '.tfsec') + + if !empty(l:config_dir) + " https://aquasecurity.github.io/tfsec/v1.28.0/guides/configuration/config/ + for l:basename in ['config.yml', 'config.json'] + let l:config = ale#path#Simplify(join([l:config_dir, l:basename], s:separator)) + + if filereadable(l:config) + return ale#Escape(l:config) + endif + endfor + endif + + return '' +endfunction + +call ale#linter#Define('terraform', { +\ 'name': 'tfsec', +\ 'executable': {b -> ale#Var(b, 'terraform_tfsec_executable')}, +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#terraform#tfsec#GetCommand'), +\ 'callback': 'ale_linters#terraform#tfsec#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/testft/testlinter.vim b/dot_vim/plugged/ale/ale_linters/testft/testlinter.vim new file mode 100644 index 0000000..65e0b20 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/testft/testlinter.vim @@ -0,0 +1,10 @@ +" Author: neersighted +" Description: dummy linter to use in tests + +call ale#linter#Define('testft', { +\ 'name': 'testlinter', +\ 'output_stream': 'stdout', +\ 'executable': 'testlinter', +\ 'command': 'testlinter', +\ 'callback': 'testCB', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/tex/alex.vim b/dot_vim/plugged/ale/ale_linters/tex/alex.vim new file mode 100644 index 0000000..5d9aec6 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for TeX files + +call ale#handlers#alex#DefineLinter('tex', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/tex/chktex.vim b/dot_vim/plugged/ale/ale_linters/tex/chktex.vim new file mode 100644 index 0000000..160baf0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/chktex.vim @@ -0,0 +1,54 @@ +" Author: Andrew Balmos - +" Description: chktex for LaTeX files + +let g:ale_tex_chktex_executable = +\ get(g:, 'ale_tex_chktex_executable', 'chktex') + +let g:ale_tex_chktex_options = +\ get(g:, 'ale_tex_chktex_options', '-I') + +function! ale_linters#tex#chktex#GetCommand(buffer) abort + " Check for optional .chktexrc + let l:chktex_config = ale#path#FindNearestFile( + \ a:buffer, + \ '.chktexrc') + + let l:command = ale#Var(a:buffer, 'tex_chktex_executable') + " Avoid bug when used without -p (last warning has gibberish for a filename) + let l:command .= ' -v0 -p stdin -q' + + if !empty(l:chktex_config) + let l:command .= ' -l ' . ale#Escape(l:chktex_config) + endif + + let l:command .= ' ' . ale#Var(a:buffer, 'tex_chktex_options') + + return l:command +endfunction + +function! ale_linters#tex#chktex#Handle(buffer, lines) abort + " Mattes lines like: + " + " stdin:499:2:24:Delete this space to maintain correct pagereferences. + " stdin:507:81:3:You should enclose the previous parenthesis with `{}'. + let l:pattern = '^stdin:\(\d\+\):\(\d\+\):\(\d\+\):\(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[4] . ' (' . (l:match[3]+0) . ')', + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('tex', { +\ 'name': 'chktex', +\ 'executable': 'chktex', +\ 'command': function('ale_linters#tex#chktex#GetCommand'), +\ 'callback': 'ale_linters#tex#chktex#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/tex/cspell.vim b/dot_vim/plugged/ale/ale_linters/tex/cspell.vim new file mode 100644 index 0000000..4cf2b08 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for TeX files. + +call ale#handlers#cspell#DefineLinter('tex') diff --git a/dot_vim/plugged/ale/ale_linters/tex/lacheck.vim b/dot_vim/plugged/ale/ale_linters/tex/lacheck.vim new file mode 100644 index 0000000..35aad08 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/lacheck.vim @@ -0,0 +1,43 @@ +" Author: Andrew Balmos - +" Description: lacheck for LaTeX files + +call ale#Set('tex_lacheck_executable', 'lacheck') + +function! ale_linters#tex#lacheck#Handle(buffer, lines) abort + " Mattes lines like: + " + " "book.tex", line 37: possible unwanted space at "{" + " "book.tex", line 38: missing `\ ' after "etc." + let l:pattern = '^"\(.\+\)", line \(\d\+\): \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + " lacheck follows `\input{}` commands. If the cwd is not the same as the + " file in the buffer then it will fail to find the inputted items. We do not + " want warnings from those items anyway + if !empty(matchstr(l:match[3], '^Could not open ".\+"$')) + continue + endif + + " lacheck follows `\input{}` commands. We are only interested in + " reporting errors for the current buffer only. + if empty(matchstr(fnamemodify(l:match[1], ':t'), fnamemodify(bufname(a:buffer), ':t'))) + continue + endif + + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'text': l:match[3], + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('tex', { +\ 'name': 'lacheck', +\ 'executable': {b -> ale#Var(b, 'tex_lacheck_executable')}, +\ 'command': '%e %t', +\ 'callback': 'ale_linters#tex#lacheck#Handle' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/tex/proselint.vim b/dot_vim/plugged/ale/ale_linters/tex/proselint.vim new file mode 100644 index 0000000..35e764e --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/proselint.vim @@ -0,0 +1,9 @@ +" Author: poohzrn https://github.com/poohzrn +" Description: proselint for TeX files + +call ale#linter#Define('tex', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/tex/redpen.vim b/dot_vim/plugged/ale/ale_linters/tex/redpen.vim new file mode 100644 index 0000000..952a600 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/redpen.vim @@ -0,0 +1,9 @@ +" Author: rhysd https://rhysd.github.io +" Description: Redpen, a proofreading tool (http://redpen.cc) + +call ale#linter#Define('tex', { +\ 'name': 'redpen', +\ 'executable': 'redpen', +\ 'command': 'redpen -f latex -r json %t', +\ 'callback': 'ale#handlers#redpen#HandleRedpenOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/tex/texlab.vim b/dot_vim/plugged/ale/ale_linters/tex/texlab.vim new file mode 100644 index 0000000..8e96b80 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/texlab.vim @@ -0,0 +1,26 @@ +" Author: Ricardo Liang +" Author: ourigen +" Description: Texlab language server (Rust rewrite) + +call ale#Set('tex_texlab_executable', 'texlab') +call ale#Set('tex_texlab_options', '') +call ale#Set('tex_texlab_config', {}) + +function! ale_linters#tex#texlab#GetProjectRoot(buffer) abort + let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') + + return !empty(l:git_path) ? fnamemodify(l:git_path, ':h:h') : '' +endfunction + +function! ale_linters#tex#texlab#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'tex_texlab_options')) +endfunction + +call ale#linter#Define('tex', { +\ 'name': 'texlab', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'tex_texlab_executable')}, +\ 'command': function('ale_linters#tex#texlab#GetCommand'), +\ 'project_root': function('ale_linters#tex#texlab#GetProjectRoot'), +\ 'lsp_config': {b -> ale#Var(b, 'tex_texlab_config')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/tex/textlint.vim b/dot_vim/plugged/ale/ale_linters/tex/textlint.vim new file mode 100644 index 0000000..5edac46 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/textlint.vim @@ -0,0 +1,9 @@ +" Author: TANIGUCHI Masaya +" Description: textlint for LaTeX files + +call ale#linter#Define('tex', { +\ 'name': 'textlint', +\ 'executable': function('ale#handlers#textlint#GetExecutable'), +\ 'command': function('ale#handlers#textlint#GetCommand'), +\ 'callback': 'ale#handlers#textlint#HandleTextlintOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/tex/vale.vim b/dot_vim/plugged/ale/ale_linters/tex/vale.vim new file mode 100644 index 0000000..f64e72a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/vale.vim @@ -0,0 +1,9 @@ +" Author: chew-z https://github.com/chew-z +" Description: vale for LaTeX files + +call ale#linter#Define('tex', { +\ 'name': 'vale', +\ 'executable': 'vale', +\ 'command': 'vale --output=JSON %t', +\ 'callback': 'ale#handlers#vale#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/tex/writegood.vim b/dot_vim/plugged/ale/ale_linters/tex/writegood.vim new file mode 100644 index 0000000..c1aeace --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/tex/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for TeX files + +call ale#handlers#writegood#DefineLinter('tex') diff --git a/dot_vim/plugged/ale/ale_linters/texinfo/alex.vim b/dot_vim/plugged/ale/ale_linters/texinfo/alex.vim new file mode 100644 index 0000000..4d24552 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/texinfo/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for texinfo files + +call ale#handlers#alex#DefineLinter('texinfo', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/texinfo/cspell.vim b/dot_vim/plugged/ale/ale_linters/texinfo/cspell.vim new file mode 100644 index 0000000..d691b3a --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/texinfo/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for TeXInfo files. + +call ale#handlers#cspell#DefineLinter('texinfo') diff --git a/dot_vim/plugged/ale/ale_linters/texinfo/proselint.vim b/dot_vim/plugged/ale/ale_linters/texinfo/proselint.vim new file mode 100644 index 0000000..003e3a0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/texinfo/proselint.vim @@ -0,0 +1,9 @@ +" Author: Daniel M. Capella https://github.com/polyzen +" Description: proselint for Texinfo files + +call ale#linter#Define('texinfo', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/texinfo/writegood.vim b/dot_vim/plugged/ale/ale_linters/texinfo/writegood.vim new file mode 100644 index 0000000..4427f05 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/texinfo/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for Texinfo files + +call ale#handlers#writegood#DefineLinter('texinfo') diff --git a/dot_vim/plugged/ale/ale_linters/text/alex.vim b/dot_vim/plugged/ale/ale_linters/text/alex.vim new file mode 100644 index 0000000..d87ed91 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/text/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for text files + +call ale#handlers#alex#DefineLinter('text', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/text/cspell.vim b/dot_vim/plugged/ale/ale_linters/text/cspell.vim new file mode 100644 index 0000000..813ef3b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/text/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for general text files. + +call ale#handlers#cspell#DefineLinter('text') diff --git a/dot_vim/plugged/ale/ale_linters/text/languagetool.vim b/dot_vim/plugged/ale/ale_linters/text/languagetool.vim new file mode 100644 index 0000000..58c99ba --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/text/languagetool.vim @@ -0,0 +1,4 @@ +" Author: Vincent (wahrwolf [ät] wolfpit.net) +" Description: languagetool for text files + +call ale#handlers#languagetool#DefineLinter('text') diff --git a/dot_vim/plugged/ale/ale_linters/text/proselint.vim b/dot_vim/plugged/ale/ale_linters/text/proselint.vim new file mode 100644 index 0000000..281b4ff --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/text/proselint.vim @@ -0,0 +1,9 @@ +" Author: poohzrn https://github.com/poohzrn +" Description: proselint for text files + +call ale#linter#Define('text', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/text/redpen.vim b/dot_vim/plugged/ale/ale_linters/text/redpen.vim new file mode 100644 index 0000000..ec4433b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/text/redpen.vim @@ -0,0 +1,9 @@ +" Author: rhysd https://rhysd.github.io +" Description: Redpen, a proofreading tool (http://redpen.cc) + +call ale#linter#Define('text', { +\ 'name': 'redpen', +\ 'executable': 'redpen', +\ 'command': 'redpen -f plain -r json %t', +\ 'callback': 'ale#handlers#redpen#HandleRedpenOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/text/textlint.vim b/dot_vim/plugged/ale/ale_linters/text/textlint.vim new file mode 100644 index 0000000..67c4e37 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/text/textlint.vim @@ -0,0 +1,9 @@ +" Author: Yasuhiro Kiyota +" Description: textlint, a proofreading tool (https://textlint.github.io/) + +call ale#linter#Define('text', { +\ 'name': 'textlint', +\ 'executable': function('ale#handlers#textlint#GetExecutable'), +\ 'command': function('ale#handlers#textlint#GetCommand'), +\ 'callback': 'ale#handlers#textlint#HandleTextlintOutput', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/text/vale.vim b/dot_vim/plugged/ale/ale_linters/text/vale.vim new file mode 100644 index 0000000..cf37c2f --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/text/vale.vim @@ -0,0 +1,9 @@ +" Author: chew-z https://github.com/chew-z +" Description: vale for text files + +call ale#linter#Define('text', { +\ 'name': 'vale', +\ 'executable': 'vale', +\ 'command': 'vale --output=JSON %t', +\ 'callback': 'ale#handlers#vale#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/text/writegood.vim b/dot_vim/plugged/ale/ale_linters/text/writegood.vim new file mode 100644 index 0000000..81b935d --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/text/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for text files + +call ale#handlers#writegood#DefineLinter('text') diff --git a/dot_vim/plugged/ale/ale_linters/thrift/thrift.vim b/dot_vim/plugged/ale/ale_linters/thrift/thrift.vim new file mode 100644 index 0000000..345c7ab --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/thrift/thrift.vim @@ -0,0 +1,87 @@ +" Author: Jon Parise + +call ale#Set('thrift_thrift_executable', 'thrift') +call ale#Set('thrift_thrift_generators', ['cpp']) +call ale#Set('thrift_thrift_includes', ['.']) +call ale#Set('thrift_thrift_options', '-strict') + +function! ale_linters#thrift#thrift#GetCommand(buffer) abort + let l:generators = ale#Var(a:buffer, 'thrift_thrift_generators') + let l:includes = ale#Var(a:buffer, 'thrift_thrift_includes') + + " The thrift compiler requires at least one generator. If none are set, + " fall back to our default value to avoid silently failing. We could also + " `throw` here, but that seems even less helpful. + if empty(l:generators) + let l:generators = ['cpp'] + endif + + let l:output_dir = ale#command#CreateDirectory(a:buffer) + + return '%e' + \ . ale#Pad(join(map(copy(l:generators), "'--gen ' . v:val"))) + \ . ale#Pad(join(map(copy(l:includes), "'-I ' . v:val"))) + \ . ale#Pad(ale#Var(a:buffer, 'thrift_thrift_options')) + \ . ' -out ' . ale#Escape(l:output_dir) + \ . ' %t' +endfunction + +function! ale_linters#thrift#thrift#Handle(buffer, lines) abort + " Matches lines like the following: + " + " [SEVERITY:/path/filename.thrift:31] Message text + " [ERROR:/path/filename.thrift:31] (last token was ';') + let l:pattern = '\v^\[(\u+):(.*):(\d+)\] (.*)$' + + let l:index = 0 + let l:output = [] + + " Roll our own output-matching loop instead of using ale#util#GetMatches + " because we need to support error messages that span multiple lines. + while l:index < len(a:lines) + let l:line = a:lines[l:index] + + let l:match = matchlist(l:line, l:pattern) + + if empty(l:match) + let l:index += 1 + continue + endif + + let l:severity = l:match[1] + + if l:severity is# 'WARNING' + let l:type = 'W' + else + let l:type = 'E' + endif + + " If our text looks like "(last token was ';')", the *next* line + " should contain a more descriptive error message. + let l:text = l:match[4] + + if l:text =~# '\(last token was .*\)' + let l:index += 1 + let l:text = get(a:lines, l:index, 'Unknown error ' . l:text) + endif + + call add(l:output, { + \ 'lnum': l:match[3] + 0, + \ 'col': 0, + \ 'type': l:type, + \ 'text': l:text, + \}) + + let l:index += 1 + endwhile + + return l:output +endfunction + +call ale#linter#Define('thrift', { +\ 'name': 'thrift', +\ 'output_stream': 'both', +\ 'executable': {b -> ale#Var(b, 'thrift_thrift_executable')}, +\ 'command': function('ale_linters#thrift#thrift#GetCommand'), +\ 'callback': 'ale_linters#thrift#thrift#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/thrift/thriftcheck.vim b/dot_vim/plugged/ale/ale_linters/thrift/thriftcheck.vim new file mode 100644 index 0000000..bf929d1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/thrift/thriftcheck.vim @@ -0,0 +1,46 @@ +" Author: Jon Parise + +call ale#Set('thrift_thriftcheck_executable', 'thriftcheck') +call ale#Set('thrift_thriftcheck_options', '') + +function! ale_linters#thrift#thriftcheck#GetCommand(buffer) abort + return '%e' + \ . ale#Pad(ale#Var(a:buffer, 'thrift_thriftcheck_options')) + \ . ' --stdin-filename %s' + \ . ' %t' +endfunction + +function! ale_linters#thrift#thriftcheck#Handle(buffer, lines) abort + " Matches lines like the following: + " + " file.thrift:1:1: error: "py" namespace must match "^idl\\." (namespace.pattern) + " file.thrift:3:5: warning: 64-bit integer constant -2147483649 may not work in all languages (int.64bit) + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+): ?([^:]+): (.+) \(([^\)]+)\)$' + + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if l:match[3] is# 'warning' + let l:type = 'W' + else + let l:type = 'E' + endif + + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:type, + \ 'text': l:match[4], + \ 'code': l:match[5], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('thrift', { +\ 'name': 'thriftcheck', +\ 'executable': {b -> ale#Var(b, 'thrift_thriftcheck_executable')}, +\ 'command': function('ale_linters#thrift#thriftcheck#GetCommand'), +\ 'callback': 'ale_linters#thrift#thriftcheck#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/typescript/cspell.vim b/dot_vim/plugged/ale/ale_linters/typescript/cspell.vim new file mode 100644 index 0000000..6061b75 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/typescript/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for TypeScript files. + +call ale#handlers#cspell#DefineLinter('typescript') diff --git a/dot_vim/plugged/ale/ale_linters/typescript/deno.vim b/dot_vim/plugged/ale/ale_linters/typescript/deno.vim new file mode 100644 index 0000000..f47fac7 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/typescript/deno.vim @@ -0,0 +1,12 @@ +" Author: Mohammed Chelouti - https://github.com/motato1 +" Arnold Chand +" Description: Deno lsp linter for TypeScript files. + +call ale#linter#Define('typescript', { +\ 'name': 'deno', +\ 'lsp': 'stdio', +\ 'executable': function('ale#handlers#deno#GetExecutable'), +\ 'command': '%e lsp', +\ 'project_root': function('ale#handlers#deno#GetProjectRoot'), +\ 'initialization_options': function('ale#handlers#deno#GetInitializationOptions'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/typescript/eslint.vim b/dot_vim/plugged/ale/ale_linters/typescript/eslint.vim new file mode 100644 index 0000000..eaeac30 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/typescript/eslint.vim @@ -0,0 +1,10 @@ +" Author: w0rp +" Description: eslint for JavaScript files + +call ale#linter#Define('typescript', { +\ 'name': 'eslint', +\ 'executable': function('ale#handlers#eslint#GetExecutable'), +\ 'cwd': function('ale#handlers#eslint#GetCwd'), +\ 'command': function('ale#handlers#eslint#GetCommand'), +\ 'callback': 'ale#handlers#eslint#HandleJSON', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/typescript/standard.vim b/dot_vim/plugged/ale/ale_linters/typescript/standard.vim new file mode 100644 index 0000000..1d524a1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/typescript/standard.vim @@ -0,0 +1,31 @@ +" Author: Ahmed El Gabri <@ahmedelgabri> +" Description: standardjs for typescript files + +call ale#Set('typescript_standard_executable', 'standard') +call ale#Set('typescript_standard_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('typescript_standard_options', '') + +function! ale_linters#typescript#standard#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'typescript_standard', [ + \ 'node_modules/standardx/bin/cmd.js', + \ 'node_modules/standard/bin/cmd.js', + \ 'node_modules/.bin/standard', + \]) +endfunction + +function! ale_linters#typescript#standard#GetCommand(buffer) abort + let l:executable = ale_linters#typescript#standard#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'typescript_standard_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --stdin %s' +endfunction + +" standard uses eslint and the output format is the same +call ale#linter#Define('typescript', { +\ 'name': 'standard', +\ 'executable': function('ale_linters#typescript#standard#GetExecutable'), +\ 'command': function('ale_linters#typescript#standard#GetCommand'), +\ 'callback': 'ale#handlers#eslint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/typescript/tslint.vim b/dot_vim/plugged/ale/ale_linters/typescript/tslint.vim new file mode 100644 index 0000000..886a3cd --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/typescript/tslint.vim @@ -0,0 +1,75 @@ +" Author: Prashanth Chandra , Jonathan Clem +" Description: tslint for TypeScript files + +call ale#handlers#tslint#InitVariables() + +function! ale_linters#typescript#tslint#Handle(buffer, lines) abort + " Do not output any errors for empty files if the option is on. + if ale#Var(a:buffer, 'typescript_tslint_ignore_empty_files') + \&& getbufline(a:buffer, 1, '$') == [''] + return [] + endif + + let l:dir = expand('#' . a:buffer . ':p:h') + let l:output = [] + + for l:error in ale#util#FuzzyJSONDecode(a:lines, []) + if get(l:error, 'ruleName', '') is# 'no-implicit-dependencies' + continue + endif + + let l:item = { + \ 'type': (get(l:error, 'ruleSeverity', '') is# 'WARNING' ? 'W' : 'E'), + \ 'text': l:error.failure, + \ 'lnum': l:error.startPosition.line + 1, + \ 'col': l:error.startPosition.character + 1, + \ 'end_lnum': l:error.endPosition.line + 1, + \ 'end_col': l:error.endPosition.character + 1, + \} + + let l:filename = ale#path#GetAbsPath(l:dir, l:error.name) + + " Assume temporary files are this file. + if !ale#path#IsTempName(l:filename) + let l:item.filename = l:filename + endif + + if has_key(l:error, 'ruleName') + let l:item.code = l:error.ruleName + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +function! ale_linters#typescript#tslint#GetCommand(buffer) abort + let l:tslint_config_path = ale#path#ResolveLocalPath( + \ a:buffer, + \ 'tslint.json', + \ ale#Var(a:buffer, 'typescript_tslint_config_path') + \) + let l:tslint_config_option = !empty(l:tslint_config_path) + \ ? ' -c ' . ale#Escape(l:tslint_config_path) + \ : '' + + let l:tslint_rules_dir = ale#Var(a:buffer, 'typescript_tslint_rules_dir') + let l:tslint_rules_option = !empty(l:tslint_rules_dir) + \ ? ' -r ' . ale#Escape(l:tslint_rules_dir) + \ : '' + + return ale#Escape(ale#handlers#tslint#GetExecutable(a:buffer)) + \ . ' --format json' + \ . l:tslint_config_option + \ . l:tslint_rules_option + \ . ' %t' +endfunction + +call ale#linter#Define('typescript', { +\ 'name': 'tslint', +\ 'executable': function('ale#handlers#tslint#GetExecutable'), +\ 'cwd': '%s:h', +\ 'command': function('ale_linters#typescript#tslint#GetCommand'), +\ 'callback': 'ale_linters#typescript#tslint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/typescript/tsserver.vim b/dot_vim/plugged/ale/ale_linters/typescript/tsserver.vim new file mode 100644 index 0000000..d97becc --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/typescript/tsserver.vim @@ -0,0 +1,18 @@ +" Author: w0rp +" Description: tsserver integration for ALE + +call ale#Set('typescript_tsserver_executable', 'tsserver') +call ale#Set('typescript_tsserver_config_path', '') +call ale#Set('typescript_tsserver_use_global', get(g:, 'ale_use_global_executables', 0)) + +call ale#linter#Define('typescript', { +\ 'name': 'tsserver', +\ 'lsp': 'tsserver', +\ 'executable': {b -> ale#path#FindExecutable(b, 'typescript_tsserver', [ +\ '.yarn/sdks/typescript/bin/tsserver', +\ 'node_modules/.bin/tsserver', +\ ])}, +\ 'command': '%e', +\ 'project_root': function('ale#handlers#tsserver#GetProjectRoot'), +\ 'language': '', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/typescript/typecheck.vim b/dot_vim/plugged/ale/ale_linters/typescript/typecheck.vim new file mode 100644 index 0000000..2f18691 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/typescript/typecheck.vim @@ -0,0 +1,33 @@ +" Author: Prashanth Chandra https://github.com/prashcr, Aleh Kashnikau https://github.com/mkusher +" Description: type checker for TypeScript files + +function! ale_linters#typescript#typecheck#Handle(buffer, lines) abort + " Matches patterns like the following: + " + " hello.ts[7, 41]: Property 'a' does not exist on type 'A' + " hello.ts[16, 7]: Type 'A' is not assignable to type 'B' + " + let l:pattern = '.\+\.ts\[\(\d\+\), \(\d\+\)\]: \(.\+\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:line = l:match[1] + 0 + let l:column = l:match[2] + 0 + let l:text = l:match[3] + + call add(l:output, { + \ 'lnum': l:line, + \ 'col': l:column, + \ 'text': l:text, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('typescript', { +\ 'name': 'typecheck', +\ 'executable': 'typecheck', +\ 'command': 'typecheck %s', +\ 'callback': 'ale_linters#typescript#typecheck#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/typescript/xo.vim b/dot_vim/plugged/ale/ale_linters/typescript/xo.vim new file mode 100644 index 0000000..6f4ee50 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/typescript/xo.vim @@ -0,0 +1,6 @@ +call ale#linter#Define('typescript', { +\ 'name': 'xo', +\ 'executable': function('ale#handlers#xo#GetExecutable'), +\ 'command': function('ale#handlers#xo#GetLintCommand'), +\ 'callback': 'ale#handlers#xo#HandleJSON', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/v/v.vim b/dot_vim/plugged/ale/ale_linters/v/v.vim new file mode 100644 index 0000000..afa98c5 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/v/v.vim @@ -0,0 +1,82 @@ +" Author: fiatjaf +" Description: v build for V files + +call ale#Set('v_v_executable', 'v') +call ale#Set('v_v_options', '') + +function! ale_linters#v#v#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'v_v_options') + + " Run v in local directory with relative path + let l:command = ale#Var(a:buffer, 'v_v_executable') + \ . ale#Pad(l:options) + \ . ' .' . ' -o /tmp/vim-ale-v' + + return l:command +endfunction + +function! ale_linters#v#v#Handler(buffer, lines) abort + let l:dir = expand('#' . a:buffer . ':p:h') + let l:output = [] + + " Matches patterns like the following: + " + " ./const.v:4:3: warning: const names cannot contain uppercase letters, use snake_case instead + " 2 | + " 3 | const ( + " 4 | BUTTON_TEXT = 'OK' + " | ~~~~~~~~~~~ + " 5 | ) + " ./main.v:4:8: warning: module 'os' is imported but never used + " 2 | + " 3 | import ui + " 4 | import os + " | ~~ + " 5 | + " 6 | const ( + " ./main.v:20:10: error: undefined ident: `win_widt` + " 18 | mut app := &App{} + " 19 | app.window = ui.window({ + " 20 | width: win_widt + " | ~~~~~~~~ + " 21 | height: win_height + " 22 | title: 'Counter' + let l:current = {} + + for l:line in a:lines + " matches basic error description + let l:match = matchlist(l:line, + \ '\([^:]\+\):\([^:]\+\):\([^:]\+\): \([^:]\+\): \(.*\)') + + if !empty(l:match) + let l:current = { + \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[5], + \ 'type': l:match[4] is# 'error' ? 'E' : 'W', + \} + call add(l:output, l:current) + continue + endif + + " try to get information about the ending column + let l:tildematch = matchstr(l:line, '\~\+') + + if !empty(l:tildematch) + let l:current['end_col'] = l:current['col'] + len(l:tildematch) + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('v', { +\ 'name': 'v', +\ 'aliases': [], +\ 'executable': {b -> ale#Var(b, 'v_v_executable')}, +\ 'command': function('ale_linters#v#v#GetCommand'), +\ 'output_stream': 'stderr', +\ 'callback': 'ale_linters#v#v#Handler', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/vala/vala_lint.vim b/dot_vim/plugged/ale/ale_linters/vala/vala_lint.vim new file mode 100644 index 0000000..7f8a566 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vala/vala_lint.vim @@ -0,0 +1,66 @@ +" Author: Atsuya Takagi +" Description: A linter for Vala using Vala-Lint. + +call ale#Set('vala_vala_lint_config_filename', 'vala-lint.conf') +call ale#Set('vala_vala_lint_executable', 'io.elementary.vala-lint') + +function! ale_linters#vala#vala_lint#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'vala_vala_lint_executable') +endfunction + +function! ale_linters#vala#vala_lint#GetCommand(buffer) abort + let l:command = ale_linters#vala#vala_lint#GetExecutable(a:buffer) + + let l:config_filename = ale#Var(a:buffer, 'vala_vala_lint_config_filename') + let l:config_path = ale#path#FindNearestFile(a:buffer, l:config_filename) + + if !empty(l:config_path) + let l:command .= ' -c ' . l:config_path + endif + + return l:command . ' %s' +endfunction + +function! ale_linters#vala#vala_lint#Handle(buffer, lines) abort + let l:pattern = '^\s*\(\d\+\)\.\(\d\+\)\s\+\(error\|warn\)\s\+\(.\+\)\s\([A-Za-z0-9_\-]\+\)' + let l:output = [] + + for l:line in a:lines + " remove color escape sequences since vala-lint doesn't support + " output without colors + let l:cleaned_line = substitute(l:line, '\e\[[0-9;]\+[mK]', '', 'g') + let l:match = matchlist(l:cleaned_line, l:pattern) + + if len(l:match) == 0 + continue + endif + + let l:refined_type = l:match[3] is# 'warn' ? 'W' : 'E' + let l:cleaned_text = substitute(l:match[4], '^\s*\(.\{-}\)\s*$', '\1', '') + + let l:lnum = l:match[1] + 0 + let l:column = l:match[2] + 0 + let l:type = l:refined_type + let l:text = l:cleaned_text + let l:code = l:match[5] + + call add(l:output, { + \ 'lnum': l:lnum, + \ 'col': l:column, + \ 'text': l:text, + \ 'type': l:type, + \ 'code': l:code, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('vala', { +\ 'name': 'vala_lint', +\ 'output_stream': 'stdout', +\ 'executable': function('ale_linters#vala#vala_lint#GetExecutable'), +\ 'command': function('ale_linters#vala#vala_lint#GetCommand'), +\ 'callback': 'ale_linters#vala#vala_lint#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/verilog/hdl_checker.vim b/dot_vim/plugged/ale/ale_linters/verilog/hdl_checker.vim new file mode 100644 index 0000000..b05d856 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/verilog/hdl_checker.vim @@ -0,0 +1,5 @@ +" Author: suoto +" Description: Adds support for HDL Code Checker, which wraps vcom/vlog, ghdl +" or xvhdl. More info on https://github.com/suoto/hdl_checker + +call ale#handlers#hdl_checker#DefineLinter('verilog') diff --git a/dot_vim/plugged/ale/ale_linters/verilog/iverilog.vim b/dot_vim/plugged/ale/ale_linters/verilog/iverilog.vim new file mode 100644 index 0000000..e081f33 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/verilog/iverilog.vim @@ -0,0 +1,43 @@ +" Author: Masahiro H https://github.com/mshr-h +" Description: iverilog for verilog files + +call ale#Set('verilog_iverilog_options', '') + +function! ale_linters#verilog#iverilog#GetCommand(buffer) abort + return 'iverilog -t null -Wall ' + \ . ale#Var(a:buffer, 'verilog_iverilog_options') + \ . ' %t' +endfunction + +function! ale_linters#verilog#iverilog#Handle(buffer, lines) abort + " Look for lines like the following. + " + " tb_me_top.v:37: warning: Instantiating module me_top with dangling input port 1 (rst_n) floating. + " tb_me_top.v:17: syntax error + " memory_single_port.v:2: syntax error + " tb_me_top.v:17: error: Invalid module instantiation + let l:pattern = '^[^:]\+:\(\d\+\): \(warning\|error\|syntax error\)\(: \(.\+\)\)\?' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:line = l:match[1] + 0 + let l:type = l:match[2] =~# 'error' ? 'E' : 'W' + let l:text = l:match[2] is# 'syntax error' ? 'syntax error' : l:match[4] + + call add(l:output, { + \ 'lnum': l:line, + \ 'text': l:text, + \ 'type': l:type, + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('verilog', { +\ 'name': 'iverilog', +\ 'output_stream': 'stderr', +\ 'executable': 'iverilog', +\ 'command': function('ale_linters#verilog#iverilog#GetCommand'), +\ 'callback': 'ale_linters#verilog#iverilog#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/verilog/verilator.vim b/dot_vim/plugged/ale/ale_linters/verilog/verilator.vim new file mode 100644 index 0000000..006e310 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/verilog/verilator.vim @@ -0,0 +1,60 @@ +" Author: Masahiro H https://github.com/mshr-h +" Description: verilator for verilog files + +" Set this option to change Verilator lint options +if !exists('g:ale_verilog_verilator_options') + let g:ale_verilog_verilator_options = '' +endif + +function! ale_linters#verilog#verilator#GetCommand(buffer) abort + " the path to the current file is systematically added to the search path + return 'verilator --lint-only -Wall -Wno-DECLFILENAME ' + \ . '-I%s:h ' + \ . ale#Var(a:buffer, 'verilog_verilator_options') .' ' + \ . '%t' +endfunction + +function! ale_linters#verilog#verilator#Handle(buffer, lines) abort + " Look for lines like the following. + " + " %Error: addr_gen.v:3: syntax error, unexpected IDENTIFIER + " %Warning-WIDTH: addr_gen.v:26: Operator ASSIGNDLY expects 12 bits on the Assign RHS, but Assign RHS's CONST '20'h0' generates 20 bits. + " %Warning-UNUSED: test.v:3: Signal is not used: a + " %Warning-UNDRIVEN: test.v:3: Signal is not driven: clk + " %Warning-UNUSED: test.v:4: Signal is not used: dout + " %Warning-BLKSEQ: test.v:10: Blocking assignments (=) in sequential (flop or latch) block; suggest delayed assignments (<=). + " Since version 4.032 (04/2020) verilator linter messages also contain the column number, + " and look like: + " %Error: /tmp/test.sv:3:1: syntax error, unexpected endmodule, expecting ';' + " + " to stay compatible with old versions of the tool, the column number is + " optional in the researched pattern + let l:pattern = '^%\(Warning\|Error\)[^:]*:\s*\([^:]\+\):\(\d\+\):\(\d\+\)\?:\? \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': str2nr(l:match[3]), + \ 'text': l:match[5], + \ 'type': l:match[1] is# 'Error' ? 'E' : 'W', + \ 'filename': l:match[2], + \} + + if !empty(l:match[4]) + let l:item.col = str2nr(l:match[4]) + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +call ale#linter#Define('verilog', { +\ 'name': 'verilator', +\ 'output_stream': 'stderr', +\ 'executable': 'verilator', +\ 'command': function('ale_linters#verilog#verilator#GetCommand'), +\ 'callback': 'ale_linters#verilog#verilator#Handle', +\ 'read_buffer': 0, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/verilog/vlog.vim b/dot_vim/plugged/ale/ale_linters/verilog/vlog.vim new file mode 100644 index 0000000..45e1977 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/verilog/vlog.vim @@ -0,0 +1,52 @@ +" Author: John Gentile +" Description: Adds support for Mentor Graphics Questa/ModelSim `vlog` Verilog compiler/checker + +call ale#Set('verilog_vlog_executable', 'vlog') +" See `$ vlog -h` for more options +call ale#Set('verilog_vlog_options', '-quiet -lint') + +function! ale_linters#verilog#vlog#GetCommand(buffer) abort + return '%e ' . ale#Pad(ale#Var(a:buffer, 'verilog_vlog_options')) . ' %t' +endfunction + +function! ale_linters#verilog#vlog#Handle(buffer, lines) abort + "Matches patterns like the following: + "** Warning: add.v(7): (vlog-2623) Undefined variable: C. + "** Error: file.v(1): (vlog-13294) Identifier must be declared with a port mode: C. + let l:pattern = '^**\s\(\w*\): \([a-zA-Z0-9\-\.\_\/ ]\+\)(\(\d\+\)):\s\+\(.*\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[3] + 0, + \ 'type': l:match[1] is? 'Error' ? 'E' : 'W', + \ 'text': l:match[4], + \ 'filename': l:match[2], + \}) + endfor + + "Matches patterns like the following: + "** Warning: (vlog-2623) add.v(7): Undefined variable: C. + "** Error: (vlog-13294) file.v(1): Identifier must be declared with a port mode: C. + " let l:pattern = '^**\s\(\w*\):[a-zA-Z0-9\-\.\_\/ ]\+(\(\d\+\)):\s\+\(.*\)' + let l:pattern = '^**\s\(\w*\):\s\([^)]*)\) \([a-zA-Z0-9\-\.\_\/ ]\+\)(\(\d\+\)):\s\+\(.*\)' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[4] + 0, + \ 'type': l:match[1] is? 'Error' ? 'E' : 'W', + \ 'text': l:match[2] . ' ' . l:match[5], + \ 'filename': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('verilog', { +\ 'name': 'vlog', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'verilog_vlog_executable')}, +\ 'command': function('ale_linters#verilog#vlog#GetCommand'), +\ 'callback': 'ale_linters#verilog#vlog#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/verilog/xvlog.vim b/dot_vim/plugged/ale/ale_linters/verilog/xvlog.vim new file mode 100644 index 0000000..98b5aae --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/verilog/xvlog.vim @@ -0,0 +1,35 @@ +" Author: John Gentile +" Description: Adds support for Xilinx Vivado `xvlog` Verilog compiler/checker + +call ale#Set('verilog_xvlog_executable', 'xvlog') +call ale#Set('verilog_xvlog_options', '') + +function! ale_linters#verilog#xvlog#GetCommand(buffer) abort + return '%e ' . ale#Pad(ale#Var(a:buffer, 'verilog_xvlog_options')) . ' %t' +endfunction + +function! ale_linters#verilog#xvlog#Handle(buffer, lines) abort + "Matches patterns like the following: + " ERROR: [VRFC 10-1412] syntax error near output [/path/to/file.v:5] + let l:pattern = '^ERROR:\s\+\(\[.*\)\[.*:\([0-9]\+\)\]' + let l:output = [] + + " NOTE: `xvlog` only prints 'INFO' and 'ERROR' messages + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'type': 'E', + \ 'text': l:match[1], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('verilog', { +\ 'name': 'xvlog', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'verilog_xvlog_executable')}, +\ 'command': function('ale_linters#verilog#xvlog#GetCommand'), +\ 'callback': 'ale_linters#verilog#xvlog#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/verilog/yosys.vim b/dot_vim/plugged/ale/ale_linters/verilog/yosys.vim new file mode 100644 index 0000000..2965775 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/verilog/yosys.vim @@ -0,0 +1,42 @@ +" Author: Nathan Sharp +" Description: Yosys for Verilog files + +call ale#Set('verilog_yosys_executable', 'yosys') +call ale#Set('verilog_yosys_options', '-Q -T -p ''read_verilog %s''') + +function! ale_linters#verilog#yosys#GetCommand(buffer) abort + return '%e ' . ale#Var(a:buffer, 'verilog_yosys_options') . ' 2>&1' +endfunction + +function! ale_linters#verilog#yosys#Handle(buffer, lines) abort + let l:output = [] + let l:path = fnamemodify(bufname(a:buffer), ':p') + + for l:match in ale#util#GetMatches(a:lines, '^\([^:]\+\):\(\d\+\): \(WARNING\|ERROR\): \(.\+\)$') + call add(l:output, { + \ 'lnum': str2nr(l:match[2]), + \ 'text': l:match[4], + \ 'type': l:match[3][0], + \ 'filename': l:match[1], + \}) + endfor + + for l:match in ale#util#GetMatches(a:lines, '^\(Warning\|ERROR\): \(.\+\)$') + call add(l:output, { + \ 'lnum': 1, + \ 'text': l:match[2], + \ 'type': l:match[1][0], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('verilog', { +\ 'name': 'yosys', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'verilog_yosys_executable')}, +\ 'command': function('ale_linters#verilog#yosys#GetCommand'), +\ 'callback': 'ale_linters#verilog#yosys#Handle', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/vhdl/ghdl.vim b/dot_vim/plugged/ale/ale_linters/vhdl/ghdl.vim new file mode 100644 index 0000000..b09e620 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vhdl/ghdl.vim @@ -0,0 +1,37 @@ +" Author: John Gentile +" Description: Adds support for `ghdl` VHDL compiler/checker + +call ale#Set('vhdl_ghdl_executable', 'ghdl') +" Compile w/VHDL-2008 support +call ale#Set('vhdl_ghdl_options', '--std=08') + +function! ale_linters#vhdl#ghdl#GetCommand(buffer) abort + return '%e -s ' . ale#Pad(ale#Var(a:buffer, 'vhdl_ghdl_options')) . ' %t' +endfunction + +function! ale_linters#vhdl#ghdl#Handle(buffer, lines) abort + " Look for 'error' lines like the following: + " dff_en.vhd:41:5:error: 'begin' is expected instead of 'if' + " /path/to/file.vhdl:12:8: no declaration for "i0" + let l:pattern = '^[a-zA-Z0-9\-\.\_\/ ]\+:\(\d\+\):\(\d\+\):\(.*\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col' : l:match[2] + 0, + \ 'text': l:match[3], + \ 'type': 'E', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('vhdl', { +\ 'name': 'ghdl', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'vhdl_ghdl_executable')}, +\ 'command': function('ale_linters#vhdl#ghdl#GetCommand'), +\ 'callback': 'ale_linters#vhdl#ghdl#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/vhdl/hdl_checker.vim b/dot_vim/plugged/ale/ale_linters/vhdl/hdl_checker.vim new file mode 100644 index 0000000..c9d306b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vhdl/hdl_checker.vim @@ -0,0 +1,5 @@ +" Author: suoto +" Description: Adds support for HDL Code Checker, which wraps vcom/vlog, ghdl +" or xvhdl. More info on https://github.com/suoto/hdl_checker + +call ale#handlers#hdl_checker#DefineLinter('vhdl') diff --git a/dot_vim/plugged/ale/ale_linters/vhdl/vcom.vim b/dot_vim/plugged/ale/ale_linters/vhdl/vcom.vim new file mode 100644 index 0000000..1914fd3 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vhdl/vcom.vim @@ -0,0 +1,38 @@ +" Author: John Gentile +" Description: Adds support for Mentor Graphics Questa/ModelSim `vcom` VHDL compiler/checker + +call ale#Set('vhdl_vcom_executable', 'vcom') +" Use VHDL-2008. See `$ vcom -h` for more options +call ale#Set('vhdl_vcom_options', '-2008 -quiet -lint') + +function! ale_linters#vhdl#vcom#GetCommand(buffer) abort + return '%e ' . ale#Pad(ale#Var(a:buffer, 'vhdl_vcom_options')) . ' %t' +endfunction + +function! ale_linters#vhdl#vcom#Handle(buffer, lines) abort + "Matches patterns like the following: + "** Warning: ../path/to/file.vhd(218): (vcom-1236) Shared variables must be of a protected type. + "** Error: tb_file.vhd(73): (vcom-1136) Unknown identifier "aresetn". + "** Error: tb_file.vhd(73): Bad resolution function (STD_LOGIC) for type (error). + "** Error: tb_file.vhd(73): near ":": (vcom-1576) expecting ';' or ')'. + let l:pattern = '^**\s\(\w*\):[a-zA-Z0-9\-\.\_\/ ]\+(\(\d\+\)):\s\+\(.*\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'type': l:match[1] is? 'Error' ? 'E' : 'W', + \ 'text': l:match[3], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('vhdl', { +\ 'name': 'vcom', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'vhdl_vcom_executable')}, +\ 'command': function('ale_linters#vhdl#vcom#GetCommand'), +\ 'callback': 'ale_linters#vhdl#vcom#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/vhdl/xvhdl.vim b/dot_vim/plugged/ale/ale_linters/vhdl/xvhdl.vim new file mode 100644 index 0000000..8010ff1 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vhdl/xvhdl.vim @@ -0,0 +1,37 @@ +" Author: John Gentile +" Description: Adds support for Xilinx Vivado `xvhdl` VHDL compiler/checker + +call ale#Set('vhdl_xvhdl_executable', 'xvhdl') +" Use VHDL-2008. See `$ xvhdl -h` for more options +call ale#Set('vhdl_xvhdl_options', '--2008') + +function! ale_linters#vhdl#xvhdl#GetCommand(buffer) abort + return '%e ' . ale#Pad(ale#Var(a:buffer, 'vhdl_xvhdl_options')) . ' %t' +endfunction + +function! ale_linters#vhdl#xvhdl#Handle(buffer, lines) abort + "Matches patterns like the following: + " ERROR: [VRFC 10-91] aresetn is not declared [/path/to/file.vhd:17] + " ERROR: [VRFC 10-91] m_axis_tx_tdata is not declared [/home/user/tx_data.vhd:128] + let l:pattern = '^ERROR:\s\+\(\[.*\)\[.*:\([0-9]\+\)\]' + let l:output = [] + + " NOTE: `xvhdl` only prints 'INFO' and 'ERROR' messages + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[2] + 0, + \ 'type': 'E', + \ 'text': l:match[1], + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('vhdl', { +\ 'name': 'xvhdl', +\ 'output_stream': 'stdout', +\ 'executable': {b -> ale#Var(b, 'vhdl_xvhdl_executable')}, +\ 'command': function('ale_linters#vhdl#xvhdl#GetCommand'), +\ 'callback': 'ale_linters#vhdl#xvhdl#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/vim/ale_custom_linting_rules.vim b/dot_vim/plugged/ale/ale_linters/vim/ale_custom_linting_rules.vim new file mode 100644 index 0000000..5ca2f14 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vim/ale_custom_linting_rules.vim @@ -0,0 +1,70 @@ +" Author: w0rp +" Description: A linter for checking ALE project code itself. + +function! ale_linters#vim#ale_custom_linting_rules#GetExecutable(buffer) abort + let l:filename = expand('#' . a:buffer . ':p') + let l:dir_list = [] + + for l:dir in split(&runtimepath, ',') + if l:filename[:len(l:dir) - 1] is# l:dir + call add(l:dir_list, l:dir) + endif + endfor + + return !empty(l:dir_list) + \ ? findfile('test/script/custom-linting-rules', join(l:dir_list, ',')) + \ : '' +endfunction + +function! s:GetALEProjectDir(buffer) abort + let l:executable = ale_linters#vim#ale_custom_linting_rules#GetExecutable(a:buffer) + + return ale#path#Dirname(ale#path#Dirname(ale#path#Dirname(l:executable))) +endfunction + +function! ale_linters#vim#ale_custom_linting_rules#GetCwd(buffer) abort + let l:executable = ale_linters#vim#ale_custom_linting_rules#GetExecutable(a:buffer) + + return ale#path#Dirname(ale#path#Dirname(ale#path#Dirname(l:executable))) +endfunction + +function! ale_linters#vim#ale_custom_linting_rules#GetCommand(buffer) abort + let l:temp_dir = ale#command#CreateDirectory(a:buffer) + let l:temp_file = l:temp_dir . '/example.vim' + + let l:lines = getbufline(a:buffer, 1, '$') + call ale#util#Writefile(a:buffer, l:lines, l:temp_file) + + return '%e ' . ale#Escape(l:temp_dir) +endfunction + +function! ale_linters#vim#ale_custom_linting_rules#Handle(buffer, lines) abort + let l:dir = s:GetALEProjectDir(a:buffer) + let l:output = [] + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+) (.+)$' + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + " Ignore trailing whitespace errors if we've turned them off. + if !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + \&& l:match[3] is# 'Trailing whitespace' + continue + endif + + call add(l:output, { + \ 'lnum': l:match[2], + \ 'text': l:match[3], + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +call ale#linter#Define('vim', { +\ 'name': 'ale_custom_linting_rules', +\ 'executable': function('ale_linters#vim#ale_custom_linting_rules#GetExecutable'), +\ 'cwd': function('ale_linters#vim#ale_custom_linting_rules#GetCwd'), +\ 'command': function('ale_linters#vim#ale_custom_linting_rules#GetCommand'), +\ 'callback': 'ale_linters#vim#ale_custom_linting_rules#Handle', +\ 'read_buffer': 0, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/vim/vimls.vim b/dot_vim/plugged/ale/ale_linters/vim/vimls.vim new file mode 100644 index 0000000..7003eb0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vim/vimls.vim @@ -0,0 +1,61 @@ +" Author: Jeffrey Lau - https://github.com/zoonfafer +" Description: Vim Language Server integration for ALE + +call ale#Set('vim_vimls_executable', 'vim-language-server') +call ale#Set('vim_vimls_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('vim_vimls_config', {}) + +function! ale_linters#vim#vimls#GetProjectRoot(buffer) abort + let l:trigger_file_candidates = [ + \ '.vimrc', + \ 'init.vim', + \] + + for l:candidate in l:trigger_file_candidates + let l:trigger_file = fnamemodify(bufname(a:buffer), ':t') + + if l:trigger_file is# l:candidate + return fnamemodify( + \ bufname(a:buffer), + \ ':h', + \) + endif + endfor + + let l:trigger_dir_candidates = [ + \ 'autoload', + \ 'plugin', + \ '.git', + \] + + let l:path_upwards = ale#path#Upwards(fnamemodify(bufname(a:buffer), ':p:h')) + + for l:path in l:path_upwards + for l:candidate in l:trigger_dir_candidates + let l:trigger_dir = ale#path#Simplify( + \ l:path . '/' . l:candidate, + \) + + if isdirectory(l:trigger_dir) + return fnamemodify( + \ l:trigger_dir, + \ ':p:h:h', + \) + endif + endfor + endfor + + return '' +endfunction + +call ale#linter#Define('vim', { +\ 'name': 'vimls', +\ 'lsp': 'stdio', +\ 'lsp_config': {b -> ale#Var(b, 'vim_vimls_config')}, +\ 'executable': {b -> ale#path#FindExecutable(b, 'vim_vimls', [ +\ 'node_modules/.bin/vim-language-server', +\ ])}, +\ 'command': '%e --stdio', +\ 'language': 'vim', +\ 'project_root': function('ale_linters#vim#vimls#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/vim/vint.vim b/dot_vim/plugged/ale/ale_linters/vim/vint.vim new file mode 100644 index 0000000..f7054ff --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vim/vint.vim @@ -0,0 +1,65 @@ +" Author: w0rp , KabbAmine +" Description: This file adds support for checking Vim code with Vint. + +" This flag can be used to change enable/disable style issues. +call ale#Set('vim_vint_show_style_issues', 1) +call ale#Set('vim_vint_executable', 'vint') +let s:enable_neovim = has('nvim') ? ' --enable-neovim' : '' +let s:format = '-f "{file_path}:{line_number}:{column_number}: {severity}: {policy_name} - {description} (see {reference})"' + +function! ale_linters#vim#vint#GetCommand(buffer, version) abort + let l:can_use_no_color_flag = empty(a:version) + \ || ale#semver#GTE(a:version, [0, 3, 7]) + + let l:warning_flag = ale#Var(a:buffer, 'vim_vint_show_style_issues') ? '-s' : '-w' + + " Use the --stdin-display-name argument if supported, temp file otherwise. + let l:stdin_or_temp = ale#semver#GTE(a:version, [0, 4, 0]) + \ ? ' --stdin-display-name %s -' + \ : ' %t' + + return '%e' + \ . ' ' . l:warning_flag + \ . (l:can_use_no_color_flag ? ' --no-color' : '') + \ . s:enable_neovim + \ . ' ' . s:format + \ . l:stdin_or_temp +endfunction + +let s:word_regex_list = [ +\ '\v^Undefined variable: ([^ ]+)', +\ '\v^Make the scope explicit like ...([^ ]+). ', +\ '\v^.*start with a capital or contain a colon: ([^ ]+)', +\ '\v.*instead of .(\=[=~]).', +\] + +function! ale_linters#vim#vint#Handle(buffer, lines) abort + let l:loclist = ale#handlers#gcc#HandleGCCFormat(a:buffer, a:lines) + + for l:item in l:loclist + let l:match = [] + + for l:regex in s:word_regex_list + let l:match = matchlist(l:item.text, l:regex) + + if !empty(l:match) + let l:item.end_col = l:item.col + len(l:match[1]) - 1 + break + endif + endfor + endfor + + return l:loclist +endfunction + +call ale#linter#Define('vim', { +\ 'name': 'vint', +\ 'executable': {buffer -> ale#Var(buffer, 'vim_vint_executable')}, +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale#Var(buffer, 'vim_vint_executable'), +\ '%e --version', +\ function('ale_linters#vim#vint#GetCommand'), +\ )}, +\ 'callback': 'ale_linters#vim#vint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/vue/cspell.vim b/dot_vim/plugged/ale/ale_linters/vue/cspell.vim new file mode 100644 index 0000000..2d8bfdc --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vue/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for Vue files. + +call ale#handlers#cspell#DefineLinter('vue') diff --git a/dot_vim/plugged/ale/ale_linters/vue/vls.vim b/dot_vim/plugged/ale/ale_linters/vue/vls.vim new file mode 100644 index 0000000..4bd7528 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vue/vls.vim @@ -0,0 +1,22 @@ +" Author: Alexander Olofsson +" Description: Vue vls Language Server integration for ALE + +call ale#Set('vue_vls_executable', 'vls') +call ale#Set('vue_vls_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#vue#vls#GetProjectRoot(buffer) abort + let l:package_path = ale#path#FindNearestFile(a:buffer, 'package.json') + + return !empty(l:package_path) ? fnamemodify(l:package_path, ':h') : '' +endfunction + +call ale#linter#Define('vue', { +\ 'name': 'vls', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#path#FindExecutable(b, 'vue_vls', [ +\ 'node_modules/.bin/vls', +\ ])}, +\ 'command': '%e --stdio', +\ 'language': 'vue', +\ 'project_root': function('ale_linters#vue#vls#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/vue/volar.vim b/dot_vim/plugged/ale/ale_linters/vue/volar.vim new file mode 100644 index 0000000..bb41b88 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/vue/volar.vim @@ -0,0 +1,80 @@ +" Author: Arnold Chand +" Description: Volar Language Server integration for ALE adopted from +" nvim-lspconfig and volar/packages/shared/src/types.ts + +call ale#Set('vue_volar_executable', 'vue-language-server') +call ale#Set('vue_volar_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('vue_volar_init_options', { +\ 'documentFeatures': { +\ 'documentColor': v:false, +\ 'documentFormatting': { +\ 'defaultPrintWidth': 100, +\ }, +\ 'documentSymbol': v:true, +\ 'foldingRange': v:true, +\ 'linkedEditingRange': v:true, +\ 'selectionRange': v:true, +\ }, +\ 'languageFeatures': { +\ 'callHierarchy': v:true, +\ 'codeAction': v:true, +\ 'codeLens': v:true, +\ 'completion': { +\ 'defaultAttrNameCase': 'kebabCase', +\ 'defaultTagNameCase': 'both', +\ 'getDocumentNameCaseRequest': v:false, +\ 'getDocumentSelectionRequest': v:false, +\ }, +\ 'definition': v:true, +\ 'diagnostics': v:true, +\ 'documentHighlight': v:true, +\ 'documentLink': v:true, +\ 'hover': v:true, +\ 'references': v:true, +\ 'rename': v:true, +\ 'renameFileRefactoring': v:true, +\ 'schemaRequestService': v:true, +\ 'semanticTokens': v:false, +\ 'signatureHelp': v:true, +\ 'typeDefinition': v:true, +\ 'workspaceSymbol': v:false, +\ }, +\ 'typescript': { +\ 'serverPath': '', +\ 'localizedPath': v:null, +\ }, +\}) + +function! ale_linters#vue#volar#GetProjectRoot(buffer) abort + let l:project_roots = ['package.json', 'vite.config.js', '.git', bufname(a:buffer)] + + for l:project_root in l:project_roots + let l:nearest_filepath = ale#path#FindNearestFile(a:buffer, l:project_root) + + if !empty(l:nearest_filepath) + return fnamemodify(l:nearest_filepath, ':h') + endif + endfor + + return '' +endfunction + +function! ale_linters#vue#volar#GetInitializationOptions(buffer) abort + let l:tsserver_path = ale#path#FindNearestExecutable(a:buffer, [ + \ 'node_modules/typescript/lib/tsserverlibrary.js' + \ ]) + let l:init_options = ale#Var(a:buffer, 'vue_volar_init_options') + let l:init_options.typescript.serverPath = l:tsserver_path + + return l:init_options +endfunction + +call ale#linter#Define('vue', { +\ 'name': 'volar', +\ 'language': 'vue', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#path#FindExecutable(b, 'vue_volar', ['node_modules/.bin/vue-language-server'])}, +\ 'command': '%e --stdio', +\ 'project_root': function('ale_linters#vue#volar#GetProjectRoot'), +\ 'initialization_options': function('ale_linters#vue#volar#GetInitializationOptions'), +\}) diff --git a/dot_vim/plugged/ale/ale_linters/wgsl/naga.vim b/dot_vim/plugged/ale/ale_linters/wgsl/naga.vim new file mode 100644 index 0000000..2816751 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/wgsl/naga.vim @@ -0,0 +1,12 @@ +" Author: rhysd +" Description: naga-cli linter for WGSL syntax. + +call ale#Set('wgsl_naga_executable', 'naga') + +call ale#linter#Define('wgsl', { +\ 'name': 'naga', +\ 'executable': {b -> ale#Var(b, 'wgsl_naga_executable')}, +\ 'output_stream': 'stderr', +\ 'command': {b -> '%e --stdin-file-path %s'}, +\ 'callback': 'ale#handlers#naga#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/xhtml/alex.vim b/dot_vim/plugged/ale/ale_linters/xhtml/alex.vim new file mode 100644 index 0000000..97f3b59 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/xhtml/alex.vim @@ -0,0 +1,4 @@ +" Author: Johannes Wienke +" Description: alex for XHTML files + +call ale#handlers#alex#DefineLinter('xhtml', '--text') diff --git a/dot_vim/plugged/ale/ale_linters/xhtml/cspell.vim b/dot_vim/plugged/ale/ale_linters/xhtml/cspell.vim new file mode 100644 index 0000000..c465b41 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/xhtml/cspell.vim @@ -0,0 +1,5 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: cspell support for XHTML files. + +call ale#handlers#cspell#DefineLinter('xhtml') diff --git a/dot_vim/plugged/ale/ale_linters/xhtml/proselint.vim b/dot_vim/plugged/ale/ale_linters/xhtml/proselint.vim new file mode 100644 index 0000000..dfad921 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/xhtml/proselint.vim @@ -0,0 +1,9 @@ +" Author: Daniel M. Capella https://github.com/polyzen +" Description: proselint for XHTML files + +call ale#linter#Define('xhtml', { +\ 'name': 'proselint', +\ 'executable': 'proselint', +\ 'command': 'proselint %t', +\ 'callback': 'ale#handlers#unix#HandleAsWarning', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/xhtml/writegood.vim b/dot_vim/plugged/ale/ale_linters/xhtml/writegood.vim new file mode 100644 index 0000000..1fcba18 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/xhtml/writegood.vim @@ -0,0 +1,4 @@ +" Author: Sumner Evans +" Description: write-good for XHTML files + +call ale#handlers#writegood#DefineLinter('xhtml') diff --git a/dot_vim/plugged/ale/ale_linters/xml/xmllint.vim b/dot_vim/plugged/ale/ale_linters/xml/xmllint.vim new file mode 100644 index 0000000..553d088 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/xml/xmllint.vim @@ -0,0 +1,65 @@ +" Author: q12321q +" Description: This file adds support for checking XML code with xmllint. + +" CLI options +let g:ale_xml_xmllint_executable = get(g:, 'ale_xml_xmllint_executable', 'xmllint') +let g:ale_xml_xmllint_options = get(g:, 'ale_xml_xmllint_options', '') + +function! ale_linters#xml#xmllint#GetCommand(buffer) abort + return '%e' + \ . ale#Pad(ale#Var(a:buffer, 'xml_xmllint_options')) + \ . ' --noout -' +endfunction + +function! ale_linters#xml#xmllint#Handle(buffer, lines) abort + " Matches patterns lines like the following: + " file/path:123: error level : error message + let l:pattern_message = '\v^([^:]+):(\d+):\s*(([^:]+)\s*:\s+.*)$' + + " parse column token line like that: + " file/path:123: parser error : Opening and ending tag mismatch: foo line 1 and bar + " + " ^ + let l:pattern_column_token = '\v^\s*\^$' + + let l:output = [] + + for l:line in a:lines + " Parse error/warning lines + let l:match_message = matchlist(l:line, l:pattern_message) + + if !empty(l:match_message) + let l:line = l:match_message[2] + 0 + let l:type = l:match_message[4] =~? 'warning' ? 'W' : 'E' + let l:text = l:match_message[3] + + call add(l:output, { + \ 'lnum': l:line, + \ 'text': l:text, + \ 'type': l:type, + \}) + + continue + endif + + " Parse column position + let l:match_column_token = matchlist(l:line, l:pattern_column_token) + + if !empty(l:output) && !empty(l:match_column_token) + let l:previous = l:output[len(l:output) - 1] + let l:previous['col'] = len(l:match_column_token[0]) + + continue + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('xml', { +\ 'name': 'xmllint', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'xml_xmllint_executable')}, +\ 'command': function('ale_linters#xml#xmllint#GetCommand'), +\ 'callback': 'ale_linters#xml#xmllint#Handle', +\ }) diff --git a/dot_vim/plugged/ale/ale_linters/yaml/actionlint.vim b/dot_vim/plugged/ale/ale_linters/yaml/actionlint.vim new file mode 100644 index 0000000..1e2fda4 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/yaml/actionlint.vim @@ -0,0 +1,11 @@ +" Author: bretello + +call ale#Set('yaml_actionlint_executable', 'actionlint') +call ale#Set('yaml_actionlint_options', '') + +call ale#linter#Define('yaml', { +\ 'name': 'actionlint', +\ 'executable': {b -> ale#Var(b, 'yaml_actionlint_executable')}, +\ 'command': function('ale#handlers#actionlint#GetCommand'), +\ 'callback': 'ale#handlers#actionlint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/yaml/circleci.vim b/dot_vim/plugged/ale/ale_linters/yaml/circleci.vim new file mode 100644 index 0000000..2083545 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/yaml/circleci.vim @@ -0,0 +1,35 @@ +function! ale_linters#yaml#circleci#Handle(buffer, lines) abort + let l:match_index = -1 + let l:output = [] + + for l:index in range(len(a:lines)) + let l:line = a:lines[l:index] + + if l:line =~? 'Error: ERROR IN CONFIG FILE:' + let l:match_index = l:index + 1 + break + endif + endfor + + if l:match_index > 0 + return [{ + \ 'type': 'E', + \ 'lnum': 1, + \ 'text': a:lines[l:match_index], + \ 'detail': join(a:lines[l:match_index :], "\n"), + \}] + endif + + return [] +endfunction + +" The circleci validate requires network requests, so we'll only run it when +" files are saved to prevent the server from being hammered. +call ale#linter#Define('yaml', { +\ 'name': 'circleci', +\ 'executable': {b -> expand('#' . b . ':p') =~? '\.circleci' ? 'circleci' : ''}, +\ 'command': 'circleci --skip-update-check config validate - < %s', +\ 'callback': 'ale_linters#yaml#circleci#Handle', +\ 'output_stream': 'stderr', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/yaml/gitlablint.vim b/dot_vim/plugged/ale/ale_linters/yaml/gitlablint.vim new file mode 100644 index 0000000..ec48115 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/yaml/gitlablint.vim @@ -0,0 +1,49 @@ +call ale#Set('yaml_gitlablint_executable', 'gll') +call ale#Set('yaml_gitlablint_options', '') + +function! ale_linters#yaml#gitlablint#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'yaml_gitlablint_options')) + \ . ' -p %t' +endfunction + +function! ale_linters#yaml#gitlablint#Handle(buffer, lines) abort + " Matches patterns line the following: + " (): mapping values are not allowed in this context at line 68 column 8 + " jobs:build:dev config contains unknown keys: ony + let l:pattern = '^\(.*\) at line \(\d\+\) column \(\d\+\)$' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if !empty(l:match) + let l:item = { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[1], + \ 'type': 'E', + \} + call add(l:output, l:item) + else + if l:line isnot# 'GitLab CI configuration is invalid' + let l:item = { + \ 'lnum': 0, + \ 'col': 0, + \ 'text': l:line, + \ 'type': 'E', + \} + call add(l:output, l:item) + endif + endif + endfor + + return l:output +endfunction + +call ale#linter#Define('yaml', { +\ 'name': 'gitlablint', +\ 'executable': {b -> ale#Var(b, 'yaml_gitlablint_executable')}, +\ 'command': function('ale_linters#yaml#gitlablint#GetCommand'), +\ 'callback': 'ale_linters#yaml#gitlablint#Handle', +\ 'output_stream': 'stderr', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/yaml/ls.vim b/dot_vim/plugged/ale/ale_linters/yaml/ls.vim new file mode 100644 index 0000000..8e3f6d0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/yaml/ls.vim @@ -0,0 +1,34 @@ +" Author: Jeffrey Lau - https://github.com/zoonfafer +" Description: YAML Language Server https://github.com/redhat-developer/yaml-language-server + +call ale#Set('yaml_ls_executable', 'yaml-language-server') +call ale#Set('yaml_ls_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('yaml_ls_config', {}) + +function! ale_linters#yaml#ls#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'yaml_ls', [ + \ 'node_modules/.bin/yaml-language-server', + \]) +endfunction + +function! ale_linters#yaml#ls#GetCommand(buffer) abort + let l:executable = ale_linters#yaml#ls#GetExecutable(a:buffer) + + return ale#Escape(l:executable) . ' --stdio' +endfunction + +" Just use the current file +function! ale_linters#yaml#ls#FindProjectRoot(buffer) abort + let l:project_file = expand('#' . a:buffer . ':p') + + return fnamemodify(l:project_file, ':h') +endfunction + +call ale#linter#Define('yaml', { +\ 'name': 'yaml-language-server', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#yaml#ls#GetExecutable'), +\ 'command': function('ale_linters#yaml#ls#GetCommand'), +\ 'project_root': function('ale_linters#yaml#ls#FindProjectRoot'), +\ 'lsp_config': {b -> ale#Var(b, 'yaml_ls_config')}, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/yaml/spectral.vim b/dot_vim/plugged/ale/ale_linters/yaml/spectral.vim new file mode 100644 index 0000000..13654f0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/yaml/spectral.vim @@ -0,0 +1,14 @@ +" Author: t2h5 +" Description: Integration of Stoplight Spectral CLI with ALE. + +call ale#Set('yaml_spectral_executable', 'spectral') +call ale#Set('yaml_spectral_use_global', get(g:, 'ale_use_global_executables', 0)) + +call ale#linter#Define('yaml', { +\ 'name': 'spectral', +\ 'executable': {b -> ale#path#FindExecutable(b, 'yaml_spectral', [ +\ 'node_modules/.bin/spectral', +\ ])}, +\ 'command': '%e lint --ignore-unknown-format -q -f text %t', +\ 'callback': 'ale#handlers#spectral#HandleSpectralOutput' +\}) diff --git a/dot_vim/plugged/ale/ale_linters/yaml/swaglint.vim b/dot_vim/plugged/ale/ale_linters/yaml/swaglint.vim new file mode 100644 index 0000000..7fc2b43 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/yaml/swaglint.vim @@ -0,0 +1,40 @@ +" Author: Matthew Turland +" Description: This file adds support for linting Swagger / OpenAPI documents using swaglint + +call ale#Set('yaml_swaglint_executable', 'swaglint') +call ale#Set('yaml_swaglint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#yaml#swaglint#Handle(buffer, lines) abort + let l:pattern = ': \([^\s]\+\) @ \(\d\+\):\(\d\+\) - \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:obj = { + \ 'type': l:match[1] is# 'error' ? 'E' : 'W', + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[4], + \} + + " Parse the code if it's there. + let l:code_match = matchlist(l:obj.text, '\v^(.+) \(([^ (]+)\)$') + + if !empty(l:code_match) + let l:obj.text = l:code_match[1] + let l:obj.code = l:code_match[2] + endif + + call add(l:output, l:obj) + endfor + + return l:output +endfunction + +call ale#linter#Define('yaml', { +\ 'name': 'swaglint', +\ 'executable': {b -> ale#path#FindExecutable(b, 'yaml_swaglint', [ +\ 'node_modules/.bin/swaglint', +\ ])}, +\ 'command': '%e -r compact --stdin', +\ 'callback': 'ale_linters#yaml#swaglint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/yaml/yamllint.vim b/dot_vim/plugged/ale/ale_linters/yaml/yamllint.vim new file mode 100644 index 0000000..39011df --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/yaml/yamllint.vim @@ -0,0 +1,11 @@ +" Author: KabbAmine + +call ale#Set('yaml_yamllint_executable', 'yamllint') +call ale#Set('yaml_yamllint_options', '') + +call ale#linter#Define('yaml', { +\ 'name': 'yamllint', +\ 'executable': {b -> ale#Var(b, 'yaml_yamllint_executable')}, +\ 'command': function('ale#handlers#yamllint#GetCommand'), +\ 'callback': 'ale#handlers#yamllint#Handle', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/yang/yang_lsp.vim b/dot_vim/plugged/ale/ale_linters/yang/yang_lsp.vim new file mode 100644 index 0000000..81fcaa0 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/yang/yang_lsp.vim @@ -0,0 +1,15 @@ +call ale#Set('yang_lsp_executable', 'yang-language-server') + +function! ale_linters#yang#yang_lsp#GetProjectRoot(buffer) abort + let l:project_root = ale#path#FindNearestFile(a:buffer, 'yang.settings') + + return !empty(l:project_root) ? fnamemodify(l:project_root, ':h') : '' +endfunction + +call ale#linter#Define('yang', { +\ 'name': 'yang_lsp', +\ 'lsp': 'stdio', +\ 'executable': {b -> ale#Var(b, 'yang_lsp_executable')}, +\ 'project_root': function('ale_linters#yang#yang_lsp#GetProjectRoot'), +\ 'command': '%e', +\}) diff --git a/dot_vim/plugged/ale/ale_linters/zeek/zeek.vim b/dot_vim/plugged/ale/ale_linters/zeek/zeek.vim new file mode 100644 index 0000000..e976d75 --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/zeek/zeek.vim @@ -0,0 +1,22 @@ +" Author: Benjamin Bannier +" Description: Support for checking Zeek files. +" +call ale#Set('zeek_zeek_executable', 'zeek') + +function! ale_linters#zeek#zeek#HandleErrors(buffer, lines) abort + let l:pattern = 'error in \v.*, line (\d+): (.*)$' + + return map(ale#util#GetMatches(a:lines, l:pattern), "{ + \ 'lnum': str2nr(v:val[1]), + \ 'text': v:val[2], + \}") +endfunction + +call ale#linter#Define('zeek', { +\ 'name': 'zeek', +\ 'executable': {b -> ale#Var(b, 'zeek_zeek_executable')}, +\ 'output_stream': 'stderr', +\ 'command': {-> '%e --parse-only %s'}, +\ 'callback': 'ale_linters#zeek#zeek#HandleErrors', +\ 'lint_file': 1, +\}) diff --git a/dot_vim/plugged/ale/ale_linters/zig/zls.vim b/dot_vim/plugged/ale/ale_linters/zig/zls.vim new file mode 100644 index 0000000..1390f6b --- /dev/null +++ b/dot_vim/plugged/ale/ale_linters/zig/zls.vim @@ -0,0 +1,20 @@ +" Author: CherryMan +" Description: A language server for Zig + +call ale#Set('zig_zls_executable', 'zls') +call ale#Set('zig_zls_config', {}) + +function! ale_linters#zig#zls#GetProjectRoot(buffer) abort + let l:build_rs = ale#path#FindNearestFile(a:buffer, 'build.zig') + + return !empty(l:build_rs) ? fnamemodify(l:build_rs, ':h') : '' +endfunction + +call ale#linter#Define('zig', { +\ 'name': 'zls', +\ 'lsp': 'stdio', +\ 'lsp_config': {b -> ale#Var(b, 'zig_zls_config')}, +\ 'executable': {b -> ale#Var(b, 'zig_zls_executable')}, +\ 'command': '%e', +\ 'project_root': function('ale_linters#zig#zls#GetProjectRoot'), +\}) diff --git a/dot_vim/plugged/ale/autoload/ale.vim b/dot_vim/plugged/ale/autoload/ale.vim new file mode 100644 index 0000000..2331591 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale.vim @@ -0,0 +1,285 @@ +" Author: w0rp , David Alexander +" Description: Primary code path for the plugin +" Manages execution of linters when requested by autocommands + +" Strings used for severity in the echoed message +let g:ale_echo_msg_error_str = get(g:, 'ale_echo_msg_error_str', 'Error') +let g:ale_echo_msg_info_str = get(g:, 'ale_echo_msg_info_str', 'Info') +let g:ale_echo_msg_log_str = get(g:, 'ale_echo_msg_log_str', 'Log') +let g:ale_echo_msg_warning_str = get(g:, 'ale_echo_msg_warning_str', 'Warning') +" Ignoring linters, for disabling some, or ignoring LSP diagnostics. +let g:ale_linters_ignore = get(g:, 'ale_linters_ignore', {}) +let g:ale_disable_lsp = get(g:, 'ale_disable_lsp', 0) + +" LSP window/showMessage format +let g:ale_lsp_show_message_format = get(g:, 'ale_lsp_show_message_format', '%severity%:%linter%: %s') +" Valid values mimic LSP definitions (error, warning and information; log is +" never shown) +let g:ale_lsp_show_message_severity = get(g:, 'ale_lsp_show_message_severity', 'error') + +let s:lint_timer = -1 +let s:getcmdwintype_exists = exists('*getcmdwintype') + +" Return 1 if a file is too large for ALE to handle. +function! ale#FileTooLarge(buffer) abort + let l:max = getbufvar(a:buffer, 'ale_maximum_file_size', get(g:, 'ale_maximum_file_size', 0)) + + return l:max > 0 ? (line2byte(line('$') + 1) > l:max) : 0 +endfunction + +" A function for checking various conditions whereby ALE just shouldn't +" attempt to do anything, say if particular buffer types are open in Vim. +function! ale#ShouldDoNothing(buffer) abort + " The checks are split into separate if statements to make it possible to + " profile each check individually with Vim's profiling tools. + " + " Do nothing if ALE is disabled. + if !getbufvar(a:buffer, 'ale_enabled', get(g:, 'ale_enabled', 0)) + return 1 + endif + + " Don't perform any checks when newer NeoVim versions are exiting. + if get(v:, 'exiting', v:null) isnot v:null + return 1 + endif + + let l:filetype = getbufvar(a:buffer, '&filetype') + + " Do nothing when there's no filetype. + if l:filetype is# '' + return 1 + endif + + " Do nothing for diff buffers. + if getbufvar(a:buffer, '&diff') + return 1 + endif + + " Do nothing for blacklisted files. + if index(get(g:, 'ale_filetype_blacklist', []), l:filetype) >= 0 + return 1 + endif + + " Do nothing if running from command mode. + if s:getcmdwintype_exists && !empty(getcmdwintype()) + return 1 + endif + + let l:filename = fnamemodify(bufname(a:buffer), ':t') + + " Do nothing for directories. + if l:filename is# '.' + return 1 + endif + + " Don't start linting and so on when an operator is pending. + if ale#util#Mode(1) is# 'no' + return 1 + endif + + " Do nothing if running in the sandbox. + if ale#util#InSandbox() + return 1 + endif + + " Do nothing if the file is too large. + if ale#FileTooLarge(a:buffer) + return 1 + endif + + " Do nothing from CtrlP buffers with CtrlP-funky. + if exists(':CtrlPFunky') is 2 + \&& getbufvar(a:buffer, '&l:statusline') =~# 'CtrlPMode.*funky' + return 1 + endif + + return 0 +endfunction + +function! s:Lint(buffer, should_lint_file, timer_id) abort + " Use the filetype from the buffer + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:linters = ale#linter#Get(l:filetype) + let l:linters = ale#linter#RemoveIgnored(a:buffer, l:filetype, l:linters) + + " Tell other sources that they can start checking the buffer now. + let g:ale_want_results_buffer = a:buffer + silent doautocmd User ALEWantResults + unlet! g:ale_want_results_buffer + + " Don't set up buffer data and so on if there are no linters to run. + if !has_key(g:ale_buffer_info, a:buffer) && empty(l:linters) + return + endif + + " Clear lint_file linters, or only run them if the file exists. + let l:lint_file = empty(l:linters) + \ || (a:should_lint_file && filereadable(expand('#' . a:buffer . ':p'))) + + call ale#engine#RunLinters(a:buffer, l:linters, l:lint_file) +endfunction + +" (delay, [linting_flag, buffer_number]) +function! ale#Queue(delay, ...) abort + if a:0 > 2 + throw 'too many arguments!' + endif + + let l:buffer = get(a:000, 1, v:null) + + if l:buffer is v:null + let l:buffer = bufnr('') + endif + + if type(l:buffer) isnot v:t_number + throw 'buffer_number must be a Number' + endif + + if ale#ShouldDoNothing(l:buffer) + return + endif + + " Default linting_flag to '' + let l:should_lint_file = get(a:000, 0) is# 'lint_file' + + if s:lint_timer != -1 + call timer_stop(s:lint_timer) + let s:lint_timer = -1 + endif + + if a:delay > 0 + let s:lint_timer = timer_start( + \ a:delay, + \ function('s:Lint', [l:buffer, l:should_lint_file]) + \) + else + call s:Lint(l:buffer, l:should_lint_file, 0) + endif +endfunction + +let s:current_ale_version = [3, 3, 0] + +" A function used to check for ALE features in files outside of the project. +function! ale#Has(feature) abort + let l:match = matchlist(a:feature, '\c\v^ale-(\d+)\.(\d+)(\.(\d+))?$') + + if !empty(l:match) + let l:version = [l:match[1] + 0, l:match[2] + 0, l:match[4] + 0] + + return ale#semver#GTE(s:current_ale_version, l:version) + endif + + return 0 +endfunction + +" Given a buffer number and a variable name, look for that variable in the +" buffer scope, then in global scope. If the name does not exist in the global +" scope, an exception will be thrown. +" +" Every variable name will be prefixed with 'ale_'. +function! ale#Var(buffer, variable_name) abort + let l:full_name = 'ale_' . a:variable_name + let l:vars = getbufvar(str2nr(a:buffer), '', {}) + + return get(l:vars, l:full_name, g:[l:full_name]) +endfunction + +" Initialize a variable with a default value, if it isn't already set. +" +" Every variable name will be prefixed with 'ale_'. +function! ale#Set(variable_name, default) abort + let l:full_name = 'ale_' . a:variable_name + + if !has_key(g:, l:full_name) + let g:[l:full_name] = a:default + endif +endfunction + +" Given a string for adding to a command, return the string padded with a +" space on the left if it is not empty. Otherwise return an empty string. +" +" This can be used for making command strings cleaner and easier to test. +function! ale#Pad(string) abort + return !empty(a:string) ? ' ' . a:string : '' +endfunction + +" Given a environment variable name and a value, produce part of a command for +" setting an environment variable before running a command. The syntax will be +" valid for cmd on Windows, or most shells on Unix. +function! ale#Env(variable_name, value) abort + if has('win32') + return 'set ' . a:variable_name . '=' . ale#Escape(a:value) . ' && ' + endif + + return a:variable_name . '=' . ale#Escape(a:value) . ' ' +endfunction + +" Escape a string suitably for each platform. +" shellescape does not work on Windows. +function! ale#Escape(str) abort + if fnamemodify(&shell, ':t') is? 'cmd.exe' + " If the string contains spaces, it will be surrounded by quotes. + " Otherwise, special characters will be escaped with carets (^). + return substitute( + \ a:str =~# ' ' + \ ? '"' . substitute(a:str, '"', '""', 'g') . '"' + \ : substitute(a:str, '\v([&|<>^])', '^\1', 'g'), + \ '%', + \ '%%', + \ 'g', + \) + endif + + return shellescape (a:str) +endfunction + +" Get the loclist item message according to a given format string. +" +" See `:help g:ale_loclist_msg_format` and `:help g:ale_echo_msg_format` +function! ale#GetLocItemMessage(item, format_string) abort + let l:msg = a:format_string + let l:severity = g:ale_echo_msg_warning_str + let l:code = get(a:item, 'code', '') + let l:type = get(a:item, 'type', 'E') + let l:linter_name = get(a:item, 'linter_name', '') + let l:code_repl = !empty(l:code) ? '\=submatch(1) . l:code . submatch(2)' : '' + + if l:type is# 'E' + let l:severity = g:ale_echo_msg_error_str + elseif l:type is# 'I' + let l:severity = g:ale_echo_msg_info_str + endif + + " Replace special markers with certain information. + " \=l:variable is used to avoid escaping issues. + let l:msg = substitute(l:msg, '\v\%([^\%]*)code([^\%]*)\%', l:code_repl, 'g') + let l:msg = substitute(l:msg, '\V%severity%', '\=l:severity', 'g') + let l:msg = substitute(l:msg, '\V%type%', '\=l:type', 'g') + let l:msg = substitute(l:msg, '\V%linter%', '\=l:linter_name', 'g') + " Replace %s with the text. + let l:msg = substitute(l:msg, '\V%s', '\=a:item.text', 'g') + " Windows may insert carriage return line endings (^M), strip these characters. + let l:msg = substitute(l:msg, '\r', '', 'g') + + return l:msg +endfunction + +" Given a buffer and a linter or fixer name, return an Array of two-item +" Arrays describing how to map filenames to and from the local to foreign file +" systems. +function! ale#GetFilenameMappings(buffer, name) abort + let l:linter_mappings = ale#Var(a:buffer, 'filename_mappings') + + if type(l:linter_mappings) is v:t_list + return l:linter_mappings + endif + + let l:name = a:name + + if !has_key(l:linter_mappings, l:name) + " Use * as a default setting for all tools. + let l:name = '*' + endif + + return get(l:linter_mappings, l:name, []) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/ant.vim b/dot_vim/plugged/ale/autoload/ale/ant.vim new file mode 100644 index 0000000..b6d4217 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/ant.vim @@ -0,0 +1,45 @@ +" Author: Andrew Lee . +" Inspired by ale/gradle.vim by Michael Pardo +" Description: Functions for working with Ant projects. + +" Given a buffer number, find an Ant project root +function! ale#ant#FindProjectRoot(buffer) abort + let l:build_xml_path = ale#path#FindNearestFile(a:buffer, 'build.xml') + + if !empty(l:build_xml_path) + return fnamemodify(l:build_xml_path, ':h') + endif + + return '' +endfunction + +" Given a buffer number, find the path to the `ant` executable. Returns an empty +" string if cannot find the executable. +function! ale#ant#FindExecutable(buffer) abort + if executable('ant') + return 'ant' + endif + + return '' +endfunction + +" Given a buffer number, get a working directory and command to print the +" classpath of the root project. +" +" Returns an empty string for the command if Ant is not detected. +function! ale#ant#BuildClasspathCommand(buffer) abort + let l:executable = ale#ant#FindExecutable(a:buffer) + + if !empty(l:executable) + let l:project_root = ale#ant#FindProjectRoot(a:buffer) + + if !empty(l:project_root) + return [ + \ l:project_root, + \ ale#Escape(l:executable) .' classpath -S -q' + \] + endif + endif + + return ['', ''] +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/args.vim b/dot_vim/plugged/ale/autoload/ale/args.vim new file mode 100644 index 0000000..70afb2e --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/args.vim @@ -0,0 +1,43 @@ +" Author: w0rp +" Description: This module implements a function for parsing arguments for +" commands. + +" Given a list of valid arguments like ['foo', 'bar'] and a string to parse, +" parse the arguments from the string and return [parsed_args, remainder]. +" +" Arguments must be prefixed in the string with a single minus (-), and a +" double minus (--) denotes the end of arguments. +function! ale#args#Parse(arg_list, string) abort + let l:parsed = {} + let l:end_of_args = 0 + let l:word_list = split(a:string, ' ') + let l:index = 0 + + while l:index < len(l:word_list) + let l:word = l:word_list[l:index] + + if l:word[:0] is# '-' + let l:index += 1 + + if l:word is# '--' + break + endif + + let l:arg = l:word[1:] + + if index(a:arg_list, l:arg) >= 0 + let l:parsed[l:arg] = '' + else + throw 'Invalid argument: ' . l:word + endif + elseif l:word is# '' + let l:index += 1 + else + break + endif + endwhile + + let l:new_string = join(l:word_list[l:index :], ' ') + + return [l:parsed, l:new_string] +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/assert.vim b/dot_vim/plugged/ale/autoload/ale/assert.vim new file mode 100644 index 0000000..141cd0f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/assert.vim @@ -0,0 +1,424 @@ +let s:command_output = [] + +function! ale#assert#GivenCommandOutput(...) abort + let s:command_output = a:000 +endfunction + +function! s:GetLinter() abort + let l:linters = ale#linter#GetLintersLoaded() + let l:filetype_linters = get(values(l:linters), 0, []) + + if len(l:linters) is 0 || len(l:filetype_linters) is 0 + throw 'No linters were loaded' + endif + + if len(l:linters) > 1 || len(l:filetype_linters) > 1 + throw 'More than one linter was loaded' + endif + + return l:filetype_linters[0] +endfunction + +function! s:FormatExe(command, executable) abort + return substitute(a:command, '%e', '\=ale#Escape(a:executable)', 'g') +endfunction + +function! s:ProcessDeferredCommands(initial_result) abort + let l:result = a:initial_result + let l:command_index = 0 + let l:command = [] + + while ale#command#IsDeferred(l:result) + call add(l:command, s:FormatExe(l:result.command, l:result.executable)) + + if get(g:, 'ale_run_synchronously_emulate_commands') + " Don't run commands, but simulate the results. + let l:Callback = g:ale_run_synchronously_callbacks[0] + let l:output = get(s:command_output, l:command_index, []) + call l:Callback(0, l:output) + unlet g:ale_run_synchronously_callbacks + + let l:command_index += 1 + else + " Run the commands in the shell, synchronously. + call ale#test#FlushJobs() + endif + + let l:result = l:result.value + endwhile + + call add(l:command, l:result) + + return l:command +endfunction + +function! s:ProcessDeferredCwds(initial_command, initial_cwd) abort + let l:result = a:initial_command + let l:last_cwd = v:null + let l:command_index = 0 + let l:cwd_list = [] + + while ale#command#IsDeferred(l:result) + call add(l:cwd_list, l:result.cwd) + + if get(g:, 'ale_run_synchronously_emulate_commands') + " Don't run commands, but simulate the results. + let l:Callback = g:ale_run_synchronously_callbacks[0] + let l:output = get(s:command_output, l:command_index, []) + call l:Callback(0, l:output) + unlet g:ale_run_synchronously_callbacks + + let l:command_index += 1 + else + " Run the commands in the shell, synchronously. + call ale#test#FlushJobs() + endif + + let l:result = l:result.value + endwhile + + call add(l:cwd_list, a:initial_cwd is v:null ? l:last_cwd : a:initial_cwd) + + return l:cwd_list +endfunction + +" Load the currently loaded linter for a test case, and check that the command +" matches the given string. +function! ale#assert#Linter(expected_executable, expected_command) abort + let l:buffer = bufnr('') + let l:linter = s:GetLinter() + let l:executable = ale#linter#GetExecutable(l:buffer, l:linter) + + while ale#command#IsDeferred(l:executable) + call ale#test#FlushJobs() + let l:executable = l:executable.value + endwhile + + let l:command = s:ProcessDeferredCommands( + \ ale#linter#GetCommand(l:buffer, l:linter), + \) + + if type(a:expected_command) isnot v:t_list + let l:command = l:command[-1] + endif + + if type(l:command) is v:t_string + " Replace %e with the escaped executable, so tests keep passing after + " linters are changed to use %e. + let l:command = s:FormatExe(l:command, l:executable) + elseif type(l:command) is v:t_list + call map(l:command, 's:FormatExe(v:val, l:executable)') + endif + + AssertEqual + \ [a:expected_executable, a:expected_command], + \ [l:executable, l:command] +endfunction + +function! ale#assert#LinterCwd(expected_cwd) abort + let l:buffer = bufnr('') + let l:linter = s:GetLinter() + + let l:initial_cwd = ale#linter#GetCwd(l:buffer, l:linter) + call ale#command#SetCwd(l:buffer, l:initial_cwd) + + let l:cwd = s:ProcessDeferredCwds( + \ ale#linter#GetCommand(l:buffer, l:linter), + \ l:initial_cwd, + \) + + call ale#command#ResetCwd(l:buffer) + + if type(a:expected_cwd) isnot v:t_list + let l:cwd = l:cwd[-1] + endif + + AssertEqual a:expected_cwd, l:cwd +endfunction + +function! ale#assert#FixerCwd(expected_cwd) abort + let l:buffer = bufnr('') + let l:cwd = s:ProcessDeferredCwds(s:FixerFunction(l:buffer), v:null) + + if type(a:expected_cwd) isnot v:t_list + let l:cwd = l:cwd[-1] + endif + + AssertEqual a:expected_cwd, l:cwd +endfunction + +function! ale#assert#Fixer(expected_result) abort + let l:buffer = bufnr('') + let l:result = s:ProcessDeferredCommands(s:FixerFunction(l:buffer)) + + if type(a:expected_result) isnot v:t_list + let l:result = l:result[-1] + endif + + AssertEqual a:expected_result, l:result +endfunction + +function! ale#assert#FixerNotExecuted() abort + let l:buffer = bufnr('') + let l:result = s:ProcessDeferredCommands(s:FixerFunction(l:buffer))[-1] + + Assert empty(l:result), "The fixer will be executed when it shouldn't be" +endfunction + +function! ale#assert#LinterNotExecuted() abort + let l:buffer = bufnr('') + let l:linter = s:GetLinter() + let l:executable = ale#linter#GetExecutable(l:buffer, l:linter) + let l:executed = 1 + + if !empty(l:executable) + let l:command = ale#linter#GetCommand(l:buffer, l:linter) + + if type(l:command) is v:t_list + let l:command = l:command[-1] + endif + + let l:executed = !empty(l:command) + else + let l:executed = 0 + endif + + Assert !l:executed, "The linter will be executed when it shouldn't be" +endfunction + +function! ale#assert#LSPOptions(expected_options) abort + let l:buffer = bufnr('') + let l:linter = s:GetLinter() + let l:initialization_options = ale#lsp_linter#GetOptions(l:buffer, l:linter) + + AssertEqual a:expected_options, l:initialization_options +endfunction + +function! ale#assert#LSPConfig(expected_config) abort + let l:buffer = bufnr('') + let l:linter = s:GetLinter() + let l:config = ale#lsp_linter#GetConfig(l:buffer, l:linter) + + AssertEqual a:expected_config, l:config +endfunction + +function! ale#assert#LSPLanguage(expected_language) abort + let l:buffer = bufnr('') + let l:linter = s:GetLinter() + let l:language = ale#linter#GetLanguage(l:buffer, l:linter) + + AssertEqual a:expected_language, l:language +endfunction + +function! ale#assert#LSPProject(expected_root) abort + let l:buffer = bufnr('') + let l:linter = s:GetLinter() + let l:root = ale#lsp_linter#FindProjectRoot(l:buffer, l:linter) + + AssertEqual a:expected_root, l:root +endfunction + +function! ale#assert#LSPAddress(expected_address) abort + let l:buffer = bufnr('') + let l:linter = s:GetLinter() + let l:address = ale#linter#GetAddress(l:buffer, l:linter) + + AssertEqual a:expected_address, l:address +endfunction + +function! ale#assert#SetUpLinterTestCommands() abort + command! -nargs=+ GivenCommandOutput :call ale#assert#GivenCommandOutput() + command! -nargs=+ AssertLinterCwd :call ale#assert#LinterCwd() + command! -nargs=+ AssertLinter :call ale#assert#Linter() + command! -nargs=0 AssertLinterNotExecuted :call ale#assert#LinterNotExecuted() + command! -nargs=+ AssertLSPOptions :call ale#assert#LSPOptions() + command! -nargs=+ AssertLSPConfig :call ale#assert#LSPConfig() + command! -nargs=+ AssertLSPLanguage :call ale#assert#LSPLanguage() + command! -nargs=+ AssertLSPProject :call ale#assert#LSPProject() + command! -nargs=+ AssertLSPAddress :call ale#assert#LSPAddress() +endfunction + +function! ale#assert#SetUpFixerTestCommands() abort + command! -nargs=+ GivenCommandOutput :call ale#assert#GivenCommandOutput() + command! -nargs=+ AssertFixerCwd :call ale#assert#FixerCwd() + command! -nargs=+ AssertFixer :call ale#assert#Fixer() + command! -nargs=0 AssertFixerNotExecuted :call ale#assert#FixerNotExecuted() +endfunction + +function! ale#assert#ResetVariables(filetype, name, ...) abort + " If the suffix of the option names format is different, an additional + " argument can be used for that instead. + if a:0 > 1 + throw 'Too many arguments' + endif + + let l:option_suffix = get(a:000, 0, a:name) + let l:prefix = 'ale_' . a:filetype . '_' + \ . substitute(l:option_suffix, '-', '_', 'g') + let l:filter_expr = 'v:val[: len(l:prefix) - 1] is# l:prefix' + + " Save and clear linter variables. + " We'll load the runtime file to reset them to defaults. + for l:key in filter(keys(g:), l:filter_expr) + execute 'Save g:' . l:key + unlet g:[l:key] + endfor + + for l:key in filter(keys(b:), l:filter_expr) + unlet b:[l:key] + endfor +endfunction + +" A dummy function for making sure this module is loaded. +function! ale#assert#SetUpLinterTest(filetype, name) abort + " Set up a marker so ALE doesn't create real random temporary filenames. + let g:ale_create_dummy_temporary_file = 1 + + " Remove current linters. + call ale#linter#Reset() + call ale#linter#PreventLoading(a:filetype) + + Save g:ale_root + let g:ale_root = {} + + Save b:ale_root + unlet! b:ale_root + + call ale#assert#ResetVariables(a:filetype, a:name) + + Save g:ale_c_build_dir + unlet! g:ale_c_build_dir + unlet! b:ale_c_build_dir + + execute 'runtime ale_linters/' . a:filetype . '/' . a:name . '.vim' + + if !exists('g:dir') + call ale#test#SetDirectory('/testplugin/test/linter') + endif + + call ale#assert#SetUpLinterTestCommands() + + let g:ale_run_synchronously = 1 + let g:ale_run_synchronously_emulate_commands = 1 +endfunction + +function! ale#assert#TearDownLinterTest() abort + unlet! g:ale_create_dummy_temporary_file + unlet! g:ale_run_synchronously + unlet! g:ale_run_synchronously_callbacks + unlet! g:ale_run_synchronously_emulate_commands + unlet! g:ale_run_synchronously_command_results + let s:command_output = [] + + if exists(':GivenCommandOutput') + delcommand GivenCommandOutput + endif + + if exists(':AssertLinterCwd') + delcommand AssertLinterCwd + endif + + if exists(':AssertLinter') + delcommand AssertLinter + endif + + if exists(':AssertLinterNotExecuted') + delcommand AssertLinterNotExecuted + endif + + if exists(':AssertLSPOptions') + delcommand AssertLSPOptions + endif + + if exists(':AssertLSPConfig') + delcommand AssertLSPConfig + endif + + if exists(':AssertLSPLanguage') + delcommand AssertLSPLanguage + endif + + if exists(':AssertLSPProject') + delcommand AssertLSPProject + endif + + if exists(':AssertLSPAddress') + delcommand AssertLSPAddress + endif + + if exists('g:dir') + call ale#test#RestoreDirectory() + endif + + Restore + + call ale#linter#Reset() + + if exists('*ale#semver#ResetVersionCache') + call ale#semver#ResetVersionCache() + endif +endfunction + +function! ale#assert#SetUpFixerTest(filetype, name, ...) abort + " If the suffix of the option names format is different, an additional + " argument can be used for that instead. + if a:0 > 1 + throw 'Too many arguments' + endif + + " Set up a marker so ALE doesn't create real random temporary filenames. + let g:ale_create_dummy_temporary_file = 1 + + let l:function_name = ale#fix#registry#GetFunc(a:name) + let s:FixerFunction = function(l:function_name) + + let l:option_suffix = get(a:000, 0, a:name) + call ale#assert#ResetVariables(a:filetype, a:name, l:option_suffix) + + execute 'runtime autoload/ale/fixers/' . substitute(a:name, '-', '_', 'g') . '.vim' + + if !exists('g:dir') + call ale#test#SetDirectory('/testplugin/test/fixers') + endif + + call ale#assert#SetUpFixerTestCommands() + + let g:ale_run_synchronously = 1 + let g:ale_run_synchronously_emulate_commands = 1 +endfunction + +function! ale#assert#TearDownFixerTest() abort + unlet! g:ale_create_dummy_temporary_file + unlet! g:ale_run_synchronously + unlet! g:ale_run_synchronously_callbacks + unlet! g:ale_run_synchronously_emulate_commands + unlet! g:ale_run_synchronously_command_results + let s:command_output = [] + unlet! s:FixerFunction + + if exists('g:dir') + call ale#test#RestoreDirectory() + endif + + Restore + + if exists('*ale#semver#ResetVersionCache') + call ale#semver#ResetVersionCache() + endif + + if exists(':GivenCommandOutput') + delcommand GivenCommandOutput + endif + + if exists(':AssertFixerCwd') + delcommand AssertFixerCwd + endif + + if exists(':AssertFixer') + delcommand AssertFixer + endif + + if exists(':AssertFixerNotExecuted') + delcommand AssertFixerNotExecuted + endif +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/balloon.vim b/dot_vim/plugged/ale/autoload/ale/balloon.vim new file mode 100644 index 0000000..8678376 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/balloon.vim @@ -0,0 +1,74 @@ +" Author: w0rp +" Description: balloonexpr support for ALE. + +function! ale#balloon#MessageForPos(bufnr, lnum, col) abort + let l:set_balloons = ale#Var(a:bufnr, 'set_balloons') + let l:show_problems = 0 + let l:show_hover = 0 + + if l:set_balloons is 1 + let l:show_problems = 1 + let l:show_hover = 1 + elseif l:set_balloons is# 'hover' + let l:show_hover = 1 + endif + + " Don't show balloons if they are disabled, or linting is disabled. + if !(l:show_problems || l:show_hover) + \|| !g:ale_enabled + \|| !getbufvar(a:bufnr, 'ale_enabled', 1) + return '' + endif + + if l:show_problems + let l:loclist = get(g:ale_buffer_info, a:bufnr, {'loclist': []}).loclist + let l:index = ale#util#BinarySearch(l:loclist, a:bufnr, a:lnum, a:col) + endif + + " Show the diagnostics message if found, 'Hover' output otherwise + if l:show_problems && l:index >= 0 + return l:loclist[l:index].text + elseif l:show_hover && ( + \ exists('*balloon_show') + \ || getbufvar( + \ a:bufnr, + \ 'ale_set_balloons_legacy_echo', + \ get(g:, 'ale_set_balloons_legacy_echo', 0) + \ ) + \) + " Request LSP/tsserver hover information, but only if this version of + " Vim supports the balloon_show function, or if we turned a legacy + " setting on. + call ale#hover#Show(a:bufnr, a:lnum, a:col, {'called_from_balloonexpr': 1}) + endif + + return '' +endfunction + +function! ale#balloon#Expr() abort + return ale#balloon#MessageForPos(v:beval_bufnr, v:beval_lnum, v:beval_col) +endfunction + +function! ale#balloon#Disable() abort + if has('balloon_eval') + set noballooneval + set balloonexpr= + endif + + if has('balloon_eval_term') + set noballoonevalterm + set balloonexpr= + endif +endfunction + +function! ale#balloon#Enable() abort + if has('balloon_eval') + set ballooneval + set balloonexpr=ale#balloon#Expr() + endif + + if has('balloon_eval_term') + set balloonevalterm + set balloonexpr=ale#balloon#Expr() + endif +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/c.vim b/dot_vim/plugged/ale/autoload/ale/c.vim new file mode 100644 index 0000000..4a22c6f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/c.vim @@ -0,0 +1,622 @@ +" Author: gagbo , w0rp , roel0 +" Description: Functions for integrating with C-family linters. + +call ale#Set('c_parse_makefile', 0) +call ale#Set('c_always_make', has('unix') && !has('macunix')) +call ale#Set('c_parse_compile_commands', 1) + +let s:sep = has('win32') ? '\' : '/' + +" Set just so tests can override it. +let g:__ale_c_project_filenames = ['.git/HEAD', 'configure', 'Makefile', 'CMakeLists.txt'] + +let g:ale_c_build_dir_names = get(g:, 'ale_c_build_dir_names', [ +\ 'build', +\ 'bin', +\]) + +function! s:CanParseMakefile(buffer) abort + " Something somewhere seems to delete this setting in tests, so ensure we + " always have a default value. + call ale#Set('c_parse_makefile', 0) + + return ale#Var(a:buffer, 'c_parse_makefile') +endfunction + +function! ale#c#GetBuildDirectory(buffer) abort + let l:build_dir = ale#Var(a:buffer, 'c_build_dir') + + " c_build_dir has the priority if defined + if !empty(l:build_dir) + return l:build_dir + endif + + let [l:root, l:json_file] = ale#c#FindCompileCommands(a:buffer) + + return ale#path#Dirname(l:json_file) +endfunction + +function! ale#c#ShellSplit(line) abort + let l:stack = [] + let l:args = [''] + let l:prev = '' + + for l:char in split(a:line, '\zs') + if l:char is# '''' + if len(l:stack) > 0 && get(l:stack, -1) is# '''' + call remove(l:stack, -1) + elseif (len(l:stack) == 0 || get(l:stack, -1) isnot# '"') && l:prev isnot# '\' + call add(l:stack, l:char) + endif + elseif (l:char is# '"' || l:char is# '`') && l:prev isnot# '\' + if len(l:stack) > 0 && get(l:stack, -1) is# l:char + call remove(l:stack, -1) + elseif len(l:stack) == 0 || get(l:stack, -1) isnot# '''' + call add(l:stack, l:char) + endif + elseif (l:char is# '(' || l:char is# '[' || l:char is# '{') && l:prev isnot# '\' + if len(l:stack) == 0 || get(l:stack, -1) isnot# '''' + call add(l:stack, l:char) + endif + elseif (l:char is# ')' || l:char is# ']' || l:char is# '}') && l:prev isnot# '\' + if len(l:stack) > 0 && get(l:stack, -1) is# {')': '(', ']': '[', '}': '{'}[l:char] + call remove(l:stack, -1) + endif + elseif l:char is# ' ' && len(l:stack) == 0 + if len(get(l:args, -1)) > 0 + call add(l:args, '') + endif + + continue + endif + + let l:args[-1] = get(l:args, -1) . l:char + endfor + + return l:args +endfunction + +" Takes the path prefix and a list of cflags and expands @file arguments to +" the contents of the file. +" +" @file arguments are command line arguments recognised by gcc and clang. For +" instance, if @./path/to/file was given to gcc, it would load .path/to/file +" and use the contents of that file as arguments. +function! ale#c#ExpandAtArgs(path_prefix, raw_split_lines) abort + let l:out_lines = [] + + for l:option in a:raw_split_lines + if stridx(l:option, '@') == 0 + " This is an argument specifying a location of a file containing other arguments + let l:path = join(split(l:option, '\zs')[1:], '') + + " Make path absolute + if !ale#path#IsAbsolute(l:path) + let l:rel_path = substitute(l:path, '"', '', 'g') + let l:rel_path = substitute(l:rel_path, '''', '', 'g') + let l:path = ale#path#GetAbsPath(a:path_prefix, l:rel_path) + endif + + " Read the file and add all the arguments + try + let l:additional_args = readfile(l:path) + catch + continue " All we can really do is skip this argument + endtry + + let l:file_lines = [] + + for l:line in l:additional_args + let l:file_lines += ale#c#ShellSplit(l:line) + endfor + + " @file arguments can include other @file arguments, so we must + " recurse. + let l:out_lines += ale#c#ExpandAtArgs(a:path_prefix, l:file_lines) + else + " This is not an @file argument, so don't touch it. + let l:out_lines += [l:option] + endif + endfor + + return l:out_lines +endfunction + +" Quote C/C++ a compiler argument, if needed. +" +" Quoting arguments might cause issues with some systems/compilers, so we only +" quote them if we need to. +function! ale#c#QuoteArg(arg) abort + if a:arg !~# '\v[#$&*()\\|[\]{};''"<>/?! ^%]' + return a:arg + endif + + return ale#Escape(a:arg) +endfunction + +function! ale#c#ParseCFlags(path_prefix, should_quote, raw_arguments) abort + " Expand @file arguments now before parsing + let l:arguments = ale#c#ExpandAtArgs(a:path_prefix, a:raw_arguments) + " A list of [already_quoted, argument] + let l:items = [] + let l:option_index = 0 + + while l:option_index < len(l:arguments) + let l:option = l:arguments[l:option_index] + let l:option_index = l:option_index + 1 + + " Include options, that may need relative path fix + if stridx(l:option, '-I') == 0 + \ || stridx(l:option, '-iquote') == 0 + \ || stridx(l:option, '-isystem') == 0 + \ || stridx(l:option, '-idirafter') == 0 + \ || stridx(l:option, '-iframework') == 0 + if stridx(l:option, '-I') == 0 && l:option isnot# '-I' + let l:arg = join(split(l:option, '\zs')[2:], '') + let l:option = '-I' + else + let l:arg = l:arguments[l:option_index] + let l:option_index = l:option_index + 1 + endif + + " Fix relative paths if needed + if !ale#path#IsAbsolute(l:arg) + let l:rel_path = substitute(l:arg, '"', '', 'g') + let l:rel_path = substitute(l:rel_path, '''', '', 'g') + let l:arg = ale#path#GetAbsPath(a:path_prefix, l:rel_path) + endif + + call add(l:items, [1, l:option]) + call add(l:items, [1, ale#Escape(l:arg)]) + " Options with arg that can be grouped with the option or separate + elseif stridx(l:option, '-D') == 0 || stridx(l:option, '-B') == 0 + if l:option is# '-D' || l:option is# '-B' + call add(l:items, [1, l:option]) + call add(l:items, [0, l:arguments[l:option_index]]) + let l:option_index = l:option_index + 1 + else + call add(l:items, [0, l:option]) + endif + " Options that have an argument (always separate) + elseif l:option is# '-iprefix' || stridx(l:option, '-iwithprefix') == 0 + \ || l:option is# '-isysroot' || l:option is# '-imultilib' + \ || l:option is# '-include' || l:option is# '-imacros' + call add(l:items, [0, l:option]) + call add(l:items, [0, l:arguments[l:option_index]]) + let l:option_index = l:option_index + 1 + " Options without argument + elseif (stridx(l:option, '-W') == 0 && stridx(l:option, '-Wa,') != 0 && stridx(l:option, '-Wl,') != 0 && stridx(l:option, '-Wp,') != 0) + \ || l:option is# '-w' || stridx(l:option, '-pedantic') == 0 + \ || l:option is# '-ansi' || stridx(l:option, '-std=') == 0 + \ || stridx(l:option, '-f') == 0 && l:option !~# '\v^-f(dump|diagnostics|no-show-column|stack-usage)' + \ || stridx(l:option, '-O') == 0 + \ || l:option is# '-C' || l:option is# '-CC' || l:option is# '-trigraphs' + \ || stridx(l:option, '-nostdinc') == 0 || stridx(l:option, '-iplugindir=') == 0 + \ || stridx(l:option, '--sysroot=') == 0 || l:option is# '--no-sysroot-suffix' + \ || stridx(l:option, '-m') == 0 + call add(l:items, [0, l:option]) + endif + endwhile + + if a:should_quote + " Quote C arguments that haven't already been quoted above. + " If and only if we've been asked to quote them. + call map(l:items, 'v:val[0] ? v:val[1] : ale#c#QuoteArg(v:val[1])') + else + call map(l:items, 'v:val[1]') + endif + + return join(l:items, ' ') +endfunction + +function! ale#c#ParseCFlagsFromMakeOutput(buffer, make_output) abort + if !s:CanParseMakefile(a:buffer) + return v:null + endif + + let l:buffer_filename = expand('#' . a:buffer . ':t') + let l:cflag_line = '' + + " Find a line matching this buffer's filename in the make output. + for l:line in a:make_output + if stridx(l:line, l:buffer_filename) >= 0 + let l:cflag_line = l:line + break + endif + endfor + + let l:makefile_path = ale#path#FindNearestFile(a:buffer, 'Makefile') + let l:makefile_dir = fnamemodify(l:makefile_path, ':p:h') + + return ale#c#ParseCFlags(l:makefile_dir, 0, ale#c#ShellSplit(l:cflag_line)) +endfunction + +" Given a buffer number, find the project directory containing +" compile_commands.json, and the path to the compile_commands.json file. +" +" If compile_commands.json cannot be found, two empty strings will be +" returned. +function! ale#c#FindCompileCommands(buffer) abort + " Look above the current source file to find compile_commands.json + let l:json_file = ale#path#FindNearestFile(a:buffer, 'compile_commands.json') + + if !empty(l:json_file) + return [fnamemodify(l:json_file, ':h'), l:json_file] + endif + + " Search in build directories if we can't find it in the project. + for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + for l:dirname in ale#Var(a:buffer, 'c_build_dir_names') + let l:c_build_dir = l:path . s:sep . l:dirname + let l:json_file = l:c_build_dir . s:sep . 'compile_commands.json' + + if filereadable(l:json_file) + return [l:path, l:json_file] + endif + endfor + endfor + + return ['', ''] +endfunction + +" Find the project root for C/C++ projects. +" +" The location of compile_commands.json will be used to find project roots. +" +" If compile_commands.json cannot be found, other common configuration files +" will be used to detect the project root. +function! ale#c#FindProjectRoot(buffer) abort + let [l:root, l:json_file] = ale#c#FindCompileCommands(a:buffer) + + " Fall back on detecting the project root based on other filenames. + if empty(l:root) + for l:project_filename in g:__ale_c_project_filenames + let l:full_path = ale#path#FindNearestFile(a:buffer, l:project_filename) + + if !empty(l:full_path) + let l:path = fnamemodify(l:full_path, ':h') + + " Correct .git path detection. + if fnamemodify(l:path, ':t') is# '.git' + let l:path = fnamemodify(l:path, ':h') + endif + + return l:path + endif + endfor + endif + + return l:root +endfunction + +" Cache compile_commands.json data in a Dictionary, so we don't need to read +" the same files over and over again. The key in the dictionary will include +" the last modified time of the file. +if !exists('s:compile_commands_cache') + let s:compile_commands_cache = {} +endif + +function! ale#c#ResetCompileCommandsCache() abort + let s:compile_commands_cache = {} +endfunction + +function! s:GetLookupFromCompileCommandsFile(compile_commands_file) abort + let l:empty = [{}, {}] + + if empty(a:compile_commands_file) + return l:empty + endif + + let l:time = getftime(a:compile_commands_file) + + if l:time < 0 + return l:empty + endif + + let l:key = a:compile_commands_file . ':' . l:time + + if has_key(s:compile_commands_cache, l:key) + return s:compile_commands_cache[l:key] + endif + + let l:raw_data = [] + silent! let l:raw_data = json_decode(join(readfile(a:compile_commands_file), '')) + + if type(l:raw_data) isnot v:t_list + let l:raw_data = [] + endif + + let l:file_lookup = {} + let l:dir_lookup = {} + + for l:entry in (type(l:raw_data) is v:t_list ? l:raw_data : []) + let l:filename = ale#path#GetAbsPath(l:entry.directory, l:entry.file) + + " Store a key for lookups by the absolute path to the filename. + let l:file_lookup[l:filename] = get(l:file_lookup, l:filename, []) + [l:entry] + + " Store a key for fuzzy lookups by the absolute path to the directory. + let l:dirname = fnamemodify(l:filename, ':h') + let l:dir_lookup[l:dirname] = get(l:dir_lookup, l:dirname, []) + [l:entry] + + " Store a key for fuzzy lookups by just the basename of the file. + let l:basename = tolower(fnamemodify(l:entry.file, ':t')) + let l:file_lookup[l:basename] = get(l:file_lookup, l:basename, []) + [l:entry] + + " Store a key for fuzzy lookups by just the basename of the directory. + let l:dirbasename = tolower(fnamemodify(l:entry.directory, ':p:h:t')) + let l:dir_lookup[l:dirbasename] = get(l:dir_lookup, l:dirbasename, []) + [l:entry] + endfor + + if !empty(l:file_lookup) && !empty(l:dir_lookup) + let l:result = [l:file_lookup, l:dir_lookup] + let s:compile_commands_cache[l:key] = l:result + + return l:result + endif + + return l:empty +endfunction + +" Get [should_quote, arguments] from either 'command' or 'arguments' +" 'arguments' should be quoted later, the split 'command' strings should not. +function! s:GetArguments(json_item) abort + if has_key(a:json_item, 'arguments') + return [1, a:json_item.arguments] + elseif has_key(a:json_item, 'command') + return [0, ale#c#ShellSplit(a:json_item.command)] + endif + + return [0, []] +endfunction + +function! ale#c#ParseCompileCommandsFlags(buffer, file_lookup, dir_lookup) abort + let l:buffer_filename = ale#path#Simplify(expand('#' . a:buffer . ':p')) + let l:basename = tolower(fnamemodify(l:buffer_filename, ':t')) + " Look for any file in the same directory if we can't find an exact match. + let l:dir = fnamemodify(l:buffer_filename, ':h') + + " Search for an exact file match first. + let l:file_list = get(a:file_lookup, l:buffer_filename, []) + + " We may have to look for /foo/bar instead of C:\foo\bar + if empty(l:file_list) && has('win32') + let l:file_list = get( + \ a:file_lookup, + \ ale#path#RemoveDriveLetter(l:buffer_filename), + \ [] + \) + endif + + " Try the absolute path to the directory second. + let l:dir_list = get(a:dir_lookup, l:dir, []) + + if empty(l:dir_list) && has('win32') + let l:dir_list = get( + \ a:dir_lookup, + \ ale#path#RemoveDriveLetter(l:dir), + \ [] + \) + endif + + if empty(l:file_list) && empty(l:dir_list) + " If we can't find matches with the path to the file, try a + " case-insensitive match for any similarly-named file. + let l:file_list = get(a:file_lookup, l:basename, []) + + " If we can't find matches with the path to the directory, try a + " case-insensitive match for anything in similarly-named directory. + let l:dir_list = get(a:dir_lookup, tolower(fnamemodify(l:dir, ':t')), []) + endif + + " A source file matching the header filename. + let l:source_file = '' + + if empty(l:file_list) && l:basename =~? '\.h$\|\.hpp$' + for l:suffix in ['.c', '.cpp'] + " Try to find a source file by an absolute path first. + let l:key = fnamemodify(l:buffer_filename, ':r') . l:suffix + let l:file_list = get(a:file_lookup, l:key, []) + + if empty(l:file_list) && has('win32') + let l:file_list = get( + \ a:file_lookup, + \ ale#path#RemoveDriveLetter(l:key), + \ [] + \) + endif + + if empty(l:file_list) + " Look fuzzy matches on the basename second. + let l:key = fnamemodify(l:basename, ':r') . l:suffix + let l:file_list = get(a:file_lookup, l:key, []) + endif + + if !empty(l:file_list) + let l:source_file = l:key + break + endif + endfor + endif + + for l:item in l:file_list + let l:filename = ale#path#GetAbsPath(l:item.directory, l:item.file) + + " Load the flags for this file, or for a source file matching the + " header file. + if ( + \ bufnr(l:filename) is a:buffer + \ || ( + \ !empty(l:source_file) + \ && l:filename[-len(l:source_file):] is? l:source_file + \ ) + \) + let [l:should_quote, l:args] = s:GetArguments(l:item) + + return ale#c#ParseCFlags(l:item.directory, l:should_quote, l:args) + endif + endfor + + for l:item in l:dir_list + let l:filename = ale#path#GetAbsPath(l:item.directory, l:item.file) + + if ale#path#RemoveDriveLetter(fnamemodify(l:filename, ':h')) + \ is? ale#path#RemoveDriveLetter(l:dir) + let [l:should_quote, l:args] = s:GetArguments(l:item) + + return ale#c#ParseCFlags(l:item.directory, l:should_quote, l:args) + endif + endfor + + return '' +endfunction + +function! ale#c#FlagsFromCompileCommands(buffer, compile_commands_file) abort + let l:lookups = s:GetLookupFromCompileCommandsFile(a:compile_commands_file) + let l:file_lookup = l:lookups[0] + let l:dir_lookup = l:lookups[1] + + return ale#c#ParseCompileCommandsFlags(a:buffer, l:file_lookup, l:dir_lookup) +endfunction + +function! ale#c#GetCFlags(buffer, output) abort + let l:cflags = v:null + + if ale#Var(a:buffer, 'c_parse_compile_commands') + let [l:root, l:json_file] = ale#c#FindCompileCommands(a:buffer) + + if !empty(l:json_file) + let l:cflags = ale#c#FlagsFromCompileCommands(a:buffer, l:json_file) + endif + endif + + if empty(l:cflags) && s:CanParseMakefile(a:buffer) && !empty(a:output) + let l:cflags = ale#c#ParseCFlagsFromMakeOutput(a:buffer, a:output) + endif + + if l:cflags is v:null + let l:cflags = ale#c#IncludeOptions(ale#c#FindLocalHeaderPaths(a:buffer)) + endif + + return l:cflags isnot v:null ? l:cflags : '' +endfunction + +function! ale#c#GetMakeCommand(buffer) abort + if s:CanParseMakefile(a:buffer) + let l:path = ale#path#FindNearestFile(a:buffer, 'Makefile') + + if empty(l:path) + let l:path = ale#path#FindNearestFile(a:buffer, 'GNUmakefile') + endif + + if !empty(l:path) + let l:always_make = ale#Var(a:buffer, 'c_always_make') + + return [ + \ fnamemodify(l:path, ':h'), + \ 'make -n' . (l:always_make ? ' --always-make' : ''), + \] + endif + endif + + return ['', ''] +endfunction + +function! ale#c#RunMakeCommand(buffer, Callback) abort + let [l:cwd, l:command] = ale#c#GetMakeCommand(a:buffer) + + if empty(l:command) + return a:Callback(a:buffer, []) + endif + + return ale#command#Run( + \ a:buffer, + \ l:command, + \ {b, output -> a:Callback(a:buffer, output)}, + \ {'cwd': l:cwd}, + \) +endfunction + +" Given a buffer number, search for a project root, and output a List +" of directories to include based on some heuristics. +" +" For projects with headers in the project root, the project root will +" be returned. +" +" For projects with an 'include' directory, that directory will be returned. +function! ale#c#FindLocalHeaderPaths(buffer) abort + let l:project_root = ale#c#FindProjectRoot(a:buffer) + + if empty(l:project_root) + return [] + endif + + " See if we can find .h files directory in the project root. + " If we can, that's our include directory. + if !empty(globpath(l:project_root, '*.h', 0)) + return [l:project_root] + endif + + " Look for .hpp files too. + if !empty(globpath(l:project_root, '*.hpp', 0)) + return [l:project_root] + endif + + " If we find an 'include' directory in the project root, then use that. + if isdirectory(l:project_root . '/include') + return [ale#path#Simplify(l:project_root . s:sep . 'include')] + endif + + return [] +endfunction + +" Given a List of include paths, create a string containing the -I include +" options for those paths, with the paths escaped for use in the shell. +function! ale#c#IncludeOptions(include_paths) abort + let l:option_list = [] + + for l:path in a:include_paths + call add(l:option_list, '-I' . ale#Escape(l:path)) + endfor + + if empty(l:option_list) + return '' + endif + + return join(l:option_list) +endfunction + +" Get the language flag depending on on the executable, options and +" file extension +function! ale#c#GetLanguageFlag( +\ buffer, +\ executable, +\ use_header_lang_flag, +\ header_exts, +\ linter_lang_flag +\) abort + " Use only '-header' if the executable is 'clang' by default + if a:use_header_lang_flag == -1 + let l:use_header_lang_flag = a:executable =~# 'clang' + else + let l:use_header_lang_flag = a:use_header_lang_flag + endif + + " If we don't use the header language flag, return the default linter + " language flag + if !l:use_header_lang_flag + return a:linter_lang_flag + endif + + " Get the buffer file extension + let l:buf_ext = expand('#' . a:buffer . ':e') + + " If the buffer file is an header according to its extension, use + " the linter language flag + '-header', ex: 'c-header' + if index(a:header_exts, l:buf_ext) >= 0 + return a:linter_lang_flag . '-header' + endif + + " Else, use the default linter language flag + return a:linter_lang_flag +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/code_action.vim b/dot_vim/plugged/ale/autoload/ale/code_action.vim new file mode 100644 index 0000000..db31aad --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/code_action.vim @@ -0,0 +1,389 @@ +" Author: Jerko Steiner +" Description: Code action support for LSP / tsserver + +function! ale#code_action#ReloadBuffer() abort + let l:buffer = bufnr('') + + execute 'augroup ALECodeActionReloadGroup' . l:buffer + autocmd! + augroup END + + silent! execute 'augroup! ALECodeActionReloadGroup' . l:buffer + + call ale#util#Execute(':e!') +endfunction + +function! ale#code_action#HandleCodeAction(code_action, options) abort + let l:current_buffer = bufnr('') + let l:changes = a:code_action.changes + + for l:file_code_edit in l:changes + call ale#code_action#ApplyChanges( + \ l:file_code_edit.fileName, + \ l:file_code_edit.textChanges, + \ a:options, + \) + endfor +endfunction + +function! s:ChangeCmp(left, right) abort + if a:left.start.line < a:right.start.line + return -1 + endif + + if a:left.start.line > a:right.start.line + return 1 + endif + + if a:left.start.offset < a:right.start.offset + return -1 + endif + + if a:left.start.offset > a:right.start.offset + return 1 + endif + + if a:left.end.line < a:right.end.line + return -1 + endif + + if a:left.end.line > a:right.end.line + return 1 + endif + + if a:left.end.offset < a:right.end.offset + return -1 + endif + + if a:left.end.offset > a:right.end.offset + return 1 + endif + + return 0 +endfunction + +function! ale#code_action#ApplyChanges(filename, changes, options) abort + let l:should_save = get(a:options, 'should_save') + let l:conn_id = get(a:options, 'conn_id') + + let l:orig_buffer = bufnr('') + + " The buffer is used to determine the fileformat, if available. + let l:buffer = bufnr(a:filename) + + if l:buffer != l:orig_buffer + call ale#util#Execute('silent edit ' . a:filename) + let l:buffer = bufnr('') + endif + + let l:lines = getbufline(l:buffer, 1, '$') + + " Add empty line if there's trailing newline, like readfile() does. + if getbufvar(l:buffer, '&eol') + let l:lines += [''] + endif + + let l:pos = getpos('.')[1:2] + + " Changes have to be sorted so we apply them from bottom-to-top + for l:code_edit in reverse(sort(copy(a:changes), function('s:ChangeCmp'))) + let l:line = l:code_edit.start.line + let l:column = l:code_edit.start.offset + let l:end_line = l:code_edit.end.line + let l:end_column = l:code_edit.end.offset + let l:text = l:code_edit.newText + + let l:insertions = split(l:text, '\n', 1) + + " Fix invalid columns + let l:column = l:column > 0 ? l:column : 1 + let l:end_column = l:end_column > 0 ? l:end_column : 1 + + " Clamp start to BOF + if l:line < 1 + let [l:line, l:column] = [1, 1] + endif + + " Clamp start to EOF + if l:line > len(l:lines) || l:line == len(l:lines) && l:column > len(l:lines[-1]) + 1 + let [l:line, l:column] = [len(l:lines), len(l:lines[-1]) + 1] + " Special case when start is after EOL + elseif l:line < len(l:lines) && l:column > len(l:lines[l:line - 1]) + 1 + let [l:line, l:column] = [l:line + 1, 1] + endif + + " Adjust end: clamp if invalid and/or adjust if we moved start + if l:end_line < l:line || l:end_line == l:line && l:end_column < l:column + let [l:end_line, l:end_column] = [l:line, l:column] + endif + + " Clamp end to EOF + if l:end_line > len(l:lines) || l:end_line == len(l:lines) && l:end_column > len(l:lines[-1]) + 1 + let [l:end_line, l:end_column] = [len(l:lines), len(l:lines[-1]) + 1] + " Special case when end is after EOL + elseif l:end_line < len(l:lines) && l:end_column > len(l:lines[l:end_line - 1]) + 1 + let [l:end_line, l:end_column] = [l:end_line + 1, 1] + endif + + " Careful, [:-1] is not an empty list + let l:start = l:line is 1 ? [] : l:lines[: l:line - 2] + let l:middle = l:column is 1 ? [''] : [l:lines[l:line - 1][: l:column - 2]] + + let l:middle[-1] .= l:insertions[0] + let l:middle += l:insertions[1:] + let l:middle[-1] .= l:lines[l:end_line - 1][l:end_column - 1 :] + + let l:end_line_len = len(l:lines[l:end_line - 1]) + let l:lines_before_change = len(l:lines) + let l:lines = l:start + l:middle + l:lines[l:end_line :] + + let l:current_line_offset = len(l:lines) - l:lines_before_change + let l:column_offset = len(l:middle[-1]) - l:end_line_len + + " Keep cursor where it was (if outside of changes) or move it after + " the changed text (if inside), but don't touch it when the change + " spans the entire buffer, in which case we have no clue and it's + " better to not do anything. + if l:line isnot 1 || l:column isnot 1 + \|| l:end_line < l:lines_before_change + \|| l:end_line == l:lines_before_change && l:end_column <= l:end_line_len + let l:pos = s:UpdateCursor(l:pos, + \ [l:line, l:column], + \ [l:end_line, l:end_column], + \ [l:current_line_offset, l:column_offset]) + endif + endfor + + " Make sure to add a trailing newline if and only if it should be added. + if l:lines[-1] is# '' && getbufvar(l:buffer, '&eol') + call remove(l:lines, -1) + else + call setbufvar(l:buffer, '&eol', 0) + endif + + call ale#util#SetBufferContents(l:buffer, l:lines) + + call ale#lsp#NotifyForChanges(l:conn_id, l:buffer) + + if l:should_save + call ale#util#Execute('silent w!') + endif + + call setpos('.', [0, l:pos[0], l:pos[1], 0]) + + if l:orig_buffer != l:buffer && bufexists(l:orig_buffer) + call ale#util#Execute('silent buf ' . string(l:orig_buffer)) + endif +endfunction + +function! s:UpdateCursor(cursor, start, end, offset) abort + let l:cur_line = a:cursor[0] + let l:cur_column = a:cursor[1] + let l:line = a:start[0] + let l:column = a:start[1] + let l:end_line = a:end[0] + let l:end_column = a:end[1] + let l:line_offset = a:offset[0] + let l:column_offset = a:offset[1] + + if l:end_line < l:cur_line + " both start and end lines are before the cursor. only line offset + " needs to be updated + let l:cur_line += l:line_offset + elseif l:end_line == l:cur_line + " end line is at the same location as cursor, which means + " l:line <= l:cur_line + if l:line < l:cur_line || l:column <= l:cur_column + " updates are happening either before or around the cursor + if l:end_column < l:cur_column + " updates are happening before the cursor, update the + " column offset for cursor + let l:cur_line += l:line_offset + let l:cur_column += l:column_offset + else + " updates are happening around the cursor, move the cursor + " to the end of the changes + let l:cur_line += l:line_offset + let l:cur_column = l:end_column + l:column_offset + endif + " else is not necessary, it means modifications are happening + " after the cursor so no cursor updates need to be done + endif + else + " end line is after the cursor + if l:line < l:cur_line || l:line == l:cur_line && l:column <= l:cur_column + " changes are happening around the cursor, move the cursor + " to the end of the changes + let l:cur_line = l:end_line + l:line_offset + let l:cur_column = l:end_column + l:column_offset + " else is not necessary, it means modifications are happening + " after the cursor so no cursor updates need to be done + endif + endif + + return [l:cur_line, l:cur_column] +endfunction + +function! ale#code_action#GetChanges(workspace_edit) abort + if a:workspace_edit is v:null + return {} + endif + + let l:changes = {} + + if has_key(a:workspace_edit, 'changes') && !empty(a:workspace_edit.changes) + return a:workspace_edit.changes + elseif has_key(a:workspace_edit, 'documentChanges') + let l:document_changes = [] + + if type(a:workspace_edit.documentChanges) is v:t_dict + \ && has_key(a:workspace_edit.documentChanges, 'edits') + call add(l:document_changes, a:workspace_edit.documentChanges) + elseif type(a:workspace_edit.documentChanges) is v:t_list + let l:document_changes = a:workspace_edit.documentChanges + endif + + for l:text_document_edit in l:document_changes + let l:filename = l:text_document_edit.textDocument.uri + let l:edits = l:text_document_edit.edits + let l:changes[l:filename] = l:edits + endfor + endif + + return l:changes +endfunction + +function! ale#code_action#BuildChangesList(changes_map) abort + let l:changes = [] + + for l:file_name in keys(a:changes_map) + let l:text_edits = a:changes_map[l:file_name] + let l:text_changes = [] + + for l:edit in l:text_edits + let l:range = l:edit.range + let l:new_text = l:edit.newText + + call add(l:text_changes, { + \ 'start': { + \ 'line': l:range.start.line + 1, + \ 'offset': l:range.start.character + 1, + \ }, + \ 'end': { + \ 'line': l:range.end.line + 1, + \ 'offset': l:range.end.character + 1, + \ }, + \ 'newText': l:new_text, + \}) + endfor + + call add(l:changes, { + \ 'fileName': ale#util#ToResource(l:file_name), + \ 'textChanges': l:text_changes, + \}) + endfor + + return l:changes +endfunction + +function! s:EscapeMenuName(text) abort + return substitute(a:text, '\\\| \|\.\|&', '\\\0', 'g') +endfunction + +function! s:UpdateMenu(data, menu_items) abort + silent! aunmenu PopUp.Refactor\.\.\. + + if empty(a:data) + return + endif + + for [l:type, l:item] in a:menu_items + let l:name = l:type is# 'tsserver' ? l:item.name : l:item.title + let l:func_name = l:type is# 'tsserver' + \ ? 'ale#codefix#ApplyTSServerCodeAction' + \ : 'ale#codefix#ApplyLSPCodeAction' + + execute printf( + \ 'anoremenu PopUp.&Refactor\.\.\..%s' + \ . ' :call %s(%s, %s)', + \ s:EscapeMenuName(l:name), + \ l:func_name, + \ string(a:data), + \ string(l:item), + \) + endfor + + if empty(a:menu_items) + silent! anoremenu PopUp.Refactor\.\.\..(None) :silent + endif +endfunction + +function! s:GetCodeActions(linter, options) abort + let l:buffer = bufnr('') + let [l:line, l:column] = getpos('.')[1:2] + let l:column = min([l:column, len(getline(l:line))]) + + let l:location = { + \ 'buffer': l:buffer, + \ 'line': l:line, + \ 'column': l:column, + \ 'end_line': l:line, + \ 'end_column': l:column, + \} + let l:Callback = function('s:OnReady', [l:location, a:options]) + call ale#lsp_linter#StartLSP(l:buffer, a:linter, l:Callback) +endfunction + +function! ale#code_action#GetCodeActions(options) abort + silent! aunmenu PopUp.Rename + silent! aunmenu PopUp.Refactor\.\.\. + + " Only display the menu items if there's an LSP server. + let l:has_lsp = 0 + + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + let l:has_lsp = 1 + + break + endif + endfor + + if l:has_lsp + if !empty(expand('')) + silent! anoremenu PopUp.Rename :ALERename + endif + + silent! anoremenu PopUp.Refactor\.\.\..(None) :silent + + call ale#codefix#Execute( + \ mode() is# 'v' || mode() is# "\", + \ function('s:UpdateMenu') + \) + endif +endfunction + +function! s:Setup(enabled) abort + augroup ALECodeActionsGroup + autocmd! + + if a:enabled + autocmd MenuPopup * :call ale#code_action#GetCodeActions({}) + endif + augroup END + + if !a:enabled + silent! augroup! ALECodeActionsGroup + + silent! aunmenu PopUp.Rename + silent! aunmenu PopUp.Refactor\.\.\. + endif +endfunction + +function! ale#code_action#EnablePopUpMenu() abort + call s:Setup(1) +endfunction + +function! ale#code_action#DisablePopUpMenu() abort + call s:Setup(0) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/codefix.vim b/dot_vim/plugged/ale/autoload/ale/codefix.vim new file mode 100644 index 0000000..34ce3e1 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/codefix.vim @@ -0,0 +1,497 @@ +" Author: Dalius Dobravolskas +" Description: Code Fix support for tsserver and LSP servers + +let s:codefix_map = {} + +" Used to get the codefix map in tests. +function! ale#codefix#GetMap() abort + return deepcopy(s:codefix_map) +endfunction + +" Used to set the codefix map in tests. +function! ale#codefix#SetMap(map) abort + let s:codefix_map = a:map +endfunction + +function! ale#codefix#ClearLSPData() abort + let s:codefix_map = {} +endfunction + +function! s:message(message) abort + call ale#util#Execute('echom ' . string(a:message)) +endfunction + +function! ale#codefix#ApplyTSServerCodeAction(data, item) abort + if has_key(a:item, 'changes') + let l:changes = a:item.changes + + call ale#code_action#HandleCodeAction( + \ { + \ 'description': 'codefix', + \ 'changes': l:changes, + \ }, + \ {}, + \) + else + let l:message = ale#lsp#tsserver_message#GetEditsForRefactor( + \ a:data.buffer, + \ a:data.line, + \ a:data.column, + \ a:data.end_line, + \ a:data.end_column, + \ a:item.id[0], + \ a:item.id[1], + \) + + let l:request_id = ale#lsp#Send(a:data.connection_id, l:message) + + let s:codefix_map[l:request_id] = a:data + endif +endfunction + +function! ale#codefix#HandleTSServerResponse(conn_id, response) abort + if !has_key(a:response, 'request_seq') + \ || !has_key(s:codefix_map, a:response.request_seq) + return + endif + + let l:data = remove(s:codefix_map, a:response.request_seq) + let l:MenuCallback = get(l:data, 'menu_callback', v:null) + + if get(a:response, 'command', '') is# 'getCodeFixes' + if get(a:response, 'success', v:false) is v:false + \&& l:MenuCallback is v:null + let l:message = get(a:response, 'message', 'unknown') + call s:message('Error while getting code fixes. Reason: ' . l:message) + + return + endif + + let l:result = get(a:response, 'body', []) + call filter(l:result, 'has_key(v:val, ''changes'')') + + if l:MenuCallback isnot v:null + call l:MenuCallback( + \ l:data, + \ map(copy(l:result), '[''tsserver'', v:val]') + \) + + return + endif + + if len(l:result) == 0 + call s:message('No code fixes available.') + + return + endif + + let l:code_fix_to_apply = 0 + + if len(l:result) == 1 + let l:code_fix_to_apply = 1 + else + let l:codefix_no = 1 + let l:codefixstring = "Code Fixes:\n" + + for l:codefix in l:result + let l:codefixstring .= l:codefix_no . ') ' + \ . l:codefix.description . "\n" + let l:codefix_no += 1 + endfor + + let l:codefixstring .= 'Type number and (empty cancels): ' + + let l:code_fix_to_apply = ale#util#Input(l:codefixstring, '') + let l:code_fix_to_apply = str2nr(l:code_fix_to_apply) + + if l:code_fix_to_apply == 0 + return + endif + endif + + call ale#codefix#ApplyTSServerCodeAction( + \ l:data, + \ l:result[l:code_fix_to_apply - 1], + \) + elseif get(a:response, 'command', '') is# 'getApplicableRefactors' + if get(a:response, 'success', v:false) is v:false + \&& l:MenuCallback is v:null + let l:message = get(a:response, 'message', 'unknown') + call s:message('Error while getting applicable refactors. Reason: ' . l:message) + + return + endif + + let l:result = get(a:response, 'body', []) + + if len(l:result) == 0 + call s:message('No applicable refactors available.') + + return + endif + + let l:refactors = [] + + for l:item in l:result + for l:action in l:item.actions + call add(l:refactors, { + \ 'name': l:action.description, + \ 'id': [l:item.name, l:action.name], + \}) + endfor + endfor + + if l:MenuCallback isnot v:null + call l:MenuCallback( + \ l:data, + \ map(copy(l:refactors), '[''tsserver'', v:val]') + \) + + return + endif + + let l:refactor_no = 1 + let l:refactorstring = "Applicable refactors:\n" + + for l:refactor in l:refactors + let l:refactorstring .= l:refactor_no . ') ' + \ . l:refactor.name . "\n" + let l:refactor_no += 1 + endfor + + let l:refactorstring .= 'Type number and (empty cancels): ' + + let l:refactor_to_apply = ale#util#Input(l:refactorstring, '') + let l:refactor_to_apply = str2nr(l:refactor_to_apply) + + if l:refactor_to_apply == 0 + return + endif + + let l:id = l:refactors[l:refactor_to_apply - 1].id + + call ale#codefix#ApplyTSServerCodeAction( + \ l:data, + \ l:refactors[l:refactor_to_apply - 1], + \) + elseif get(a:response, 'command', '') is# 'getEditsForRefactor' + if get(a:response, 'success', v:false) is v:false + let l:message = get(a:response, 'message', 'unknown') + call s:message('Error while getting edits for refactor. Reason: ' . l:message) + + return + endif + + call ale#code_action#HandleCodeAction( + \ { + \ 'description': 'editsForRefactor', + \ 'changes': a:response.body.edits, + \ }, + \ {}, + \) + endif +endfunction + +function! ale#codefix#ApplyLSPCodeAction(data, item) abort + if has_key(a:item, 'command') + \&& type(a:item.command) == v:t_dict + let l:command = a:item.command + let l:message = ale#lsp#message#ExecuteCommand( + \ l:command.command, + \ l:command.arguments, + \) + + let l:request_id = ale#lsp#Send(a:data.connection_id, l:message) + elseif has_key(a:item, 'command') && has_key(a:item, 'arguments') + \&& type(a:item.command) == v:t_string + let l:message = ale#lsp#message#ExecuteCommand( + \ a:item.command, + \ a:item.arguments, + \) + + let l:request_id = ale#lsp#Send(a:data.connection_id, l:message) + elseif has_key(a:item, 'edit') || has_key(a:item, 'arguments') + if has_key(a:item, 'edit') + let l:topass = a:item.edit + else + let l:topass = a:item.arguments[0] + endif + + let l:changes_map = ale#code_action#GetChanges(l:topass) + + if empty(l:changes_map) + return + endif + + let l:changes = ale#code_action#BuildChangesList(l:changes_map) + + call ale#code_action#HandleCodeAction( + \ { + \ 'description': 'codeaction', + \ 'changes': l:changes, + \ }, + \ {}, + \) + endif +endfunction + +function! ale#codefix#HandleLSPResponse(conn_id, response) abort + if has_key(a:response, 'method') + \ && a:response.method is# 'workspace/applyEdit' + \ && has_key(a:response, 'params') + let l:params = a:response.params + + let l:changes_map = ale#code_action#GetChanges(l:params.edit) + + if empty(l:changes_map) + return + endif + + let l:changes = ale#code_action#BuildChangesList(l:changes_map) + + call ale#code_action#HandleCodeAction( + \ { + \ 'description': 'applyEdit', + \ 'changes': l:changes, + \ }, + \ {} + \) + elseif has_key(a:response, 'id') + \&& has_key(s:codefix_map, a:response.id) + let l:data = remove(s:codefix_map, a:response.id) + let l:MenuCallback = get(l:data, 'menu_callback', v:null) + + let l:result = get(a:response, 'result') + + if type(l:result) != v:t_list + let l:result = [] + endif + + " Send the results to the menu callback, if set. + if l:MenuCallback isnot v:null + call l:MenuCallback( + \ l:data, + \ map(copy(l:result), '[''lsp'', v:val]') + \) + + return + endif + + if len(l:result) == 0 + call s:message('No code actions received from server') + + return + endif + + let l:codeaction_no = 1 + let l:codeactionstring = "Code Fixes:\n" + + for l:codeaction in l:result + let l:codeactionstring .= l:codeaction_no . ') ' + \ . l:codeaction.title . "\n" + let l:codeaction_no += 1 + endfor + + let l:codeactionstring .= 'Type number and (empty cancels): ' + + let l:codeaction_to_apply = ale#util#Input(l:codeactionstring, '') + let l:codeaction_to_apply = str2nr(l:codeaction_to_apply) + + if l:codeaction_to_apply == 0 + return + endif + + let l:item = l:result[l:codeaction_to_apply - 1] + + call ale#codefix#ApplyLSPCodeAction(l:data, l:item) + endif +endfunction + +function! s:FindError(buffer, line, column, end_line, end_column, linter_name) abort + let l:nearest_error = v:null + + if a:line == a:end_line + \&& a:column == a:end_column + \&& has_key(g:ale_buffer_info, a:buffer) + let l:nearest_error_diff = -1 + + for l:error in get(g:ale_buffer_info[a:buffer], 'loclist', []) + if has_key(l:error, 'code') + \ && (a:linter_name is v:null || l:error.linter_name is# a:linter_name) + \ && l:error.lnum == a:line + let l:diff = abs(l:error.col - a:column) + + if l:nearest_error_diff == -1 || l:diff < l:nearest_error_diff + let l:nearest_error_diff = l:diff + let l:nearest_error = l:error + endif + endif + endfor + endif + + return l:nearest_error +endfunction + +function! s:OnReady( +\ line, +\ column, +\ end_line, +\ end_column, +\ MenuCallback, +\ linter, +\ lsp_details, +\) abort + let l:id = a:lsp_details.connection_id + + if !ale#lsp#HasCapability(l:id, 'code_actions') + return + endif + + let l:buffer = a:lsp_details.buffer + + if a:linter.lsp is# 'tsserver' + let l:nearest_error = + \ s:FindError(l:buffer, a:line, a:column, a:end_line, a:end_column, a:linter.lsp) + + if l:nearest_error isnot v:null + let l:message = ale#lsp#tsserver_message#GetCodeFixes( + \ l:buffer, + \ a:line, + \ a:column, + \ a:line, + \ a:column, + \ [l:nearest_error.code], + \) + else + let l:message = ale#lsp#tsserver_message#GetApplicableRefactors( + \ l:buffer, + \ a:line, + \ a:column, + \ a:end_line, + \ a:end_column, + \) + endif + else + " Send a message saying the buffer has changed first, otherwise + " completions won't know what text is nearby. + call ale#lsp#NotifyForChanges(l:id, l:buffer) + + let l:diagnostics = [] + let l:nearest_error = + \ s:FindError(l:buffer, a:line, a:column, a:end_line, a:end_column, v:null) + + if l:nearest_error isnot v:null + let l:diagnostics = [ + \ { + \ 'code': l:nearest_error.code, + \ 'message': l:nearest_error.text, + \ 'range': { + \ 'start': { + \ 'line': l:nearest_error.lnum - 1, + \ 'character': l:nearest_error.col - 1, + \ }, + \ 'end': { + \ 'line': get(l:nearest_error, 'end_lnum', 1) - 1, + \ 'character': get(l:nearest_error, 'end_col', 0) + \ }, + \ }, + \ }, + \] + endif + + let l:message = ale#lsp#message#CodeAction( + \ l:buffer, + \ a:line, + \ a:column, + \ a:end_line, + \ a:end_column, + \ l:diagnostics, + \) + endif + + let l:Callback = a:linter.lsp is# 'tsserver' + \ ? function('ale#codefix#HandleTSServerResponse') + \ : function('ale#codefix#HandleLSPResponse') + + call ale#lsp#RegisterCallback(l:id, l:Callback) + + let l:request_id = ale#lsp#Send(l:id, l:message) + + let s:codefix_map[l:request_id] = { + \ 'connection_id': l:id, + \ 'buffer': l:buffer, + \ 'line': a:line, + \ 'column': a:column, + \ 'end_line': a:end_line, + \ 'end_column': a:end_column, + \ 'menu_callback': a:MenuCallback, + \} +endfunction + +function! s:ExecuteGetCodeFix(linter, range, MenuCallback) abort + let l:buffer = bufnr('') + + if a:range == 0 + let [l:line, l:column] = getpos('.')[1:2] + let l:end_line = l:line + let l:end_column = l:column + + " Expand the range to cover the current word, if there is one. + let l:cword = expand('') + + if !empty(l:cword) + let l:search_pos = searchpos('\V' . l:cword, 'bn', l:line) + + if l:search_pos != [0, 0] + let l:column = l:search_pos[1] + let l:end_column = l:column + len(l:cword) - 1 + endif + endif + elseif mode() is# 'v' || mode() is# "\" + " You need to get the start and end in a different way when you're in + " visual mode. + let [l:line, l:column] = getpos('v')[1:2] + let [l:end_line, l:end_column] = getpos('.')[1:2] + else + let [l:line, l:column] = getpos("'<")[1:2] + let [l:end_line, l:end_column] = getpos("'>")[1:2] + endif + + let l:column = max([min([l:column, len(getline(l:line))]), 1]) + let l:end_column = min([l:end_column, len(getline(l:end_line))]) + + let l:Callback = function( + \ 's:OnReady', [l:line, l:column, l:end_line, l:end_column, a:MenuCallback] + \) + + call ale#lsp_linter#StartLSP(l:buffer, a:linter, l:Callback) +endfunction + +function! ale#codefix#Execute(range, ...) abort + if a:0 > 1 + throw 'Too many arguments' + endif + + let l:MenuCallback = get(a:000, 0, v:null) + let l:lsp_linters = [] + + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + call add(l:lsp_linters, l:linter) + endif + endfor + + if empty(l:lsp_linters) + if l:MenuCallback is v:null + call s:message('No active LSPs') + else + call l:MenuCallback({}, []) + endif + + return + endif + + for l:lsp_linter in l:lsp_linters + call s:ExecuteGetCodeFix(l:lsp_linter, a:range, l:MenuCallback) + endfor +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/command.vim b/dot_vim/plugged/ale/autoload/ale/command.vim new file mode 100644 index 0000000..c9dc8d9 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/command.vim @@ -0,0 +1,473 @@ +" Author: w0rp +" Description: Functions for formatting command strings, running commands, and +" managing files during linting and fixing cycles. + +" This dictionary holds lists of files and directories to remove later. +if !exists('s:buffer_data') + let s:buffer_data = {} +endif + +" The regular expression used for formatting filenames with modifiers. +let s:path_format_regex = '\v\%s(%(:h|:t|:r|:e)*)' + +" Used to get the data in tests. +function! ale#command#GetData() abort + return deepcopy(s:buffer_data) +endfunction + +function! ale#command#ClearData() abort + let s:buffer_data = {} +endfunction + +function! ale#command#InitData(buffer) abort + if !has_key(s:buffer_data, a:buffer) + let s:buffer_data[a:buffer] = { + \ 'jobs': {}, + \ 'file_list': [], + \ 'directory_list': [], + \} + endif +endfunction + +" Set the cwd for commands that are about to run. +" Used internally. +function! ale#command#SetCwd(buffer, cwd) abort + call ale#command#InitData(a:buffer) + let s:buffer_data[a:buffer].cwd = a:cwd +endfunction + +function! ale#command#ResetCwd(buffer) abort + if has_key(s:buffer_data, a:buffer) + let s:buffer_data[a:buffer].cwd = v:null + endif +endfunction + +function! ale#command#ManageFile(buffer, file) abort + call ale#command#InitData(a:buffer) + call add(s:buffer_data[a:buffer].file_list, a:file) +endfunction + +function! ale#command#ManageDirectory(buffer, directory) abort + call ale#command#InitData(a:buffer) + call add(s:buffer_data[a:buffer].directory_list, a:directory) +endfunction + +function! ale#command#CreateFile(buffer) abort + " This variable can be set to 1 in tests to stub this out. + if get(g:, 'ale_create_dummy_temporary_file') + return 'TEMP' + endif + + let l:temporary_file = ale#util#Tempname() + call ale#command#ManageFile(a:buffer, l:temporary_file) + + return l:temporary_file +endfunction + +" Create a new temporary directory and manage it in one go. +function! ale#command#CreateDirectory(buffer) abort + " This variable can be set to 1 in tests to stub this out. + if get(g:, 'ale_create_dummy_temporary_file') + return 'TEMP_DIR' + endif + + let l:temporary_directory = ale#util#Tempname() + " Create the temporary directory for the file, unreadable by 'other' + " users. + call mkdir(l:temporary_directory, '', 0750) + call ale#command#ManageDirectory(a:buffer, l:temporary_directory) + + return l:temporary_directory +endfunction + +function! ale#command#RemoveManagedFiles(buffer) abort + let l:info = get(s:buffer_data, a:buffer, {}) + + if !empty(l:info) && empty(l:info.jobs) + " We can't delete anything in a sandbox, so wait until we escape from + " it to delete temporary files and directories. + if ale#util#InSandbox() + return + endif + + " Delete files with a call akin to a plan `rm` command. + for l:filename in l:info.file_list + call delete(l:filename) + endfor + + " Delete directories like `rm -rf`. + " Directories are handled differently from files, so paths that are + " intended to be single files can be set up for automatic deletion + " without accidentally deleting entire directories. + for l:directory in l:info.directory_list + call delete(l:directory, 'rf') + endfor + + call remove(s:buffer_data, a:buffer) + endif +endfunction + +function! ale#command#CreateTempFile(buffer, temporary_file, input) abort + if empty(a:temporary_file) + " There is no file, so we didn't create anything. + return 0 + endif + + " Use an existing list of lines of input if we have it, or get the lines + " from the file. + let l:lines = a:input isnot v:null ? a:input : getbufline(a:buffer, 1, '$') + + let l:temporary_directory = fnamemodify(a:temporary_file, ':h') + " Create the temporary directory for the file, unreadable by 'other' + " users. + call mkdir(l:temporary_directory, '', 0750) + " Automatically delete the directory later. + call ale#command#ManageDirectory(a:buffer, l:temporary_directory) + " Write the buffer out to a file. + call ale#util#Writefile(a:buffer, l:lines, a:temporary_file) + + return 1 +endfunction + +function! s:TemporaryFilename(buffer) abort + let l:filename = fnamemodify(bufname(a:buffer), ':t') + + if empty(l:filename) + " If the buffer's filename is empty, create a dummy filename. + let l:ft = getbufvar(a:buffer, '&filetype') + let l:filename = 'file' . ale#filetypes#GuessExtension(l:ft) + endif + + " Create a temporary filename, / + " The file itself will not be created by this function. + return ale#util#Tempname() . (has('win32') ? '\' : '/') . l:filename +endfunction + +" Given part of a command, replace any % with %%, so that no characters in +" the string will be replaced with filenames, etc. +function! ale#command#EscapeCommandPart(command_part) abort + return substitute(a:command_part, '%', '%%', 'g') +endfunction + +" Format a filename, converting it with filename mappings, if non-empty, +" and escaping it for putting into a command string. +" +" The filename can be modified. +function! s:FormatFilename(filename, mappings, modifiers) abort + let l:filename = a:filename + + if !empty(a:mappings) + let l:filename = ale#filename_mapping#Map(l:filename, a:mappings) + endif + + if !empty(a:modifiers) + let l:filename = fnamemodify(l:filename, a:modifiers) + endif + + return ale#Escape(l:filename) +endfunction + +" Produce a command prefix to check to a particular directory for a command. +" %s format markers with filename-modifiers can be used as the directory, and +" will be returned verbatim for formatting in paths relative to files. +function! ale#command#CdString(directory) abort + let l:match = matchstrpos(a:directory, s:path_format_regex) + " Do not escape the directory here if it's a valid format string. + " This allows us to use sequences like %s:h, %s:h:h, etc. + let l:directory = l:match[1:] == [0, len(a:directory)] + \ ? a:directory + \ : ale#Escape(a:directory) + + if has('win32') + return 'cd /d ' . l:directory . ' && ' + endif + + return 'cd ' . l:directory . ' && ' +endfunction + +" Given a command string, replace every... +" %s -> with the current filename +" %t -> with the name of an unused file in a temporary directory +" %% -> with a literal % +function! ale#command#FormatCommand( +\ buffer, +\ executable, +\ command, +\ pipe_file_if_needed, +\ input, +\ cwd, +\ mappings, +\) abort + let l:temporary_file = '' + let l:command = a:command + + if !empty(a:cwd) + let l:command = ale#command#CdString(a:cwd) . l:command + endif + + " First replace all uses of %%, used for literal percent characters, + " with an ugly string. + let l:command = substitute(l:command, '%%', '<>', 'g') + + " Replace %e with the escaped executable, if available. + if !empty(a:executable) && l:command =~# '%e' + let l:command = substitute(l:command, '%e', '\=ale#Escape(a:executable)', 'g') + endif + + " Replace all %s occurrences in the string with the name of the current + " file. + if l:command =~# '%s' + let l:filename = fnamemodify(bufname(a:buffer), ':p') + let l:command = substitute( + \ l:command, + \ s:path_format_regex, + \ '\=s:FormatFilename(l:filename, a:mappings, submatch(1))', + \ 'g' + \) + endif + + if a:input isnot v:false && l:command =~# '%t' + " Create a temporary filename, / + " The file itself will not be created by this function. + let l:temporary_file = s:TemporaryFilename(a:buffer) + let l:command = substitute( + \ l:command, + \ '\v\%t(%(:h|:t|:r|:e)*)', + \ '\=s:FormatFilename(l:temporary_file, a:mappings, submatch(1))', + \ 'g' + \) + endif + + " Finish formatting so %% becomes %. + let l:command = substitute(l:command, '<>', '%', 'g') + + if a:pipe_file_if_needed && empty(l:temporary_file) + " If we are to send the Vim buffer to a command, we'll do it + " in the shell. We'll write out the file to a temporary file, + " and then read it back in, in the shell. + let l:temporary_file = s:TemporaryFilename(a:buffer) + let l:command = l:command . ' < ' . ale#Escape(l:temporary_file) + endif + + let l:file_created = ale#command#CreateTempFile( + \ a:buffer, + \ l:temporary_file, + \ a:input, + \) + + return [l:temporary_file, l:command, l:file_created] +endfunction + +function! ale#command#StopJobs(buffer, job_type) abort + let l:info = get(s:buffer_data, a:buffer, {}) + + if !empty(l:info) + let l:new_map = {} + + for [l:job_id, l:job_type] in items(l:info.jobs) + let l:job_id = str2nr(l:job_id) + + if a:job_type is# 'all' || a:job_type is# l:job_type + call ale#job#Stop(l:job_id) + else + let l:new_map[l:job_id] = l:job_type + endif + endfor + + let l:info.jobs = l:new_map + endif +endfunction + +function! s:GatherOutput(line_list, job_id, line) abort + call add(a:line_list, a:line) +endfunction + +function! s:ExitCallback(buffer, line_list, Callback, data) abort + if !has_key(s:buffer_data, a:buffer) + return + endif + + let l:jobs = s:buffer_data[a:buffer].jobs + + if !has_key(l:jobs, a:data.job_id) + return + endif + + let l:job_type = remove(l:jobs, a:data.job_id) + + if g:ale_history_enabled + call ale#history#SetExitCode(a:buffer, a:data.job_id, a:data.exit_code) + + " Log the output of the command for ALEInfo if we should. + if g:ale_history_log_output && a:data.log_output is 1 + call ale#history#RememberOutput( + \ a:buffer, + \ a:data.job_id, + \ a:line_list[:] + \) + endif + endif + + " If the callback starts any new jobs, use the same job type for them. + call setbufvar(a:buffer, 'ale_job_type', l:job_type) + let l:value = a:Callback(a:buffer, a:line_list, { + \ 'exit_code': a:data.exit_code, + \ 'temporary_file': a:data.temporary_file, + \}) + + let l:result = a:data.result + let l:result.value = l:value + + " Set the default cwd for this buffer in this call stack. + call ale#command#SetCwd(a:buffer, l:result.cwd) + + try + if get(l:result, 'result_callback', v:null) isnot v:null + call call(l:result.result_callback, [l:value]) + endif + finally + call ale#command#ResetCwd(a:buffer) + endtry +endfunction + +function! ale#command#Run(buffer, command, Callback, ...) abort + let l:options = get(a:000, 0, {}) + + if len(a:000) > 1 + throw 'Too many arguments!' + endif + + let l:output_stream = get(l:options, 'output_stream', 'stdout') + let l:line_list = [] + let l:cwd = get(l:options, 'cwd', v:null) + + if l:cwd is v:null + " Default the working directory to whatever it was for the last + " command run in the chain. + let l:cwd = get(get(s:buffer_data, a:buffer, {}), 'cwd', v:null) + endif + + let [l:temporary_file, l:command, l:file_created] = ale#command#FormatCommand( + \ a:buffer, + \ get(l:options, 'executable', ''), + \ a:command, + \ get(l:options, 'read_buffer', 0), + \ get(l:options, 'input', v:null), + \ l:cwd, + \ get(l:options, 'filename_mappings', []), + \) + let l:command = ale#job#PrepareCommand(a:buffer, l:command) + let l:job_options = { + \ 'exit_cb': {job_id, exit_code -> s:ExitCallback( + \ a:buffer, + \ l:line_list, + \ a:Callback, + \ { + \ 'job_id': job_id, + \ 'exit_code': exit_code, + \ 'temporary_file': l:temporary_file, + \ 'log_output': get(l:options, 'log_output', 1), + \ 'result': l:result, + \ } + \ )}, + \ 'mode': 'nl', + \} + + if l:output_stream is# 'stdout' + let l:job_options.out_cb = function('s:GatherOutput', [l:line_list]) + elseif l:output_stream is# 'stderr' + let l:job_options.err_cb = function('s:GatherOutput', [l:line_list]) + elseif l:output_stream is# 'both' + let l:job_options.out_cb = function('s:GatherOutput', [l:line_list]) + let l:job_options.err_cb = function('s:GatherOutput', [l:line_list]) + endif + + let l:status = 'failed' + + if get(g:, 'ale_run_synchronously') == 1 + if get(g:, 'ale_emulate_job_failure') == 1 + let l:job_id = 0 + else + " Generate a fake job ID for tests. + let s:fake_job_id = get(s:, 'fake_job_id', 0) + 1 + let l:job_id = s:fake_job_id + endif + elseif has('win32') + let l:job_id = ale#job#StartWithCmd(l:command, l:job_options) + else + let l:job_id = ale#job#Start(l:command, l:job_options) + endif + + if l:job_id + let l:status = 'started' + let l:job_type = getbufvar(a:buffer, 'ale_job_type', 'all') + + call ale#command#InitData(a:buffer) + let s:buffer_data[a:buffer].jobs[l:job_id] = l:job_type + endif + + if g:ale_history_enabled + call ale#history#Add(a:buffer, l:status, l:job_id, l:command) + endif + + if !l:job_id + return 0 + endif + + " We'll return this Dictionary. A `result_callback` can be assigned to it + " later for capturing the result of a:Callback. + " + " The `_deferred_job_id` is used for both checking the type of object, and + " for checking the job ID and status. + " + " The cwd is kept and used as the default value for the next command in + " the chain. + " + " The original command here is used in tests. + let l:result = { + \ '_deferred_job_id': l:job_id, + \ 'executable': get(l:options, 'executable', ''), + \ 'cwd': l:cwd, + \ 'command': a:command, + \} + + if get(g:, 'ale_run_synchronously') == 1 && l:job_id + if !exists('g:ale_run_synchronously_callbacks') + let g:ale_run_synchronously_callbacks = [] + endif + + if get(g:, 'ale_run_synchronously_emulate_commands', 0) + call add( + \ g:ale_run_synchronously_callbacks, + \ {exit_code, output -> [ + \ extend(l:line_list, output), + \ l:job_options.exit_cb(l:job_id, exit_code), + \ ]} + \) + else + " Run a command synchronously if this test option is set. + call extend(l:line_list, systemlist( + \ type(l:command) is v:t_list + \ ? join(l:command[0:1]) . ' ' . ale#Escape(l:command[2]) + \ : l:command + \)) + + " Don't capture output when the callbacks aren't set. + if !has_key(l:job_options, 'out_cb') + \&& !has_key(l:job_options, 'err_cb') + let l:line_list = [] + endif + + call add( + \ g:ale_run_synchronously_callbacks, + \ {-> l:job_options.exit_cb(l:job_id, v:shell_error)} + \) + endif + endif + + return l:result +endfunction + +function! ale#command#IsDeferred(value) abort + return type(a:value) is v:t_dict && has_key(a:value, '_deferred_job_id') +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/completion.vim b/dot_vim/plugged/ale/autoload/ale/completion.vim new file mode 100644 index 0000000..c05ca53 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/completion.vim @@ -0,0 +1,1070 @@ +" Author: w0rp +" Description: Completion support for LSP linters +scriptencoding utf-8 + +" The omnicompletion menu is shown through a special Plug mapping which is +" only valid in Insert mode. This way, feedkeys() won't send these keys if you +" quit Insert mode quickly enough. +inoremap (ale_show_completion_menu) +" If we hit the key sequence in normal mode, then we won't show the menu, so +" we should restore the old settings right away. +nnoremap (ale_show_completion_menu) :call ale#completion#RestoreCompletionOptions() +cnoremap (ale_show_completion_menu) +vnoremap (ale_show_completion_menu) +onoremap (ale_show_completion_menu) + +let g:ale_completion_delay = get(g:, 'ale_completion_delay', 100) +let g:ale_completion_excluded_words = get(g:, 'ale_completion_excluded_words', []) +let g:ale_completion_max_suggestions = get(g:, 'ale_completion_max_suggestions', 50) +let g:ale_completion_autoimport = get(g:, 'ale_completion_autoimport', 1) +let g:ale_completion_tsserver_remove_warnings = get(g:, 'ale_completion_tsserver_remove_warnings', 0) + +let s:timer_id = -1 +let s:last_done_pos = [] + +" CompletionItemKind values from the LSP protocol. +let g:ale_lsp_types = { +\ 1: 'text', +\ 2: 'method', +\ 3: 'function', +\ 4: 'constructor', +\ 5: 'field', +\ 6: 'variable', +\ 7: 'class', +\ 8: 'interface', +\ 9: 'module', +\ 10: 'property', +\ 11: 'unit', +\ 12: 'value', +\ 13: 'enum', +\ 14: 'keyword', +\ 15: 'snippet', +\ 16: 'color', +\ 17: 'file', +\ 18: 'reference', +\ 19: 'folder', +\ 20: 'enum_member', +\ 21: 'constant', +\ 22: 'struct', +\ 23: 'event', +\ 24: 'operator', +\ 25: 'type_parameter', +\ } + +" from https://github.com/microsoft/TypeScript/blob/29becf05012bfa7ba20d50b0d16813971e46b8a6/lib/protocol.d.ts#L2472 +let g:ale_tsserver_types = { +\ 'warning': 'text', +\ 'keyword': 'keyword', +\ 'script': 'file', +\ 'module': 'module', +\ 'class': 'class', +\ 'local class': 'class', +\ 'interface': 'interface', +\ 'type': 'class', +\ 'enum': 'enum', +\ 'enum member': 'enum_member', +\ 'var': 'variable', +\ 'local var': 'variable', +\ 'function': 'function', +\ 'local function': 'function', +\ 'method': 'method', +\ 'getter': 'property', +\ 'setter': 'method', +\ 'property': 'property', +\ 'constructor': 'constructor', +\ 'call': 'method', +\ 'index': 'index', +\ 'construct': 'constructor', +\ 'parameter': 'parameter', +\ 'type parameter': 'type_parameter', +\ 'primitive type': 'unit', +\ 'label': 'text', +\ 'alias': 'class', +\ 'const': 'constant', +\ 'let': 'variable', +\ 'directory': 'folder', +\ 'external module name': 'text', +\ 'JSX attribute': 'parameter', +\ 'string': 'text' +\ } + +" For compatibility reasons, we only use built in VIM completion kinds +" See :help complete-items for Vim completion kinds +let g:ale_completion_symbols = get(g:, 'ale_completion_symbols', { +\ 'text': 'v', +\ 'method': 'f', +\ 'function': 'f', +\ 'constructor': 'f', +\ 'field': 'm', +\ 'variable': 'v', +\ 'class': 't', +\ 'interface': 't', +\ 'module': 'd', +\ 'property': 'm', +\ 'unit': 'v', +\ 'value': 'v', +\ 'enum': 't', +\ 'keyword': 'v', +\ 'snippet': 'v', +\ 'color': 'v', +\ 'file': 'v', +\ 'reference': 'v', +\ 'folder': 'v', +\ 'enum_member': 'm', +\ 'constant': 'm', +\ 'struct': 't', +\ 'event': 'v', +\ 'operator': 'f', +\ 'type_parameter': 'p', +\ '': 'v' +\ }) + +let s:LSP_INSERT_TEXT_FORMAT_PLAIN = 1 +let s:LSP_INSERT_TEXT_FORMAT_SNIPPET = 2 + +let s:lisp_regex = '\v[a-zA-Z_\-][a-zA-Z_\-0-9]*$' + +" Regular expressions for checking the characters in the line before where +" the insert cursor is. If one of these matches, we'll check for completions. +let s:should_complete_map = { +\ '': '\v[a-zA-Z$_][a-zA-Z$_0-9]*$|\.$', +\ 'clojure': s:lisp_regex, +\ 'lisp': s:lisp_regex, +\ 'racket': '\k\+$', +\ 'typescript': '\v[a-zA-Z$_][a-zA-Z$_0-9]*$|\.$|''$|"$', +\ 'rust': '\v[a-zA-Z$_][a-zA-Z$_0-9]*$|\.$|::$', +\ 'cpp': '\v[a-zA-Z$_][a-zA-Z$_0-9]*$|\.$|::$|-\>$', +\ 'c': '\v[a-zA-Z$_][a-zA-Z$_0-9]*$|\.$|-\>$', +\} + +" Regular expressions for finding the start column to replace with completion. +let s:omni_start_map = { +\ '': '\v[a-zA-Z$_][a-zA-Z$_0-9]*$', +\ 'racket': '\k\+$', +\} + +" A map of exact characters for triggering LSP completions. Do not forget to +" update self.input_patterns in ale.py in updating entries in this map. +let s:trigger_character_map = { +\ '': ['.'], +\ 'typescript': ['.', '''', '"'], +\ 'rust': ['.', '::'], +\ 'cpp': ['.', '::', '->'], +\ 'c': ['.', '->'], +\} + +function! s:GetFiletypeValue(map, filetype) abort + for l:part in reverse(split(a:filetype, '\.')) + let l:regex = get(a:map, l:part, []) + + if !empty(l:regex) + return l:regex + endif + endfor + + " Use the default regex for other files. + return a:map[''] +endfunction + +" Check if we should look for completions for a language. +function! ale#completion#GetPrefix(filetype, line, column) abort + let l:regex = s:GetFiletypeValue(s:should_complete_map, a:filetype) + + " The column we're using completions for is where we are inserting text, + " like so: + " abc + " ^ + " So we need check the text in the column before that position. + return matchstr(getline(a:line)[: a:column - 2], l:regex) +endfunction + +function! ale#completion#GetTriggerCharacter(filetype, prefix) abort + if empty(a:prefix) + return '' + endif + + let l:char_list = s:GetFiletypeValue(s:trigger_character_map, a:filetype) + + if index(l:char_list, a:prefix) >= 0 + return a:prefix + endif + + return '' +endfunction + +function! ale#completion#Filter( +\ buffer, +\ filetype, +\ suggestions, +\ prefix, +\ exact_prefix_match, +\) abort + let l:excluded_words = ale#Var(a:buffer, 'completion_excluded_words') + + if empty(a:prefix) + let l:filtered_suggestions = a:suggestions + else + let l:triggers = s:GetFiletypeValue(s:trigger_character_map, a:filetype) + + " For completing... + " foo. + " ^ + " We need to include all of the given suggestions. + if index(l:triggers, a:prefix) >= 0 || empty(a:prefix) + let l:filtered_suggestions = a:suggestions + else + let l:filtered_suggestions = [] + + " Filter suggestions down to those starting with the prefix we + " used for finding suggestions in the first place. + " + " Some completion tools will include suggestions which don't even + " start with the characters we have already typed. + for l:item in a:suggestions + " A List of String values or a List of completion item + " Dictionaries is accepted here. + let l:word = type(l:item) is v:t_string ? l:item : l:item.word + + if a:exact_prefix_match + " Add suggestions if the word is an exact match. + if l:word is# a:prefix + call add(l:filtered_suggestions, l:item) + endif + else + " Add suggestions if the suggestion starts with a + " case-insensitive match for the prefix. + if l:word[: len(a:prefix) - 1] is? a:prefix + call add(l:filtered_suggestions, l:item) + endif + endif + endfor + endif + endif + + if !empty(l:excluded_words) + " Copy the List if needed. We don't want to modify the argument. + " We shouldn't make a copy if we don't need to. + if l:filtered_suggestions is a:suggestions + let l:filtered_suggestions = copy(a:suggestions) + endif + + " Remove suggestions with words in the exclusion List. + call filter( + \ l:filtered_suggestions, + \ 'index(l:excluded_words, type(v:val) is v:t_string ? v:val : v:val.word) < 0', + \) + endif + + return l:filtered_suggestions +endfunction + +function! s:ReplaceCompletionOptions(source) abort + " Remember the old omnifunc value, if there is one. + " If we don't store an old one, we'll just never reset the option. + " This will stop some random exceptions from appearing. + if !exists('b:ale_old_omnifunc') && !empty(&l:omnifunc) + let b:ale_old_omnifunc = &l:omnifunc + endif + + let &l:omnifunc = 'ale#completion#AutomaticOmniFunc' + + if a:source is# 'ale-automatic' + if !exists('b:ale_old_completeopt') + let b:ale_old_completeopt = &l:completeopt + endif + + let l:opt_list = split(&l:completeopt, ',') + " The menu and noinsert options must be set, or automatic completion + " will be annoying. + let l:new_opt_list = ['menu', 'menuone', 'noinsert'] + + " Permit some other completion options, provided users have set them. + for l:opt in ['preview', 'popup', 'noselect'] + if index(l:opt_list, l:opt) >= 0 + call add(l:new_opt_list, l:opt) + endif + endfor + + let &l:completeopt = join(l:new_opt_list, ',') + endif +endfunction + +function! ale#completion#RestoreCompletionOptions() abort + " Reset settings when completion is done. + if exists('b:ale_old_omnifunc') + if b:ale_old_omnifunc isnot# 'pythoncomplete#Complete' + let &l:omnifunc = b:ale_old_omnifunc + endif + + unlet b:ale_old_omnifunc + endif + + if exists('b:ale_old_completeopt') + let &l:completeopt = b:ale_old_completeopt + unlet b:ale_old_completeopt + endif +endfunction + +function! ale#completion#GetCompletionPosition() abort + if !exists('b:ale_completion_info') + return 0 + endif + + let l:line = b:ale_completion_info.line + let l:column = b:ale_completion_info.column + let l:regex = s:GetFiletypeValue(s:omni_start_map, &filetype) + let l:up_to_column = getline(l:line)[: l:column - 2] + let l:match = matchstr(l:up_to_column, l:regex) + + return l:column - len(l:match) - 1 +endfunction + +function! ale#completion#GetCompletionPositionForDeoplete(input) abort + return match(a:input, '\k*$') +endfunction + +function! ale#completion#GetCompletionResult() abort + if exists('b:ale_completion_result') + return b:ale_completion_result + endif + + return v:null +endfunction + +function! ale#completion#AutomaticOmniFunc(findstart, base) abort + if a:findstart + return ale#completion#GetCompletionPosition() + else + let l:result = ale#completion#GetCompletionResult() + + let l:source = get(get(b:, 'ale_completion_info', {}), 'source', '') + + if l:source is# 'ale-automatic' || l:source is# 'ale-manual' + call s:ReplaceCompletionOptions(l:source) + endif + + return l:result isnot v:null ? l:result : [] + endif +endfunction + +function! s:OpenCompletionMenu(...) abort + if !&l:paste + call ale#util#FeedKeys("\(ale_show_completion_menu)") + endif +endfunction + +function! ale#completion#Show(result) abort + let l:source = get(get(b:, 'ale_completion_info', {}), 'source', '') + + if ale#util#Mode() isnot# 'i' && l:source isnot# 'ale-import' + return + endif + + " Set the list in the buffer. + let b:ale_completion_result = a:result + + " Don't try to open the completion menu if there's nothing to show. + if empty(b:ale_completion_result) + if l:source is# 'ale-import' + " If we ran completion from :ALEImport, + " tell the user that nothing is going to happen. + call s:message('No possible imports found.') + endif + + return + endif + + " Replace completion options shortly before opening the menu. + if l:source is# 'ale-automatic' || l:source is# 'ale-manual' + call s:ReplaceCompletionOptions(l:source) + + call timer_start(0, function('s:OpenCompletionMenu')) + endif + + if l:source is# 'ale-callback' + call b:CompleteCallback(b:ale_completion_result) + endif + + if l:source is# 'ale-import' + call ale#completion#HandleUserData(b:ale_completion_result[0]) + + let l:text_changed = '' . g:ale_lint_on_text_changed + + " Check the buffer again right away, if linting is enabled. + if g:ale_enabled + \&& ( + \ l:text_changed is# '1' + \ || l:text_changed is# 'always' + \ || l:text_changed is# 'normal' + \ || l:text_changed is# 'insert' + \) + call ale#Queue(0, '') + endif + endif +endfunction + +function! ale#completion#GetAllTriggers() abort + return deepcopy(s:trigger_character_map) +endfunction + +function! ale#completion#GetCompletionKind(kind) abort + let l:lsp_symbol = get(g:ale_lsp_types, a:kind, '') + + if !empty(l:lsp_symbol) + return l:lsp_symbol + endif + + return get(g:ale_tsserver_types, a:kind, '') +endfunction + +function! ale#completion#GetCompletionSymbols(kind) abort + let l:kind = ale#completion#GetCompletionKind(a:kind) + let l:symbol = get(g:ale_completion_symbols, l:kind, '') + + if !empty(l:symbol) + return l:symbol + endif + + return get(g:ale_completion_symbols, '', 'v') +endfunction + +function! s:CompletionStillValid(request_id) abort + let [l:line, l:column] = getpos('.')[1:2] + + return has_key(b:, 'ale_completion_info') + \&& ( + \ ale#util#Mode() is# 'i' + \ || b:ale_completion_info.source is# 'ale-import' + \) + \&& b:ale_completion_info.request_id == a:request_id + \&& b:ale_completion_info.line == l:line + \&& ( + \ b:ale_completion_info.column == l:column + \ || b:ale_completion_info.source is# 'ale-omnifunc' + \ || b:ale_completion_info.source is# 'ale-callback' + \ || b:ale_completion_info.source is# 'ale-import' + \) +endfunction + +function! ale#completion#ParseTSServerCompletions(response) abort + let l:names = [] + + for l:suggestion in a:response.body + let l:kind = get(l:suggestion, 'kind', '') + + if g:ale_completion_tsserver_remove_warnings == 0 || l:kind isnot# 'warning' + call add(l:names, { + \ 'word': l:suggestion.name, + \ 'source': get(l:suggestion, 'source', ''), + \}) + endif + endfor + + return l:names +endfunction + +function! ale#completion#ParseTSServerCompletionEntryDetails(response) abort + let l:buffer = bufnr('') + let l:results = [] + let l:names_with_details = [] + let l:info = get(b:, 'ale_completion_info', {}) + + for l:suggestion in a:response.body + let l:displayParts = [] + let l:local_name = v:null + + for l:action in get(l:suggestion, 'codeActions', []) + call add(l:displayParts, l:action.description . ' ') + endfor + + for l:part in l:suggestion.displayParts + " Stop on stop on line breaks for the menu. + if get(l:part, 'kind') is# 'lineBreak' + break + endif + + if get(l:part, 'kind') is# 'localName' + let l:local_name = l:part.text + endif + + call add(l:displayParts, l:part.text) + endfor + + " Each one of these parts has 'kind' properties + let l:documentationParts = [] + + for l:part in get(l:suggestion, 'documentation', []) + call add(l:documentationParts, l:part.text) + endfor + + " See :help complete-items + let l:result = { + \ 'word': ( + \ l:suggestion.name is# 'default' + \ && l:suggestion.kind is# 'alias' + \ && !empty(l:local_name) + \ ? l:local_name + \ : l:suggestion.name + \ ), + \ 'kind': ale#completion#GetCompletionSymbols(l:suggestion.kind), + \ 'icase': 1, + \ 'menu': join(l:displayParts, ''), + \ 'dup': get(l:info, 'additional_edits_only', 0) + \ || g:ale_completion_autoimport, + \ 'info': join(l:documentationParts, ''), + \} + " This flag is used to tell if this completion came from ALE or not. + let l:user_data = {'_ale_completion_item': 1} + + if has_key(l:suggestion, 'codeActions') + let l:user_data.code_actions = l:suggestion.codeActions + endif + + let l:result.user_data = json_encode(l:user_data) + + " Include this item if we'll accept any items, + " or if we only want items with additional edits, and this has them. + if !get(l:info, 'additional_edits_only', 0) + \|| has_key(l:user_data, 'code_actions') + call add(l:results, l:result) + endif + endfor + + let l:names = getbufvar(l:buffer, 'ale_tsserver_completion_names', []) + + if !empty(l:names) && len(l:names) != len(l:results) + let l:names_with_details = map(copy(l:results), 'v:val.word') + let l:missing_names = filter( + \ copy(l:names), + \ 'index(l:names_with_details, v:val.word) < 0', + \) + + for l:name in l:missing_names + call add(l:results, { + \ 'word': l:name.word, + \ 'kind': 'v', + \ 'icase': 1, + \ 'menu': '', + \ 'info': '', + \ 'user_data': json_encode({'_ale_completion_item': 1}), + \}) + endfor + endif + + return l:results +endfunction + +function! ale#completion#NullFilter(buffer, item) abort + return 1 +endfunction + +function! ale#completion#ParseLSPCompletions(response) abort + let l:buffer = bufnr('') + let l:info = get(b:, 'ale_completion_info', {}) + let l:Filter = get(l:info, 'completion_filter', v:null) + + if l:Filter is v:null + let l:Filter = function('ale#completion#NullFilter') + else + let l:Filter = ale#util#GetFunction(l:Filter) + endif + + let l:item_list = [] + + if type(get(a:response, 'result')) is v:t_list + let l:item_list = a:response.result + elseif type(get(a:response, 'result')) is v:t_dict + \&& type(get(a:response.result, 'items')) is v:t_list + let l:item_list = a:response.result.items + endif + + let l:results = [] + + for l:item in l:item_list + if !call(l:Filter, [l:buffer, l:item]) + continue + endif + + if get(l:item, 'insertTextFormat', s:LSP_INSERT_TEXT_FORMAT_PLAIN) is s:LSP_INSERT_TEXT_FORMAT_PLAIN + \&& type(get(l:item, 'textEdit')) is v:t_dict + let l:text = l:item.textEdit.newText + elseif type(get(l:item, 'insertText')) is v:t_string + let l:text = l:item.insertText + else + let l:text = l:item.label + endif + + let l:word = matchstr(l:text, '\v^[^(]+') + + if empty(l:word) + continue + endif + + " Don't use LSP items with additional text edits when autoimport for + " completions is turned off. + if !empty(get(l:item, 'additionalTextEdits')) + \&& !( + \ get(l:info, 'additional_edits_only', 0) + \ || g:ale_completion_autoimport + \) + continue + endif + + let l:doc = get(l:item, 'documentation', '') + + if type(l:doc) is v:t_dict && has_key(l:doc, 'value') + let l:doc = l:doc.value + endif + + " Collapse whitespaces and line breaks into a single space. + let l:detail = substitute(get(l:item, 'detail', ''), '\_s\+', ' ', 'g') + + let l:result = { + \ 'word': l:word, + \ 'kind': ale#completion#GetCompletionSymbols(get(l:item, 'kind', '')), + \ 'icase': 1, + \ 'menu': l:detail, + \ 'dup': get(l:info, 'additional_edits_only', 0) + \ || g:ale_completion_autoimport, + \ 'info': (type(l:doc) is v:t_string ? l:doc : ''), + \} + " This flag is used to tell if this completion came from ALE or not. + let l:user_data = {'_ale_completion_item': 1} + + if has_key(l:item, 'additionalTextEdits') + \ && l:item.additionalTextEdits isnot v:null + let l:text_changes = [] + + for l:edit in l:item.additionalTextEdits + call add(l:text_changes, { + \ 'start': { + \ 'line': l:edit.range.start.line + 1, + \ 'offset': l:edit.range.start.character + 1, + \ }, + \ 'end': { + \ 'line': l:edit.range.end.line + 1, + \ 'offset': l:edit.range.end.character + 1, + \ }, + \ 'newText': l:edit.newText, + \}) + endfor + + if !empty(l:text_changes) + let l:user_data.code_actions = [{ + \ 'description': 'completion', + \ 'changes': [ + \ { + \ 'fileName': expand('#' . l:buffer . ':p'), + \ 'textChanges': l:text_changes, + \ }, + \ ], + \}] + endif + endif + + let l:result.user_data = json_encode(l:user_data) + + " Include this item if we'll accept any items, + " or if we only want items with additional edits, and this has them. + if !get(l:info, 'additional_edits_only', 0) + \|| has_key(l:user_data, 'code_actions') + call add(l:results, l:result) + endif + endfor + + if has_key(l:info, 'prefix') + let l:results = ale#completion#Filter( + \ l:buffer, + \ &filetype, + \ l:results, + \ l:info.prefix, + \ get(l:info, 'additional_edits_only', 0), + \) + endif + + return l:results[: g:ale_completion_max_suggestions - 1] +endfunction + +function! ale#completion#HandleTSServerResponse(conn_id, response) abort + if !s:CompletionStillValid(get(a:response, 'request_seq')) + return + endif + + if !has_key(a:response, 'body') + return + endif + + let l:buffer = bufnr('') + let l:command = get(a:response, 'command', '') + + if l:command is# 'completions' + let l:names = ale#completion#Filter( + \ l:buffer, + \ &filetype, + \ ale#completion#ParseTSServerCompletions(a:response), + \ b:ale_completion_info.prefix, + \ get(b:ale_completion_info, 'additional_edits_only', 0), + \)[: g:ale_completion_max_suggestions - 1] + + " We need to remember some names for tsserver, as it doesn't send + " details back for everything we send. + call setbufvar(l:buffer, 'ale_tsserver_completion_names', l:names) + + if empty(l:names) + " Response with no results now and skip making a redundant request + " for nothing. + call ale#completion#Show([]) + else + let l:identifiers = [] + + for l:name in l:names + let l:identifier = { + \ 'name': l:name.word, + \} + let l:source = get(l:name, 'source', '') + + " Empty source results in no details for the completed item + if !empty(l:source) + call extend(l:identifier, { 'source': l:source }) + endif + + call add(l:identifiers, l:identifier) + endfor + + let b:ale_completion_info.request_id = ale#lsp#Send( + \ b:ale_completion_info.conn_id, + \ ale#lsp#tsserver_message#CompletionEntryDetails( + \ l:buffer, + \ b:ale_completion_info.line, + \ b:ale_completion_info.column, + \ l:identifiers, + \ ), + \) + endif + elseif l:command is# 'completionEntryDetails' + call ale#completion#Show( + \ ale#completion#ParseTSServerCompletionEntryDetails(a:response), + \) + endif +endfunction + + +function! ale#completion#HandleLSPResponse(conn_id, response) abort + if !s:CompletionStillValid(get(a:response, 'id')) + return + endif + + call ale#completion#Show( + \ ale#completion#ParseLSPCompletions(a:response), + \) +endfunction + +function! s:OnReady(linter, lsp_details) abort + let l:id = a:lsp_details.connection_id + + if !ale#lsp#HasCapability(l:id, 'completion') + return + endif + + let l:buffer = a:lsp_details.buffer + + " If we have sent a completion request already, don't send another. + if b:ale_completion_info.request_id + return + endif + + let l:Callback = a:linter.lsp is# 'tsserver' + \ ? function('ale#completion#HandleTSServerResponse') + \ : function('ale#completion#HandleLSPResponse') + call ale#lsp#RegisterCallback(l:id, l:Callback) + + if a:linter.lsp is# 'tsserver' + if get(g:, 'ale_completion_tsserver_autoimport') is 1 + " no-custom-checks + echom '`g:ale_completion_tsserver_autoimport` is deprecated. Use `g:ale_completion_autoimport` instead.' + endif + + let l:message = ale#lsp#tsserver_message#Completions( + \ l:buffer, + \ b:ale_completion_info.line, + \ b:ale_completion_info.column, + \ b:ale_completion_info.prefix, + \ get(b:ale_completion_info, 'additional_edits_only', 0) + \ || g:ale_completion_autoimport, + \) + else + " Send a message saying the buffer has changed first, otherwise + " completions won't know what text is nearby. + call ale#lsp#NotifyForChanges(l:id, l:buffer) + + " For LSP completions, we need to clamp the column to the length of + " the line. python-language-server and perhaps others do not implement + " this correctly. + let l:message = ale#lsp#message#Completion( + \ l:buffer, + \ b:ale_completion_info.line, + \ b:ale_completion_info.column, + \ ale#completion#GetTriggerCharacter(&filetype, b:ale_completion_info.prefix), + \) + endif + + let l:request_id = ale#lsp#Send(l:id, l:message) + + if l:request_id + let b:ale_completion_info.conn_id = l:id + let b:ale_completion_info.request_id = l:request_id + + if has_key(a:linter, 'completion_filter') + let b:ale_completion_info.completion_filter = a:linter.completion_filter + endif + endif +endfunction + +" This function can be called to check if ALE can provide completion data for +" the current buffer. 1 will be returned if there's a potential source of +" completion data ALE can use, and 0 will be returned otherwise. +function! ale#completion#CanProvideCompletions() abort + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + return 1 + endif + endfor + + return 0 +endfunction + +" This function can be used to manually trigger autocomplete, even when +" g:ale_completion_enabled is set to false +function! ale#completion#GetCompletions(...) abort + let l:source = get(a:000, 0, '') + let l:options = get(a:000, 1, {}) + + if len(a:000) > 2 + throw 'Too many arguments!' + endif + + let l:CompleteCallback = get(l:options, 'callback', v:null) + + if l:CompleteCallback isnot v:null + let b:CompleteCallback = l:CompleteCallback + endif + + if has_key(l:options, 'line') && has_key(l:options, 'column') + " Use a provided line and column, if given. + let l:line = l:options.line + let l:column = l:options.column + else + let [l:line, l:column] = getpos('.')[1:2] + endif + + if has_key(l:options, 'prefix') + let l:prefix = l:options.prefix + else + let l:prefix = ale#completion#GetPrefix(&filetype, l:line, l:column) + endif + + if l:source is# 'ale-automatic' && empty(l:prefix) + return 0 + endif + + let l:line_length = len(getline('.')) + + let b:ale_completion_info = { + \ 'line': l:line, + \ 'line_length': l:line_length, + \ 'column': l:column, + \ 'prefix': l:prefix, + \ 'conn_id': 0, + \ 'request_id': 0, + \ 'source': l:source, + \} + unlet! b:ale_completion_result + + if has_key(l:options, 'additional_edits_only') + let b:ale_completion_info.additional_edits_only = + \ l:options.additional_edits_only + endif + + let l:buffer = bufnr('') + let l:Callback = function('s:OnReady') + + let l:started = 0 + + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + if ale#lsp_linter#StartLSP(l:buffer, l:linter, l:Callback) + let l:started = 1 + endif + endif + endfor + + return l:started +endfunction + +function! s:message(message) abort + call ale#util#Execute('echom ' . string(a:message)) +endfunction + +" This function implements the :ALEImport command. +function! ale#completion#Import() abort + let l:word = expand('') + + if empty(l:word) + call s:message('Nothing to complete at cursor!') + + return + endif + + let [l:line, l:column] = getpos('.')[1:2] + let l:column = searchpos('\V' . escape(l:word, '/\'), 'bnc', l:line)[1] + let l:column = l:column + len(l:word) - 1 + + if l:column isnot 0 + let l:started = ale#completion#GetCompletions('ale-import', { + \ 'line': l:line, + \ 'column': l:column, + \ 'prefix': l:word, + \ 'additional_edits_only': 1, + \}) + + if !l:started + call s:message('No completion providers are available.') + endif + endif +endfunction + +function! ale#completion#OmniFunc(findstart, base) abort + if a:findstart + let l:started = ale#completion#GetCompletions('ale-omnifunc') + + if !l:started + " This is the special value for cancelling completions silently. + " See :help complete-functions + return -3 + endif + + return ale#completion#GetCompletionPosition() + else + let l:result = ale#completion#GetCompletionResult() + + while l:result is v:null && !complete_check() + sleep 2ms + let l:result = ale#completion#GetCompletionResult() + endwhile + + return l:result isnot v:null ? l:result : [] + endif +endfunction + +function! s:TimerHandler(...) abort + if !get(b:, 'ale_completion_enabled', g:ale_completion_enabled) + return + endif + + let s:timer_id = -1 + + let [l:line, l:column] = getpos('.')[1:2] + + " When running the timer callback, we have to be sure that the cursor + " hasn't moved from where it was when we requested completions by typing. + if s:timer_pos == [l:line, l:column] && ale#util#Mode() is# 'i' + call ale#completion#GetCompletions('ale-automatic') + endif +endfunction + +" Stop any completion timer that is queued. This is useful for tests. +function! ale#completion#StopTimer() abort + if s:timer_id != -1 + call timer_stop(s:timer_id) + endif + + let s:timer_id = -1 +endfunction + +function! ale#completion#Queue() abort + if !get(b:, 'ale_completion_enabled', g:ale_completion_enabled) + return + endif + + let s:timer_pos = getpos('.')[1:2] + + if s:timer_pos == s:last_done_pos + " Do not ask for completions if the cursor rests on the position we + " last completed on. + return + endif + + " If we changed the text again while we're still waiting for a response, + " then invalidate the requests before the timer ticks again. + if exists('b:ale_completion_info') + let b:ale_completion_info.request_id = 0 + endif + + call ale#completion#StopTimer() + + let s:timer_id = timer_start(g:ale_completion_delay, function('s:TimerHandler')) +endfunction + +function! ale#completion#HandleUserData(completed_item) abort + let l:user_data_json = get(a:completed_item, 'user_data', '') + let l:user_data = type(l:user_data_json) is v:t_dict + \ ? l:user_data_json + \ : ale#util#FuzzyJSONDecode(l:user_data_json, {}) + + if !has_key(l:user_data, '_ale_completion_item') + return + endif + + let l:source = get(get(b:, 'ale_completion_info', {}), 'source', '') + + if l:source is# 'ale-automatic' + \|| l:source is# 'ale-manual' + \|| l:source is# 'ale-callback' + \|| l:source is# 'ale-import' + \|| l:source is# 'ale-omnifunc' + for l:code_action in get(l:user_data, 'code_actions', []) + call ale#code_action#HandleCodeAction(l:code_action, {}) + endfor + endif + + silent doautocmd User ALECompletePost +endfunction + +function! ale#completion#Done() abort + silent! pclose + + call ale#completion#RestoreCompletionOptions() + + let s:last_done_pos = getpos('.')[1:2] +endfunction + +augroup ALECompletionActions + autocmd! + + autocmd CompleteDone * call ale#completion#HandleUserData(v:completed_item) +augroup END + +function! s:Setup(enabled) abort + augroup ALECompletionGroup + autocmd! + + if a:enabled + autocmd TextChangedI * call ale#completion#Queue() + autocmd CompleteDone * call ale#completion#Done() + endif + augroup END + + if !a:enabled + augroup! ALECompletionGroup + endif +endfunction + +function! ale#completion#Enable() abort + let g:ale_completion_enabled = 1 + call s:Setup(1) +endfunction + +function! ale#completion#Disable() abort + let g:ale_completion_enabled = 0 + call s:Setup(0) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/completion/python.vim b/dot_vim/plugged/ale/autoload/ale/completion/python.vim new file mode 100644 index 0000000..6b65c5b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/completion/python.vim @@ -0,0 +1,3 @@ +function! ale#completion#python#CompletionItemFilter(buffer, item) abort + return a:item.label !~# '\v^__[a-z_]+__' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/cursor.vim b/dot_vim/plugged/ale/autoload/ale/cursor.vim new file mode 100644 index 0000000..c83bbcb --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/cursor.vim @@ -0,0 +1,189 @@ +scriptencoding utf-8 +" Author: w0rp +" Author: João Paulo S. de Souza +" Description: Echoes lint message for the current line, if any + +" Controls the milliseconds delay before echoing a message. +let g:ale_echo_delay = get(g:, 'ale_echo_delay', 10) +" A string format for the echoed message. +let g:ale_echo_msg_format = get(g:, 'ale_echo_msg_format', '%code: %%s') + +let s:cursor_timer = -1 + +" A wrapper for echon so we can test messages we echo in Vader tests. +function! ale#cursor#Echom(message) abort + " no-custom-checks + exec "norm! :echom a:message\n" +endfunction + +function! ale#cursor#TruncatedEcho(original_message) abort + let l:message = a:original_message + " Change tabs to spaces. + let l:message = substitute(l:message, "\t", ' ', 'g') + " Remove any newlines in the message. + let l:message = substitute(l:message, "\n", '', 'g') + " Convert indentation groups into single spaces for better legibility when + " put on a single line + let l:message = substitute(l:message, ' \+', ' ', 'g') + + " We need to remember the setting for shortmess and reset it again. + let l:shortmess_options = &l:shortmess + + try + let l:cursor_position = getpos('.') + + " The message is truncated and saved to the history. + silent! setlocal shortmess+=T + + try + call ale#cursor#Echom(l:message) + catch /^Vim\%((\a\+)\)\=:E523/ + " Fallback into manual truncate (#1987) + let l:winwidth = winwidth(0) + + if l:winwidth < strdisplaywidth(l:message) + " Truncate message longer than window width with trailing '...' + let l:message = l:message[:l:winwidth - 4] . '...' + endif + + exec 'echomsg l:message' + catch /E481/ + " Do nothing if running from a visual selection. + endtry + + " Reset the cursor position if we moved off the end of the line. + " Using :norm and :echomsg can move the cursor off the end of the + " line. + if l:cursor_position != getpos('.') + call setpos('.', l:cursor_position) + endif + finally + let &l:shortmess = l:shortmess_options + endtry +endfunction + +function! s:StopCursorTimer() abort + if s:cursor_timer != -1 + call timer_stop(s:cursor_timer) + let s:cursor_timer = -1 + endif +endfunction + +function! ale#cursor#EchoCursorWarning(...) abort + let l:buffer = bufnr('') + + if !g:ale_echo_cursor && !g:ale_cursor_detail + return + endif + + " Only echo the warnings in normal mode, otherwise we will get problems. + if mode(1) isnot# 'n' + return + endif + + if ale#ShouldDoNothing(l:buffer) + return + endif + + let [l:info, l:loc] = ale#util#FindItemAtCursor(l:buffer) + + if g:ale_echo_cursor + if !empty(l:loc) + let l:format = ale#Var(l:buffer, 'echo_msg_format') + let l:msg = ale#GetLocItemMessage(l:loc, l:format) + call ale#cursor#TruncatedEcho(l:msg) + let l:info.echoed = 1 + elseif get(l:info, 'echoed') + " We'll only clear the echoed message when moving off errors once, + " so we don't continually clear the echo line. + " + " no-custom-checks + echo + let l:info.echoed = 0 + endif + endif + + if g:ale_cursor_detail + if !empty(l:loc) + call s:ShowCursorDetailForItem(l:loc, {'stay_here': 1}) + else + call ale#preview#CloseIfTypeMatches('ale-preview') + endif + endif +endfunction + +function! ale#cursor#EchoCursorWarningWithDelay() abort + let l:buffer = bufnr('') + + if !g:ale_echo_cursor && !g:ale_cursor_detail + return + endif + + " Only echo the warnings in normal mode, otherwise we will get problems. + if mode(1) isnot# 'n' + return + endif + + call s:StopCursorTimer() + + let l:pos = getpos('.')[0:2] + + if !exists('w:last_pos') + let w:last_pos = [0, 0, 0] + endif + + " Check the current buffer, line, and column number against the last + " recorded position. If the position has actually changed, *then* + " we should echo something. Otherwise we can end up doing processing + " the echo message far too frequently. + if l:pos != w:last_pos + let l:delay = ale#Var(l:buffer, 'echo_delay') + + let w:last_pos = l:pos + let s:cursor_timer = timer_start( + \ l:delay, + \ function('ale#cursor#EchoCursorWarning') + \) + endif +endfunction + +function! s:ShowCursorDetailForItem(loc, options) abort + let l:stay_here = get(a:options, 'stay_here', 0) + + let s:last_detailed_line = line('.') + let l:message = get(a:loc, 'detail', a:loc.text) + let l:lines = split(l:message, "\n") + + if g:ale_floating_preview || g:ale_detail_to_floating_preview + call ale#floating_preview#Show(l:lines) + else + call ale#preview#Show(l:lines, {'stay_here': l:stay_here}) + + " Clear the echo message if we manually displayed details. + if !l:stay_here + " no-custom-checks + echo + endif + endif +endfunction + +function! ale#cursor#ShowCursorDetail() abort + let l:buffer = bufnr('') + + " Only echo the warnings in normal mode, otherwise we will get problems. + if mode() isnot# 'n' + return + endif + + if ale#ShouldDoNothing(l:buffer) + return + endif + + call s:StopCursorTimer() + + let [l:info, l:loc] = ale#util#FindItemAtCursor(l:buffer) + + if !empty(l:loc) + call s:ShowCursorDetailForItem(l:loc, {'stay_here': 0}) + endif +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/d.vim b/dot_vim/plugged/ale/autoload/ale/d.vim new file mode 100644 index 0000000..0e23220 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/d.vim @@ -0,0 +1,16 @@ +" Author: Auri +" Description: Functions for integrating with D linters. + +function! ale#d#FindDUBConfig(buffer) abort + " Find a DUB configuration file in ancestor paths. + " The most DUB-specific names will be tried first. + for l:possible_filename in ['dub.sdl', 'dub.json', 'package.json'] + let l:dub_file = ale#path#FindNearestFile(a:buffer, l:possible_filename) + + if !empty(l:dub_file) + return l:dub_file + endif + endfor + + return '' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/debugging.vim b/dot_vim/plugged/ale/autoload/ale/debugging.vim new file mode 100644 index 0000000..31f3078 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/debugging.vim @@ -0,0 +1,276 @@ +" Author: w0rp +" Description: This file implements debugging information for ALE + +let s:global_variable_list = [ +\ 'ale_cache_executable_check_failures', +\ 'ale_change_sign_column_color', +\ 'ale_command_wrapper', +\ 'ale_completion_delay', +\ 'ale_completion_enabled', +\ 'ale_completion_max_suggestions', +\ 'ale_disable_lsp', +\ 'ale_echo_cursor', +\ 'ale_echo_msg_error_str', +\ 'ale_echo_msg_format', +\ 'ale_echo_msg_info_str', +\ 'ale_echo_msg_warning_str', +\ 'ale_enabled', +\ 'ale_fix_on_save', +\ 'ale_fixers', +\ 'ale_history_enabled', +\ 'ale_history_log_output', +\ 'ale_keep_list_window_open', +\ 'ale_lint_delay', +\ 'ale_lint_on_enter', +\ 'ale_lint_on_filetype_changed', +\ 'ale_lint_on_insert_leave', +\ 'ale_lint_on_save', +\ 'ale_lint_on_text_changed', +\ 'ale_linter_aliases', +\ 'ale_linters', +\ 'ale_linters_explicit', +\ 'ale_linters_ignore', +\ 'ale_list_vertical', +\ 'ale_list_window_size', +\ 'ale_loclist_msg_format', +\ 'ale_max_buffer_history_size', +\ 'ale_max_signs', +\ 'ale_maximum_file_size', +\ 'ale_open_list', +\ 'ale_pattern_options', +\ 'ale_pattern_options_enabled', +\ 'ale_root', +\ 'ale_set_balloons', +\ 'ale_set_highlights', +\ 'ale_set_loclist', +\ 'ale_set_quickfix', +\ 'ale_set_signs', +\ 'ale_sign_column_always', +\ 'ale_sign_error', +\ 'ale_sign_info', +\ 'ale_sign_offset', +\ 'ale_sign_style_error', +\ 'ale_sign_style_warning', +\ 'ale_sign_warning', +\ 'ale_sign_highlight_linenrs', +\ 'ale_statusline_format', +\ 'ale_type_map', +\ 'ale_use_global_executables', +\ 'ale_virtualtext_cursor', +\ 'ale_warn_about_trailing_blank_lines', +\ 'ale_warn_about_trailing_whitespace', +\] + +function! s:Echo(message) abort + " no-custom-checks + echo a:message +endfunction + +function! s:GetLinterVariables(filetype, exclude_linter_names) abort + let l:variable_list = [] + let l:filetype_parts = split(a:filetype, '\.') + + for l:key in keys(g:) + " Extract variable names like: 'ale_python_flake8_executable' + let l:match = matchlist(l:key, '\v^ale_([^_]+)_([^_]+)_.+$') + + " Include matching variables. + if !empty(l:match) + \&& index(l:filetype_parts, l:match[1]) >= 0 + \&& index(a:exclude_linter_names, l:match[2]) == -1 + call add(l:variable_list, l:key) + endif + endfor + + call sort(l:variable_list) + + return l:variable_list +endfunction + +function! s:EchoLinterVariables(variable_list) abort + for l:key in a:variable_list + call s:Echo('let g:' . l:key . ' = ' . string(g:[l:key])) + + if has_key(b:, l:key) + call s:Echo('let b:' . l:key . ' = ' . string(b:[l:key])) + endif + endfor +endfunction + +function! s:EchoGlobalVariables() abort + for l:key in s:global_variable_list + call s:Echo('let g:' . l:key . ' = ' . string(get(g:, l:key, v:null))) + + if has_key(b:, l:key) + call s:Echo('let b:' . l:key . ' = ' . string(b:[l:key])) + endif + endfor +endfunction + +" Echo a command that was run. +function! s:EchoCommand(item) abort + let l:status_message = a:item.status + + " Include the exit code in output if we have it. + if a:item.status is# 'finished' + let l:status_message .= ' - exit code ' . a:item.exit_code + endif + + call s:Echo('(' . l:status_message . ') ' . string(a:item.command)) + + if g:ale_history_log_output && has_key(a:item, 'output') + if empty(a:item.output) + call s:Echo('') + call s:Echo('<<>>') + call s:Echo('') + else + call s:Echo('') + call s:Echo('<<>>') + + for l:line in a:item.output + call s:Echo(l:line) + endfor + + call s:Echo('<<>>') + call s:Echo('') + endif + endif +endfunction + +" Echo the results of an executable check. +function! s:EchoExecutable(item) abort + call s:Echo(printf( + \ '(executable check - %s) %s', + \ a:item.status ? 'success' : 'failure', + \ a:item.command, + \)) +endfunction + +function! s:EchoCommandHistory() abort + let l:buffer = bufnr('%') + + for l:item in ale#history#Get(l:buffer) + if l:item.job_id is# 'executable' + call s:EchoExecutable(l:item) + else + call s:EchoCommand(l:item) + endif + endfor +endfunction + +function! s:EchoLinterAliases(all_linters) abort + let l:first = 1 + + for l:linter in a:all_linters + if !empty(l:linter.aliases) + if l:first + call s:Echo(' Linter Aliases:') + endif + + let l:first = 0 + + call s:Echo(string(l:linter.name) . ' -> ' . string(l:linter.aliases)) + endif + endfor +endfunction + +function! s:EchoLSPErrorMessages(all_linter_names) abort + let l:lsp_error_messages = get(g:, 'ale_lsp_error_messages', {}) + let l:header_echoed = 0 + + for l:linter_name in a:all_linter_names + let l:error_list = get(l:lsp_error_messages, l:linter_name, []) + + if !empty(l:error_list) + if !l:header_echoed + call s:Echo(' LSP Error Messages:') + call s:Echo('') + endif + + call s:Echo('(Errors for ' . l:linter_name . ')') + + for l:message in l:error_list + for l:line in split(l:message, "\n") + call s:Echo(l:line) + endfor + endfor + endif + endfor +endfunction + +function! ale#debugging#Info() abort + let l:buffer = bufnr('') + let l:filetype = &filetype + + " We get the list of enabled linters for free by the above function. + let l:enabled_linters = deepcopy(ale#linter#Get(l:filetype)) + + " But have to build the list of available linters ourselves. + let l:all_linters = [] + let l:linter_variable_list = [] + + for l:part in split(l:filetype, '\.') + let l:aliased_filetype = ale#linter#ResolveFiletype(l:part) + call extend(l:all_linters, ale#linter#GetAll(l:aliased_filetype)) + endfor + + let l:all_names = map(copy(l:all_linters), 'v:val[''name'']') + let l:enabled_names = map(copy(l:enabled_linters), 'v:val[''name'']') + let l:exclude_names = filter(copy(l:all_names), 'index(l:enabled_names, v:val) == -1') + + " Load linter variables to display + " This must be done after linters are loaded. + let l:variable_list = s:GetLinterVariables(l:filetype, l:exclude_names) + + let l:fixers = ale#fix#registry#SuggestedFixers(l:filetype) + let l:fixers = uniq(sort(l:fixers[0] + l:fixers[1])) + let l:fixers_string = join(map(copy(l:fixers), '"\n " . v:val'), '') + + let l:non_ignored_names = map( + \ copy(ale#linter#RemoveIgnored(l:buffer, l:filetype, l:enabled_linters)), + \ 'v:val[''name'']', + \) + let l:ignored_names = filter( + \ copy(l:enabled_names), + \ 'index(l:non_ignored_names, v:val) < 0' + \) + + call s:Echo(' Current Filetype: ' . l:filetype) + call s:Echo('Available Linters: ' . string(l:all_names)) + call s:EchoLinterAliases(l:all_linters) + call s:Echo(' Enabled Linters: ' . string(l:enabled_names)) + call s:Echo(' Ignored Linters: ' . string(l:ignored_names)) + call s:Echo(' Suggested Fixers: ' . l:fixers_string) + call s:Echo(' Linter Variables:') + call s:Echo('') + call s:EchoLinterVariables(l:variable_list) + call s:Echo(' Global Variables:') + call s:Echo('') + call s:EchoGlobalVariables() + call s:EchoLSPErrorMessages(l:all_names) + call s:Echo(' Command History:') + call s:Echo('') + call s:EchoCommandHistory() +endfunction + +function! ale#debugging#InfoToClipboard() abort + if !has('clipboard') + call s:Echo('clipboard not available. Try :ALEInfoToFile instead.') + + return + endif + + let l:output = execute('call ale#debugging#Info()') + + let @+ = l:output + call s:Echo('ALEInfo copied to your clipboard') +endfunction + +function! ale#debugging#InfoToFile(filename) abort + let l:expanded_filename = expand(a:filename) + + let l:output = execute('call ale#debugging#Info()') + + call writefile(split(l:output, "\n"), l:expanded_filename) + call s:Echo('ALEInfo written to ' . l:expanded_filename) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/definition.vim b/dot_vim/plugged/ale/autoload/ale/definition.vim new file mode 100644 index 0000000..fd6cd2e --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/definition.vim @@ -0,0 +1,224 @@ +" Author: w0rp +" Description: Go to definition support for LSP linters. + +let s:go_to_definition_map = {} + +" Enable automatic updates of the tagstack +let g:ale_update_tagstack = get(g:, 'ale_update_tagstack', 1) +let g:ale_default_navigation = get(g:, 'ale_default_navigation', 'buffer') + +" Used to get the definition map in tests. +function! ale#definition#GetMap() abort + return deepcopy(s:go_to_definition_map) +endfunction + +" Used to set the definition map in tests. +function! ale#definition#SetMap(map) abort + let s:go_to_definition_map = a:map +endfunction + +function! ale#definition#ClearLSPData() abort + let s:go_to_definition_map = {} +endfunction + +function! ale#definition#UpdateTagStack() abort + let l:should_update_tagstack = exists('*gettagstack') && exists('*settagstack') && g:ale_update_tagstack + + if l:should_update_tagstack + " Grab the old location (to jump back to) and the word under the + " cursor (as a label for the tagstack) + let l:old_location = [bufnr('%'), line('.'), col('.'), 0] + let l:tagname = expand('') + let l:winid = win_getid() + call settagstack(l:winid, {'items': [{'from': l:old_location, 'tagname': l:tagname}]}, 'a') + call settagstack(l:winid, {'curidx': len(gettagstack(l:winid)['items']) + 1}) + endif +endfunction + +function! ale#definition#HandleTSServerResponse(conn_id, response) abort + if has_key(a:response, 'request_seq') + \&& has_key(s:go_to_definition_map, a:response.request_seq) + let l:options = remove(s:go_to_definition_map, a:response.request_seq) + + if get(a:response, 'success', v:false) is v:true && !empty(a:response.body) + let l:filename = a:response.body[0].file + let l:line = a:response.body[0].start.line + let l:column = a:response.body[0].start.offset + + call ale#definition#UpdateTagStack() + call ale#util#Open(l:filename, l:line, l:column, l:options) + endif + endif +endfunction + +function! ale#definition#HandleLSPResponse(conn_id, response) abort + if has_key(a:response, 'id') + \&& has_key(s:go_to_definition_map, a:response.id) + let l:options = remove(s:go_to_definition_map, a:response.id) + + " The result can be a Dictionary item, a List of the same, or null. + let l:result = get(a:response, 'result', v:null) + + if type(l:result) is v:t_dict + let l:result = [l:result] + elseif type(l:result) isnot v:t_list + let l:result = [] + endif + + for l:item in l:result + if has_key(l:item, 'targetUri') + " LocationLink items use targetUri + let l:uri = l:item.targetUri + let l:line = l:item.targetRange.start.line + 1 + let l:column = l:item.targetRange.start.character + 1 + else + " LocationLink items use uri + let l:uri = l:item.uri + let l:line = l:item.range.start.line + 1 + let l:column = l:item.range.start.character + 1 + endif + + call ale#definition#UpdateTagStack() + + let l:uri_handler = ale#uri#GetURIHandler(l:uri) + + if l:uri_handler is# v:null + let l:filename = ale#path#FromFileURI(l:uri) + call ale#util#Open(l:filename, l:line, l:column, l:options) + else + call l:uri_handler.OpenURILink(l:uri, l:line, l:column, l:options, a:conn_id) + endif + + break + endfor + endif +endfunction + +function! s:OnReady(line, column, options, capability, linter, lsp_details) abort + let l:id = a:lsp_details.connection_id + + if !ale#lsp#HasCapability(l:id, a:capability) + return + endif + + let l:buffer = a:lsp_details.buffer + + let l:Callback = a:linter.lsp is# 'tsserver' + \ ? function('ale#definition#HandleTSServerResponse') + \ : function('ale#definition#HandleLSPResponse') + call ale#lsp#RegisterCallback(l:id, l:Callback) + + if a:linter.lsp is# 'tsserver' + if a:capability is# 'definition' + let l:message = ale#lsp#tsserver_message#Definition( + \ l:buffer, + \ a:line, + \ a:column + \) + elseif a:capability is# 'typeDefinition' + let l:message = ale#lsp#tsserver_message#TypeDefinition( + \ l:buffer, + \ a:line, + \ a:column + \) + elseif a:capability is# 'implementation' + let l:message = ale#lsp#tsserver_message#Implementation( + \ l:buffer, + \ a:line, + \ a:column + \) + endif + else + " Send a message saying the buffer has changed first, or the + " definition position probably won't make sense. + call ale#lsp#NotifyForChanges(l:id, l:buffer) + + " For LSP completions, we need to clamp the column to the length of + " the line. python-language-server and perhaps others do not implement + " this correctly. + if a:capability is# 'definition' + let l:message = ale#lsp#message#Definition(l:buffer, a:line, a:column) + elseif a:capability is# 'typeDefinition' + let l:message = ale#lsp#message#TypeDefinition(l:buffer, a:line, a:column) + elseif a:capability is# 'implementation' + let l:message = ale#lsp#message#Implementation(l:buffer, a:line, a:column) + else + " XXX: log here? + return + endif + endif + + let l:request_id = ale#lsp#Send(l:id, l:message) + + let s:go_to_definition_map[l:request_id] = { + \ 'open_in': get(a:options, 'open_in', 'current-buffer'), + \} +endfunction + +function! s:GoToLSPDefinition(linter, options, capability) abort + let l:buffer = bufnr('') + let [l:line, l:column] = getpos('.')[1:2] + let l:column = min([l:column, len(getline(l:line))]) + + let l:Callback = function( + \ 's:OnReady', + \ [l:line, l:column, a:options, a:capability] + \) + call ale#lsp_linter#StartLSP(l:buffer, a:linter, l:Callback) +endfunction + +function! ale#definition#GoTo(options) abort + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + call s:GoToLSPDefinition(l:linter, a:options, 'definition') + endif + endfor +endfunction + +function! ale#definition#GoToType(options) abort + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + call s:GoToLSPDefinition(l:linter, a:options, 'typeDefinition') + endif + endfor +endfunction + +function! ale#definition#GoToImpl(options) abort + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + call s:GoToLSPDefinition(l:linter, a:options, 'implementation') + endif + endfor +endfunction + +function! ale#definition#GoToCommandHandler(command, ...) abort + let l:options = {} + + if len(a:000) > 0 + for l:option in a:000 + if l:option is? '-tab' + let l:options.open_in = 'tab' + elseif l:option is? '-split' + let l:options.open_in = 'split' + elseif l:option is? '-vsplit' + let l:options.open_in = 'vsplit' + endif + endfor + endif + + if !has_key(l:options, 'open_in') + let l:default_navigation = ale#Var(bufnr(''), 'default_navigation') + + if index(['tab', 'split', 'vsplit'], l:default_navigation) >= 0 + let l:options.open_in = l:default_navigation + endif + endif + + if a:command is# 'type' + call ale#definition#GoToType(l:options) + elseif a:command is# 'implementation' + call ale#definition#GoToImpl(l:options) + else + call ale#definition#GoTo(l:options) + endif +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/dhall.vim b/dot_vim/plugged/ale/autoload/ale/dhall.vim new file mode 100644 index 0000000..cc54418 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/dhall.vim @@ -0,0 +1,24 @@ +" Author: Pat Brisbin , toastal +" Description: Functions for working with Dhall’s executable + +call ale#Set('dhall_executable', 'dhall') +call ale#Set('dhall_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('dhall_options', '') + +function! ale#dhall#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'dhall_executable') + + " Dhall is written in Haskell and commonly installed with Stack + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'dhall') +endfunction + +function! ale#dhall#GetExecutableWithOptions(buffer) abort + let l:executable = ale#dhall#GetExecutable(a:buffer) + + return l:executable + \ . ale#Pad(ale#Var(a:buffer, 'dhall_options')) +endfunction + +function! ale#dhall#GetCommand(buffer) abort + return '%e ' . ale#Pad(ale#Var(a:buffer, 'dhall_options')) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/engine.vim b/dot_vim/plugged/ale/autoload/ale/engine.vim new file mode 100644 index 0000000..150bbc8 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/engine.vim @@ -0,0 +1,738 @@ +" Author: w0rp +" Description: Backend execution and job management +" Executes linters in the background, using NeoVim or Vim 8 jobs + +" Remapping of linter problems. +let g:ale_type_map = get(g:, 'ale_type_map', {}) +let g:ale_filename_mappings = get(g:, 'ale_filename_mappings', {}) + +if !has_key(s:, 'executable_cache_map') + let s:executable_cache_map = {} +endif + +function! ale#engine#CleanupEveryBuffer() abort + for l:key in keys(g:ale_buffer_info) + " The key could be a filename or a buffer number, so try and + " convert it to a number. We need a number for the other + " functions. + let l:buffer = str2nr(l:key) + + if l:buffer > 0 + " Stop all jobs and clear the results for everything, and delete + " all of the data we stored for the buffer. + call ale#engine#Cleanup(l:buffer) + endif + endfor +endfunction + +function! ale#engine#MarkLinterActive(info, linter) abort + let l:found = 0 + + for l:other_linter in a:info.active_linter_list + if l:other_linter.name is# a:linter.name + let l:found = 1 + break + endif + endfor + + if !l:found + call add(a:info.active_linter_list, a:linter) + endif +endfunction + +function! ale#engine#MarkLinterInactive(info, linter_name) abort + call filter(a:info.active_linter_list, 'v:val.name isnot# a:linter_name') +endfunction + +function! ale#engine#ResetExecutableCache() abort + let s:executable_cache_map = {} +endfunction + +" Check if files are executable, and if they are, remember that they are +" for subsequent calls. We'll keep checking until programs can be executed. +function! ale#engine#IsExecutable(buffer, executable) abort + if empty(a:executable) + " Don't log the executable check if the executable string is empty. + return 0 + endif + + " Check for a cached executable() check. + let l:result = get(s:executable_cache_map, a:executable, v:null) + + if l:result isnot v:null + return l:result + endif + + " Check if the file is executable, and convert -1 to 1. + let l:result = executable(a:executable) isnot 0 + + " Cache the executable check if we found it, or if the option to cache + " failing checks is on. + if l:result || get(g:, 'ale_cache_executable_check_failures', 0) + let s:executable_cache_map[a:executable] = l:result + endif + + if g:ale_history_enabled + call ale#history#Add(a:buffer, l:result, 'executable', a:executable) + endif + + return l:result +endfunction + +function! ale#engine#InitBufferInfo(buffer) abort + if !has_key(g:ale_buffer_info, a:buffer) + " active_linter_list will hold the list of active linter names + " loclist holds the loclist items after all jobs have completed. + let g:ale_buffer_info[a:buffer] = { + \ 'active_linter_list': [], + \ 'active_other_sources_list': [], + \ 'loclist': [], + \} + + return 1 + endif + + return 0 +endfunction + +" This function is documented and part of the public API. +" +" Return 1 if ALE is busy checking a given buffer +function! ale#engine#IsCheckingBuffer(buffer) abort + let l:info = get(g:ale_buffer_info, a:buffer, {}) + + return !empty(get(l:info, 'active_linter_list', [])) + \ || !empty(get(l:info, 'active_other_sources_list', [])) +endfunction + +function! ale#engine#HandleLoclist(linter_name, buffer, loclist, from_other_source) abort + let l:info = get(g:ale_buffer_info, a:buffer, {}) + + if empty(l:info) + return + endif + + if !a:from_other_source + " Remove this linter from the list of active linters. + " This may have already been done when the job exits. + call filter(l:info.active_linter_list, 'v:val.name isnot# a:linter_name') + endif + + " Make some adjustments to the loclists to fix common problems, and also + " to set default values for loclist items. + let l:linter_loclist = ale#engine#FixLocList( + \ a:buffer, + \ a:linter_name, + \ a:from_other_source, + \ a:loclist, + \) + + " Remove previous items for this linter. + call filter(l:info.loclist, 'v:val.linter_name isnot# a:linter_name') + + " We don't need to add items or sort the list when this list is empty. + if !empty(l:linter_loclist) + " Add the new items. + call extend(l:info.loclist, l:linter_loclist) + + " Sort the loclist again. + " We need a sorted list so we can run a binary search against it + " for efficient lookup of the messages in the cursor handler. + call sort(l:info.loclist, 'ale#util#LocItemCompare') + endif + + if ale#ShouldDoNothing(a:buffer) + return + endif + + call ale#engine#SetResults(a:buffer, l:info.loclist) +endfunction + +function! s:HandleExit(job_info, buffer, output, data) abort + let l:buffer_info = get(g:ale_buffer_info, a:buffer) + + if empty(l:buffer_info) + return + endif + + let l:linter = a:job_info.linter + let l:executable = a:job_info.executable + + " Remove this job from the list. + call ale#engine#MarkLinterInactive(l:buffer_info, l:linter.name) + + " Stop here if we land in the handle for a job completing if we're in + " a sandbox. + if ale#util#InSandbox() + return + endif + + if has('nvim') && !empty(a:output) && empty(a:output[-1]) + call remove(a:output, -1) + endif + + try + let l:loclist = ale#util#GetFunction(l:linter.callback)(a:buffer, a:output) + " Handle the function being unknown, or being deleted. + catch /E700/ + let l:loclist = [] + endtry + + call ale#engine#HandleLoclist(l:linter.name, a:buffer, l:loclist, 0) +endfunction + +function! ale#engine#SetResults(buffer, loclist) abort + let l:linting_is_done = !ale#engine#IsCheckingBuffer(a:buffer) + + " Set signs first. This could potentially fix some line numbers. + " The List could be sorted again here by SetSigns. + if g:ale_set_signs + call ale#sign#SetSigns(a:buffer, a:loclist) + endif + + if g:ale_set_quickfix || g:ale_set_loclist + call ale#list#SetLists(a:buffer, a:loclist) + endif + + if exists('*ale#statusline#Update') + " Don't load/run if not already loaded. + call ale#statusline#Update(a:buffer, a:loclist) + endif + + if g:ale_set_highlights + call ale#highlight#SetHighlights(a:buffer, a:loclist) + endif + + if g:ale_virtualtext_cursor is# 'all' || g:ale_virtualtext_cursor == 2 + call ale#virtualtext#SetTexts(a:buffer, a:loclist) + endif + + if l:linting_is_done + if g:ale_echo_cursor + " Try and echo the warning now. + " This will only do something meaningful if we're in normal mode. + call ale#cursor#EchoCursorWarning() + endif + + if g:ale_virtualtext_cursor is# 'current' || g:ale_virtualtext_cursor == 1 + " Try and show the warning now. + " This will only do something meaningful if we're in normal mode. + call ale#virtualtext#ShowCursorWarning() + endif + + " Reset the save event marker, used for opening windows, etc. + call setbufvar(a:buffer, 'ale_save_event_fired', 0) + " Set a marker showing how many times a buffer has been checked. + call setbufvar( + \ a:buffer, + \ 'ale_linted', + \ getbufvar(a:buffer, 'ale_linted', 0) + 1 + \) + + " Automatically remove all managed temporary files and directories + " now that all jobs have completed. + call ale#command#RemoveManagedFiles(a:buffer) + + " Call user autocommands. This allows users to hook into ALE's lint cycle. + silent doautocmd User ALELintPost + endif +endfunction + +function! s:RemapItemTypes(type_map, loclist) abort + for l:item in a:loclist + let l:key = l:item.type + \ . (get(l:item, 'sub_type', '') is# 'style' ? 'S' : '') + let l:new_key = get(a:type_map, l:key, '') + + if l:new_key is# 'E' + \|| l:new_key is# 'ES' + \|| l:new_key is# 'W' + \|| l:new_key is# 'WS' + \|| l:new_key is# 'I' + let l:item.type = l:new_key[0] + + if l:new_key is# 'ES' || l:new_key is# 'WS' + let l:item.sub_type = 'style' + elseif has_key(l:item, 'sub_type') + call remove(l:item, 'sub_type') + endif + endif + endfor +endfunction + +function! ale#engine#FixLocList(buffer, linter_name, from_other_source, loclist) abort + let l:mappings = ale#GetFilenameMappings(a:buffer, a:linter_name) + + if !empty(l:mappings) + " We need to apply reverse filename mapping here. + let l:mappings = ale#filename_mapping#Invert(l:mappings) + endif + + let l:bufnr_map = {} + let l:new_loclist = [] + + " Some errors have line numbers beyond the end of the file, + " so we need to adjust them so they set the error at the last line + " of the file instead. + let l:last_line_number = ale#util#GetLineCount(a:buffer) + + for l:old_item in a:loclist + " Copy the loclist item with some default values and corrections. + " + " line and column numbers will be converted to numbers. + " The buffer will default to the buffer being checked. + " The vcol setting will default to 0, a byte index. + " The error type will default to 'E' for errors. + " The error number will default to -1. + " + " The line number and text are the only required keys. + " + " The linter_name will be set on the errors so it can be used in + " output, filtering, etc.. + let l:item = { + \ 'bufnr': a:buffer, + \ 'text': l:old_item.text, + \ 'lnum': str2nr(l:old_item.lnum), + \ 'col': str2nr(get(l:old_item, 'col', 0)), + \ 'vcol': 0, + \ 'type': get(l:old_item, 'type', 'E'), + \ 'nr': get(l:old_item, 'nr', -1), + \ 'linter_name': a:linter_name, + \} + + if a:from_other_source + let l:item.from_other_source = 1 + endif + + if has_key(l:old_item, 'code') + let l:item.code = l:old_item.code + endif + + let l:old_name = get(l:old_item, 'filename', '') + + " Map parsed from output to local filesystem files. + if !empty(l:old_name) && !empty(l:mappings) + let l:old_name = ale#filename_mapping#Map(l:old_name, l:mappings) + endif + + if !empty(l:old_name) && !ale#path#IsTempName(l:old_name) + " Use the filename given. + " Temporary files are assumed to be for this buffer, + " and the filename is not included then, because it looks bad + " in the loclist window. + let l:filename = l:old_name + let l:item.filename = l:filename + + if has_key(l:old_item, 'bufnr') + " If a buffer number is also given, include that too. + " If Vim detects that he buffer number is valid, it will + " be used instead of the filename. + let l:item.bufnr = l:old_item.bufnr + elseif has_key(l:bufnr_map, l:filename) + " Get the buffer number from the map, which can be faster. + let l:item.bufnr = l:bufnr_map[l:filename] + else + " Look up the buffer number. + let l:item.bufnr = bufnr(l:filename) + let l:bufnr_map[l:filename] = l:item.bufnr + endif + elseif has_key(l:old_item, 'bufnr') + let l:item.bufnr = l:old_item.bufnr + endif + + if has_key(l:old_item, 'detail') + let l:item.detail = l:old_item.detail + endif + + " Pass on a end_col key if set, used for highlights. + if has_key(l:old_item, 'end_col') + let l:item.end_col = str2nr(l:old_item.end_col) + endif + + if has_key(l:old_item, 'end_lnum') + let l:item.end_lnum = str2nr(l:old_item.end_lnum) + + " When the error ends after the end of the file, put it at the + " end. This is only done for the current buffer. + if l:item.bufnr == a:buffer && l:item.end_lnum > l:last_line_number + let l:item.end_lnum = l:last_line_number + endif + endif + + if has_key(l:old_item, 'sub_type') + let l:item.sub_type = l:old_item.sub_type + endif + + if l:item.lnum < 1 + " When errors appear before line 1, put them at line 1. + let l:item.lnum = 1 + elseif l:item.bufnr == a:buffer && l:item.lnum > l:last_line_number + " When errors go beyond the end of the file, put them at the end. + " This is only done for the current buffer. + let l:item.lnum = l:last_line_number + elseif get(l:old_item, 'vcol', 0) + " Convert virtual column positions to byte positions. + " The positions will be off if the buffer has changed recently. + let l:line = getbufline(a:buffer, l:item.lnum)[0] + + let l:item.col = ale#util#Col(l:line, l:item.col) + + if has_key(l:item, 'end_col') + let l:end_line = get(l:item, 'end_lnum', l:line) != l:line + \ ? getbufline(a:buffer, l:item.end_lnum)[0] + \ : l:line + + let l:item.end_col = ale#util#Col(l:end_line, l:item.end_col) + endif + endif + + call add(l:new_loclist, l:item) + endfor + + let l:type_map = get(ale#Var(a:buffer, 'type_map'), a:linter_name, {}) + + if !empty(l:type_map) + call s:RemapItemTypes(l:type_map, l:new_loclist) + endif + + return l:new_loclist +endfunction + +" Given part of a command, replace any % with %%, so that no characters in +" the string will be replaced with filenames, etc. +function! ale#engine#EscapeCommandPart(command_part) abort + " TODO: Emit deprecation warning here later. + return ale#command#EscapeCommandPart(a:command_part) +endfunction + +" Run a job. +" +" Returns 1 when a job was started successfully. +function! s:RunJob(command, options) abort + if ale#command#IsDeferred(a:command) + let a:command.result_callback = { + \ command -> s:RunJob(command, a:options) + \} + + return 1 + endif + + let l:command = a:command + + if empty(l:command) + return 0 + endif + + let l:cwd = a:options.cwd + let l:executable = a:options.executable + let l:buffer = a:options.buffer + let l:linter = a:options.linter + let l:output_stream = a:options.output_stream + let l:read_buffer = a:options.read_buffer && !a:options.lint_file + let l:info = g:ale_buffer_info[l:buffer] + + let l:Callback = function('s:HandleExit', [{ + \ 'linter': l:linter, + \ 'executable': l:executable, + \}]) + let l:result = ale#command#Run(l:buffer, l:command, l:Callback, { + \ 'cwd': l:cwd, + \ 'output_stream': l:output_stream, + \ 'executable': l:executable, + \ 'read_buffer': l:read_buffer, + \ 'log_output': 1, + \ 'filename_mappings': ale#GetFilenameMappings(l:buffer, l:linter.name), + \}) + + " Only proceed if the job is being run. + if empty(l:result) + return 0 + endif + + call ale#engine#MarkLinterActive(l:info, l:linter) + + silent doautocmd User ALEJobStarted + + return 1 +endfunction + +function! s:StopCurrentJobs(buffer, clear_lint_file_jobs, linter_slots) abort + let l:info = get(g:ale_buffer_info, a:buffer, {}) + call ale#command#StopJobs(a:buffer, 'linter') + + " Update the active linter list, clearing out anything not running. + if a:clear_lint_file_jobs + call ale#command#StopJobs(a:buffer, 'file_linter') + let l:info.active_linter_list = [] + else + let l:lint_file_map = {} + + " Use a previously computed map of `lint_file` values to find + " linters that are used for linting files. + for [l:lint_file, l:linter] in a:linter_slots + if l:lint_file is 1 + let l:lint_file_map[l:linter.name] = 1 + endif + endfor + + " Keep jobs for linting files when we're only linting buffers. + call filter(l:info.active_linter_list, 'get(l:lint_file_map, v:val.name)') + endif +endfunction + +function! ale#engine#Stop(buffer) abort + call s:StopCurrentJobs(a:buffer, 1, []) +endfunction + +function! s:RemoveProblemsForDisabledLinters(buffer, linters) abort + " Figure out which linters are still enabled, and remove + " problems for linters which are no longer enabled. + " Problems from other sources will be kept. + let l:name_map = {} + + for l:linter in a:linters + let l:name_map[l:linter.name] = 1 + endfor + + call filter( + \ get(g:ale_buffer_info[a:buffer], 'loclist', []), + \ 'get(v:val, ''from_other_source'') || get(l:name_map, get(v:val, ''linter_name''))', + \) +endfunction + +function! s:AddProblemsFromOtherBuffers(buffer, linters) abort + let l:filename = expand('#' . a:buffer . ':p') + let l:loclist = [] + let l:name_map = {} + + " Build a map of the active linters. + for l:linter in a:linters + let l:name_map[l:linter.name] = 1 + endfor + + " Find the items from other buffers, for the linters that are enabled. + for l:info in values(g:ale_buffer_info) + for l:item in l:info.loclist + if has_key(l:item, 'filename') + \&& l:item.filename is# l:filename + \&& has_key(l:name_map, l:item.linter_name) + " Copy the items and set the buffer numbers to this one. + let l:new_item = copy(l:item) + let l:new_item.bufnr = a:buffer + call add(l:loclist, l:new_item) + endif + endfor + endfor + + if !empty(l:loclist) + call sort(l:loclist, function('ale#util#LocItemCompareWithText')) + call uniq(l:loclist, function('ale#util#LocItemCompareWithText')) + + " Set the loclist variable, used by some parts of ALE. + let g:ale_buffer_info[a:buffer].loclist = l:loclist + call ale#engine#SetResults(a:buffer, l:loclist) + endif +endfunction + +function! s:RunIfExecutable(buffer, linter, lint_file, executable) abort + if ale#command#IsDeferred(a:executable) + let a:executable.result_callback = { + \ executable -> s:RunIfExecutable( + \ a:buffer, + \ a:linter, + \ a:lint_file, + \ executable + \ ) + \} + + return 1 + endif + + if ale#engine#IsExecutable(a:buffer, a:executable) + " Use different job types for file or linter jobs. + let l:job_type = a:lint_file ? 'file_linter' : 'linter' + call setbufvar(a:buffer, 'ale_job_type', l:job_type) + + " Get the cwd for the linter and set it before we call GetCommand. + " This will ensure that ale#command#Run uses it by default. + let l:cwd = ale#linter#GetCwd(a:buffer, a:linter) + + if l:cwd isnot v:null + call ale#command#SetCwd(a:buffer, l:cwd) + endif + + let l:command = ale#linter#GetCommand(a:buffer, a:linter) + + if l:cwd isnot v:null + call ale#command#ResetCwd(a:buffer) + endif + + let l:options = { + \ 'cwd': l:cwd, + \ 'executable': a:executable, + \ 'buffer': a:buffer, + \ 'linter': a:linter, + \ 'output_stream': get(a:linter, 'output_stream', 'stdout'), + \ 'read_buffer': a:linter.read_buffer, + \ 'lint_file': a:lint_file, + \} + + return s:RunJob(l:command, l:options) + endif + + return 0 +endfunction + +" Run a linter for a buffer. +" +" Returns 1 if the linter was successfully run. +function! s:RunLinter(buffer, linter, lint_file) abort + if !empty(a:linter.lsp) + return ale#lsp_linter#CheckWithLSP(a:buffer, a:linter) + else + let l:executable = ale#linter#GetExecutable(a:buffer, a:linter) + + return s:RunIfExecutable(a:buffer, a:linter, a:lint_file, l:executable) + endif + + return 0 +endfunction + +function! s:GetLintFileSlots(buffer, linters) abort + let l:linter_slots = [] + + for l:linter in a:linters + let l:LintFile = l:linter.lint_file + + if type(l:LintFile) is v:t_func + let l:LintFile = l:LintFile(a:buffer) + endif + + call add(l:linter_slots, [l:LintFile, l:linter]) + endfor + + return l:linter_slots +endfunction + +function! s:GetLintFileValues(slots, Callback) abort + let l:deferred_list = [] + let l:new_slots = [] + + for [l:lint_file, l:linter] in a:slots + while ale#command#IsDeferred(l:lint_file) && has_key(l:lint_file, 'value') + " If we've already computed the return value, use it. + let l:lint_file = l:lint_file.value + endwhile + + if ale#command#IsDeferred(l:lint_file) + " If we are going to return the result later, wait for it. + call add(l:deferred_list, l:lint_file) + else + " If we have the value now, coerce it to 0 or 1. + let l:lint_file = l:lint_file is 1 + endif + + call add(l:new_slots, [l:lint_file, l:linter]) + endfor + + if !empty(l:deferred_list) + for l:deferred in l:deferred_list + let l:deferred.result_callback = + \ {-> s:GetLintFileValues(l:new_slots, a:Callback)} + endfor + else + call a:Callback(l:new_slots) + endif +endfunction + +function! s:RunLinters( +\ buffer, +\ linters, +\ slots, +\ should_lint_file, +\ new_buffer, +\) abort + call s:StopCurrentJobs(a:buffer, a:should_lint_file, a:slots) + call s:RemoveProblemsForDisabledLinters(a:buffer, a:linters) + + " We can only clear the results if we aren't checking the buffer. + let l:can_clear_results = !ale#engine#IsCheckingBuffer(a:buffer) + + silent doautocmd User ALELintPre + + for [l:lint_file, l:linter] in a:slots + " Only run lint_file linters if we should. + if !l:lint_file || a:should_lint_file + if s:RunLinter(a:buffer, l:linter, l:lint_file) + " If a single linter ran, we shouldn't clear everything. + let l:can_clear_results = 0 + endif + else + " If we skipped running a lint_file linter still in the list, + " we shouldn't clear everything. + let l:can_clear_results = 0 + endif + endfor + + " Clear the results if we can. This needs to be done when linters are + " disabled, or ALE itself is disabled. + if l:can_clear_results + call ale#engine#SetResults(a:buffer, []) + elseif a:new_buffer + call s:AddProblemsFromOtherBuffers( + \ a:buffer, + \ map(copy(a:slots), 'v:val[1]') + \) + endif +endfunction + +function! ale#engine#RunLinters(buffer, linters, should_lint_file) abort + " Initialise the buffer information if needed. + let l:new_buffer = ale#engine#InitBufferInfo(a:buffer) + + call s:GetLintFileValues( + \ s:GetLintFileSlots(a:buffer, a:linters), + \ { + \ slots -> s:RunLinters( + \ a:buffer, + \ a:linters, + \ slots, + \ a:should_lint_file, + \ l:new_buffer, + \ ) + \ } + \) +endfunction + +" Clean up a buffer. +" +" This function will stop all current jobs for the buffer, +" clear the state of everything, and remove the Dictionary for managing +" the buffer. +function! ale#engine#Cleanup(buffer) abort + " Don't bother with cleanup code when newer NeoVim versions are exiting. + if get(v:, 'exiting', v:null) isnot v:null + return + endif + + if exists('*ale#lsp#CloseDocument') + call ale#lsp#CloseDocument(a:buffer) + endif + + if !has_key(g:ale_buffer_info, a:buffer) + return + endif + + call ale#engine#RunLinters(a:buffer, [], 1) + + call remove(g:ale_buffer_info, a:buffer) +endfunction + +" Given a buffer number, return the warnings and errors for a given buffer. +function! ale#engine#GetLoclist(buffer) abort + if !has_key(g:ale_buffer_info, a:buffer) + return [] + endif + + return g:ale_buffer_info[a:buffer].loclist +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/engine/ignore.vim b/dot_vim/plugged/ale/autoload/ale/engine/ignore.vim new file mode 100644 index 0000000..8057465 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/engine/ignore.vim @@ -0,0 +1,50 @@ +" Author: w0rp +" Description: Code for ignoring linters. Only loaded and if configured. + +" Given a filetype and a configuration for ignoring linters, return a List of +" Strings for linter names to ignore. +function! ale#engine#ignore#GetList(filetype, config) abort + if type(a:config) is v:t_list + return a:config + endif + + if type(a:config) is v:t_dict + let l:names_to_remove = [] + + for l:part in split(a:filetype , '\.') + call extend(l:names_to_remove, get(a:config, l:part, [])) + endfor + + return l:names_to_remove + endif + + return [] +endfunction + +" Given a List of linter descriptions, exclude the linters to be ignored. +function! ale#engine#ignore#Exclude(filetype, all_linters, config, disable_lsp) abort + let l:names_to_remove = ale#engine#ignore#GetList(a:filetype, a:config) + let l:filtered_linters = [] + + for l:linter in a:all_linters + let l:name_list = [l:linter.name] + l:linter.aliases + let l:should_include = 1 + + for l:name in l:name_list + if index(l:names_to_remove, l:name) >= 0 + let l:should_include = 0 + break + endif + endfor + + if a:disable_lsp && has_key(l:linter, 'lsp') && l:linter.lsp isnot# '' + let l:should_include = 0 + endif + + if l:should_include + call add(l:filtered_linters, l:linter) + endif + endfor + + return l:filtered_linters +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/events.vim b/dot_vim/plugged/ale/autoload/ale/events.vim new file mode 100644 index 0000000..eec24f4 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/events.vim @@ -0,0 +1,165 @@ +" Author: w0rp +" Description: ALE functions for autocmd events. + +" Get the number of milliseconds since some vague, but consistent, point in +" the past. +" +" This function can be used for timing execution, etc. +" +" The time will be returned as a Number. +function! ale#events#ClockMilliseconds() abort + return float2nr(reltimefloat(reltime()) * 1000) +endfunction + +function! ale#events#QuitEvent(buffer) abort + " Remember when ALE is quitting for BufWrite, etc. + call setbufvar(a:buffer, 'ale_quitting', ale#events#ClockMilliseconds()) +endfunction + +function! ale#events#QuitRecently(buffer) abort + let l:time = getbufvar(a:buffer, 'ale_quitting', 0) + + return l:time && ale#events#ClockMilliseconds() - l:time < 1000 +endfunction + +function! ale#events#SaveEvent(buffer) abort + let l:should_lint = ale#Var(a:buffer, 'enabled') && g:ale_lint_on_save + + if l:should_lint + call setbufvar(a:buffer, 'ale_save_event_fired', 1) + endif + + if ale#Var(a:buffer, 'fix_on_save') && !ale#events#QuitRecently(a:buffer) + let l:will_fix = ale#fix#Fix(a:buffer, 'save_file') + let l:should_lint = l:should_lint && !l:will_fix + endif + + if l:should_lint && !ale#events#QuitRecently(a:buffer) + call ale#Queue(0, 'lint_file', a:buffer) + endif +endfunction + +function! ale#events#LintOnEnter(buffer) abort + " Unmark a file as being changed outside of Vim after we try to check it. + call setbufvar(a:buffer, 'ale_file_changed', 0) + + if ale#Var(a:buffer, 'enabled') && g:ale_lint_on_enter + call ale#Queue(0, 'lint_file', a:buffer) + endif +endfunction + +function! ale#events#ReadOrEnterEvent(buffer) abort + " Apply pattern options if the variable is set. + if get(g:, 'ale_pattern_options_enabled', 1) + \&& !empty(get(g:, 'ale_pattern_options')) + call ale#pattern_options#SetOptions(a:buffer) + endif + + " When entering a buffer, we are no longer quitting it. + call setbufvar(a:buffer, 'ale_quitting', 0) + let l:filetype = getbufvar(a:buffer, '&filetype') + call setbufvar(a:buffer, 'ale_original_filetype', l:filetype) + + " If the file changed outside of Vim, check it on BufEnter,BufRead + if getbufvar(a:buffer, 'ale_file_changed') + call ale#events#LintOnEnter(a:buffer) + endif +endfunction + +function! ale#events#FileTypeEvent(buffer, new_filetype) abort + " The old filetype will be set to an empty string by the BuFEnter event, + " and not linting when the old filetype hasn't been set yet prevents + " buffers being checked when you enter them when linting on enter is off. + let l:old_filetype = getbufvar(a:buffer, 'ale_original_filetype', v:null) + + if l:old_filetype isnot v:null + \&& !empty(a:new_filetype) + \&& a:new_filetype isnot# l:old_filetype + " Remember what the new filetype is. + call setbufvar(a:buffer, 'ale_original_filetype', a:new_filetype) + + if g:ale_lint_on_filetype_changed + call ale#Queue(300, 'lint_file', a:buffer) + endif + endif +endfunction + +function! ale#events#FileChangedEvent(buffer) abort + call setbufvar(a:buffer, 'ale_file_changed', 1) + + if bufnr('') == a:buffer + call ale#events#LintOnEnter(a:buffer) + endif +endfunction + +function! ale#events#Init() abort + " This value used to be a Boolean as a Number, and is now a String. + let l:text_changed = '' . g:ale_lint_on_text_changed + + augroup ALEEvents + autocmd! + + " These events always need to be set up. + autocmd BufEnter,BufRead * call ale#events#ReadOrEnterEvent(str2nr(expand(''))) + autocmd BufWritePost * call ale#events#SaveEvent(str2nr(expand(''))) + + if g:ale_enabled + if l:text_changed is? 'always' || l:text_changed is# '1' + autocmd TextChanged,TextChangedI * call ale#Queue(ale#Var(str2nr(expand('')), 'lint_delay')) + elseif l:text_changed is? 'normal' + autocmd TextChanged * call ale#Queue(ale#Var(str2nr(expand('')), 'lint_delay')) + elseif l:text_changed is? 'insert' + autocmd TextChangedI * call ale#Queue(ale#Var(str2nr(expand('')), 'lint_delay')) + endif + + if g:ale_lint_on_enter + autocmd BufWinEnter * call ale#events#LintOnEnter(str2nr(expand(''))) + " Track when the file is changed outside of Vim. + autocmd FileChangedShellPost * call ale#events#FileChangedEvent(str2nr(expand(''))) + endif + + if g:ale_lint_on_filetype_changed + " Only start linting if the FileType actually changes after + " opening a buffer. The FileType will fire when buffers are opened. + autocmd FileType * call ale#events#FileTypeEvent( + \ str2nr(expand('')), + \ expand('') + \) + endif + + if g:ale_lint_on_insert_leave + autocmd InsertLeave * if ale#Var(str2nr(expand('')), 'lint_on_insert_leave') | call ale#Queue(0) | endif + endif + + if g:ale_echo_cursor || g:ale_cursor_detail + autocmd CursorMoved,CursorHold * if exists('*ale#engine#Cleanup') | call ale#cursor#EchoCursorWarningWithDelay() | endif + " Look for a warning to echo as soon as we leave Insert mode. + " The script's position variable used when moving the cursor will + " not be changed here. + autocmd InsertLeave * if exists('*ale#engine#Cleanup') | call ale#cursor#EchoCursorWarning() | endif + endif + + if g:ale_virtualtext_cursor is# 'current' || g:ale_virtualtext_cursor is# 1 || g:ale_virtualtext_cursor is# '1' + autocmd CursorMoved,CursorHold * if exists('*ale#engine#Cleanup') | call ale#virtualtext#ShowCursorWarningWithDelay() | endif + " Look for a warning to echo as soon as we leave Insert mode. + " The script's position variable used when moving the cursor will + " not be changed here. + autocmd InsertLeave * if exists('*ale#engine#Cleanup') | call ale#virtualtext#ShowCursorWarning() | endif + endif + + if g:ale_hover_cursor + autocmd CursorHold * if exists('*ale#lsp#Send') | call ale#hover#ShowTruncatedMessageAtCursor() | endif + endif + + if g:ale_close_preview_on_insert + autocmd InsertEnter * if exists('*ale#preview#CloseIfTypeMatches') | call ale#preview#CloseIfTypeMatches('ale-preview') | endif + endif + endif + augroup END + + augroup AleURISchemes + autocmd! + + autocmd BufNewFile,BufReadPre jdt://** call ale#uri#jdt#ReadJDTLink(expand('')) + augroup END +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/filename_mapping.vim b/dot_vim/plugged/ale/autoload/ale/filename_mapping.vim new file mode 100644 index 0000000..76d47ac --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/filename_mapping.vim @@ -0,0 +1,22 @@ +" Author: w0rp +" Description: Logic for handling mappings between files + +" Invert filesystem mappings so they can be mapped in reverse. +function! ale#filename_mapping#Invert(filename_mappings) abort + return map(copy(a:filename_mappings), '[v:val[1], v:val[0]]') +endfunction + +" Given a filename and some filename_mappings, map a filename. +function! ale#filename_mapping#Map(filename, filename_mappings) abort + let l:simplified_filename = ale#path#Simplify(a:filename) + + for [l:mapping_from, l:mapping_to] in a:filename_mappings + let l:mapping_from = ale#path#Simplify(l:mapping_from) + + if l:simplified_filename[:len(l:mapping_from) - 1] is# l:mapping_from + return l:mapping_to . l:simplified_filename[len(l:mapping_from):] + endif + endfor + + return a:filename +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/filerename.vim b/dot_vim/plugged/ale/autoload/ale/filerename.vim new file mode 100644 index 0000000..ec20d27 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/filerename.vim @@ -0,0 +1,133 @@ +" Author: Dalius Dobravolskas +" Description: Rename file support for tsserver + +let s:filerename_map = {} + +" Used to get the rename map in tests. +function! ale#filerename#GetMap() abort + return deepcopy(s:filerename_map) +endfunction + +" Used to set the rename map in tests. +function! ale#filerename#SetMap(map) abort + let s:filerename_map = a:map +endfunction + +function! ale#filerename#ClearLSPData() abort + let s:filerename_map = {} +endfunction + +function! s:message(message) abort + call ale#util#Execute('echom ' . string(a:message)) +endfunction + +function! ale#filerename#HandleTSServerResponse(conn_id, response) abort + if get(a:response, 'command', '') isnot# 'getEditsForFileRename' + return + endif + + if !has_key(s:filerename_map, a:response.request_seq) + return + endif + + let l:options = remove(s:filerename_map, a:response.request_seq) + + let l:old_name = l:options.old_name + let l:new_name = l:options.new_name + + if get(a:response, 'success', v:false) is v:false + let l:message = get(a:response, 'message', 'unknown') + call s:message('Error renaming file "' . l:old_name . '" to "' . l:new_name + \ . '". Reason: ' . l:message) + + return + endif + + let l:changes = a:response.body + + if empty(l:changes) + call s:message('No changes while renaming "' . l:old_name . '" to "' . l:new_name . '"') + else + call ale#code_action#HandleCodeAction( + \ { + \ 'description': 'filerename', + \ 'changes': l:changes, + \ }, + \ { + \ 'should_save': 1, + \ }, + \) + endif + + silent! noautocmd execute 'saveas ' . l:new_name + call delete(l:old_name) +endfunction + +function! s:OnReady(options, linter, lsp_details) abort + let l:id = a:lsp_details.connection_id + + if !ale#lsp#HasCapability(l:id, 'filerename') + return + endif + + let l:buffer = a:lsp_details.buffer + + let l:Callback = function('ale#filerename#HandleTSServerResponse') + + call ale#lsp#RegisterCallback(l:id, l:Callback) + + let l:message = ale#lsp#tsserver_message#GetEditsForFileRename( + \ a:options.old_name, + \ a:options.new_name, + \) + + let l:request_id = ale#lsp#Send(l:id, l:message) + + let s:filerename_map[l:request_id] = a:options +endfunction + +function! s:ExecuteFileRename(linter, options) abort + let l:buffer = bufnr('') + + let l:Callback = function('s:OnReady', [a:options]) + call ale#lsp_linter#StartLSP(l:buffer, a:linter, l:Callback) +endfunction + +function! ale#filerename#Execute() abort + let l:lsp_linters = [] + + for l:linter in ale#linter#Get(&filetype) + if l:linter.lsp is# 'tsserver' + call add(l:lsp_linters, l:linter) + endif + endfor + + if empty(l:lsp_linters) + call s:message('No active tsserver LSPs') + + return + endif + + let l:buffer = bufnr('') + let l:old_name = expand('#' . l:buffer . ':p') + let l:new_name = ale#util#Input('New file name: ', l:old_name, 'file') + + if l:old_name is# l:new_name + call s:message('New file name matches old file name') + + return + endif + + if empty(l:new_name) + call s:message('New name cannot be empty!') + + return + endif + + for l:lsp_linter in l:lsp_linters + call s:ExecuteFileRename(l:lsp_linter, { + \ 'old_name': l:old_name, + \ 'new_name': l:new_name, + \}) + endfor +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/filetypes.vim b/dot_vim/plugged/ale/autoload/ale/filetypes.vim new file mode 100644 index 0000000..340a9c4 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/filetypes.vim @@ -0,0 +1,58 @@ +" Author: w0rp +" Description: This file handles guessing file extensions for filetypes, etc. + +function! ale#filetypes#LoadExtensionMap() abort + " Output includes: + " '*.erl setf erlang' + let l:output = execute('exec "autocmd"') + + let l:map = {} + + for l:line in split(l:output, "\n") + " Parse filetypes, like so: + " + " *.erl setf erlang + " *.md set filetype=markdown + " *.snippet setlocal filetype=snippets + let l:match = matchlist(l:line, '\v^ *\*(\.[^ ]+).*set(f *| *filetype=|local *filetype=)([^ ]+)') + + if !empty(l:match) + let l:map[substitute(l:match[3], '^=', '', '')] = l:match[1] + endif + endfor + + return l:map +endfunction + +let s:cached_map = {} + +function! s:GetCachedExtensionMap() abort + if empty(s:cached_map) + let s:cached_map = ale#filetypes#LoadExtensionMap() + endif + + return s:cached_map +endfunction + +function! ale#filetypes#GuessExtension(filetype) abort + let l:map = s:GetCachedExtensionMap() + let l:ext = get(l:map, a:filetype, '') + + " If we have an exact match, like something for javascript.jsx, use that. + if !empty(l:ext) + return l:ext + endif + + " If we don't have an exact match, use the first filetype in the compound + " filetype. + for l:part in split(a:filetype, '\.') + let l:ext = get(l:map, l:part, '') + + if !empty(l:ext) + return l:ext + endif + endfor + + " Return an empty string if we don't find anything. + return '' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fix.vim b/dot_vim/plugged/ale/autoload/ale/fix.vim new file mode 100644 index 0000000..d982084 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fix.vim @@ -0,0 +1,399 @@ +" Author: w0rp +" Description: Functions for fixing code with programs, or other means. + +let g:ale_fix_on_save_ignore = get(g:, 'ale_fix_on_save_ignore', {}) +let g:ale_filename_mappings = get(g:, 'ale_filename_mappings', {}) + +" Apply fixes queued up for buffers which may be hidden. +" Vim doesn't let you modify hidden buffers. +function! ale#fix#ApplyQueuedFixes(buffer) abort + let l:data = get(g:ale_fix_buffer_data, a:buffer, {'done': 0}) + + if !l:data.done || (!ale#util#HasBuflineApi() && a:buffer isnot bufnr('')) + return + endif + + call remove(g:ale_fix_buffer_data, a:buffer) + + try + if l:data.changes_made + let l:new_lines = ale#util#SetBufferContents(a:buffer, l:data.output) + + if l:data.should_save + if a:buffer is bufnr('') + if empty(&buftype) + noautocmd :w! + else + set nomodified + endif + else + call writefile(l:new_lines, expand('#' . a:buffer . ':p')) " no-custom-checks + call setbufvar(a:buffer, '&modified', 0) + endif + endif + endif + catch /E21/ + " If we cannot modify the buffer now, try again later. + let g:ale_fix_buffer_data[a:buffer] = l:data + + return + endtry + + if l:data.should_save + let l:should_lint = ale#Var(a:buffer, 'fix_on_save') + \ && ale#Var(a:buffer, 'lint_on_save') + else + let l:should_lint = l:data.changes_made + endif + + silent doautocmd User ALEFixPost + + " If ALE linting is enabled, check for problems with the file again after + " fixing problems. + if g:ale_enabled + \&& l:should_lint + \&& !ale#events#QuitRecently(a:buffer) + call ale#Queue(0, l:data.should_save ? 'lint_file' : '') + endif +endfunction + +function! ale#fix#ApplyFixes(buffer, output) abort + let l:data = g:ale_fix_buffer_data[a:buffer] + let l:data.output = a:output + let l:data.changes_made = l:data.lines_before !=# l:data.output " no-custom-checks + let l:data.done = 1 + + call ale#command#RemoveManagedFiles(a:buffer) + + if !bufexists(a:buffer) + " Remove the buffer data when it doesn't exist. + call remove(g:ale_fix_buffer_data, a:buffer) + endif + + if l:data.changes_made && bufexists(a:buffer) + let l:lines = getbufline(a:buffer, 1, '$') + + if l:data.lines_before != l:lines + call remove(g:ale_fix_buffer_data, a:buffer) + + if !l:data.ignore_file_changed_errors + " no-custom-checks + echoerr 'The file was changed before fixing finished' + endif + + return + endif + endif + + " We can only change the lines of a buffer which is currently open, + " so try and apply the fixes to the current buffer. + call ale#fix#ApplyQueuedFixes(a:buffer) +endfunction + +function! s:HandleExit(job_info, buffer, job_output, data) abort + let l:buffer_info = get(g:ale_fix_buffer_data, a:buffer, {}) + + if empty(l:buffer_info) + return + endif + + if a:job_info.read_temporary_file + let l:output = !empty(a:data.temporary_file) + \ ? readfile(a:data.temporary_file) + \ : [] + else + let l:output = a:job_output + endif + + let l:ProcessWith = get(a:job_info, 'process_with', v:null) + + " Post-process the output with a function if we have one. + if l:ProcessWith isnot v:null + let l:output = call(l:ProcessWith, [a:buffer, l:output]) + endif + + " Use the output of the job for changing the file if it isn't empty, + " otherwise skip this job and use the input from before. + " + " We'll use the input from before for chained commands. + if !empty(split(join(l:output))) + let l:input = l:output + else + let l:input = a:job_info.input + endif + + call s:RunFixer({ + \ 'buffer': a:buffer, + \ 'input': l:input, + \ 'callback_list': a:job_info.callback_list, + \ 'callback_index': a:job_info.callback_index + 1, + \}) +endfunction + +function! s:RunJob(result, options) abort + if ale#command#IsDeferred(a:result) + let a:result.result_callback = {x -> s:RunJob(x, a:options)} + + return + endif + + let l:buffer = a:options.buffer + let l:input = a:options.input + let l:fixer_name = a:options.fixer_name + + if a:result is 0 || type(a:result) is v:t_list + if type(a:result) is v:t_list + let l:input = a:result + endif + + call s:RunFixer({ + \ 'buffer': l:buffer, + \ 'input': l:input, + \ 'callback_index': a:options.callback_index + 1, + \ 'callback_list': a:options.callback_list, + \}) + + return + endif + + let l:command = get(a:result, 'command', '') + + if empty(l:command) + " If the command is empty, skip to the next item. + call s:RunFixer({ + \ 'buffer': l:buffer, + \ 'input': l:input, + \ 'callback_index': a:options.callback_index, + \ 'callback_list': a:options.callback_list, + \}) + + return + endif + + let l:read_temporary_file = get(a:result, 'read_temporary_file', 0) + let l:read_buffer = get(a:result, 'read_buffer', 1) + let l:output_stream = get(a:result, 'output_stream', 'stdout') + let l:cwd = get(a:result, 'cwd', v:null) + + if l:read_temporary_file + let l:output_stream = 'none' + endif + + let l:Callback = function('s:HandleExit', [{ + \ 'input': l:input, + \ 'callback_index': a:options.callback_index, + \ 'callback_list': a:options.callback_list, + \ 'process_with': get(a:result, 'process_with', v:null), + \ 'read_temporary_file': l:read_temporary_file, + \}]) + let l:run_result = ale#command#Run(l:buffer, l:command, l:Callback, { + \ 'output_stream': l:output_stream, + \ 'executable': '', + \ 'read_buffer': l:read_buffer, + \ 'input': l:input, + \ 'log_output': 0, + \ 'cwd': l:cwd, + \ 'filename_mappings': ale#GetFilenameMappings(l:buffer, l:fixer_name), + \}) + + if empty(l:run_result) + call s:RunFixer({ + \ 'buffer': l:buffer, + \ 'input': l:input, + \ 'callback_index': a:options.callback_index + 1, + \ 'callback_list': a:options.callback_list, + \}) + endif +endfunction + +function! s:RunFixer(options) abort + let l:buffer = a:options.buffer + let l:input = a:options.input + let l:index = a:options.callback_index + + if len(a:options.callback_list) <= l:index + call ale#fix#ApplyFixes(l:buffer, l:input) + + return + endif + + let [l:fixer_name, l:Function] = a:options.callback_list[l:index] + + " Record new jobs started as fixer jobs. + call setbufvar(l:buffer, 'ale_job_type', 'fixer') + + " Regular fixer commands accept (buffer, [input]) + let l:result = ale#util#FunctionArgCount(l:Function) == 1 + \ ? call(l:Function, [l:buffer]) + \ : call(l:Function, [l:buffer, copy(l:input)]) + + call s:RunJob(l:result, { + \ 'buffer': l:buffer, + \ 'input': l:input, + \ 'callback_list': a:options.callback_list, + \ 'callback_index': l:index, + \ 'fixer_name': l:fixer_name, + \}) +endfunction + +function! s:AddSubCallbacks(full_list, callbacks) abort + if type(a:callbacks) is v:t_string + call add(a:full_list, a:callbacks) + elseif type(a:callbacks) is v:t_list + call extend(a:full_list, a:callbacks) + else + return 0 + endif + + return 1 +endfunction + +function! s:IgnoreFixers(callback_list, filetype, config) abort + if type(a:config) is v:t_list + let l:ignore_list = a:config + else + let l:ignore_list = [] + + for l:part in split(a:filetype , '\.') + call extend(l:ignore_list, get(a:config, l:part, [])) + endfor + endif + + call filter(a:callback_list, 'index(l:ignore_list, v:val) < 0') +endfunction + +function! s:GetCallbacks(buffer, fixing_flag, fixers) abort + if len(a:fixers) + let l:callback_list = a:fixers + elseif type(get(b:, 'ale_fixers')) is v:t_list + " Lists can be used for buffer-local variables only + let l:callback_list = b:ale_fixers + else + " buffer and global options can use dictionaries mapping filetypes to + " callbacks to run. + let l:fixers = ale#Var(a:buffer, 'fixers') + let l:callback_list = [] + let l:matched = 0 + + for l:sub_type in split(&filetype, '\.') + if s:AddSubCallbacks(l:callback_list, get(l:fixers, l:sub_type)) + let l:matched = 1 + endif + endfor + + " If we couldn't find fixers for a filetype, default to '*' fixers. + if !l:matched + call s:AddSubCallbacks(l:callback_list, get(l:fixers, '*')) + endif + endif + + if a:fixing_flag is# 'save_file' + let l:config = ale#Var(a:buffer, 'fix_on_save_ignore') + + if !empty(l:config) + call s:IgnoreFixers(l:callback_list, &filetype, l:config) + endif + endif + + let l:corrected_list = [] + + " Variables with capital characters are needed, or Vim will complain about + " funcref variables. + for l:Item in l:callback_list + " Try to capture the names of registered fixer names, so we can use + " them for filename mapping or other purposes later. + let l:fixer_name = v:null + + if type(l:Item) is v:t_string + let l:Func = ale#fix#registry#GetFunc(l:Item) + + if !empty(l:Func) + let l:fixer_name = l:Item + let l:Item = l:Func + endif + endif + + try + call add(l:corrected_list, [ + \ l:fixer_name, + \ ale#util#GetFunction(l:Item) + \]) + catch /E475/ + " Rethrow exceptions for failing to get a function so we can print + " a friendly message about it. + throw 'BADNAME ' . v:exception + endtry + endfor + + return l:corrected_list +endfunction + +function! ale#fix#InitBufferData(buffer, fixing_flag) abort + " The 'done' flag tells the function for applying changes when fixing + " is complete. + let g:ale_fix_buffer_data[a:buffer] = { + \ 'lines_before': getbufline(a:buffer, 1, '$'), + \ 'done': 0, + \ 'should_save': a:fixing_flag is# 'save_file', + \ 'ignore_file_changed_errors': a:fixing_flag is# '!', + \ 'temporary_directory_list': [], + \} +endfunction + +" Accepts an optional argument for what to do when fixing. +" +" Returns 0 if no fixes can be applied, and 1 if fixing can be done. +function! ale#fix#Fix(buffer, fixing_flag, ...) abort + if a:fixing_flag isnot# '' + \&& a:fixing_flag isnot# '!' + \&& a:fixing_flag isnot# 'save_file' + throw "fixing_flag must be '', '!', or 'save_file'" + endif + + try + let l:callback_list = s:GetCallbacks(a:buffer, a:fixing_flag, a:000) + catch /E700\|BADNAME/ + if a:fixing_flag isnot# '!' + let l:function_name = join(split(split(v:exception, ':')[3])) + let l:echo_message = printf( + \ 'There is no fixer named `%s`. Check :ALEFixSuggest', + \ l:function_name, + \) + " no-custom-checks + echom l:echo_message + endif + + return 0 + endtry + + if empty(l:callback_list) + if a:fixing_flag is# '' + " no-custom-checks + echom 'No fixers have been defined. Try :ALEFixSuggest' + endif + + return 0 + endif + + call ale#command#StopJobs(a:buffer, 'fixer') + " Clean up any files we might have left behind from a previous run. + call ale#command#RemoveManagedFiles(a:buffer) + call ale#fix#InitBufferData(a:buffer, a:fixing_flag) + + silent doautocmd User ALEFixPre + + call s:RunFixer({ + \ 'buffer': a:buffer, + \ 'input': g:ale_fix_buffer_data[a:buffer].lines_before, + \ 'callback_index': 0, + \ 'callback_list': l:callback_list, + \}) + + return 1 +endfunction + +" Set up an autocmd command to try and apply buffer fixes when available. +augroup ALEBufferFixGroup + autocmd! + autocmd BufEnter * call ale#fix#ApplyQueuedFixes(str2nr(expand(''))) +augroup END diff --git a/dot_vim/plugged/ale/autoload/ale/fix/registry.vim b/dot_vim/plugged/ale/autoload/ale/fix/registry.vim new file mode 100644 index 0000000..28e3392 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fix/registry.vim @@ -0,0 +1,795 @@ +" Author: w0rp +" Description: A registry of functions for fixing things. + +let s:default_registry = { +\ 'add_blank_lines_for_python_control_statements': { +\ 'function': 'ale#fixers#generic_python#AddLinesBeforeControlStatements', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Add blank lines before control statements.', +\ }, +\ 'align_help_tags': { +\ 'function': 'ale#fixers#help#AlignTags', +\ 'suggested_filetypes': ['help'], +\ 'description': 'Align help tags to the right margin', +\ }, +\ 'autoimport': { +\ 'function': 'ale#fixers#autoimport#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Fix import issues with autoimport.', +\ }, +\ 'autoflake': { +\ 'function': 'ale#fixers#autoflake#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Fix flake issues with autoflake.', +\ }, +\ 'autopep8': { +\ 'function': 'ale#fixers#autopep8#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Fix PEP8 issues with autopep8.', +\ }, +\ 'bibclean': { +\ 'function': 'ale#fixers#bibclean#Fix', +\ 'suggested_filetypes': ['bib'], +\ 'description': 'Format bib files using bibclean.', +\ }, +\ 'black': { +\ 'function': 'ale#fixers#black#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Fix PEP8 issues with black.', +\ }, +\ 'buf-format': { +\ 'function': 'ale#fixers#buf_format#Fix', +\ 'suggested_filetypes': ['proto'], +\ 'description': 'Fix .proto files with buf format.', +\ }, +\ 'buildifier': { +\ 'function': 'ale#fixers#buildifier#Fix', +\ 'suggested_filetypes': ['bzl'], +\ 'description': 'Format BUILD and .bzl files with buildifier.', +\ }, +\ 'css-beautify': { +\ 'function': 'ale#fixers#css_beautify#Fix', +\ 'suggested_filetypes': ['css'], +\ 'description': 'Format CSS using css-beautify from js-beautify.', +\ }, +\ 'deno': { +\ 'function': 'ale#fixers#deno#Fix', +\ 'suggested_filetypes': ['typescript'], +\ 'description': 'Fix TypeScript using deno fmt.', +\ }, +\ 'dfmt': { +\ 'function': 'ale#fixers#dfmt#Fix', +\ 'suggested_filetypes': ['d'], +\ 'description': 'Fix D files with dfmt.', +\ }, +\ 'dhall': { +\ 'function': 'ale#fixers#dhall#Fix', +\ 'suggested_filetypes': ['dhall'], +\ 'description': 'Fix Dhall files with dhall-format.', +\ }, +\ 'dhall-format': { +\ 'function': 'ale#fixers#dhall_format#Fix', +\ 'suggested_filetypes': ['dhall'], +\ 'description': 'Standard code formatter for the Dhall language', +\ 'aliases': ['dhall'], +\ }, +\ 'dhall-freeze': { +\ 'function': 'ale#fixers#dhall_freeze#Freeze', +\ 'suggested_filetypes': ['dhall'], +\ 'description': 'Add integrity checks to remote import statements of an expression for the Dhall language', +\ }, +\ 'dhall-lint': { +\ 'function': 'ale#fixers#dhall_lint#Fix', +\ 'suggested_filetypes': ['dhall'], +\ 'description': 'Standard code formatter for the Dhall language and removing dead code', +\ }, +\ 'dune': { +\ 'function': 'ale#fixers#dune#Fix', +\ 'suggested_filetypes': ['dune'], +\ 'description': 'Fix dune files with dune format', +\ }, +\ 'fecs': { +\ 'function': 'ale#fixers#fecs#Fix', +\ 'suggested_filetypes': ['javascript', 'css', 'html'], +\ 'description': 'Apply fecs format to a file.', +\ }, +\ 'tidy': { +\ 'function': 'ale#fixers#tidy#Fix', +\ 'suggested_filetypes': ['html'], +\ 'description': 'Fix HTML files with tidy.', +\ }, +\ 'prettier_standard': { +\ 'function': 'ale#fixers#prettier_standard#Fix', +\ 'suggested_filetypes': ['javascript'], +\ 'description': 'Apply prettier-standard to a file.', +\ 'aliases': ['prettier-standard'], +\ }, +\ 'elm-format': { +\ 'function': 'ale#fixers#elm_format#Fix', +\ 'suggested_filetypes': ['elm'], +\ 'description': 'Apply elm-format to a file.', +\ 'aliases': ['format'], +\ }, +\ 'nimpretty': { +\ 'function': 'ale#fixers#nimpretty#Fix', +\ 'suggested_filetypes': ['nim'], +\ 'description': 'Apply nimpretty to a file.', +\ }, +\ 'erblint': { +\ 'function': 'ale#fixers#erblint#Fix', +\ 'suggested_filetypes': ['eruby'], +\ 'description': 'Apply erblint --autocorrect to a file.', +\ }, +\ 'eslint': { +\ 'function': 'ale#fixers#eslint#Fix', +\ 'suggested_filetypes': ['javascript', 'typescript'], +\ 'description': 'Apply eslint --fix to a file.', +\ }, +\ 'mix_format': { +\ 'function': 'ale#fixers#mix_format#Fix', +\ 'suggested_filetypes': ['elixir'], +\ 'description': 'Apply mix format to a file.', +\ }, +\ 'isort': { +\ 'function': 'ale#fixers#isort#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Sort Python imports with isort.', +\ }, +\ 'prettier': { +\ 'function': 'ale#fixers#prettier#Fix', +\ 'suggested_filetypes': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'json5', 'graphql', 'markdown', 'vue', 'svelte', 'html', 'yaml', 'openapi', 'ruby'], +\ 'description': 'Apply prettier to a file.', +\ }, +\ 'prettier_eslint': { +\ 'function': 'ale#fixers#prettier_eslint#Fix', +\ 'suggested_filetypes': ['javascript'], +\ 'description': 'Apply prettier-eslint to a file.', +\ 'aliases': ['prettier-eslint'], +\ }, +\ 'pyflyby': { +\ 'function': 'ale#fixers#pyflyby#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Tidy Python imports with pyflyby.', +\ }, +\ 'importjs': { +\ 'function': 'ale#fixers#importjs#Fix', +\ 'suggested_filetypes': ['javascript'], +\ 'description': 'automatic imports for javascript', +\ }, +\ 'puppetlint': { +\ 'function': 'ale#fixers#puppetlint#Fix', +\ 'suggested_filetypes': ['puppet'], +\ 'description': 'Run puppet-lint -f on a file.', +\ }, +\ 'remove_trailing_lines': { +\ 'function': 'ale#fixers#generic#RemoveTrailingBlankLines', +\ 'suggested_filetypes': [], +\ 'description': 'Remove all blank lines at the end of a file.', +\ }, +\ 'trim_whitespace': { +\ 'function': 'ale#fixers#generic#TrimWhitespace', +\ 'suggested_filetypes': [], +\ 'description': 'Remove all trailing whitespace characters at the end of every line.', +\ }, +\ 'yamlfix': { +\ 'function': 'ale#fixers#yamlfix#Fix', +\ 'suggested_filetypes': ['yaml'], +\ 'description': 'Fix yaml files with yamlfix.', +\ }, +\ 'yapf': { +\ 'function': 'ale#fixers#yapf#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Fix Python files with yapf.', +\ }, +\ 'rubocop': { +\ 'function': 'ale#fixers#rubocop#Fix', +\ 'suggested_filetypes': ['ruby'], +\ 'description': 'Fix ruby files with rubocop --auto-correct.', +\ }, +\ 'rufo': { +\ 'function': 'ale#fixers#rufo#Fix', +\ 'suggested_filetypes': ['ruby'], +\ 'description': 'Fix ruby files with rufo', +\ }, +\ 'scalafmt': { +\ 'function': 'ale#fixers#scalafmt#Fix', +\ 'suggested_filetypes': ['sbt', 'scala'], +\ 'description': 'Fix Scala files using scalafmt', +\ }, +\ 'sorbet': { +\ 'function': 'ale#fixers#sorbet#Fix', +\ 'suggested_filetypes': ['ruby'], +\ 'description': 'Fix ruby files with srb tc --autocorrect.', +\ }, +\ 'standard': { +\ 'function': 'ale#fixers#standard#Fix', +\ 'suggested_filetypes': ['javascript'], +\ 'description': 'Fix JavaScript files using standard --fix', +\ }, +\ 'standardrb': { +\ 'function': 'ale#fixers#standardrb#Fix', +\ 'suggested_filetypes': ['ruby'], +\ 'description': 'Fix ruby files with standardrb --fix', +\ }, +\ 'statix': { +\ 'function': 'ale#fixers#statix#Fix', +\ 'suggested_filetypes': ['nix'], +\ 'description': 'Fix common Nix antipatterns with statix fix', +\ }, +\ 'stylelint': { +\ 'function': 'ale#fixers#stylelint#Fix', +\ 'suggested_filetypes': ['css', 'sass', 'scss', 'sugarss', 'stylus'], +\ 'description': 'Fix stylesheet files using stylelint --fix.', +\ }, +\ 'swiftformat': { +\ 'function': 'ale#fixers#swiftformat#Fix', +\ 'suggested_filetypes': ['swift'], +\ 'description': 'Apply SwiftFormat to a file.', +\ }, +\ 'syntax_tree': { +\ 'function': 'ale#fixers#syntax_tree#Fix', +\ 'suggested_filetypes': ['ruby'], +\ 'description': 'Fix ruby files with stree write', +\ }, +\ 'apple-swift-format': { +\ 'function': 'ale#fixers#appleswiftformat#Fix', +\ 'suggested_filetypes': ['swift'], +\ 'description': 'Apply apple/swift-format to a file.', +\ }, +\ 'phpcbf': { +\ 'function': 'ale#fixers#phpcbf#Fix', +\ 'suggested_filetypes': ['php'], +\ 'description': 'Fix PHP files with phpcbf.', +\ }, +\ 'php_cs_fixer': { +\ 'function': 'ale#fixers#php_cs_fixer#Fix', +\ 'suggested_filetypes': ['php'], +\ 'description': 'Fix PHP files with php-cs-fixer.', +\ }, +\ 'pint': { +\ 'function': 'ale#fixers#pint#Fix', +\ 'suggested_filetypes': ['php'], +\ 'description': 'Fix PHP files with Laravel Pint.', +\ }, +\ 'astyle': { +\ 'function': 'ale#fixers#astyle#Fix', +\ 'suggested_filetypes': ['c', 'cpp'], +\ 'description': 'Fix C/C++ with astyle.', +\ }, +\ 'clangtidy': { +\ 'function': 'ale#fixers#clangtidy#Fix', +\ 'suggested_filetypes': ['c', 'cpp', 'objc'], +\ 'description': 'Fix C/C++ and ObjectiveC files with clang-tidy.', +\ }, +\ 'clang-format': { +\ 'function': 'ale#fixers#clangformat#Fix', +\ 'suggested_filetypes': ['c', 'cpp', 'cs', 'cuda', 'java', 'javascript', 'json', 'objc', 'proto'], +\ 'description': 'Fix C, C++, C#, CUDA, Java, JavaScript, JSON, ObjectiveC and Protobuf files with clang-format.', +\ }, +\ 'cmakeformat': { +\ 'function': 'ale#fixers#cmakeformat#Fix', +\ 'suggested_filetypes': ['cmake'], +\ 'description': 'Fix CMake files with cmake-format.', +\ }, +\ 'fish_indent': { +\ 'function': 'ale#fixers#fish_indent#Fix', +\ 'suggested_filetypes': ['fish'], +\ 'description': 'Format fish scripts using fish_indent.', +\ }, +\ 'gofmt': { +\ 'function': 'ale#fixers#gofmt#Fix', +\ 'suggested_filetypes': ['go'], +\ 'description': 'Fix Go files with go fmt.', +\ }, +\ 'gofumpt': { +\ 'function': 'ale#fixers#gofumpt#Fix', +\ 'suggested_filetypes': ['go'], +\ 'description': 'Fix Go files with gofumpt, a stricter go fmt.', +\ }, +\ 'goimports': { +\ 'function': 'ale#fixers#goimports#Fix', +\ 'suggested_filetypes': ['go'], +\ 'description': 'Fix Go files imports with goimports.', +\ }, +\ 'golines': { +\ 'function': 'ale#fixers#golines#Fix', +\ 'suggested_filetypes': ['go'], +\ 'description': 'Fix Go file long lines with golines', +\ }, +\ 'gomod': { +\ 'function': 'ale#fixers#gomod#Fix', +\ 'suggested_filetypes': ['gomod'], +\ 'description': 'Fix Go module files with go mod edit -fmt.', +\ }, +\ 'tslint': { +\ 'function': 'ale#fixers#tslint#Fix', +\ 'suggested_filetypes': ['typescript'], +\ 'description': 'Fix typescript files with tslint --fix.', +\ }, +\ 'rustfmt': { +\ 'function': 'ale#fixers#rustfmt#Fix', +\ 'suggested_filetypes': ['rust'], +\ 'description': 'Fix Rust files with Rustfmt.', +\ }, +\ 'textlint': { +\ 'function': 'ale#fixers#textlint#Fix', +\ 'suggested_filetypes': ['text','markdown','asciidoc','tex'], +\ 'description': 'Fix text files with textlint --fix', +\ }, +\ 'hackfmt': { +\ 'function': 'ale#fixers#hackfmt#Fix', +\ 'suggested_filetypes': ['hack'], +\ 'description': 'Fix Hack files with hackfmt.', +\ }, +\ 'floskell': { +\ 'function': 'ale#fixers#floskell#Fix', +\ 'suggested_filetypes': ['haskell'], +\ 'description': 'Fix Haskell files with floskell.', +\ }, +\ 'hfmt': { +\ 'function': 'ale#fixers#hfmt#Fix', +\ 'suggested_filetypes': ['haskell'], +\ 'description': 'Fix Haskell files with hfmt.', +\ }, +\ 'brittany': { +\ 'function': 'ale#fixers#brittany#Fix', +\ 'suggested_filetypes': ['haskell'], +\ 'description': 'Fix Haskell files with brittany.', +\ }, +\ 'hindent': { +\ 'function': 'ale#fixers#hindent#Fix', +\ 'suggested_filetypes': ['haskell'], +\ 'description': 'Fix Haskell files with hindent.', +\ }, +\ 'hlint': { +\ 'function': 'ale#fixers#hlint#Fix', +\ 'suggested_filetypes': ['haskell'], +\ 'description': 'Refactor Haskell files with hlint.', +\ }, +\ 'stylish-haskell': { +\ 'function': 'ale#fixers#stylish_haskell#Fix', +\ 'suggested_filetypes': ['haskell'], +\ 'description': 'Refactor Haskell files with stylish-haskell.', +\ }, +\ 'purs-tidy': { +\ 'function': 'ale#fixers#purs_tidy#Fix', +\ 'suggested_filetypes': ['purescript'], +\ 'description': 'Format PureScript files with purs-tidy.', +\ }, +\ 'purty': { +\ 'function': 'ale#fixers#purty#Fix', +\ 'suggested_filetypes': ['purescript'], +\ 'description': 'Format PureScript files with purty.', +\ }, +\ 'ocamlformat': { +\ 'function': 'ale#fixers#ocamlformat#Fix', +\ 'suggested_filetypes': ['ocaml', 'ocamlinterface'], +\ 'description': 'Fix OCaml files with ocamlformat.', +\ }, +\ 'ocp-indent': { +\ 'function': 'ale#fixers#ocp_indent#Fix', +\ 'suggested_filetypes': ['ocaml', 'ocamlinterface'], +\ 'description': 'Fix OCaml files with ocp-indent.', +\ }, +\ 'refmt': { +\ 'function': 'ale#fixers#refmt#Fix', +\ 'suggested_filetypes': ['reason'], +\ 'description': 'Fix ReasonML files with refmt.', +\ }, +\ 'pandoc': { +\ 'function': 'ale#fixers#pandoc#Fix', +\ 'suggested_filetypes': ['markdown'], +\ 'description': 'Fix markdown files with pandoc.', +\ }, +\ 'shfmt': { +\ 'function': 'ale#fixers#shfmt#Fix', +\ 'suggested_filetypes': ['sh'], +\ 'description': 'Fix sh files with shfmt.', +\ }, +\ 'sqlfluff': { +\ 'function': 'ale#fixers#sqlfluff#Fix', +\ 'suggested_filetypes': ['sql'], +\ 'description': 'Fix SQL files with sqlfluff.', +\ }, +\ 'sqlfmt': { +\ 'function': 'ale#fixers#sqlfmt#Fix', +\ 'suggested_filetypes': ['sql'], +\ 'description': 'Fix SQL files with sqlfmt.', +\ }, +\ 'sqlformat': { +\ 'function': 'ale#fixers#sqlformat#Fix', +\ 'suggested_filetypes': ['sql'], +\ 'description': 'Fix SQL files with sqlformat.', +\ }, +\ 'google_java_format': { +\ 'function': 'ale#fixers#google_java_format#Fix', +\ 'suggested_filetypes': ['java'], +\ 'description': 'Fix Java files with google-java-format.', +\ }, +\ 'fixjson': { +\ 'function': 'ale#fixers#fixjson#Fix', +\ 'suggested_filetypes': ['json'], +\ 'description': 'Fix JSON files with fixjson.', +\ }, +\ 'jq': { +\ 'function': 'ale#fixers#jq#Fix', +\ 'suggested_filetypes': ['json'], +\ 'description': 'Fix JSON files with jq.', +\ }, +\ 'protolint': { +\ 'function': 'ale#fixers#protolint#Fix', +\ 'suggested_filetypes': ['proto'], +\ 'description': 'Fix Protocol Buffer files with protolint.', +\ }, +\ 'perltidy': { +\ 'function': 'ale#fixers#perltidy#Fix', +\ 'suggested_filetypes': ['perl'], +\ 'description': 'Fix Perl files with perltidy.', +\ }, +\ 'xo': { +\ 'function': 'ale#fixers#xo#Fix', +\ 'suggested_filetypes': ['javascript', 'typescript'], +\ 'description': 'Fix JavaScript/TypeScript files using xo --fix.', +\ }, +\ 'qmlfmt': { +\ 'function': 'ale#fixers#qmlfmt#Fix', +\ 'suggested_filetypes': ['qml'], +\ 'description': 'Fix QML files with qmlfmt.', +\ }, +\ 'dartfmt': { +\ 'function': 'ale#fixers#dartfmt#Fix', +\ 'suggested_filetypes': ['dart'], +\ 'description': 'Fix Dart files with dartfmt.', +\ }, +\ 'dart-format': { +\ 'function': 'ale#fixers#dart_format#Fix', +\ 'suggested_filetypes': ['dart'], +\ 'description': 'Fix Dart files with dart format.', +\ }, +\ 'dotnet-format': { +\ 'function': 'ale#fixers#dotnet_format#Fix', +\ 'suggested_filetypes': ['cs'], +\ 'description': 'Fix C# files with dotnet format.', +\ }, +\ 'xmllint': { +\ 'function': 'ale#fixers#xmllint#Fix', +\ 'suggested_filetypes': ['xml'], +\ 'description': 'Fix XML files with xmllint.', +\ }, +\ 'uncrustify': { +\ 'function': 'ale#fixers#uncrustify#Fix', +\ 'suggested_filetypes': ['c', 'cpp', 'cs', 'objc', 'objcpp', 'd', 'java', 'p', 'vala' ], +\ 'description': 'Fix C, C++, C#, ObjectiveC, ObjectiveC++, D, Java, Pawn, and VALA files with uncrustify.', +\ }, +\ 'terraform': { +\ 'function': 'ale#fixers#terraform#Fix', +\ 'suggested_filetypes': ['hcl', 'terraform'], +\ 'description': 'Fix tf and hcl files with terraform fmt.', +\ }, +\ 'packer': { +\ 'function': 'ale#fixers#packer#Fix', +\ 'suggested_filetypes': ['hcl', 'packer'], +\ 'description': 'Fix Packer HCL files with packer fmt.', +\ }, +\ 'crystal': { +\ 'function': 'ale#fixers#crystal#Fix', +\ 'suggested_filetypes': ['cr'], +\ 'description': 'Fix cr (crystal).', +\ }, +\ 'ktlint': { +\ 'function': 'ale#fixers#ktlint#Fix', +\ 'suggested_filetypes': ['kt', 'kotlin'], +\ 'description': 'Fix Kotlin files with ktlint.', +\ }, +\ 'styler': { +\ 'function': 'ale#fixers#styler#Fix', +\ 'suggested_filetypes': ['r', 'rmarkdown', 'rmd'], +\ 'description': 'Fix R files with styler.', +\ }, +\ 'latexindent': { +\ 'function': 'ale#fixers#latexindent#Fix', +\ 'suggested_filetypes': ['tex'], +\ 'description' : 'Indent code within environments, commands, after headings and within special code blocks.', +\ }, +\ 'pgformatter': { +\ 'function': 'ale#fixers#pgformatter#Fix', +\ 'suggested_filetypes': ['sql'], +\ 'description': 'A PostgreSQL SQL syntax beautifier', +\ }, +\ 'reorder-python-imports': { +\ 'function': 'ale#fixers#reorder_python_imports#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Sort Python imports with reorder-python-imports.', +\ }, +\ 'gnatpp': { +\ 'function': 'ale#fixers#gnatpp#Fix', +\ 'suggested_filetypes': ['ada'], +\ 'description': 'Format Ada files with gnatpp.', +\ }, +\ 'nixfmt': { +\ 'function': 'ale#fixers#nixfmt#Fix', +\ 'suggested_filetypes': ['nix'], +\ 'description': 'A nix formatter written in Haskell.', +\ }, +\ 'nixpkgs-fmt': { +\ 'function': 'ale#fixers#nixpkgsfmt#Fix', +\ 'suggested_filetypes': ['nix'], +\ 'description': 'A formatter for Nix code', +\ }, +\ 'remark-lint': { +\ 'function': 'ale#fixers#remark_lint#Fix', +\ 'suggested_filetypes': ['markdown'], +\ 'description': 'Fix markdown files with remark-lint', +\ }, +\ 'html-beautify': { +\ 'function': 'ale#fixers#html_beautify#Fix', +\ 'suggested_filetypes': ['html', 'htmldjango'], +\ 'description': 'Fix HTML files with html-beautify from js-beautify.', +\ }, +\ 'lua-format': { +\ 'function': 'ale#fixers#lua_format#Fix', +\ 'suggested_filetypes': ['lua'], +\ 'description': 'Fix Lua files with lua-format.', +\ }, +\ 'luafmt': { +\ 'function': 'ale#fixers#luafmt#Fix', +\ 'suggested_filetypes': ['lua'], +\ 'description': 'Fix Lua files with luafmt.', +\ }, +\ 'dprint': { +\ 'function': 'ale#fixers#dprint#Fix', +\ 'suggested_filetypes': ['dockerfile', 'javascript', 'json', 'markdown', 'toml', 'typescript'], +\ 'description': 'Pluggable and configurable code formatting platform', +\ }, +\ 'stylua': { +\ 'function': 'ale#fixers#stylua#Fix', +\ 'suggested_filetypes': ['lua'], +\ 'description': 'Fix Lua files with stylua.', +\ }, +\ 'ormolu': { +\ 'function': 'ale#fixers#ormolu#Fix', +\ 'suggested_filetypes': ['haskell'], +\ 'description': 'A formatter for Haskell source code.', +\ }, +\ 'jsonnetfmt': { +\ 'function': 'ale#fixers#jsonnetfmt#Fix', +\ 'suggested_filetypes': ['jsonnet'], +\ 'description': 'Fix jsonnet files with jsonnetfmt', +\ }, +\ 'ptop': { +\ 'function': 'ale#fixers#ptop#Fix', +\ 'suggested_filetypes': ['pascal'], +\ 'description': 'Fix Pascal files with ptop.', +\ }, +\ 'opafmt': { +\ 'function': 'ale#fixers#opafmt#Fix', +\ 'suggested_filetypes': ['rego'], +\ 'description': 'Fix rego files with opa fmt.', +\ }, +\ 'vfmt': { +\ 'function': 'ale#fixers#vfmt#Fix', +\ 'suggested_filetypes': ['v'], +\ 'description': 'A formatter for V source code.', +\ }, +\ 'zigfmt': { +\ 'function': 'ale#fixers#zigfmt#Fix', +\ 'suggested_filetypes': ['zig'], +\ 'description': 'Official formatter for Zig', +\ }, +\ 'raco_fmt': { +\ 'function': 'ale#fixers#raco_fmt#Fix', +\ 'suggested_filetypes': ['racket'], +\ 'description': 'Fix Racket files with raco fmt.', +\ }, +\ 'ruff': { +\ 'function': 'ale#fixers#ruff#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Fix python files with ruff.', +\ } +\} + +" Reset the function registry to the default entries. +function! ale#fix#registry#ResetToDefaults() abort + let s:entries = deepcopy(s:default_registry) + let s:aliases = {} + + " Set up aliases for fixers too. + for [l:key, l:entry] in items(s:entries) + for l:alias in get(l:entry, 'aliases', []) + let s:aliases[l:alias] = l:key + endfor + endfor +endfunction + +" Set up entries now. +call ale#fix#registry#ResetToDefaults() + +" Remove everything from the registry, useful for tests. +function! ale#fix#registry#Clear() abort + let s:entries = {} + let s:aliases = {} +endfunction + +" Add a function for fixing problems to the registry. +" (name, func, filetypes, desc, aliases) +function! ale#fix#registry#Add(name, func, filetypes, desc, ...) abort + " This command will throw from the sandbox. + let &l:equalprg=&l:equalprg + + if type(a:name) isnot v:t_string + throw '''name'' must be a String' + endif + + if type(a:func) isnot v:t_string + throw '''func'' must be a String' + endif + + if type(a:filetypes) isnot v:t_list + throw '''filetypes'' must be a List' + endif + + for l:type in a:filetypes + if type(l:type) isnot v:t_string + throw 'Each entry of ''filetypes'' must be a String' + endif + endfor + + if type(a:desc) isnot v:t_string + throw '''desc'' must be a String' + endif + + let l:aliases = get(a:000, 0, []) + + if type(l:aliases) isnot v:t_list + \|| !empty(filter(copy(l:aliases), 'type(v:val) isnot v:t_string')) + throw '''aliases'' must be a List of String values' + endif + + let s:entries[a:name] = { + \ 'function': a:func, + \ 'suggested_filetypes': a:filetypes, + \ 'description': a:desc, + \} + + " Set up aliases for the fixer. + if !empty(l:aliases) + let s:entries[a:name].aliases = l:aliases + + for l:alias in l:aliases + let s:aliases[l:alias] = a:name + endfor + endif +endfunction + +" Get a function from the registry by its short name. +function! ale#fix#registry#GetFunc(name) abort + " Use the exact name, or an alias. + let l:resolved_name = !has_key(s:entries, a:name) + \ ? get(s:aliases, a:name, a:name) + \ : a:name + + return get(s:entries, l:resolved_name, {'function': ''}).function +endfunction + +function! s:ShouldSuggestForType(suggested_filetypes, type_list) abort + for l:type in a:type_list + if index(a:suggested_filetypes, l:type) >= 0 + return 1 + endif + endfor + + return 0 +endfunction + +function! s:IsGenericFixer(suggested_filetypes) abort + if empty(a:suggested_filetypes) + return 1 + endif + + return 0 +endfunction + +function! s:FormatEntry(key, entry) abort + let l:aliases_str = '' + + " Show aliases in :ALEFixSuggest if they are there. + if !empty(get(a:entry, 'aliases', [])) + let l:aliases_str = ', ' . join( + \ map(copy(a:entry.aliases), 'string(v:val)'), + \ ',' + \) + endif + + return printf( + \ '%s%s - %s', + \ string(a:key), + \ l:aliases_str, + \ a:entry.description, + \) +endfunction + +" Get list of applicable fixers for filetype, including generic fixers +function! ale#fix#registry#GetApplicableFixers(filetype) abort + let l:type_list = split(a:filetype, '\.') + let l:fixer_name_list = [] + + for l:key in sort(keys(s:entries)) + let l:suggested_filetypes = s:entries[l:key].suggested_filetypes + + if s:IsGenericFixer(l:suggested_filetypes) || s:ShouldSuggestForType(l:suggested_filetypes, l:type_list) + call add(l:fixer_name_list, l:key) + endif + endfor + + return l:fixer_name_list +endfunction + +" Function that returns autocomplete candidates for ALEFix command +function! ale#fix#registry#CompleteFixers(ArgLead, CmdLine, CursorPos) abort + return filter(ale#fix#registry#GetApplicableFixers(&filetype), 'v:val =~? a:ArgLead') +endfunction + +function! ale#fix#registry#SuggestedFixers(filetype) abort + let l:type_list = split(a:filetype, '\.') + let l:filetype_fixer_list = [] + + for l:key in sort(keys(s:entries)) + let l:suggested_filetypes = s:entries[l:key].suggested_filetypes + + if s:ShouldSuggestForType(l:suggested_filetypes, l:type_list) + call add( + \ l:filetype_fixer_list, + \ s:FormatEntry(l:key, s:entries[l:key]), + \) + endif + endfor + + let l:generic_fixer_list = [] + + for l:key in sort(keys(s:entries)) + if s:IsGenericFixer(s:entries[l:key].suggested_filetypes) + call add( + \ l:generic_fixer_list, + \ s:FormatEntry(l:key, s:entries[l:key]), + \) + endif + endfor + + return [l:filetype_fixer_list, l:generic_fixer_list] +endfunction + +" Suggest functions to use from the registry. +function! ale#fix#registry#Suggest(filetype) abort + let l:suggested = ale#fix#registry#SuggestedFixers(a:filetype) + let l:filetype_fixer_list = l:suggested[0] + let l:generic_fixer_list = l:suggested[1] + + let l:filetype_fixer_header = !empty(l:filetype_fixer_list) + \ ? ['Try the following fixers appropriate for the filetype:', ''] + \ : [] + let l:generic_fixer_header = !empty(l:generic_fixer_list) + \ ? ['Try the following generic fixers:', ''] + \ : [] + + let l:has_both_lists = !empty(l:filetype_fixer_list) && !empty(l:generic_fixer_list) + + let l:lines = + \ l:filetype_fixer_header + \ + l:filetype_fixer_list + \ + (l:has_both_lists ? [''] : []) + \ + l:generic_fixer_header + \ + l:generic_fixer_list + + if empty(l:lines) + let l:lines = ['There is nothing in the registry to suggest.'] + else + let l:lines += ['', 'See :help ale-fix-configuration'] + endif + + let l:lines += ['', 'Press q to close this window'] + + new +set\ filetype=ale-fix-suggest + call setline(1, l:lines) + setlocal nomodified + setlocal nomodifiable +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/appleswiftformat.vim b/dot_vim/plugged/ale/autoload/ale/fixers/appleswiftformat.vim new file mode 100644 index 0000000..ca27e82 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/appleswiftformat.vim @@ -0,0 +1,16 @@ +" Author: (bosr) +" Description: Integration of apple/swift-format formatter with ALE. + +function! ale#fixers#appleswiftformat#Fix(buffer) abort + let l:command_args = ale#swift#GetAppleSwiftFormatCommand(a:buffer) . ' format --in-place %t' + let l:config_args = ale#swift#GetAppleSwiftFormatConfigArgs(a:buffer) + + if l:config_args isnot# '' + let l:command_args = l:command_args . ' ' . l:config_args + endif + + return { + \ 'read_temporary_file': 1, + \ 'command': l:command_args, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/astyle.vim b/dot_vim/plugged/ale/autoload/ale/fixers/astyle.vim new file mode 100644 index 0000000..3a5a70a --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/astyle.vim @@ -0,0 +1,59 @@ +" Author: James Kim +" Description: Fix C/C++ files with astyle. + +function! s:set_variables() abort + for l:ft in ['c', 'cpp'] + call ale#Set(l:ft . '_astyle_executable', 'astyle') + call ale#Set(l:ft . '_astyle_project_options', '') + endfor +endfunction + +call s:set_variables() + + +function! ale#fixers#astyle#Var(buffer, name) abort + let l:ft = getbufvar(str2nr(a:buffer), '&filetype') + let l:ft = l:ft =~# 'cpp' ? 'cpp' : 'c' + + return ale#Var(a:buffer, l:ft . '_astyle_' . a:name) +endfunction + +" Try to find a project options file. +function! ale#fixers#astyle#FindProjectOptions(buffer) abort + let l:proj_options = ale#fixers#astyle#Var(a:buffer, 'project_options') + + " If user has set project options variable then use it and skip any searching. + " This would allow users to use project files named differently than .astylerc. + if !empty(l:proj_options) + return l:proj_options + endif + + " Try to find nearest .astylerc file. + let l:proj_options = fnamemodify(ale#path#FindNearestFile(a:buffer, '.astylerc'), ':t') + + if !empty(l:proj_options) + return l:proj_options + endif + + " Try to find nearest _astylerc file. + let l:proj_options = fnamemodify(ale#path#FindNearestFile(a:buffer, '_astylerc'), ':t') + + if !empty(l:proj_options) + return l:proj_options + endif + + " If no project options file is found return an empty string. + return '' +endfunction + +function! ale#fixers#astyle#Fix(buffer) abort + let l:executable = ale#fixers#astyle#Var(a:buffer, 'executable') + let l:proj_options = ale#fixers#astyle#FindProjectOptions(a:buffer) + let l:command = ' --stdin=' . ale#Escape(expand('#' . a:buffer)) + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:proj_options) ? '' : ' --project=' . l:proj_options) + \ . l:command + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/autoflake.vim b/dot_vim/plugged/ale/autoload/ale/fixers/autoflake.vim new file mode 100644 index 0000000..e2ad653 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/autoflake.vim @@ -0,0 +1,28 @@ +" Author: circld +" Description: Fixing files with autoflake. + +call ale#Set('python_autoflake_executable', 'autoflake') +call ale#Set('python_autoflake_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_autoflake_options', '') + +function! ale#fixers#autoflake#Fix(buffer) abort + let l:executable = ale#python#FindExecutable( + \ a:buffer, + \ 'python_autoflake', + \ ['autoflake'], + \) + + if !executable(l:executable) + return 0 + endif + + let l:options = ale#Var(a:buffer, 'python_autoflake_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --in-place ' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/autoimport.vim b/dot_vim/plugged/ale/autoload/ale/fixers/autoimport.vim new file mode 100644 index 0000000..700d36b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/autoimport.vim @@ -0,0 +1,27 @@ +" Author: lyz-code +" Description: Fixing Python imports with autoimport. + +call ale#Set('python_autoimport_executable', 'autoimport') +call ale#Set('python_autoimport_options', '') +call ale#Set('python_autoimport_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale#fixers#autoimport#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'python_autoimport_options') + + let l:executable = ale#python#FindExecutable( + \ a:buffer, + \ 'python_autoimport', + \ ['autoimport'], + \) + + if !executable(l:executable) + return 0 + endif + + return { + \ 'cwd': '%s:h', + \ 'command': ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' -', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/autopep8.vim b/dot_vim/plugged/ale/autoload/ale/fixers/autopep8.vim new file mode 100644 index 0000000..5798d82 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/autopep8.vim @@ -0,0 +1,26 @@ +" Author: w0rp +" Description: Fixing files with autopep8. + +call ale#Set('python_autopep8_executable', 'autopep8') +call ale#Set('python_autopep8_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_autopep8_options', '') + +function! ale#fixers#autopep8#Fix(buffer) abort + let l:executable = ale#python#FindExecutable( + \ a:buffer, + \ 'python_autopep8', + \ ['autopep8'], + \) + + if !executable(l:executable) + return 0 + endif + + let l:options = ale#Var(a:buffer, 'python_autopep8_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' -', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/bibclean.vim b/dot_vim/plugged/ale/autoload/ale/fixers/bibclean.vim new file mode 100644 index 0000000..89cb97a --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/bibclean.vim @@ -0,0 +1,15 @@ +" Author: Horacio Sanson - https://github.com/hsanson +" Description: Support for bibclean fixer for BibTeX files. + +call ale#Set('bib_bibclean_executable', 'bibclean') +call ale#Set('bib_bibclean_options', '-align-equals') + +function! ale#fixers#bibclean#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'bib_bibclean_options') + let l:executable = ale#Var(a:buffer, 'bib_bibclean_executable') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' ' . (empty(l:options) ? '' : l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/black.vim b/dot_vim/plugged/ale/autoload/ale/fixers/black.vim new file mode 100644 index 0000000..4a88c5c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/black.vim @@ -0,0 +1,52 @@ +" Author: w0rp +" Description: Fixing Python files with black. +" +call ale#Set('python_black_executable', 'black') +call ale#Set('python_black_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_black_options', '') +call ale#Set('python_black_auto_pipenv', 0) +call ale#Set('python_black_auto_poetry', 0) +call ale#Set('python_black_change_directory', 1) + +function! ale#fixers#black#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_black_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_black_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_black', ['black']) +endfunction + +function! ale#fixers#black#Fix(buffer) abort + let l:executable = ale#fixers#black#GetExecutable(a:buffer) + let l:cmd = [ale#Escape(l:executable)] + + if l:executable =~? 'pipenv\|poetry$' + call extend(l:cmd, ['run', 'black']) + endif + + let l:options = ale#Var(a:buffer, 'python_black_options') + + if !empty(l:options) + call add(l:cmd, l:options) + endif + + if expand('#' . a:buffer . ':e') is? 'pyi' + call add(l:cmd, '--pyi') + endif + + call add(l:cmd, '-') + + let l:result = {'command': join(l:cmd, ' ')} + + if ale#Var(a:buffer, 'python_black_change_directory') + let l:result.cwd = '%s:h' + endif + + return l:result +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/brittany.vim b/dot_vim/plugged/ale/autoload/ale/fixers/brittany.vim new file mode 100644 index 0000000..c244834 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/brittany.vim @@ -0,0 +1,22 @@ +" Author: eborden , ifyouseewendy , aspidiets +" Description: Integration of brittany with ALE. + +call ale#Set('haskell_brittany_executable', 'brittany') + +function! ale#fixers#brittany#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_brittany_executable') + + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'brittany') +endfunction + +function! ale#fixers#brittany#Fix(buffer) abort + let l:executable = ale#fixers#brittany#GetExecutable(a:buffer) + + return { + \ 'command': l:executable + \ . ' --write-mode inplace' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/buf_format.vim b/dot_vim/plugged/ale/autoload/ale/fixers/buf_format.vim new file mode 100644 index 0000000..c2c156b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/buf_format.vim @@ -0,0 +1,12 @@ +" Author: Alex McKinney +" Description: Run buf format. + +call ale#Set('proto_buf_format_executable', 'buf') + +function! ale#fixers#buf_format#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'proto_buf_format_executable') + + return { + \ 'command': ale#Escape(l:executable) . ' format %t', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/buildifier.vim b/dot_vim/plugged/ale/autoload/ale/fixers/buildifier.vim new file mode 100644 index 0000000..48103b2 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/buildifier.vim @@ -0,0 +1,26 @@ +" Author: Jon Parise +" Description: Format Bazel BUILD and .bzl files with buildifier. +" +call ale#Set('bazel_buildifier_executable', 'buildifier') +call ale#Set('bazel_buildifier_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('bazel_buildifier_options', '') + +function! ale#fixers#buildifier#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'bazel_buildifier', [ + \ 'buildifier', + \]) +endfunction + +function! ale#fixers#buildifier#Fix(buffer) abort + let l:executable = ale#Escape(ale#fixers#buildifier#GetExecutable(a:buffer)) + let l:options = ale#Var(a:buffer, 'bazel_buildifier_options') + let l:filename = ale#Escape(bufname(a:buffer)) + + let l:command = l:executable . ' -mode fix -lint fix -path ' . l:filename + + if l:options isnot# '' + let l:command .= ' ' . l:options + endif + + return {'command': l:command . ' -'} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/clangformat.vim b/dot_vim/plugged/ale/autoload/ale/fixers/clangformat.vim new file mode 100644 index 0000000..81498eb --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/clangformat.vim @@ -0,0 +1,47 @@ +scriptencoding utf-8 +" Author: Peter Renström +" Description: Fixing C/C++ files with clang-format. + +call ale#Set('c_clangformat_executable', 'clang-format') +call ale#Set('c_clangformat_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('c_clangformat_options', '') +call ale#Set('c_clangformat_style_option', '') +call ale#Set('c_clangformat_use_local_file', 0) + +function! ale#fixers#clangformat#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'c_clangformat', [ + \ 'clang-format', + \]) +endfunction + +function! ale#fixers#clangformat#Fix(buffer) abort + let l:executable = ale#Escape(ale#fixers#clangformat#GetExecutable(a:buffer)) + let l:filename = ale#Escape(bufname(a:buffer)) + let l:options = ale#Var(a:buffer, 'c_clangformat_options') + let l:style_option = ale#Var(a:buffer, 'c_clangformat_style_option') + let l:use_local_file = ale#Var(a:buffer, 'c_clangformat_use_local_file') + + if l:style_option isnot# '' + let l:style_option = '-style=' . "'" . l:style_option . "'" + endif + + if l:use_local_file + let l:config = ale#path#FindNearestFile(a:buffer, '.clang-format') + + if !empty(l:config) + let l:style_option = '-style=file' + endif + endif + + if l:style_option isnot# '' + let l:options .= ' ' . l:style_option + endif + + let l:command = l:executable . ' --assume-filename=' . l:filename + + if l:options isnot# '' + let l:command .= ' ' . l:options + endif + + return {'command': l:command} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/clangtidy.vim b/dot_vim/plugged/ale/autoload/ale/fixers/clangtidy.vim new file mode 100644 index 0000000..b37360a --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/clangtidy.vim @@ -0,0 +1,52 @@ +scriptencoding utf-8 +" Author: ObserverOfTime +" Description: Fixing C/C++ files with clang-tidy. + +function! s:set_variables() abort + let l:use_global = get(g:, 'ale_use_global_executables', 0) + + for l:ft in ['c', 'cpp'] + call ale#Set(l:ft . '_clangtidy_executable', 'clang-tidy') + call ale#Set(l:ft . '_clangtidy_use_global', l:use_global) + call ale#Set(l:ft . '_clangtidy_checks', []) + call ale#Set(l:ft . '_clangtidy_options', '') + call ale#Set(l:ft . '_clangtidy_extra_options', '') + call ale#Set(l:ft . '_clangtidy_fix_errors', 1) + endfor + + call ale#Set('c_build_dir', '') +endfunction + +call s:set_variables() + +function! ale#fixers#clangtidy#Var(buffer, name) abort + let l:ft = getbufvar(str2nr(a:buffer), '&filetype') + let l:ft = l:ft =~# 'cpp' ? 'cpp' : 'c' + + return ale#Var(a:buffer, l:ft . '_clangtidy_' . a:name) +endfunction + +function! ale#fixers#clangtidy#GetCommand(buffer) abort + let l:checks = join(ale#fixers#clangtidy#Var(a:buffer, 'checks'), ',') + let l:extra_options = ale#fixers#clangtidy#Var(a:buffer, 'extra_options') + let l:build_dir = ale#c#GetBuildDirectory(a:buffer) + let l:options = empty(l:build_dir) + \ ? ale#fixers#clangtidy#Var(a:buffer, 'options') : '' + let l:fix_errors = ale#fixers#clangtidy#Var(a:buffer, 'fix_errors') + + return ' -fix' . (l:fix_errors ? ' -fix-errors' : '') + \ . (empty(l:checks) ? '' : ' -checks=' . ale#Escape(l:checks)) + \ . (empty(l:extra_options) ? '' : ' ' . l:extra_options) + \ . (empty(l:build_dir) ? '' : ' -p ' . ale#Escape(l:build_dir)) + \ . ' %t' . (empty(l:options) ? '' : ' -- ' . l:options) +endfunction + +function! ale#fixers#clangtidy#Fix(buffer) abort + let l:executable = ale#fixers#clangtidy#Var(a:buffer, 'executable') + let l:command = ale#fixers#clangtidy#GetCommand(a:buffer) + + return { + \ 'command': ale#Escape(l:executable) . l:command, + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/cmakeformat.vim b/dot_vim/plugged/ale/autoload/ale/fixers/cmakeformat.vim new file mode 100644 index 0000000..dcc29cf --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/cmakeformat.vim @@ -0,0 +1,16 @@ +" Author: Attila Maczak +" Description: Integration of cmakeformat with ALE. + +call ale#Set('cmake_cmakeformat_executable', 'cmake-format') +call ale#Set('cmake_cmakeformat_options', '') + +function! ale#fixers#cmakeformat#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'cmake_cmakeformat_executable') + let l:options = ale#Var(a:buffer, 'cmake_cmakeformat_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' -' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/crystal.vim b/dot_vim/plugged/ale/autoload/ale/fixers/crystal.vim new file mode 100644 index 0000000..4ba702b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/crystal.vim @@ -0,0 +1,14 @@ +call ale#Set('crystal_format_executable', 'crystal') +call ale#Set('crystal_format_options', '') + +function! ale#fixers#crystal#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'crystal_format_executable') + let l:options = ale#Var(a:buffer, 'crystal_format_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' tool format' + \ . ale#Pad(l:options) + \ . ' -' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/css_beautify.vim b/dot_vim/plugged/ale/autoload/ale/fixers/css_beautify.vim new file mode 100644 index 0000000..14a837c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/css_beautify.vim @@ -0,0 +1,20 @@ +" Author: https://github.com/Spixmaster +" Description: Format CSS using css-beautify from js-beautify. + +call ale#Set('css_css_beautify_executable', 'css-beautify') +call ale#Set('css_css_beautify_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('css_css_beautify_options', '') + +function! ale#fixers#css_beautify#Fix(buffer) abort + let l:executable = ale#python#FindExecutable( + \ a:buffer, + \ 'css_css_beautify', + \ ['css-beautify'] + \) + + let l:options = ale#Var(a:buffer, 'css_css_beautify_options') + + return { + \ 'command': ale#Escape(l:executable) . ' ' . l:options . ' -', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/dart_format.vim b/dot_vim/plugged/ale/autoload/ale/fixers/dart_format.vim new file mode 100644 index 0000000..4b8f730 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/dart_format.vim @@ -0,0 +1,18 @@ +" Author: ghsang +" Description: Integration of dart format with ALE. + +call ale#Set('dart_format_executable', 'dart') +call ale#Set('dart_format_options', '') + +function! ale#fixers#dart_format#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'dart_format_executable') + let l:options = ale#Var(a:buffer, 'dart_format_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' format' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/dartfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/dartfmt.vim new file mode 100644 index 0000000..0687d6d --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/dartfmt.vim @@ -0,0 +1,18 @@ +" Author: reisub0 +" Description: Integration of dartfmt with ALE. + +call ale#Set('dart_dartfmt_executable', 'dartfmt') +call ale#Set('dart_dartfmt_options', '') + +function! ale#fixers#dartfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'dart_dartfmt_executable') + let l:options = ale#Var(a:buffer, 'dart_dartfmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' -w' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/deno.vim b/dot_vim/plugged/ale/autoload/ale/fixers/deno.vim new file mode 100644 index 0000000..7154c6e --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/deno.vim @@ -0,0 +1,17 @@ +function! ale#fixers#deno#Fix(buffer) abort + let l:executable = ale#handlers#deno#GetExecutable(a:buffer) + + if !executable(l:executable) + return 0 + endif + + let l:options = ' fmt -' + + if ale#Var(a:buffer, 'deno_unstable') + let l:options = l:options . ' --unstable' + endif + + return { + \ 'command': ale#Escape(l:executable) . l:options + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/dfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/dfmt.vim new file mode 100644 index 0000000..0072e04 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/dfmt.vim @@ -0,0 +1,18 @@ +" Author: theoldmoon0602 +" Description: Integration of dfmt with ALE. + +call ale#Set('d_dfmt_executable', 'dfmt') +call ale#Set('d_dfmt_options', '') + +function! ale#fixers#dfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'd_dfmt_executable') + let l:options = ale#Var(a:buffer, 'd_dfmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' -i' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/dhall_format.vim b/dot_vim/plugged/ale/autoload/ale/fixers/dhall_format.vim new file mode 100644 index 0000000..4f12abc --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/dhall_format.vim @@ -0,0 +1,11 @@ +" Author: toastal +" Description: Dhall’s built-in formatter +" +function! ale#fixers#dhall_format#Fix(buffer) abort + let l:executable = ale#dhall#GetExecutableWithOptions(a:buffer) + + return { + \ 'command': l:executable + \ . ' format' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/dhall_freeze.vim b/dot_vim/plugged/ale/autoload/ale/fixers/dhall_freeze.vim new file mode 100644 index 0000000..ff54482 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/dhall_freeze.vim @@ -0,0 +1,14 @@ +" Author: toastal +" Description: Dhall’s package freezing + +call ale#Set('dhall_freeze_options', '') + +function! ale#fixers#dhall_freeze#Freeze(buffer) abort + let l:executable = ale#dhall#GetExecutableWithOptions(a:buffer) + + return { + \ 'command': l:executable + \ . ' freeze' + \ . ale#Pad(ale#Var(a:buffer, 'dhall_freeze_options')) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/dhall_lint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/dhall_lint.vim new file mode 100644 index 0000000..149a658 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/dhall_lint.vim @@ -0,0 +1,11 @@ +" Author: toastal +" Description: Dhall’s built-in linter/formatter + +function! ale#fixers#dhall_lint#Fix(buffer) abort + let l:executable = ale#dhall#GetExecutableWithOptions(a:buffer) + + return { + \ 'command': l:executable + \ . ' lint' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/dotnet_format.vim b/dot_vim/plugged/ale/autoload/ale/fixers/dotnet_format.vim new file mode 100644 index 0000000..b44a28b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/dotnet_format.vim @@ -0,0 +1,18 @@ +" Author: ghsang +" Description: Integration of dotnet format with ALE. + +call ale#Set('cs_dotnet_format_executable', 'dotnet') +call ale#Set('cs_dotnet_format_options', '') + +function! ale#fixers#dotnet_format#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'cs_dotnet_format_executable') + let l:options = ale#Var(a:buffer, 'cs_dotnet_format_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' format' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' --folder --include %t "$(dirname %t)"', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/dprint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/dprint.vim new file mode 100644 index 0000000..99e590d --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/dprint.vim @@ -0,0 +1,29 @@ +call ale#Set('dprint_executable', 'dprint') +call ale#Set('dprint_executable_override', 0) +call ale#Set('dprint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('dprint_options', '') +call ale#Set('dprint_config', 'dprint.json') + +function! ale#fixers#dprint#Fix(buffer) abort + let l:executable = ale#path#FindExecutable(a:buffer, 'dprint', ['dprint']) + let l:executable_override = ale#Var(a:buffer, 'dprint_executable_override') + + if !executable(l:executable) && !l:executable_override + return 0 + endif + + let l:options = ale#Var(a:buffer, 'dprint_options') + let l:config = ale#path#FindNearestFile(a:buffer, ale#Var(a:buffer, 'dprint_config')) + + if !empty(l:config) + let l:options = l:options . ' -c ' . ale#Escape(l:config) + endif + + let l:options = l:options . ' --stdin %s' + + return { + \ 'command': ale#Escape(l:executable) + \ . ' fmt ' + \ . l:options + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/dune.vim b/dot_vim/plugged/ale/autoload/ale/fixers/dune.vim new file mode 100644 index 0000000..6ef7ec9 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/dune.vim @@ -0,0 +1,16 @@ +" Author: Albert Peschar +" Description: Fix files with dune format. + +call ale#Set('ocaml_dune_executable', 'dune') +call ale#Set('ocaml_dune_options', '') + +function! ale#fixers#dune#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'ocaml_dune_executable') + let l:options = ale#Var(a:buffer, 'ocaml_dune_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' format' + \ . (empty(l:options) ? '' : ' ' . l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/elm_format.vim b/dot_vim/plugged/ale/autoload/ale/fixers/elm_format.vim new file mode 100644 index 0000000..a4740db --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/elm_format.vim @@ -0,0 +1,23 @@ +" Author: soywod +" Description: Integration of elm-format with ALE. + +call ale#Set('elm_format_executable', 'elm-format') +call ale#Set('elm_format_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('elm_format_options', '--yes') + +function! ale#fixers#elm_format#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'elm_format', [ + \ 'node_modules/.bin/elm-format', + \]) +endfunction + +function! ale#fixers#elm_format#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'elm_format_options') + + return { + \ 'command': ale#Escape(ale#fixers#elm_format#GetExecutable(a:buffer)) + \ . ' %t' + \ . (empty(l:options) ? '' : ' ' . l:options), + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/erblint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/erblint.vim new file mode 100644 index 0000000..41aca0c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/erblint.vim @@ -0,0 +1,40 @@ +" Author: Roeland Moors - https://github.com/roelandmoors +" Description: ERB Lint, support for https://github.com/Shopify/erb-lint + +call ale#Set('eruby_erblint_executable', 'erblint') +call ale#Set('eruby_erblint_options', '') + + +" Erblint fixer outputs diagnostics first and then the fixed +" output. These are delimited by something like this: +" ================ /path/to/demo.html.erb ================== +" We only need the output after this +function! ale#fixers#erblint#PostProcess(buffer, output) abort + let l:line = 0 + + for l:output in a:output + let l:line = l:line + 1 + + if l:output =~# "^=\\+.*=\\+$" + break + endif + endfor + + return a:output[l:line :] +endfunction + +function! ale#fixers#erblint#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'eruby_erblint_executable') + let l:options = ale#Var(a:buffer, 'eruby_erblint_options') + + return ale#ruby#EscapeExecutable(l:executable, 'erblint') + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --autocorrect --stdin %s' +endfunction + +function! ale#fixers#erblint#Fix(buffer) abort + return { + \ 'command': ale#fixers#erblint#GetCommand(a:buffer), + \ 'process_with': 'ale#fixers#erblint#PostProcess' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/erlfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/erlfmt.vim new file mode 100644 index 0000000..f9951e9 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/erlfmt.vim @@ -0,0 +1,21 @@ +" Author: AntoineGagne - https://github.com/AntoineGagne +" Description: Integration of erlfmt with ALE. + +call ale#Set('erlang_erlfmt_executable', 'erlfmt') +call ale#Set('erlang_erlfmt_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('erlang_erlfmt_options', '') + +function! ale#fixers#erlfmt#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'erlang_erlfmt', ['erlfmt']) +endfunction + +function! ale#fixers#erlfmt#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'erlang_erlfmt_options') + let l:executable = ale#fixers#erlfmt#GetExecutable(a:buffer) + + let l:command = ale#Escape(l:executable) . (empty(l:options) ? '' : ' ' . l:options) . ' %s' + + return { + \ 'command': l:command + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/eslint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/eslint.vim new file mode 100644 index 0000000..c9535cb --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/eslint.vim @@ -0,0 +1,83 @@ +" Author: w0rp +" Description: Fixing files with eslint. + +function! ale#fixers#eslint#Fix(buffer) abort + let l:executable = ale#handlers#eslint#GetExecutable(a:buffer) + let l:command = ale#node#Executable(a:buffer, l:executable) + \ . ' --version' + + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ l:executable, + \ l:command, + \ function('ale#fixers#eslint#ApplyFixForVersion'), + \) +endfunction + +function! ale#fixers#eslint#ProcessFixDryRunOutput(buffer, output) abort + for l:item in ale#util#FuzzyJSONDecode(a:output, []) + return split(get(l:item, 'output', ''), "\n") + endfor + + return [] +endfunction + +function! ale#fixers#eslint#ProcessEslintDOutput(buffer, output) abort + " If the output is an error message, don't use it. + for l:line in a:output[:10] + if l:line =~# '\v^Error:|^Could not connect' + return [] + endif + endfor + + return a:output +endfunction + +function! ale#fixers#eslint#ApplyFixForVersion(buffer, version) abort + let l:executable = ale#handlers#eslint#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'javascript_eslint_options') + + " Use the configuration file from the options, if configured. + if l:options =~# '\v(^| )-c|(^| )--config' + let l:config = '' + let l:has_config = 1 + else + let l:config = ale#handlers#eslint#FindConfig(a:buffer) + let l:has_config = !empty(l:config) + endif + + if !l:has_config + return 0 + endif + + " Use --fix-to-stdout with eslint_d + if l:executable =~# 'eslint_d$' && ale#semver#GTE(a:version, [3, 19, 0]) + return { + \ 'cwd': ale#handlers#eslint#GetCwd(a:buffer), + \ 'command': ale#node#Executable(a:buffer, l:executable) + \ . ale#Pad(l:options) + \ . ' --stdin-filename %s --stdin --fix-to-stdout', + \ 'process_with': 'ale#fixers#eslint#ProcessEslintDOutput', + \} + endif + + " 4.9.0 is the first version with --fix-dry-run + if ale#semver#GTE(a:version, [4, 9, 0]) + return { + \ 'cwd': ale#handlers#eslint#GetCwd(a:buffer), + \ 'command': ale#node#Executable(a:buffer, l:executable) + \ . ale#Pad(l:options) + \ . ' --stdin-filename %s --stdin --fix-dry-run --format=json', + \ 'process_with': 'ale#fixers#eslint#ProcessFixDryRunOutput', + \} + endif + + return { + \ 'cwd': ale#handlers#eslint#GetCwd(a:buffer), + \ 'command': ale#node#Executable(a:buffer, l:executable) + \ . ale#Pad(l:options) + \ . (!empty(l:config) ? ' -c ' . ale#Escape(l:config) : '') + \ . ' --fix %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/fecs.vim b/dot_vim/plugged/ale/autoload/ale/fixers/fecs.vim new file mode 100644 index 0000000..d692bc9 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/fecs.vim @@ -0,0 +1,17 @@ +" Author: harttle +" Description: Apply fecs format to a file. + +function! ale#fixers#fecs#Fix(buffer) abort + let l:executable = ale#handlers#fecs#GetExecutable(a:buffer) + + if !executable(l:executable) + return 0 + endif + + let l:config_options = ' format --replace=true %t' + + return { + \ 'command': ale#Escape(l:executable) . l:config_options, + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/fish_indent.vim b/dot_vim/plugged/ale/autoload/ale/fixers/fish_indent.vim new file mode 100644 index 0000000..ebf17c5 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/fish_indent.vim @@ -0,0 +1,19 @@ +" Author: Chen YuanYuan +" Description: Integration of fish_indent with ALE. + +call ale#Set('fish_fish_indent_executable', 'fish_indent') +call ale#Set('fish_fish_indent_options', '') + +function! ale#fixers#fish_indent#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'fish_fish_indent_executable') + let l:options = ale#Var(a:buffer, 'fish_fish_indent_options') + let l:filename = ale#Escape(bufname(a:buffer)) + + return { + \ 'command': ale#Escape(l:executable) + \ . ' -w ' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/fixjson.vim b/dot_vim/plugged/ale/autoload/ale/fixers/fixjson.vim new file mode 100644 index 0000000..4bad8f9 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/fixjson.vim @@ -0,0 +1,28 @@ +" Author: rhysd +" Description: Integration of fixjson with ALE. + +call ale#Set('json_fixjson_executable', 'fixjson') +call ale#Set('json_fixjson_options', '') +call ale#Set('json_fixjson_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale#fixers#fixjson#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'json_fixjson', [ + \ 'node_modules/.bin/fixjson', + \]) +endfunction + +function! ale#fixers#fixjson#Fix(buffer) abort + let l:executable = ale#Escape(ale#fixers#fixjson#GetExecutable(a:buffer)) + let l:filename = ale#Escape(bufname(a:buffer)) + let l:command = l:executable . ' --stdin-filename ' . l:filename + + let l:options = ale#Var(a:buffer, 'json_fixjson_options') + + if l:options isnot# '' + let l:command .= ' ' . l:options + endif + + return { + \ 'command': l:command + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/floskell.vim b/dot_vim/plugged/ale/autoload/ale/fixers/floskell.vim new file mode 100644 index 0000000..f0015db --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/floskell.vim @@ -0,0 +1,20 @@ +" Author: robertjlooby +" Description: Integration of floskell with ALE. + +call ale#Set('haskell_floskell_executable', 'floskell') + +function! ale#fixers#floskell#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_floskell_executable') + + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'floskell') +endfunction + +function! ale#fixers#floskell#Fix(buffer) abort + let l:executable = ale#fixers#floskell#GetExecutable(a:buffer) + + return { + \ 'command': l:executable + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/generic.vim b/dot_vim/plugged/ale/autoload/ale/fixers/generic.vim new file mode 100644 index 0000000..cb8865b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/generic.vim @@ -0,0 +1,25 @@ +" Author: w0rp +" Description: Generic functions for fixing files with. + +function! ale#fixers#generic#RemoveTrailingBlankLines(buffer, lines) abort + let l:end_index = len(a:lines) - 1 + + while l:end_index > 0 && empty(a:lines[l:end_index]) + let l:end_index -= 1 + endwhile + + return a:lines[:l:end_index] +endfunction + +" Remove all whitespaces at the end of lines +function! ale#fixers#generic#TrimWhitespace(buffer, lines) abort + let l:index = 0 + let l:lines_new = range(len(a:lines)) + + for l:line in a:lines + let l:lines_new[l:index] = substitute(l:line, '\s\+$', '', 'g') + let l:index = l:index + 1 + endfor + + return l:lines_new +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/generic_python.vim b/dot_vim/plugged/ale/autoload/ale/fixers/generic_python.vim new file mode 100644 index 0000000..d55a23c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/generic_python.vim @@ -0,0 +1,75 @@ +" Author: w0rp +" Description: Generic fixer functions for Python. + +" Add blank lines before control statements. +function! ale#fixers#generic_python#AddLinesBeforeControlStatements(buffer, lines) abort + let l:new_lines = [] + let l:last_indent_size = 0 + let l:last_line_is_blank = 0 + let l:in_docstring = 0 + + for l:line in a:lines + let l:indent_size = len(matchstr(l:line, '^ *')) + + if !l:in_docstring + " Make sure it is not just a single line docstring and then verify + " it's starting a new docstring + if match(l:line, '\v^ *("""|'''''').*("""|'''''')') == -1 + \&& match(l:line, '\v^ *("""|'''''')') >= 0 + let l:in_docstring = 1 + endif + else + if match(l:line, '\v^ *.*("""|'''''')') >= 0 + let l:in_docstring = 0 + endif + endif + + if !l:last_line_is_blank + \&& !l:in_docstring + \&& l:indent_size <= l:last_indent_size + \&& match(l:line, '\v^ *(return|if|for|while|break|continue)(\(| |$)') >= 0 + call add(l:new_lines, '') + endif + + call add(l:new_lines, l:line) + let l:last_indent_size = l:indent_size + let l:last_line_is_blank = empty(split(l:line)) + endfor + + return l:new_lines +endfunction + +" This function breaks up long lines so that autopep8 or other tools can +" fix the badly-indented code which is produced as a result. +function! ale#fixers#generic_python#BreakUpLongLines(buffer, lines) abort + " Default to a maximum line length of 79 + let l:max_line_length = 79 + let l:conf = ale#path#FindNearestFile(a:buffer, 'setup.cfg') + + " Read the maximum line length from setup.cfg + if !empty(l:conf) + for l:match in ale#util#GetMatches( + \ readfile(l:conf), + \ '\v^ *max-line-length *\= *(\d+)', + \) + let l:max_line_length = str2nr(l:match[1]) + endfor + endif + + let l:new_list = [] + + for l:line in a:lines + if len(l:line) > l:max_line_length && l:line !~# '# *noqa' + let l:line = substitute(l:line, '\v([(,])([^)])', '\1\n\2', 'g') + let l:line = substitute(l:line, '\v([^(])([)])', '\1,\n\2', 'g') + + for l:split_line in split(l:line, "\n") + call add(l:new_list, l:split_line) + endfor + else + call add(l:new_list, l:line) + endif + endfor + + return l:new_list +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/gnatpp.vim b/dot_vim/plugged/ale/autoload/ale/fixers/gnatpp.vim new file mode 100644 index 0000000..bf3d484 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/gnatpp.vim @@ -0,0 +1,17 @@ +" Author: tim +" Description: Fix files with gnatpp. + +call ale#Set('ada_gnatpp_executable', 'gnatpp') +call ale#Set('ada_gnatpp_options', '') + +function! ale#fixers#gnatpp#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'ada_gnatpp_executable') + let l:options = ale#Var(a:buffer, 'ada_gnatpp_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/gofmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/gofmt.vim new file mode 100644 index 0000000..b9cfbb5 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/gofmt.vim @@ -0,0 +1,16 @@ +" Author: aliou +" Description: Integration of gofmt with ALE. + +call ale#Set('go_gofmt_executable', 'gofmt') +call ale#Set('go_gofmt_options', '') + +function! ale#fixers#gofmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'go_gofmt_executable') + let l:options = ale#Var(a:buffer, 'go_gofmt_options') + let l:env = ale#go#EnvString(a:buffer) + + return { + \ 'command': l:env . ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/gofumpt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/gofumpt.vim new file mode 100644 index 0000000..9975320 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/gofumpt.vim @@ -0,0 +1,17 @@ +" Author: David Houston +" Description: A stricter gofmt implementation. + +call ale#Set('go_gofumpt_executable', 'gofumpt') +call ale#Set('go_gofumpt_options', '') + +function! ale#fixers#gofumpt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'go_gofumpt_executable') + let l:options = ale#Var(a:buffer, 'go_gofumpt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ale#Pad(l:options) + \ . ' -w -- %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/goimports.vim b/dot_vim/plugged/ale/autoload/ale/fixers/goimports.vim new file mode 100644 index 0000000..65f0fd9 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/goimports.vim @@ -0,0 +1,23 @@ +" Author: Jeff Willette +" Description: Integration of goimports with ALE. + +call ale#Set('go_goimports_executable', 'goimports') +call ale#Set('go_goimports_options', '') + +function! ale#fixers#goimports#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'go_goimports_executable') + let l:options = ale#Var(a:buffer, 'go_goimports_options') + let l:env = ale#go#EnvString(a:buffer) + + if !executable(l:executable) + return 0 + endif + + return { + \ 'command': l:env . ale#Escape(l:executable) + \ . ' -l -w -srcdir %s' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/golines.vim b/dot_vim/plugged/ale/autoload/ale/fixers/golines.vim new file mode 100644 index 0000000..9326f48 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/golines.vim @@ -0,0 +1,21 @@ +" Author Pig Frown +" Description: Fix Go files long lines with golines" + +call ale#Set('go_golines_executable', 'golines') + +call ale#Set('go_golines_options', '') + +function! ale#fixers#golines#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'go_golines_executable') + let l:options = ale#Var(a:buffer, 'go_golines_options') + let l:env = ale#go#EnvString(a:buffer) + + if !executable(l:executable) + return 0 + endif + + return { + \ 'command': l:env . ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/gomod.vim b/dot_vim/plugged/ale/autoload/ale/fixers/gomod.vim new file mode 100644 index 0000000..ee8c46c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/gomod.vim @@ -0,0 +1,11 @@ +call ale#Set('go_go_executable', 'go') + +function! ale#fixers#gomod#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'go_go_executable') + let l:env = ale#go#EnvString(a:buffer) + + return { + \ 'command': l:env . ale#Escape(l:executable) . ' mod edit -fmt %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/google_java_format.vim b/dot_vim/plugged/ale/autoload/ale/fixers/google_java_format.vim new file mode 100644 index 0000000..20086c7 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/google_java_format.vim @@ -0,0 +1,23 @@ +" Author: butlerx +" Description: Integration of Google-java-format with ALE. + +call ale#Set('java_google_java_format_executable', 'google-java-format') +call ale#Set('java_google_java_format_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('java_google_java_format_options', '') + +function! ale#fixers#google_java_format#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'java_google_java_format_options') + let l:executable = ale#Var(a:buffer, 'java_google_java_format_executable') + + if !executable(l:executable) + return 0 + endif + + return { + \ 'command': ale#Escape(l:executable) + \ . ' ' . (empty(l:options) ? '' : ' ' . l:options) + \ . ' --replace' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/hackfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/hackfmt.vim new file mode 100644 index 0000000..bf2d4f7 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/hackfmt.vim @@ -0,0 +1,18 @@ +" Author: Sam Howie +" Description: Integration of hackfmt with ALE. + +call ale#Set('hack_hackfmt_executable', 'hackfmt') +call ale#Set('hack_hackfmt_options', '') + +function! ale#fixers#hackfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'hack_hackfmt_executable') + let l:options = ale#Var(a:buffer, 'hack_hackfmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' -i' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/help.vim b/dot_vim/plugged/ale/autoload/ale/fixers/help.vim new file mode 100644 index 0000000..b20740f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/help.vim @@ -0,0 +1,24 @@ +" Author: w0rp +" Description: Generic fixer functions for Vim help documents. + +function! ale#fixers#help#AlignTags(buffer, lines) abort + let l:new_lines = [] + + for l:line in a:lines + if len(l:line) != 79 + let l:match = matchlist(l:line, '\v +(\*[^*]+\*)$') + + if !empty(l:match) + let l:start = l:line[:-len(l:match[0]) - 1] + let l:tag = l:match[1] + let l:spaces = repeat(' ', 79 - len(l:start) - len(l:tag)) + + let l:line = l:start . l:spaces . l:tag + endif + endif + + call add(l:new_lines, l:line) + endfor + + return l:new_lines +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/hfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/hfmt.vim new file mode 100644 index 0000000..0407b71 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/hfmt.vim @@ -0,0 +1,16 @@ +" Author: zack +" Description: Integration of hfmt with ALE. + +call ale#Set('haskell_hfmt_executable', 'hfmt') + +function! ale#fixers#hfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_hfmt_executable') + + return { + \ 'command': ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'hfmt') + \ . ' -w' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/hindent.vim b/dot_vim/plugged/ale/autoload/ale/fixers/hindent.vim new file mode 100644 index 0000000..b6009a2 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/hindent.vim @@ -0,0 +1,20 @@ +" Author: AlexeiDrake +" Description: Integration of hindent formatting with ALE. +" +call ale#Set('haskell_hindent_executable', 'hindent') + +function! ale#fixers#hindent#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_hindent_executable') + + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'hindent') +endfunction + +function! ale#fixers#hindent#Fix(buffer) abort + let l:executable = ale#fixers#hindent#GetExecutable(a:buffer) + + return { + \ 'command': l:executable + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/hlint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/hlint.vim new file mode 100644 index 0000000..88779a5 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/hlint.vim @@ -0,0 +1,13 @@ +" Author: eborden +" Description: Integration of hlint refactor with ALE. +" + +function! ale#fixers#hlint#Fix(buffer) abort + return { + \ 'command': ale#handlers#hlint#GetExecutable(a:buffer) + \ . ' --refactor' + \ . ' --refactor-options="--inplace"' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/html_beautify.vim b/dot_vim/plugged/ale/autoload/ale/fixers/html_beautify.vim new file mode 100644 index 0000000..9817563 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/html_beautify.vim @@ -0,0 +1,20 @@ +" Author: WhyNotHugo +" Description: Format HTML files with html-beautify. + +call ale#Set('html_beautify_executable', 'html-beautify') +call ale#Set('html_beautify_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('html_beautify_options', '') + +function! ale#fixers#html_beautify#Fix(buffer) abort + let l:executable = ale#python#FindExecutable( + \ a:buffer, + \ 'html_beautify', + \ ['html-beautify'] + \) + + let l:options = ale#Var(a:buffer, 'html_beautify_options') + + return { + \ 'command': ale#Escape(l:executable) . ' ' . l:options . ' -', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/importjs.vim b/dot_vim/plugged/ale/autoload/ale/fixers/importjs.vim new file mode 100644 index 0000000..b5487b2 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/importjs.vim @@ -0,0 +1,25 @@ +" Author: Jeff Willette +" Description: Integration of importjs with ALE. + +call ale#Set('javascript_importjs_executable', 'importjs') + +function! ale#fixers#importjs#ProcessOutput(buffer, output) abort + let l:result = ale#util#FuzzyJSONDecode(a:output, []) + + return split(get(l:result, 'fileContent', ''), "\n") +endfunction + +function! ale#fixers#importjs#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'javascript_importjs_executable') + + if !executable(l:executable) + return 0 + endif + + return { + \ 'command': ale#Escape(l:executable) + \ . ' fix' + \ . ' %s', + \ 'process_with': 'ale#fixers#importjs#ProcessOutput', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/isort.vim b/dot_vim/plugged/ale/autoload/ale/fixers/isort.vim new file mode 100644 index 0000000..6eb6a67 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/isort.vim @@ -0,0 +1,71 @@ +" Author: w0rp +" Description: Fixing Python imports with isort. + +call ale#Set('python_isort_executable', 'isort') +call ale#Set('python_isort_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_isort_options', '') +call ale#Set('python_isort_auto_pipenv', 0) +call ale#Set('python_isort_auto_poetry', 0) + +function! ale#fixers#isort#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_isort_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_isort_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_isort', ['isort']) +endfunction + +function! ale#fixers#isort#GetCmd(buffer) abort + let l:executable = ale#fixers#isort#GetExecutable(a:buffer) + let l:cmd = [ale#Escape(l:executable)] + + if l:executable =~? 'pipenv\|poetry$' + call extend(l:cmd, ['run', 'isort']) + endif + + return join(l:cmd, ' ') +endfunction + +function! ale#fixers#isort#FixForVersion(buffer, version) abort + let l:executable = ale#fixers#isort#GetExecutable(a:buffer) + let l:cmd = [ale#Escape(l:executable)] + + if l:executable =~? 'pipenv\|poetry$' + call extend(l:cmd, ['run', 'isort']) + endif + + if ale#semver#GTE(a:version, [5, 7, 0]) + call add(l:cmd, '--filename %s') + endif + + let l:options = ale#Var(a:buffer, 'python_isort_options') + + if !empty(l:options) + call add(l:cmd, l:options) + endif + + call add(l:cmd, '-') + + return { + \ 'cwd': '%s:h', + \ 'command': join(l:cmd, ' '), + \} +endfunction + +function! ale#fixers#isort#Fix(buffer) abort + let l:executable = ale#fixers#isort#GetExecutable(a:buffer) + let l:command = ale#fixers#isort#GetCmd(a:buffer) . ale#Pad('--version') + + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ l:executable, + \ l:command, + \ function('ale#fixers#isort#FixForVersion'), + \) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/jq.vim b/dot_vim/plugged/ale/autoload/ale/fixers/jq.vim new file mode 100644 index 0000000..cd9b913 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/jq.vim @@ -0,0 +1,22 @@ +call ale#Set('json_jq_executable', 'jq') +call ale#Set('json_jq_options', '') +call ale#Set('json_jq_filters', '.') + +function! ale#fixers#jq#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'json_jq_executable') +endfunction + +function! ale#fixers#jq#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'json_jq_options') + let l:filters = ale#Var(a:buffer, 'json_jq_filters') + + if empty(l:filters) + return 0 + endif + + return { + \ 'command': ale#Escape(ale#fixers#jq#GetExecutable(a:buffer)) + \ . ' ' . l:filters . ' ' + \ . l:options, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/jsonnetfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/jsonnetfmt.vim new file mode 100644 index 0000000..f1e41cd --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/jsonnetfmt.vim @@ -0,0 +1,18 @@ +" Authors: Trevor Whitney and Takuya Kosugiyama +" Description: Integration of jsonnetfmt with ALE. + +call ale#Set('jsonnet_jsonnetfmt_executable', 'jsonnetfmt') +call ale#Set('jsonnet_jsonnetfmt_options', '') + +function! ale#fixers#jsonnetfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'jsonnet_jsonnetfmt_executable') + let l:options = ale#Var(a:buffer, 'jsonnet_jsonnetfmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' -i' + \ . ale#Pad(l:options) + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/ktlint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/ktlint.vim new file mode 100644 index 0000000..64d1340 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/ktlint.vim @@ -0,0 +1,8 @@ +" Author: Michael Phillips +" Description: Fix Kotlin files with ktlint. + +function! ale#fixers#ktlint#Fix(buffer) abort + return { + \ 'command': ale#handlers#ktlint#GetCommand(a:buffer) . ' --format' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/latexindent.vim b/dot_vim/plugged/ale/autoload/ale/fixers/latexindent.vim new file mode 100644 index 0000000..54f1231 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/latexindent.vim @@ -0,0 +1,16 @@ +" Author: riley-martine +" Description: Integration of latexindent with ALE. + +call ale#Set('tex_latexindent_executable', 'latexindent') +call ale#Set('tex_latexindent_options', '') + +function! ale#fixers#latexindent#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'tex_latexindent_executable') + let l:options = ale#Var(a:buffer, 'tex_latexindent_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' -l' + \ . (empty(l:options) ? '' : ' ' . l:options) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/lua_format.vim b/dot_vim/plugged/ale/autoload/ale/fixers/lua_format.vim new file mode 100644 index 0000000..98b155c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/lua_format.vim @@ -0,0 +1,16 @@ +" Author: Mathias Jean Johansen +" Description: Integration of LuaFormatter with ALE. + +call ale#Set('lua_lua_format_executable', 'lua-format') +call ale#Set('lua_lua_format_options', '') + +function! ale#fixers#lua_format#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'lua_lua_format_executable') + let l:options = ale#Var(a:buffer, 'lua_lua_format_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ale#Pad(l:options) + \ . ' -i', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/luafmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/luafmt.vim new file mode 100644 index 0000000..6cb9ef4 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/luafmt.vim @@ -0,0 +1,13 @@ +call ale#Set('lua_luafmt_executable', 'luafmt') +call ale#Set('lua_luafmt_options', '') + +function! ale#fixers#luafmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'lua_luafmt_executable') + let l:options = ale#Var(a:buffer, 'lua_luafmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' --stdin', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/mix_format.vim b/dot_vim/plugged/ale/autoload/ale/fixers/mix_format.vim new file mode 100644 index 0000000..7a09170 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/mix_format.vim @@ -0,0 +1,25 @@ +" Author: carakan , Fernando Mendes +" Description: Fixing files with elixir formatter 'mix format'. + +call ale#Set('elixir_mix_executable', 'mix') +call ale#Set('elixir_mix_format_options', '') + +function! ale#fixers#mix_format#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'elixir_mix_executable') +endfunction + +function! ale#fixers#mix_format#GetCommand(buffer) abort + let l:executable = ale#Escape(ale#fixers#mix_format#GetExecutable(a:buffer)) + let l:options = ale#Var(a:buffer, 'elixir_mix_format_options') + + return l:executable . ' format' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %t' +endfunction + +function! ale#fixers#mix_format#Fix(buffer) abort + return { + \ 'command': ale#fixers#mix_format#GetCommand(a:buffer), + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/nimpretty.vim b/dot_vim/plugged/ale/autoload/ale/fixers/nimpretty.vim new file mode 100644 index 0000000..fe2e713 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/nimpretty.vim @@ -0,0 +1,15 @@ +" Author: Nhan +" Description: Integration of nimpretty with ALE. + +call ale#Set('nim_nimpretty_executable', 'nimpretty') +call ale#Set('nim_nimpretty_options', '--maxLineLen:80') + +function! ale#fixers#nimpretty#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'nim_nimpretty_executable') + let l:options = ale#Var(a:buffer, 'nim_nimpretty_options') + + return { + \ 'command': ale#Escape(l:executable) . ' %t' . ale#Pad(l:options), + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/nixfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/nixfmt.vim new file mode 100644 index 0000000..4a548b2 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/nixfmt.vim @@ -0,0 +1,15 @@ +scriptencoding utf-8 +" Author: houstdav000 +" Description: Fix files with nixfmt + +call ale#Set('nix_nixfmt_executable', 'nixfmt') +call ale#Set('nix_nixfmt_options', '') + +function! ale#fixers#nixfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'nix_nixfmt_executable') + let l:options = ale#Var(a:buffer, 'nix_nixfmt_options') + + return { + \ 'command': ale#Escape(l:executable) . ale#Pad(l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/nixpkgsfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/nixpkgsfmt.vim new file mode 100644 index 0000000..403ce79 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/nixpkgsfmt.vim @@ -0,0 +1,12 @@ +call ale#Set('nix_nixpkgsfmt_executable', 'nixpkgs-fmt') +call ale#Set('nix_nixpkgsfmt_options', '') + +function! ale#fixers#nixpkgsfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'nix_nixpkgsfmt_executable') + let l:options = ale#Var(a:buffer, 'nix_nixpkgsfmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/ocamlformat.vim b/dot_vim/plugged/ale/autoload/ale/fixers/ocamlformat.vim new file mode 100644 index 0000000..b12d2eb --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/ocamlformat.vim @@ -0,0 +1,17 @@ +" Author: Stephen Lumenta <@sbl> +" Description: Integration of ocamlformat with ALE. + +call ale#Set('ocaml_ocamlformat_executable', 'ocamlformat') +call ale#Set('ocaml_ocamlformat_options', '') + +function! ale#fixers#ocamlformat#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'ocaml_ocamlformat_executable') + let l:options = ale#Var(a:buffer, 'ocaml_ocamlformat_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' --name=%s' + \ . ' -' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/ocp_indent.vim b/dot_vim/plugged/ale/autoload/ale/fixers/ocp_indent.vim new file mode 100644 index 0000000..e1b047b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/ocp_indent.vim @@ -0,0 +1,18 @@ +" Author: Kanenobu Mitsuru +" Description: Integration of ocp-indent with ALE. + +call ale#Set('ocaml_ocp_indent_executable', 'ocp-indent') +call ale#Set('ocaml_ocp_indent_options', '') +call ale#Set('ocaml_ocp_indent_config', '') + +function! ale#fixers#ocp_indent#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'ocaml_ocp_indent_executable') + let l:config = ale#Var(a:buffer, 'ocaml_ocp_indent_config') + let l:options = ale#Var(a:buffer, 'ocaml_ocp_indent_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:config) ? '' : ' --config=' . ale#Escape(l:config)) + \ . (empty(l:options) ? '': ' ' . l:options) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/opafmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/opafmt.vim new file mode 100644 index 0000000..a0999b7 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/opafmt.vim @@ -0,0 +1,15 @@ +" Description: Fixer for rego files + +call ale#Set('opa_fmt_executable', 'opa') +call ale#Set('opa_fmt_options', '') + +function! ale#fixers#opafmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'opa_fmt_executable') + let l:options = ale#Var(a:buffer, 'opa_fmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' fmt' + \ . (empty(l:options) ? '' : ' ' . l:options) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/ormolu.vim b/dot_vim/plugged/ale/autoload/ale/fixers/ormolu.vim new file mode 100644 index 0000000..69b55c1 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/ormolu.vim @@ -0,0 +1,12 @@ +call ale#Set('haskell_ormolu_executable', 'ormolu') +call ale#Set('haskell_ormolu_options', '') + +function! ale#fixers#ormolu#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_ormolu_executable') + let l:options = ale#Var(a:buffer, 'haskell_ormolu_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/packer.vim b/dot_vim/plugged/ale/autoload/ale/fixers/packer.vim new file mode 100644 index 0000000..8770550 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/packer.vim @@ -0,0 +1,17 @@ +" Author: Zhuoyun Wei +" Description: Fixer for Packer HCL files + +call ale#Set('packer_fmt_executable', 'packer') +call ale#Set('packer_fmt_options', '') + +function! ale#fixers#packer#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'packer_fmt_executable') + let l:options = ale#Var(a:buffer, 'packer_fmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' fmt' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' -' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/pandoc.vim b/dot_vim/plugged/ale/autoload/ale/fixers/pandoc.vim new file mode 100644 index 0000000..d704c8a --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/pandoc.vim @@ -0,0 +1,16 @@ +scriptencoding utf-8 +" Author: Jesse Hathaway +" Description: Fix markdown files with pandoc. + +call ale#Set('markdown_pandoc_executable', 'pandoc') +call ale#Set('markdown_pandoc_options', '-f gfm -t gfm -s -') + +function! ale#fixers#pandoc#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'markdown_pandoc_executable') + let l:options = ale#Var(a:buffer, 'markdown_pandoc_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' ' . l:options, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/perltidy.vim b/dot_vim/plugged/ale/autoload/ale/fixers/perltidy.vim new file mode 100644 index 0000000..a55a572 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/perltidy.vim @@ -0,0 +1,18 @@ +" Author: kfly8 +" Description: Integration of perltidy with ALE. + +call ale#Set('perl_perltidy_executable', 'perltidy') +call ale#Set('perl_perltidy_options', '') + +function! ale#fixers#perltidy#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'perl_perltidy_executable') + let l:options = ale#Var(a:buffer, 'perl_perltidy_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' -b' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/pgformatter.vim b/dot_vim/plugged/ale/autoload/ale/fixers/pgformatter.vim new file mode 100644 index 0000000..9ea08ec --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/pgformatter.vim @@ -0,0 +1,12 @@ +call ale#Set('sql_pgformatter_executable', 'pg_format') +call ale#Set('sql_pgformatter_options', '') + +function! ale#fixers#pgformatter#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'sql_pgformatter_executable') + let l:options = ale#Var(a:buffer, 'sql_pgformatter_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/php_cs_fixer.vim b/dot_vim/plugged/ale/autoload/ale/fixers/php_cs_fixer.vim new file mode 100644 index 0000000..c8f9c7b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/php_cs_fixer.vim @@ -0,0 +1,24 @@ +" Author: Julien Deniau +" Description: Fixing files with php-cs-fixer. + +call ale#Set('php_cs_fixer_executable', 'php-cs-fixer') +call ale#Set('php_cs_fixer_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('php_cs_fixer_options', '') + +function! ale#fixers#php_cs_fixer#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'php_cs_fixer', [ + \ 'vendor/bin/php-cs-fixer', + \ 'php-cs-fixer' + \]) +endfunction + +function! ale#fixers#php_cs_fixer#Fix(buffer) abort + let l:executable = ale#fixers#php_cs_fixer#GetExecutable(a:buffer) + + return { + \ 'command': ale#Escape(l:executable) + \ . ' ' . ale#Var(a:buffer, 'php_cs_fixer_options') + \ . ' fix %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/phpcbf.vim b/dot_vim/plugged/ale/autoload/ale/fixers/phpcbf.vim new file mode 100644 index 0000000..494bf34 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/phpcbf.vim @@ -0,0 +1,26 @@ +" Author: notomo +" Description: Fixing files with phpcbf. + +call ale#Set('php_phpcbf_standard', '') +call ale#Set('php_phpcbf_options', '') +call ale#Set('php_phpcbf_executable', 'phpcbf') +call ale#Set('php_phpcbf_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale#fixers#phpcbf#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'php_phpcbf', [ + \ 'vendor/bin/phpcbf', + \ 'phpcbf' + \]) +endfunction + +function! ale#fixers#phpcbf#Fix(buffer) abort + let l:executable = ale#fixers#phpcbf#GetExecutable(a:buffer) + let l:standard = ale#Var(a:buffer, 'php_phpcbf_standard') + let l:standard_option = !empty(l:standard) + \ ? '--standard=' . l:standard + \ : '' + + return { + \ 'command': ale#Escape(l:executable) . ' --stdin-path=%s ' . l:standard_option . ale#Pad(ale#Var(a:buffer, 'php_phpcbf_options')) . ' -' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/pint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/pint.vim new file mode 100644 index 0000000..274ddd9 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/pint.vim @@ -0,0 +1,25 @@ +" Author: Michael Dyrynda +" Description: Fixing files with Laravel Pint. + +call ale#Set('php_pint_executable', 'pint') +call ale#Set('php_pint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('php_pint_options', '') + +function! ale#fixers#pint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'php_pint', [ + \ 'vendor/bin/pint', + \ 'pint' + \]) +endfunction + +function! ale#fixers#pint#Fix(buffer) abort + let l:executable = ale#fixers#pint#GetExecutable(a:buffer) + + return { + \ 'command': ale#Escape(l:executable) + \ . ' ' . ale#Var(a:buffer, 'php_pint_options') + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/prettier.vim b/dot_vim/plugged/ale/autoload/ale/fixers/prettier.vim new file mode 100644 index 0000000..8a67e2f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/prettier.vim @@ -0,0 +1,124 @@ +" Author: tunnckoCore (Charlike Mike Reagent) , +" w0rp , morhetz (Pavel Pertsev) +" Description: Integration of Prettier with ALE. + +call ale#Set('javascript_prettier_executable', 'prettier') +call ale#Set('javascript_prettier_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('javascript_prettier_options', '') + +function! ale#fixers#prettier#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'javascript_prettier', [ + \ 'node_modules/.bin/prettier_d', + \ 'node_modules/prettier-cli/index.js', + \ 'node_modules/.bin/prettier', + \]) +endfunction + +function! ale#fixers#prettier#Fix(buffer) abort + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ ale#fixers#prettier#GetExecutable(a:buffer), + \ '%e --version', + \ function('ale#fixers#prettier#ApplyFixForVersion'), + \) +endfunction + +function! ale#fixers#prettier#ProcessPrettierDOutput(buffer, output) abort + " If the output is an error message, don't use it. + for l:line in a:output[:10] + if l:line =~# '^\w*Error:' + return [] + endif + endfor + + return a:output +endfunction + +function! ale#fixers#prettier#GetCwd(buffer) abort + let l:config = ale#path#FindNearestFile(a:buffer, '.prettierignore') + + " Fall back to the directory of the buffer + return !empty(l:config) ? fnamemodify(l:config, ':h') : '%s:h' +endfunction + +function! ale#fixers#prettier#ApplyFixForVersion(buffer, version) abort + let l:executable = ale#fixers#prettier#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'javascript_prettier_options') + let l:parser = '' + + let l:filetypes = split(getbufvar(a:buffer, '&filetype'), '\.') + + if index(l:filetypes, 'handlebars') > -1 + let l:parser = 'glimmer' + endif + + " Append the --parser flag depending on the current filetype (unless it's + " already set in g:javascript_prettier_options). + if empty(expand('#' . a:buffer . ':e')) && l:parser is# '' && match(l:options, '--parser') == -1 + " Mimic Prettier's defaults. In cases without a file extension or + " filetype (scratch buffer), Prettier needs `parser` set to know how + " to process the buffer. + if ale#semver#GTE(a:version, [1, 16, 0]) + let l:parser = 'babel' + else + let l:parser = 'babylon' + endif + + let l:prettier_parsers = { + \ 'typescript': 'typescript', + \ 'css': 'css', + \ 'less': 'less', + \ 'scss': 'scss', + \ 'json': 'json', + \ 'json5': 'json5', + \ 'graphql': 'graphql', + \ 'markdown': 'markdown', + \ 'vue': 'vue', + \ 'svelte': 'svelte', + \ 'yaml': 'yaml', + \ 'openapi': 'yaml', + \ 'html': 'html', + \ 'ruby': 'ruby', + \} + + for l:filetype in l:filetypes + if has_key(l:prettier_parsers, l:filetype) + let l:parser = l:prettier_parsers[l:filetype] + break + endif + endfor + endif + + if !empty(l:parser) + let l:options = (!empty(l:options) ? l:options . ' ' : '') . '--parser ' . l:parser + endif + + " Special error handling needed for prettier_d + if l:executable =~# 'prettier_d$' + return { + \ 'cwd': '%s:h', + \ 'command':ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --stdin-filepath %s --stdin', + \ 'process_with': 'ale#fixers#prettier#ProcessPrettierDOutput', + \} + endif + + " 1.4.0 is the first version with --stdin-filepath + if ale#semver#GTE(a:version, [1, 4, 0]) + return { + \ 'cwd': ale#fixers#prettier#GetCwd(a:buffer), + \ 'command': ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --stdin-filepath %s --stdin', + \} + endif + + return { + \ 'command': ale#Escape(l:executable) + \ . ' %t' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --write', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/prettier_eslint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/prettier_eslint.vim new file mode 100644 index 0000000..0b9c88b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/prettier_eslint.vim @@ -0,0 +1,56 @@ +" Author: tunnckoCore (Charlike Mike Reagent) , +" w0rp , morhetz (Pavel Pertsev) +" Description: Integration between Prettier and ESLint. + +call ale#Set('javascript_prettier_eslint_executable', 'prettier-eslint') +call ale#Set('javascript_prettier_eslint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('javascript_prettier_eslint_options', '') + +function! ale#fixers#prettier_eslint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'javascript_prettier_eslint', [ + \ 'node_modules/prettier-eslint-cli/dist/index.js', + \ 'node_modules/.bin/prettier-eslint', + \]) +endfunction + +function! ale#fixers#prettier_eslint#Fix(buffer) abort + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ ale#fixers#prettier_eslint#GetExecutable(a:buffer), + \ '%e --version', + \ function('ale#fixers#prettier_eslint#ApplyFixForVersion'), + \) +endfunction + +function! ale#fixers#prettier_eslint#ApplyFixForVersion(buffer, version) abort + let l:options = ale#Var(a:buffer, 'javascript_prettier_eslint_options') + let l:executable = ale#fixers#prettier_eslint#GetExecutable(a:buffer) + + " 4.2.0 is the first version with --eslint-config-path + let l:config = ale#semver#GTE(a:version, [4, 2, 0]) + \ ? ale#handlers#eslint#FindConfig(a:buffer) + \ : '' + let l:eslint_config_option = !empty(l:config) + \ ? ' --eslint-config-path ' . ale#Escape(l:config) + \ : '' + + " 4.4.0 is the first version with --stdin-filepath + if ale#semver#GTE(a:version, [4, 4, 0]) + return { + \ 'cwd': '%s:h', + \ 'command': ale#Escape(l:executable) + \ . l:eslint_config_option + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --stdin-filepath %s --stdin', + \} + endif + + return { + \ 'command': ale#Escape(l:executable) + \ . ' %t' + \ . l:eslint_config_option + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --write', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/prettier_standard.vim b/dot_vim/plugged/ale/autoload/ale/fixers/prettier_standard.vim new file mode 100644 index 0000000..c8c09e3 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/prettier_standard.vim @@ -0,0 +1,24 @@ +" Author: sheerun (Adam Stankiewicz) +" Description: Integration of Prettier Standard with ALE. + +call ale#Set('javascript_prettier_standard_executable', 'prettier-standard') +call ale#Set('javascript_prettier_standard_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('javascript_prettier_standard_options', '') + +function! ale#fixers#prettier_standard#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'javascript_prettier_standard', [ + \ 'node_modules/prettier-standard/lib/index.js', + \ 'node_modules/.bin/prettier-standard', + \]) +endfunction + +function! ale#fixers#prettier_standard#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'javascript_prettier_standard_options') + + return { + \ 'command': ale#Escape(ale#fixers#prettier_standard#GetExecutable(a:buffer)) + \ . ' --stdin' + \ . ' --stdin-filepath=%s' + \ . ' ' . l:options, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/protolint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/protolint.vim new file mode 100644 index 0000000..9b8e72f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/protolint.vim @@ -0,0 +1,26 @@ +" Author: Yohei Yoshimuta +" Description: Integration of protolint with ALE. + +call ale#Set('proto_protolint_executable', 'protolint') +call ale#Set('proto_protolint_config', '') + +function! ale#fixers#protolint#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'proto_protolint_executable') + + return ale#Escape(l:executable) +endfunction + +function! ale#fixers#protolint#Fix(buffer) abort + let l:executable = ale#fixers#protolint#GetExecutable(a:buffer) + let l:config = ale#Var(a:buffer, 'proto_protolint_config') + + return { + \ 'command': l:executable + \ . (!empty(l:config) ? ' -config_path=' . ale#Escape(l:config) : '') + \ . ' -fix' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction + + diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/ptop.vim b/dot_vim/plugged/ale/autoload/ale/fixers/ptop.vim new file mode 100644 index 0000000..9834522 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/ptop.vim @@ -0,0 +1,17 @@ +" Author: BarrOff https://github.com/BarrOff +" Description: Integration of ptop with ALE. + +call ale#Set('pascal_ptop_executable', 'ptop') +call ale#Set('pascal_ptop_options', '') + +function! ale#fixers#ptop#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'pascal_ptop_executable') + let l:options = ale#Var(a:buffer, 'pascal_ptop_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %s %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/puppetlint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/puppetlint.vim new file mode 100644 index 0000000..bf36e48 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/puppetlint.vim @@ -0,0 +1,22 @@ +" Author: Alexander Olofsson +" Description: puppet-lint fixer + +if !exists('g:ale_puppet_puppetlint_executable') + let g:ale_puppet_puppetlint_executable = 'puppet-lint' +endif + +if !exists('g:ale_puppet_puppetlint_options') + let g:ale_puppet_puppetlint_options = '' +endif + +function! ale#fixers#puppetlint#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'puppet_puppetlint_executable') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' ' . ale#Var(a:buffer, 'puppet_puppetlint_options') + \ . ' --fix' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/purs_tidy.vim b/dot_vim/plugged/ale/autoload/ale/fixers/purs_tidy.vim new file mode 100644 index 0000000..09fa631 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/purs_tidy.vim @@ -0,0 +1,24 @@ +" Author: toastal +" Description: Integration of purs-tidy with ALE. + +call ale#Set('purescript_tidy_executable', 'purs-tidy') +call ale#Set('purescript_tidy_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('purescript_tidy_options', '') + +function! ale#fixers#purs_tidy#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'purescript_tidy', [ + \ 'node_modules/purescript-tidy/bin/index.js', + \ 'node_modules/.bin/purs-tidy', + \]) +endfunction + +function! ale#fixers#purs_tidy#Fix(buffer) abort + let l:executable = ale#fixers#purs_tidy#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'purescript_tidy_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' format' + \ . ale#Pad(l:options) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/purty.vim b/dot_vim/plugged/ale/autoload/ale/fixers/purty.vim new file mode 100644 index 0000000..46d2cac --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/purty.vim @@ -0,0 +1,22 @@ +" Author: iclanzan +" Description: Integration of purty with ALE. + +call ale#Set('purescript_purty_executable', 'purty') + +function! ale#fixers#purty#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'purescript_purty_executable') + + return ale#Escape(l:executable) +endfunction + +function! ale#fixers#purty#Fix(buffer) abort + let l:executable = ale#fixers#purty#GetExecutable(a:buffer) + + return { + \ 'command': l:executable + \ . ' --write' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/pyflyby.vim b/dot_vim/plugged/ale/autoload/ale/fixers/pyflyby.vim new file mode 100644 index 0000000..81c0f05 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/pyflyby.vim @@ -0,0 +1,41 @@ +" Author: infokiller +" Description: Tidy imports using pyflyby's tidy-import script +" https://github.com/deshaw/pyflyby + +call ale#Set('python_pyflyby_executable', 'tidy-imports') +call ale#Set('python_pyflyby_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_pyflyby_options', '') +call ale#Set('python_pyflyby_auto_pipenv', 0) +call ale#Set('python_pyflyby_auto_poetry', 0) + +function! ale#fixers#pyflyby#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_pyflyby_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_pyflyby_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_pyflyby', ['tidy-imports']) +endfunction + +function! ale#fixers#pyflyby#Fix(buffer) abort + " let l:executable = ale#fixers#pyflyby#GetExecutable(a:buffer) + let l:executable = ale#fixers#pyflyby#GetExecutable(a:buffer) + let l:cmd = [ale#Escape(l:executable)] + + if l:executable =~? 'pipenv\|poetry$' + call extend(l:cmd, ['run', 'tidy-imports']) + endif + + let l:options = ale#Var(a:buffer, 'python_pyflyby_options') + + if !empty(l:options) + call add(l:cmd, l:options) + endif + + return {'command': join(l:cmd, ' ')} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/qmlfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/qmlfmt.vim new file mode 100644 index 0000000..90b2567 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/qmlfmt.vim @@ -0,0 +1,11 @@ +call ale#Set('qml_qmlfmt_executable', 'qmlfmt') + +function! ale#fixers#qmlfmt#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'qml_qmlfmt_executable') +endfunction + +function! ale#fixers#qmlfmt#Fix(buffer) abort + return { + \ 'command': ale#Escape(ale#fixers#qmlfmt#GetExecutable(a:buffer)), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/raco_fmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/raco_fmt.vim new file mode 100644 index 0000000..16cf446 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/raco_fmt.vim @@ -0,0 +1,15 @@ +" Author: Jeremy Cantrell +" Description: Integration of raco fmt with ALE. + +call ale#Set('racket_raco_fmt_executable', 'raco') +call ale#Set('racket_raco_fmt_options', '') + +function! ale#fixers#raco_fmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'racket_raco_fmt_executable') + let l:options = ale#Var(a:buffer, 'racket_raco_fmt_options') + + return { + \ 'command': ale#Escape(l:executable) . ' fmt' + \ . (empty(l:options) ? '' : ' ' . l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/refmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/refmt.vim new file mode 100644 index 0000000..514f950 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/refmt.vim @@ -0,0 +1,18 @@ +" Author: Ahmed El Gabri <@ahmedelgabri> +" Description: Integration of refmt with ALE. + +call ale#Set('reasonml_refmt_executable', 'refmt') +call ale#Set('reasonml_refmt_options', '') + +function! ale#fixers#refmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'reasonml_refmt_executable') + let l:options = ale#Var(a:buffer, 'reasonml_refmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' --in-place' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/remark_lint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/remark_lint.vim new file mode 100644 index 0000000..85593b4 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/remark_lint.vim @@ -0,0 +1,24 @@ +" Author: blyoa +" Description: Fixing files with remark-lint. + +call ale#Set('markdown_remark_lint_executable', 'remark') +call ale#Set('markdown_remark_lint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('markdown_remark_lint_options', '') + +function! ale#fixers#remark_lint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'markdown_remark_lint', [ + \ 'node_modules/remark-cli/cli.js', + \ 'node_modules/.bin/remark', + \]) +endfunction + +function! ale#fixers#remark_lint#Fix(buffer) abort + let l:executable = ale#fixers#remark_lint#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'markdown_remark_lint_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : ''), + \} +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/reorder_python_imports.vim b/dot_vim/plugged/ale/autoload/ale/fixers/reorder_python_imports.vim new file mode 100644 index 0000000..42a0a6e --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/reorder_python_imports.vim @@ -0,0 +1,25 @@ +" Author: jake +" Description: Fixing Python imports with reorder-python-imports. + +call ale#Set('python_reorder_python_imports_executable', 'reorder-python-imports') +call ale#Set('python_reorder_python_imports_options', '') +call ale#Set('python_reorder_python_imports_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale#fixers#reorder_python_imports#Fix(buffer) abort + let l:executable = ale#python#FindExecutable( + \ a:buffer, + \ 'python_reorder_python_imports', + \ ['reorder-python-imports'], + \) + + if !executable(l:executable) + return 0 + endif + + let l:options = ale#Var(a:buffer, 'python_reorder_python_imports_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') . ' -', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/rubocop.vim b/dot_vim/plugged/ale/autoload/ale/fixers/rubocop.vim new file mode 100644 index 0000000..5a1b795 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/rubocop.vim @@ -0,0 +1,38 @@ +call ale#Set('ruby_rubocop_options', '') +call ale#Set('ruby_rubocop_auto_correct_all', 0) +call ale#Set('ruby_rubocop_executable', 'rubocop') + +" Rubocop fixer outputs diagnostics first and then the fixed +" output. These are delimited by a "=======" string that we +" look for to remove everything before it. +function! ale#fixers#rubocop#PostProcess(buffer, output) abort + let l:line = 0 + + for l:output in a:output + let l:line = l:line + 1 + + if l:output =~# "^=\\+$" + break + endif + endfor + + return a:output[l:line :] +endfunction + +function! ale#fixers#rubocop#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'ruby_rubocop_executable') + let l:options = ale#Var(a:buffer, 'ruby_rubocop_options') + let l:auto_correct_all = ale#Var(a:buffer, 'ruby_rubocop_auto_correct_all') + + return ale#ruby#EscapeExecutable(l:executable, 'rubocop') + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . (l:auto_correct_all ? ' --auto-correct-all' : ' --auto-correct') + \ . ' --force-exclusion --stdin %s' +endfunction + +function! ale#fixers#rubocop#Fix(buffer) abort + return { + \ 'command': ale#fixers#rubocop#GetCommand(a:buffer), + \ 'process_with': 'ale#fixers#rubocop#PostProcess' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/ruff.vim b/dot_vim/plugged/ale/autoload/ale/fixers/ruff.vim new file mode 100644 index 0000000..56bcf3d --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/ruff.vim @@ -0,0 +1,89 @@ +" Author: Yining +" Description: ruff as ALE fixer for python files + +call ale#Set('python_ruff_executable', 'ruff') +call ale#Set('python_ruff_options', '') +call ale#Set('python_ruff_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_ruff_change_directory', 1) +call ale#Set('python_ruff_auto_pipenv', 0) +call ale#Set('python_ruff_auto_poetry', 0) + +function! ale#fixers#ruff#GetCwd(buffer) abort + if ale#Var(a:buffer, 'python_ruff_change_directory') + " Run from project root if found, else from buffer dir. + let l:project_root = ale#python#FindProjectRoot(a:buffer) + + return !empty(l:project_root) ? l:project_root : '%s:h' + endif + + return '%s:h' +endfunction + +function! ale#fixers#ruff#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_ruff_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_ruff_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_ruff', ['ruff']) +endfunction + +function! ale#fixers#ruff#GetCommand(buffer) abort + let l:executable = ale#fixers#ruff#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run ruff' + \ : '' + + return ale#Escape(l:executable) . l:exec_args +endfunction + +function! ale#fixers#ruff#FixForVersion(buffer, version) abort + let l:executable = ale#fixers#ruff#GetExecutable(a:buffer) + let l:cmd = [ale#Escape(l:executable)] + + if l:executable =~? 'pipenv\|poetry$' + call extend(l:cmd, ['run', 'ruff']) + endif + + let l:options = ale#Var(a:buffer, 'python_ruff_options') + + if !empty(l:options) + call add(l:cmd, l:options) + endif + + " when --stdin-filename present, ruff will use it for proj root resolution + " https://github.com/charliermarsh/ruff/pull/1281 + let l:fname = expand('#' . a:buffer . '...') + call add(l:cmd, '--stdin-filename '.ale#Escape(ale#path#Simplify(l:fname))) + + call add(l:cmd, '--fix') + + " NOTE: ruff version `0.0.72` implements `--fix` with stdin + if ale#semver#GTE(a:version, [0, 0, 72]) + call add(l:cmd, '-') + else + call add(l:cmd, '%s') + endif + + return { + \ 'cwd': ale#fixers#ruff#GetCwd(a:buffer), + \ 'command': join(l:cmd, ' '), + \} +endfunction + +function! ale#fixers#ruff#Fix(buffer) abort + let l:executable = ale#fixers#ruff#GetExecutable(a:buffer) + let l:command = ale#fixers#ruff#GetCommand(a:buffer) . ale#Pad('--version') + + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ l:executable, + \ l:command, + \ function('ale#fixers#ruff#FixForVersion'), + \) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/rufo.vim b/dot_vim/plugged/ale/autoload/ale/fixers/rufo.vim new file mode 100644 index 0000000..01d537a --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/rufo.vim @@ -0,0 +1,20 @@ +" Author: Fohte (Hayato Kawai) https://github.com/fohte +" Description: Integration of Rufo with ALE. + +call ale#Set('ruby_rufo_executable', 'rufo') + +function! ale#fixers#rufo#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'ruby_rufo_executable') + let l:exec_args = l:executable =~? 'bundle$' + \ ? ' exec rufo' + \ : '' + + return ale#Escape(l:executable) . l:exec_args . ' %t' +endfunction + +function! ale#fixers#rufo#Fix(buffer) abort + return { + \ 'command': ale#fixers#rufo#GetCommand(a:buffer), + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/rustfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/rustfmt.vim new file mode 100644 index 0000000..38882fb --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/rustfmt.vim @@ -0,0 +1,15 @@ +" Author: Kelly Fox +" Description: Integration of rustfmt with ALE. + +call ale#Set('rust_rustfmt_executable', 'rustfmt') +call ale#Set('rust_rustfmt_options', '') + +function! ale#fixers#rustfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'rust_rustfmt_executable') + let l:options = ale#Var(a:buffer, 'rust_rustfmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/scalafmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/scalafmt.vim new file mode 100644 index 0000000..dd0e774 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/scalafmt.vim @@ -0,0 +1,25 @@ +" Author: Jeffrey Lau https://github.com/zoonfafer +" Description: Integration of Scalafmt with ALE. + +call ale#Set('scala_scalafmt_executable', 'scalafmt') +call ale#Set('scala_scalafmt_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('scala_scalafmt_options', '') + +function! ale#fixers#scalafmt#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'scala_scalafmt_executable') + let l:options = ale#Var(a:buffer, 'scala_scalafmt_options') + let l:exec_args = l:executable =~? 'ng$' + \ ? ' scalafmt' + \ : '' + + return ale#Escape(l:executable) . l:exec_args + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %t' +endfunction + +function! ale#fixers#scalafmt#Fix(buffer) abort + return { + \ 'command': ale#fixers#scalafmt#GetCommand(a:buffer), + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/shfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/shfmt.vim new file mode 100644 index 0000000..0eefc98 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/shfmt.vim @@ -0,0 +1,17 @@ +scriptencoding utf-8 +" Author: Simon Bugert +" Description: Fix sh files with shfmt. + +call ale#Set('sh_shfmt_executable', 'shfmt') +call ale#Set('sh_shfmt_options', '') + +function! ale#fixers#shfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'sh_shfmt_executable') + let l:options = ale#Var(a:buffer, 'sh_shfmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' -filename=%s' + \ . (empty(l:options) ? '' : ' ' . l:options) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/sorbet.vim b/dot_vim/plugged/ale/autoload/ale/fixers/sorbet.vim new file mode 100644 index 0000000..7c12fa1 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/sorbet.vim @@ -0,0 +1,19 @@ +call ale#Set('ruby_sorbet_executable', 'srb') +call ale#Set('ruby_sorbet_options', '') + +function! ale#fixers#sorbet#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'ruby_sorbet_executable') + let l:options = ale#Var(a:buffer, 'ruby_sorbet_options') + + return ale#ruby#EscapeExecutable(l:executable, 'srb') + \ . ' tc' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --autocorrect --file %t' +endfunction + +function! ale#fixers#sorbet#Fix(buffer) abort + return { + \ 'command': ale#fixers#sorbet#GetCommand(a:buffer), + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/sqlfluff.vim b/dot_vim/plugged/ale/autoload/ale/fixers/sqlfluff.vim new file mode 100644 index 0000000..1dc9f5c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/sqlfluff.vim @@ -0,0 +1,25 @@ +" Author: Carl Smedstad +" Description: Fixing SQL files with sqlfluff + +call ale#Set('sql_sqlfluff_executable', 'sqlfluff') + +function! ale#fixers#sqlfluff#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'sql_sqlfluff_executable') + + let l:cmd = + \ ale#Escape(l:executable) + \ . ' fix --force' + + let l:config_file = ale#path#FindNearestFile(a:buffer, '.sqlfluff') + + if !empty(l:config_file) + let l:cmd .= ' --config ' . ale#Escape(l:config_file) + else + let l:cmd .= ' --dialect ansi' + endif + + return { + \ 'command': l:cmd . ' %t > /dev/null', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/sqlfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/sqlfmt.vim new file mode 100644 index 0000000..c88a8ec --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/sqlfmt.vim @@ -0,0 +1,13 @@ +call ale#Set('sql_sqlfmt_executable', 'sqlfmt') +call ale#Set('sql_sqlfmt_options', '') + +function! ale#fixers#sqlfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'sql_sqlfmt_executable') + let l:options = ale#Var(a:buffer, 'sql_sqlfmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' -w' + \ . (empty(l:options) ? '' : ' ' . l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/sqlformat.vim b/dot_vim/plugged/ale/autoload/ale/fixers/sqlformat.vim new file mode 100644 index 0000000..6319c1a --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/sqlformat.vim @@ -0,0 +1,16 @@ +" Author: Cluas +" Description: Fixing files with sqlformat. + +call ale#Set('sql_sqlformat_executable', 'sqlformat') +call ale#Set('sql_sqlformat_options', '') + +function! ale#fixers#sqlformat#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'sql_sqlformat_executable') + let l:options = ale#Var(a:buffer, 'sql_sqlformat_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' -' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/standard.vim b/dot_vim/plugged/ale/autoload/ale/fixers/standard.vim new file mode 100644 index 0000000..b9d60eb --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/standard.vim @@ -0,0 +1,33 @@ +" Author: Sumner Evans +" Description: Fixing files with Standard. + +call ale#Set('javascript_standard_executable', 'standard') +call ale#Set('javascript_standard_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('javascript_standard_options', '') + +function! ale#fixers#standard#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'javascript_standard', [ + \ 'node_modules/standardx/bin/cmd.js', + \ 'node_modules/standard/bin/cmd.js', + \ 'node_modules/.bin/standard', + \]) +endfunction + +function! ale#fixers#standard#Fix(buffer) abort + let l:executable = ale#fixers#standard#GetExecutable(a:buffer) + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:options_type = 'javascript_standard_options' + + if l:filetype =~# 'typescript' + let l:options_type = 'typescript_standard_options' + endif + + let l:options = ale#Var(a:buffer, l:options_type) + + return { + \ 'command': ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --fix --stdin < %s > %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/standardrb.vim b/dot_vim/plugged/ale/autoload/ale/fixers/standardrb.vim new file mode 100644 index 0000000..acb310c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/standardrb.vim @@ -0,0 +1,23 @@ +" Author: Justin Searls - https://github.com/searls +" Description: Fix Ruby files with StandardRB. + +call ale#Set('ruby_standardrb_options', '') +call ale#Set('ruby_standardrb_executable', 'standardrb') + +function! ale#fixers#standardrb#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'ruby_standardrb_executable') + let l:config = ale#path#FindNearestFile(a:buffer, '.standard.yml') + let l:options = ale#Var(a:buffer, 'ruby_standardrb_options') + + return ale#ruby#EscapeExecutable(l:executable, 'standardrb') + \ . (!empty(l:config) ? ' --config ' . ale#Escape(l:config) : '') + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --fix --force-exclusion --stdin %s' +endfunction + +function! ale#fixers#standardrb#Fix(buffer) abort + return { + \ 'command': ale#fixers#standardrb#GetCommand(a:buffer), + \ 'process_with': 'ale#fixers#rubocop#PostProcess' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/statix.vim b/dot_vim/plugged/ale/autoload/ale/fixers/statix.vim new file mode 100644 index 0000000..5991c92 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/statix.vim @@ -0,0 +1,17 @@ +" Author: David Houston +" Description: Provide statix fix as a fixer for simple Nix antipatterns. + +call ale#Set('nix_statix_fix_executable', 'statix') +call ale#Set('nix_statix_fix_options', '') + +function! ale#fixers#statix#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'nix_statix_fix_executable') + let l:options = ale#Var(a:buffer, 'nix_statix_fix_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ale#Pad('fix') + \ . ale#Pad('--stdin') + \ . ale#Pad(l:options), + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/stylelint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/stylelint.vim new file mode 100644 index 0000000..650b9c4 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/stylelint.vim @@ -0,0 +1,26 @@ +" Author: Mahmoud Mostafa +" Description: Fixing files with stylelint. + +call ale#Set('stylelint_executable', 'stylelint') +call ale#Set('stylelint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('stylelint_options', '') + +function! ale#fixers#stylelint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'stylelint', [ + \ 'node_modules/stylelint/bin/stylelint.js', + \ 'node_modules/.bin/stylelint', + \]) +endfunction + +function! ale#fixers#stylelint#Fix(buffer) abort + let l:executable = ale#fixers#stylelint#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'stylelint_options') + + return { + \ 'cwd': '%s:h', + \ 'command': ale#node#Executable(a:buffer, l:executable) + \ . ale#Pad(l:options) + \ . ' --fix --stdin --stdin-filename %s', + \ 'read_temporary_file': 0, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/styler.vim b/dot_vim/plugged/ale/autoload/ale/fixers/styler.vim new file mode 100644 index 0000000..1c7607b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/styler.vim @@ -0,0 +1,16 @@ +" Author: tvatter +" Description: Fixing R files with styler. + +call ale#Set('r_styler_executable', 'Rscript') +call ale#Set('r_styler_options', 'tidyverse_style()') + +function! ale#fixers#styler#Fix(buffer) abort + return { + \ 'command': 'Rscript --vanilla -e ' + \ . '"suppressPackageStartupMessages(library(styler));' + \ . 'style_file(commandArgs(TRUE), transformers = ' + \ . ale#Var(a:buffer, 'r_styler_options') . ')"' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/stylish_haskell.vim b/dot_vim/plugged/ale/autoload/ale/fixers/stylish_haskell.vim new file mode 100644 index 0000000..ce71c1c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/stylish_haskell.vim @@ -0,0 +1,21 @@ +" Author: eborden +" Description: Integration of stylish-haskell formatting with ALE. +" +call ale#Set('haskell_stylish_haskell_executable', 'stylish-haskell') + +function! ale#fixers#stylish_haskell#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_stylish_haskell_executable') + + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'stylish-haskell') +endfunction + +function! ale#fixers#stylish_haskell#Fix(buffer) abort + let l:executable = ale#fixers#stylish_haskell#GetExecutable(a:buffer) + + return { + \ 'command': l:executable + \ . ' --inplace' + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/stylua.vim b/dot_vim/plugged/ale/autoload/ale/fixers/stylua.vim new file mode 100644 index 0000000..3521c93 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/stylua.vim @@ -0,0 +1,14 @@ +" Author: Robert Liebowitz +" Description: https://github.com/johnnymorganz/stylua + +call ale#Set('lua_stylua_executable', 'stylua') +call ale#Set('lua_stylua_options', '') + +function! ale#fixers#stylua#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'lua_stylua_executable') + let l:options = ale#Var(a:buffer, 'lua_stylua_options') + + return { + \ 'command': ale#Escape(l:executable) . ale#Pad(l:options) . ' -', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/swiftformat.vim b/dot_vim/plugged/ale/autoload/ale/fixers/swiftformat.vim new file mode 100644 index 0000000..cc553b7 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/swiftformat.vim @@ -0,0 +1,25 @@ +" Author: gfontenot (Gordon Fontenot) +" Description: Integration of SwiftFormat with ALE. + +call ale#Set('swift_swiftformat_executable', 'swiftformat') +call ale#Set('swift_swiftformat_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('swift_swiftformat_options', '') + +function! ale#fixers#swiftformat#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'swift_swiftformat', [ + \ 'Pods/SwiftFormat/CommandLineTool/swiftformat', + \ 'ios/Pods/SwiftFormat/CommandLineTool/swiftformat', + \ 'swiftformat', + \]) +endfunction + +function! ale#fixers#swiftformat#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'swift_swiftformat_options') + + return { + \ 'read_temporary_file': 1, + \ 'command': ale#Escape(ale#fixers#swiftformat#GetExecutable(a:buffer)) + \ . ' %t' + \ . ' ' . l:options, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/syntax_tree.vim b/dot_vim/plugged/ale/autoload/ale/fixers/syntax_tree.vim new file mode 100644 index 0000000..7ae0337 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/syntax_tree.vim @@ -0,0 +1,19 @@ +call ale#Set('ruby_syntax_tree_options', '') +call ale#Set('ruby_syntax_tree_executable', 'stree') + +function! ale#fixers#syntax_tree#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'ruby_syntax_tree_executable') + let l:options = ale#Var(a:buffer, 'ruby_syntax_tree_options') + + return ale#ruby#EscapeExecutable(l:executable, 'stree') + \ . ' write' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %t' +endfunction + +function! ale#fixers#syntax_tree#Fix(buffer) abort + return { + \ 'command': ale#fixers#syntax_tree#GetCommand(a:buffer), + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/terraform.vim b/dot_vim/plugged/ale/autoload/ale/fixers/terraform.vim new file mode 100644 index 0000000..bc05380 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/terraform.vim @@ -0,0 +1,17 @@ +" Author: dsifford +" Description: Fixer for terraform and .hcl files + +call ale#Set('terraform_fmt_executable', 'terraform') +call ale#Set('terraform_fmt_options', '') + +function! ale#fixers#terraform#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'terraform_fmt_executable') + let l:options = ale#Var(a:buffer, 'terraform_fmt_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' fmt' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' -' + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/textlint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/textlint.vim new file mode 100644 index 0000000..38ab2bf --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/textlint.vim @@ -0,0 +1,15 @@ +" Author: TANIGUCHI Masaya +" Description: Integration of textlint with ALE. + +function! ale#fixers#textlint#Fix(buffer) abort + let l:executable = ale#handlers#textlint#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'textlint_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' --fix' + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . ' %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/tidy.vim b/dot_vim/plugged/ale/autoload/ale/fixers/tidy.vim new file mode 100644 index 0000000..2c79e73 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/tidy.vim @@ -0,0 +1,26 @@ +" Author: meain +" Description: Fixing HTML files with tidy. + +call ale#Set('html_tidy_executable', 'tidy') +call ale#Set('html_tidy_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale#fixers#tidy#Fix(buffer) abort + let l:executable = ale#path#FindExecutable( + \ a:buffer, + \ 'html_tidy', + \ ['tidy'], + \) + + if !executable(l:executable) + return 0 + endif + + let l:config = ale#path#FindNearestFile(a:buffer, '.tidyrc') + let l:config_options = !empty(l:config) + \ ? ' -q --tidy-mark no --show-errors 0 --show-warnings 0 -config ' . ale#Escape(l:config) + \ : ' -q --tidy-mark no --show-errors 0 --show-warnings 0' + + return { + \ 'command': ale#Escape(l:executable) . l:config_options, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/tslint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/tslint.vim new file mode 100644 index 0000000..15768fd --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/tslint.vim @@ -0,0 +1,22 @@ +" Author: carakan +" Description: Fixing files with tslint. + +function! ale#fixers#tslint#Fix(buffer) abort + let l:executable = ale#handlers#tslint#GetExecutable(a:buffer) + + let l:tslint_config_path = ale#path#ResolveLocalPath( + \ a:buffer, + \ 'tslint.json', + \ ale#Var(a:buffer, 'typescript_tslint_config_path') + \) + let l:tslint_config_option = !empty(l:tslint_config_path) + \ ? ' -c ' . ale#Escape(l:tslint_config_path) + \ : '' + + return { + \ 'command': ale#node#Executable(a:buffer, l:executable) + \ . l:tslint_config_option + \ . ' --outputAbsolutePaths --fix %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/uncrustify.vim b/dot_vim/plugged/ale/autoload/ale/fixers/uncrustify.vim new file mode 100644 index 0000000..0e8271e --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/uncrustify.vim @@ -0,0 +1,33 @@ +" Author: Derek P Sifford +" Description: Fixer for C, C++, C#, ObjectiveC, D, Java, Pawn, and VALA. + +call ale#Set('c_uncrustify_executable', 'uncrustify') +call ale#Set('c_uncrustify_options', '') + +let s:languages = { +\ 'c': 'C', +\ 'cpp': 'CPP', +\ 'cs': 'CS', +\ 'objc': 'OC', +\ 'objcpp': 'OC+', +\ 'd': 'D', +\ 'java': 'JAVA', +\ 'vala': 'VALA', +\ 'p': 'PAWN', +\} + +function! ale#fixers#uncrustify#Language(buffer) abort + return get(s:languages, &filetype, 'C') +endfunction + +function! ale#fixers#uncrustify#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'c_uncrustify_executable') + let l:options = ale#Var(a:buffer, 'c_uncrustify_options') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' --no-backup ' + \ . '-l' . ale#Pad(ale#fixers#uncrustify#Language(a:buffer)) + \ . ale#Pad(l:options) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/vfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/vfmt.vim new file mode 100644 index 0000000..2e78031 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/vfmt.vim @@ -0,0 +1,13 @@ +" Author: fiatjaf +" Description: Integration of `v fmt` with ALE. + +call ale#Set('v_vfmt_options', '') + +function! ale#fixers#vfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'v_v_executable') + let l:options = ale#Var(a:buffer, 'v_vfmt_options') + + return { + \ 'command': ale#Escape(l:executable) . ' fmt' . ale#Pad(l:options) + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/xmllint.vim b/dot_vim/plugged/ale/autoload/ale/fixers/xmllint.vim new file mode 100644 index 0000000..b14ffd3 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/xmllint.vim @@ -0,0 +1,29 @@ +" Author: Cyril Roelandt +" Description: Integration of xmllint with ALE. + +call ale#Set('xml_xmllint_executable', 'xmllint') +call ale#Set('xml_xmllint_options', '') +call ale#Set('xml_xmllint_indentsize', 2) + +function! ale#fixers#xmllint#Fix(buffer) abort + let l:executable = ale#Escape(ale#Var(a:buffer, 'xml_xmllint_executable')) + let l:filename = ale#Escape(bufname(a:buffer)) + let l:command = l:executable . ' --format ' . l:filename + + let l:indent = ale#Var(a:buffer, 'xml_xmllint_indentsize') + + if l:indent isnot# '' + let l:env = ale#Env('XMLLINT_INDENT', repeat(' ', l:indent)) + let l:command = l:env . l:command + endif + + let l:options = ale#Var(a:buffer, 'xml_xmllint_options') + + if l:options isnot# '' + let l:command .= ' ' . l:options + endif + + return { + \ 'command': l:command + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/xo.vim b/dot_vim/plugged/ale/autoload/ale/fixers/xo.vim new file mode 100644 index 0000000..dcf4c73 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/xo.vim @@ -0,0 +1,36 @@ +" Author: Albert Marquez - https://github.com/a-marquez +" Description: Fixing files with XO. + +function! ale#fixers#xo#Fix(buffer) abort + let l:executable = ale#handlers#xo#GetExecutable(a:buffer) + let l:options = ale#handlers#xo#GetOptions(a:buffer) + + return ale#semver#RunWithVersionCheck( + \ a:buffer, + \ l:executable, + \ '%e --version', + \ {b, v -> ale#fixers#xo#ApplyFixForVersion(b, v, l:executable, l:options)} + \) +endfunction + +function! ale#fixers#xo#ApplyFixForVersion(buffer, version, executable, options) abort + let l:executable = ale#node#Executable(a:buffer, a:executable) + let l:options = ale#Pad(a:options) + + " 0.30.0 is the first version with a working --stdin --fix + if ale#semver#GTE(a:version, [0, 30, 0]) + return { + \ 'command': l:executable + \ . ' --stdin --stdin-filename %s' + \ . ' --fix' + \ . l:options, + \} + endif + + return { + \ 'command': l:executable + \ . ' --fix %t' + \ . l:options, + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/yamlfix.vim b/dot_vim/plugged/ale/autoload/ale/fixers/yamlfix.vim new file mode 100644 index 0000000..6654a25 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/yamlfix.vim @@ -0,0 +1,25 @@ +" Author: lyz-code +" Description: Fixing yaml files with yamlfix. + +call ale#Set('yaml_yamlfix_executable', 'yamlfix') +call ale#Set('yaml_yamlfix_options', '') +call ale#Set('yaml_yamlfix_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale#fixers#yamlfix#Fix(buffer) abort + let l:options = ale#Var(a:buffer, 'yaml_yamlfix_options') + let l:executable = ale#python#FindExecutable( + \ a:buffer, + \ 'yaml_yamlfix', + \ ['yamlfix'], + \) + + if !executable(l:executable) + return 0 + endif + + return { + \ 'cwd': '%s:h', + \ 'command': ale#Escape(l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') . ' -', + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/yapf.vim b/dot_vim/plugged/ale/autoload/ale/fixers/yapf.vim new file mode 100644 index 0000000..f04bb1f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/yapf.vim @@ -0,0 +1,26 @@ +" Author: w0rp +" Description: Fixing Python files with yapf. + +call ale#Set('python_yapf_executable', 'yapf') +call ale#Set('python_yapf_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale#fixers#yapf#Fix(buffer) abort + let l:executable = ale#python#FindExecutable( + \ a:buffer, + \ 'python_yapf', + \ ['yapf'], + \) + + if !executable(l:executable) + return 0 + endif + + let l:config = ale#path#FindNearestFile(a:buffer, '.style.yapf') + let l:config_options = !empty(l:config) + \ ? ' --no-local-style --style ' . ale#Escape(l:config) + \ : '' + + return { + \ 'command': ale#Escape(l:executable) . l:config_options, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/fixers/zigfmt.vim b/dot_vim/plugged/ale/autoload/ale/fixers/zigfmt.vim new file mode 100644 index 0000000..b22e5b8 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/fixers/zigfmt.vim @@ -0,0 +1,14 @@ +scriptencoding utf-8 +" Author: Arash Mousavi +" Description: Official formatter for Zig. + +call ale#Set('zig_zigfmt_executable', 'zig') + +function! ale#fixers#zigfmt#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'zig_zigfmt_executable') + + return { + \ 'command': ale#Escape(l:executable) . ' fmt %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/floating_preview.vim b/dot_vim/plugged/ale/autoload/ale/floating_preview.vim new file mode 100644 index 0000000..c2bf5b6 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/floating_preview.vim @@ -0,0 +1,231 @@ +" Author: Jan-Grimo Sobez +" Author: Kevin Clark +" Author: D. Ben Knoble +" Author: Shaun Duncan +" Description: Floating preview window for showing whatever information in. + +" Precondition: exists('*nvim_open_win') || has('popupwin') + +function! ale#floating_preview#Show(lines, ...) abort + if !exists('*nvim_open_win') && !has('popupwin') + " no-custom-checks + echom 'Floating windows not supported in this vim instance.' + + return + endif + + let l:options = get(a:000, 0, {}) + + if has('nvim') + call s:NvimShow(a:lines, l:options) + else + call s:VimShow(a:lines, l:options) + endif +endfunction + +function! s:NvimShow(lines, options) abort + " Remove the close autocmd so it doesn't happen mid update + augroup ale_floating_preview_window + autocmd! + augroup END + + " Only create a new window if we need it + if !exists('w:preview') || index(nvim_list_wins(), w:preview['id']) is# -1 + call s:NvimCreate(a:options) + else + call nvim_buf_set_option(w:preview['buffer'], 'modifiable', v:true) + endif + + " Execute commands in window context + let l:parent_window = nvim_get_current_win() + + call nvim_set_current_win(w:preview['id']) + + for l:command in get(a:options, 'commands', []) + call execute(l:command) + endfor + + call nvim_set_current_win(l:parent_window) + + " Return to parent context on move + augroup ale_floating_preview_window + autocmd! + + if g:ale_close_preview_on_insert + autocmd CursorMoved,TabLeave,WinLeave,BufWinLeave,WinScrolled,InsertEnter ++once call s:NvimClose() + else + autocmd CursorMoved,TabLeave,WinLeave,BufWinLeave,WinScrolled ++once call s:NvimClose() + endif + augroup END + + let [l:lines, l:width, l:height] = s:NvimPrepareWindowContent(a:lines) + + call nvim_win_set_width(w:preview['id'], l:width) + call nvim_win_set_height(w:preview['id'], l:height) + call nvim_buf_set_lines(w:preview['buffer'], 0, -1, v:false, l:lines) + call nvim_buf_set_option(w:preview['buffer'], 'modified', v:false) + call nvim_buf_set_option(w:preview['buffer'], 'modifiable', v:false) +endfunction + +function! s:VimShow(lines, options) abort + if g:ale_close_preview_on_insert + " Remove the close autocmd so it doesn't happen mid update + silent! autocmd! ale_floating_preview_window + endif + + " Only create a new window if we need it + if !exists('w:preview') || index(popup_list(), w:preview['id']) is# -1 + call s:VimCreate(a:options) + endif + + " Execute commands in window context + for l:command in get(a:options, 'commands', []) + call win_execute(w:preview['id'], l:command) + endfor + + call popup_settext(w:preview['id'], a:lines) + + if g:ale_close_preview_on_insert + augroup ale_floating_preview_window + autocmd! + autocmd InsertEnter * ++once call s:VimClose() + augroup END + endif +endfunction + +function! s:NvimPrepareWindowContent(lines) abort + let l:max_height = 10 + + let l:width = max(map(copy(a:lines), 'strdisplaywidth(v:val)')) + let l:height = min([len(a:lines), l:max_height]) + + if empty(g:ale_floating_window_border) + return [a:lines, l:width, l:height] + endif + + " Add the size of borders + let l:width += 2 + let l:height += 2 + + let l:left = get(g:ale_floating_window_border, 0, '|') + let l:top = get(g:ale_floating_window_border, 1, '-') + let l:top_left = get(g:ale_floating_window_border, 2, '+') + let l:top_right = get(g:ale_floating_window_border, 3, '+') + let l:bottom_right = get(g:ale_floating_window_border, 4, '+') + let l:bottom_left = get(g:ale_floating_window_border, 5, '+') + let l:right = get(g:ale_floating_window_border, 6, l:left) + let l:bottom = get(g:ale_floating_window_border, 7, l:top) + + let l:lines = [l:top_left . repeat(l:top, l:width - 2) . l:top_right] + + for l:line in a:lines + let l:line_width = strchars(l:line) + let l:lines = add(l:lines, l:left . l:line . repeat(' ', l:width - l:line_width - 2). l:right) + endfor + + " Truncate the lines + if len(l:lines) > l:max_height + 1 + let l:lines = l:lines[0:l:max_height] + endif + + let l:lines = add(l:lines, l:bottom_left . repeat(l:bottom, l:width - 2) . l:bottom_right) + + return [l:lines, l:width, l:height] +endfunction + +function! s:NvimCreate(options) abort + let l:popup_opts = extend({ + \ 'relative': 'cursor', + \ 'row': 1, + \ 'col': 0, + \ 'width': 42, + \ 'height': 4, + \ 'style': 'minimal' + \ }, s:GetPopupOpts()) + + let l:buffer = nvim_create_buf(v:false, v:false) + let l:winid = nvim_open_win(l:buffer, v:false, l:popup_opts) + + call nvim_buf_set_option(l:buffer, 'buftype', 'acwrite') + call nvim_buf_set_option(l:buffer, 'bufhidden', 'delete') + call nvim_buf_set_option(l:buffer, 'swapfile', v:false) + call nvim_buf_set_option(l:buffer, 'filetype', get(a:options, 'filetype', 'ale-preview')) + + let w:preview = {'id': l:winid, 'buffer': l:buffer} +endfunction + +function! s:VimCreate(options) abort + " default options + let l:popup_opts = extend({ + \ 'line': 'cursor+1', + \ 'col': 'cursor', + \ 'drag': v:true, + \ 'resize': v:true, + \ 'close': 'button', + \ 'padding': [0, 1, 0, 1], + \ 'border': [], + \ 'borderchars': empty(g:ale_floating_window_border) ? [' '] : [ + \ get(g:ale_floating_window_border, 1, '-'), + \ get(g:ale_floating_window_border, 6, '|'), + \ get(g:ale_floating_window_border, 7, '-'), + \ get(g:ale_floating_window_border, 0, '|'), + \ get(g:ale_floating_window_border, 2, '+'), + \ get(g:ale_floating_window_border, 3, '+'), + \ get(g:ale_floating_window_border, 4, '+'), + \ get(g:ale_floating_window_border, 5, '+'), + \ ], + \ 'moved': 'any', + \ }, s:GetPopupOpts()) + + let l:popup_id = popup_create([], l:popup_opts) + call setbufvar(winbufnr(l:popup_id), '&filetype', get(a:options, 'filetype', 'ale-preview')) + let w:preview = {'id': l:popup_id} +endfunction + +function! s:NvimClose() abort + let l:mode = mode() + let l:restore_visual = l:mode is# 'v' || l:mode is# 'V' || l:mode is# "\" + + if !exists('w:preview') + return + endif + + call setbufvar(w:preview['buffer'], '&modified', 0) + + if win_id2win(w:preview['id']) > 0 + execute win_id2win(w:preview['id']).'wincmd c' + endif + + unlet w:preview + + if l:restore_visual + normal! gv + endif +endfunction + +function! s:VimClose() abort + if !exists('w:preview') + return + endif + + call popup_close(w:preview['id']) + unlet w:preview +endfunction + +" get either the results of a function callback or dictionary for popup overrides +function! s:GetPopupOpts() abort + if exists('g:ale_floating_preview_popup_opts') + let l:ref = g:ale_floating_preview_popup_opts + + if type(l:ref) is# v:t_dict + return l:ref + elseif type(l:ref) is# v:t_string + try + return function(l:ref)() + catch /E700/ + endtry + endif + endif + + return {} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/go.vim b/dot_vim/plugged/ale/autoload/ale/go.vim new file mode 100644 index 0000000..bce85a8 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/go.vim @@ -0,0 +1,58 @@ +" Author: Horacio Sanson https://github.com/hsanson +" Description: Functions for integrating with Go tools + +" Find the nearest dir listed in GOPATH and assume it the root of the go +" project. +function! ale#go#FindProjectRoot(buffer) abort + let l:sep = has('win32') ? ';' : ':' + + let l:filename = ale#path#Simplify(expand('#' . a:buffer . ':p')) + + for l:name in split($GOPATH, l:sep) + let l:path_dir = ale#path#Simplify(l:name) + + " Use the directory from GOPATH if the current filename starts with it. + if l:filename[: len(l:path_dir) - 1] is? l:path_dir + return l:path_dir + endif + endfor + + let l:default_go_path = ale#path#Simplify(expand('~/go')) + + if isdirectory(l:default_go_path) + return l:default_go_path + endif + + return '' +endfunction + + +call ale#Set('go_go111module', '') + +" Return a string setting Go-specific environment variables +function! ale#go#EnvString(buffer) abort + let l:env = '' + + " GO111MODULE - turn go modules behavior on/off + let l:go111module = ale#Var(a:buffer, 'go_go111module') + + if !empty(l:go111module) + let l:env = ale#Env('GO111MODULE', l:go111module) . l:env + endif + + return l:env +endfunction + +function! ale#go#GetGoPathExecutable(suffix) abort + let l:prefix = $GOPATH + + if !empty($GOPATH) + let l:prefix = $GOPATH + elseif has('win32') + let l:prefix = $USERPROFILE . '/go' + else + let l:prefix = $HOME . '/go' + endif + + return ale#path#Simplify(l:prefix . '/' . a:suffix) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/gradle.vim b/dot_vim/plugged/ale/autoload/ale/gradle.vim new file mode 100644 index 0000000..ba1add4 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/gradle.vim @@ -0,0 +1,74 @@ +" Author: Michael Pardo +" Description: Functions for working with Gradle projects. + +let s:script_path = fnamemodify(resolve(expand(':p')), ':h') +let s:init_path = has('win32') +\ ? s:script_path . '\gradle\init.gradle' +\ : s:script_path . '/gradle/init.gradle' + +function! ale#gradle#GetInitPath() abort + return s:init_path +endfunction + +" Given a buffer number, find a Gradle project root. +function! ale#gradle#FindProjectRoot(buffer) abort + let l:gradlew_path = ale#path#FindNearestFile(a:buffer, 'gradlew') + + if !empty(l:gradlew_path) + return fnamemodify(l:gradlew_path, ':h') + endif + + let l:settings_path = ale#path#FindNearestFile(a:buffer, 'settings.gradle') + + if !empty(l:settings_path) + return fnamemodify(l:settings_path, ':h') + endif + + let l:build_path = ale#path#FindNearestFile(a:buffer, 'build.gradle') + + if !empty(l:build_path) + return fnamemodify(l:build_path, ':h') + endif + + return '' +endfunction + +" Given a buffer number, find the path to the executable. +" First search on the path for 'gradlew', if nothing is found, try the global +" command. Returns an empty string if cannot find the executable. +function! ale#gradle#FindExecutable(buffer) abort + let l:gradlew_path = ale#path#FindNearestFile(a:buffer, 'gradlew') + + if !empty(l:gradlew_path) + return l:gradlew_path + endif + + if executable('gradle') + return 'gradle' + endif + + return '' +endfunction + +" Given a buffer number, get a working directory and command to print the +" classpath of the root project. +" +" Returns an empty string for the command if Gradle is not detected. +function! ale#gradle#BuildClasspathCommand(buffer) abort + let l:executable = ale#gradle#FindExecutable(a:buffer) + + if !empty(l:executable) + let l:project_root = ale#gradle#FindProjectRoot(a:buffer) + + if !empty(l:project_root) + return [ + \ l:project_root, + \ ale#Escape(l:executable) + \ . ' -I ' . ale#Escape(s:init_path) + \ . ' -q printClasspath' + \] + endif + endif + + return ['', ''] +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/gradle/init.gradle b/dot_vim/plugged/ale/autoload/ale/gradle/init.gradle new file mode 100644 index 0000000..fb1db9e --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/gradle/init.gradle @@ -0,0 +1,23 @@ +class ClasspathPlugin implements Plugin { + void apply(Project project) { + project.task('printClasspath') { + doLast { + project + .rootProject + .allprojects + .configurations + .flatten() + .findAll { it.name.endsWith('Classpath') } + .collect { it.resolve() } + .flatten() + .unique() + .findAll { it.exists() } + .each { println it } + } + } + } +} + +rootProject { + apply plugin: ClasspathPlugin +} diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/actionlint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/actionlint.vim new file mode 100644 index 0000000..73843c0 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/actionlint.vim @@ -0,0 +1,36 @@ +function! ale#handlers#actionlint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'yaml_actionlint_options') + + " automatically add --no-color option if not defined + if l:options !~# '--no-color' + let l:options .= ' --no-color' + endif + + " automatically add --oneline option if not defined + if l:options !~# '--oneline' + let l:options .= ' --oneline' + endif + + return '%e ' . l:options . ' %t' +endfunction + +function! ale#handlers#actionlint#Handle(buffer, lines) abort + " Matches patterns line the following: + ".github/workflows/main.yml:19:0: could not parse as YAML: yaml: line 19: mapping values are not allowed in this context [yaml-syntax] + let l:pattern = '\v^.*:(\d+):(\d+): (.+) \[(.+)\]$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3], + \ 'code': l:match[4], + \ 'type': 'E', + \} + + call add(l:output, l:item) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/alex.vim b/dot_vim/plugged/ale/autoload/ale/handlers/alex.vim new file mode 100644 index 0000000..1a92bd1 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/alex.vim @@ -0,0 +1,55 @@ +scriptencoding utf-8 +" Author: Johannes Wienke +" Description: Error handling for errors in alex output format + +function! ale#handlers#alex#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'alex', [ + \ 'node_modules/.bin/alex', + \ 'node_modules/alex/cli.js', + \]) +endfunction + +function! ale#handlers#alex#CreateCommandCallback(flags) abort + return {b -> ale#node#Executable(b, ale#handlers#alex#GetExecutable(b)) + \ . ' --stdin ' + \ . a:flags + \} +endfunction + +function! ale#handlers#alex#Handle(buffer, lines) abort + " Example output: + " 6:256-6:262 warning Be careful with “killedâ€, it’s profane in some cases killed retext-profanities + let l:pattern = '\v^ *(\d+):(\d+)-(\d+):(\d+) +warning +(.{-}) +(.{-}) +(.{-})$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'end_lnum': l:match[3] + 0, + \ 'end_col': l:match[4] - 1, + \ 'text': l:match[5] . ' (' . (l:match[7]) . ')', + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +" Define a linter for a specific filetype. Accept flags to adapt to the filetype. +" no flags treat input as markdown +" --html treat input as HTML +" --mdx treat input as MDX +" --text treat input as plaintext +function! ale#handlers#alex#DefineLinter(filetype, flags) abort + call ale#Set('alex_executable', 'alex') + call ale#Set('alex_use_global', get(g:, 'ale_use_global_executables', 0)) + + call ale#linter#Define(a:filetype, { + \ 'name': 'alex', + \ 'executable': function('ale#handlers#alex#GetExecutable'), + \ 'command': ale#handlers#alex#CreateCommandCallback(a:flags), + \ 'output_stream': 'stderr', + \ 'callback': 'ale#handlers#alex#Handle', + \}) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/atools.vim b/dot_vim/plugged/ale/autoload/ale/handlers/atools.vim new file mode 100644 index 0000000..c273fc4 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/atools.vim @@ -0,0 +1,41 @@ +" Author: Leo +" Description: Handlers for output expected from atools + +function! ale#handlers#atools#Handle(buffer, lines) abort + " Format: SEVERITY:[TAG]:PATH:LINENUM:MSG + " Example: MC:[AL5]:./APKBUILD:12:variable set to empty string: install= + let l:pattern = '\([^:]\+\):\([^:]\+\):\([^:]\+\):\(\d\+\):\(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + " We are expected to receive 2 characters, the first character + " can be 'S', 'I', 'M' 'T', which are respectively: + " Serious (Error) + " Important (Error) + " Minor (Warning) + " Style (Warning) + " + " The second character can be either 'C' or 'P', which are respectively: + " Certain (Error) + " Possible (Warning) + let l:severity = matchstr(l:match[1], '^.') + let l:certainty = matchstr(l:match[1], '.$') + + let l:type = 'E' + " If the tag returns 'Minor' or 'Style' or is 'Possible' + " then return a warning + + if l:severity is# 'M' || l:severity is# 'T' || l:certainty is# 'P' + let l:type = 'W' + endif + + call add(l:output, { + \ 'lnum': l:match[4] + 0, + \ 'text': l:match[5], + \ 'type': l:type, + \ 'code': matchstr(l:match[2], 'AL[0-9]*'), + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/ccls.vim b/dot_vim/plugged/ale/autoload/ale/handlers/ccls.vim new file mode 100644 index 0000000..290f585 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/ccls.vim @@ -0,0 +1,26 @@ +scriptencoding utf-8 +" Author: Ye Jingchen +" Description: Utilities for ccls + +function! ale#handlers#ccls#GetProjectRoot(buffer) abort + " Try to find ccls configuration files first. + let l:config = ale#path#FindNearestFile(a:buffer, '.ccls-root') + + if empty(l:config) + let l:config = ale#path#FindNearestFile(a:buffer, '.ccls') + endif + + if !empty(l:config) + return fnamemodify(l:config, ':h') + endif + + " Fall back on default project root detection. + return ale#c#FindProjectRoot(a:buffer) +endfunction + +function! ale#handlers#ccls#GetInitOpts(buffer, init_options_var) abort + let l:build_dir = ale#c#GetBuildDirectory(a:buffer) + let l:init_options = empty(l:build_dir) ? {} : {'compilationDatabaseDirectory': l:build_dir} + + return extend(l:init_options, ale#Var(a:buffer, a:init_options_var)) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/cppcheck.vim b/dot_vim/plugged/ale/autoload/ale/handlers/cppcheck.vim new file mode 100644 index 0000000..150bb00 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/cppcheck.vim @@ -0,0 +1,89 @@ +" Description: Handle errors for cppcheck. + +function! ale#handlers#cppcheck#GetCwd(buffer) abort + let [l:dir, l:json_path] = ale#c#FindCompileCommands(a:buffer) + + return !empty(l:dir) ? l:dir : '' +endfunction + +function! ale#handlers#cppcheck#GetBufferPathIncludeOptions(buffer) abort + let l:buffer_path_include = '' + + " Get path to this buffer so we can include it into cppcheck with -I + " This could be expanded to get more -I directives from the compile + " command in compile_commands.json, if it's found. + let l:buffer_path = fnamemodify(bufname(a:buffer), ':p:h') + let l:buffer_path_include = ' -I' . ale#Escape(l:buffer_path) + + return l:buffer_path_include +endfunction + +function! ale#handlers#cppcheck#GetCompileCommandsOptions(buffer) abort + " The compile_commands.json doesn't apply to headers and cppheck will + " bail out if it cannot find a file matching the filter, below. Skip out + " now, for headers. Also, suppress FPs; cppcheck is not meant to + " process lone header files. + let b:buffer_name = bufname(a:buffer) + let b:file_extension = fnamemodify(b:buffer_name, ':e') + + if b:file_extension is# 'h' || b:file_extension is# 'hpp' + return ale#handlers#cppcheck#GetBufferPathIncludeOptions(a:buffer) + \ . ' --suppress=unusedStructMember' + endif + + " If the current buffer is modified, using compile_commands.json does no + " good, so include the file's directory instead. It's not quite as good as + " using --project, but is at least equivalent to running cppcheck on this + " file manually from the file's directory. + let l:modified = getbufvar(a:buffer, '&modified') + + if l:modified + return '' + endif + + " Search upwards from the file for compile_commands.json. + " + " If we find it, we'll `cd` to where the compile_commands.json file is, + " then use the file to set up import paths, etc. + let [l:dir, l:json_path] = ale#c#FindCompileCommands(a:buffer) + + " By default, cppcheck processes every config in compile_commands.json. + " Use --file-filter to limit to just the buffer file. + return !empty(l:json_path) + \ ? '--project=' . ale#Escape(l:json_path[len(l:dir) + 1: ]) . ' --file-filter=' . ale#Escape(bufname(a:buffer)) + \ : '' +endfunction + +function! ale#handlers#cppcheck#HandleCppCheckFormat(buffer, lines) abort + " Look for lines like the following. + " + "test.cpp:974:6: error:inconclusive Array 'n[3]' accessed at index 3, which is out of bounds. [arrayIndexOutOfBounds]\ + " n[3]=3; + " ^ + "" OR if cppcheck doesn't support {column} or {inconclusive:text}: + "test.cpp:974:{column}: error:{inconclusive:inconclusive} Array 'n[3]' accessed at index 3, which is out of bounds. [arrayIndexOutOfBounds]\ + " n[3]=3; + " ^ + " + "" OR if using the misra addon: + "test.c:1:16: style: misra violation (use --rule-texts= to get proper output) [misra-c2012-2.7]\' + "void test( int parm ) {} + " ^ + let l:pattern = '\v(\f+):(\d+):(\d+|\{column\}): (\w+):(\{inconclusive:inconclusive\})? ?(.*) \[(%(\w[-.]?)+)\]\' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if ale#path#IsBufferPath(a:buffer, l:match[1]) + call add(l:output, { + \ 'lnum': str2nr(l:match[2]), + \ 'col': match(l:match[3],'{column}') >= 0 ? 1 : str2nr(l:match[3]), + \ 'type': l:match[4] is# 'error' ? 'E' : 'W', + \ 'sub_type': l:match[4] is# 'style' ? 'style' : '', + \ 'text': l:match[6], + \ 'code': l:match[7] + \}) + endif + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/cpplint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/cpplint.vim new file mode 100644 index 0000000..5c475a5 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/cpplint.vim @@ -0,0 +1,21 @@ +" Author: Dawid Kurek https://github.com/dawikur +" Description: Handle errors for cpplint. + +function! ale#handlers#cpplint#HandleCppLintFormat(buffer, lines) abort + " Look for lines like the following. + " test.cpp:5: Estra space after ( in function call [whitespace/parents] [4] + let l:pattern = '^.\{-}:\(\d\+\): *\(.\+\) *\[\(.*/.*\)\] ' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': 0, + \ 'text': join(split(l:match[2])), + \ 'code': l:match[3], + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/cspell.vim b/dot_vim/plugged/ale/autoload/ale/handlers/cspell.vim new file mode 100644 index 0000000..2cd02d5 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/cspell.vim @@ -0,0 +1,54 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: Define a handler function for cspell's output + +function! ale#handlers#cspell#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, + \ 'cspell', [ + \ 'node_modules/.bin/cspell', + \ 'node_modules/cspell/bin.js', + \ ] + \) +endfunction + +function! ale#handlers#cspell#GetCommand(buffer) abort + let l:executable = ale#handlers#cspell#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'cspell_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . ' lint --no-color --no-progress --no-summary' + \ . ale#Pad(l:options) + \ . ' -- stdin' +endfunction + +function! ale#handlers#cspell#Handle(buffer, lines) abort + " Look for lines like the following: + " + " /home/user/repos/ale/README.md:723:48 - Unknown word (stylelint) + let l:pattern = '\v^.*:(\d+):(\d+) - (.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3], + \ 'type': 'W', + \}) + endfor + + return l:output +endfunction + +function! ale#handlers#cspell#DefineLinter(filetype) abort + call ale#Set('cspell_executable', 'cspell') + call ale#Set('cspell_options', '') + call ale#Set('cspell_use_global', get(g:, 'ale_use_global_executables', 0)) + + call ale#linter#Define(a:filetype, { + \ 'name': 'cspell', + \ 'executable': function('ale#handlers#cspell#GetExecutable'), + \ 'command': function('ale#handlers#cspell#GetCommand'), + \ 'callback': 'ale#handlers#cspell#Handle', + \}) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/css.vim b/dot_vim/plugged/ale/autoload/ale/handlers/css.vim new file mode 100644 index 0000000..de9eadc --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/css.vim @@ -0,0 +1,70 @@ +scriptencoding utf-8 +" Author: w0rp +" Description: Error handling for CSS linters. + +function! ale#handlers#css#HandleCSSLintFormat(buffer, lines) abort + " Matches patterns line the following: + " + " something.css: line 2, col 1, Error - Expected RBRACE at line 2, col 1. (errors) + " something.css: line 2, col 5, Warning - Expected (inline | block | list-item | inline-block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | grid | inline-grid | run-in | ruby | ruby-base | ruby-text | ruby-base-container | ruby-text-container | contents | none | -moz-box | -moz-inline-block | -moz-inline-box | -moz-inline-grid | -moz-inline-stack | -moz-inline-table | -moz-grid | -moz-grid-group | -moz-grid-line | -moz-groupbox | -moz-deck | -moz-popup | -moz-stack | -moz-marker | -webkit-box | -webkit-inline-box | -ms-flexbox | -ms-inline-flexbox | flex | -webkit-flex | inline-flex | -webkit-inline-flex) but found 'wat'. (known-properties) + " + " These errors can be very massive, so the type will be moved to the front + " so you can actually read the error type. + let l:pattern = '\v^.*: line (\d+), col (\d+), (Error|Warning) - (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:match[3] is# 'Warning' ? 'W' : 'E', + \ 'text': l:match[4], + \} + + let l:code_match = matchlist(l:match[4], '\v(.+) \(([^(]+)\)$') + + " Split up the error code and the text if we find one. + if !empty(l:code_match) + let l:item.text = l:code_match[1] + let l:item.code = l:code_match[2] + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +function! ale#handlers#css#HandleStyleLintFormat(buffer, lines) abort + let l:exception_pattern = '\v^Error:' + + for l:line in a:lines[:10] + if len(matchlist(l:line, l:exception_pattern)) > 0 + return [{ + \ 'lnum': 1, + \ 'text': 'stylelint exception thrown (type :ALEDetail for more information)', + \ 'detail': join(a:lines, "\n"), + \}] + endif + endfor + + " Matches patterns line the following: + " + " src/main.css + " 108:10 ✖ Unexpected leading zero number-leading-zero + " 116:20 ✖ Expected a trailing semicolon declaration-block-trailing-semicolon + let l:pattern = '\v^.* (\d+):(\d+) \s+(\S+)\s+ (.*[^ ])\s+([^ ]+)\s*$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:match[3] is# '✖' ? 'E' : 'W', + \ 'text': l:match[4], + \ 'code': l:match[5], + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/deno.vim b/dot_vim/plugged/ale/autoload/ale/handlers/deno.vim new file mode 100644 index 0000000..b762f98 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/deno.vim @@ -0,0 +1,76 @@ +" Author: Mohammed Chelouti - https://github.com/motato1 +" Arnold Chand +" Description: Handler functions for Deno. + +call ale#Set('deno_executable', 'deno') +call ale#Set('deno_unstable', 0) +call ale#Set('deno_importMap', 'import_map.json') +call ale#Set('deno_lsp_project_root', '') + +function! ale#handlers#deno#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'deno_executable') +endfunction + +" Find project root for Deno's language server. +" +" Deno projects do not require a project or configuration file at the project root. +" This means the root directory has to be guessed, +" unless it is explicitly specified by the user. +" +" The project root is determined by ... +" 1. using a user-specified value from deno_lsp_project_root +" 2. looking for common top-level files/dirs +" 3. using the buffer's directory +function! ale#handlers#deno#GetProjectRoot(buffer) abort + let l:project_root = ale#Var(a:buffer, 'deno_lsp_project_root') + + if !empty(l:project_root) + return l:project_root + endif + + let l:possible_project_roots = [ + \ 'deno.json', + \ 'deno.jsonc', + \ 'tsconfig.json', + \ '.git', + \ bufname(a:buffer), + \] + + for l:possible_root in l:possible_project_roots + let l:project_root = ale#path#FindNearestFile(a:buffer, l:possible_root) + + if empty(l:project_root) + let l:project_root = ale#path#FindNearestDirectory(a:buffer, l:possible_root) + endif + + if !empty(l:project_root) + " dir:p expands to /full/path/to/dir/ whereas + " file:p expands to /full/path/to/file (no trailing slash) + " Appending '/' ensures that :h:h removes the path's last segment + " regardless of whether it is a directory or not. + return fnamemodify(l:project_root . '/', ':p:h:h') + endif + endfor + + return '' +endfunction + +" Initialization Options for deno, for javascript and typescript +function! ale#handlers#deno#GetInitializationOptions(buffer) abort + let l:options = { + \ 'enable': v:true, + \ 'lint': v:true, + \ 'unstable': v:false, + \ 'importMap': ale#path#FindNearestFile(a:buffer, 'import_map.json'), + \ } + + if ale#Var(a:buffer, 'deno_unstable') + let l:options.unstable = v:true + endif + + if ale#Var(a:buffer, 'deno_importMap') isnot# '' + let l:options.importMap = ale#path#FindNearestFile(a:buffer, ale#Var(a:buffer, 'deno_importMap')) + endif + + return l:options +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/elixir.vim b/dot_vim/plugged/ale/autoload/ale/handlers/elixir.vim new file mode 100644 index 0000000..2fddf8e --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/elixir.vim @@ -0,0 +1,28 @@ +" Author: Matteo Centenaro (bugant) - https://github.com/bugant +" Author: Jon Parise +" Description: Functions for working with Elixir projects + +" Find the root directory for an elixir project that uses mix. +function! ale#handlers#elixir#FindMixProjectRoot(buffer) abort + let l:mix_file = ale#path#FindNearestFile(a:buffer, 'mix.exs') + + if !empty(l:mix_file) + return fnamemodify(l:mix_file, ':p:h') + endif + + return '.' +endfunction + +" Similar to ale#handlers#elixir#FindMixProjectRoot but also continue the +" search upward for a potential umbrella project root. If an umbrella root +" does not exist, the initial project root will be returned. +function! ale#handlers#elixir#FindMixUmbrellaRoot(buffer) abort + let l:app_root = ale#handlers#elixir#FindMixProjectRoot(a:buffer) + let l:umbrella_root = fnamemodify(l:app_root, ':h:h') + + if filereadable(l:umbrella_root . '/mix.exs') + return l:umbrella_root + endif + + return l:app_root +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/eslint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/eslint.vim new file mode 100644 index 0000000..374460b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/eslint.vim @@ -0,0 +1,280 @@ +" Author: w0rp +" Description: Functions for working with eslint, for checking or fixing files. + +let s:executables = [ +\ '.yarn/sdks/eslint/bin/eslint.js', +\ 'node_modules/.bin/eslint_d', +\ 'node_modules/eslint/bin/eslint.js', +\ 'node_modules/.bin/eslint', +\] +let s:sep = has('win32') ? '\' : '/' + +call ale#Set('javascript_eslint_options', '') +call ale#Set('javascript_eslint_executable', 'eslint') +call ale#Set('javascript_eslint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('javascript_eslint_suppress_eslintignore', 0) +call ale#Set('javascript_eslint_suppress_missing_config', 0) + +function! ale#handlers#eslint#FindConfig(buffer) abort + for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + for l:basename in [ + \ '.eslintrc.js', + \ '.eslintrc.yaml', + \ '.eslintrc.yml', + \ '.eslintrc.json', + \ '.eslintrc', + \] + let l:config = ale#path#Simplify(join([l:path, l:basename], s:sep)) + + if filereadable(l:config) + return l:config + endif + endfor + endfor + + return ale#path#FindNearestFile(a:buffer, 'package.json') +endfunction + +function! ale#handlers#eslint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'javascript_eslint', s:executables) +endfunction + +" Given a buffer, return an appropriate working directory for ESLint. +function! ale#handlers#eslint#GetCwd(buffer) abort + " ESLint 6 loads plugins/configs/parsers from the project root + " By default, the project root is simply the CWD of the running process. + " https://github.com/eslint/rfcs/blob/master/designs/2018-simplified-package-loading/README.md + " https://github.com/dense-analysis/ale/issues/2787 + " + " If eslint is installed in a directory which contains the buffer, assume + " it is the ESLint project root. Otherwise, use nearest node_modules. + " Note: If node_modules not present yet, can't load local deps anyway. + let l:executable = ale#path#FindNearestExecutable(a:buffer, s:executables) + + if !empty(l:executable) + let l:modules_index = strridx(l:executable, 'node_modules') + let l:modules_root = l:modules_index > -1 ? l:executable[0:l:modules_index - 2] : '' + + let l:sdks_index = strridx(l:executable, ale#path#Simplify('.yarn/sdks')) + let l:sdks_root = l:sdks_index > -1 ? l:executable[0:l:sdks_index - 2] : '' + else + let l:modules_dir = ale#path#FindNearestDirectory(a:buffer, 'node_modules') + let l:modules_root = !empty(l:modules_dir) ? fnamemodify(l:modules_dir, ':h:h') : '' + + let l:sdks_dir = ale#path#FindNearestDirectory(a:buffer, ale#path#Simplify('.yarn/sdks')) + let l:sdks_root = !empty(l:sdks_dir) ? fnamemodify(l:sdks_dir, ':h:h:h') : '' + endif + + return strlen(l:modules_root) > strlen(l:sdks_root) ? l:modules_root : l:sdks_root +endfunction + +function! ale#handlers#eslint#GetCommand(buffer) abort + let l:executable = ale#handlers#eslint#GetExecutable(a:buffer) + + let l:options = ale#Var(a:buffer, 'javascript_eslint_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' -f json --stdin --stdin-filename %s' +endfunction + +function! s:AddHintsForTypeScriptParsingErrors(output) abort + for l:item in a:output + let l:item.text = substitute( + \ l:item.text, + \ '^\(Parsing error\)', + \ '\1 (You may need configure typescript-eslint-parser)', + \ '', + \) + endfor +endfunction + +function! s:CheckForBadConfig(buffer, lines) abort + let l:config_error_pattern = '\v^ESLint couldn''t find a configuration file' + \ . '|^Cannot read config file' + \ . '|^.*Configuration for rule .* is invalid' + \ . '|^ImportDeclaration should appear' + + " Look for a message in the first few lines which indicates that + " a configuration file couldn't be found. + for l:line in a:lines[:10] + let l:match = matchlist(l:line, l:config_error_pattern) + + if len(l:match) > 0 + " Don't show the missing config error if we've disabled it. + if ale#Var(a:buffer, 'javascript_eslint_suppress_missing_config') + \&& l:match[0] is# 'ESLint couldn''t find a configuration file' + return 0 + endif + + return 1 + endif + endfor + + return 0 +endfunction + +function! s:parseJSON(buffer, lines) abort + let l:parsed = [] + + for l:line in a:lines + try + let l:parsed = extend(l:parsed, json_decode(l:line)) + catch + endtry + endfor + + if type(l:parsed) != v:t_list || empty(l:parsed) + return [] + endif + + let l:errors = l:parsed[0]['messages'] + + if empty(l:errors) + return [] + endif + + let l:output = [] + + for l:error in l:errors + let l:obj = ({ + \ 'lnum': get(l:error, 'line', 0), + \ 'text': get(l:error, 'message', ''), + \ 'type': 'E', + \}) + + if get(l:error, 'severity', 0) is# 1 + let l:obj.type = 'W' + endif + + if has_key(l:error, 'ruleId') + let l:code = l:error['ruleId'] + + " Sometimes ESLint returns null here + if !empty(l:code) + let l:obj.code = l:code + endif + endif + + if has_key(l:error, 'column') + let l:obj.col = l:error['column'] + endif + + if has_key(l:error, 'endColumn') + let l:obj.end_col = l:error['endColumn'] - 1 + endif + + if has_key(l:error, 'endLine') + let l:obj.end_lnum = l:error['endLine'] + endif + + call add(l:output, l:obj) + endfor + + return l:output +endfunction + +let s:col_end_patterns = [ +\ '\vParsing error: Unexpected token (.+) ?', +\ '\v''(.+)'' is not defined.', +\ '\v%(Unexpected|Redundant use of) [''`](.+)[''`]', +\ '\vUnexpected (console) statement', +\] + +function! s:parseLines(buffer, lines) abort + " Matches patterns line the following: + " + " /path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle] + " /path/to/some-filename.js:56:41: Missing semicolon. [Error/semi] + let l:pattern = '^.*:\(\d\+\):\(\d\+\): \(.\+\) \[\(.\+\)\]$' + " This second pattern matches lines like the following: + " + " /path/to/some-filename.js:13:3: Parsing error: Unexpected token + let l:parsing_pattern = '^.*:\(\d\+\):\(\d\+\): \(.\+\)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, [l:pattern, l:parsing_pattern]) + let l:text = l:match[3] + + let l:obj = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:text, + \ 'type': 'E', + \} + + " Take the error type from the output if available. + let l:split_code = split(l:match[4], '/') + + if get(l:split_code, 0, '') is# 'Warning' + let l:obj.type = 'W' + endif + + " The code can be something like 'Error/foo/bar', or just 'Error' + if !empty(get(l:split_code, 1)) + let l:obj.code = join(l:split_code[1:], '/') + endif + + for l:col_match in ale#util#GetMatches(l:text, s:col_end_patterns) + let l:obj.end_col = l:obj.col + len(l:col_match[1]) - 1 + endfor + + call add(l:output, l:obj) + endfor + + return l:output +endfunction + +function! s:FilterResult(buffer, obj) abort + if ale#Var(a:buffer, 'javascript_eslint_suppress_eslintignore') + if a:obj.text =~# '^File ignored' + return 0 + endif + endif + + if has_key(a:obj, 'code') && a:obj.code is# 'no-trailing-spaces' + \&& !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + return 0 + endif + + return 1 +endfunction + +function! s:HandleESLintOutput(buffer, lines, type) abort + if s:CheckForBadConfig(a:buffer, a:lines) + return [{ + \ 'lnum': 1, + \ 'text': 'eslint configuration error (type :ALEDetail for more information)', + \ 'detail': join(a:lines, "\n"), + \}] + endif + + if a:lines == ['Could not connect'] + return [{ + \ 'lnum': 1, + \ 'text': 'Could not connect to eslint_d. Try updating eslint_d or killing it.', + \}] + endif + + if a:type is# 'json' + let l:output = s:parseJSON(a:buffer, a:lines) + else + let l:output = s:parseLines(a:buffer, a:lines) + endif + + call filter(l:output, {idx, obj -> s:FilterResult(a:buffer, obj)}) + + if expand('#' . a:buffer . ':t') =~? '\.tsx\?$' + call s:AddHintsForTypeScriptParsingErrors(l:output) + endif + + return l:output +endfunction + +function! ale#handlers#eslint#HandleJSON(buffer, lines) abort + return s:HandleESLintOutput(a:buffer, a:lines, 'json') +endfunction + +function! ale#handlers#eslint#Handle(buffer, lines) abort + return s:HandleESLintOutput(a:buffer, a:lines, 'lines') +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/fecs.vim b/dot_vim/plugged/ale/autoload/ale/handlers/fecs.vim new file mode 100644 index 0000000..064b927 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/fecs.vim @@ -0,0 +1,52 @@ +" Author: harttle +" Description: fecs http://fecs.baidu.com/ + +call ale#Set('javascript_fecs_executable', 'fecs') +call ale#Set('javascript_fecs_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale#handlers#fecs#GetCommand(buffer) abort + return '%e check --colors=false --rule=true %t' +endfunction + +function! ale#handlers#fecs#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'javascript_fecs', [ + \ 'node_modules/.bin/fecs', + \ 'node_modules/fecs/bin/fecs', + \]) +endfunction + +function! ale#handlers#fecs#Handle(buffer, lines) abort + " Matches patterns looking like the following + " + " fecs WARN → line 20, col 25: Unexpected console statement. (no-console) + " fecs ERROR → line 24, col 36: Missing radix parameter. (radix) + " + let l:pattern = '\v^.*(WARN|ERROR)\s+→\s+line (\d+),\s+col\s+(\d+):\s+(.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:obj = { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[4] + \} + + let l:code_match = matchlist(l:match[4], '\v^(.{-})\s*\((.+)\)$') + + if !empty(l:code_match) + let l:obj.code = l:code_match[2] + let l:obj.text = l:code_match[1] + endif + + if l:match[1] is# 'WARN' + let l:obj.type = 'W' + elseif l:match[1] is# 'ERROR' + let l:obj.type = 'E' + endif + + call add(l:output, l:obj) + endfor + + return l:output +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/flawfinder.vim b/dot_vim/plugged/ale/autoload/ale/handlers/flawfinder.vim new file mode 100644 index 0000000..b7d2bec --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/flawfinder.vim @@ -0,0 +1,48 @@ +scriptencoding utf-8 +" Author: Christian Gibbons +" Description: This file defines a handler function that should work for the +" flawfinder format with the -CDQS flags. + +" Swiped this function from the GCC handler. Not sure if needed, but doesn't +" hurt to have it. +function! s:RemoveUnicodeQuotes(text) abort + let l:text = a:text + let l:text = substitute(l:text, '[`´‘’]', '''', 'g') + let l:text = substitute(l:text, '\v\\u2018([^\\]+)\\u2019', '''\1''', 'g') + let l:text = substitute(l:text, '[“â€]', '"', 'g') + + return l:text +endfunction + +function! ale#handlers#flawfinder#HandleFlawfinderFormat(buffer, lines) abort + " Look for lines like the following. + " + " :12:4: [2] (buffer) char:Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. + " :31:4: [1] (buffer) strncpy:Easily used incorrectly; doesn't always \0-terminate or check for invalid pointers [MS-banned] (CWE-120). + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)?:? ( \[[0-5]\] [^:]+):(.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + " Use severity level to determine if it should be considered a warning + " or error. + let l:severity = str2nr(matchstr(split(l:match[4])[0], '[0-5]')) + + let l:item = { + \ 'lnum': str2nr(l:match[2]), + \ 'col': str2nr(l:match[3]), + \ 'type': (l:severity < ale#Var(a:buffer, 'c_flawfinder_error_severity')) + \ ? 'W' : 'E', + \ 'text': s:RemoveUnicodeQuotes(join(split(l:match[4])[1:]) . ': ' . l:match[5]), + \} + + " If the filename is something like , or -, then + " this is an error for the file we checked. + if l:match[1] isnot# '-' && l:match[1][0] isnot# '<' + let l:item['filename'] = l:match[1] + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/gawk.vim b/dot_vim/plugged/ale/autoload/ale/handlers/gawk.vim new file mode 100644 index 0000000..50bc4c4 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/gawk.vim @@ -0,0 +1,27 @@ +" Author: Anthony DeDominic +" Description: Handle output from gawk's --lint option + +function! ale#handlers#gawk#HandleGawkFormat(buffer, lines) abort + " Look for lines like the following: + " gawk: /tmp/v0fddXz/1/something.awk:1: ^ invalid char ''' in expression + let l:pattern = '^.\{-}:\(\d\+\):\s\+\(warning:\|\^\)\s*\(.*\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:ecode = 'E' + + if l:match[2] is? 'warning:' + let l:ecode = 'W' + endif + + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': 0, + \ 'text': l:match[3], + \ 'code': 0, + \ 'type': l:ecode, + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/gcc.vim b/dot_vim/plugged/ale/autoload/ale/handlers/gcc.vim new file mode 100644 index 0000000..0b37c98 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/gcc.vim @@ -0,0 +1,176 @@ +scriptencoding utf-8 +" Author: w0rp +" Description: This file defines a handler function which ought to work for +" any program which outputs errors in the format that GCC uses. + +let s:pragma_error = '#pragma once in main file' + +" Look for lines like the following. +" +" :8:5: warning: conversion lacks type at end of format [-Wformat=] +" :10:27: error: invalid operands to binary - (have ‘int’ and ‘char *’) +" -:189:7: note: $/${} is unnecessary on arithmetic variables. [SC2004] +let s:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+)?:?(\d+)?:? ([^:]+): (.+)$' +let s:inline_pattern = '\v inlined from .* at \:(\d+):(\d+):$' + +function! s:IsHeaderFile(filename) abort + return a:filename =~? '\v\.(h|hpp)$' +endfunction + +function! s:RemoveUnicodeQuotes(text) abort + let l:text = a:text + let l:text = substitute(l:text, '[`´‘’]', '''', 'g') + let l:text = substitute(l:text, '\v\\u2018([^\\]+)\\u2019', '''\1''', 'g') + let l:text = substitute(l:text, '[“â€]', '"', 'g') + + return l:text +endfunction + +function! s:ParseInlinedFunctionProblems(buffer, lines) abort + let l:output = [] + let l:pos_match = [] + + for l:line in a:lines + let l:match = matchlist(l:line, s:pattern) + + if !empty(l:match) && !empty(l:pos_match) + call add(l:output, { + \ 'lnum': str2nr(l:pos_match[1]), + \ 'col': str2nr(l:pos_match[2]), + \ 'type': (l:match[4] is# 'error' || l:match[4] is# 'fatal error') ? 'E' : 'W', + \ 'text': s:RemoveUnicodeQuotes(l:match[5]), + \}) + endif + + let l:pos_match = matchlist(l:line, s:inline_pattern) + endfor + + return l:output +endfunction + +" Report problems inside of header files just for gcc and clang +function! s:ParseProblemsInHeaders(buffer, lines) abort + let l:output = [] + let l:include_item = {} + + for l:line in a:lines[: -2] + let l:include_match = matchlist(l:line, '\v^In file included from') + + if !empty(l:include_item) + let l:pattern_match = matchlist(l:line, s:pattern) + + if !empty(l:pattern_match) && l:pattern_match[1] is# '' + if has_key(l:include_item, 'lnum') + call add(l:output, l:include_item) + endif + + let l:include_item = {} + + continue + endif + + let l:include_item.detail .= "\n" . l:line + endif + + if !empty(l:include_match) + if empty(l:include_item) + let l:include_item = { + \ 'text': 'Error found in header. See :ALEDetail', + \ 'detail': l:line, + \} + endif + endif + + if !empty(l:include_item) + let l:stdin_match = matchlist(l:line, '\vfrom \:(\d+):(\d*):?$') + + if !empty(l:stdin_match) + let l:include_item.lnum = str2nr(l:stdin_match[1]) + + if str2nr(l:stdin_match[2]) + let l:include_item.col = str2nr(l:stdin_match[2]) + endif + endif + endif + endfor + + if !empty(l:include_item) && has_key(l:include_item, 'lnum') + call add(l:output, l:include_item) + endif + + return l:output +endfunction + +function! ale#handlers#gcc#HandleGCCFormat(buffer, lines) abort + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, s:pattern) + " Filter out the pragma errors + if s:IsHeaderFile(bufname(bufnr(''))) + \&& l:match[5][:len(s:pragma_error) - 1] is# s:pragma_error + continue + endif + + " If the 'error type' is a note, make it detail related to + " the previous error parsed in output + if l:match[4] is# 'note' + if !empty(l:output) + if !has_key(l:output[-1], 'detail') + let l:output[-1].detail = l:output[-1].text + + " handle macro expansion errors/notes + if l:match[5] =~? '^in expansion of macro ‘\w*\w’$' + " if the macro expansion is in the file we're in, add + " the lnum and col keys to the previous error + if l:match[1] is# '' + \ && !has_key(l:output[-1], 'col') + let l:output[-1].lnum = str2nr(l:match[2]) + let l:output[-1].col = str2nr(l:match[3]) + else + " the error is not in the current file, and since + " macro expansion errors don't show the full path to + " the error from the current file, we have to just + " give out a generic error message + let l:output[-1].text = 'Error found in macro expansion. See :ALEDetail' + endif + endif + endif + + let l:output[-1].detail = l:output[-1].detail . "\n" + \ . s:RemoveUnicodeQuotes(l:match[0]) + endif + + continue + endif + + let l:item = { + \ 'lnum': str2nr(l:match[2]), + \ 'type': (l:match[4] is# 'error' || l:match[4] is# 'fatal error') ? 'E' : 'W', + \ 'text': s:RemoveUnicodeQuotes(l:match[5]), + \} + + if !empty(l:match[3]) + let l:item.col = str2nr(l:match[3]) + endif + + " If the filename is something like , or -, then + " this is an error for the file we checked. + if l:match[1] isnot# '-' && l:match[1][0] isnot# '<' + let l:item['filename'] = l:match[1] + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +" Handle problems with the GCC format, but report problems inside of headers. +function! ale#handlers#gcc#HandleGCCFormatWithIncludes(buffer, lines) abort + let l:output = ale#handlers#gcc#HandleGCCFormat(a:buffer, a:lines) + + call extend(l:output, s:ParseInlinedFunctionProblems(a:buffer, a:lines)) + call extend(l:output, s:ParseProblemsInHeaders(a:buffer, a:lines)) + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/go.vim b/dot_vim/plugged/ale/autoload/ale/handlers/go.vim new file mode 100644 index 0000000..c969669 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/go.vim @@ -0,0 +1,29 @@ +" Author: neersighted +" Description: go vet for Go files +" +" Author: John Eikenberry +" Description: updated to work with go1.10 +" +" Author: Ben Paxton +" Description: moved to generic Golang file from govet +" +" Author: mostfunkyduck +" Description: updated to work with go 1.14 + +function! ale#handlers#go#Handler(buffer, lines) abort + let l:pattern = '\v^%(vet: )?([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?:? ?(.+)$' + let l:output = [] + let l:dir = expand('#' . a:buffer . ':p:h') + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:match[1]), + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:match[4], + \ 'type': 'E', + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/haskell.vim b/dot_vim/plugged/ale/autoload/ale/handlers/haskell.vim new file mode 100644 index 0000000..70a3a7e --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/haskell.vim @@ -0,0 +1,119 @@ +" Author: w0rp +" Description: Error handling for the format GHC outputs. +" +function! ale#handlers#haskell#GetStackExecutable(bufnr) abort + if ale#path#FindNearestFile(a:bufnr, 'stack.yaml') isnot# '' + return 'stack' + endif + + " if there is no stack.yaml file, we don't use stack even if it exists, + " so we return '', because executable('') apparently always fails + return '' +endfunction + +" Remember the directory used for temporary files for Vim. +let s:temp_dir = fnamemodify(ale#util#Tempname(), ':h') +" Build part of a regular expression for matching ALE temporary filenames. +let s:temp_regex_prefix = +\ '\M' +\ . substitute(s:temp_dir, '\\', '\\\\', 'g') +\ . '\.\{-}' + +function! s:PanicOutput(lines) abort + return [{ + \ 'lnum': 1, + \ 'col': 1, + \ 'text': 'ghc panic!', + \ 'type': 'E', + \ 'detail' : join(a:lines, "\n"), + \}] +endfunction + +function! ale#handlers#haskell#HandleGHCFormat(buffer, lines) abort + " Look for lines like the following. + " + "Appoint/Lib.hs:8:1: warning: + "Appoint/Lib.hs:8:1: + let l:basename = expand('#' . a:buffer . ':t') + " Build a complete regular expression for replacing temporary filenames + " in Haskell error messages with the basename for this file. + let l:temp_filename_regex = s:temp_regex_prefix . l:basename + + let l:pattern = '\v^\s*([a-zA-Z]?:?[^:]+):(\d+):(\d+):(.*)?$' + let l:output = [] + + let l:corrected_lines = [] + + " If ghc panic error, put the whole message in details and exit. + let l:panic_position = match(a:lines,'ghc: panic!') + let l:panic_end = match(a:lines,'Please report this as a GHC bug:') + + if l:panic_position >= 0 + return s:PanicOutput(a:lines[l:panic_position : l:panic_end]) + endif + + " Group the lines into smaller lists. + for l:line in a:lines + if len(matchlist(l:line, l:pattern)) > 0 + call add(l:corrected_lines, [l:line]) + elseif l:line is# '' + call add(l:corrected_lines, [l:line]) + elseif len(l:corrected_lines) > 0 + call add(l:corrected_lines[-1], l:line) + endif + endfor + + for l:line_list in l:corrected_lines + " Join the smaller lists into one large line to parse. + let l:line = l:line_list[0] + + for l:extra_line in l:line_list[1:] + let l:line .= substitute(l:extra_line, '\v^\s+', ' ', '') + endfor + + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + continue + endif + + if !ale#path#IsBufferPath(a:buffer, l:match[1]) + continue + endif + + let l:errors = matchlist(l:match[4], '\v([wW]arning|[eE]rror): ?(.*)') + + if len(l:errors) > 0 + let l:ghc_type = l:errors[1] + let l:text = l:errors[2] + else + let l:ghc_type = '' + let l:text = l:match[4][:0] is# ' ' ? l:match[4][1:] : l:match[4] + endif + + if l:ghc_type is? 'Warning' + let l:type = 'W' + else + let l:type = 'E' + endif + + " Replace temporary filenames in problem messages with the basename + let l:text = substitute(l:text, l:temp_filename_regex, l:basename, 'g') + + let l:item = { + \ 'lnum': l:match[2] + 0, + \ 'col': l:match[3] + 0, + \ 'text': l:text, + \ 'type': l:type, + \} + + " Include extra lines as details if they are there. + if len(l:line_list) > 1 + let l:item.detail = join(l:line_list[1:], "\n") + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/haskell_stack.vim b/dot_vim/plugged/ale/autoload/ale/handlers/haskell_stack.vim new file mode 100644 index 0000000..108301a --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/haskell_stack.vim @@ -0,0 +1,7 @@ +function! ale#handlers#haskell_stack#EscapeExecutable(executable, stack_exec) abort + let l:exec_args = a:executable =~? 'stack$' + \ ? ' exec ' . ale#Escape(a:stack_exec) . ' --' + \ : '' + + return ale#Escape(a:executable) . l:exec_args +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/hdl_checker.vim b/dot_vim/plugged/ale/autoload/ale/handlers/hdl_checker.vim new file mode 100644 index 0000000..e871b08 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/hdl_checker.vim @@ -0,0 +1,73 @@ +" Author: suoto +" Description: Adds support for HDL Code Checker, which wraps vcom/vlog, ghdl +" or xvhdl. More info on https://github.com/suoto/hdl_checker + +call ale#Set('hdl_checker_executable', 'hdl_checker') +call ale#Set('hdl_checker_config_file', has('unix') ? '.hdl_checker.config' : '_hdl_checker.config') +call ale#Set('hdl_checker_options', '') + +" Use this as a function so we can mock it on testing. Need to do this because +" test files are inside /testplugin (which refers to the ale repo), which will +" always have a .git folder +function! ale#handlers#hdl_checker#IsDotGit(path) abort + return ! empty(a:path) && isdirectory(a:path) +endfunction + +" Should return (in order of preference) +" 1. Nearest config file +" 2. Nearest .git directory +" 3. The current path +function! ale#handlers#hdl_checker#GetProjectRoot(buffer) abort + let l:project_root = ale#path#FindNearestFile( + \ a:buffer, + \ ale#Var(a:buffer, 'hdl_checker_config_file')) + + if !empty(l:project_root) + return fnamemodify(l:project_root, ':h') + endif + + " Search for .git to use as root + let l:project_root = ale#path#FindNearestDirectory(a:buffer, '.git') + + if ale#handlers#hdl_checker#IsDotGit(l:project_root) + return fnamemodify(l:project_root, ':h:h') + endif + + return '' +endfunction + +function! ale#handlers#hdl_checker#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'hdl_checker_executable') +endfunction + +function! ale#handlers#hdl_checker#GetCommand(buffer) abort + let l:command = ale#Escape(ale#handlers#hdl_checker#GetExecutable(a:buffer)) . ' --lsp' + + " Add extra parameters only if config has been set + let l:options = ale#Var(a:buffer, 'hdl_checker_options') + + if ! empty(l:options) + let l:command = l:command . ' ' . l:options + endif + + return l:command +endfunction + +" To allow testing +function! ale#handlers#hdl_checker#GetInitOptions(buffer) abort + return {'project_file': ale#Var(a:buffer, 'hdl_checker_config_file')} +endfunction + +" Define the hdl_checker linter for a given filetype. +function! ale#handlers#hdl_checker#DefineLinter(filetype) abort + call ale#linter#Define(a:filetype, { + \ 'name': 'hdl-checker', + \ 'lsp': 'stdio', + \ 'language': a:filetype, + \ 'executable': function('ale#handlers#hdl_checker#GetExecutable'), + \ 'command': function('ale#handlers#hdl_checker#GetCommand'), + \ 'project_root': function('ale#handlers#hdl_checker#GetProjectRoot'), + \ 'initialization_options': function('ale#handlers#hdl_checker#GetInitOptions'), + \ }) +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/hlint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/hlint.vim new file mode 100644 index 0000000..b9a8c32 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/hlint.vim @@ -0,0 +1,8 @@ +call ale#Set('haskell_hlint_executable', 'hlint') +call ale#Set('haskell_hlint_options', get(g:, 'hlint_options', '')) + +function! ale#handlers#hlint#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'haskell_hlint_executable') + + return ale#handlers#haskell_stack#EscapeExecutable(l:executable, 'hlint') +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/inko.vim b/dot_vim/plugged/ale/autoload/ale/handlers/inko.vim new file mode 100644 index 0000000..73f0687 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/inko.vim @@ -0,0 +1,37 @@ +" Author: Yorick Peterse +" Description: output handlers for the Inko JSON format + +function! ale#handlers#inko#GetType(severity) abort + if a:severity is? 'warning' + return 'W' + endif + + return 'E' +endfunction + +function! ale#handlers#inko#Handle(buffer, lines) abort + try + let l:errors = json_decode(join(a:lines, '')) + catch + return [] + endtry + + if empty(l:errors) + return [] + endif + + let l:output = [] + let l:dir = expand('#' . a:buffer . ':p:h') + + for l:error in l:errors + call add(l:output, { + \ 'filename': ale#path#GetAbsPath(l:dir, l:error['file']), + \ 'lnum': l:error['line'], + \ 'col': l:error['column'], + \ 'text': l:error['message'], + \ 'type': ale#handlers#inko#GetType(l:error['level']), + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/ktlint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/ktlint.vim new file mode 100644 index 0000000..77e7ab6 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/ktlint.vim @@ -0,0 +1,45 @@ +" Author: Michael Phillips +" Description: Handler functions for ktlint. + +call ale#Set('kotlin_ktlint_executable', 'ktlint') +call ale#Set('kotlin_ktlint_rulesets', []) +call ale#Set('kotlin_ktlint_options', '') + +function! ale#handlers#ktlint#GetCommand(buffer) abort + let l:executable = ale#Var(a:buffer, 'kotlin_ktlint_executable') + let l:options = ale#Var(a:buffer, 'kotlin_ktlint_options') + let l:rulesets = ale#handlers#ktlint#GetRulesets(a:buffer) + + return ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options) + \ . (empty(l:rulesets) ? '' : ' ' . l:rulesets) + \ . ' --stdin' +endfunction + +function! ale#handlers#ktlint#GetRulesets(buffer) abort + let l:rulesets = map(ale#Var(a:buffer, 'kotlin_ktlint_rulesets'), '''--ruleset '' . v:val') + + return join(l:rulesets, ' ') +endfunction + +function! ale#handlers#ktlint#Handle(buffer, lines) abort + let l:message_pattern = '^\(.*\):\([0-9]\+\):\([0-9]\+\):\s\+\(.*\)' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:message_pattern) + let l:line = l:match[2] + 0 + let l:column = l:match[3] + 0 + let l:text = l:match[4] + + let l:type = l:text =~? 'not a valid kotlin file' ? 'E' : 'W' + + call add(l:output, { + \ 'lnum': l:line, + \ 'col': l:column, + \ 'text': l:text, + \ 'type': l:type + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/languagetool.vim b/dot_vim/plugged/ale/autoload/ale/handlers/languagetool.vim new file mode 100644 index 0000000..73974ce --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/languagetool.vim @@ -0,0 +1,77 @@ +" Author: Vincent (wahrwolf [at] wolfpit.net) +" Description: languagetool for markdown files +" +call ale#Set('languagetool_executable', 'languagetool') +call ale#Set('languagetool_options', '--autoDetect') + +function! ale#handlers#languagetool#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'languagetool_executable') +endfunction + +function! ale#handlers#languagetool#GetCommand(buffer) abort + let l:executable = ale#handlers#languagetool#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'languagetool_options') + + return ale#Escape(l:executable) + \ . (empty(l:options) ? '' : ' ' . l:options) . ' %s' +endfunction + +function! ale#handlers#languagetool#HandleOutput(buffer, lines) abort + " Match lines like: + " 1.) Line 5, column 1, Rule ID: + let l:head_pattern = '^\v.+.\) Line (\d+), column (\d+), Rule ID. (.+)$' + let l:head_matches = ale#util#GetMatches(a:lines, l:head_pattern) + + " Match lines like: + " Message: Did you forget a comma after a conjunctive/linking adverb? + let l:message_pattern = '^\vMessage. (.+)$' + let l:message_matches = ale#util#GetMatches(a:lines, l:message_pattern) + + " Match lines like: + " ^^^^^ " + let l:markers_pattern = '^\v *(\^+) *$' + let l:markers_matches = ale#util#GetMatches(a:lines, l:markers_pattern) + + let l:output = [] + + + " Okay tbh I was to lazy to figure out a smarter solution here + " We just check that the arrays are same sized and merge everything + " together + let l:i = 0 + + while l:i < len(l:head_matches) + \ && ( + \ (len(l:head_matches) == len(l:markers_matches)) + \ && (len(l:head_matches) == len(l:message_matches)) + \ ) + let l:item = { + \ 'lnum' : str2nr(l:head_matches[l:i][1]), + \ 'col' : str2nr(l:head_matches[l:i][2]), + \ 'end_col' : str2nr(l:head_matches[l:i][2]) + len(l:markers_matches[l:i][1])-1, + \ 'type' : 'W', + \ 'code' : l:head_matches[l:i][3], + \ 'text' : l:message_matches[l:i][1] + \} + call add(l:output, l:item) + let l:i+=1 + endwhile + + return l:output +endfunction + +" Define the languagetool linter for a given filetype. +" TODO: +" - Add language detection settings based on user env (for mothertongue) +" - Add fixer +" - Add config options for rules +function! ale#handlers#languagetool#DefineLinter(filetype) abort + call ale#linter#Define(a:filetype, { + \ 'name': 'languagetool', + \ 'executable': function('ale#handlers#languagetool#GetExecutable'), + \ 'command': function('ale#handlers#languagetool#GetCommand'), + \ 'output_stream': 'stdout', + \ 'callback': 'ale#handlers#languagetool#HandleOutput', + \ 'lint_file': 1, + \}) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/markdownlint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/markdownlint.vim new file mode 100644 index 0000000..6c273bd --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/markdownlint.vim @@ -0,0 +1,24 @@ +" Author: Ty-Lucas Kelley +" Description: Adds support for markdownlint + +function! ale#handlers#markdownlint#Handle(buffer, lines) abort + let l:pattern=': \?\(\d\+\)\(:\(\d\+\)\?\)\? \(MD\d\{3}/[A-Za-z0-9-/]\+\) \(.*\)$' + let l:output=[] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:result = ({ + \ 'lnum': l:match[1] + 0, + \ 'code': l:match[4], + \ 'text': l:match[5], + \ 'type': 'W', + \}) + + if len(l:match[3]) > 0 + let l:result.col = (l:match[3] + 0) + endif + + call add(l:output, l:result) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/naga.vim b/dot_vim/plugged/ale/autoload/ale/handlers/naga.vim new file mode 100644 index 0000000..6480aba --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/naga.vim @@ -0,0 +1,30 @@ +" Author: rhysd +" Description: Handle errors for naga-cli. + +function! ale#handlers#naga#Handle(buffer, lines) abort + let l:errors = [] + let l:current_error = v:null + + for l:line in a:lines + if l:line =~# '^error: ' + let l:text = l:line[7:] + let l:current_error = { 'text': l:text, 'type': 'E' } + continue + endif + + if l:current_error isnot v:null + let l:matches = matchlist(l:line, '\v:(\d+):(\d+)$') + + if !empty(l:matches) + let l:current_error.lnum = str2nr(l:matches[1]) + let l:current_error.col = str2nr(l:matches[2]) + call add(l:errors, l:current_error) + let l:current_error = v:null + continue + endif + endif + endfor + + return l:errors +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/ocamllsp.vim b/dot_vim/plugged/ale/autoload/ale/handlers/ocamllsp.vim new file mode 100644 index 0000000..2738ea2 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/ocamllsp.vim @@ -0,0 +1,30 @@ +" Author: Risto Stevcev +" Description: Handlers for the official OCaml language server + +let s:language_id_of_filetype = { +\ 'menhir': 'ocaml.menhir', +\ 'ocaml': 'ocaml', +\ 'ocamlinterface': 'ocaml.interface', +\ 'ocamllex': 'ocaml.lex' +\} + +function! ale#handlers#ocamllsp#GetExecutable(buffer) abort + return 'ocamllsp' +endfunction + +function! ale#handlers#ocamllsp#GetCommand(buffer) abort + let l:executable = ale#handlers#ocamllsp#GetExecutable(a:buffer) + let l:ocaml_ocamllsp_use_opam = ale#Var(a:buffer, 'ocaml_ocamllsp_use_opam') + + return l:ocaml_ocamllsp_use_opam ? 'opam config exec -- ' . l:executable : l:executable +endfunction + +function! ale#handlers#ocamllsp#GetLanguage(buffer) abort + return s:language_id_of_filetype[getbufvar(a:buffer, '&filetype')] +endfunction + +function! ale#handlers#ocamllsp#GetProjectRoot(buffer) abort + let l:dune_project_file = ale#path#FindNearestFile(a:buffer, 'dune-project') + + return !empty(l:dune_project_file) ? fnamemodify(l:dune_project_file, ':h') : '' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/ols.vim b/dot_vim/plugged/ale/autoload/ale/handlers/ols.vim new file mode 100644 index 0000000..c292c6d --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/ols.vim @@ -0,0 +1,26 @@ +" Author: Michael Jungo +" Description: Handlers for the OCaml language server + +function! ale#handlers#ols#GetExecutable(buffer) abort + let l:ols_setting = ale#handlers#ols#GetLanguage(a:buffer) . '_ols' + + return ale#path#FindExecutable(a:buffer, l:ols_setting, [ + \ 'node_modules/.bin/ocaml-language-server', + \]) +endfunction + +function! ale#handlers#ols#GetCommand(buffer) abort + let l:executable = ale#handlers#ols#GetExecutable(a:buffer) + + return ale#node#Executable(a:buffer, l:executable) . ' --stdio' +endfunction + +function! ale#handlers#ols#GetLanguage(buffer) abort + return getbufvar(a:buffer, '&filetype') +endfunction + +function! ale#handlers#ols#GetProjectRoot(buffer) abort + let l:merlin_file = ale#path#FindNearestFile(a:buffer, '.merlin') + + return !empty(l:merlin_file) ? fnamemodify(l:merlin_file, ':h') : '' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/openscad.vim b/dot_vim/plugged/ale/autoload/ale/handlers/openscad.vim new file mode 100644 index 0000000..33eee31 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/openscad.vim @@ -0,0 +1,73 @@ +scriptencoding utf-8LE +" Description: This file defines a handler function for linting OpenSCAD files +" with SCA2D + +function! ale#handlers#openscad#SCA2D_callback(buffer, lines) abort + " Example output:: + " foo.scad:3:1: W2001: Variable `unused` overwritten within scope. + " foo.scad:1:1: F0001: Cannot read file due to syntax error: + " - No terminal matches '}' in the current parser context, at line 1 col 36 + let l:filename_re = '^\([^:]*\):' + let l:linenum_re = '\([0-9]*\):' + let l:colnum_re = '\([0-9]*\):' + let l:err_id = '\([IWEFU][0-9]\+\):' + let l:err_msg = '\(.*\)' + let l:pattern = filename_re . + \ linenum_re . + \ colnum_re . + \ ' ' . + \ err_id . + \ ' ' . + \ err_msg + + let l:result = [] + let l:idx = 0 + + for l:line in a:lines + let l:matches = matchlist(line, pattern) + + if len(matches) > 0 + " option: Info, Warning, Error, Fatal, Unknown + if index(['I', 'W'], matches[4][0]) >= 0 + let l:type = 'W' + else + let l:type = 'E' + endif + + let l:lnum = matches[2] + let l:col = matches[3] + let l:text = matches[5] + + " Better locations for some syntax errors + if matches[4][0] is# 'F' + let l:syntax_error_re = '^\(.*\), at line \([0-9]\+\) col \([0-9]\+\)$' + let l:next_line = a:lines[idx+1] + let l:syn_err_matches = matchlist(l:next_line, l:syntax_error_re) + + if len(syn_err_matches) > 0 + let l:text = l:text . l:syn_err_matches[1] + let l:lnum = l:syn_err_matches[2] + let l:col = l:syn_err_matches[3] + else + let l:text = l:next_line + endif + endif + + let l:element = { + \ 'lnum': str2nr(l:lnum), + \ 'col': str2nr(l:col), + \ 'text': l:text, + \ 'detail': l:matches[4] . ': ' . l:text, + \ 'filename': fnamemodify(matches[1], ':p'), + \ 'type': l:type + \ } + + call add(l:result, l:element) + endif + + let l:idx += 1 + endfor + + return result + +endfun diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/pony.vim b/dot_vim/plugged/ale/autoload/ale/handlers/pony.vim new file mode 100644 index 0000000..ea84ac4 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/pony.vim @@ -0,0 +1,33 @@ +scriptencoding utf-8 +" Description: This file defines a handler function which ought to work for +" any program which outputs errors in the format that ponyc uses. + +function! s:RemoveUnicodeQuotes(text) abort + let l:text = a:text + let l:text = substitute(l:text, '[`´‘’]', '''', 'g') + let l:text = substitute(l:text, '\v\\u2018([^\\]+)\\u2019', '''\1''', 'g') + let l:text = substitute(l:text, '[“â€]', '"', 'g') + + return l:text +endfunction + +function! ale#handlers#pony#HandlePonycFormat(buffer, lines) abort + " Look for lines like the following. + " /home/code/pony/classes/Wombat.pony:22:30: can't lookup private fields from outside the type + let l:pattern = '\v^([^:]+):(\d+):(\d+)?:? (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'filename': l:match[1], + \ 'lnum': str2nr(l:match[2]), + \ 'col': str2nr(l:match[3]), + \ 'type': 'E', + \ 'text': s:RemoveUnicodeQuotes(l:match[4]), + \} + + call add(l:output, l:item) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/redpen.vim b/dot_vim/plugged/ale/autoload/ale/handlers/redpen.vim new file mode 100644 index 0000000..195057c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/redpen.vim @@ -0,0 +1,65 @@ +" Author: rhysd https://rhysd.github.io +" Description: Redpen, a proofreading tool (http://redpen.cc) + +function! ale#handlers#redpen#HandleRedpenOutput(buffer, lines) abort + " Only one file was passed to redpen. So response array has only one + " element. + let l:res = get(ale#util#FuzzyJSONDecode(a:lines, []), 0, {}) + let l:output = [] + + for l:err in get(l:res, 'errors', []) + let l:item = { + \ 'text': l:err.message, + \ 'type': 'W', + \ 'code': l:err.validator, + \} + + if has_key(l:err, 'startPosition') + let l:item.lnum = l:err.startPosition.lineNum + let l:item.col = l:err.startPosition.offset + 1 + + if has_key(l:err, 'endPosition') + let l:item.end_lnum = l:err.endPosition.lineNum + let l:item.end_col = l:err.endPosition.offset + endif + else + " Fallback to a whole sentence region when a region is not + " specified by the error. + let l:item.lnum = l:err.lineNum + let l:item.col = l:err.sentenceStartColumnNum + 1 + endif + + " Adjust column number for multibyte string + let l:line = getline(l:item.lnum) + + if l:line is# '' + let l:line = l:err.sentence + endif + + let l:line = split(l:line, '\zs') + + if l:item.col >= 2 + let l:col = 0 + + for l:strlen in map(l:line[0:(l:item.col - 2)], 'strlen(v:val)') + let l:col = l:col + l:strlen + endfor + + let l:item.col = l:col + 1 + endif + + if has_key(l:item, 'end_col') + let l:col = 0 + + for l:strlen in map(l:line[0:(l:item.end_col - 1)], 'strlen(v:val)') + let l:col = l:col + l:strlen + endfor + + let l:item.end_col = l:col + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/ruby.vim b/dot_vim/plugged/ale/autoload/ale/handlers/ruby.vim new file mode 100644 index 0000000..7a1c576 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/ruby.vim @@ -0,0 +1,38 @@ +" Author: Brandon Roehl - https://github.com/BrandonRoehl, Matthias Guenther https://wikimatze.de +" +" Description: This file implements handlers specific to Ruby. + +function! s:HandleSyntaxError(buffer, lines) abort + " Matches patterns line the following: + " + " test.rb:3: warning: parentheses after method name is interpreted as an argument list, not a decomposed argument + " test.rb:8: syntax error, unexpected keyword_end, expecting end-of-input + let l:pattern = '\v^.+:(\d+): (warning: )?(.+)$' + let l:column = '\v^(\s+)\^$' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + let l:match = matchlist(l:line, l:column) + + if len(l:match) != 0 + let l:output[len(l:output) - 1]['col'] = len(l:match[1]) + endif + else + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': 0, + \ 'text': l:match[2] . l:match[3], + \ 'type': empty(l:match[2]) ? 'E' : 'W', + \}) + endif + endfor + + return l:output +endfunction + +function! ale#handlers#ruby#HandleSyntaxErrors(buffer, lines) abort + return s:HandleSyntaxError(a:buffer, a:lines) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/rust.vim b/dot_vim/plugged/ale/autoload/ale/handlers/rust.vim new file mode 100644 index 0000000..a7fac46 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/rust.vim @@ -0,0 +1,78 @@ +" Author: Daniel Schemala , +" w0rp +" +" Description: This file implements handlers specific to Rust. + +if !exists('g:ale_rust_ignore_error_codes') + let g:ale_rust_ignore_error_codes = [] +endif + +if !exists('g:ale_rust_ignore_secondary_spans') + let g:ale_rust_ignore_secondary_spans = 0 +endif + +function! s:FindSpan(buffer, span) abort + if ale#path#IsBufferPath(a:buffer, a:span.file_name) || a:span.file_name is# '' + return a:span + endif + + " Search inside the expansion of an error, as the problem for this buffer + " could lie inside a nested object. + if !empty(get(a:span, 'expansion', v:null)) + return s:FindSpan(a:buffer, a:span.expansion.span) + endif + + return {} +endfunction + +function! ale#handlers#rust#HandleRustErrors(buffer, lines) abort + let l:output = [] + + for l:errorline in a:lines + " ignore everything that is not JSON + if l:errorline !~# '^{' + continue + endif + + let l:error = json_decode(l:errorline) + + if has_key(l:error, 'message') && type(l:error.message) is v:t_dict + let l:error = l:error.message + endif + + if !has_key(l:error, 'code') + continue + endif + + if !empty(l:error.code) && index(g:ale_rust_ignore_error_codes, l:error.code.code) > -1 + continue + endif + + for l:root_span in l:error.spans + let l:span = s:FindSpan(a:buffer, l:root_span) + + if ale#Var(a:buffer, 'rust_ignore_secondary_spans') && !get(l:span, 'is_primary', 1) + continue + endif + + if !empty(l:span) + let l:output_line = { + \ 'lnum': l:span.line_start, + \ 'end_lnum': l:span.line_end, + \ 'col': l:span.column_start, + \ 'end_col': l:span.column_end-1, + \ 'text': empty(l:span.label) ? l:error.message : printf('%s: %s', l:error.message, l:span.label), + \ 'type': toupper(l:error.level[0]), + \} + + if has_key(l:error, 'rendered') && !empty(l:error.rendered) + let l:output_line.detail = l:error.rendered + endif + + call add(l:output, l:output_line) + endif + endfor + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/scala.vim b/dot_vim/plugged/ale/autoload/ale/handlers/scala.vim new file mode 100644 index 0000000..3fe7a12 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/scala.vim @@ -0,0 +1,37 @@ +" Author: Nils Leuzinger - https://github.com/PawkyPenguin +" Description: Scala linting handlers for scalac-like compilers. + +function! ale#handlers#scala#HandleScalacLintFormat(buffer, lines) abort + " Matches patterns line the following: + " + " /var/folders/5q/20rgxx3x1s34g3m14n5bq0x80000gn/T/vv6pSsy/0:26: error: expected class or object definition + let l:pattern = '^.\+:\(\d\+\): \(\w\+\): \(.\+\)' + let l:output = [] + let l:ln = 0 + + for l:line in a:lines + let l:ln = l:ln + 1 + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + continue + endif + + let l:text = l:match[3] + let l:type = l:match[2] is# 'error' ? 'E' : 'W' + let l:col = 0 + + if l:ln + 1 < len(a:lines) + let l:col = stridx(a:lines[l:ln + 1], '^') + endif + + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:col + 1, + \ 'text': l:text, + \ 'type': l:type, + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/sh.vim b/dot_vim/plugged/ale/autoload/ale/handlers/sh.vim new file mode 100644 index 0000000..6ed9fea --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/sh.vim @@ -0,0 +1,37 @@ +" Author: w0rp + +function! ale#handlers#sh#GetShellType(buffer) abort + let l:shebang = get(getbufline(a:buffer, 1), 0, '') + + let l:command = '' + + " Take the shell executable from the shebang, if we can. + if l:shebang[:1] is# '#!' + " Remove options like -e, etc. + let l:command = substitute(l:shebang, ' --\?[a-zA-Z0-9]\+', '', 'g') + endif + + " With no shebang line, attempt to use Vim's buffer-local variables. + if l:command is# '' + if getbufvar(a:buffer, 'is_bash', 0) + let l:command = 'bash' + elseif getbufvar(a:buffer, 'is_sh', 0) + let l:command = 'sh' + elseif getbufvar(a:buffer, 'is_kornshell', 0) + let l:command = 'ksh' + endif + endif + + " If we couldn't find a shebang, try the filetype + if l:command is# '' + let l:command = &filetype + endif + + for l:possible_shell in ['bash', 'dash', 'ash', 'tcsh', 'csh', 'zsh', 'ksh', 'sh'] + if l:command =~# l:possible_shell . '\s*$' + return l:possible_shell + endif + endfor + + return '' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/shellcheck.vim b/dot_vim/plugged/ale/autoload/ale/handlers/shellcheck.vim new file mode 100644 index 0000000..17de291 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/shellcheck.vim @@ -0,0 +1,123 @@ +" Author: w0rp +" Description: This file adds support for using the shellcheck linter + +" Shellcheck supports shell directives to define the shell dialect for scripts +" that do not have a shebang for some reason. +" https://github.com/koalaman/shellcheck/wiki/Directive#shell +function! ale#handlers#shellcheck#GetShellcheckDialectDirective(buffer) abort + let l:linenr = 0 + let l:pattern = '\s\{-}#\s\{-}shellcheck\s\{-}shell=\(.*\)' + let l:possible_shell = ['bash', 'dash', 'ash', 'tcsh', 'csh', 'zsh', 'ksh', 'sh'] + + while l:linenr < min([50, line('$')]) + let l:linenr += 1 + let l:match = matchlist(getline(l:linenr), l:pattern) + + if len(l:match) > 1 && index(l:possible_shell, l:match[1]) >= 0 + return l:match[1] + endif + endwhile + + return '' +endfunction + +function! ale#handlers#shellcheck#GetDialectArgument(buffer) abort + let l:shell_type = ale#handlers#shellcheck#GetShellcheckDialectDirective(a:buffer) + + if empty(l:shell_type) + let l:shell_type = ale#handlers#sh#GetShellType(a:buffer) + endif + + if !empty(l:shell_type) + " Use the dash dialect for /bin/ash, etc. + if l:shell_type is# 'ash' + return 'dash' + endif + + return l:shell_type + endif + + return '' +endfunction + +function! ale#handlers#shellcheck#GetCwd(buffer) abort + return ale#Var(a:buffer, 'sh_shellcheck_change_directory') ? '%s:h' : '' +endfunction + +function! ale#handlers#shellcheck#GetCommand(buffer, version) abort + let l:options = ale#Var(a:buffer, 'sh_shellcheck_options') + let l:exclude_option = ale#Var(a:buffer, 'sh_shellcheck_exclusions') + let l:dialect = ale#Var(a:buffer, 'sh_shellcheck_dialect') + let l:external_option = ale#semver#GTE(a:version, [0, 4, 0]) ? ' -x' : '' + + if l:dialect is# 'auto' + let l:dialect = ale#handlers#shellcheck#GetDialectArgument(a:buffer) + endif + + return '%e' + \ . (!empty(l:dialect) ? ' -s ' . l:dialect : '') + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . (!empty(l:exclude_option) ? ' -e ' . l:exclude_option : '') + \ . l:external_option + \ . ' -f gcc -' +endfunction + +function! ale#handlers#shellcheck#Handle(buffer, lines) abort + let l:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)?:? ([^:]+): (.+) \[([^\]]+)\]$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + if l:match[4] is# 'error' + let l:type = 'E' + elseif l:match[4] is# 'note' + let l:type = 'I' + else + let l:type = 'W' + endif + + let l:item = { + \ 'lnum': str2nr(l:match[2]), + \ 'type': l:type, + \ 'text': l:match[5], + \ 'code': l:match[6], + \} + + if !empty(l:match[3]) + let l:item.col = str2nr(l:match[3]) + endif + + " If the filename is something like , or -, then + " this is an error for the file we checked. + if l:match[1] isnot# '-' && l:match[1][0] isnot# '<' + let l:item['filename'] = l:match[1] + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + +function! ale#handlers#shellcheck#DefineLinter(filetype) abort + " This global variable can be set with a string of comma-separated error + " codes to exclude from shellcheck. For example: + " let g:ale_sh_shellcheck_exclusions = 'SC2002,SC2004' + call ale#Set('sh_shellcheck_exclusions', get(g:, 'ale_linters_sh_shellcheck_exclusions', '')) + call ale#Set('sh_shellcheck_executable', 'shellcheck') + call ale#Set('sh_shellcheck_dialect', 'auto') + call ale#Set('sh_shellcheck_options', '') + call ale#Set('sh_shellcheck_change_directory', 1) + + call ale#linter#Define(a:filetype, { + \ 'name': 'shellcheck', + \ 'executable': {buffer -> ale#Var(buffer, 'sh_shellcheck_executable')}, + \ 'cwd': function('ale#handlers#shellcheck#GetCwd'), + \ 'command': {buffer -> ale#semver#RunWithVersionCheck( + \ buffer, + \ ale#Var(buffer, 'sh_shellcheck_executable'), + \ '%e --version', + \ function('ale#handlers#shellcheck#GetCommand'), + \ )}, + \ 'callback': 'ale#handlers#shellcheck#Handle', + \}) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/sml.vim b/dot_vim/plugged/ale/autoload/ale/handlers/sml.vim new file mode 100644 index 0000000..403b25f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/sml.vim @@ -0,0 +1,102 @@ +" Author: Jake Zimmerman +" Description: Shared functions for SML linters + +" The glob to use for finding the .cm file. +" +" See :help ale-sml-smlnj for more information. +call ale#Set('sml_smlnj_cm_file', '*.cm') + +function! ale#handlers#sml#GetCmFile(buffer) abort + let l:pattern = ale#Var(a:buffer, 'sml_smlnj_cm_file') + let l:as_list = 1 + + let l:cmfile = '' + + for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + let l:results = glob(l:path . '/' . l:pattern, 0, l:as_list) + + if len(l:results) > 0 + " If there is more than one CM file, we take the first one + " See :help ale-sml-smlnj for how to configure this. + let l:cmfile = l:results[0] + endif + endfor + + return l:cmfile +endfunction + +" Only one of smlnj or smlnj-cm can be enabled at a time. +function! s:GetExecutable(buffer, source) abort + if ale#handlers#sml#GetCmFile(a:buffer) is# '' + " No CM file found; only allow single-file mode to be enabled + if a:source is# 'smlnj-file' + return 'sml' + elseif a:source is# 'smlnj-cm' + return '' + endif + else + " Found a CM file; only allow cm-file mode to be enabled + if a:source is# 'smlnj-file' + return '' + elseif a:source is# 'smlnj-cm' + return 'sml' + endif + endif +endfunction + +function! ale#handlers#sml#GetExecutableSmlnjCm(buffer) abort + return s:GetExecutable(a:buffer, 'smlnj-cm') +endfunction + +function! ale#handlers#sml#GetExecutableSmlnjFile(buffer) abort + return s:GetExecutable(a:buffer, 'smlnj-file') +endfunction + +function! ale#handlers#sml#Handle(buffer, lines) abort + " Try to match basic sml errors + " TODO(jez) We can get better errorfmt strings from Syntastic + let l:out = [] + let l:pattern = '^\(.*\)\:\([0-9\.]\+\)\ \(\w\+\)\:\ \(.*\)' + let l:pattern2 = '^\(.*\)\:\([0-9]\+\)\.\?\([0-9]\+\).* \(\(Warning\|Error\): .*\)' + + for l:line in a:lines + let l:match2 = matchlist(l:line, l:pattern2) + + if len(l:match2) != 0 + if l:match2[1] =~# 'stdIn$' + let l:loc = {'bufnr': a:buffer} + else + let l:loc = {'filename': l:match2[1]} + endif + + call add(l:out, extend(l:loc, { + \ 'lnum': l:match2[2] + 0, + \ 'col' : l:match2[3] - 1, + \ 'text': l:match2[4], + \ 'type': l:match2[4] =~# '^Warning' ? 'W' : 'E', + \})) + continue + endif + + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) != 0 + if l:match[1] =~# 'stdIn$' + let l:loc = {'bufnr': a:buffer} + else + let l:loc = {'filename': l:match[1]} + endif + + call add(l:out, extend(l:loc, { + \ 'lnum': l:match[2] + 0, + \ 'text': l:match[3] . ': ' . l:match[4], + \ 'type': l:match[3] is# 'error' ? 'E' : 'W', + \})) + continue + endif + endfor + + return l:out +endfunction + +" vim:ts=4:sts=4:sw=4 diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/solhint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/solhint.vim new file mode 100644 index 0000000..611aa7b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/solhint.vim @@ -0,0 +1,98 @@ +" Author: Henrique Barcelos <@hbarcelos> +" Description: Functions for working with local solhint for checking *.sol files. + +let s:executables = [ +\ 'node_modules/.bin/solhint', +\ 'node_modules/solhint/solhint.js', +\ 'solhint', +\] + +let s:sep = has('win32') ? '\' : '/' + +call ale#Set('solidity_solhint_options', '') +call ale#Set('solidity_solhint_executable', 'solhint') +call ale#Set('solidity_solhint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale#handlers#solhint#Handle(buffer, lines) abort + " Matches patterns like the following: + " /path/to/file/file.sol: line 1, col 10, Error - 'addOne' is defined but never used. (no-unused-vars) + let l:output = [] + + let l:lint_pattern = '\v^[^:]+: line (\d+), col (\d+), (Error|Warning) - (.*) \((.*)\)$' + + for l:match in ale#util#GetMatches(a:lines, l:lint_pattern) + let l:isError = l:match[3] is? 'error' + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[4], + \ 'code': l:match[5], + \ 'type': l:isError ? 'E' : 'W', + \}) + endfor + + let l:syntax_pattern = '\v^[^:]+: line (\d+), col (\d+), (Error|Warning) - (Parse error): (.*)$' + + for l:match in ale#util#GetMatches(a:lines, l:syntax_pattern) + let l:isError = l:match[3] is? 'error' + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[5], + \ 'code': l:match[4], + \ 'type': l:isError ? 'E' : 'W', + \}) + endfor + + return l:output +endfunction + +function! ale#handlers#solhint#FindConfig(buffer) abort + for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + for l:basename in [ + \ '.solhintrc.js', + \ '.solhintrc.json', + \ '.solhintrc', + \] + let l:config = ale#path#Simplify(join([l:path, l:basename], s:sep)) + + if filereadable(l:config) + return l:config + endif + endfor + endfor + + return ale#path#FindNearestFile(a:buffer, 'package.json') +endfunction + +function! ale#handlers#solhint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'solidity_solhint', s:executables) +endfunction + +" Given a buffer, return an appropriate working directory for solhint. +function! ale#handlers#solhint#GetCwd(buffer) abort + " If solhint is installed in a directory which contains the buffer, assume + " it is the solhint project root. Otherwise, use nearest node_modules. + " Note: If node_modules not present yet, can't load local deps anyway. + let l:executable = ale#path#FindNearestExecutable(a:buffer, s:executables) + + if !empty(l:executable) + let l:nmi = strridx(l:executable, 'node_modules') + let l:project_dir = l:executable[0:l:nmi - 2] + else + let l:modules_dir = ale#path#FindNearestDirectory(a:buffer, 'node_modules') + let l:project_dir = !empty(l:modules_dir) ? fnamemodify(l:modules_dir, ':h:h') : '' + endif + + return !empty(l:project_dir) ? l:project_dir : '' +endfunction + +function! ale#handlers#solhint#GetCommand(buffer) abort + let l:executable = ale#handlers#solhint#GetExecutable(a:buffer) + + let l:options = ale#Var(a:buffer, 'solidity_solhint_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' --formatter compact %s' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/spectral.vim b/dot_vim/plugged/ale/autoload/ale/handlers/spectral.vim new file mode 100644 index 0000000..1eb4a5d --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/spectral.vim @@ -0,0 +1,31 @@ +" Author: t2h5 +" Description: Integration of Stoplight Spectral CLI with ALE. + +function! ale#handlers#spectral#HandleSpectralOutput(buffer, lines) abort + " Matches patterns like the following: + " openapi.yml:1:1 error oas3-schema "Object should have required property `info`." + " openapi.yml:1:1 warning oas3-api-servers "OpenAPI `servers` must be present and non-empty array." + let l:pattern = '\v^.*:(\d+):(\d+) (error|warning) (.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:obj = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:match[3] is# 'error' ? 'E' : 'W', + \ 'text': l:match[4], + \} + + let l:code_match = matchlist(l:obj.text, '\v^(.+) "(.+)"$') + + if !empty(l:code_match) + let l:obj.code = l:code_match[1] + let l:obj.text = l:code_match[2] + endif + + call add(l:output, l:obj) + endfor + + return l:output +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/statix.vim b/dot_vim/plugged/ale/autoload/ale/handlers/statix.vim new file mode 100644 index 0000000..eeef410 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/statix.vim @@ -0,0 +1,24 @@ +scriptencoding utf-8 +" Author: David Houston +" Description: This file defines a handler function for statix's errorformat +" output. + +function! ale#handlers#statix#Handle(buffer, lines) abort + " Look for lines like the following. + " + " flake.nix>46:13:W:3:This assignment is better written with `inherit` + let l:pattern = '\v^.*\>(\d+):(\d+):([A-Z]):(\d+):(.*)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'type': l:match[3], + \ 'code': l:match[4], + \ 'text': l:match[5], + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/textlint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/textlint.vim new file mode 100644 index 0000000..7a64861 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/textlint.vim @@ -0,0 +1,39 @@ +" Author: tokida https://rouger.info, Yasuhiro Kiyota +" Description: textlint, a proofreading tool (https://textlint.github.io/) + +call ale#Set('textlint_executable', 'textlint') +call ale#Set('textlint_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('textlint_options', '') + +function! ale#handlers#textlint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'textlint', [ + \ 'node_modules/.bin/textlint', + \ 'node_modules/textlint/bin/textlint.js', + \]) +endfunction + +function! ale#handlers#textlint#GetCommand(buffer) abort + let l:executable = ale#handlers#textlint#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'textlint_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' -f json --stdin --stdin-filename %s' +endfunction + +function! ale#handlers#textlint#HandleTextlintOutput(buffer, lines) abort + let l:res = get(ale#util#FuzzyJSONDecode(a:lines, []), 0, {'messages': []}) + let l:output = [] + + for l:err in l:res.messages + call add(l:output, { + \ 'text': l:err.message, + \ 'type': 'W', + \ 'code': l:err.ruleId, + \ 'lnum': l:err.line, + \ 'col' : l:err.column + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/tslint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/tslint.vim new file mode 100644 index 0000000..ee091d2 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/tslint.vim @@ -0,0 +1,13 @@ +function! ale#handlers#tslint#InitVariables() abort + call ale#Set('typescript_tslint_executable', 'tslint') + call ale#Set('typescript_tslint_config_path', '') + call ale#Set('typescript_tslint_rules_dir', '') + call ale#Set('typescript_tslint_use_global', get(g:, 'ale_use_global_executables', 0)) + call ale#Set('typescript_tslint_ignore_empty_files', 0) +endfunction + +function! ale#handlers#tslint#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'typescript_tslint', [ + \ 'node_modules/.bin/tslint', + \]) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/tsserver.vim b/dot_vim/plugged/ale/autoload/ale/handlers/tsserver.vim new file mode 100644 index 0000000..f78499a --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/tsserver.vim @@ -0,0 +1,8 @@ +" Author: Derek Sifford +" Description: Handlers for tsserver + +function! ale#handlers#tsserver#GetProjectRoot(buffer) abort + let l:tsconfig_file = ale#path#FindNearestFile(a:buffer, 'tsconfig.json') + + return !empty(l:tsconfig_file) ? fnamemodify(l:tsconfig_file, ':h') : '' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/unix.vim b/dot_vim/plugged/ale/autoload/ale/handlers/unix.vim new file mode 100644 index 0000000..f90fd59 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/unix.vim @@ -0,0 +1,26 @@ +" Author: w0rp +" Description: Error handling for errors in a Unix format. + +function! s:HandleUnixFormat(buffer, lines, type) abort + let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):?(\d+)?:? ?(.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3], + \ 'type': a:type, + \}) + endfor + + return l:output +endfunction + +function! ale#handlers#unix#HandleAsError(buffer, lines) abort + return s:HandleUnixFormat(a:buffer, a:lines, 'E') +endfunction + +function! ale#handlers#unix#HandleAsWarning(buffer, lines) abort + return s:HandleUnixFormat(a:buffer, a:lines, 'W') +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/vale.vim b/dot_vim/plugged/ale/autoload/ale/handlers/vale.vim new file mode 100644 index 0000000..2da72fc --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/vale.vim @@ -0,0 +1,39 @@ +" Author: Johannes Wienke +" Description: output handler for the vale JSON format + +function! ale#handlers#vale#GetType(severity) abort + if a:severity is? 'warning' + return 'W' + elseif a:severity is? 'suggestion' + return 'I' + endif + + return 'E' +endfunction + +function! ale#handlers#vale#Handle(buffer, lines) abort + try + let l:errors = json_decode(join(a:lines, '')) + catch + return [] + endtry + + if empty(l:errors) + return [] + endif + + let l:output = [] + + for l:error in l:errors[keys(l:errors)[0]] + call add(l:output, { + \ 'lnum': l:error['Line'], + \ 'col': l:error['Span'][0], + \ 'end_col': l:error['Span'][1], + \ 'code': l:error['Check'], + \ 'text': l:error['Message'], + \ 'type': ale#handlers#vale#GetType(l:error['Severity']), + \}) + endfor + + return l:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/writegood.vim b/dot_vim/plugged/ale/autoload/ale/handlers/writegood.vim new file mode 100644 index 0000000..b5b91b3 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/writegood.vim @@ -0,0 +1,72 @@ +" Author: Sumner Evans +" Description: Error handling for errors in the write-good format. + +function! ale#handlers#writegood#ResetOptions() abort + call ale#Set('writegood_options', '') + call ale#Set('writegood_executable', 'write-good') + call ale#Set('writegood_use_global', get(g:, 'ale_use_global_executables', 0)) +endfunction + +" Reset the options so the tests can test how they are set. +call ale#handlers#writegood#ResetOptions() + +function! ale#handlers#writegood#GetExecutable(buffer) abort + return ale#path#FindExecutable(a:buffer, 'writegood', [ + \ 'node_modules/.bin/write-good', + \ 'node_modules/write-good/bin/write-good.js', + \]) +endfunction + +function! ale#handlers#writegood#GetCommand(buffer) abort + let l:executable = ale#handlers#writegood#GetExecutable(a:buffer) + let l:options = ale#Var(a:buffer, 'writegood_options') + + return ale#node#Executable(a:buffer, l:executable) + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' %t' +endfunction + +function! ale#handlers#writegood#Handle(buffer, lines) abort + " Look for lines like the following. + " + " "it is" is wordy or unneeded on line 20 at column 53 + " "easily" can weaken meaning on line 154 at column 29 + let l:marks_pattern = '\v^ *(\^+) *$' + let l:pattern = '\v^(".*"\s.*)\son\sline\s(\d+)\sat\scolumn\s(\d+)$' + let l:output = [] + let l:last_len = 0 + + for l:match in ale#util#GetMatches(a:lines, [l:marks_pattern, l:pattern]) + if empty(l:match[2]) + let l:last_len = len(l:match[1]) + else + let l:col = l:match[3] + 1 + + " Add the linter error. Note that we need to add 1 to the col because + " write-good reports the column corresponding to the space before the + " offending word or phrase. + call add(l:output, { + \ 'text': l:match[1], + \ 'lnum': l:match[2] + 0, + \ 'col': l:col, + \ 'end_col': l:last_len ? (l:col + l:last_len - 1) : l:col, + \ 'type': 'W', + \}) + + let l:last_len = 0 + endif + endfor + + return l:output +endfunction + +" Define the writegood linter for a given filetype. +function! ale#handlers#writegood#DefineLinter(filetype) abort + call ale#linter#Define(a:filetype, { + \ 'name': 'writegood', + \ 'aliases': ['write-good'], + \ 'executable': function('ale#handlers#writegood#GetExecutable'), + \ 'command': function('ale#handlers#writegood#GetCommand'), + \ 'callback': 'ale#handlers#writegood#Handle', + \}) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/xo.vim b/dot_vim/plugged/ale/autoload/ale/handlers/xo.vim new file mode 100644 index 0000000..a87c6d8 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/xo.vim @@ -0,0 +1,44 @@ +call ale#Set('javascript_xo_executable', 'xo') +call ale#Set('javascript_xo_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('javascript_xo_options', '') + +call ale#Set('typescript_xo_executable', 'xo') +call ale#Set('typescript_xo_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('typescript_xo_options', '') + +function! ale#handlers#xo#GetExecutable(buffer) abort + let l:type = ale#handlers#xo#GetType(a:buffer) + + return ale#path#FindExecutable(a:buffer, l:type . '_xo', [ + \ 'node_modules/xo/cli.js', + \ 'node_modules/.bin/xo', + \]) +endfunction + +function! ale#handlers#xo#GetLintCommand(buffer) abort + return ale#Escape(ale#handlers#xo#GetExecutable(a:buffer)) + \ . ale#Pad(ale#handlers#xo#GetOptions(a:buffer)) + \ . ' --reporter json --stdin --stdin-filename %s' +endfunction + +function! ale#handlers#xo#GetOptions(buffer) abort + let l:type = ale#handlers#xo#GetType(a:buffer) + + return ale#Var(a:buffer, l:type . '_xo_options') +endfunction + +" xo uses eslint and the output format is the same +function! ale#handlers#xo#HandleJSON(buffer, lines) abort + return ale#handlers#eslint#HandleJSON(a:buffer, a:lines) +endfunction + +function! ale#handlers#xo#GetType(buffer) abort + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:type = 'javascript' + + if l:filetype =~# 'typescript' + let l:type = 'typescript' + endif + + return l:type +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/handlers/yamllint.vim b/dot_vim/plugged/ale/autoload/ale/handlers/yamllint.vim new file mode 100644 index 0000000..5e04577 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/handlers/yamllint.vim @@ -0,0 +1,39 @@ +function! ale#handlers#yamllint#GetCommand(buffer) abort + return '%e' . ale#Pad(ale#Var(a:buffer, 'yaml_yamllint_options')) + \ . ' -f parsable %t' +endfunction + +function! ale#handlers#yamllint#Handle(buffer, lines) abort + " Matches patterns line the following: + " something.yaml:1:1: [warning] missing document start "---" (document-start) + " something.yml:2:1: [error] syntax error: expected the node content, but found '' + let l:pattern = '\v^.*:(\d+):(\d+): \[(error|warning)\] (.+)$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[4], + \ 'type': l:match[3] is# 'error' ? 'E' : 'W', + \} + + let l:code_match = matchlist(l:item.text, '\v^(.+) \(([^)]+)\)$') + + if !empty(l:code_match) + if l:code_match[2] is# 'trailing-spaces' + \&& !ale#Var(a:buffer, 'warn_about_trailing_whitespace') + " Skip warnings for trailing whitespace if the option is off. + continue + endif + + let l:item.text = l:code_match[1] + let l:item.code = l:code_match[2] + endif + + call add(l:output, l:item) + endfor + + return l:output +endfunction + diff --git a/dot_vim/plugged/ale/autoload/ale/highlight.vim b/dot_vim/plugged/ale/autoload/ale/highlight.vim new file mode 100644 index 0000000..473ad35 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/highlight.vim @@ -0,0 +1,222 @@ +scriptencoding utf8 +" Author: w0rp +" Description: This module implements error/warning highlighting. + +if !hlexists('ALEError') + highlight link ALEError SpellBad +endif + +if !hlexists('ALEStyleError') + highlight link ALEStyleError ALEError +endif + +if !hlexists('ALEWarning') + highlight link ALEWarning SpellCap +endif + +if !hlexists('ALEStyleWarning') + highlight link ALEStyleWarning ALEWarning +endif + +if !hlexists('ALEInfo') + highlight link ALEInfo ALEWarning +endif + +" The maximum number of items for the second argument of matchaddpos() +let s:MAX_POS_VALUES = 8 +let s:MAX_COL_SIZE = 1073741824 " pow(2, 30) + +let s:has_nvim_highlight = exists('*nvim_buf_add_highlight') && exists('*nvim_buf_clear_namespace') + +if s:has_nvim_highlight + let s:ns_id = nvim_create_namespace('ale_highlight') +endif + +" Wrappers are necessary to test this functionality by faking the calls in tests. +function! ale#highlight#nvim_buf_add_highlight(buffer, ns_id, hl_group, line, col_start, col_end) abort + " Ignore all errors for adding highlights. + try + call nvim_buf_add_highlight(a:buffer, a:ns_id, a:hl_group, a:line, a:col_start, a:col_end) + catch + endtry +endfunction + +function! ale#highlight#nvim_buf_clear_namespace(buffer, ns_id, line_start, line_end) abort + call nvim_buf_clear_namespace(a:buffer, a:ns_id, a:line_start, a:line_end) +endfunction + +function! ale#highlight#CreatePositions(line, col, end_line, end_col) abort + if a:line >= a:end_line + " For single lines, just return the one position. + return [[[a:line, a:col, a:end_col - a:col + 1]]] + endif + + " Get positions from the first line at the first column, up to a large + " integer for highlighting up to the end of the line, followed by + " the lines in-between, for highlighting entire lines, and + " a highlight for the last line, up to the end column. + let l:all_positions = + \ [[a:line, a:col, s:MAX_COL_SIZE]] + \ + range(a:line + 1, a:end_line - 1) + \ + [[a:end_line, 1, a:end_col]] + + return map( + \ range(0, len(l:all_positions) - 1, s:MAX_POS_VALUES), + \ 'l:all_positions[v:val : v:val + s:MAX_POS_VALUES - 1]', + \) +endfunction + +" Given a loclist for current items to highlight, remove all highlights +" except these which have matching loclist item entries. + +function! ale#highlight#RemoveHighlights() abort + if s:has_nvim_highlight + call ale#highlight#nvim_buf_clear_namespace(bufnr(''), s:ns_id, 0, -1) + else + for l:match in getmatches() + if l:match.group =~? '\v^ALE(Style)?(Error|Warning|Info)(Line)?$' + call matchdelete(l:match.id) + endif + endfor + endif +endfunction + +" Same semantics of matchaddpos but will use nvim_buf_add_highlight if +" available. This involves iterating over the position list, switching from +" 1-based indexing to 0-based indexing, and translating the multiple ways +" that position can be specified for matchaddpos into line + col_start + +" col_end. +function! s:matchaddpos(group, pos_list) abort + if s:has_nvim_highlight + for l:pos in a:pos_list + let l:line = type(l:pos) == v:t_number + \ ? l:pos - 1 + \ : l:pos[0] - 1 + + if type(l:pos) == v:t_number || len(l:pos) == 1 + let l:col_start = 0 + let l:col_end = s:MAX_COL_SIZE + else + let l:col_start = l:pos[1] - 1 + let l:col_end = l:col_start + get(l:pos, 2, 1) + endif + + call ale#highlight#nvim_buf_add_highlight( + \ bufnr(''), + \ s:ns_id, + \ a:group, + \ l:line, + \ l:col_start, + \ l:col_end, + \) + endfor + else + call matchaddpos(a:group, a:pos_list) + endif +endfunction + +function! s:highlight_line(bufnr, lnum, group) abort + call s:matchaddpos(a:group, [a:lnum]) +endfunction + +function! s:highlight_range(bufnr, range, group) abort + " Set all of the positions, which are chunked into Lists which + " are as large as will be accepted by matchaddpos. + call map( + \ ale#highlight#CreatePositions( + \ a:range.lnum, + \ a:range.col, + \ a:range.end_lnum, + \ a:range.end_col + \ ), + \ 's:matchaddpos(a:group, v:val)' + \) +endfunction + +function! ale#highlight#UpdateHighlights() abort + let l:item_list = get(b:, 'ale_enabled', 1) && g:ale_enabled + \ ? get(b:, 'ale_highlight_items', []) + \ : [] + + call ale#highlight#RemoveHighlights() + + for l:item in l:item_list + if l:item.type is# 'W' + if get(l:item, 'sub_type', '') is# 'style' + let l:group = 'ALEStyleWarning' + else + let l:group = 'ALEWarning' + endif + elseif l:item.type is# 'I' + let l:group = 'ALEInfo' + elseif get(l:item, 'sub_type', '') is# 'style' + let l:group = 'ALEStyleError' + else + let l:group = 'ALEError' + endif + + let l:range = { + \ 'lnum': l:item.lnum, + \ 'col': l:item.col, + \ 'end_lnum': get(l:item, 'end_lnum', l:item.lnum), + \ 'end_col': get(l:item, 'end_col', l:item.col) + \} + + call s:highlight_range(l:item.bufnr, l:range, l:group) + endfor + + " If highlights are enabled and signs are not enabled, we should still + " offer line highlights by adding a separate set of highlights. + if !g:ale_set_signs + let l:available_groups = { + \ 'ALEWarningLine': hlexists('ALEWarningLine'), + \ 'ALEInfoLine': hlexists('ALEInfoLine'), + \ 'ALEErrorLine': hlexists('ALEErrorLine'), + \} + + for l:item in l:item_list + if l:item.type is# 'W' + let l:group = 'ALEWarningLine' + elseif l:item.type is# 'I' + let l:group = 'ALEInfoLine' + else + let l:group = 'ALEErrorLine' + endif + + if l:available_groups[l:group] + call s:highlight_line(l:item.bufnr, l:item.lnum, l:group) + endif + endfor + endif +endfunction + +function! ale#highlight#BufferHidden(buffer) abort + " Remove highlights right away when buffers are hidden. + " They will be restored later when buffers are entered. + call ale#highlight#RemoveHighlights() +endfunction + +augroup ALEHighlightBufferGroup + autocmd! + autocmd BufEnter * call ale#highlight#UpdateHighlights() + autocmd BufHidden * call ale#highlight#BufferHidden(expand('')) +augroup END + +function! ale#highlight#SetHighlights(buffer, loclist) abort + let l:new_list = getbufvar(a:buffer, 'ale_enabled', 1) && g:ale_enabled + \ ? filter(copy(a:loclist), 'v:val.bufnr == a:buffer && v:val.col > 0') + \ : [] + + " Set the list in the buffer variable. + call setbufvar(str2nr(a:buffer), 'ale_highlight_items', l:new_list) + + let l:exclude_list = ale#Var(a:buffer, 'exclude_highlights') + + if !empty(l:exclude_list) + call filter(l:new_list, 'empty(ale#util#GetMatches(v:val.text, l:exclude_list))') + endif + + " Update highlights for the current buffer, which may or may not + " be the buffer we just set highlights for. + call ale#highlight#UpdateHighlights() +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/history.vim b/dot_vim/plugged/ale/autoload/ale/history.vim new file mode 100644 index 0000000..27ae74c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/history.vim @@ -0,0 +1,62 @@ +" Author: w0rp +" Description: Tools for managing command history + +" A flag for controlling the maximum size of the command history to store. +let g:ale_max_buffer_history_size = get(g:, 'ale_max_buffer_history_size', 20) + +" Return a shallow copy of the command history for a given buffer number. +function! ale#history#Get(buffer) abort + return copy(getbufvar(a:buffer, 'ale_history', [])) +endfunction + +function! ale#history#Add(buffer, status, job_id, command) abort + if g:ale_max_buffer_history_size <= 0 + " Don't save anything if the history isn't a positive number. + call setbufvar(a:buffer, 'ale_history', []) + + return + endif + + let l:history = getbufvar(a:buffer, 'ale_history', []) + + " Remove the first item if we hit the max history size. + if len(l:history) >= g:ale_max_buffer_history_size + let l:history = l:history[1:] + endif + + call add(l:history, { + \ 'status': a:status, + \ 'job_id': a:job_id, + \ 'command': a:command, + \}) + + call setbufvar(a:buffer, 'ale_history', l:history) +endfunction + +function! s:FindHistoryItem(buffer, job_id) abort + " Search backwards to find a matching job ID. IDs might be recycled, + " so finding the last one should be good enough. + for l:obj in reverse(ale#history#Get(a:buffer)) + if l:obj.job_id == a:job_id + return l:obj + endif + endfor + + return {} +endfunction + +" Set an exit code for a command which finished. +function! ale#history#SetExitCode(buffer, job_id, exit_code) abort + let l:obj = s:FindHistoryItem(a:buffer, a:job_id) + + " If we find a match, then set the code and status. + let l:obj.exit_code = a:exit_code + let l:obj.status = 'finished' +endfunction + +" Set the output for a command which finished. +function! ale#history#RememberOutput(buffer, job_id, output) abort + let l:obj = s:FindHistoryItem(a:buffer, a:job_id) + + let l:obj.output = a:output +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/hover.vim b/dot_vim/plugged/ale/autoload/ale/hover.vim new file mode 100644 index 0000000..0954b80 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/hover.vim @@ -0,0 +1,368 @@ +" Author: w0rp +" Description: Hover support for LSP linters. + +let s:hover_map = {} + +" Used to get the hover map in tests. +function! ale#hover#GetMap() abort + return deepcopy(s:hover_map) +endfunction + +" Used to set the hover map in tests. +function! ale#hover#SetMap(map) abort + let s:hover_map = a:map +endfunction + +function! ale#hover#ClearLSPData() abort + let s:hover_map = {} +endfunction + +function! ale#hover#HandleTSServerResponse(conn_id, response) abort + if get(a:response, 'command', '') is# 'quickinfo' + \&& has_key(s:hover_map, a:response.request_seq) + let l:options = remove(s:hover_map, a:response.request_seq) + + if get(a:response, 'success', v:false) is v:true + \&& get(a:response, 'body', v:null) isnot v:null + let l:set_balloons = ale#Var(l:options.buffer, 'set_balloons') + + " If we pass the show_documentation flag, we should show the full + " documentation, and always in the preview window. + if get(l:options, 'show_documentation', 0) + let l:documentation = get(a:response.body, 'documentation', '') + + " displayString is not included here, because it can be very + " noisy and run on for many lines for complex types. A less + " verbose alternative may be nice in future. + if !empty(l:documentation) + call ale#preview#Show(split(l:documentation, "\n"), { + \ 'filetype': 'ale-preview.message', + \ 'stay_here': 1, + \}) + endif + elseif get(l:options, 'hover_from_balloonexpr', 0) + \&& exists('*balloon_show') + \&& (l:set_balloons is 1 || l:set_balloons is# 'hover') + call balloon_show(a:response.body.displayString) + elseif get(l:options, 'truncated_echo', 0) + if !empty(a:response.body.displayString) + call ale#cursor#TruncatedEcho(a:response.body.displayString) + endif + elseif g:ale_hover_to_floating_preview || g:ale_floating_preview + call ale#floating_preview#Show(split(a:response.body.displayString, "\n"), { + \ 'filetype': 'ale-preview.message', + \}) + elseif g:ale_hover_to_preview + call ale#preview#Show(split(a:response.body.displayString, "\n"), { + \ 'filetype': 'ale-preview.message', + \ 'stay_here': 1, + \}) + else + call ale#util#ShowMessage(a:response.body.displayString) + endif + endif + endif +endfunction + +" Convert a language name to another one. +" The language name could be an empty string or v:null +function! s:ConvertLanguageName(language) abort + return a:language +endfunction + +function! ale#hover#ParseLSPResult(contents) abort + let l:includes = {} + let l:highlights = [] + let l:lines = [] + let l:list = type(a:contents) is v:t_list ? a:contents : [a:contents] + let l:region_index = 0 + + for l:item in l:list + if !empty(l:lines) + call add(l:lines, '') + endif + + if type(l:item) is v:t_dict && has_key(l:item, 'kind') + if l:item.kind is# 'markdown' + " Handle markdown values as we handle strings below. + let l:item = get(l:item, 'value', '') + elseif l:item.kind is# 'plaintext' + " We shouldn't try to parse plaintext as markdown. + " Pass the lines on and skip parsing them. + call extend(l:lines, split(get(l:item, 'value', ''), "\n")) + + continue + endif + endif + + let l:marked_list = [] + + " If the item is a string, then we should parse it as Markdown text. + if type(l:item) is v:t_string + let l:fence_language = v:null + let l:fence_lines = [] + + for l:line in split(l:item, "\n") + if l:fence_language is v:null + " Look for the start of a code fence. (```python, etc.) + let l:match = matchlist(l:line, '^```\(.*\)$') + + if !empty(l:match) + let l:fence_language = l:match[1] + + if !empty(l:marked_list) + call add(l:fence_lines, '') + endif + else + if !empty(l:marked_list) + \&& l:marked_list[-1][0] isnot v:null + call add(l:marked_list, [v:null, ['']]) + endif + + call add(l:marked_list, [v:null, [l:line]]) + endif + elseif l:line =~# '^```$' + " When we hit the end of a code fence, pass the fenced + " lines on to the next steps below. + call add(l:marked_list, [l:fence_language, l:fence_lines]) + let l:fence_language = v:null + let l:fence_lines = [] + else + " Gather lines inside of a code fence. + call add(l:fence_lines, l:line) + endif + endfor + " If the result from the LSP server is a {language: ..., value: ...} + " Dictionary, then that should be interpreted as if it was: + " + " ```${language} + " ${value} + " ``` + elseif type(l:item) is v:t_dict + \&& has_key(l:item, 'language') + \&& type(l:item.language) is v:t_string + \&& has_key(l:item, 'value') + \&& type(l:item.value) is v:t_string + call add( + \ l:marked_list, + \ [l:item.language, split(l:item.value, "\n")], + \) + endif + + for [l:language, l:marked_lines] in l:marked_list + if l:language is v:null + " NOTE: We could handle other Markdown formatting here. + call map( + \ l:marked_lines, + \ 'substitute(v:val, ''\\_'', ''_'', ''g'')', + \) + else + let l:language = s:ConvertLanguageName(l:language) + + if !empty(l:language) + let l:includes[l:language] = printf( + \ 'syntax/%s.vim', + \ l:language, + \) + + let l:start = len(l:lines) + 1 + let l:end = l:start + len(l:marked_lines) + let l:region_index += 1 + + call add(l:highlights, 'syntax region' + \ . ' ALE_hover_' . l:region_index + \ . ' start=/\%' . l:start . 'l/' + \ . ' end=/\%' . l:end . 'l/' + \ . ' contains=@ALE_hover_' . l:language + \) + endif + endif + + call extend(l:lines, l:marked_lines) + endfor + endfor + + let l:include_commands = [] + + for [l:language, l:lang_path] in sort(items(l:includes)) + call add(l:include_commands, 'unlet! b:current_syntax') + call add( + \ l:include_commands, + \ printf('syntax include @ALE_hover_%s %s', l:language, l:lang_path), + \) + endfor + + return [l:include_commands + l:highlights, l:lines] +endfunction + +function! ale#hover#HandleLSPResponse(conn_id, response) abort + if has_key(a:response, 'id') + \&& has_key(s:hover_map, a:response.id) + let l:options = remove(s:hover_map, a:response.id) + + " If the call did __not__ come from balloonexpr... + if !get(l:options, 'hover_from_balloonexpr', 0) + let l:buffer = bufnr('') + let [l:line, l:column] = getpos('.')[1:2] + let l:end = len(getline(l:line)) + + if l:buffer isnot l:options.buffer + \|| l:line isnot l:options.line + \|| min([l:column, l:end]) isnot min([l:options.column, l:end]) + " ... Cancel display the message if the cursor has moved. + return + endif + endif + + " The result can be a Dictionary item, a List of the same, or null. + let l:result = get(a:response, 'result', v:null) + + if l:result is v:null + return + endif + + let [l:commands, l:lines] = ale#hover#ParseLSPResult(l:result.contents) + + if !empty(l:lines) + let l:set_balloons = ale#Var(l:options.buffer, 'set_balloons') + + if get(l:options, 'hover_from_balloonexpr', 0) + \&& exists('*balloon_show') + \&& (l:set_balloons is 1 || l:set_balloons is# 'hover') + call balloon_show(join(l:lines, "\n")) + elseif get(l:options, 'truncated_echo', 0) + if type(l:lines[0]) is# v:t_list + call ale#cursor#TruncatedEcho(join(l:lines[0], '\n')) + else + call ale#cursor#TruncatedEcho(l:lines[0]) + endif + elseif g:ale_hover_to_floating_preview || g:ale_floating_preview + call ale#floating_preview#Show(l:lines, { + \ 'filetype': 'ale-preview.message', + \ 'commands': l:commands, + \}) + elseif g:ale_hover_to_preview + call ale#preview#Show(l:lines, { + \ 'filetype': 'ale-preview.message', + \ 'stay_here': 1, + \ 'commands': l:commands, + \}) + else + call ale#util#ShowMessage(join(l:lines, "\n"), { + \ 'commands': l:commands, + \}) + endif + endif + endif +endfunction + +function! s:OnReady(line, column, opt, linter, lsp_details) abort + let l:id = a:lsp_details.connection_id + + if !ale#lsp#HasCapability(l:id, 'hover') + return + endif + + let l:buffer = a:lsp_details.buffer + + let l:Callback = a:linter.lsp is# 'tsserver' + \ ? function('ale#hover#HandleTSServerResponse') + \ : function('ale#hover#HandleLSPResponse') + call ale#lsp#RegisterCallback(l:id, l:Callback) + + if a:linter.lsp is# 'tsserver' + let l:column = a:column + + let l:message = ale#lsp#tsserver_message#Quickinfo( + \ l:buffer, + \ a:line, + \ l:column + \) + else + " Send a message saying the buffer has changed first, or the + " hover position probably won't make sense. + call ale#lsp#NotifyForChanges(l:id, l:buffer) + + let l:column = max([ + \ min([a:column, len(getbufline(l:buffer, a:line)[0])]), + \ 1, + \]) + + let l:message = ale#lsp#message#Hover(l:buffer, a:line, l:column) + endif + + let l:request_id = ale#lsp#Send(l:id, l:message) + + let s:hover_map[l:request_id] = { + \ 'buffer': l:buffer, + \ 'line': a:line, + \ 'column': l:column, + \ 'hover_from_balloonexpr': get(a:opt, 'called_from_balloonexpr', 0), + \ 'show_documentation': get(a:opt, 'show_documentation', 0), + \ 'truncated_echo': get(a:opt, 'truncated_echo', 0), + \} +endfunction + +" Obtain Hover information for the specified position +" Pass optional arguments in the dictionary opt. +" Currently, only one key/value is useful: +" - called_from_balloonexpr, this flag marks if we want the result from this +" ale#hover#Show to display in a balloon if possible +" +" Currently, the callbacks displays the info from hover : +" - in the balloon if opt.called_from_balloonexpr and balloon_show is detected +" - as status message otherwise +function! ale#hover#Show(buffer, line, col, opt) abort + let l:show_documentation = get(a:opt, 'show_documentation', 0) + let l:Callback = function('s:OnReady', [a:line, a:col, a:opt]) + + for l:linter in ale#linter#Get(getbufvar(a:buffer, '&filetype')) + " Only tsserver supports documentation requests at the moment. + if !empty(l:linter.lsp) + \&& (!l:show_documentation || l:linter.lsp is# 'tsserver') + call ale#lsp_linter#StartLSP(a:buffer, l:linter, l:Callback) + endif + endfor +endfunction + +let s:last_pos = [0, 0, 0] + +" This function implements the :ALEHover command. +function! ale#hover#ShowAtCursor() abort + let l:buffer = bufnr('') + let l:pos = getpos('.') + + call ale#hover#Show(l:buffer, l:pos[1], l:pos[2], {}) +endfunction + +function! ale#hover#ShowTruncatedMessageAtCursor() abort + let l:buffer = bufnr('') + let l:pos = getpos('.')[0:2] + + if !getbufvar(l:buffer, 'ale_enabled', 1) + return + endif + + if l:pos != s:last_pos + let s:last_pos = l:pos + let [l:info, l:loc] = ale#util#FindItemAtCursor(l:buffer) + + if empty(l:loc) + call ale#hover#Show( + \ l:buffer, + \ l:pos[1], + \ l:pos[2], + \ {'truncated_echo': 1}, + \) + endif + endif +endfunction + +" This function implements the :ALEDocumentation command. +function! ale#hover#ShowDocumentationAtCursor() abort + let l:buffer = bufnr('') + let l:pos = getpos('.') + let l:options = {'show_documentation': 1} + + call ale#hover#Show(l:buffer, l:pos[1], l:pos[2], l:options) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/java.vim b/dot_vim/plugged/ale/autoload/ale/java.vim new file mode 100644 index 0000000..859d938 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/java.vim @@ -0,0 +1,26 @@ +" Author: Horacio Sanson https://github.com/hsanson +" Description: Functions for integrating with Java tools + +" Find the nearest dir contining a gradle or pom file and assume it +" the root of a java app. +function! ale#java#FindProjectRoot(buffer) abort + let l:gradle_root = ale#gradle#FindProjectRoot(a:buffer) + + if !empty(l:gradle_root) + return l:gradle_root + endif + + let l:maven_pom_file = ale#path#FindNearestFile(a:buffer, 'pom.xml') + + if !empty(l:maven_pom_file) + return fnamemodify(l:maven_pom_file, ':h') + endif + + let l:ant_root = ale#ant#FindProjectRoot(a:buffer) + + if !empty(l:ant_root) + return l:ant_root + endif + + return '' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/job.vim b/dot_vim/plugged/ale/autoload/ale/job.vim new file mode 100644 index 0000000..0fc43a8 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/job.vim @@ -0,0 +1,385 @@ +" Author: w0rp +" Description: APIs for working with Asynchronous jobs, with an API normalised +" between Vim 8 and NeoVim. +" +" Important functions are described below. They are: +" +" ale#job#Start(command, options) -> job_id +" ale#job#IsRunning(job_id) -> 1 if running, 0 otherwise. +" ale#job#Stop(job_id) + +" A setting for wrapping commands. +let g:ale_command_wrapper = get(g:, 'ale_command_wrapper', '') + +if !has_key(s:, 'job_map') + let s:job_map = {} +endif + +" A map from timer IDs to jobs, for tracking jobs that need to be killed +" with SIGKILL if they don't terminate right away. +if !has_key(s:, 'job_kill_timers') + let s:job_kill_timers = {} +endif + +function! s:KillHandler(timer) abort + let l:job = remove(s:job_kill_timers, a:timer) + call job_stop(l:job, 'kill') +endfunction + +function! s:NeoVimCallback(job, data, event) abort + let l:info = s:job_map[a:job] + + if a:event is# 'stdout' + let l:info.out_cb_line = ale#util#JoinNeovimOutput( + \ a:job, + \ l:info.out_cb_line, + \ a:data, + \ l:info.mode, + \ ale#util#GetFunction(l:info.out_cb), + \) + elseif a:event is# 'stderr' + let l:info.err_cb_line = ale#util#JoinNeovimOutput( + \ a:job, + \ l:info.err_cb_line, + \ a:data, + \ l:info.mode, + \ ale#util#GetFunction(l:info.err_cb), + \) + else + if has_key(l:info, 'out_cb') && !empty(l:info.out_cb_line) + call ale#util#GetFunction(l:info.out_cb)(a:job, l:info.out_cb_line) + endif + + if has_key(l:info, 'err_cb') && !empty(l:info.err_cb_line) + call ale#util#GetFunction(l:info.err_cb)(a:job, l:info.err_cb_line) + endif + + try + call ale#util#GetFunction(l:info.exit_cb)(a:job, a:data) + finally + " Automatically forget about the job after it's done. + if has_key(s:job_map, a:job) + call remove(s:job_map, a:job) + endif + endtry + endif +endfunction + +function! s:VimOutputCallback(channel, data) abort + let l:job = ch_getjob(a:channel) + let l:job_id = ale#job#ParseVim8ProcessID(string(l:job)) + + " Only call the callbacks for jobs which are valid. + if l:job_id > 0 && has_key(s:job_map, l:job_id) + call ale#util#GetFunction(s:job_map[l:job_id].out_cb)(l:job_id, a:data) + endif +endfunction + +function! s:VimErrorCallback(channel, data) abort + let l:job = ch_getjob(a:channel) + let l:job_id = ale#job#ParseVim8ProcessID(string(l:job)) + + " Only call the callbacks for jobs which are valid. + if l:job_id > 0 && has_key(s:job_map, l:job_id) + call ale#util#GetFunction(s:job_map[l:job_id].err_cb)(l:job_id, a:data) + endif +endfunction + +function! s:VimCloseCallback(channel) abort + let l:job = ch_getjob(a:channel) + let l:job_id = ale#job#ParseVim8ProcessID(string(l:job)) + let l:info = get(s:job_map, l:job_id, {}) + + if empty(l:info) + return + endif + + " job_status() can trigger the exit handler. + " The channel can close before the job has exited. + if job_status(l:job) is# 'dead' + try + if !empty(l:info) && has_key(l:info, 'exit_cb') + " We have to remove the callback, so we don't call it twice. + call ale#util#GetFunction(remove(l:info, 'exit_cb'))(l:job_id, get(l:info, 'exit_code', 1)) + endif + finally + " Automatically forget about the job after it's done. + if has_key(s:job_map, l:job_id) + call remove(s:job_map, l:job_id) + endif + endtry + endif +endfunction + +function! s:VimExitCallback(job, exit_code) abort + let l:job_id = ale#job#ParseVim8ProcessID(string(a:job)) + let l:info = get(s:job_map, l:job_id, {}) + + if empty(l:info) + return + endif + + let l:info.exit_code = a:exit_code + + " The program can exit before the data has finished being read. + if ch_status(job_getchannel(a:job)) is# 'closed' + try + if !empty(l:info) && has_key(l:info, 'exit_cb') + " We have to remove the callback, so we don't call it twice. + call ale#util#GetFunction(remove(l:info, 'exit_cb'))(l:job_id, a:exit_code) + endif + finally + " Automatically forget about the job after it's done. + if has_key(s:job_map, l:job_id) + call remove(s:job_map, l:job_id) + endif + endtry + endif +endfunction + +function! ale#job#ParseVim8ProcessID(job_string) abort + return matchstr(a:job_string, '\d\+') + 0 +endfunction + +function! ale#job#ValidateArguments(command, options) abort + if a:options.mode isnot# 'nl' && a:options.mode isnot# 'raw' + throw 'Invalid mode: ' . a:options.mode + endif +endfunction + +function! s:PrepareWrappedCommand(original_wrapper, command) abort + let l:match = matchlist(a:command, '\v^(.*(\&\&|;)) *(.*)$') + let l:prefix = '' + let l:command = a:command + + if !empty(l:match) + let l:prefix = l:match[1] . ' ' + let l:command = l:match[3] + endif + + let l:format = a:original_wrapper + + if l:format =~# '%@' + let l:wrapped = substitute(l:format, '%@', ale#Escape(l:command), '') + else + if l:format !~# '%\*' + let l:format .= ' %*' + endif + + let l:wrapped = substitute(l:format, '%\*', l:command, '') + endif + + return l:prefix . l:wrapped +endfunction + +function! ale#job#PrepareCommand(buffer, command) abort + let l:wrapper = ale#Var(a:buffer, 'command_wrapper') + + " The command will be executed in a subshell. This fixes a number of + " issues, including reading the PATH variables correctly, %PATHEXT% + " expansion on Windows, etc. + " + " NeoVim handles this issue automatically if the command is a String, + " but we'll do this explicitly, so we use the same exact command for both + " versions. + let l:command = !empty(l:wrapper) + \ ? s:PrepareWrappedCommand(l:wrapper, a:command) + \ : a:command + + " If a custom shell is specified, use that. + if exists('b:ale_shell') + let l:ale_shell = b:ale_shell + elseif exists('g:ale_shell') + let l:ale_shell = g:ale_shell + endif + + if exists('l:ale_shell') + let l:shell_arguments = get(b:, 'ale_shell_arguments', get(g:, 'ale_shell_arguments', &shellcmdflag)) + + return split(l:ale_shell) + split(l:shell_arguments) + [l:command] + endif + + if has('win32') + return 'cmd /s/c "' . l:command . '"' + endif + + if &shell =~? 'fish$\|pwsh$' + return ['/bin/sh', '-c', l:command] + endif + + return split(&shell) + split(&shellcmdflag) + [l:command] +endfunction + +" Start a job with options which are agnostic to Vim and NeoVim. +" +" The following options are accepted: +" +" out_cb - A callback for receiving stdin. Arguments: (job_id, data) +" err_cb - A callback for receiving stderr. Arguments: (job_id, data) +" exit_cb - A callback for program exit. Arguments: (job_id, status_code) +" mode - A mode for I/O. Can be 'nl' for split lines or 'raw'. +function! ale#job#Start(command, options) abort + call ale#job#ValidateArguments(a:command, a:options) + + let l:job_info = copy(a:options) + let l:job_options = {} + + if has('nvim') + if has_key(a:options, 'out_cb') + let l:job_options.on_stdout = function('s:NeoVimCallback') + let l:job_info.out_cb_line = '' + endif + + if has_key(a:options, 'err_cb') + let l:job_options.on_stderr = function('s:NeoVimCallback') + let l:job_info.err_cb_line = '' + endif + + if has_key(a:options, 'exit_cb') + let l:job_options.on_exit = function('s:NeoVimCallback') + endif + + let l:job_info.job = jobstart(a:command, l:job_options) + let l:job_id = l:job_info.job + else + let l:job_options = { + \ 'in_mode': l:job_info.mode, + \ 'out_mode': l:job_info.mode, + \ 'err_mode': l:job_info.mode, + \} + + if has_key(a:options, 'out_cb') + let l:job_options.out_cb = function('s:VimOutputCallback') + else + " prevent buffering of output and excessive polling in case close_cb is set + let l:job_options.out_cb = {->0} + endif + + if has_key(a:options, 'err_cb') + let l:job_options.err_cb = function('s:VimErrorCallback') + else + " prevent buffering of output and excessive polling in case close_cb is set + let l:job_options.err_cb = {->0} + endif + + if has_key(a:options, 'exit_cb') + " Set a close callback to which simply calls job_status() + " when the channel is closed, which can trigger the exit callback + " earlier on. + let l:job_options.close_cb = function('s:VimCloseCallback') + let l:job_options.exit_cb = function('s:VimExitCallback') + endif + + " Use non-blocking writes for Vim versions that support the option. + if has('patch-8.1.350') + let l:job_options.noblock = 1 + endif + + " Vim 8 will read the stdin from the file's buffer. + let l:job_info.job = job_start(a:command, l:job_options) + let l:job_id = ale#job#ParseVim8ProcessID(string(l:job_info.job)) + endif + + if l:job_id > 0 + " Store the job in the map for later only if we can get the ID. + let s:job_map[l:job_id] = l:job_info + endif + + return l:job_id +endfunction + +" Force running commands in a Windows CMD command line. +" This means the same command syntax works everywhere. +function! ale#job#StartWithCmd(command, options) abort + let l:shell = &l:shell + let l:shellcmdflag = &l:shellcmdflag + let &l:shell = 'cmd' + let &l:shellcmdflag = '/c' + + try + let l:job_id = ale#job#Start(a:command, a:options) + finally + let &l:shell = l:shell + let &l:shellcmdflag = l:shellcmdflag + endtry + + return l:job_id +endfunction + +" Send raw data to the job. +function! ale#job#SendRaw(job_id, string) abort + if has('nvim') + call jobsend(a:job_id, a:string) + else + let l:job = s:job_map[a:job_id].job + + if ch_status(l:job) is# 'open' + call ch_sendraw(job_getchannel(l:job), a:string) + endif + endif +endfunction + +" Given a job ID, return 1 if the job is currently running. +" Invalid job IDs will be ignored. +function! ale#job#IsRunning(job_id) abort + if has('nvim') + try + " In NeoVim, if the job isn't running, jobpid() will throw. + call jobpid(a:job_id) + + return 1 + catch + endtry + elseif has_key(s:job_map, a:job_id) + let l:job = s:job_map[a:job_id].job + + return job_status(l:job) is# 'run' + endif + + return 0 +endfunction + +function! ale#job#HasOpenChannel(job_id) abort + if ale#job#IsRunning(a:job_id) + if has('nvim') + " TODO: Implement a check for NeoVim. + return 1 + endif + + " Check if the Job's channel can be written to. + return ch_status(s:job_map[a:job_id].job) is# 'open' + endif + + return 0 +endfunction + +" Given a Job ID, stop that job. +" Invalid job IDs will be ignored. +function! ale#job#Stop(job_id) abort + if !has_key(s:job_map, a:job_id) + return + endif + + if has('nvim') + " FIXME: NeoVim kills jobs on a timer, but will not kill any processes + " which are child processes on Unix. Some work needs to be done to + " kill child processes to stop long-running processes like pylint. + silent! call jobstop(a:job_id) + else + let l:job = s:job_map[a:job_id].job + + " We must close the channel for reading the buffer if it is open + " when stopping a job. Otherwise, we will get errors in the status line. + if ch_status(job_getchannel(l:job)) is# 'open' + call ch_close_in(job_getchannel(l:job)) + endif + + " Ask nicely for the job to stop. + call job_stop(l:job) + + if ale#job#IsRunning(l:job) + " Set a 100ms delay for killing the job with SIGKILL. + let s:job_kill_timers[timer_start(100, function('s:KillHandler'))] = l:job + endif + endif +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/julia.vim b/dot_vim/plugged/ale/autoload/ale/julia.vim new file mode 100644 index 0000000..18dd9ad --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/julia.vim @@ -0,0 +1,19 @@ +" Author: Bartolomeo Stellato bartolomeo.stellato@gmail.com +" Description: Functions for integrating with Julia tools + +" Find the nearest dir containing a julia project +let s:__ale_julia_project_filenames = ['REQUIRE', 'Manifest.toml', 'Project.toml'] + +function! ale#julia#FindProjectRoot(buffer) abort + for l:project_filename in s:__ale_julia_project_filenames + let l:full_path = ale#path#FindNearestFile(a:buffer, l:project_filename) + + if !empty(l:full_path) + let l:path = fnamemodify(l:full_path, ':p:h') + + return l:path + endif + endfor + + return '' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/linter.vim b/dot_vim/plugged/ale/autoload/ale/linter.vim new file mode 100644 index 0000000..d90deac --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/linter.vim @@ -0,0 +1,462 @@ +" Author: w0rp +" Description: Linter registration and lazy-loading +" Retrieves linters as requested by the engine, loading them if needed. + +let s:runtime_loaded_map = {} +let s:linters = {} + +" Default filetype aliases. +" The user defined aliases will be merged with this Dictionary. +" +" NOTE: Update the g:ale_linter_aliases documentation when modifying this. +let s:default_ale_linter_aliases = { +\ 'Dockerfile': 'dockerfile', +\ 'csh': 'sh', +\ 'javascriptreact': ['javascript', 'jsx'], +\ 'plaintex': 'tex', +\ 'ps1': 'powershell', +\ 'rmarkdown': 'r', +\ 'rmd': 'r', +\ 'systemverilog': 'verilog', +\ 'typescriptreact': ['typescript', 'tsx'], +\ 'vader': ['vim', 'vader'], +\ 'verilog_systemverilog': ['verilog_systemverilog', 'verilog'], +\ 'vimwiki': 'markdown', +\ 'vue': ['vue', 'javascript'], +\ 'xsd': ['xsd', 'xml'], +\ 'xslt': ['xslt', 'xml'], +\ 'zsh': 'sh', +\} + +" Default linters to run for particular filetypes. +" The user defined linter selections will be merged with this Dictionary. +" +" No linters are used for plaintext files by default. +" +" Only cargo and rls are enabled for Rust by default. +" rpmlint is disabled by default because it can result in code execution. +" hhast is disabled by default because it executes code in the project root. +" +" NOTE: Update the g:ale_linters documentation when modifying this. +let s:default_ale_linters = { +\ 'apkbuild': ['apkbuild_lint', 'secfixes_check'], +\ 'csh': ['shell'], +\ 'elixir': ['credo', 'dialyxir', 'dogma'], +\ 'go': ['gofmt', 'golint', 'gopls', 'govet'], +\ 'hack': ['hack'], +\ 'help': [], +\ 'inko': ['inko'], +\ 'json': ['jsonlint', 'spectral', 'vscodejson'], +\ 'json5': [], +\ 'jsonc': [], +\ 'perl': ['perlcritic'], +\ 'perl6': [], +\ 'python': ['flake8', 'mypy', 'pylint', 'pyright', 'ruff'], +\ 'rust': ['cargo', 'rls'], +\ 'spec': [], +\ 'text': [], +\ 'vader': ['vimls'], +\ 'vue': ['eslint', 'vls'], +\ 'zsh': ['shell'], +\ 'v': ['v'], +\ 'yaml': ['spectral', 'yaml-language-server', 'yamllint'], +\} + +" Testing/debugging helper to unload all linters. +function! ale#linter#Reset() abort + let s:runtime_loaded_map = {} + let s:linters = {} +endfunction + +" Return a reference to the linters loaded. +" This is only for tests. +" Do not call this function. +function! ale#linter#GetLintersLoaded() abort + " This command will throw from the sandbox. + let &l:equalprg=&l:equalprg + + return s:linters +endfunction + +function! s:IsCallback(value) abort + return type(a:value) is v:t_string || type(a:value) is v:t_func +endfunction + +function! s:IsBoolean(value) abort + return type(a:value) is v:t_number && (a:value == 0 || a:value == 1) +endfunction + +function! ale#linter#PreProcess(filetype, linter) abort + if type(a:linter) isnot v:t_dict + throw 'The linter object must be a Dictionary' + endif + + let l:obj = { + \ 'name': get(a:linter, 'name'), + \ 'lsp': get(a:linter, 'lsp', ''), + \} + + if type(l:obj.name) isnot v:t_string + throw '`name` must be defined to name the linter' + endif + + let l:needs_address = l:obj.lsp is# 'socket' + let l:needs_executable = l:obj.lsp isnot# 'socket' + let l:needs_command = l:obj.lsp isnot# 'socket' + let l:needs_lsp_details = !empty(l:obj.lsp) + + if empty(l:obj.lsp) + let l:obj.callback = get(a:linter, 'callback') + + if !s:IsCallback(l:obj.callback) + throw '`callback` must be defined with a callback to accept output' + endif + endif + + if index(['', 'socket', 'stdio', 'tsserver'], l:obj.lsp) < 0 + throw '`lsp` must be either `''lsp''`, `''stdio''`, `''socket''` or `''tsserver''` if defined' + endif + + if !l:needs_executable + if has_key(a:linter, 'executable') + throw '`executable` cannot be used when lsp == ''socket''' + endif + elseif has_key(a:linter, 'executable') + let l:obj.executable = a:linter.executable + + if type(l:obj.executable) isnot v:t_string + \&& type(l:obj.executable) isnot v:t_func + throw '`executable` must be a String or Function if defined' + endif + else + throw '`executable` must be defined' + endif + + if !l:needs_command + if has_key(a:linter, 'command') + throw '`command` cannot be used when lsp == ''socket''' + endif + elseif has_key(a:linter, 'command') + let l:obj.command = a:linter.command + + if type(l:obj.command) isnot v:t_string + \&& type(l:obj.command) isnot v:t_func + throw '`command` must be a String or Function if defined' + endif + else + throw '`command` must be defined' + endif + + if !l:needs_address + if has_key(a:linter, 'address') + throw '`address` cannot be used when lsp != ''socket''' + endif + elseif has_key(a:linter, 'address') + if type(a:linter.address) isnot v:t_string + \&& type(a:linter.address) isnot v:t_func + throw '`address` must be a String or Function if defined' + endif + + let l:obj.address = a:linter.address + + if has_key(a:linter, 'cwd') + throw '`cwd` makes no sense for socket LSP connections' + endif + else + throw '`address` must be defined for getting the LSP address' + endif + + if has_key(a:linter, 'cwd') + let l:obj.cwd = a:linter.cwd + + if type(l:obj.cwd) isnot v:t_string + \&& type(l:obj.cwd) isnot v:t_func + throw '`cwd` must be a String or Function if defined' + endif + endif + + if l:needs_lsp_details + " Default to using the filetype as the language. + let l:obj.language = get(a:linter, 'language', a:filetype) + + if type(l:obj.language) isnot v:t_string + \&& type(l:obj.language) isnot v:t_func + throw '`language` must be a String or Function if defined' + endif + + if has_key(a:linter, 'project_root') + let l:obj.project_root = a:linter.project_root + + if type(l:obj.project_root) isnot v:t_string + \&& type(l:obj.project_root) isnot v:t_func + throw '`project_root` must be a String or Function' + endif + else + throw '`project_root` must be defined for LSP linters' + endif + + if has_key(a:linter, 'completion_filter') + let l:obj.completion_filter = a:linter.completion_filter + + if !s:IsCallback(l:obj.completion_filter) + throw '`completion_filter` must be a callback' + endif + endif + + if has_key(a:linter, 'initialization_options') + let l:obj.initialization_options = a:linter.initialization_options + + if type(l:obj.initialization_options) isnot v:t_dict + \&& type(l:obj.initialization_options) isnot v:t_func + throw '`initialization_options` must be a Dictionary or Function if defined' + endif + endif + + if has_key(a:linter, 'lsp_config') + if type(a:linter.lsp_config) isnot v:t_dict + \&& type(a:linter.lsp_config) isnot v:t_func + throw '`lsp_config` must be a Dictionary or Function if defined' + endif + + let l:obj.lsp_config = a:linter.lsp_config + endif + endif + + let l:obj.output_stream = get(a:linter, 'output_stream', 'stdout') + + if type(l:obj.output_stream) isnot v:t_string + \|| index(['stdout', 'stderr', 'both'], l:obj.output_stream) < 0 + throw "`output_stream` must be 'stdout', 'stderr', or 'both'" + endif + + " An option indicating that this linter should only be run against the + " file on disk. + let l:obj.lint_file = get(a:linter, 'lint_file', 0) + + if !s:IsBoolean(l:obj.lint_file) && type(l:obj.lint_file) isnot v:t_func + throw '`lint_file` must be `0`, `1`, or a Function' + endif + + " An option indicating that the buffer should be read. + let l:obj.read_buffer = get(a:linter, 'read_buffer', 1) + + if !s:IsBoolean(l:obj.read_buffer) + throw '`read_buffer` must be `0` or `1`' + endif + + let l:obj.aliases = get(a:linter, 'aliases', []) + + if type(l:obj.aliases) isnot v:t_list + \|| len(filter(copy(l:obj.aliases), 'type(v:val) isnot v:t_string')) > 0 + throw '`aliases` must be a List of String values' + endif + + return l:obj +endfunction + +function! ale#linter#Define(filetype, linter) abort + " This command will throw from the sandbox. + let &l:equalprg=&l:equalprg + + let l:new_linter = ale#linter#PreProcess(a:filetype, a:linter) + + if !has_key(s:linters, a:filetype) + let s:linters[a:filetype] = [] + endif + + " Remove previously defined linters with the same name. + call filter(s:linters[a:filetype], 'v:val.name isnot# a:linter.name') + call add(s:linters[a:filetype], l:new_linter) +endfunction + +" Prevent any linters from being loaded for a given filetype. +function! ale#linter#PreventLoading(filetype) abort + let s:runtime_loaded_map[a:filetype] = 1 +endfunction + +function! ale#linter#GetAll(filetypes) abort + " Don't return linters in the sandbox. + " Otherwise a sandboxed script could modify them. + if ale#util#InSandbox() + return [] + endif + + let l:combined_linters = [] + + for l:filetype in a:filetypes + " Load linters from runtimepath if we haven't done that yet. + if !has_key(s:runtime_loaded_map, l:filetype) + execute 'silent! runtime! ale_linters/' . l:filetype . '/*.vim' + + let s:runtime_loaded_map[l:filetype] = 1 + endif + + call extend(l:combined_linters, get(s:linters, l:filetype, [])) + endfor + + return l:combined_linters +endfunction + +function! s:GetAliasedFiletype(original_filetype) abort + let l:buffer_aliases = get(b:, 'ale_linter_aliases', {}) + + " b:ale_linter_aliases can be set to a List or String. + if type(l:buffer_aliases) is v:t_list + \|| type(l:buffer_aliases) is v:t_string + return l:buffer_aliases + endif + + " Check for aliased filetypes first in a buffer variable, + " then the global variable, + " then in the default mapping, + " otherwise use the original filetype. + for l:dict in [ + \ l:buffer_aliases, + \ g:ale_linter_aliases, + \ s:default_ale_linter_aliases, + \] + if has_key(l:dict, a:original_filetype) + return l:dict[a:original_filetype] + endif + endfor + + return a:original_filetype +endfunction + +function! ale#linter#ResolveFiletype(original_filetype) abort + let l:filetype = s:GetAliasedFiletype(a:original_filetype) + + if type(l:filetype) isnot v:t_list + return [l:filetype] + endif + + return l:filetype +endfunction + +function! s:GetLinterNames(original_filetype) abort + let l:buffer_ale_linters = get(b:, 'ale_linters', {}) + + " b:ale_linters can be set to 'all' + if l:buffer_ale_linters is# 'all' + return 'all' + endif + + " b:ale_linters can be set to a List. + if type(l:buffer_ale_linters) is v:t_list + return l:buffer_ale_linters + endif + + " Try to get a buffer-local setting for the filetype + if has_key(l:buffer_ale_linters, a:original_filetype) + return l:buffer_ale_linters[a:original_filetype] + endif + + " Try to get a global setting for the filetype + if has_key(g:ale_linters, a:original_filetype) + return g:ale_linters[a:original_filetype] + endif + + " If the user has configured ALE to only enable linters explicitly, then + " don't enable any linters by default. + if g:ale_linters_explicit + return [] + endif + + " Try to get a default setting for the filetype + if has_key(s:default_ale_linters, a:original_filetype) + return s:default_ale_linters[a:original_filetype] + endif + + return 'all' +endfunction + +function! ale#linter#Get(original_filetypes) abort + let l:possibly_duplicated_linters = [] + + " Handle dot-separated filetypes. + for l:original_filetype in split(a:original_filetypes, '\.') + let l:filetype = ale#linter#ResolveFiletype(l:original_filetype) + let l:linter_names = s:GetLinterNames(l:original_filetype) + let l:all_linters = ale#linter#GetAll(l:filetype) + let l:filetype_linters = [] + + if type(l:linter_names) is v:t_string && l:linter_names is# 'all' + let l:filetype_linters = l:all_linters + elseif type(l:linter_names) is v:t_list + " Select only the linters we or the user has specified. + for l:linter in l:all_linters + let l:name_list = [l:linter.name] + l:linter.aliases + + for l:name in l:name_list + if index(l:linter_names, l:name) >= 0 + call add(l:filetype_linters, l:linter) + break + endif + endfor + endfor + endif + + call extend(l:possibly_duplicated_linters, l:filetype_linters) + endfor + + let l:name_list = [] + let l:combined_linters = [] + + " Make sure we override linters so we don't get two with the same name, + " like 'eslint' for both 'javascript' and 'typescript' + " + " Note that the reverse calls here modify the List variables. + for l:linter in reverse(l:possibly_duplicated_linters) + if index(l:name_list, l:linter.name) < 0 + call add(l:name_list, l:linter.name) + call add(l:combined_linters, l:linter) + endif + endfor + + return reverse(l:combined_linters) +endfunction + +function! ale#linter#RemoveIgnored(buffer, filetype, linters) abort + " Apply ignore lists for linters only if needed. + let l:ignore_config = ale#Var(a:buffer, 'linters_ignore') + let l:disable_lsp = ale#Var(a:buffer, 'disable_lsp') + + return !empty(l:ignore_config) || l:disable_lsp + \ ? ale#engine#ignore#Exclude(a:filetype, a:linters, l:ignore_config, l:disable_lsp) + \ : a:linters +endfunction + +" Given a buffer and linter, get the executable String for the linter. +function! ale#linter#GetExecutable(buffer, linter) abort + let l:Executable = a:linter.executable + + return type(l:Executable) is v:t_func + \ ? l:Executable(a:buffer) + \ : l:Executable +endfunction + +function! ale#linter#GetCwd(buffer, linter) abort + let l:Cwd = get(a:linter, 'cwd', v:null) + + return type(l:Cwd) is v:t_func ? l:Cwd(a:buffer) : l:Cwd +endfunction + +" Given a buffer and linter, get the command String for the linter. +function! ale#linter#GetCommand(buffer, linter) abort + let l:Command = a:linter.command + + return type(l:Command) is v:t_func ? l:Command(a:buffer) : l:Command +endfunction + +" Given a buffer and linter, get the address for connecting to the server. +function! ale#linter#GetAddress(buffer, linter) abort + let l:Address = a:linter.address + + return type(l:Address) is v:t_func ? l:Address(a:buffer) : l:Address +endfunction + +function! ale#linter#GetLanguage(buffer, linter) abort + let l:Language = a:linter.language + + return type(l:Language) is v:t_func ? l:Language(a:buffer) : l:Language +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/list.vim b/dot_vim/plugged/ale/autoload/ale/list.vim new file mode 100644 index 0000000..8ce8597 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/list.vim @@ -0,0 +1,274 @@ +" Author: Bjorn Neergaard , modified by Yann fery +" Description: Manages the loclist and quickfix lists + +" This flag dictates if ale open the configured loclist +let g:ale_open_list = get(g:, 'ale_open_list', 0) +" This flag dictates if ale keeps open loclist even if there is no error in loclist +let g:ale_keep_list_window_open = get(g:, 'ale_keep_list_window_open', 0) +" This flag dictates that quickfix windows should be opened vertically +let g:ale_list_vertical = get(g:, 'ale_list_vertical', 0) +" The window size to set for the quickfix and loclist windows +let g:ale_list_window_size = get(g:, 'ale_list_window_size', 10) +" A string format for the loclist messages. +let g:ale_loclist_msg_format = get(g:, 'ale_loclist_msg_format', +\ get(g:, 'ale_echo_msg_format', '%code: %%s') +\) + +if !exists('s:timer_args') + let s:timer_args = {} +endif + +" Return 1 if there is a buffer with buftype == 'quickfix' in buffer list +function! ale#list#IsQuickfixOpen() abort + let l:res = getqflist({ 'winid' : winnr() }) + + if has_key(l:res, 'winid') && l:res.winid > 0 + return 1 + endif + + let l:res = getloclist(0, { 'winid' : winnr() }) + + if has_key(l:res, 'winid') && l:res.winid > 0 + return 1 + endif + + return 0 +endfunction + +" Check if we should open the list, based on the save event being fired, and +" that setting being on, or that the error count is at least as high as the +" setting when set to an integer value. +function! s:ShouldOpen(buffer, loclist_len) abort + let l:val = ale#Var(a:buffer, 'open_list') + let l:saved = getbufvar(a:buffer, 'ale_save_event_fired', 0) + + return l:val > 0 ? a:loclist_len >= l:val : l:val is# 'on_save' && l:saved +endfunction + +" Check if we should close the list, based on the save event being fired, and +" that setting being on, or the setting just being set to an integer value. +function! s:ShouldClose(buffer) abort + let l:val = ale#Var(a:buffer, 'open_list') + let l:saved = getbufvar(a:buffer, 'ale_save_event_fired', 0) + + return !((l:val >= 1) || (l:val is# 'on_save' && l:saved)) +endfunction + +function! s:Deduplicate(list) abort + let l:list = a:list + + call sort(l:list, function('ale#util#LocItemCompareWithText')) + call uniq(l:list, function('ale#util#LocItemCompareWithText')) + + return l:list +endfunction + +function! ale#list#GetCombinedList() abort + let l:list = [] + + for l:info in values(g:ale_buffer_info) + call extend(l:list, l:info.loclist) + endfor + + return s:Deduplicate(l:list) +endfunction + +function! s:FixList(buffer, list) abort + let l:format = ale#Var(a:buffer, 'loclist_msg_format') + let l:new_list = [] + + for l:item in a:list + let l:fixed_item = copy(l:item) + + let l:fixed_item.text = ale#GetLocItemMessage(l:item, l:format) + + if l:item.bufnr == -1 + " If the buffer number is invalid, remove it. + call remove(l:fixed_item, 'bufnr') + endif + + call add(l:new_list, l:fixed_item) + endfor + + return l:new_list +endfunction + +function! s:WinFindBuf(buffer) abort + return exists('*win_findbuf') ? win_findbuf(str2nr(a:buffer)) : [0] +endfunction + +function! s:SetListsImpl(timer_id, buffer, loclist) abort + let l:title = expand('#' . a:buffer . ':p') + + if g:ale_set_quickfix + let l:quickfix_list = ale#list#GetCombinedList() + + if has('nvim') + call setqflist(s:FixList(a:buffer, l:quickfix_list), ' ', l:title) + else + call setqflist(s:FixList(a:buffer, l:quickfix_list)) + call setqflist([], 'r', {'title': l:title}) + endif + elseif g:ale_set_loclist + " If windows support is off, win_findbuf() may not exist. + " We'll set result in the current window, which might not be correct, + " but it's better than nothing. + let l:ids = s:WinFindBuf(a:buffer) + + let l:loclist = s:Deduplicate(a:loclist) + + for l:id in l:ids + if has('nvim') + call setloclist(l:id, s:FixList(a:buffer, l:loclist), ' ', l:title) + else + call setloclist(l:id, s:FixList(a:buffer, l:loclist)) + call setloclist(l:id, [], 'r', {'title': l:title}) + endif + endfor + endif + + " Save the current view before opening/closing any window + call setbufvar(a:buffer, 'ale_winview', winsaveview()) + + " Open a window to show the problems if we need to. + " + " ShouldOpen() checks if the current buffer has enough problems to be + " opened. + if s:ShouldOpen(a:buffer, len(a:loclist)) + let l:winnr = winnr() + let l:mode = mode() + + " open windows vertically instead of default horizontally + let l:open_type = '' + + if ale#Var(a:buffer, 'list_vertical') == 1 + let l:open_type = 'vert rightbelow ' + endif + + if g:ale_set_quickfix + if !ale#list#IsQuickfixOpen() + silent! execute l:open_type . 'copen ' . str2nr(ale#Var(a:buffer, 'list_window_size')) + endif + elseif g:ale_set_loclist + silent! execute l:open_type . 'lopen ' . str2nr(ale#Var(a:buffer, 'list_window_size')) + endif + + " If focus changed, restore it (jump to the last window). + if l:winnr isnot# winnr() + wincmd p + endif + + " Return to original mode when applicable + if mode() != l:mode + if l:mode is? 'v' || l:mode is# "\" + " Reset our last visual selection + normal! gv + elseif l:mode is? 's' || l:mode is# "\" + " Reset our last character selection + normal! "\" + endif + endif + + call s:RestoreViewIfNeeded(a:buffer) + endif + + " If ALE isn't currently checking for more problems, close the window if + " needed now. This check happens inside of this timer function, so + " the window can be closed reliably. + if !ale#engine#IsCheckingBuffer(a:buffer) + call s:CloseWindowIfNeeded(a:buffer) + endif +endfunction + +" Try to restore the window view after closing any of the lists to avoid making +" the it moving around, especially useful when on insert mode +function! s:RestoreViewIfNeeded(buffer) abort + let l:saved_view = getbufvar(a:buffer, 'ale_winview', {}) + + " Saved view is empty, can't do anything + if empty(l:saved_view) + return + endif + + " Check whether the cursor has moved since linting was actually requested. If + " the user has indeed moved lines, do nothing + let l:current_view = winsaveview() + + if l:current_view['lnum'] != l:saved_view['lnum'] + return + endif + + " Anchor view by topline if the list is set to open horizontally + if ale#Var(a:buffer, 'list_vertical') == 0 + call winrestview({'topline': l:saved_view['topline']}) + endif +endfunction + +function! ale#list#SetLists(buffer, loclist) abort + if get(g:, 'ale_set_lists_synchronously') == 1 + \|| getbufvar(a:buffer, 'ale_save_event_fired', 0) + " Update lists immediately if running a test synchronously, or if the + " buffer was saved. + " + " The lists need to be updated immediately when saving a buffer so + " that we can reliably close window automatically, if so configured. + call s:SetListsImpl(-1, a:buffer, a:loclist) + else + call ale#util#StartPartialTimer( + \ 0, + \ function('s:SetListsImpl'), + \ [a:buffer, a:loclist], + \) + endif +endfunction + +function! ale#list#ForcePopulateErrorList(populate_quickfix) abort + let l:quickfix_bak = g:ale_set_quickfix + let g:ale_set_quickfix = a:populate_quickfix + let l:loclist_bak = g:ale_set_loclist + let g:ale_set_loclist = !a:populate_quickfix + let l:open_list_bak = g:ale_open_list + let g:ale_open_list = 1 + + let l:buffer = bufnr('') + let l:loclist = get(g:ale_buffer_info, l:buffer, {'loclist': []}).loclist + call s:SetListsImpl(-1, l:buffer, l:loclist) + + let g:ale_open_list = l:open_list_bak + let g:ale_set_loclist = l:loclist_bak + let g:ale_set_quickfix = l:quickfix_bak +endfunction + +function! s:CloseWindowIfNeeded(buffer) abort + if ale#Var(a:buffer, 'keep_list_window_open') || s:ShouldClose(a:buffer) + return + endif + + let l:did_close_any_list = 0 + + try + " Only close windows if the quickfix list or loclist is completely empty, + " including errors set through other means. + if g:ale_set_quickfix + if empty(getqflist()) + cclose + let l:did_close_any_list = 1 + endif + else + let l:win_ids = s:WinFindBuf(a:buffer) + + for l:win_id in l:win_ids + if g:ale_set_loclist && empty(getloclist(l:win_id)) + lclose + let l:did_close_any_list = 1 + endif + endfor + endif + " Ignore 'Cannot close last window' errors. + catch /E444/ + endtry + + if l:did_close_any_list + call s:RestoreViewIfNeeded(a:buffer) + endif +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/loclist_jumping.vim b/dot_vim/plugged/ale/autoload/ale/loclist_jumping.vim new file mode 100644 index 0000000..55097d1 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/loclist_jumping.vim @@ -0,0 +1,163 @@ +" Author: w0rp +" Description: This file implements functions for jumping around in a file +" based on ALE's internal loclist. + +" Search for the nearest line either before or after the current position +" in the loclist. The argument 'wrap' can be passed to enable wrapping +" around the end of the list. +" +" If there are no items or we have hit the end with wrapping off, an empty +" List will be returned, otherwise a pair of [line_number, column_number] will +" be returned. +function! ale#loclist_jumping#FindNearest(direction, wrap, ...) abort + let l:buffer = bufnr('') + let l:pos = getpos('.') + let l:info = get(g:ale_buffer_info, bufnr('%'), {'loclist': []}) + " Copy the list and filter to only the items in this buffer. + let l:loclist = filter(copy(l:info.loclist), 'v:val.bufnr == l:buffer') + let l:search_item = {'bufnr': l:buffer, 'lnum': l:pos[1], 'col': l:pos[2]} + + if a:0 > 0 + let l:filter = a:1 + else + let l:filter = 'any' + endif + + if a:0 > 1 + let l:subtype_filter = a:2 + else + let l:subtype_filter = 'any' + endif + + " When searching backwards, so we can find the next smallest match. + if a:direction is# 'before' + call reverse(l:loclist) + endif + + " Look for items before or after the current position. + for l:item in l:loclist + " Compare the cursor with a item where the column number is bounded, + " such that it's possible for the cursor to actually be on the given + " column number, without modifying the cursor number we return. This + " will allow us to move through matches, but still let us move the + " cursor to a line without changing the column, in some cases. + let l:cmp_value = ale#util#LocItemCompare( + \ { + \ 'bufnr': l:buffer, + \ 'lnum': l:item.lnum, + \ 'col': min([ + \ max([l:item.col, 1]), + \ max([len(getline(l:item.lnum)), 1]), + \ ]), + \ }, + \ l:search_item + \) + + if (l:filter is# 'any' || l:filter is# l:item.type) + \&& ( + \ l:subtype_filter is# 'any' + \ || l:subtype_filter is# get(l:item, 'sub_type', '') + \) + + if a:direction is# 'before' && l:cmp_value < 0 + return [l:item.lnum, l:item.col] + endif + + if a:direction is# 'after' && l:cmp_value > 0 + return [l:item.lnum, l:item.col] + endif + endif + endfor + + " If we found nothing, and the wrap option is set to 1, then we should + " wrap around the list of warnings/errors + if a:wrap + for l:item in l:loclist + if (l:filter is# 'any' || l:filter is# l:item.type) + \&& ( + \ l:subtype_filter is# 'any' + \ || l:subtype_filter is# get(l:item, 'sub_type', '') + \) + return [l:item.lnum, l:item.col] + endif + endfor + endif + + return [] +endfunction + +" As before, find the nearest match, but position the cursor at it. +function! ale#loclist_jumping#Jump(direction, ...) abort + if a:0 > 0 + let l:wrap = a:1 + else + let l:wrap = 0 + endif + + if a:0 > 1 + let l:filter = a:2 + else + let l:filter = 'any' + endif + + if a:0 > 2 + let l:subtype_filter = a:3 + else + let l:subtype_filter = 'any' + endif + + let l:nearest = ale#loclist_jumping#FindNearest(a:direction, + \ l:wrap, l:filter, l:subtype_filter) + + if !empty(l:nearest) + normal! m` + call cursor([l:nearest[0], max([l:nearest[1], 1])]) + endif +endfunction + +function! ale#loclist_jumping#WrapJump(direction, sargs) abort + let [l:args, l:rest] = ale#args#Parse(['error', 'warning', 'info', 'wrap', + \ 'style', 'nostyle'], a:sargs) + + let l:wrap = 0 + let l:type_filter = 'any' + let l:subtype_filter = 'any' + + if get(l:args, 'wrap', 'nil') is# '' + let l:wrap = 1 + endif + + if get(l:args, 'error', 'nil') is# '' + let l:type_filter = 'E' + elseif get(l:args, 'warning', 'nil') is# '' + let l:type_filter = 'W' + elseif get(l:args, 'info', 'nil') is# '' + let l:type_filter = 'I' + endif + + if get(l:args, 'nostyle', 'nil') is# '' + let l:subtype_filter = 'style' + elseif get(l:args, 'style', 'nil') is# '' + let l:subtype_filter = '' + endif + + call ale#loclist_jumping#Jump(a:direction, l:wrap, l:type_filter, + \ l:subtype_filter) +endfunction + +function! ale#loclist_jumping#JumpToIndex(index) abort + let l:buffer = bufnr('') + let l:info = get(g:ale_buffer_info, l:buffer, {'loclist': []}) + let l:loclist = filter(copy(l:info.loclist), 'v:val.bufnr == l:buffer') + + if empty(l:loclist) + return + endif + + let l:item = l:loclist[a:index] + + if !empty(l:item) + normal! m` + call cursor([l:item.lnum, l:item.col]) + endif +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/lsp.vim b/dot_vim/plugged/ale/autoload/ale/lsp.vim new file mode 100644 index 0000000..daaed6f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/lsp.vim @@ -0,0 +1,718 @@ +" Author: w0rp +" Description: Language Server Protocol client code + +" A Dictionary for tracking connections. +let s:connections = get(s:, 'connections', {}) +let g:ale_lsp_next_message_id = 1 + +" Given an id, which can be an executable or address, and a project path, +" create a new connection if needed. Return a unique ID for the connection. +function! ale#lsp#Register(executable_or_address, project, init_options) abort + let l:conn_id = a:executable_or_address . ':' . a:project + + if !has_key(s:connections, l:conn_id) + " is_tsserver: 1 if the connection is for tsserver. + " data: The message data received so far. + " root: The project root. + " open_documents: A Dictionary mapping buffers to b:changedtick, keeping + " track of when documents were opened, and when we last changed them. + " initialized: 0 if the connection is ready, 1 otherwise. + " init_request_id: The ID for the init request. + " init_options: Options to send to the server. + " config: Configuration settings to send to the server. + " callback_list: A list of callbacks for handling LSP responses. + " capabilities_queue: The list of callbacks to call with capabilities. + " capabilities: Features the server supports. + let s:connections[l:conn_id] = { + \ 'id': l:conn_id, + \ 'is_tsserver': 0, + \ 'data': '', + \ 'root': a:project, + \ 'open_documents': {}, + \ 'initialized': 0, + \ 'init_request_id': 0, + \ 'init_options': a:init_options, + \ 'config': {}, + \ 'callback_list': [], + \ 'init_queue': [], + \ 'capabilities': { + \ 'hover': 0, + \ 'rename': 0, + \ 'filerename': 0, + \ 'references': 0, + \ 'completion': 0, + \ 'completion_trigger_characters': [], + \ 'definition': 0, + \ 'typeDefinition': 0, + \ 'implementation': 0, + \ 'symbol_search': 0, + \ 'code_actions': 0, + \ 'did_save': 0, + \ 'includeText': 0, + \ }, + \} + endif + + return l:conn_id +endfunction + +" Remove an LSP connection with a given ID. This is only for tests. +function! ale#lsp#RemoveConnectionWithID(id) abort + if has_key(s:connections, a:id) + call remove(s:connections, a:id) + endif +endfunction + +function! ale#lsp#ResetConnections() abort + let s:connections = {} +endfunction + +" Used only in tests. +function! ale#lsp#GetConnections() abort + " This command will throw from the sandbox. + let &l:equalprg=&l:equalprg + + return s:connections +endfunction + +" This is only needed for tests +function! ale#lsp#MarkDocumentAsOpen(id, buffer) abort + let l:conn = get(s:connections, a:id, {}) + + if !empty(l:conn) + let l:conn.open_documents[a:buffer] = -1 + endif +endfunction + +function! ale#lsp#GetNextMessageID() abort + " Use the current ID + let l:id = g:ale_lsp_next_message_id + + " Increment the ID variable. + let g:ale_lsp_next_message_id += 1 + + " When the ID overflows, reset it to 1. By the time we hit the initial ID + " again, the messages will be long gone. + if g:ale_lsp_next_message_id < 1 + let g:ale_lsp_next_message_id = 1 + endif + + return l:id +endfunction + +" TypeScript messages use a different format. +function! s:CreateTSServerMessageData(message) abort + let l:is_notification = a:message[0] + + let l:obj = { + \ 'seq': v:null, + \ 'type': 'request', + \ 'command': a:message[1][3:], + \} + + if !l:is_notification + let l:obj.seq = ale#lsp#GetNextMessageID() + endif + + if len(a:message) > 2 + let l:obj.arguments = a:message[2] + endif + + let l:data = json_encode(l:obj) . "\n" + + return [l:is_notification ? 0 : l:obj.seq, l:data] +endfunction + +" Given a List of one or two items, [method_name] or [method_name, params], +" return a List containing [message_id, message_data] +function! ale#lsp#CreateMessageData(message) abort + if a:message[1][:2] is# 'ts@' + return s:CreateTSServerMessageData(a:message) + endif + + let l:is_notification = a:message[0] + + let l:obj = { + \ 'method': a:message[1], + \ 'jsonrpc': '2.0', + \} + + if !l:is_notification + let l:obj.id = ale#lsp#GetNextMessageID() + endif + + if len(a:message) > 2 + let l:obj.params = a:message[2] + endif + + let l:body = json_encode(l:obj) + let l:data = 'Content-Length: ' . strlen(l:body) . "\r\n\r\n" . l:body + + return [l:is_notification ? 0 : l:obj.id, l:data] +endfunction + +function! ale#lsp#ReadMessageData(data) abort + let l:response_list = [] + let l:remainder = a:data + + while 1 + " Look for the end of the HTTP headers + let l:body_start_index = matchend(l:remainder, "\r\n\r\n") + + if l:body_start_index < 0 + " No header end was found yet. + break + endif + + " Parse the Content-Length header. + let l:header_data = l:remainder[:l:body_start_index - 4] + let l:length_match = matchlist( + \ l:header_data, + \ '\vContent-Length: *(\d+)' + \) + + if empty(l:length_match) + throw "Invalid JSON-RPC header:\n" . l:header_data + endif + + " Split the body and the remainder of the text. + let l:remainder_start_index = l:body_start_index + str2nr(l:length_match[1]) + + if len(l:remainder) < l:remainder_start_index + " We don't have enough data yet. + break + endif + + let l:body = l:remainder[l:body_start_index : l:remainder_start_index - 1] + let l:remainder = l:remainder[l:remainder_start_index :] + + " Parse the JSON object and add it to the list. + call add(l:response_list, json_decode(l:body)) + endwhile + + return [l:remainder, l:response_list] +endfunction + +" Update capabilities from the server, so we know which features the server +" supports. +function! s:UpdateCapabilities(conn, capabilities) abort + if type(a:capabilities) isnot v:t_dict + return + endif + + if get(a:capabilities, 'hoverProvider') is v:true + let a:conn.capabilities.hover = 1 + endif + + if type(get(a:capabilities, 'hoverProvider')) is v:t_dict + let a:conn.capabilities.hover = 1 + endif + + if get(a:capabilities, 'referencesProvider') is v:true + let a:conn.capabilities.references = 1 + endif + + if type(get(a:capabilities, 'referencesProvider')) is v:t_dict + let a:conn.capabilities.references = 1 + endif + + if get(a:capabilities, 'renameProvider') is v:true + let a:conn.capabilities.rename = 1 + endif + + if type(get(a:capabilities, 'renameProvider')) is v:t_dict + let a:conn.capabilities.rename = 1 + endif + + if get(a:capabilities, 'codeActionProvider') is v:true + let a:conn.capabilities.code_actions = 1 + endif + + if type(get(a:capabilities, 'codeActionProvider')) is v:t_dict + let a:conn.capabilities.code_actions = 1 + endif + + if !empty(get(a:capabilities, 'completionProvider')) + let a:conn.capabilities.completion = 1 + endif + + if type(get(a:capabilities, 'completionProvider')) is v:t_dict + let l:chars = get(a:capabilities.completionProvider, 'triggerCharacters') + + if type(l:chars) is v:t_list + let a:conn.capabilities.completion_trigger_characters = l:chars + endif + endif + + if get(a:capabilities, 'definitionProvider') is v:true + let a:conn.capabilities.definition = 1 + endif + + if type(get(a:capabilities, 'definitionProvider')) is v:t_dict + let a:conn.capabilities.definition = 1 + endif + + if get(a:capabilities, 'typeDefinitionProvider') is v:true + let a:conn.capabilities.typeDefinition = 1 + endif + + if type(get(a:capabilities, 'typeDefinitionProvider')) is v:t_dict + let a:conn.capabilities.typeDefinition = 1 + endif + + if get(a:capabilities, 'implementationProvider') is v:true + let a:conn.capabilities.implementation = 1 + endif + + if type(get(a:capabilities, 'implementationProvider')) is v:t_dict + let a:conn.capabilities.implementation = 1 + endif + + if get(a:capabilities, 'workspaceSymbolProvider') is v:true + let a:conn.capabilities.symbol_search = 1 + endif + + if type(get(a:capabilities, 'workspaceSymbolProvider')) is v:t_dict + let a:conn.capabilities.symbol_search = 1 + endif + + if type(get(a:capabilities, 'textDocumentSync')) is v:t_dict + let l:syncOptions = get(a:capabilities, 'textDocumentSync') + + if get(l:syncOptions, 'save') is v:true + let a:conn.capabilities.did_save = 1 + endif + + if type(get(l:syncOptions, 'save')) is v:t_dict + let a:conn.capabilities.did_save = 1 + + let l:saveOptions = get(l:syncOptions, 'save') + + if get(l:saveOptions, 'includeText') is v:true + let a:conn.capabilities.includeText = 1 + endif + endif + endif +endfunction + +" Update a connection's configuration dictionary and notify LSP servers +" of any changes since the last update. Returns 1 if a configuration +" update was sent; otherwise 0 will be returned. +function! ale#lsp#UpdateConfig(conn_id, buffer, config) abort + let l:conn = get(s:connections, a:conn_id, {}) + + if empty(l:conn) || a:config ==# l:conn.config " no-custom-checks + return 0 + endif + + let l:conn.config = a:config + let l:message = ale#lsp#message#DidChangeConfiguration(a:buffer, a:config) + + call ale#lsp#Send(a:conn_id, l:message) + + return 1 +endfunction + + +function! ale#lsp#HandleInitResponse(conn, response) abort + if get(a:response, 'method', '') is# 'initialize' + let a:conn.initialized = 1 + elseif type(get(a:response, 'result')) is v:t_dict + \&& has_key(a:response.result, 'capabilities') + call s:UpdateCapabilities(a:conn, a:response.result.capabilities) + + let a:conn.initialized = 1 + endif + + if !a:conn.initialized + return + endif + + " The initialized message must be sent before everything else. + call ale#lsp#Send(a:conn.id, ale#lsp#message#Initialized()) + + " Call capabilities callbacks queued for the project. + for l:Callback in a:conn.init_queue + call l:Callback() + endfor + + let a:conn.init_queue = [] +endfunction + +function! ale#lsp#HandleMessage(conn_id, message) abort + let l:conn = get(s:connections, a:conn_id, {}) + + if empty(l:conn) + return + endif + + if type(a:message) isnot v:t_string + " Ignore messages that aren't strings. + return + endif + + let l:conn.data .= a:message + + " Parse the objects now if we can, and keep the remaining text. + let [l:conn.data, l:response_list] = ale#lsp#ReadMessageData(l:conn.data) + + " Look for initialize responses first. + if !l:conn.initialized + for l:response in l:response_list + call ale#lsp#HandleInitResponse(l:conn, l:response) + endfor + endif + + " If the connection is marked as initialized, call the callbacks with the + " responses. + if l:conn.initialized + for l:response in l:response_list + " Call all of the registered handlers with the response. + for l:Callback in l:conn.callback_list + call ale#util#GetFunction(l:Callback)(a:conn_id, l:response) + endfor + endfor + endif +endfunction + +" Given a connection ID, mark it as a tsserver connection, so it will be +" handled that way. +function! ale#lsp#MarkConnectionAsTsserver(conn_id) abort + let l:conn = s:connections[a:conn_id] + let l:conn.is_tsserver = 1 + let l:conn.initialized = 1 + " Set capabilities which are supported by tsserver. + let l:conn.capabilities.hover = 1 + let l:conn.capabilities.references = 1 + let l:conn.capabilities.completion = 1 + let l:conn.capabilities.completion_trigger_characters = ['.'] + let l:conn.capabilities.definition = 1 + let l:conn.capabilities.typeDefinition = 1 + let l:conn.capabilities.implementation = 1 + let l:conn.capabilities.symbol_search = 1 + let l:conn.capabilities.rename = 1 + let l:conn.capabilities.filerename = 1 + let l:conn.capabilities.code_actions = 1 +endfunction + +function! s:SendInitMessage(conn) abort + let [l:init_id, l:init_data] = ale#lsp#CreateMessageData( + \ ale#lsp#message#Initialize( + \ a:conn.root, + \ a:conn.init_options, + \ { + \ 'workspace': { + \ 'applyEdit': v:false, + \ 'didChangeConfiguration': { + \ 'dynamicRegistration': v:false, + \ }, + \ 'symbol': { + \ 'dynamicRegistration': v:false, + \ }, + \ 'workspaceFolders': v:false, + \ 'configuration': v:false, + \ }, + \ 'textDocument': { + \ 'synchronization': { + \ 'dynamicRegistration': v:false, + \ 'willSave': v:false, + \ 'willSaveWaitUntil': v:false, + \ 'didSave': v:true, + \ }, + \ 'completion': { + \ 'dynamicRegistration': v:false, + \ 'completionItem': { + \ 'snippetSupport': v:false, + \ 'commitCharactersSupport': v:false, + \ 'documentationFormat': ['plaintext'], + \ 'deprecatedSupport': v:false, + \ 'preselectSupport': v:false, + \ }, + \ 'contextSupport': v:false, + \ }, + \ 'hover': { + \ 'dynamicRegistration': v:false, + \ 'contentFormat': ['plaintext'], + \ }, + \ 'references': { + \ 'dynamicRegistration': v:false, + \ }, + \ 'documentSymbol': { + \ 'dynamicRegistration': v:false, + \ 'hierarchicalDocumentSymbolSupport': v:false, + \ }, + \ 'definition': { + \ 'dynamicRegistration': v:false, + \ 'linkSupport': v:false, + \ }, + \ 'typeDefinition': { + \ 'dynamicRegistration': v:false, + \ }, + \ 'implementation': { + \ 'dynamicRegistration': v:false, + \ 'linkSupport': v:false, + \ }, + \ 'publishDiagnostics': { + \ 'relatedInformation': v:true, + \ }, + \ 'codeAction': { + \ 'dynamicRegistration': v:false, + \ 'codeActionLiteralSupport': { + \ 'codeActionKind': { + \ 'valueSet': [] + \ } + \ } + \ }, + \ 'rename': { + \ 'dynamicRegistration': v:false, + \ }, + \ }, + \ }, + \ ), + \) + let a:conn.init_request_id = l:init_id + call s:SendMessageData(a:conn, l:init_data) +endfunction + +" Start a program for LSP servers. +" +" 1 will be returned if the program is running, or 0 if the program could +" not be started. +function! ale#lsp#StartProgram(conn_id, executable, command) abort + let l:conn = s:connections[a:conn_id] + let l:started = 0 + + if !has_key(l:conn, 'job_id') || !ale#job#HasOpenChannel(l:conn.job_id) + let l:options = { + \ 'mode': 'raw', + \ 'out_cb': {_, message -> ale#lsp#HandleMessage(a:conn_id, message)}, + \ 'exit_cb': { -> ale#lsp#Stop(a:conn_id) }, + \} + + if has('win32') + let l:job_id = ale#job#StartWithCmd(a:command, l:options) + else + let l:job_id = ale#job#Start(a:command, l:options) + endif + + let l:started = 1 + else + let l:job_id = l:conn.job_id + endif + + if l:job_id > 0 + let l:conn.job_id = l:job_id + endif + + if l:started && !l:conn.is_tsserver + let l:conn.initialized = 0 + call s:SendInitMessage(l:conn) + endif + + return l:job_id > 0 +endfunction + +" Connect to an LSP server via TCP. +" +" 1 will be returned if the connection is running, or 0 if the connection could +" not be opened. +function! ale#lsp#ConnectToAddress(conn_id, address) abort + let l:conn = s:connections[a:conn_id] + let l:started = 0 + + if !has_key(l:conn, 'channel_id') || !ale#socket#IsOpen(l:conn.channel_id) + let l:channel_id = ale#socket#Open(a:address, { + \ 'callback': {_, mess -> ale#lsp#HandleMessage(a:conn_id, mess)}, + \}) + + let l:started = 1 + else + let l:channel_id = l:conn.channel_id + endif + + if l:channel_id >= 0 + let l:conn.channel_id = l:channel_id + endif + + if l:started + call s:SendInitMessage(l:conn) + endif + + return l:channel_id >= 0 +endfunction + +" Given a connection ID and a callback, register that callback for handling +" messages if the connection exists. +function! ale#lsp#RegisterCallback(conn_id, callback) abort + let l:conn = get(s:connections, a:conn_id, {}) + + if !empty(l:conn) + " Add the callback to the List if it's not there already. + call uniq(sort(add(l:conn.callback_list, a:callback))) + endif +endfunction + +" Stop a single LSP connection. +function! ale#lsp#Stop(conn_id) abort + if has_key(s:connections, a:conn_id) + let l:conn = remove(s:connections, a:conn_id) + + if has_key(l:conn, 'channel_id') + call ale#socket#Close(l:conn.channel_id) + elseif has_key(l:conn, 'job_id') + call ale#job#Stop(l:conn.job_id) + endif + endif +endfunction + +function! ale#lsp#CloseDocument(conn_id) abort +endfunction + +" Stop all LSP connections, closing all jobs and channels, and removing any +" queued messages. +function! ale#lsp#StopAll() abort + for l:conn_id in keys(s:connections) + call ale#lsp#Stop(l:conn_id) + endfor +endfunction + +function! s:SendMessageData(conn, data) abort + if has_key(a:conn, 'job_id') + call ale#job#SendRaw(a:conn.job_id, a:data) + elseif has_key(a:conn, 'channel_id') && ale#socket#IsOpen(a:conn.channel_id) + " Send the message to the server + call ale#socket#Send(a:conn.channel_id, a:data) + else + return 0 + endif + + return 1 +endfunction + +" Send a message to an LSP server. +" Notifications do not need to be handled. +" +" Returns -1 when a message is sent, but no response is expected +" 0 when the message is not sent and +" >= 1 with the message ID when a response is expected. +function! ale#lsp#Send(conn_id, message) abort + let l:conn = get(s:connections, a:conn_id, {}) + + if empty(l:conn) + return 0 + endif + + if !l:conn.initialized + throw 'LSP server not initialized yet!' + endif + + let [l:id, l:data] = ale#lsp#CreateMessageData(a:message) + call s:SendMessageData(l:conn, l:data) + + return l:id == 0 ? -1 : l:id +endfunction + +" Notify LSP servers or tsserver if a document is opened, if needed. +" If a document is opened, 1 will be returned, otherwise 0 will be returned. +function! ale#lsp#OpenDocument(conn_id, buffer, language_id) abort + let l:conn = get(s:connections, a:conn_id, {}) + let l:opened = 0 + + if !empty(l:conn) && !has_key(l:conn.open_documents, a:buffer) + if l:conn.is_tsserver + let l:message = ale#lsp#tsserver_message#Open(a:buffer) + else + let l:message = ale#lsp#message#DidOpen(a:buffer, a:language_id) + endif + + call ale#lsp#Send(a:conn_id, l:message) + let l:conn.open_documents[a:buffer] = getbufvar(a:buffer, 'changedtick') + let l:opened = 1 + endif + + return l:opened +endfunction + +" Notify LSP servers or tsserver that a document is closed, if opened before. +" If a document is closed, 1 will be returned, otherwise 0 will be returned. +" +" Only the buffer number is required here. A message will be sent to every +" language server that was notified previously of the document being opened. +function! ale#lsp#CloseDocument(buffer) abort + let l:closed = 0 + + " The connection keys are sorted so the messages are easier to test, and + " so messages are sent in a consistent order. + for l:conn_id in sort(keys(s:connections)) + let l:conn = s:connections[l:conn_id] + + if l:conn.initialized && has_key(l:conn.open_documents, a:buffer) + if l:conn.is_tsserver + let l:message = ale#lsp#tsserver_message#Close(a:buffer) + else + let l:message = ale#lsp#message#DidClose(a:buffer) + endif + + call ale#lsp#Send(l:conn_id, l:message) + call remove(l:conn.open_documents, a:buffer) + let l:closed = 1 + endif + endfor + + return l:closed +endfunction + +" Notify LSP servers or tsserver that a document has changed, if needed. +" If a notification is sent, 1 will be returned, otherwise 0 will be returned. +function! ale#lsp#NotifyForChanges(conn_id, buffer) abort + let l:conn = get(s:connections, a:conn_id, {}) + let l:notified = 0 + + if !empty(l:conn) && has_key(l:conn.open_documents, a:buffer) + let l:new_tick = getbufvar(a:buffer, 'changedtick') + + if l:conn.open_documents[a:buffer] < l:new_tick + if l:conn.is_tsserver + let l:message = ale#lsp#tsserver_message#Change(a:buffer) + else + let l:message = ale#lsp#message#DidChange(a:buffer) + endif + + call ale#lsp#Send(a:conn_id, l:message) + let l:conn.open_documents[a:buffer] = l:new_tick + let l:notified = 1 + endif + endif + + return l:notified +endfunction + +" Wait for an LSP server to be initialized. +function! ale#lsp#OnInit(conn_id, Callback) abort + let l:conn = get(s:connections, a:conn_id, {}) + + if empty(l:conn) + return + endif + + if l:conn.initialized + call a:Callback() + else + call add(l:conn.init_queue, a:Callback) + endif +endfunction + +" Check if an LSP has a given capability. +function! ale#lsp#HasCapability(conn_id, capability) abort + let l:conn = get(s:connections, a:conn_id, {}) + + if empty(l:conn) + return 0 + endif + + if type(get(l:conn.capabilities, a:capability, v:null)) isnot v:t_number + throw 'Invalid capability ' . a:capability + endif + + return l:conn.capabilities[a:capability] +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/lsp/message.vim b/dot_vim/plugged/ale/autoload/ale/lsp/message.vim new file mode 100644 index 0000000..c2238de --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/lsp/message.vim @@ -0,0 +1,212 @@ +" Author: w0rp +" Description: Language Server Protocol message implementations +" +" Messages in this movie will be returned in the format +" [is_notification, method_name, params?] +" +" All functions which accept line and column arguments expect them to be 1-based +" (the same format as being returned by getpos() and friends), those then +" will be converted to 0-based as specified by LSP. +let g:ale_lsp_next_version_id = 1 + +" The LSP protocols demands that we send every change to a document, including +" undo, with incrementing version numbers, so we'll just use one incrementing +" ID for everything. +function! ale#lsp#message#GetNextVersionID() abort + " Use the current ID + let l:id = g:ale_lsp_next_version_id + + " Increment the ID variable. + let g:ale_lsp_next_version_id += 1 + + " When the ID overflows, reset it to 1. By the time we hit the initial ID + " again, the messages will be long gone. + if g:ale_lsp_next_version_id < 1 + let g:ale_lsp_next_version_id = 1 + endif + + return l:id +endfunction + +function! ale#lsp#message#Initialize(root_path, options, capabilities) abort + " NOTE: rootPath is deprecated in favour of rootUri + return [0, 'initialize', { + \ 'processId': getpid(), + \ 'rootPath': a:root_path, + \ 'capabilities': a:capabilities, + \ 'initializationOptions': a:options, + \ 'rootUri': ale#util#ToURI(a:root_path), + \}] +endfunction + +function! ale#lsp#message#Initialized() abort + return [1, 'initialized', {}] +endfunction + +function! ale#lsp#message#Shutdown() abort + return [0, 'shutdown'] +endfunction + +function! ale#lsp#message#Exit() abort + return [1, 'exit'] +endfunction + +function! ale#lsp#message#DidOpen(buffer, language_id) abort + let l:lines = getbufline(a:buffer, 1, '$') + + return [1, 'textDocument/didOpen', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ 'languageId': a:language_id, + \ 'version': ale#lsp#message#GetNextVersionID(), + \ 'text': join(l:lines, "\n") . "\n", + \ }, + \}] +endfunction + +function! ale#lsp#message#DidChange(buffer) abort + let l:lines = getbufline(a:buffer, 1, '$') + + " For changes, we simply send the full text of the document to the server. + return [1, 'textDocument/didChange', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ 'version': ale#lsp#message#GetNextVersionID(), + \ }, + \ 'contentChanges': [{'text': join(l:lines, "\n") . "\n"}] + \}] +endfunction + +function! ale#lsp#message#DidSave(buffer, include_text) abort + let l:response = [1, 'textDocument/didSave', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \}] + + if a:include_text + let l:response[2].textDocument.version = ale#lsp#message#GetNextVersionID() + let l:response[2].text = ale#util#GetBufferContents(a:buffer) + endif + + return l:response +endfunction + +function! ale#lsp#message#DidClose(buffer) abort + return [1, 'textDocument/didClose', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \}] +endfunction + +let s:COMPLETION_TRIGGER_INVOKED = 1 +let s:COMPLETION_TRIGGER_CHARACTER = 2 + +function! ale#lsp#message#Completion(buffer, line, column, trigger_character) abort + let l:message = [0, 'textDocument/completion', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \ 'position': {'line': a:line - 1, 'character': a:column - 1}, + \}] + + if !empty(a:trigger_character) + let l:message[2].context = { + \ 'triggerKind': s:COMPLETION_TRIGGER_CHARACTER, + \ 'triggerCharacter': a:trigger_character, + \} + endif + + return l:message +endfunction + +function! ale#lsp#message#Definition(buffer, line, column) abort + return [0, 'textDocument/definition', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \ 'position': {'line': a:line - 1, 'character': a:column - 1}, + \}] +endfunction + +function! ale#lsp#message#TypeDefinition(buffer, line, column) abort + return [0, 'textDocument/typeDefinition', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \ 'position': {'line': a:line - 1, 'character': a:column - 1}, + \}] +endfunction + +function! ale#lsp#message#Implementation(buffer, line, column) abort + return [0, 'textDocument/implementation', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \ 'position': {'line': a:line - 1, 'character': a:column - 1}, + \}] +endfunction + +function! ale#lsp#message#References(buffer, line, column) abort + return [0, 'textDocument/references', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \ 'position': {'line': a:line - 1, 'character': a:column - 1}, + \ 'context': {'includeDeclaration': v:false}, + \}] +endfunction + +function! ale#lsp#message#Symbol(query) abort + return [0, 'workspace/symbol', { + \ 'query': a:query, + \}] +endfunction + +function! ale#lsp#message#Hover(buffer, line, column) abort + return [0, 'textDocument/hover', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \ 'position': {'line': a:line - 1, 'character': a:column - 1}, + \}] +endfunction + +function! ale#lsp#message#DidChangeConfiguration(buffer, config) abort + return [1, 'workspace/didChangeConfiguration', { + \ 'settings': a:config, + \}] +endfunction + +function! ale#lsp#message#Rename(buffer, line, column, new_name) abort + return [0, 'textDocument/rename', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \ 'position': {'line': a:line - 1, 'character': a:column - 1}, + \ 'newName': a:new_name, + \}] +endfunction + +function! ale#lsp#message#CodeAction(buffer, line, column, end_line, end_column, diagnostics) abort + return [0, 'textDocument/codeAction', { + \ 'textDocument': { + \ 'uri': ale#util#ToURI(expand('#' . a:buffer . ':p')), + \ }, + \ 'range': { + \ 'start': {'line': a:line - 1, 'character': a:column - 1}, + \ 'end': {'line': a:end_line - 1, 'character': a:end_column}, + \ }, + \ 'context': { + \ 'diagnostics': a:diagnostics + \ }, + \}] +endfunction + +function! ale#lsp#message#ExecuteCommand(command, arguments) abort + return [0, 'workspace/executeCommand', { + \ 'command': a:command, + \ 'arguments': a:arguments, + \}] +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/lsp/reset.vim b/dot_vim/plugged/ale/autoload/ale/lsp/reset.vim new file mode 100644 index 0000000..2fc7f0a --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/lsp/reset.vim @@ -0,0 +1,25 @@ +" Stop all LSPs and remove all of the data for them. +function! ale#lsp#reset#StopAllLSPs() abort + call ale#lsp#StopAll() + + if exists('*ale#definition#ClearLSPData') + " Clear the mapping for connections, etc. + call ale#definition#ClearLSPData() + endif + + if exists('*ale#lsp_linter#ClearLSPData') + " Clear the mapping for connections, etc. + call ale#lsp_linter#ClearLSPData() + + " Remove the problems for all of the LSP linters in every buffer. + for l:buffer_string in keys(g:ale_buffer_info) + let l:buffer = str2nr(l:buffer_string) + + for l:linter in ale#linter#Get(getbufvar(l:buffer, '&filetype')) + if !empty(l:linter.lsp) + call ale#engine#HandleLoclist(l:linter.name, l:buffer, [], 0) + endif + endfor + endfor + endif +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/lsp/response.vim b/dot_vim/plugged/ale/autoload/ale/lsp/response.vim new file mode 100644 index 0000000..498ec50 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/lsp/response.vim @@ -0,0 +1,152 @@ +" Author: w0rp +" Description: Parsing and transforming of LSP server responses. + +" Constants for error codes. +" Defined by JSON RPC +let s:PARSE_ERROR = -32700 +let s:INVALID_REQUEST = -32600 +let s:METHOD_NOT_FOUND = -32601 +let s:INVALID_PARAMS = -32602 +let s:INTERNAL_ERROR = -32603 +let s:SERVER_ERROR_START = -32099 +let s:SERVER_ERROR_END = -32000 +let s:SERVER_NOT_INITIALIZED = -32002 +let s:UNKNOWN_ERROR_CODE = -32001 +" Defined by the protocol. +let s:REQUEST_CANCELLED = -32800 + +" Constants for message severity codes. +let s:SEVERITY_ERROR = 1 +let s:SEVERITY_WARNING = 2 +let s:SEVERITY_INFORMATION = 3 +let s:SEVERITY_HINT = 4 + +" Parse the message for textDocument/publishDiagnostics +function! ale#lsp#response#ReadDiagnostics(response) abort + let l:loclist = [] + + for l:diagnostic in a:response.params.diagnostics + let l:severity = get(l:diagnostic, 'severity', 0) + let l:loclist_item = { + \ 'text': substitute(l:diagnostic.message, '\(\r\n\|\n\|\r\)', ' ', 'g'), + \ 'type': 'E', + \ 'lnum': l:diagnostic.range.start.line + 1, + \ 'col': l:diagnostic.range.start.character + 1, + \ 'end_lnum': l:diagnostic.range.end.line + 1, + \ 'end_col': l:diagnostic.range.end.character, + \} + + if l:severity == s:SEVERITY_WARNING + let l:loclist_item.type = 'W' + elseif l:severity == s:SEVERITY_INFORMATION + " TODO: Use 'I' here in future. + let l:loclist_item.type = 'W' + elseif l:severity == s:SEVERITY_HINT + " TODO: Use 'H' here in future + let l:loclist_item.type = 'W' + endif + + if has_key(l:diagnostic, 'code') + if type(l:diagnostic.code) == v:t_string + let l:loclist_item.code = l:diagnostic.code + elseif type(l:diagnostic.code) == v:t_number && l:diagnostic.code != -1 + let l:loclist_item.code = string(l:diagnostic.code) + let l:loclist_item.nr = l:diagnostic.code + endif + endif + + if has_key(l:diagnostic, 'relatedInformation') + \ && l:diagnostic.relatedInformation isnot v:null + let l:related = deepcopy(l:diagnostic.relatedInformation) + call map(l:related, {key, val -> + \ ale#util#ToResource(val.location.uri) . + \ ':' . (val.location.range.start.line + 1) . + \ ':' . (val.location.range.start.character + 1) . + \ ":\n\t" . val.message + \}) + let l:loclist_item.detail = l:diagnostic.message . "\n" . join(l:related, "\n") + endif + + if has_key(l:diagnostic, 'source') + let l:loclist_item.detail = printf( + \ '[%s] %s', + \ l:diagnostic.source, + \ l:diagnostic.message + \) + endif + + call add(l:loclist, l:loclist_item) + endfor + + return l:loclist +endfunction + +function! ale#lsp#response#ReadTSServerDiagnostics(response) abort + let l:loclist = [] + + for l:diagnostic in a:response.body.diagnostics + let l:loclist_item = { + \ 'text': l:diagnostic.text, + \ 'type': 'E', + \ 'lnum': l:diagnostic.start.line, + \ 'col': l:diagnostic.start.offset, + \ 'end_lnum': l:diagnostic.end.line, + \ 'end_col': l:diagnostic.end.offset - 1, + \} + + if has_key(l:diagnostic, 'code') + if type(l:diagnostic.code) == v:t_string + let l:loclist_item.code = l:diagnostic.code + elseif type(l:diagnostic.code) == v:t_number && l:diagnostic.code != -1 + let l:loclist_item.code = string(l:diagnostic.code) + let l:loclist_item.nr = l:diagnostic.code + endif + endif + + if get(l:diagnostic, 'category') is# 'warning' + let l:loclist_item.type = 'W' + endif + + if get(l:diagnostic, 'category') is# 'suggestion' + let l:loclist_item.type = 'I' + endif + + call add(l:loclist, l:loclist_item) + endfor + + return l:loclist +endfunction + +function! ale#lsp#response#GetErrorMessage(response) abort + if type(get(a:response, 'error', 0)) isnot v:t_dict + return '' + endif + + let l:code = get(a:response.error, 'code') + + " Only report things for these error codes. + if l:code isnot s:INVALID_PARAMS && l:code isnot s:INTERNAL_ERROR + return '' + endif + + let l:message = get(a:response.error, 'message', '') + + if empty(l:message) + return '' + endif + + " Include the traceback or error data as details, if present. + let l:error_data = get(a:response.error, 'data', {}) + + if type(l:error_data) is v:t_string + let l:message .= "\n" . l:error_data + elseif type(l:error_data) is v:t_dict + let l:traceback = get(l:error_data, 'traceback', []) + + if type(l:traceback) is v:t_list && !empty(l:traceback) + let l:message .= "\n" . join(l:traceback, "\n") + endif + endif + + return l:message +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/lsp/tsserver_message.vim b/dot_vim/plugged/ale/autoload/ale/lsp/tsserver_message.vim new file mode 100644 index 0000000..02e5789 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/lsp/tsserver_message.vim @@ -0,0 +1,165 @@ +" Author: w0rp +" Description: tsserver message implementations +" +" Messages in this movie will be returned in the format +" [is_notification, command_name, params?] +" +" Every command must begin with the string 'ts@', which will be used to +" detect the different message format for tsserver, and this string will +" be removed from the actual command name, + +function! ale#lsp#tsserver_message#Open(buffer) abort + return [1, 'ts@open', {'file': expand('#' . a:buffer . ':p')}] +endfunction + +function! ale#lsp#tsserver_message#Close(buffer) abort + return [1, 'ts@close', {'file': expand('#' . a:buffer . ':p')}] +endfunction + +function! ale#lsp#tsserver_message#Change(buffer) abort + let l:lines = getbufline(a:buffer, 1, '$') + + " We will always use a very high endLine number, so we can delete + " lines from files. tsserver will gladly accept line numbers beyond the + " end. + return [1, 'ts@change', { + \ 'file': expand('#' . a:buffer . ':p'), + \ 'line': 1, + \ 'offset': 1, + \ 'endLine': 1073741824, + \ 'endOffset': 1, + \ 'insertString': join(l:lines, "\n") . "\n", + \}] +endfunction + +function! ale#lsp#tsserver_message#Geterr(buffer) abort + return [1, 'ts@geterr', {'files': [expand('#' . a:buffer . ':p')]}] +endfunction + +function! ale#lsp#tsserver_message#Completions( +\ buffer, line, column, prefix, include_external) abort + return [0, 'ts@completions', { + \ 'line': a:line, + \ 'offset': a:column, + \ 'file': expand('#' . a:buffer . ':p'), + \ 'prefix': a:prefix, + \ 'includeExternalModuleExports': a:include_external, + \}] +endfunction + +function! ale#lsp#tsserver_message#CompletionEntryDetails(buffer, line, column, entry_names) abort + return [0, 'ts@completionEntryDetails', { + \ 'line': a:line, + \ 'offset': a:column, + \ 'file': expand('#' . a:buffer . ':p'), + \ 'entryNames': a:entry_names, + \}] +endfunction + +function! ale#lsp#tsserver_message#Definition(buffer, line, column) abort + return [0, 'ts@definition', { + \ 'line': a:line, + \ 'offset': a:column, + \ 'file': expand('#' . a:buffer . ':p'), + \}] +endfunction + +function! ale#lsp#tsserver_message#TypeDefinition(buffer, line, column) abort + return [0, 'ts@typeDefinition', { + \ 'line': a:line, + \ 'offset': a:column, + \ 'file': expand('#' . a:buffer . ':p'), + \}] +endfunction + +function! ale#lsp#tsserver_message#Implementation(buffer, line, column) abort + return [0, 'ts@implementation', { + \ 'line': a:line, + \ 'offset': a:column, + \ 'file': expand('#' . a:buffer . ':p'), + \}] +endfunction + +function! ale#lsp#tsserver_message#References(buffer, line, column) abort + return [0, 'ts@references', { + \ 'line': a:line, + \ 'offset': a:column, + \ 'file': expand('#' . a:buffer . ':p'), + \}] +endfunction + +function! ale#lsp#tsserver_message#Quickinfo(buffer, line, column) abort + return [0, 'ts@quickinfo', { + \ 'line': a:line, + \ 'offset': a:column, + \ 'file': expand('#' . a:buffer . ':p'), + \}] +endfunction + +function! ale#lsp#tsserver_message#Rename( +\ buffer, line, column, find_in_comments, find_in_strings) abort + return [0, 'ts@rename', { + \ 'line': a:line, + \ 'offset': a:column, + \ 'file': expand('#' . a:buffer . ':p'), + \ 'arguments': { + \ 'findInComments': a:find_in_comments, + \ 'findInStrings': a:find_in_strings, + \ } + \}] +endfunction + +function! ale#lsp#tsserver_message#GetEditsForFileRename( +\ oldFilePath, newFilePath) abort + return [0, 'ts@getEditsForFileRename', { + \ 'oldFilePath': a:oldFilePath, + \ 'newFilePath': a:newFilePath, + \}] +endfunction + +function! ale#lsp#tsserver_message#OrganizeImports(buffer) abort + return [0, 'ts@organizeImports', { + \ 'scope': { + \ 'type': 'file', + \ 'args': { + \ 'file': expand('#' . a:buffer . ':p'), + \ }, + \ }, + \}] +endfunction + +function! ale#lsp#tsserver_message#GetCodeFixes(buffer, line, column, end_line, end_column, error_codes) abort + " The lines and columns are 1-based. + " The errors codes must be a list of tsserver error codes to fix. + return [0, 'ts@getCodeFixes', { + \ 'startLine': a:line, + \ 'startOffset': a:column, + \ 'endLine': a:end_line, + \ 'endOffset': a:end_column + 1, + \ 'file': expand('#' . a:buffer . ':p'), + \ 'errorCodes': a:error_codes, + \}] +endfunction + +function! ale#lsp#tsserver_message#GetApplicableRefactors(buffer, line, column, end_line, end_column) abort + " The arguments for this request can also be just 'line' and 'offset' + return [0, 'ts@getApplicableRefactors', { + \ 'startLine': a:line, + \ 'startOffset': a:column, + \ 'endLine': a:end_line, + \ 'endOffset': a:end_column + 1, + \ 'file': expand('#' . a:buffer . ':p'), + \}] +endfunction + +function! ale#lsp#tsserver_message#GetEditsForRefactor(buffer, line, column, end_line, end_column, refactor, action) abort + return [0, 'ts@getEditsForRefactor', { + \ 'startLine': a:line, + \ 'startOffset': a:column, + \ 'endLine': a:end_line, + \ 'endOffset': a:end_column + 1, + \ 'file': expand('#' . a:buffer . ':p'), + \ 'refactor': a:refactor, + \ 'action': a:action, + \}] +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/lsp_linter.vim b/dot_vim/plugged/ale/autoload/ale/lsp_linter.vim new file mode 100644 index 0000000..1c98d62 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/lsp_linter.vim @@ -0,0 +1,547 @@ +" Author: w0rp +" Description: Integration between linters and LSP/tsserver. + +" This code isn't loaded if a user never users LSP features or linters. + +" Associates LSP connection IDs with linter names. +if !has_key(s:, 'lsp_linter_map') + let s:lsp_linter_map = {} +endif + +" A Dictionary to track one-shot handlers for custom LSP requests +let s:custom_handlers_map = get(s:, 'custom_handlers_map', {}) + +" Clear LSP linter data for the linting engine. +function! ale#lsp_linter#ClearLSPData() abort + let s:lsp_linter_map = {} + let s:custom_handlers_map = {} +endfunction + +" Only for internal use. +function! ale#lsp_linter#GetLSPLinterMap() abort + return s:lsp_linter_map +endfunction + +" Just for tests. +function! ale#lsp_linter#SetLSPLinterMap(replacement_map) abort + let s:lsp_linter_map = a:replacement_map +endfunction + +" Check if diagnostics for a particular linter should be ignored. +function! s:ShouldIgnore(buffer, linter_name) abort + " Ignore all diagnostics if LSP integration is disabled. + if ale#Var(a:buffer, 'disable_lsp') + return 1 + endif + + let l:config = ale#Var(a:buffer, 'linters_ignore') + + " Don't load code for ignoring diagnostics if there's nothing to ignore. + if empty(l:config) + return 0 + endif + + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:ignore_list = ale#engine#ignore#GetList(l:filetype, l:config) + + return index(l:ignore_list, a:linter_name) >= 0 +endfunction + +function! s:HandleLSPDiagnostics(conn_id, response) abort + let l:linter_name = s:lsp_linter_map[a:conn_id] + let l:filename = ale#util#ToResource(a:response.params.uri) + let l:escaped_name = escape( + \ fnameescape(l:filename), + \ has('win32') ? '^' : '^,}]' + \) + let l:buffer = bufnr('^' . l:escaped_name . '$') + let l:info = get(g:ale_buffer_info, l:buffer, {}) + + if empty(l:info) + return + endif + + if s:ShouldIgnore(l:buffer, l:linter_name) + return + endif + + let l:loclist = ale#lsp#response#ReadDiagnostics(a:response) + + call ale#engine#HandleLoclist(l:linter_name, l:buffer, l:loclist, 0) +endfunction + +function! s:HandleTSServerDiagnostics(response, error_type) abort + let l:linter_name = 'tsserver' + let l:escaped_name = escape( + \ fnameescape(a:response.body.file), + \ has('win32') ? '^' : '^,}]' + \) + let l:buffer = bufnr('^' . l:escaped_name . '$') + let l:info = get(g:ale_buffer_info, l:buffer, {}) + + if empty(l:info) + return + endif + + call ale#engine#MarkLinterInactive(l:info, l:linter_name) + + if s:ShouldIgnore(l:buffer, l:linter_name) + return + endif + + let l:thislist = ale#lsp#response#ReadTSServerDiagnostics(a:response) + let l:no_changes = 0 + + " tsserver sends syntax and semantic errors in separate messages, so we + " have to collect the messages separately for each buffer and join them + " back together again. + if a:error_type is# 'syntax' + if len(l:thislist) is 0 && len(get(l:info, 'syntax_loclist', [])) is 0 + let l:no_changes = 1 + endif + + let l:info.syntax_loclist = l:thislist + elseif a:error_type is# 'semantic' + if len(l:thislist) is 0 && len(get(l:info, 'semantic_loclist', [])) is 0 + let l:no_changes = 1 + endif + + let l:info.semantic_loclist = l:thislist + else + if len(l:thislist) is 0 && len(get(l:info, 'suggestion_loclist', [])) is 0 + let l:no_changes = 1 + endif + + let l:info.suggestion_loclist = l:thislist + endif + + if l:no_changes + return + endif + + let l:loclist = get(l:info, 'semantic_loclist', []) + \ + get(l:info, 'suggestion_loclist', []) + \ + get(l:info, 'syntax_loclist', []) + + call ale#engine#HandleLoclist(l:linter_name, l:buffer, l:loclist, 0) +endfunction + +function! s:HandleLSPErrorMessage(linter_name, response) abort + if !g:ale_history_enabled || !g:ale_history_log_output + return + endif + + if empty(a:linter_name) + return + endif + + let l:message = ale#lsp#response#GetErrorMessage(a:response) + + if empty(l:message) + return + endif + + call ale#lsp_linter#AddErrorMessage(a:linter_name, l:message) +endfunction + +function! ale#lsp_linter#AddErrorMessage(linter_name, message) abort + " This global variable is set here so we don't load the debugging.vim file + " until someone uses :ALEInfo. + let g:ale_lsp_error_messages = get(g:, 'ale_lsp_error_messages', {}) + + if !has_key(g:ale_lsp_error_messages, a:linter_name) + let g:ale_lsp_error_messages[a:linter_name] = [] + endif + + call add(g:ale_lsp_error_messages[a:linter_name], a:message) +endfunction + +function! ale#lsp_linter#HandleLSPResponse(conn_id, response) abort + let l:method = get(a:response, 'method', '') + + if get(a:response, 'jsonrpc', '') is# '2.0' && has_key(a:response, 'error') + let l:linter_name = get(s:lsp_linter_map, a:conn_id, '') + + call s:HandleLSPErrorMessage(l:linter_name, a:response) + elseif l:method is# 'textDocument/publishDiagnostics' + call s:HandleLSPDiagnostics(a:conn_id, a:response) + elseif l:method is# 'window/showMessage' + call ale#lsp_window#HandleShowMessage( + \ s:lsp_linter_map[a:conn_id], + \ g:ale_lsp_show_message_format, + \ a:response.params + \) + elseif get(a:response, 'type', '') is# 'event' + \&& get(a:response, 'event', '') is# 'semanticDiag' + call s:HandleTSServerDiagnostics(a:response, 'semantic') + elseif get(a:response, 'type', '') is# 'event' + \&& get(a:response, 'event', '') is# 'syntaxDiag' + call s:HandleTSServerDiagnostics(a:response, 'syntax') + elseif get(a:response, 'type', '') is# 'event' + \&& get(a:response, 'event', '') is# 'suggestionDiag' + \&& get(g:, 'ale_lsp_suggestions', '1') == 1 + call s:HandleTSServerDiagnostics(a:response, 'suggestion') + endif +endfunction + +function! ale#lsp_linter#GetOptions(buffer, linter) abort + if has_key(a:linter, 'initialization_options_callback') + return ale#util#GetFunction(a:linter.initialization_options_callback)(a:buffer) + endif + + if has_key(a:linter, 'initialization_options') + let l:Options = a:linter.initialization_options + + if type(l:Options) is v:t_func + let l:Options = l:Options(a:buffer) + endif + + return l:Options + endif + + return {} +endfunction + +function! ale#lsp_linter#GetConfig(buffer, linter) abort + if has_key(a:linter, 'lsp_config_callback') + return ale#util#GetFunction(a:linter.lsp_config_callback)(a:buffer) + endif + + if has_key(a:linter, 'lsp_config') + let l:Config = a:linter.lsp_config + + if type(l:Config) is v:t_func + let l:Config = l:Config(a:buffer) + endif + + return l:Config + endif + + return {} +endfunction + +function! ale#lsp_linter#FindProjectRoot(buffer, linter) abort + let l:buffer_ale_root = getbufvar( + \ a:buffer, + \ 'ale_root', + \ getbufvar(a:buffer, 'ale_lsp_root', {}) + \) + + if type(l:buffer_ale_root) is v:t_string + return l:buffer_ale_root + endif + + " Try to get a buffer-local setting for the root + if has_key(l:buffer_ale_root, a:linter.name) + let l:Root = l:buffer_ale_root[a:linter.name] + + if type(l:Root) is v:t_func + return l:Root(a:buffer) + else + return l:Root + endif + endif + + let l:global_root = g:ale_root + + if empty(g:ale_root) && exists('g:ale_lsp_root') + let l:global_root = g:ale_lsp_root + endif + + " Try to get a global setting for the root + if has_key(l:global_root, a:linter.name) + let l:Root = l:global_root[a:linter.name] + + if type(l:Root) is v:t_func + return l:Root(a:buffer) + else + return l:Root + endif + endif + + " Fall back to the linter-specific configuration + if has_key(a:linter, 'project_root') + let l:Root = a:linter.project_root + + return type(l:Root) is v:t_func ? l:Root(a:buffer) : l:Root + endif + + return ale#util#GetFunction(a:linter.project_root_callback)(a:buffer) +endfunction + +" This function is accessible so tests can call it. +function! ale#lsp_linter#OnInit(linter, details, Callback) abort + let l:buffer = a:details.buffer + let l:conn_id = a:details.connection_id + let l:command = a:details.command + + let l:config = ale#lsp_linter#GetConfig(l:buffer, a:linter) + let l:language_id = ale#linter#GetLanguage(l:buffer, a:linter) + + call ale#lsp#UpdateConfig(l:conn_id, l:buffer, l:config) + + if ale#lsp#OpenDocument(l:conn_id, l:buffer, l:language_id) + if g:ale_history_enabled && !empty(l:command) + call ale#history#Add(l:buffer, 'started', l:conn_id, l:command) + endif + endif + + " The change message needs to be sent for tsserver before doing anything. + if a:linter.lsp is# 'tsserver' + call ale#lsp#NotifyForChanges(l:conn_id, l:buffer) + endif + + " Tell the relevant buffer that the LSP has started via an autocmd. + if l:buffer > 0 + if l:buffer == bufnr('') + silent doautocmd User ALELSPStarted + else + execute 'augroup ALELSPStartedGroup' . l:buffer + autocmd! + + execute printf( + \ 'autocmd BufEnter ' + \ . ' doautocmd User ALELSPStarted', + \ l:buffer + \) + + " Replicate ++once behavior for backwards compatibility. + execute printf( + \ 'autocmd BufEnter ' + \ . ' autocmd! ALELSPStartedGroup%d', + \ l:buffer, l:buffer + \) + augroup END + endif + endif + + call a:Callback(a:linter, a:details) +endfunction + +function! s:StartLSP(options, address, executable, command) abort + let l:buffer = a:options.buffer + let l:linter = a:options.linter + let l:root = a:options.root + let l:Callback = a:options.callback + + let l:init_options = ale#lsp_linter#GetOptions(l:buffer, l:linter) + + if l:linter.lsp is# 'socket' + let l:conn_id = ale#lsp#Register(a:address, l:root, l:init_options) + let l:ready = ale#lsp#ConnectToAddress(l:conn_id, a:address) + let l:command = '' + else + let l:conn_id = ale#lsp#Register(a:executable, l:root, l:init_options) + + " tsserver behaves differently, so tell the LSP API that it is tsserver. + if l:linter.lsp is# 'tsserver' + call ale#lsp#MarkConnectionAsTsserver(l:conn_id) + endif + + let l:cwd = ale#linter#GetCwd(l:buffer, l:linter) + let l:command = ale#command#FormatCommand( + \ l:buffer, + \ a:executable, + \ a:command, + \ 0, + \ v:false, + \ l:cwd, + \ ale#GetFilenameMappings(l:buffer, l:linter.name), + \)[1] + let l:command = ale#job#PrepareCommand(l:buffer, l:command) + let l:ready = ale#lsp#StartProgram(l:conn_id, a:executable, l:command) + endif + + if !l:ready + if g:ale_history_enabled && !empty(a:command) + call ale#history#Add(l:buffer, 'failed', l:conn_id, a:command) + endif + + return 0 + endif + + let l:details = { + \ 'buffer': l:buffer, + \ 'connection_id': l:conn_id, + \ 'command': l:command, + \ 'project_root': l:root, + \} + + call ale#lsp#OnInit(l:conn_id, {-> + \ ale#lsp_linter#OnInit(l:linter, l:details, l:Callback) + \}) + + return 1 +endfunction + +function! s:StartWithAddress(options, address) abort + if ale#command#IsDeferred(a:address) + let a:address.result_callback = { + \ address -> s:StartWithAddress(a:options, address) + \} + + return 1 + endif + + if empty(a:address) + return 0 + endif + + return s:StartLSP(a:options, a:address, '', '') +endfunction + +function! s:StartWithCommand(options, executable, command) abort + if ale#command#IsDeferred(a:command) + let a:command.result_callback = { + \ command -> s:StartWithCommand(a:options, a:executable, command) + \} + + return 1 + endif + + if empty(a:command) + return 0 + endif + + return s:StartLSP(a:options, '', a:executable, a:command) +endfunction + +function! s:StartIfExecutable(options, executable) abort + if ale#command#IsDeferred(a:executable) + let a:executable.result_callback = { + \ executable -> s:StartIfExecutable(a:options, executable) + \} + + return 1 + endif + + if !ale#engine#IsExecutable(a:options.buffer, a:executable) + return 0 + endif + + let l:command = ale#linter#GetCommand(a:options.buffer, a:options.linter) + + return s:StartWithCommand(a:options, a:executable, l:command) +endfunction + +" Given a buffer, an LSP linter, start up an LSP linter and get ready to +" receive messages for the document. +function! ale#lsp_linter#StartLSP(buffer, linter, Callback) abort + let l:command = '' + let l:address = '' + let l:root = ale#lsp_linter#FindProjectRoot(a:buffer, a:linter) + + if empty(l:root) && a:linter.lsp isnot# 'tsserver' + " If there's no project root, then we can't check files with LSP, + " unless we are using tsserver, which doesn't use project roots. + call ale#lsp_linter#AddErrorMessage(a:linter.name, "Failed to find project root, language server won't start.") + + return 0 + endif + + let l:options = { + \ 'buffer': a:buffer, + \ 'linter': a:linter, + \ 'callback': a:Callback, + \ 'root': l:root, + \} + + if a:linter.lsp is# 'socket' + let l:address = ale#linter#GetAddress(a:buffer, a:linter) + + return s:StartWithAddress(l:options, l:address) + endif + + let l:executable = ale#linter#GetExecutable(a:buffer, a:linter) + + return s:StartIfExecutable(l:options, l:executable) +endfunction + +function! s:CheckWithLSP(linter, details) abort + let l:buffer = a:details.buffer + let l:info = get(g:ale_buffer_info, l:buffer) + + if empty(l:info) + return + endif + + let l:id = a:details.connection_id + + " Register a callback now for handling errors now. + let l:Callback = function('ale#lsp_linter#HandleLSPResponse') + call ale#lsp#RegisterCallback(l:id, l:Callback) + + " Remember the linter this connection is for. + let s:lsp_linter_map[l:id] = a:linter.name + + if a:linter.lsp is# 'tsserver' + let l:message = ale#lsp#tsserver_message#Geterr(l:buffer) + let l:notified = ale#lsp#Send(l:id, l:message) != 0 + + if l:notified + call ale#engine#MarkLinterActive(l:info, a:linter) + endif + else + let l:notified = ale#lsp#NotifyForChanges(l:id, l:buffer) + endif + + " If this was a file save event, also notify the server of that. + if a:linter.lsp isnot# 'tsserver' + \&& getbufvar(l:buffer, 'ale_save_event_fired', 0) + \&& ale#lsp#HasCapability(l:id, 'did_save') + let l:include_text = ale#lsp#HasCapability(l:id, 'includeText') + let l:save_message = ale#lsp#message#DidSave(l:buffer, l:include_text) + let l:notified = ale#lsp#Send(l:id, l:save_message) != 0 + endif +endfunction + +function! ale#lsp_linter#CheckWithLSP(buffer, linter) abort + return ale#lsp_linter#StartLSP(a:buffer, a:linter, function('s:CheckWithLSP')) +endfunction + +function! s:HandleLSPResponseToCustomRequests(conn_id, response) abort + if has_key(a:response, 'id') + \&& has_key(s:custom_handlers_map, a:response.id) + let l:Handler = remove(s:custom_handlers_map, a:response.id) + call l:Handler(a:response) + endif +endfunction + +function! s:OnReadyForCustomRequests(args, linter, lsp_details) abort + let l:id = a:lsp_details.connection_id + let l:request_id = ale#lsp#Send(l:id, a:args.message) + + if l:request_id > 0 && has_key(a:args, 'handler') + let l:Callback = function('s:HandleLSPResponseToCustomRequests') + call ale#lsp#RegisterCallback(l:id, l:Callback) + let s:custom_handlers_map[l:request_id] = a:args.handler + endif +endfunction + +" Send a custom request to an LSP linter. +function! ale#lsp_linter#SendRequest(buffer, linter_name, message, ...) abort + let l:filetype = ale#linter#ResolveFiletype(getbufvar(a:buffer, '&filetype')) + let l:linter_list = ale#linter#GetAll(l:filetype) + let l:linter_list = filter(l:linter_list, {_, v -> v.name is# a:linter_name}) + + if len(l:linter_list) < 1 + throw 'Linter "' . a:linter_name . '" not found!' + endif + + let l:linter = l:linter_list[0] + + if empty(l:linter.lsp) + throw 'Linter "' . a:linter_name . '" does not support LSP!' + endif + + let l:is_notification = a:message[0] + let l:callback_args = {'message': a:message} + + if !l:is_notification && a:0 + let l:callback_args.handler = a:1 + endif + + let l:Callback = function('s:OnReadyForCustomRequests', [l:callback_args]) + + return ale#lsp_linter#StartLSP(a:buffer, l:linter, l:Callback) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/lsp_window.vim b/dot_vim/plugged/ale/autoload/ale/lsp_window.vim new file mode 100644 index 0000000..9a27f2f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/lsp_window.vim @@ -0,0 +1,58 @@ +" Author: suoto +" Description: Handling of window/* LSP methods, although right now only +" handles window/showMessage + +" Constants for message type codes +let s:LSP_MESSAGE_TYPE_DISABLED = 0 +let s:LSP_MESSAGE_TYPE_ERROR = 1 +let s:LSP_MESSAGE_TYPE_WARNING = 2 +let s:LSP_MESSAGE_TYPE_INFORMATION = 3 +let s:LSP_MESSAGE_TYPE_LOG = 4 + +" Translate strings from the user config to a number so we can check +" severities +let s:CFG_TO_LSP_SEVERITY = { +\ 'disabled': s:LSP_MESSAGE_TYPE_DISABLED, +\ 'error': s:LSP_MESSAGE_TYPE_ERROR, +\ 'warning': s:LSP_MESSAGE_TYPE_WARNING, +\ 'information': s:LSP_MESSAGE_TYPE_INFORMATION, +\ 'info': s:LSP_MESSAGE_TYPE_INFORMATION, +\ 'log': s:LSP_MESSAGE_TYPE_LOG +\} + +" Handle window/showMessage response. +" - details: dict containing linter name and format (g:ale_lsp_show_message_format) +" - params: dict with the params for the call in the form of {type: number, message: string} +function! ale#lsp_window#HandleShowMessage(linter_name, format, params) abort + let l:message = a:params.message + let l:type = a:params.type + + " Get the configured severity level threshold and check if the message + " should be displayed or not + let l:configured_severity = tolower(get(g:, 'ale_lsp_show_message_severity', 'error')) + " If the user has configured with a value we can't find on the conversion + " dict, fall back to warning + let l:cfg_severity_threshold = get(s:CFG_TO_LSP_SEVERITY, l:configured_severity, s:LSP_MESSAGE_TYPE_WARNING) + + if l:type > l:cfg_severity_threshold + return + endif + + " Severity will depend on the message type + if l:type is# s:LSP_MESSAGE_TYPE_ERROR + let l:severity = g:ale_echo_msg_error_str + elseif l:type is# s:LSP_MESSAGE_TYPE_INFORMATION + let l:severity = g:ale_echo_msg_info_str + elseif l:type is# s:LSP_MESSAGE_TYPE_LOG + let l:severity = g:ale_echo_msg_log_str + else + " Default to warning just in case + let l:severity = g:ale_echo_msg_warning_str + endif + + let l:string = substitute(a:format, '\V%severity%', l:severity, 'g') + let l:string = substitute(l:string, '\V%linter%', a:linter_name, 'g') + let l:string = substitute(l:string, '\V%s\>', l:message, 'g') + + call ale#util#ShowMessage(l:string) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/maven.vim b/dot_vim/plugged/ale/autoload/ale/maven.vim new file mode 100644 index 0000000..4f87ebb --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/maven.vim @@ -0,0 +1,57 @@ +" Description: Functions for working with Maven projects. +" +" Given a buffer number, find a Maven project root. +function! ale#maven#FindProjectRoot(buffer) abort + let l:wrapper_path = ale#path#FindNearestFile(a:buffer, 'mvnw') + + if !empty(l:wrapper_path) + return fnamemodify(l:wrapper_path, ':h') + endif + + let l:pom_path = ale#path#FindNearestFile(a:buffer, 'pom.xml') + + if !empty(l:pom_path) + return fnamemodify(l:pom_path, ':h') + endif + + return '' +endfunction + +" Given a buffer number, find the path to the executable. +" First search on the path for 'mvnw' (mvnw.cmd on Windows), if nothing is found, +" try the global command. Returns an empty string if cannot find the executable. +function! ale#maven#FindExecutable(buffer) abort + let l:wrapper_cmd = has('unix') ? 'mvnw' : 'mvnw.cmd' + let l:wrapper_path = ale#path#FindNearestFile(a:buffer, l:wrapper_cmd) + + if !empty(l:wrapper_path) && executable(l:wrapper_path) + return l:wrapper_path + endif + + if executable('mvn') + return 'mvn' + endif + + return '' +endfunction + +" Given a buffer number, get a working directory and command to print the +" classpath of the root project. +" +" Returns an empty string for the command if Maven is not detected. +function! ale#maven#BuildClasspathCommand(buffer) abort + let l:executable = ale#maven#FindExecutable(a:buffer) + + if !empty(l:executable) + let l:project_root = ale#maven#FindProjectRoot(a:buffer) + + if !empty(l:project_root) + return [ + \ l:project_root, + \ ale#Escape(l:executable) . ' dependency:build-classpath' + \] + endif + endif + + return ['', ''] +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/node.vim b/dot_vim/plugged/ale/autoload/ale/node.vim new file mode 100644 index 0000000..9e11ca7 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/node.vim @@ -0,0 +1,22 @@ +" Author: w0rp +" Description: Functions for working with Node executables. + +call ale#Set('windows_node_executable_path', 'node.exe') + +" Create a executable string which executes a Node.js script command with a +" Node.js executable if needed. +" +" The executable string should not be escaped before passing it to this +" function, the executable string will be escaped when returned by this +" function. +" +" The executable is only prefixed for Windows machines +function! ale#node#Executable(buffer, executable) abort + if has('win32') && a:executable =~? '\.js$' + let l:node = ale#Var(a:buffer, 'windows_node_executable_path') + + return ale#Escape(l:node) . ' ' . ale#Escape(a:executable) + endif + + return ale#Escape(a:executable) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/organize_imports.vim b/dot_vim/plugged/ale/autoload/ale/organize_imports.vim new file mode 100644 index 0000000..a6e7786 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/organize_imports.vim @@ -0,0 +1,65 @@ +" Author: Jerko Steiner +" Description: Organize imports support for tsserver + +function! ale#organize_imports#HandleTSServerResponse(conn_id, response) abort + if get(a:response, 'command', '') isnot# 'organizeImports' + return + endif + + if get(a:response, 'success', v:false) isnot v:true + return + endif + + let l:file_code_edits = a:response.body + + call ale#code_action#HandleCodeAction( + \ { + \ 'description': 'Organize Imports', + \ 'changes': l:file_code_edits, + \ }, + \ { + \ 'conn_id': a:conn_id, + \ 'should_save': !&hidden, + \ }, + \) +endfunction + +function! s:OnReady(linter, lsp_details) abort + let l:id = a:lsp_details.connection_id + + if a:linter.lsp isnot# 'tsserver' + call ale#util#Execute('echom ''OrganizeImports currently only works with tsserver''') + + return + endif + + let l:buffer = a:lsp_details.buffer + + let l:Callback = function('ale#organize_imports#HandleTSServerResponse') + + call ale#lsp#RegisterCallback(l:id, l:Callback) + + let l:message = ale#lsp#tsserver_message#OrganizeImports(l:buffer) + + let l:request_id = ale#lsp#Send(l:id, l:message) +endfunction + +function! s:OrganizeImports(linter) abort + let l:buffer = bufnr('') + let [l:line, l:column] = getpos('.')[1:2] + + if a:linter.lsp isnot# 'tsserver' + let l:column = min([l:column, len(getline(l:line))]) + endif + + let l:Callback = function('s:OnReady') + call ale#lsp_linter#StartLSP(l:buffer, a:linter, l:Callback) +endfunction + +function! ale#organize_imports#Execute() abort + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + call s:OrganizeImports(l:linter) + endif + endfor +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/other_source.vim b/dot_vim/plugged/ale/autoload/ale/other_source.vim new file mode 100644 index 0000000..1a09203 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/other_source.vim @@ -0,0 +1,21 @@ +" Tell ALE that another source has started checking a buffer. +function! ale#other_source#StartChecking(buffer, linter_name) abort + call ale#engine#InitBufferInfo(a:buffer) + let l:list = g:ale_buffer_info[a:buffer].active_other_sources_list + + call add(l:list, a:linter_name) + call uniq(sort(l:list)) +endfunction + +" Show some results, and stop checking a buffer. +" To clear results or cancel checking a buffer, an empty List can be given. +function! ale#other_source#ShowResults(buffer, linter_name, loclist) abort + call ale#engine#InitBufferInfo(a:buffer) + let l:info = g:ale_buffer_info[a:buffer] + + " Remove this linter name from the active list. + let l:list = l:info.active_other_sources_list + call filter(l:list, 'v:val isnot# a:linter_name') + + call ale#engine#HandleLoclist(a:linter_name, a:buffer, a:loclist, 1) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/path.vim b/dot_vim/plugged/ale/autoload/ale/path.vim new file mode 100644 index 0000000..cc5c665 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/path.vim @@ -0,0 +1,252 @@ +" Author: w0rp +" Description: Functions for working with paths in the filesystem. + +" simplify a path, and fix annoying issues with paths on Windows. +" +" Forward slashes are changed to back slashes so path equality works better +" on Windows. Back slashes are changed to forward slashes on Unix. +" +" Unix paths can technically contain back slashes, but in practice no path +" should, and replacing back slashes with forward slashes makes linters work +" in environments like MSYS. +" +" Paths starting with more than one forward slash are changed to only one +" forward slash, to prevent the paths being treated as special MSYS paths. +function! ale#path#Simplify(path) abort + if has('unix') + let l:unix_path = substitute(a:path, '\\', '/', 'g') + + return substitute(simplify(l:unix_path), '^//\+', '/', 'g') " no-custom-checks + endif + + let l:win_path = substitute(a:path, '/', '\\', 'g') + + return substitute(simplify(l:win_path), '^\\\+', '\', 'g') " no-custom-checks +endfunction + +" Simplify a path without a Windows drive letter. +" This function can be used for checking if paths are equal. +function! ale#path#RemoveDriveLetter(path) abort + return has('win32') && a:path[1:2] is# ':\' + \ ? ale#path#Simplify(a:path[2:]) + \ : ale#path#Simplify(a:path) +endfunction + +" Given a buffer and a filename, find the nearest file by searching upwards +" through the paths relative to the given buffer. +function! ale#path#FindNearestFile(buffer, filename) abort + let l:buffer_filename = fnamemodify(bufname(a:buffer), ':p') + let l:buffer_filename = fnameescape(l:buffer_filename) + + let l:relative_path = findfile(a:filename, l:buffer_filename . ';') + + if !empty(l:relative_path) + return fnamemodify(l:relative_path, ':p') + endif + + return '' +endfunction + +" Given a buffer and a directory name, find the nearest directory by searching upwards +" through the paths relative to the given buffer. +function! ale#path#FindNearestDirectory(buffer, directory_name) abort + let l:buffer_filename = fnamemodify(bufname(a:buffer), ':p') + let l:buffer_filename = fnameescape(l:buffer_filename) + + let l:relative_path = finddir(a:directory_name, l:buffer_filename . ';') + + if !empty(l:relative_path) + return fnamemodify(l:relative_path, ':p') + endif + + return '' +endfunction + +" Given a buffer, a string to search for, and a global fallback for when +" the search fails, look for a file in parent paths, and if that fails, +" use the global fallback path instead. +function! ale#path#ResolveLocalPath(buffer, search_string, global_fallback) abort + " Search for a locally installed file first. + let l:path = ale#path#FindNearestFile(a:buffer, a:search_string) + + " If the search fails, try the global executable instead. + if empty(l:path) + let l:path = a:global_fallback + endif + + return l:path +endfunction + +" Given a buffer number, a base variable name, and a list of paths to search +" for in ancestor directories, detect the executable path for a program. +function! ale#path#FindNearestExecutable(buffer, path_list) abort + for l:path in a:path_list + if ale#path#IsAbsolute(l:path) + let l:executable = filereadable(l:path) ? l:path : '' + else + let l:executable = ale#path#FindNearestFile(a:buffer, l:path) + endif + + if !empty(l:executable) + return l:executable + endif + endfor + + return '' +endfunction + +" Given a buffer number, a base variable name, and a list of paths to search +" for in ancestor directories, detect the executable path for a program. +" +" The use_global and executable options for the relevant program will be used. +function! ale#path#FindExecutable(buffer, base_var_name, path_list) abort + if ale#Var(a:buffer, a:base_var_name . '_use_global') + return ale#Var(a:buffer, a:base_var_name . '_executable') + endif + + let l:nearest = ale#path#FindNearestExecutable(a:buffer, a:path_list) + + if !empty(l:nearest) + return l:nearest + endif + + return ale#Var(a:buffer, a:base_var_name . '_executable') +endfunction + +" Return 1 if a path is an absolute path. +function! ale#path#IsAbsolute(filename) abort + if has('win32') && a:filename[:0] is# '\' + return 1 + endif + + " Check for /foo and C:\foo, etc. + return a:filename[:0] is# '/' || a:filename[1:2] is# ':\' +endfunction + +let s:temp_dir = ale#path#Simplify(fnamemodify(ale#util#Tempname(), ':h:h')) + +" Given a filename, return 1 if the file represents some temporary file +" created by Vim. +function! ale#path#IsTempName(filename) abort + return ale#path#Simplify(a:filename)[:len(s:temp_dir) - 1] is# s:temp_dir +endfunction + +" Given a base directory, which must not have a trailing slash, and a +" filename, which may have an absolute path a path relative to the base +" directory, return the absolute path to the file. +function! ale#path#GetAbsPath(base_directory, filename) abort + if ale#path#IsAbsolute(a:filename) + return ale#path#Simplify(a:filename) + endif + + let l:sep = has('win32') ? '\' : '/' + + return ale#path#Simplify(a:base_directory . l:sep . a:filename) +endfunction + +" Given a path, return the directory name for that path, with no trailing +" slashes. If the argument is empty(), return an empty string. +function! ale#path#Dirname(path) abort + if empty(a:path) + return '' + endif + + " For /foo/bar/ we need :h:h to get /foo + if a:path[-1:] is# '/' || (has('win32') && a:path[-1:] is# '\') + return fnamemodify(a:path, ':h:h') + endif + + return fnamemodify(a:path, ':h') +endfunction + +" Given a buffer number and a relative or absolute path, return 1 if the +" two paths represent the same file on disk. +function! ale#path#IsBufferPath(buffer, complex_filename) abort + " If the path is one of many different names for stdin, we have a match. + if a:complex_filename is# '-' + \|| a:complex_filename is# 'stdin' + \|| a:complex_filename[:0] is# '<' + return 1 + endif + + let l:test_filename = ale#path#Simplify(a:complex_filename) + + if l:test_filename[:1] is# './' + let l:test_filename = l:test_filename[2:] + endif + + if l:test_filename[:1] is# '..' + " Remove ../../ etc. from the front of the path. + let l:test_filename = substitute(l:test_filename, '\v^(\.\.[/\\])+', '/', '') + endif + + " Use the basename for temporary files, as they are likely our files. + if ale#path#IsTempName(l:test_filename) + let l:test_filename = fnamemodify(l:test_filename, ':t') + endif + + let l:buffer_filename = expand('#' . a:buffer . ':p') + + return l:buffer_filename is# l:test_filename + \ || l:buffer_filename[-len(l:test_filename):] is# l:test_filename +endfunction + +" Given a path, return every component of the path, moving upwards. +function! ale#path#Upwards(path) abort + let l:pattern = has('win32') ? '\v/+|\\+' : '\v/+' + let l:sep = has('win32') ? '\' : '/' + let l:parts = split(ale#path#Simplify(a:path), l:pattern) + let l:path_list = [] + + while !empty(l:parts) + call add(l:path_list, join(l:parts, l:sep)) + let l:parts = l:parts[:-2] + endwhile + + if has('win32') && a:path =~# '^[a-zA-z]:\' + " Add \ to C: for C:\, etc. + let l:path_list[-1] .= '\' + elseif a:path[0] is# '/' + " If the path starts with /, even on Windows, add / and / to all paths. + call map(l:path_list, '''/'' . v:val') + call add(l:path_list, '/') + endif + + return l:path_list +endfunction + +" Convert a filesystem path to a file:// URI +" relatives paths will not be prefixed with the protocol. +" For Windows paths, the `:` in C:\ etc. will not be percent-encoded. +function! ale#path#ToFileURI(path) abort + let l:has_drive_letter = a:path[1:2] is# ':\' + + return substitute( + \ ((l:has_drive_letter || a:path[:0] is# '/') ? 'file://' : '') + \ . (l:has_drive_letter ? '/' . a:path[:2] : '') + \ . ale#uri#Encode(l:has_drive_letter ? a:path[3:] : a:path), + \ '\\', + \ '/', + \ 'g', + \) +endfunction + +function! ale#path#FromFileURI(uri) abort + if a:uri[:6] is? 'file://' + let l:encoded_path = a:uri[7:] + elseif a:uri[:4] is? 'file:' + let l:encoded_path = a:uri[5:] + else + let l:encoded_path = a:uri + endif + + let l:path = ale#uri#Decode(l:encoded_path) + + " If the path is like /C:/foo/bar, it should be C:\foo\bar instead. + if has('win32') && l:path =~# '^/[a-zA-Z][:|]' + let l:path = substitute(l:path[1:], '/', '\\', 'g') + let l:path = l:path[0] . ':' . l:path[2:] + endif + + return l:path +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/pattern_options.vim b/dot_vim/plugged/ale/autoload/ale/pattern_options.vim new file mode 100644 index 0000000..14e2142 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/pattern_options.vim @@ -0,0 +1,47 @@ +" Author: w0rp +" Description: Set options in files based on regex patterns. + +" These variables are used to cache the sorting of patterns below. +let s:last_pattern_options = {} +let s:sorted_items = [] + +function! s:CmpPatterns(left_item, right_item) abort + if a:left_item[0] < a:right_item[0] + return -1 + endif + + if a:left_item[0] > a:right_item[0] + return 1 + endif + + return 0 +endfunction + +function! ale#pattern_options#SetOptions(buffer) abort + let l:pattern_options = get(g:, 'ale_pattern_options', {}) + + if empty(l:pattern_options) + " Stop if no options are set. + return + endif + + " The items will only be sorted whenever the patterns change. + if l:pattern_options != s:last_pattern_options + let s:last_pattern_options = deepcopy(l:pattern_options) + " The patterns are sorted, so they are applied consistently. + let s:sorted_items = sort( + \ items(l:pattern_options), + \ function('s:CmpPatterns') + \) + endif + + let l:filename = expand('#' . a:buffer . ':p') + + for [l:pattern, l:options] in s:sorted_items + if match(l:filename, l:pattern) >= 0 + for [l:key, l:value] in items(l:options) + call setbufvar(a:buffer, l:key, l:value) + endfor + endif + endfor +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/powershell.vim b/dot_vim/plugged/ale/autoload/ale/powershell.vim new file mode 100644 index 0000000..8c16320 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/powershell.vim @@ -0,0 +1,32 @@ +" Author: zigford +" Description: Functions for integrating with Powershell linters. + +" Write a powershell script to a temp file for execution +" return the command used to execute it +function! s:TemporaryPSScript(buffer, input) abort + let l:filename = 'script.ps1' + " Create a temp dir to house our temp .ps1 script + " a temp dir is needed as powershell needs the .ps1 + " extension + let l:tempdir = ale#util#Tempname() . (has('win32') ? '\' : '/') + let l:tempscript = l:tempdir . l:filename + " Create the temporary directory for the file, unreadable by 'other' + " users. + call mkdir(l:tempdir, '', 0750) + " Automatically delete the directory later. + call ale#command#ManageDirectory(a:buffer, l:tempdir) + " Write the script input out to a file. + call ale#util#Writefile(a:buffer, a:input, l:tempscript) + + return l:tempscript +endfunction + +function! ale#powershell#RunPowerShell(buffer, base_var_name, command) abort + let l:executable = ale#Var(a:buffer, a:base_var_name . '_executable') + let l:tempscript = s:TemporaryPSScript(a:buffer, a:command) + + return ale#Escape(l:executable) + \ . ' -Exe Bypass -NoProfile -File ' + \ . ale#Escape(l:tempscript) + \ . ' %t' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/preview.vim b/dot_vim/plugged/ale/autoload/ale/preview.vim new file mode 100644 index 0000000..1aca03e --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/preview.vim @@ -0,0 +1,137 @@ +" Author: w0rp +" Description: Preview windows for showing whatever information in. + +if !has_key(s:, 'last_list') + let s:last_list = [] +endif + +if !has_key(s:, 'last_options') + let s:last_options = {} +endif + +function! ale#preview#SetLastSelection(item_list, options) abort + let s:last_list = a:item_list + let s:last_options = { + \ 'open_in': get(a:options, 'open_in', 'current-buffer'), + \ 'use_relative_paths': get(a:options, 'use_relative_paths', 0), + \} +endfunction + +" Open a preview window and show some lines in it. +" A second argument can be passed as a Dictionary with options. They are... +" +" filetype - The filetype to use, defaulting to 'ale-preview' +" stay_here - If 1, stay in the window you came from. +function! ale#preview#Show(lines, ...) abort + let l:options = get(a:000, 0, {}) + + silent pedit ALEPreviewWindow + wincmd P + + setlocal modifiable + setlocal noreadonly + setlocal nobuflisted + setlocal buftype=nofile + setlocal bufhidden=wipe + :%d + call setline(1, a:lines) + setlocal nomodifiable + setlocal readonly + let &l:filetype = get(l:options, 'filetype', 'ale-preview') + + for l:command in get(l:options, 'commands', []) + call execute(l:command) + endfor + + if get(l:options, 'stay_here') + wincmd p + endif +endfunction + +" Close the preview window if the filetype matches the given one. +function! ale#preview#CloseIfTypeMatches(filetype) abort + for l:win in getwininfo() + let l:wintype = gettabwinvar(l:win.tabnr, l:win.winnr, '&filetype') + + if l:wintype is# a:filetype + silent! pclose! + endif + endfor +endfunction + +" Show a location selection preview window, given some items. +" Each item should have 'filename', 'line', and 'column' keys. +function! ale#preview#ShowSelection(item_list, ...) abort + let l:options = get(a:000, 0, {}) + let l:sep = has('win32') ? '\' : '/' + let l:lines = [] + + " Create lines to display to users. + for l:item in a:item_list + let l:match = get(l:item, 'match', '') + let l:filename = l:item.filename + + if get(l:options, 'use_relative_paths') + let l:cwd = getcwd() " no-custom-checks + let l:filename = substitute(l:filename, '^' . l:cwd . l:sep, '', '') + endif + + call add( + \ l:lines, + \ l:filename + \ . ':' . l:item.line + \ . ':' . l:item.column + \ . (!empty(l:match) ? ' ' . l:match : ''), + \) + endfor + + call ale#preview#Show(l:lines, {'filetype': 'ale-preview-selection'}) + let b:ale_preview_item_list = a:item_list + let b:ale_preview_item_open_in = get(l:options, 'open_in', 'current-buffer') + + " Jump to an index for a previous selection, if set. + if has_key(l:options, 'jump_to_index') + let l:pos = getpos('.') + let l:pos[1] = l:options.jump_to_index + 1 + call setpos('.', l:pos) + endif + + " Remember preview state, so we can repeat it later. + call ale#preview#SetLastSelection(a:item_list, l:options) +endfunction + +function! ale#preview#RepeatSelection() abort + if !empty(s:last_list) + call ale#preview#ShowSelection(s:last_list, s:last_options) + endif +endfunction + +function! s:Open(open_in) abort + let l:item_list = get(b:, 'ale_preview_item_list', []) + let l:index = getpos('.')[1] - 1 + let l:item = get(l:item_list, l:index, {}) + + if empty(l:item) + return + endif + + " Remember an index to jump to when repeating a selection. + let s:last_options.jump_to_index = l:index + + :q! + + call ale#util#Open( + \ l:item.filename, + \ l:item.line, + \ l:item.column, + \ {'open_in': a:open_in}, + \) +endfunction + +function! ale#preview#OpenSelection() abort + call s:Open(b:ale_preview_item_open_in) +endfunction + +function! ale#preview#OpenSelectionInTab() abort + call s:Open('tab') +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/python.vim b/dot_vim/plugged/ale/autoload/ale/python.vim new file mode 100644 index 0000000..7a99841 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/python.vim @@ -0,0 +1,170 @@ +" Author: w0rp +" Description: Functions for integrating with Python linters. + +call ale#Set('python_auto_pipenv', '0') +call ale#Set('python_auto_poetry', '0') + +let s:sep = has('win32') ? '\' : '/' +" bin is used for Unix virtualenv directories, and Scripts is for Windows. +let s:bin_dir = has('unix') ? 'bin' : 'Scripts' +let g:ale_virtualenv_dir_names = get(g:, 'ale_virtualenv_dir_names', [ +\ '.env', +\ '.venv', +\ 'env', +\ 've-py3', +\ 've', +\ 'virtualenv', +\ 'venv', +\]) + +function! ale#python#FindProjectRootIni(buffer) abort + for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + " If you change this, update ale-python-root documentation. + if filereadable(l:path . '/MANIFEST.in') + \|| filereadable(l:path . '/setup.cfg') + \|| filereadable(l:path . '/pytest.ini') + \|| filereadable(l:path . '/tox.ini') + \|| filereadable(l:path . '/.pyre_configuration.local') + \|| filereadable(l:path . '/mypy.ini') + \|| filereadable(l:path . '/.mypy.ini') + \|| filereadable(l:path . '/pycodestyle.cfg') + \|| filereadable(l:path . '/.flake8') + \|| filereadable(l:path . '/.flake8rc') + \|| filereadable(l:path . '/pylama.ini') + \|| filereadable(l:path . '/pylintrc') + \|| filereadable(l:path . '/.pylintrc') + \|| filereadable(l:path . '/pyrightconfig.json') + \|| filereadable(l:path . '/pyrightconfig.toml') + \|| filereadable(l:path . '/Pipfile') + \|| filereadable(l:path . '/Pipfile.lock') + \|| filereadable(l:path . '/poetry.lock') + \|| filereadable(l:path . '/pyproject.toml') + \|| filereadable(l:path . '/.tool-versions') + return l:path + endif + endfor + + return '' +endfunction + +" Given a buffer number, find the project root directory for Python. +" The root directory is defined as the first directory found while searching +" upwards through paths, including the current directory, until a path +" containing an init file (one from MANIFEST.in, setup.cfg, pytest.ini, +" tox.ini) is found. If it is not possible to find the project root directory +" via init file, then it will be defined as the first directory found +" searching upwards through paths, including the current directory, until no +" __init__.py files is found. +function! ale#python#FindProjectRoot(buffer) abort + let l:ini_root = ale#python#FindProjectRootIni(a:buffer) + + if !empty(l:ini_root) + return l:ini_root + endif + + for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + if !filereadable(l:path . '/__init__.py') + return l:path + endif + endfor + + return '' +endfunction + +" Given a buffer number, find a virtualenv path for Python. +function! ale#python#FindVirtualenv(buffer) abort + for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + " Skip empty path components returned in MSYS. + if empty(l:path) + continue + endif + + for l:dirname in ale#Var(a:buffer, 'virtualenv_dir_names') + let l:venv_dir = ale#path#Simplify( + \ join([l:path, l:dirname], s:sep) + \) + let l:script_filename = ale#path#Simplify( + \ join([l:venv_dir, s:bin_dir, 'activate'], s:sep) + \) + + if filereadable(l:script_filename) + return l:venv_dir + endif + endfor + endfor + + return $VIRTUAL_ENV +endfunction + +" Given a buffer number and a command name, find the path to the executable. +" First search on a virtualenv for Python, if nothing is found, try the global +" command. Returns an empty string if cannot find the executable +function! ale#python#FindExecutable(buffer, base_var_name, path_list) abort + if ale#Var(a:buffer, a:base_var_name . '_use_global') + return ale#Var(a:buffer, a:base_var_name . '_executable') + endif + + let l:virtualenv = ale#python#FindVirtualenv(a:buffer) + + if !empty(l:virtualenv) + for l:path in a:path_list + let l:ve_executable = ale#path#Simplify( + \ join([l:virtualenv, s:bin_dir, l:path], s:sep) + \) + + if executable(l:ve_executable) + return l:ve_executable + endif + endfor + endif + + return ale#Var(a:buffer, a:base_var_name . '_executable') +endfunction + +" Handle traceback.print_exception() output starting in the first a:limit lines. +function! ale#python#HandleTraceback(lines, limit) abort + let l:nlines = len(a:lines) + let l:limit = a:limit > l:nlines ? l:nlines : a:limit + let l:start = 0 + + while l:start < l:limit + if a:lines[l:start] is# 'Traceback (most recent call last):' + break + endif + + let l:start += 1 + endwhile + + if l:start >= l:limit + return [] + endif + + let l:end = l:start + 1 + + " Traceback entries are always prefixed with 2 spaces. + " SyntaxError marker (if present) is prefixed with at least 4 spaces. + " Final exc line starts with exception class name (never a space). + while l:end < l:nlines && a:lines[l:end][0] is# ' ' + let l:end += 1 + endwhile + + let l:exc_line = l:end < l:nlines + \ ? a:lines[l:end] + \ : 'An exception was thrown.' + + return [{ + \ 'lnum': 1, + \ 'text': l:exc_line . ' (See :ALEDetail)', + \ 'detail': join(a:lines[(l:start):(l:end)], "\n"), + \}] +endfunction + +" Detects whether a pipenv environment is present. +function! ale#python#PipenvPresent(buffer) abort + return findfile('Pipfile.lock', expand('#' . a:buffer . ':p:h') . ';') isnot# '' +endfunction + +" Detects whether a poetry environment is present. +function! ale#python#PoetryPresent(buffer) abort + return findfile('poetry.lock', expand('#' . a:buffer . ':p:h') . ';') isnot# '' +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/racket.vim b/dot_vim/plugged/ale/autoload/ale/racket.vim new file mode 100644 index 0000000..ff89610 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/racket.vim @@ -0,0 +1,12 @@ +function! ale#racket#FindProjectRoot(buffer) abort + let l:cwd = expand('#' . a:buffer . ':p:h') + let l:highest_init = l:cwd + + for l:path in ale#path#Upwards(l:cwd) + if filereadable(l:path.'/init.rkt') + let l:highest_init = l:path + endif + endfor + + return l:highest_init +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/references.vim b/dot_vim/plugged/ale/autoload/ale/references.vim new file mode 100644 index 0000000..c32663f --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/references.vim @@ -0,0 +1,187 @@ +let g:ale_default_navigation = get(g:, 'ale_default_navigation', 'buffer') + +let s:references_map = {} + +" Used to get the references map in tests. +function! ale#references#GetMap() abort + return deepcopy(s:references_map) +endfunction + +" Used to set the references map in tests. +function! ale#references#SetMap(map) abort + let s:references_map = a:map +endfunction + +function! ale#references#ClearLSPData() abort + let s:references_map = {} +endfunction + +function! ale#references#FormatTSResponseItem(response_item, options) abort + if get(a:options, 'open_in') is# 'quickfix' + return { + \ 'filename': a:response_item.file, + \ 'lnum': a:response_item.start.line, + \ 'col': a:response_item.start.offset, + \} + else + return { + \ 'filename': a:response_item.file, + \ 'line': a:response_item.start.line, + \ 'column': a:response_item.start.offset, + \ 'match': substitute(a:response_item.lineText, '^\s*\(.\{-}\)\s*$', '\1', ''), + \} + endif +endfunction + +function! ale#references#HandleTSServerResponse(conn_id, response) abort + if get(a:response, 'command', '') is# 'references' + \&& has_key(s:references_map, a:response.request_seq) + let l:options = remove(s:references_map, a:response.request_seq) + + if get(a:response, 'success', v:false) is v:true + let l:item_list = [] + + for l:response_item in a:response.body.refs + call add( + \ l:item_list, + \ ale#references#FormatTSResponseItem(l:response_item, l:options) + \) + endfor + + if empty(l:item_list) + call ale#util#Execute('echom ''No references found.''') + else + if get(l:options, 'open_in') is# 'quickfix' + call setqflist([], 'r') + call setqflist(l:item_list, 'a') + call ale#util#Execute('cc 1') + else + call ale#preview#ShowSelection(l:item_list, l:options) + endif + endif + endif + endif +endfunction + +function! ale#references#FormatLSPResponseItem(response_item, options) abort + if get(a:options, 'open_in') is# 'quickfix' + return { + \ 'filename': ale#util#ToResource(a:response_item.uri), + \ 'lnum': a:response_item.range.start.line + 1, + \ 'col': a:response_item.range.start.character + 1, + \} + else + return { + \ 'filename': ale#util#ToResource(a:response_item.uri), + \ 'line': a:response_item.range.start.line + 1, + \ 'column': a:response_item.range.start.character + 1, + \} + endif +endfunction + +function! ale#references#HandleLSPResponse(conn_id, response) abort + if has_key(a:response, 'id') + \&& has_key(s:references_map, a:response.id) + let l:options = remove(s:references_map, a:response.id) + + " The result can be a Dictionary item, a List of the same, or null. + let l:result = get(a:response, 'result', []) + let l:item_list = [] + + if type(l:result) is v:t_list + for l:response_item in l:result + call add(l:item_list, + \ ale#references#FormatLSPResponseItem(l:response_item, l:options) + \) + endfor + endif + + if empty(l:item_list) + call ale#util#Execute('echom ''No references found.''') + else + if get(l:options, 'open_in') is# 'quickfix' + call setqflist([], 'r') + call setqflist(l:item_list, 'a') + call ale#util#Execute('cc 1') + else + call ale#preview#ShowSelection(l:item_list, l:options) + endif + endif + endif +endfunction + +function! s:OnReady(line, column, options, linter, lsp_details) abort + let l:id = a:lsp_details.connection_id + + if !ale#lsp#HasCapability(l:id, 'references') + return + endif + + let l:buffer = a:lsp_details.buffer + + let l:Callback = a:linter.lsp is# 'tsserver' + \ ? function('ale#references#HandleTSServerResponse') + \ : function('ale#references#HandleLSPResponse') + + call ale#lsp#RegisterCallback(l:id, l:Callback) + + if a:linter.lsp is# 'tsserver' + let l:message = ale#lsp#tsserver_message#References( + \ l:buffer, + \ a:line, + \ a:column + \) + else + " Send a message saying the buffer has changed first, or the + " references position probably won't make sense. + call ale#lsp#NotifyForChanges(l:id, l:buffer) + + let l:message = ale#lsp#message#References(l:buffer, a:line, a:column) + endif + + let l:request_id = ale#lsp#Send(l:id, l:message) + + let s:references_map[l:request_id] = { + \ 'use_relative_paths': has_key(a:options, 'use_relative_paths') ? a:options.use_relative_paths : 0, + \ 'open_in': get(a:options, 'open_in', 'current-buffer'), + \} +endfunction + +function! ale#references#Find(...) abort + let l:options = {} + + if len(a:000) > 0 + for l:option in a:000 + if l:option is? '-relative' + let l:options.use_relative_paths = 1 + elseif l:option is? '-tab' + let l:options.open_in = 'tab' + elseif l:option is? '-split' + let l:options.open_in = 'split' + elseif l:option is? '-vsplit' + let l:options.open_in = 'vsplit' + elseif l:option is? '-quickfix' + let l:options.open_in = 'quickfix' + endif + endfor + endif + + if !has_key(l:options, 'open_in') + let l:default_navigation = ale#Var(bufnr(''), 'default_navigation') + + if index(['tab', 'split', 'vsplit'], l:default_navigation) >= 0 + let l:options.open_in = l:default_navigation + endif + endif + + let l:buffer = bufnr('') + let [l:line, l:column] = getpos('.')[1:2] + let l:column = min([l:column, len(getline(l:line))]) + let l:Callback = function('s:OnReady', [l:line, l:column, l:options]) + + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + call ale#lsp_linter#StartLSP(l:buffer, l:linter, l:Callback) + endif + endfor +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/rename.vim b/dot_vim/plugged/ale/autoload/ale/rename.vim new file mode 100644 index 0000000..a722cc9 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/rename.vim @@ -0,0 +1,210 @@ +" Author: Jerko Steiner +" Description: Rename symbol support for LSP / tsserver + +let s:rename_map = {} + +" Used to get the rename map in tests. +function! ale#rename#GetMap() abort + return deepcopy(s:rename_map) +endfunction + +" Used to set the rename map in tests. +function! ale#rename#SetMap(map) abort + let s:rename_map = a:map +endfunction + +function! ale#rename#ClearLSPData() abort + let s:rename_map = {} +endfunction + +let g:ale_rename_tsserver_find_in_comments = get(g:, 'ale_rename_tsserver_find_in_comments') +let g:ale_rename_tsserver_find_in_strings = get(g:, 'ale_rename_tsserver_find_in_strings') + +function! s:message(message) abort + call ale#util#Execute('echom ' . string(a:message)) +endfunction + +function! ale#rename#HandleTSServerResponse(conn_id, response) abort + if get(a:response, 'command', '') isnot# 'rename' + return + endif + + if !has_key(s:rename_map, a:response.request_seq) + return + endif + + let l:options = remove(s:rename_map, a:response.request_seq) + + let l:old_name = l:options.old_name + let l:new_name = l:options.new_name + + if get(a:response, 'success', v:false) is v:false + let l:message = get(a:response, 'message', 'unknown') + call s:message('Error renaming "' . l:old_name . '" to: "' . l:new_name + \ . '". Reason: ' . l:message) + + return + endif + + let l:changes = [] + + for l:response_item in a:response.body.locs + let l:filename = l:response_item.file + let l:text_changes = [] + + for l:loc in l:response_item.locs + call add(l:text_changes, { + \ 'start': { + \ 'line': l:loc.start.line, + \ 'offset': l:loc.start.offset, + \ }, + \ 'end': { + \ 'line': l:loc.end.line, + \ 'offset': l:loc.end.offset, + \ }, + \ 'newText': l:new_name, + \}) + endfor + + call add(l:changes, { + \ 'fileName': l:filename, + \ 'textChanges': l:text_changes, + \}) + endfor + + if empty(l:changes) + call s:message('Error renaming "' . l:old_name . '" to: "' . l:new_name . '"') + + return + endif + + call ale#code_action#HandleCodeAction( + \ { + \ 'description': 'rename', + \ 'changes': l:changes, + \ }, + \ { + \ 'conn_id': a:conn_id, + \ 'should_save': !&hidden, + \ }, + \) +endfunction + +function! ale#rename#HandleLSPResponse(conn_id, response) abort + if has_key(a:response, 'id') + \&& has_key(s:rename_map, a:response.id) + let l:options = remove(s:rename_map, a:response.id) + + if !has_key(a:response, 'result') + call s:message('No rename result received from server') + + return + endif + + let l:changes_map = ale#code_action#GetChanges(a:response.result) + + if empty(l:changes_map) + call s:message('No changes received from server') + + return + endif + + let l:changes = ale#code_action#BuildChangesList(l:changes_map) + + call ale#code_action#HandleCodeAction( + \ { + \ 'description': 'rename', + \ 'changes': l:changes, + \ }, + \ { + \ 'conn_id': a:conn_id, + \ 'should_save': !&hidden, + \ }, + \) + endif +endfunction + +function! s:OnReady(line, column, options, linter, lsp_details) abort + let l:id = a:lsp_details.connection_id + + if !ale#lsp#HasCapability(l:id, 'rename') + return + endif + + let l:buffer = a:lsp_details.buffer + + let l:Callback = a:linter.lsp is# 'tsserver' + \ ? function('ale#rename#HandleTSServerResponse') + \ : function('ale#rename#HandleLSPResponse') + + call ale#lsp#RegisterCallback(l:id, l:Callback) + + if a:linter.lsp is# 'tsserver' + let l:message = ale#lsp#tsserver_message#Rename( + \ l:buffer, + \ a:line, + \ a:column, + \ g:ale_rename_tsserver_find_in_comments, + \ g:ale_rename_tsserver_find_in_strings, + \) + else + " Send a message saying the buffer has changed first, or the + " rename position probably won't make sense. + call ale#lsp#NotifyForChanges(l:id, l:buffer) + + let l:message = ale#lsp#message#Rename( + \ l:buffer, + \ a:line, + \ a:column, + \ a:options.new_name + \) + endif + + let l:request_id = ale#lsp#Send(l:id, l:message) + + let s:rename_map[l:request_id] = a:options +endfunction + +function! s:ExecuteRename(linter, options) abort + let l:buffer = bufnr('') + let [l:line, l:column] = getpos('.')[1:2] + + if a:linter.lsp isnot# 'tsserver' + let l:column = min([l:column, len(getline(l:line))]) + endif + + let l:Callback = function('s:OnReady', [l:line, l:column, a:options]) + call ale#lsp_linter#StartLSP(l:buffer, a:linter, l:Callback) +endfunction + +function! ale#rename#Execute() abort + let l:lsp_linters = [] + + for l:linter in ale#linter#Get(&filetype) + if !empty(l:linter.lsp) + call add(l:lsp_linters, l:linter) + endif + endfor + + if empty(l:lsp_linters) + call s:message('No active LSPs') + + return + endif + + let l:old_name = expand('') + let l:new_name = ale#util#Input('New name: ', l:old_name) + + if empty(l:new_name) + call s:message('New name cannot be empty!') + + return + endif + + for l:lsp_linter in l:lsp_linters + call s:ExecuteRename(l:lsp_linter, { + \ 'old_name': l:old_name, + \ 'new_name': l:new_name, + \}) + endfor +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/ruby.vim b/dot_vim/plugged/ale/autoload/ale/ruby.vim new file mode 100644 index 0000000..d941bb2 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/ruby.vim @@ -0,0 +1,83 @@ +" Author: Eddie Lebow https://github.com/elebow +" Description: Functions for integrating with Ruby tools + +" Find the nearest dir containing "app", "db", and "config", and assume it is +" the root of a Rails app. +function! ale#ruby#FindRailsRoot(buffer) abort + for l:name in ['app', 'config', 'db'] + let l:dir = fnamemodify( + \ ale#path#FindNearestDirectory(a:buffer, l:name), + \ ':h:h' + \) + + if l:dir isnot# '.' + \&& isdirectory(l:dir . '/app') + \&& isdirectory(l:dir . '/config') + \&& isdirectory(l:dir . '/db') + return l:dir + endif + endfor + + return '' +endfunction + +" Find the nearest dir containing a potential ruby project. +function! ale#ruby#FindProjectRoot(buffer) abort + let l:dir = ale#ruby#FindRailsRoot(a:buffer) + + if isdirectory(l:dir) + return l:dir + endif + + for l:name in ['.solargraph.yml', 'Rakefile', 'Gemfile'] + let l:dir = fnamemodify( + \ ale#path#FindNearestFile(a:buffer, l:name), + \ ':h' + \) + + if l:dir isnot# '.' && isdirectory(l:dir) + return l:dir + endif + endfor + + return '' +endfunction + +" Handle output from rubocop and linters that depend on it (e.b. standardrb) +function! ale#ruby#HandleRubocopOutput(buffer, lines) abort + try + let l:errors = json_decode(a:lines[0]) + catch + return [] + endtry + + if !has_key(l:errors, 'summary') + \|| l:errors['summary']['offense_count'] == 0 + \|| empty(l:errors['files']) + return [] + endif + + let l:output = [] + + for l:error in l:errors['files'][0]['offenses'] + let l:start_col = l:error['location']['column'] + 0 + call add(l:output, { + \ 'lnum': l:error['location']['line'] + 0, + \ 'col': l:start_col, + \ 'end_col': l:start_col + l:error['location']['length'] - 1, + \ 'code': l:error['cop_name'], + \ 'text': l:error['message'], + \ 'type': ale_linters#ruby#rubocop#GetType(l:error['severity']), + \}) + endfor + + return l:output +endfunction + +function! ale#ruby#EscapeExecutable(executable, bundle_exec) abort + let l:exec_args = a:executable =~? 'bundle' + \ ? ' exec ' . a:bundle_exec + \ : '' + + return ale#Escape(a:executable) . l:exec_args +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/semver.vim b/dot_vim/plugged/ale/autoload/ale/semver.vim new file mode 100644 index 0000000..e3eb49c --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/semver.vim @@ -0,0 +1,78 @@ +let s:version_cache = {} + +" Reset the version cache used for parsing the version. +function! ale#semver#ResetVersionCache() abort + let s:version_cache = {} +endfunction + +function! ale#semver#ParseVersion(version_lines) abort + for l:line in a:version_lines + let l:match = matchlist(l:line, '\v(\d+)\.(\d+)(\.(\d+))?') + + if !empty(l:match) + return [l:match[1] + 0, l:match[2] + 0, l:match[4] + 0] + endif + endfor + + return [] +endfunction + +" Given an executable name and some lines of output, which can be empty, +" parse the version from the lines of output, or return the cached version +" triple [major, minor, patch] +" +" If the version cannot be found, an empty List will be returned instead. +function! s:GetVersion(executable, version_lines) abort + let l:version = get(s:version_cache, a:executable, []) + let l:parsed_version = ale#semver#ParseVersion(a:version_lines) + + if !empty(l:parsed_version) + let l:version = l:parsed_version + let s:version_cache[a:executable] = l:version + endif + + return l:version +endfunction + +function! ale#semver#RunWithVersionCheck(buffer, executable, command, Callback) abort + if empty(a:executable) + return '' + endif + + let l:cache = s:version_cache + + if has_key(s:version_cache, a:executable) + return a:Callback(a:buffer, s:version_cache[a:executable]) + endif + + return ale#command#Run( + \ a:buffer, + \ a:command, + \ {_, output -> a:Callback(a:buffer, s:GetVersion(a:executable, output))}, + \ {'output_stream': 'both', 'executable': a:executable} + \) +endfunction + +" Given two triples of integers [major, minor, patch], compare the triples +" and return 1 if the LHS is greater than or equal to the RHS. +" +" Pairs of [major, minor] can also be used for either argument. +" +" 0 will be returned if the LHS is an empty List. +function! ale#semver#GTE(lhs, rhs) abort + if empty(a:lhs) + return 0 + endif + + if a:lhs[0] > a:rhs[0] + return 1 + elseif a:lhs[0] == a:rhs[0] + if a:lhs[1] > a:rhs[1] + return 1 + elseif a:lhs[1] == a:rhs[1] + return get(a:lhs, 2) >= get(a:rhs, 2) + endif + endif + + return 0 +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/sign.vim b/dot_vim/plugged/ale/autoload/ale/sign.vim new file mode 100644 index 0000000..21e0631 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/sign.vim @@ -0,0 +1,496 @@ +scriptencoding utf8 +" Author: w0rp +" Description: Draws error and warning signs into signcolumn + +" This flag can be set to some integer to control the maximum number of signs +" that ALE will set. +let g:ale_max_signs = get(g:, 'ale_max_signs', -1) +" This flag can be set to 1 to enable changing the sign column colors when +" there are errors. +let g:ale_change_sign_column_color = get(g:, 'ale_change_sign_column_color', 0) +" These variables dictate what signs are used to indicate errors and warnings. +let g:ale_sign_error = get(g:, 'ale_sign_error', '>>') +let g:ale_sign_style_error = get(g:, 'ale_sign_style_error', g:ale_sign_error) +let g:ale_sign_warning = get(g:, 'ale_sign_warning', '--') +let g:ale_sign_style_warning = get(g:, 'ale_sign_style_warning', g:ale_sign_warning) +let g:ale_sign_info = get(g:, 'ale_sign_info', g:ale_sign_warning) +let g:ale_sign_priority = get(g:, 'ale_sign_priority', 30) +" This variable sets an offset which can be set for sign IDs. +" This ID can be changed depending on what IDs are set for other plugins. +" The dummy sign will use the ID exactly equal to the offset. +let g:ale_sign_offset = get(g:, 'ale_sign_offset', 1000000) +" This flag can be set to 1 to keep sign gutter always open +let g:ale_sign_column_always = get(g:, 'ale_sign_column_always', 0) +let g:ale_sign_highlight_linenrs = get(g:, 'ale_sign_highlight_linenrs', 0) + +let s:supports_sign_groups = has('nvim-0.4.2') || has('patch-8.1.614') + +if !hlexists('ALEErrorSign') + highlight link ALEErrorSign error +endif + +if !hlexists('ALEStyleErrorSign') + highlight link ALEStyleErrorSign ALEErrorSign +endif + +if !hlexists('ALEWarningSign') + highlight link ALEWarningSign todo +endif + +if !hlexists('ALEStyleWarningSign') + highlight link ALEStyleWarningSign ALEWarningSign +endif + +if !hlexists('ALEInfoSign') + highlight link ALEInfoSign ALEWarningSign +endif + +if !hlexists('ALESignColumnWithErrors') + highlight link ALESignColumnWithErrors error +endif + +function! ale#sign#SetUpDefaultColumnWithoutErrorsHighlight() abort + let l:verbose = &verbose + set verbose=0 + let l:output = execute('highlight SignColumn', 'silent') + let &verbose = l:verbose + + let l:highlight_syntax = join(split(l:output)[2:]) + let l:match = matchlist(l:highlight_syntax, '\vlinks to (.+)$') + + if !empty(l:match) + execute 'highlight link ALESignColumnWithoutErrors ' . l:match[1] + elseif l:highlight_syntax isnot# 'cleared' + execute 'highlight ALESignColumnWithoutErrors ' . l:highlight_syntax + endif +endfunction + +if !hlexists('ALESignColumnWithoutErrors') + call ale#sign#SetUpDefaultColumnWithoutErrorsHighlight() +endif + +" Spaces and backslashes need to be escaped for signs. +function! s:EscapeSignText(sign_text) abort + return substitute(substitute(a:sign_text, ' *$', '', ''), '\\\| ', '\\\0', 'g') +endfunction + +" Signs show up on the left for error markers. +execute 'sign define ALEErrorSign text=' . s:EscapeSignText(g:ale_sign_error) +\ . ' texthl=ALEErrorSign linehl=ALEErrorLine' +execute 'sign define ALEStyleErrorSign text=' . s:EscapeSignText(g:ale_sign_style_error) +\ . ' texthl=ALEStyleErrorSign linehl=ALEErrorLine' +execute 'sign define ALEWarningSign text=' . s:EscapeSignText(g:ale_sign_warning) +\ . ' texthl=ALEWarningSign linehl=ALEWarningLine' +execute 'sign define ALEStyleWarningSign text=' . s:EscapeSignText(g:ale_sign_style_warning) +\ . ' texthl=ALEStyleWarningSign linehl=ALEWarningLine' +execute 'sign define ALEInfoSign text=' . s:EscapeSignText(g:ale_sign_info) +\ . ' texthl=ALEInfoSign linehl=ALEInfoLine' +sign define ALEDummySign text=\ texthl=SignColumn + +if g:ale_sign_highlight_linenrs && has('nvim-0.3.2') + if !hlexists('ALEErrorSignLineNr') + highlight link ALEErrorSignLineNr CursorLineNr + endif + + if !hlexists('ALEStyleErrorSignLineNr') + highlight link ALEStyleErrorSignLineNr CursorLineNr + endif + + if !hlexists('ALEWarningSignLineNr') + highlight link ALEWarningSignLineNr CursorLineNr + endif + + if !hlexists('ALEStyleWarningSignLineNr') + highlight link ALEStyleWarningSignLineNr CursorLineNr + endif + + if !hlexists('ALEInfoSignLineNr') + highlight link ALEInfoSignLineNr CursorLineNr + endif + + sign define ALEErrorSign numhl=ALEErrorSignLineNr + sign define ALEStyleErrorSign numhl=ALEStyleErrorSignLineNr + sign define ALEWarningSign numhl=ALEWarningSignLineNr + sign define ALEStyleWarningSign numhl=ALEStyleWarningSignLineNr + sign define ALEInfoSign numhl=ALEInfoSignLineNr +endif + +function! ale#sign#GetSignName(sublist) abort + let l:priority = g:ale#util#style_warning_priority + + " Determine the highest priority item for the line. + for l:item in a:sublist + let l:item_priority = ale#util#GetItemPriority(l:item) + + if l:item_priority > l:priority + let l:priority = l:item_priority + endif + endfor + + if l:priority is# g:ale#util#error_priority + return 'ALEErrorSign' + endif + + if l:priority is# g:ale#util#warning_priority + return 'ALEWarningSign' + endif + + if l:priority is# g:ale#util#style_error_priority + return 'ALEStyleErrorSign' + endif + + if l:priority is# g:ale#util#style_warning_priority + return 'ALEStyleWarningSign' + endif + + if l:priority is# g:ale#util#info_priority + return 'ALEInfoSign' + endif + + " Use the error sign for invalid severities. + return 'ALEErrorSign' +endfunction + +function! s:PriorityCmd() abort + if s:supports_sign_groups + return ' priority=' . g:ale_sign_priority . ' ' + else + return '' + endif +endfunction + +function! s:GroupCmd() abort + if s:supports_sign_groups + return ' group=ale ' + else + return ' ' + endif +endfunction + +" Read sign data for a buffer to a list of lines. +function! ale#sign#ReadSigns(buffer) abort + let l:output = execute( + \ 'sign place ' . s:GroupCmd() . s:PriorityCmd() + \ . ' buffer=' . a:buffer + \ ) + + return split(l:output, "\n") +endfunction + +function! ale#sign#ParsePattern() abort + if s:supports_sign_groups + " Matches output like : + " line=4 id=1 group=ale name=ALEErrorSign + " Ñтрока=1 id=1000001 группа=ale имÑ=ALEErrorSign + " 行=1 識別å­=1000001 グループ=ale åå‰=ALEWarningSign + " línea=12 id=1000001 grupo=ale nombre=ALEWarningSign + " riga=1 id=1000001 gruppo=ale nome=ALEWarningSign + " Zeile=235 id=1000001 Gruppe=ale Name=ALEErrorSign + let l:pattern = '\v^.*\=(\d+).*\=(\d+).*\=ale>.*\=(ALE[a-zA-Z]+Sign)' + else + " Matches output like : + " line=4 id=1 name=ALEErrorSign + " Ñтрока=1 id=1000001 имÑ=ALEErrorSign + " 行=1 識別å­=1000001 åå‰=ALEWarningSign + " línea=12 id=1000001 nombre=ALEWarningSign + " riga=1 id=1000001 nome=ALEWarningSign + " Zeile=235 id=1000001 Name=ALEErrorSign + let l:pattern = '\v^.*\=(\d+).*\=(\d+).*\=(ALE[a-zA-Z]+Sign)' + endif + + return l:pattern +endfunction + +" Given a buffer number, return a List of placed signs [line, id, group] +function! ale#sign#ParseSignsWithGetPlaced(buffer) abort + let l:signs = sign_getplaced(a:buffer, { 'group': s:supports_sign_groups ? 'ale' : '' })[0].signs + let l:result = [] + let l:is_dummy_sign_set = 0 + + for l:sign in l:signs + if l:sign['name'] is# 'ALEDummySign' + let l:is_dummy_sign_set = 1 + else + call add(l:result, [ + \ str2nr(l:sign['lnum']), + \ str2nr(l:sign['id']), + \ l:sign['name'], + \]) + endif + endfor + + return [l:is_dummy_sign_set, l:result] +endfunction + +" Given a list of lines for sign output, return a List of [line, id, group] +function! ale#sign#ParseSigns(line_list) abort + let l:pattern =ale#sign#ParsePattern() + let l:result = [] + let l:is_dummy_sign_set = 0 + + for l:line in a:line_list + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) > 0 + if l:match[3] is# 'ALEDummySign' + let l:is_dummy_sign_set = 1 + else + call add(l:result, [ + \ str2nr(l:match[1]), + \ str2nr(l:match[2]), + \ l:match[3], + \]) + endif + endif + endfor + + return [l:is_dummy_sign_set, l:result] +endfunction + +function! ale#sign#FindCurrentSigns(buffer) abort + if exists('*sign_getplaced') + return ale#sign#ParseSignsWithGetPlaced(a:buffer) + else + let l:line_list = ale#sign#ReadSigns(a:buffer) + + return ale#sign#ParseSigns(l:line_list) + endif +endfunction + +" Given a loclist, group the List into with one List per line. +function! s:GroupLoclistItems(buffer, loclist) abort + let l:grouped_items = [] + let l:last_lnum = -1 + + for l:obj in a:loclist + if l:obj.bufnr != a:buffer + continue + endif + + " Create a new sub-List when we hit a new line. + if l:obj.lnum != l:last_lnum + call add(l:grouped_items, []) + endif + + call add(l:grouped_items[-1], l:obj) + let l:last_lnum = l:obj.lnum + endfor + + return l:grouped_items +endfunction + +function! s:UpdateLineNumbers(buffer, current_sign_list, loclist) abort + let l:line_map = {} + let l:line_numbers_changed = 0 + + for [l:line, l:sign_id, l:name] in a:current_sign_list + let l:line_map[l:sign_id] = l:line + endfor + + for l:item in a:loclist + if l:item.bufnr == a:buffer + let l:lnum = get(l:line_map, get(l:item, 'sign_id', 0), 0) + + if l:lnum && l:item.lnum != l:lnum + let l:item.lnum = l:lnum + let l:line_numbers_changed = 1 + endif + endif + endfor + + " When the line numbers change, sort the list again + if l:line_numbers_changed + call sort(a:loclist, 'ale#util#LocItemCompare') + endif +endfunction + +function! s:BuildSignMap(buffer, current_sign_list, grouped_items) abort + let l:max_signs = ale#Var(a:buffer, 'max_signs') + + if l:max_signs is 0 + let l:selected_grouped_items = [] + elseif type(l:max_signs) is v:t_number && l:max_signs > 0 + let l:selected_grouped_items = a:grouped_items[:l:max_signs - 1] + else + let l:selected_grouped_items = a:grouped_items + endif + + let l:sign_map = {} + let l:sign_offset = g:ale_sign_offset + + for [l:line, l:sign_id, l:name] in a:current_sign_list + let l:sign_info = get(l:sign_map, l:line, { + \ 'current_id_list': [], + \ 'current_name_list': [], + \ 'new_id': 0, + \ 'new_name': '', + \ 'items': [], + \}) + + " Increment the sign offset for new signs, by the maximum sign ID. + if l:sign_id > l:sign_offset + let l:sign_offset = l:sign_id + endif + + " Remember the sign names and IDs in separate Lists, so they are easy + " to work with. + call add(l:sign_info.current_id_list, l:sign_id) + call add(l:sign_info.current_name_list, l:name) + + let l:sign_map[l:line] = l:sign_info + endfor + + for l:group in l:selected_grouped_items + let l:line = l:group[0].lnum + let l:sign_info = get(l:sign_map, l:line, { + \ 'current_id_list': [], + \ 'current_name_list': [], + \ 'new_id': 0, + \ 'new_name': '', + \ 'items': [], + \}) + + let l:sign_info.new_name = ale#sign#GetSignName(l:group) + let l:sign_info.items = l:group + + let l:index = index( + \ l:sign_info.current_name_list, + \ l:sign_info.new_name + \) + + if l:index >= 0 + " We have a sign with this name already, so use the same ID. + let l:sign_info.new_id = l:sign_info.current_id_list[l:index] + else + " This sign name replaces the previous name, so use a new ID. + let l:sign_info.new_id = l:sign_offset + 1 + let l:sign_offset += 1 + endif + + let l:sign_map[l:line] = l:sign_info + endfor + + return l:sign_map +endfunction + +function! ale#sign#GetSignCommands(buffer, was_sign_set, sign_map) abort + let l:command_list = [] + let l:is_dummy_sign_set = a:was_sign_set + + " Set the dummy sign if we need to. + " The dummy sign is needed to keep the sign column open while we add + " and remove signs. + if !l:is_dummy_sign_set && (!empty(a:sign_map) || g:ale_sign_column_always) + call add(l:command_list, 'sign place ' + \ . g:ale_sign_offset + \ . s:GroupCmd() + \ . s:PriorityCmd() + \ . ' line=1 name=ALEDummySign ' + \ . ' buffer=' . a:buffer + \) + let l:is_dummy_sign_set = 1 + endif + + " Place new items first. + for [l:line_str, l:info] in items(a:sign_map) + if l:info.new_id + " Save the sign IDs we are setting back on our loclist objects. + " These IDs will be used to preserve items which are set many times. + for l:item in l:info.items + let l:item.sign_id = l:info.new_id + endfor + + if index(l:info.current_id_list, l:info.new_id) < 0 + call add(l:command_list, 'sign place ' + \ . (l:info.new_id) + \ . s:GroupCmd() + \ . s:PriorityCmd() + \ . ' line=' . l:line_str + \ . ' name=' . (l:info.new_name) + \ . ' buffer=' . a:buffer + \) + endif + endif + endfor + + " Remove signs without new IDs. + for l:info in values(a:sign_map) + for l:current_id in l:info.current_id_list + if l:current_id isnot l:info.new_id + call add(l:command_list, 'sign unplace ' + \ . l:current_id + \ . s:GroupCmd() + \ . ' buffer=' . a:buffer + \) + endif + endfor + endfor + + " Remove the dummy sign to close the sign column if we need to. + if l:is_dummy_sign_set && !g:ale_sign_column_always + call add(l:command_list, 'sign unplace ' + \ . g:ale_sign_offset + \ . s:GroupCmd() + \ . ' buffer=' . a:buffer + \) + endif + + return l:command_list +endfunction + +" This function will set the signs which show up on the left. +function! ale#sign#SetSigns(buffer, loclist) abort + if !bufexists(str2nr(a:buffer)) + " Stop immediately when attempting to set signs for a buffer which + " does not exist. + return + endif + + " Find the current markers + let [l:is_dummy_sign_set, l:current_sign_list] = + \ ale#sign#FindCurrentSigns(a:buffer) + + " Update the line numbers for items from before which may have moved. + call s:UpdateLineNumbers(a:buffer, l:current_sign_list, a:loclist) + + " Group items after updating the line numbers. + let l:grouped_items = s:GroupLoclistItems(a:buffer, a:loclist) + + " Build a map of current and new signs, with the lines as the keys. + let l:sign_map = s:BuildSignMap( + \ a:buffer, + \ l:current_sign_list, + \ l:grouped_items, + \) + + let l:command_list = ale#sign#GetSignCommands( + \ a:buffer, + \ l:is_dummy_sign_set, + \ l:sign_map, + \) + + " Change the sign column color if the option is on. + if g:ale_change_sign_column_color && !empty(a:loclist) + highlight clear SignColumn + highlight link SignColumn ALESignColumnWithErrors + endif + + for l:command in l:command_list + silent! execute l:command + endfor + + " Reset the sign column color when there are no more errors. + if g:ale_change_sign_column_color && empty(a:loclist) + highlight clear SignColumn + highlight link SignColumn ALESignColumnWithoutErrors + endif +endfunction + +" Remove all signs. +function! ale#sign#Clear() abort + if s:supports_sign_groups + sign unplace group=ale * + else + sign unplace * + endif +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/socket.vim b/dot_vim/plugged/ale/autoload/ale/socket.vim new file mode 100644 index 0000000..61f11e7 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/socket.vim @@ -0,0 +1,151 @@ +" Author: w0rp +" Description: APIs for working with asynchronous sockets, with an API +" normalised between Vim 8 and NeoVim. Socket connections only work in NeoVim +" 0.3+, and silently do nothing in earlier NeoVim versions. +" +" Important functions are described below. They are: +" +" ale#socket#Open(address, options) -> channel_id (>= 0 if successful) +" ale#socket#IsOpen(channel_id) -> 1 if open, 0 otherwise +" ale#socket#Close(channel_id) +" ale#socket#Send(channel_id, data) +" ale#socket#GetAddress(channel_id) -> Return the address for a job + +let s:channel_map = get(s:, 'channel_map', {}) + +function! s:VimOutputCallback(channel, data) abort + let l:channel_id = ch_info(a:channel).id + + " Only call the callbacks for jobs which are valid. + if l:channel_id >= 0 && has_key(s:channel_map, l:channel_id) + call ale#util#GetFunction(s:channel_map[l:channel_id].callback)(l:channel_id, a:data) + endif +endfunction + +function! s:NeoVimOutputCallback(channel_id, data, event) abort + let l:info = s:channel_map[a:channel_id] + + if a:event is# 'data' + let l:info.last_line = ale#util#JoinNeovimOutput( + \ a:channel_id, + \ l:info.last_line, + \ a:data, + \ l:info.mode, + \ ale#util#GetFunction(l:info.callback), + \) + endif +endfunction + +" Open a socket for a given address. The following options are accepted: +" +" callback - A callback for receiving input. (required) +" +" A non-negative number representing a channel ID will be returned is the +" connection was successful. 0 is a valid channel ID in Vim, so test if the +" connection ID is >= 0. +function! ale#socket#Open(address, options) abort + let l:mode = get(a:options, 'mode', 'raw') + let l:Callback = a:options.callback + + let l:channel_info = { + \ 'address': a:address, + \ 'mode': l:mode, + \ 'callback': a:options.callback, + \} + + if !has('nvim') + " Vim + let l:channel_options = { + \ 'mode': l:mode, + \ 'waittime': 0, + \ 'callback': function('s:VimOutputCallback'), + \} + + " Use non-blocking writes for Vim versions that support the option. + if has('patch-8.1.350') + let l:channel_options.noblock = 1 + endif + + let l:channel_info.channel = ch_open(a:address, l:channel_options) + let l:vim_info = ch_info(l:channel_info.channel) + let l:channel_id = !empty(l:vim_info) ? l:vim_info.id : -1 + elseif exists('*chansend') && exists('*sockconnect') + " NeoVim 0.3+ + try + let l:channel_id = sockconnect(stridx(a:address, ':') != -1 ? 'tcp' : 'pipe', + \ a:address, {'on_data': function('s:NeoVimOutputCallback')}) + let l:channel_info.last_line = '' + catch /connection failed/ + let l:channel_id = -1 + endtry + + " 0 means the connection failed some times in NeoVim, so make the ID + " invalid to match Vim. + if l:channel_id is 0 + let l:channel_id = -1 + endif + + let l:channel_info.channel = l:channel_id + else + " Other Vim versions. + let l:channel_id = -1 + endif + + if l:channel_id >= 0 + let s:channel_map[l:channel_id] = l:channel_info + endif + + return l:channel_id +endfunction + +" Return 1 is a channel is open, 0 otherwise. +function! ale#socket#IsOpen(channel_id) abort + if !has_key(s:channel_map, a:channel_id) + return 0 + endif + + if has('nvim') + " In NeoVim, we have to check if this channel is in the global list. + return index(map(nvim_list_chans(), 'v:val.id'), a:channel_id) >= 0 + endif + + let l:channel = s:channel_map[a:channel_id].channel + + return ch_status(l:channel) is# 'open' +endfunction + +" Close a socket, if it's still open. +function! ale#socket#Close(channel_id) abort + " IsRunning isn't called here, so we don't check nvim_list_chans() + if !has_key(s:channel_map, a:channel_id) + return 0 + endif + + let l:channel = remove(s:channel_map, a:channel_id).channel + + if has('nvim') + silent! call chanclose(l:channel) + elseif ch_status(l:channel) is# 'open' + call ch_close(l:channel) + endif +endfunction + +" Send some data to a socket. +function! ale#socket#Send(channel_id, data) abort + if !has_key(s:channel_map, a:channel_id) + return + endif + + let l:channel = s:channel_map[a:channel_id].channel + + if has('nvim') + call chansend(l:channel, a:data) + else + call ch_sendraw(l:channel, a:data) + endif +endfunction + +" Get an address for a channel, or an empty string. +function! ale#socket#GetAddress(channel_id) abort + return get(get(s:channel_map, a:channel_id, {}), 'address', '') +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/statusline.vim b/dot_vim/plugged/ale/autoload/ale/statusline.vim new file mode 100644 index 0000000..6b93ba5 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/statusline.vim @@ -0,0 +1,135 @@ +" Author: KabbAmine +" Additions by: petpetpetpet +" Description: Statusline related function(s) + +function! s:CreateCountDict() abort + " Keys 0 and 1 are for backwards compatibility. + " The count object used to be a List of [error_count, warning_count]. + return { + \ '0': 0, + \ '1': 0, + \ 'error': 0, + \ 'warning': 0, + \ 'info': 0, + \ 'style_error': 0, + \ 'style_warning': 0, + \ 'total': 0, + \} +endfunction + +" Update the buffer error/warning count with data from loclist. +function! ale#statusline#Update(buffer, loclist) abort + if !exists('g:ale_buffer_info') || !has_key(g:ale_buffer_info, a:buffer) + return + endif + + let l:loclist = filter(copy(a:loclist), 'v:val.bufnr == a:buffer') + let l:count = s:CreateCountDict() + let l:count.total = len(l:loclist) + + " Allows easy access to the first instance of each problem type. + let l:first_problems = {} + + for l:entry in l:loclist + if l:entry.type is# 'W' + if get(l:entry, 'sub_type', '') is# 'style' + let l:count.style_warning += 1 + + if l:count.style_warning == 1 + let l:first_problems.style_warning = l:entry + endif + else + let l:count.warning += 1 + + if l:count.warning == 1 + let l:first_problems.warning = l:entry + endif + endif + elseif l:entry.type is# 'I' + let l:count.info += 1 + + if l:count.info == 1 + let l:first_problems.info = l:entry + endif + elseif get(l:entry, 'sub_type', '') is# 'style' + let l:count.style_error += 1 + + if l:count.style_error == 1 + let l:first_problems.style_error = l:entry + endif + else + let l:count.error += 1 + + if l:count.error == 1 + let l:first_problems.error = l:entry + endif + endif + endfor + + " Set keys for backwards compatibility. + let l:count[0] = l:count.error + l:count.style_error + let l:count[1] = l:count.total - l:count[0] + + let g:ale_buffer_info[a:buffer].count = l:count + let g:ale_buffer_info[a:buffer].first_problems = l:first_problems +endfunction + +" Get the counts for the buffer, and update the counts if needed. +function! s:UpdateCacheIfNecessary(buffer) abort + " Cache is cold, so manually ask for an update. + if !has_key(g:ale_buffer_info[a:buffer], 'count') + call ale#statusline#Update( + \ a:buffer, + \ g:ale_buffer_info[a:buffer].loclist + \) + endif +endfunction + +function! s:BufferCacheExists(buffer) abort + if !exists('g:ale_buffer_info') || !has_key(g:ale_buffer_info, a:buffer) + return 0 + endif + + return 1 +endfunction + +" Get the counts for the buffer, and update the counts if needed. +function! s:GetCounts(buffer) abort + if !s:BufferCacheExists(a:buffer) + return s:CreateCountDict() + endif + + call s:UpdateCacheIfNecessary(a:buffer) + + return g:ale_buffer_info[a:buffer].count +endfunction + +" Get the dict of first_problems, update the buffer info cache if necessary. +function! s:GetFirstProblems(buffer) abort + if !s:BufferCacheExists(a:buffer) + return {} + endif + + call s:UpdateCacheIfNecessary(a:buffer) + + return g:ale_buffer_info[a:buffer].first_problems +endfunction + +" Returns a Dictionary with counts for use in third party integrations. +function! ale#statusline#Count(buffer) abort + " The Dictionary is copied here before exposing it to other plugins. + return copy(s:GetCounts(a:buffer)) +endfunction + +" Returns a copy of the *first* locline instance of the specified problem +" type. (so this would allow an external integration to know all the info +" about the first style warning in the file, for example.) +function! ale#statusline#FirstProblem(buffer, type) abort + let l:first_problems = s:GetFirstProblems(a:buffer) + + if !empty(l:first_problems) && has_key(l:first_problems, a:type) + return copy(l:first_problems[a:type]) + endif + + return {} +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/swift.vim b/dot_vim/plugged/ale/autoload/ale/swift.vim new file mode 100644 index 0000000..3232d42 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/swift.vim @@ -0,0 +1,70 @@ +" Author: Dan Loman +" Description: Functions for integrating with Swift tools + +" Find the nearest dir containing a Package.swift file and assume it is the root of the Swift project. +function! ale#swift#FindProjectRoot(buffer) abort + let l:swift_config = ale#path#FindNearestFile(a:buffer, 'Package.swift') + + if !empty(l:swift_config) + return fnamemodify(l:swift_config, ':h') + endif + + return '' +endfunction + +" Support Apple Swift Format {{{1 + +call ale#Set('swift_appleswiftformat_executable', 'swift-format') +call ale#Set('swift_appleswiftformat_use_swiftpm', 0) + +" Return the executable depending on whether or not to use Swift Package Manager. +" +" If not asked to use Swift Package Manager (use_swiftpm = 0), the returned +" value is the global executable, else the returned value is 'swift' because +" the final command line will be `swift run swift-format ...`. +" +" Failure is expected if use_swiftpm is `1` but no Package.swift can be located. +function! ale#swift#GetAppleSwiftFormatExecutable(buffer) abort + if !ale#Var(a:buffer, 'swift_appleswiftformat_use_swiftpm') + return ale#Var(a:buffer, 'swift_appleswiftformat_executable') + endif + + if ale#path#FindNearestFile(a:buffer, 'Package.swift') is# '' + " If there is no Package.swift file, we don't use swift-format even if it exists, + " so we return '' to indicate failure. + return '' + endif + + return 'swift' +endfunction + +" Return the command depending on whether or not to use Swift Package Manager. +" +" If asked to use Swift Package Manager (use_swiftpm = 1), the command +" arguments are prefixed with 'swift run'. +" +" In either case, the configuration file is located and added to the command. +function! ale#swift#GetAppleSwiftFormatCommand(buffer) abort + let l:executable = ale#swift#GetAppleSwiftFormatExecutable(a:buffer) + let l:command_args = '' + + if ale#Var(a:buffer, 'swift_appleswiftformat_use_swiftpm') + let l:command_args = ' ' . 'run swift-format' + endif + + return ale#Escape(l:executable) . l:command_args +endfunction + +" Locate the nearest '.swift-format' configuration file, and return the +" arguments, else return an empty string. +function! ale#swift#GetAppleSwiftFormatConfigArgs(buffer) abort + let l:config_filepath = ale#path#FindNearestFile(a:buffer, '.swift-format') + + if l:config_filepath isnot# '' + return '--configuration' . ' ' . l:config_filepath + endif + + return '' +endfunction + +" }}} diff --git a/dot_vim/plugged/ale/autoload/ale/symbol.vim b/dot_vim/plugged/ale/autoload/ale/symbol.vim new file mode 100644 index 0000000..6c65f1b --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/symbol.vim @@ -0,0 +1,110 @@ +let s:symbol_map = {} + +" Used to get the symbol map in tests. +function! ale#symbol#GetMap() abort + return deepcopy(s:symbol_map) +endfunction + +" Used to set the symbol map in tests. +function! ale#symbol#SetMap(map) abort + let s:symbol_map = a:map +endfunction + +function! ale#symbol#ClearLSPData() abort + let s:symbol_map = {} +endfunction + +function! ale#symbol#HandleLSPResponse(conn_id, response) abort + if has_key(a:response, 'id') + \&& has_key(s:symbol_map, a:response.id) + let l:options = remove(s:symbol_map, a:response.id) + + let l:result = get(a:response, 'result', v:null) + let l:item_list = [] + + if type(l:result) is v:t_list + " Each item looks like this: + " { + " 'name': 'foo', + " 'kind': 123, + " 'deprecated': v:false, + " 'location': { + " 'uri': 'file://...', + " 'range': { + " 'start': {'line': 0, 'character': 0}, + " 'end': {'line': 0, 'character': 0}, + " }, + " }, + " 'containerName': 'SomeContainer', + " } + for l:response_item in l:result + let l:location = l:response_item.location + + call add(l:item_list, { + \ 'filename': ale#util#ToResource(l:location.uri), + \ 'line': l:location.range.start.line + 1, + \ 'column': l:location.range.start.character + 1, + \ 'match': l:response_item.name, + \}) + endfor + endif + + if empty(l:item_list) + call ale#util#Execute('echom ''No symbols found.''') + else + call ale#preview#ShowSelection(l:item_list, l:options) + endif + endif +endfunction + +function! s:OnReady(query, options, linter, lsp_details) abort + let l:id = a:lsp_details.connection_id + + if !ale#lsp#HasCapability(l:id, 'symbol_search') + return + endif + + let l:buffer = a:lsp_details.buffer + + " If we already made a request, stop here. + if getbufvar(l:buffer, 'ale_symbol_request_made', 0) + return + endif + + let l:Callback = function('ale#symbol#HandleLSPResponse') + call ale#lsp#RegisterCallback(l:id, l:Callback) + + let l:message = ale#lsp#message#Symbol(a:query) + let l:request_id = ale#lsp#Send(l:id, l:message) + + call setbufvar(l:buffer, 'ale_symbol_request_made', 1) + let s:symbol_map[l:request_id] = { + \ 'buffer': l:buffer, + \ 'use_relative_paths': has_key(a:options, 'use_relative_paths') ? a:options.use_relative_paths : 0 + \} +endfunction + +function! ale#symbol#Search(args) abort + let [l:opts, l:query] = ale#args#Parse(['relative'], a:args) + + if empty(l:query) + throw 'A non-empty string must be provided!' + endif + + let l:buffer = bufnr('') + let l:options = {} + + if has_key(l:opts, 'relative') + let l:options.use_relative_paths = 1 + endif + + " Set a flag so we only make one request. + call setbufvar(l:buffer, 'ale_symbol_request_made', 0) + let l:Callback = function('s:OnReady', [l:query, l:options]) + + for l:linter in ale#linter#Get(getbufvar(l:buffer, '&filetype')) + if !empty(l:linter.lsp) && l:linter.lsp isnot# 'tsserver' + call ale#lsp_linter#StartLSP(l:buffer, l:linter, l:Callback) + endif + endfor +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/test.vim b/dot_vim/plugged/ale/autoload/ale/test.vim new file mode 100644 index 0000000..e03ecb6 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/test.vim @@ -0,0 +1,205 @@ +" Author: w0rp +" Description: Functions for making testing ALE easier. +" +" This file should not typically be loaded during the normal execution of ALE. + +" Change the directory for checking things in particular test directories +" +" This function will set the g:dir variable, which represents the working +" directory after changing the path. This variable allows a test to change +" directories, and then switch back to a directory at the start of the test +" run. +" +" This function should be run in a Vader Before: block. +function! ale#test#SetDirectory(docker_path) abort + if a:docker_path[:len('/testplugin/') - 1] isnot# '/testplugin/' + throw 'docker_path must start with /testplugin/!' + endif + + " Try to switch directory, which will fail when running tests directly, + " and not through the Docker image. + silent! execute 'cd ' . fnameescape(a:docker_path) + let g:dir = getcwd() " no-custom-checks +endfunction + +" When g:dir is defined, switch back to the directory we saved, and then +" delete that variable. +" +" The filename will be reset to dummy.txt +" +" This function should be run in a Vader After: block. +function! ale#test#RestoreDirectory() abort + call ale#test#SetFilename('dummy.txt') + silent execute 'cd ' . fnameescape(g:dir) + unlet! g:dir +endfunction + +" Get a filename for the current buffer using a relative path to the script. +" +" If a g:dir variable is set, it will be used as the path to the directory +" containing the test file. +function! ale#test#GetFilename(path) abort + let l:dir = get(g:, 'dir', '') + + if empty(l:dir) + let l:dir = getcwd() " no-custom-checks + endif + + let l:full_path = ale#path#IsAbsolute(a:path) + \ ? a:path + \ : l:dir . '/' . a:path + + return ale#path#Simplify(l:full_path) +endfunction + +" Change the filename for the current buffer using a relative path to +" the script without running autocmd commands. +" +" If a g:dir variable is set, it will be used as the path to the directory +" containing the test file. +function! ale#test#SetFilename(path) abort + let l:full_path = ale#test#GetFilename(a:path) + silent! noautocmd execute 'file ' . fnameescape(l:full_path) +endfunction + +function! RemoveNewerKeys(results) abort + for l:item in a:results + if has_key(l:item, 'module') + call remove(l:item, 'module') + endif + + if has_key(l:item, 'end_col') + call remove(l:item, 'end_col') + endif + + if has_key(l:item, 'end_lnum') + call remove(l:item, 'end_lnum') + endif + endfor +endfunction + +" Return loclist data with only the keys supported by the lowest Vim versions. +function! ale#test#GetLoclistWithoutNewerKeys() abort + let l:results = getloclist(0) + call RemoveNewerKeys(l:results) + + return l:results +endfunction + +" Return quickfix data with only the keys supported by the lowest Vim versions. +function! ale#test#GetQflistWithoutNewerKeys() abort + let l:results = getqflist() + call RemoveNewerKeys(l:results) + + return l:results +endfunction + +function! ale#test#GetPreviewWindowText() abort + for l:window in range(1, winnr('$')) + if getwinvar(l:window, '&previewwindow', 0) + let l:buffer = winbufnr(l:window) + + return getbufline(l:buffer, 1, '$') + endif + endfor +endfunction + +" This function can be called with a timeout to wait for all jobs to finish. +" If the jobs to not finish in the given number of milliseconds, +" an exception will be thrown. +" +" The time taken will be a very rough approximation, and more time may be +" permitted than is specified. +function! ale#test#WaitForJobs(deadline) abort + let l:start_time = ale#events#ClockMilliseconds() + + if l:start_time == 0 + throw 'Failed to read milliseconds from the clock!' + endif + + let l:job_list = [] + + " Gather all of the jobs from every buffer. + for [l:buffer, l:data] in items(ale#command#GetData()) + call extend(l:job_list, map(keys(l:data.jobs), 'str2nr(v:val)')) + endfor + + " NeoVim has a built-in API for this, so use that. + if has('nvim') + let l:nvim_code_list = jobwait(l:job_list, a:deadline) + + if index(l:nvim_code_list, -1) >= 0 + throw 'Jobs did not complete on time!' + endif + + return + endif + + let l:should_wait_more = 1 + + while l:should_wait_more + let l:should_wait_more = 0 + + for l:job_id in l:job_list + if ale#job#IsRunning(l:job_id) + let l:now = ale#events#ClockMilliseconds() + + if l:now - l:start_time > a:deadline + " Stop waiting after a timeout, so we don't wait forever. + throw 'Jobs did not complete on time!' + endif + + " Wait another 10 milliseconds + let l:should_wait_more = 1 + sleep 10ms + break + endif + endfor + endwhile + + " Sleep for a small amount of time after all jobs finish. + " This seems to be enough to let handlers after jobs end run, and + " prevents the occasional failure where this function exits after jobs + " end, but before handlers are run. + sleep 10ms + + " We must check the buffer data again to see if new jobs started for + " linters with chained commands. + let l:has_new_jobs = 0 + + " Check again to see if any jobs are running. + for l:info in values(g:ale_buffer_info) + for [l:job_id, l:linter] in get(l:info, 'job_list', []) + if ale#job#IsRunning(l:job_id) + let l:has_new_jobs = 1 + break + endif + endfor + endfor + + if l:has_new_jobs + " We have to wait more. Offset the timeout by the time taken so far. + let l:now = ale#events#ClockMilliseconds() + let l:new_deadline = a:deadline - (l:now - l:start_time) + + if l:new_deadline <= 0 + " Enough time passed already, so stop immediately. + throw 'Jobs did not complete on time!' + endif + + call ale#test#WaitForJobs(l:new_deadline) + endif +endfunction + +function! ale#test#FlushJobs() abort + " The variable is checked for in a loop, as calling one series of + " callbacks can trigger a further series of callbacks. + while exists('g:ale_run_synchronously_callbacks') + let l:callbacks = g:ale_run_synchronously_callbacks + unlet g:ale_run_synchronously_callbacks + + for l:Callback in l:callbacks + call l:Callback() + endfor + endwhile +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/toggle.vim b/dot_vim/plugged/ale/autoload/ale/toggle.vim new file mode 100644 index 0000000..abc53da --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/toggle.vim @@ -0,0 +1,101 @@ +function! s:EnablePreamble() abort + " Set pattern options again, if enabled. + if get(g:, 'ale_pattern_options_enabled', 0) + call ale#pattern_options#SetOptions(bufnr('')) + endif + + " Lint immediately, including running linters against the file. + call ale#Queue(0, 'lint_file') +endfunction + +function! s:DisablePostamble() abort + " Remove highlights for the current buffer now. + if g:ale_set_highlights + call ale#highlight#UpdateHighlights() + endif + + if g:ale_virtualtext_cursor is# 'current' || g:ale_virtualtext_cursor == 1 + call ale#virtualtext#Clear(bufnr('')) + endif +endfunction + +function! ale#toggle#Toggle() abort + let g:ale_enabled = !get(g:, 'ale_enabled') + + if g:ale_enabled + call s:EnablePreamble() + + if g:ale_set_balloons + call ale#balloon#Enable() + endif + else + call ale#engine#CleanupEveryBuffer() + call s:DisablePostamble() + + if exists('*ale#balloon#Disable') + call ale#balloon#Disable() + endif + endif + + call ale#events#Init() +endfunction + +function! ale#toggle#Enable() abort + if !g:ale_enabled + call ale#toggle#Toggle() + endif +endfunction + +function! ale#toggle#Disable() abort + if g:ale_enabled + call ale#toggle#Toggle() + endif +endfunction + +function! ale#toggle#Reset() abort + call ale#engine#CleanupEveryBuffer() + call ale#highlight#UpdateHighlights() +endfunction + +function! ale#toggle#ToggleBuffer(buffer) abort + " Get the new value for the toggle. + let l:enabled = !getbufvar(a:buffer, 'ale_enabled', 1) + + " Disabling ALE globally removes autocmd events, so we cannot enable + " linting locally when linting is disabled globally + if l:enabled && !g:ale_enabled + " no-custom-checks + echom 'ALE cannot be enabled locally when disabled globally' + + return + endif + + call setbufvar(a:buffer, 'ale_enabled', l:enabled) + + if l:enabled + call s:EnablePreamble() + else + " Stop all jobs and clear the results for everything, and delete + " all of the data we stored for the buffer. + call ale#engine#Cleanup(a:buffer) + call s:DisablePostamble() + endif +endfunction + +function! ale#toggle#EnableBuffer(buffer) abort + " ALE is enabled by default for all buffers. + if !getbufvar(a:buffer, 'ale_enabled', 1) + call ale#toggle#ToggleBuffer(a:buffer) + endif +endfunction + +function! ale#toggle#DisableBuffer(buffer) abort + if getbufvar(a:buffer, 'ale_enabled', 1) + call ale#toggle#ToggleBuffer(a:buffer) + endif +endfunction + +function! ale#toggle#ResetBuffer(buffer) abort + call ale#engine#Cleanup(a:buffer) + call ale#highlight#UpdateHighlights() +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/uri.vim b/dot_vim/plugged/ale/autoload/ale/uri.vim new file mode 100644 index 0000000..d696f03 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/uri.vim @@ -0,0 +1,43 @@ +function! s:EncodeChar(char) abort + let l:result = '' + + for l:index in range(strlen(a:char)) + let l:result .= printf('%%%02x', char2nr(a:char[l:index])) + endfor + + return l:result +endfunction + +function! ale#uri#Encode(value) abort + return substitute( + \ a:value, + \ '\([^a-zA-Z0-9\\/$\-_.!*''(),]\)', + \ '\=s:EncodeChar(submatch(1))', + \ 'g' + \) +endfunction + +function! ale#uri#Decode(value) abort + return substitute( + \ a:value, + \ '%\(\x\x\)', + \ '\=printf("%c", str2nr(submatch(1), 16))', + \ 'g' + \) +endfunction + +let s:uri_handlers = { +\ 'jdt': { +\ 'OpenURILink': function('ale#uri#jdt#OpenJDTLink'), +\ } +\} + +function! ale#uri#GetURIHandler(uri) abort + for l:scheme in keys(s:uri_handlers) + if a:uri =~# '^'.l:scheme.'://' + return s:uri_handlers[scheme] + endif + endfor + + return v:null +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/uri/jdt.vim b/dot_vim/plugged/ale/autoload/ale/uri/jdt.vim new file mode 100644 index 0000000..46cea26 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/uri/jdt.vim @@ -0,0 +1,110 @@ +" Author: yoshi1123 +" Description: Functions for working with jdt:// URIs. + +function! s:OpenJDTLink(root, uri, line, column, options, result) abort + if has_key(a:result, 'error') + " no-custom-checks + echoerr a:result.error.message + + return + endif + + let l:contents = a:result['result'] + + if type(l:contents) is# type(v:null) + " no-custom-checks + echoerr 'File content not found' + endif + + " disable autocmd when opening buffer + autocmd! AleURISchemes + call ale#util#Open(a:uri, a:line, a:column, a:options) + autocmd AleURISchemes BufNewFile,BufReadPre jdt://** call ale#uri#jdt#ReadJDTLink(expand('')) + + if !empty(getbufvar(bufnr(''), 'ale_lsp_root', '')) + return + endif + + let b:ale_lsp_root = a:root + set filetype=java + + call setline(1, split(l:contents, '\n')) + call cursor(a:line, a:column) + normal! zz + + setlocal buftype=nofile nomodified nomodifiable readonly +endfunction + +" Load new buffer with jdt:// contents and jump to line and column. +function! ale#uri#jdt#OpenJDTLink(encoded_uri, line, column, options, conn_id) abort + let l:found_eclipselsp = v:false + + for l:linter in ale#linter#Get('java') + if l:linter.name is# 'eclipselsp' + let l:found_eclipselsp = v:true + endif + endfor + + if !l:found_eclipselsp + throw 'eclipselsp not running' + endif + + let l:root = a:conn_id[stridx(a:conn_id, ':')+1:] + let l:uri = a:encoded_uri + call ale#lsp_linter#SendRequest( + \ bufnr(''), + \ 'eclipselsp', + \ [0, 'java/classFileContents', {'uri': ale#util#ToURI(l:uri)}], + \ function('s:OpenJDTLink', [l:root, l:uri, a:line, a:column, a:options]) + \) +endfunction + +function! s:ReadClassFileContents(uri, result) abort + if has_key(a:result, 'error') + " no-custom-checks + echoerr a:result.error.message + + return + endif + + let l:contents = a:result['result'] + + if type(l:contents) is# type(v:null) + " no-custom-checks + echoerr 'File content not found' + endif + + call setline(1, split(l:contents, '\n')) + + setlocal buftype=nofile nomodified nomodifiable readonly +endfunction + +" Read jdt:// contents, as part of current project, into current buffer. +function! ale#uri#jdt#ReadJDTLink(encoded_uri) abort + if !empty(getbufvar(bufnr(''), 'ale_lsp_root', '')) + return + endif + + let l:linter_map = ale#lsp_linter#GetLSPLinterMap() + + for l:conn_id in keys(l:linter_map) + if l:linter_map[l:conn_id] is# 'eclipselsp' + let l:root = l:conn_id[stridx(l:conn_id, ':')+1:] + endif + endfor + + if l:root is# v:null + throw 'eclipselsp not running' + endif + + let l:uri = a:encoded_uri + let b:ale_lsp_root = l:root + set filetype=java + + call ale#lsp_linter#SendRequest( + \ bufnr(''), + \ 'eclipselsp', + \ [0, 'java/classFileContents', {'uri': ale#util#ToURI(l:uri)}], + \ function('s:ReadClassFileContents', [l:uri]) + \) +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/util.vim b/dot_vim/plugged/ale/autoload/ale/util.vim new file mode 100644 index 0000000..c884076 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/util.vim @@ -0,0 +1,574 @@ +" Author: w0rp +" Description: Contains miscellaneous functions + +" A wrapper function for mode() so we can test calls for it. +function! ale#util#Mode(...) abort + return call('mode', a:000) +endfunction + +" A wrapper function for feedkeys so we can test calls for it. +function! ale#util#FeedKeys(...) abort + return call('feedkeys', a:000) +endfunction + +" Show a message in as small a window as possible. +" +" Vim 8 does not support echoing long messages from asynchronous callbacks, +" but NeoVim does. Small messages can be echoed in Vim 8, and larger messages +" have to be shown in preview windows. +function! ale#util#ShowMessage(string, ...) abort + let l:options = get(a:000, 0, {}) + + if !has('nvim') + call ale#preview#CloseIfTypeMatches('ale-preview.message') + endif + + " We have to assume the user is using a monospace font. + if has('nvim') || (a:string !~? "\n" && len(a:string) < &columns) + " no-custom-checks + echo a:string + else + call ale#preview#Show(split(a:string, "\n"), extend( + \ { + \ 'filetype': 'ale-preview.message', + \ 'stay_here': 1, + \ }, + \ l:options, + \)) + endif +endfunction + +" A wrapper function for execute, so we can test executing some commands. +function! ale#util#Execute(expr) abort + execute a:expr +endfunction + +if !exists('g:ale#util#nul_file') + " A null file for sending output to nothing. + let g:ale#util#nul_file = '/dev/null' + + if has('win32') + let g:ale#util#nul_file = 'nul' + endif +endif + +" Given a job, a buffered line of data, a list of parts of lines, a mode data +" is being read in, and a callback, join the lines of output for a NeoVim job +" or socket together, and call the callback with the joined output. +" +" Note that jobs and IDs are the same thing on NeoVim. +function! ale#util#JoinNeovimOutput(job, last_line, data, mode, callback) abort + if a:mode is# 'raw' + call a:callback(a:job, join(a:data, "\n")) + + return '' + endif + + let l:lines = a:data[:-2] + + if len(a:data) > 1 + let l:lines[0] = a:last_line . l:lines[0] + let l:new_last_line = a:data[-1] + else + let l:new_last_line = a:last_line . get(a:data, 0, '') + endif + + for l:line in l:lines + call a:callback(a:job, l:line) + endfor + + return l:new_last_line +endfunction + +" Return the number of lines for a given buffer. +function! ale#util#GetLineCount(buffer) abort + return len(getbufline(a:buffer, 1, '$')) +endfunction + +function! ale#util#GetFunction(string_or_ref) abort + if type(a:string_or_ref) is v:t_string + return function(a:string_or_ref) + endif + + return a:string_or_ref +endfunction + +" Open the file (at the given line). +" options['open_in'] can be: +" current-buffer (default) +" tab +" split +" vsplit +function! ale#util#Open(filename, line, column, options) abort + let l:open_in = get(a:options, 'open_in', 'current-buffer') + let l:args_to_open = '+' . a:line . ' ' . fnameescape(a:filename) + + if l:open_in is# 'tab' + call ale#util#Execute('tabedit ' . l:args_to_open) + elseif l:open_in is# 'split' + call ale#util#Execute('split ' . l:args_to_open) + elseif l:open_in is# 'vsplit' + call ale#util#Execute('vsplit ' . l:args_to_open) + elseif bufnr(a:filename) isnot bufnr('') + " Open another file only if we need to. + call ale#util#Execute('edit ' . l:args_to_open) + else + normal! m` + endif + + call cursor(a:line, a:column) + normal! zz +endfunction + +let g:ale#util#error_priority = 5 +let g:ale#util#warning_priority = 4 +let g:ale#util#info_priority = 3 +let g:ale#util#style_error_priority = 2 +let g:ale#util#style_warning_priority = 1 + +function! ale#util#GetItemPriority(item) abort + if a:item.type is# 'I' + return g:ale#util#info_priority + endif + + if a:item.type is# 'W' + if get(a:item, 'sub_type', '') is# 'style' + return g:ale#util#style_warning_priority + endif + + return g:ale#util#warning_priority + endif + + if get(a:item, 'sub_type', '') is# 'style' + return g:ale#util#style_error_priority + endif + + return g:ale#util#error_priority +endfunction + +" Compare two loclist items for ALE, sorted by their buffers, filenames, and +" line numbers and column numbers. +function! ale#util#LocItemCompare(left, right) abort + if a:left.bufnr < a:right.bufnr + return -1 + endif + + if a:left.bufnr > a:right.bufnr + return 1 + endif + + if a:left.bufnr == -1 + if a:left.filename < a:right.filename + return -1 + endif + + if a:left.filename > a:right.filename + return 1 + endif + endif + + if a:left.lnum < a:right.lnum + return -1 + endif + + if a:left.lnum > a:right.lnum + return 1 + endif + + if a:left.col < a:right.col + return -1 + endif + + if a:left.col > a:right.col + return 1 + endif + + " When either of the items lacks a problem type, then the two items should + " be considered equal. This is important for loclist jumping. + if !has_key(a:left, 'type') || !has_key(a:right, 'type') + return 0 + endif + + let l:left_priority = ale#util#GetItemPriority(a:left) + let l:right_priority = ale#util#GetItemPriority(a:right) + + if l:left_priority < l:right_priority + return -1 + endif + + if l:left_priority > l:right_priority + return 1 + endif + + return 0 +endfunction + +" Compare two loclist items, including the text for the items. +" +" This function can be used for de-duplicating lists. +function! ale#util#LocItemCompareWithText(left, right) abort + let l:cmp_value = ale#util#LocItemCompare(a:left, a:right) + + if l:cmp_value + return l:cmp_value + endif + + if a:left.text < a:right.text + return -1 + endif + + if a:left.text > a:right.text + return 1 + endif + + return 0 +endfunction + +" This function will perform a binary search and a small sequential search +" on the list to find the last problem in the buffer and line which is +" on or before the column. The index of the problem will be returned. +" +" -1 will be returned if nothing can be found. +function! ale#util#BinarySearch(loclist, buffer, line, column) abort + let l:min = 0 + let l:max = len(a:loclist) - 1 + + while 1 + if l:max < l:min + return -1 + endif + + let l:mid = (l:min + l:max) / 2 + let l:item = a:loclist[l:mid] + + " Binary search for equal buffers, equal lines, then near columns. + if l:item.bufnr < a:buffer + let l:min = l:mid + 1 + elseif l:item.bufnr > a:buffer + let l:max = l:mid - 1 + elseif l:item.lnum < a:line + let l:min = l:mid + 1 + elseif l:item.lnum > a:line + let l:max = l:mid - 1 + else + " This part is a small sequential search. + let l:index = l:mid + + " Search backwards to find the first problem on the line. + while l:index > 0 + \&& a:loclist[l:index - 1].bufnr == a:buffer + \&& a:loclist[l:index - 1].lnum == a:line + let l:index -= 1 + endwhile + + " Find the last problem on or before this column. + while l:index < l:max + \&& a:loclist[l:index + 1].bufnr == a:buffer + \&& a:loclist[l:index + 1].lnum == a:line + \&& a:loclist[l:index + 1].col <= a:column + let l:index += 1 + endwhile + + " Scan forwards to find the last item on the column for the item + " we found, which will have the most serious problem. + let l:item_column = a:loclist[l:index].col + + while l:index < l:max + \&& a:loclist[l:index + 1].bufnr == a:buffer + \&& a:loclist[l:index + 1].lnum == a:line + \&& a:loclist[l:index + 1].col == l:item_column + let l:index += 1 + endwhile + + return l:index + endif + endwhile +endfunction + +" A function for testing if a function is running inside a sandbox. +" See :help sandbox +function! ale#util#InSandbox() abort + try + let &l:equalprg=&l:equalprg + catch /E48/ + " E48 is the sandbox error. + return 1 + endtry + + return 0 +endfunction + +function! ale#util#Tempname() abort + let l:clear_tempdir = 0 + + if exists('$TMPDIR') && empty($TMPDIR) + let l:clear_tempdir = 1 + let $TMPDIR = '/tmp' + endif + + try + let l:name = tempname() " no-custom-checks + finally + if l:clear_tempdir + let $TMPDIR = '' + endif + endtry + + return l:name +endfunction + +" Given a single line, or a List of lines, and a single pattern, or a List +" of patterns, return all of the matches for the lines(s) from the given +" patterns, using matchlist(). +" +" Only the first pattern which matches a line will be returned. +function! ale#util#GetMatches(lines, patterns) abort + let l:matches = [] + let l:lines = type(a:lines) is v:t_list ? a:lines : [a:lines] + let l:patterns = type(a:patterns) is v:t_list ? a:patterns : [a:patterns] + + for l:line in l:lines + for l:pattern in l:patterns + let l:match = matchlist(l:line, l:pattern) + + if !empty(l:match) + call add(l:matches, l:match) + break + endif + endfor + endfor + + return l:matches +endfunction + +" Given a single line, or a List of lines, and a single pattern, or a List of +" patterns, and a callback function for mapping the items matches, return the +" result of mapping all of the matches for the lines from the given patterns, +" using matchlist() +" +" Only the first pattern which matches a line will be returned. +function! ale#util#MapMatches(lines, patterns, Callback) abort + return map(ale#util#GetMatches(a:lines, a:patterns), 'a:Callback(v:val)') +endfunction + +function! s:LoadArgCount(function) abort + try + let l:output = execute('function a:function') + catch /E123/ + return 0 + endtry + + let l:match = matchstr(split(l:output, "\n")[0], '\v\([^)]+\)')[1:-2] + let l:arg_list = filter(split(l:match, ', '), 'v:val isnot# ''...''') + + return len(l:arg_list) +endfunction + +" Given the name of a function, a Funcref, or a lambda, return the number +" of named arguments for a function. +function! ale#util#FunctionArgCount(function) abort + let l:Function = ale#util#GetFunction(a:function) + let l:count = s:LoadArgCount(l:Function) + + " If we failed to get the count, forcibly load the autoload file, if the + " function is an autoload function. autoload functions aren't normally + " defined until they are called. + if l:count == 0 + let l:function_name = matchlist(string(l:Function), 'function([''"]\(.\+\)[''"])')[1] + + if l:function_name =~# '#' + execute 'runtime autoload/' . join(split(l:function_name, '#')[:-2], '/') . '.vim' + let l:count = s:LoadArgCount(l:Function) + endif + endif + + return l:count +endfunction + +" Escape a string so the characters in it will be safe for use inside of PCRE +" or RE2 regular expressions without characters having special meanings. +function! ale#util#EscapePCRE(unsafe_string) abort + return substitute(a:unsafe_string, '\([\-\[\]{}()*+?.^$|]\)', '\\\1', 'g') +endfunction + +" Escape a string so that it can be used as a literal string inside an evaled +" vim command. +function! ale#util#EscapeVim(unsafe_string) abort + return "'" . substitute(a:unsafe_string, "'", "''", 'g') . "'" +endfunction + + +" Given a String or a List of String values, try and decode the string(s) +" as a JSON value which can be decoded with json_decode. If the JSON string +" is invalid, the default argument value will be returned instead. +" +" This function is useful in code where the data can't be trusted to be valid +" JSON, and where throwing exceptions is mostly just irritating. +function! ale#util#FuzzyJSONDecode(data, default) abort + if empty(a:data) + return a:default + endif + + let l:str = type(a:data) is v:t_string ? a:data : join(a:data, '') + + try + let l:result = json_decode(l:str) + + " Vim 8 only uses the value v:none for decoding blank strings. + if !has('nvim') && l:result is v:none + return a:default + endif + + return l:result + catch /E474\|E491/ + return a:default + endtry +endfunction + +" Write a file, including carriage return characters for DOS files. +" +" The buffer number is required for determining the fileformat setting for +" the buffer. +function! ale#util#Writefile(buffer, lines, filename) abort + let l:corrected_lines = getbufvar(a:buffer, '&fileformat') is# 'dos' + \ ? map(copy(a:lines), 'substitute(v:val, ''\r*$'', ''\r'', '''')') + \ : a:lines + + " Set binary flag if buffer doesn't have eol and nofixeol to avoid appending newline + let l:flags = !getbufvar(a:buffer, '&eol') && exists('+fixeol') && !&fixeol ? 'bS' : 'S' + + call writefile(l:corrected_lines, a:filename, l:flags) " no-custom-checks +endfunction + +if !exists('s:patial_timers') + let s:partial_timers = {} +endif + +function! s:ApplyPartialTimer(timer_id) abort + if has_key(s:partial_timers, a:timer_id) + let [l:Callback, l:args] = remove(s:partial_timers, a:timer_id) + call call(l:Callback, [a:timer_id] + l:args) + endif +endfunction + +" Given a delay, a callback, a List of arguments, start a timer with +" timer_start() and call the callback provided with [timer_id] + args. +" +" The timer must not be stopped with timer_stop(). +" Use ale#util#StopPartialTimer() instead, which can stop any timer, and will +" clear any arguments saved for executing callbacks later. +function! ale#util#StartPartialTimer(delay, callback, args) abort + let l:timer_id = timer_start(a:delay, function('s:ApplyPartialTimer')) + let s:partial_timers[l:timer_id] = [a:callback, a:args] + + return l:timer_id +endfunction + +function! ale#util#StopPartialTimer(timer_id) abort + call timer_stop(a:timer_id) + + if has_key(s:partial_timers, a:timer_id) + call remove(s:partial_timers, a:timer_id) + endif +endfunction + +" Given a possibly multi-byte string and a 1-based character position on a +" line, return the 1-based byte position on that line. +function! ale#util#Col(str, chr) abort + if a:chr < 2 + return a:chr + endif + + return strlen(join(split(a:str, '\zs')[0:a:chr - 2], '')) + 1 +endfunction + +function! ale#util#FindItemAtCursor(buffer) abort + let l:info = get(g:ale_buffer_info, a:buffer, {}) + let l:loclist = get(l:info, 'loclist', []) + let l:pos = getpos('.') + let l:index = ale#util#BinarySearch(l:loclist, a:buffer, l:pos[1], l:pos[2]) + let l:loc = l:index >= 0 ? l:loclist[l:index] : {} + + return [l:info, l:loc] +endfunction + +function! ale#util#Input(message, value, ...) abort + if a:0 > 0 + return input(a:message, a:value, a:1) + else + return input(a:message, a:value) + endif +endfunction + +function! ale#util#HasBuflineApi() abort + return exists('*deletebufline') && exists('*setbufline') +endfunction + +" Sets buffer contents to lines +function! ale#util#SetBufferContents(buffer, lines) abort + let l:has_bufline_api = ale#util#HasBuflineApi() + + if !l:has_bufline_api && a:buffer isnot bufnr('') + return + endif + + " If the file is in DOS mode, we have to remove carriage returns from + " the ends of lines before calling setline(), or we will see them + " twice. + let l:new_lines = getbufvar(a:buffer, '&fileformat') is# 'dos' + \ ? map(copy(a:lines), 'substitute(v:val, ''\r\+$'', '''', '''')') + \ : a:lines + let l:first_line_to_remove = len(l:new_lines) + 1 + + " Use a Vim API for setting lines in other buffers, if available. + if l:has_bufline_api + call setbufline(a:buffer, 1, l:new_lines) + call deletebufline(a:buffer, l:first_line_to_remove, '$') + " Fall back on setting lines the old way, for the current buffer. + else + let l:old_line_length = line('$') + + if l:old_line_length >= l:first_line_to_remove + let l:save = winsaveview() + silent execute + \ l:first_line_to_remove . ',' . l:old_line_length . 'd_' + call winrestview(l:save) + endif + + call setline(1, l:new_lines) + endif + + return l:new_lines +endfunction + +function! ale#util#GetBufferContents(buffer) abort + return join(getbufline(a:buffer, 1, '$'), '\n') . '\n' +endfunction + +function! ale#util#ToURI(resource) abort + let l:uri_handler = ale#uri#GetURIHandler(a:resource) + + if l:uri_handler is# v:null + " resource is a filesystem path + let l:uri = ale#path#ToFileURI(a:resource) + else + " resource is a URI + let l:uri = a:resource + endif + + return l:uri +endfunction + +function! ale#util#ToResource(uri) abort + let l:uri_handler = ale#uri#GetURIHandler(a:uri) + + if l:uri_handler is# v:null + " resource is a filesystem path + let l:resource = ale#path#FromFileURI(a:uri) + else + " resource is a URI + let l:resource = a:uri + endif + + return l:resource +endfunction diff --git a/dot_vim/plugged/ale/autoload/ale/virtualtext.vim b/dot_vim/plugged/ale/autoload/ale/virtualtext.vim new file mode 100644 index 0000000..0f2b217 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/ale/virtualtext.vim @@ -0,0 +1,248 @@ +scriptencoding utf-8 +" Author: w0rp +" Author: Luan Santos +" Description: Shows lint message for the current line as virtualtext, if any + +if !hlexists('ALEVirtualTextError') + highlight link ALEVirtualTextError Comment +endif + +if !hlexists('ALEVirtualTextStyleError') + highlight link ALEVirtualTextStyleError ALEVirtualTextError +endif + +if !hlexists('ALEVirtualTextWarning') + highlight link ALEVirtualTextWarning Comment +endif + +if !hlexists('ALEVirtualTextStyleWarning') + highlight link ALEVirtualTextStyleWarning ALEVirtualTextWarning +endif + +if !hlexists('ALEVirtualTextInfo') + highlight link ALEVirtualTextInfo ALEVirtualTextWarning +endif + +let g:ale_virtualtext_prefix = +\ get(g:, 'ale_virtualtext_prefix', '%comment% %type%: ') +" Controls the milliseconds delay before showing a message. +let g:ale_virtualtext_delay = get(g:, 'ale_virtualtext_delay', 10) + +let s:cursor_timer = get(s:, 'cursor_timer', -1) +let s:last_pos = get(s:, 'last_pos', [0, 0, 0]) +let s:hl_list = get(s:, 'hl_list', []) +let s:last_message = '' + +if !has_key(s:, 'has_virt_text') + let s:has_virt_text = 0 + let s:emulate_virt = 0 + let s:last_virt = -1 + + if has('nvim-0.3.2') + let s:ns_id = nvim_create_namespace('ale') + let s:has_virt_text = 1 + elseif has('textprop') && has('popupwin') + let s:has_virt_text = 1 + let s:emulate_virt = !has('patch-9.0.0297') + + if s:emulate_virt + call prop_type_add('ale', {}) + endif + endif +endif + +function! s:StopCursorTimer() abort + if s:cursor_timer != -1 + call timer_stop(s:cursor_timer) + let s:cursor_timer = -1 + endif +endfunction + +function! ale#virtualtext#ResetDataForTests() abort + let s:last_pos = [0, 0, 0] + let s:last_message = '' +endfunction + +function! ale#virtualtext#GetLastMessageForTests() abort + return s:last_message +endfunction + +function! ale#virtualtext#GetComment(buffer) abort + let l:filetype = getbufvar(a:buffer, '&filetype') + let l:split = split(getbufvar(a:buffer, '&commentstring'), '%s') + + return !empty(l:split) ? trim(l:split[0]) : '#' +endfunction + +function! ale#virtualtext#Clear(buffer) abort + if !s:has_virt_text || !bufexists(str2nr(a:buffer)) + return + endif + + if has('nvim') + call nvim_buf_clear_namespace(a:buffer, s:ns_id, 0, -1) + else + if s:emulate_virt && s:last_virt != -1 + call prop_remove({'type': 'ale'}) + call popup_close(s:last_virt) + let s:last_virt = -1 + elseif !empty(s:hl_list) + call prop_remove({ + \ 'types': s:hl_list, + \ 'all': 1, + \ 'bufnr': a:buffer, + \}) + endif + endif +endfunction + +function! ale#virtualtext#GetGroup(item) abort + let l:type = get(a:item, 'type', 'E') + let l:sub_type = get(a:item, 'sub_type', '') + + if l:type is# 'E' + if l:sub_type is# 'style' + return 'ALEVirtualTextStyleError' + endif + + return 'ALEVirtualTextError' + endif + + if l:type is# 'W' + if l:sub_type is# 'style' + return 'ALEVirtualTextStyleWarning' + endif + + return 'ALEVirtualTextWarning' + endif + + return 'ALEVirtualTextInfo' +endfunction + +function! ale#virtualtext#ShowMessage(buffer, item) abort + if !s:has_virt_text || !bufexists(str2nr(a:buffer)) + return + endif + + let l:line = max([1, a:item.lnum]) + let l:hl_group = ale#virtualtext#GetGroup(a:item) + + " Get a language-appropriate comment character, or default to '#'. + let l:comment = ale#virtualtext#GetComment(a:buffer) + let l:prefix = ale#Var(a:buffer, 'virtualtext_prefix') + let l:prefix = ale#GetLocItemMessage(a:item, l:prefix) + let l:prefix = substitute(l:prefix, '\V%comment%', '\=l:comment', 'g') + let l:msg = l:prefix . substitute(a:item.text, '\n', ' ', 'g') + + " Store the last message we're going to set so we can read it in tests. + let s:last_message = l:msg + + if has('nvim') + call nvim_buf_set_virtual_text( + \ a:buffer, + \ s:ns_id, l:line - 1, + \ [[l:msg, l:hl_group]], + \ {} + \) + elseif s:emulate_virt + let l:left_pad = col('$') + call prop_add(l:line, l:left_pad, {'type': 'ale'}) + let s:last_virt = popup_create(l:msg, { + \ 'line': -1, + \ 'padding': [0, 0, 0, 1], + \ 'mask': [[1, 1, 1, 1]], + \ 'textprop': 'ale', + \ 'highlight': l:hl_group, + \ 'fixed': 1, + \ 'wrap': 0, + \ 'zindex': 2 + \}) + else + let l:type = prop_type_get(l:hl_group) + + if l:type == {} + call prop_type_add(l:hl_group, {'highlight': l:hl_group}) + endif + + " Add highlight groups to the list so we can clear them later. + if index(s:hl_list, l:hl_group) == -1 + call add(s:hl_list, l:hl_group) + endif + + " We ignore all errors from prop_add. + silent! call prop_add(l:line, 0, { + \ 'type': l:hl_group, + \ 'text': ' ' . l:msg, + \ 'bufnr': a:buffer, + \}) + endif +endfunction + +function! ale#virtualtext#ShowCursorWarning(...) abort + if g:ale_virtualtext_cursor isnot# 'current' + \&& g:ale_virtualtext_cursor != 1 + return + endif + + let l:buffer = bufnr('') + + if mode(1) isnot# 'n' + return + endif + + if ale#ShouldDoNothing(l:buffer) + return + endif + + let [l:info, l:item] = ale#util#FindItemAtCursor(l:buffer) + call ale#virtualtext#Clear(l:buffer) + + if !empty(l:item) + call ale#virtualtext#ShowMessage(l:buffer, l:item) + endif +endfunction + +function! ale#virtualtext#ShowCursorWarningWithDelay() abort + let l:buffer = bufnr('') + + if g:ale_virtualtext_cursor isnot# 'current' + \&& g:ale_virtualtext_cursor != 1 + return + endif + + if mode(1) isnot# 'n' + return + endif + + call s:StopCursorTimer() + + let l:pos = getpos('.')[0:2] + + " Check the current buffer, line, and column number against the last + " recorded position. If the position has actually changed, *then* + " we should show something. Otherwise we can end up doing processing + " the show message far too frequently. + if l:pos != s:last_pos + let l:delay = ale#Var(l:buffer, 'virtualtext_delay') + + let s:last_pos = l:pos + let s:cursor_timer = timer_start( + \ l:delay, + \ function('ale#virtualtext#ShowCursorWarning') + \) + endif +endfunction + +function! ale#virtualtext#SetTexts(buffer, loclist) abort + if !has('nvim') && s:emulate_virt + return + endif + + call ale#virtualtext#Clear(a:buffer) + + for l:item in a:loclist + if l:item.bufnr == a:buffer + call ale#virtualtext#ShowMessage(a:buffer, l:item) + endif + endfor +endfunction diff --git a/dot_vim/plugged/ale/autoload/asyncomplete/sources/ale.vim b/dot_vim/plugged/ale/autoload/asyncomplete/sources/ale.vim new file mode 100644 index 0000000..ce79377 --- /dev/null +++ b/dot_vim/plugged/ale/autoload/asyncomplete/sources/ale.vim @@ -0,0 +1,26 @@ +function! asyncomplete#sources#ale#get_source_options(...) abort + let l:default = extend({ + \ 'name': 'ale', + \ 'completor': function('asyncomplete#sources#ale#completor'), + \ 'whitelist': ['*'], + \ 'triggers': asyncomplete#sources#ale#get_triggers(), + \ }, a:0 >= 1 ? a:1 : {}) + + return extend(l:default, {'refresh_pattern': '\k\+$'}) +endfunction + +function! asyncomplete#sources#ale#get_triggers() abort + let l:triggers = ale#completion#GetAllTriggers() + let l:triggers['*'] = l:triggers[''] + + return l:triggers +endfunction + +function! asyncomplete#sources#ale#completor(options, context) abort + let l:keyword = matchstr(a:context.typed, '\w\+$') + let l:startcol = a:context.col - len(l:keyword) + + call ale#completion#GetCompletions('ale-callback', { 'callback': {completions -> + \ asyncomplete#complete(a:options.name, a:context, l:startcol, completions) + \ }}) +endfunction diff --git a/dot_vim/plugged/ale/doc/ale-ada.txt b/dot_vim/plugged/ale/doc/ale-ada.txt new file mode 100644 index 0000000..80321db --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-ada.txt @@ -0,0 +1,71 @@ +=============================================================================== +ALE Ada Integration *ale-ada-options* + + +=============================================================================== +cspell *ale-ada-cspell* + +See |ale-cspell-options| + +=============================================================================== +gcc *ale-ada-gcc* + +g:ale_ada_gcc_executable *g:ale_ada_gcc_executable* + *b:ale_ada_gcc_executable* + Type: |String| + Default: `'gcc'` + +This variable can be changed to use a different executable for gcc. + + +g:ale_ada_gcc_options *g:ale_ada_gcc_options* + *b:ale_ada_gcc_options* + Type: |String| + Default: `'-gnatwa -gnatq'` + + This variable can be set to pass additional options to gcc. + + +=============================================================================== +gnatpp *ale-ada-gnatpp* + +g:ale_ada_gnatpp_options *g:ale_ada_gnatpp_options* + *b:ale_ada_gnatpp_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to the gnatpp fixer. + + +=============================================================================== +ada-language-server *ale-ada-language-server* + +g:ale_ada_adals_executable *g:ale_ada_adals_executable* + *b:ale_ada_adals_executable* + Type: |String| + Default: `'ada_language_server'` + + This variable can be changed to use a different executable for Ada Language + Server. + + +g:ale_ada_adals_project *g:ale_ada_adals_project* + *b:ale_ada_adals_project* + Type: |String| + Default: `'default.gpr'` + +This variable can be changed to use a different GPR file for +Ada Language Server. + + +g:ale_ada_adals_encoding *g:ale_ada_adals_encoding* + *b:ale_ada_adals_encoding* + Type: |String| + Default: `'utf-8'` + +This variable can be changed to use a different file encoding for +Ada Language Server. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-ansible.txt b/dot_vim/plugged/ale/doc/ale-ansible.txt new file mode 100644 index 0000000..41442b0 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-ansible.txt @@ -0,0 +1,39 @@ +=============================================================================== +ALE Ansible Integration *ale-ansible-options* + +=============================================================================== +ansible-language-server *ale-ansible-language-server* + + +g:ale_ansible_language_server_executable *g:ale_ansible_language_server* + *b:ale_ansible_language_server* + + Type: |String| + Default: 'ansible-language-server' + + Variable can be used to modify the executable used for ansible language server. + + +g:ale_ansible_language_server_config *g:ale_ansible_language_server_config* + *b:ale_ansible_language_server_config* + + Type: |Dictionary| + Default: '{}' + + Configuration parameters sent to the language server on start. Refer to the + ansible language server configuration documentation for list of available + options: https://als.readthedocs.io/en/latest/settings/ + +=============================================================================== +ansible-lint *ale-ansible-ansible-lint* + +g:ale_ansible_ansible_lint_executable *g:ale_ansible_ansible_lint_executable* + *b:ale_ansible_ansible_lint_executable* + Type: |String| + Default: `'ansible-lint'` + + This variable can be changed to modify the executable used for ansible-lint. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-apkbuild.txt b/dot_vim/plugged/ale/doc/ale-apkbuild.txt new file mode 100644 index 0000000..0526140 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-apkbuild.txt @@ -0,0 +1,30 @@ +=============================================================================== +ALE APKBUILD Integration *ale-apkbuild-options* + + +=============================================================================== +apkbuild-lint *ale-apkbuild-apkbuild-lint* + +g:ale_apkbuild_apkbuild_lint_executable + *g:ale_apkbuild_apkbuild_lint_executable* + *b:ale_apkbuild_apkbuild_lint_executable* + + Type: |String| + Default: `'apkbuild-lint'` + + This variable can be set to change the path to apkbuild-lint + +=============================================================================== +secfixes-check *ale-apkbuild-secfixes-check* + +g:ale_apkbuild_secfixes_check_executable + *g:ale_apkbuild_secfixes_check_executable* + *b:ale_apkbuild_secfixes_check_executable* + + Type: |String| + Default: `'secfixes-check'` + + This variable can be set to change the path to secfixes-check + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-asciidoc.txt b/dot_vim/plugged/ale/doc/ale-asciidoc.txt new file mode 100644 index 0000000..dd8b12f --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-asciidoc.txt @@ -0,0 +1,24 @@ +=============================================================================== +ALE AsciiDoc Integration *ale-asciidoc-options* + + +=============================================================================== +cspell *ale-asciidoc-cspell* + +See |ale-cspell-options| + + +=============================================================================== +write-good *ale-asciidoc-write-good* + +See |ale-write-good-options| + + +=============================================================================== +textlint *ale-asciidoc-textlint* + +See |ale-text-textlint| + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-asm.txt b/dot_vim/plugged/ale/doc/ale-asm.txt new file mode 100644 index 0000000..a97c6d0 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-asm.txt @@ -0,0 +1,25 @@ +=============================================================================== +ALE ASM Integration *ale-asm-options* + + +=============================================================================== +gcc *ale-asm-gcc* + +g:ale_asm_gcc_executable *g:ale_asm_gcc_executable* + *b:ale_asm_gcc_executable* + Type: |String| + Default: `'gcc'` + +This variable can be changed to use a different executable for gcc. + + +g:ale_asm_gcc_options *g:ale_asm_gcc_options* + *b:ale_asm_gcc_options* + Type: |String| + Default: `'-Wall'` + + This variable can be set to pass additional options to gcc. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-avra.txt b/dot_vim/plugged/ale/doc/ale-avra.txt new file mode 100644 index 0000000..a61913a --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-avra.txt @@ -0,0 +1,26 @@ +=============================================================================== +ALE AVRA Integration *ale-avra-options* + + +=============================================================================== +avra *ale-avra-avra* + +g:ale_avra_avra_executable *g:ale_avra_avra_executable* + *b:ale_avra_avra_executable* + + Type: |String| + Default `'avra'` + + This variable can be changed to use different executable for AVRA. + + +g:ale_avra_avra_options *g:ale_avra_avra_options* + *b:ale_avra_avra_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to AVRA. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-awk.txt b/dot_vim/plugged/ale/doc/ale-awk.txt new file mode 100644 index 0000000..b9c5c34 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-awk.txt @@ -0,0 +1,25 @@ +=============================================================================== +ALE Awk Integration *ale-awk-options* + + +=============================================================================== +gawk *ale-awk-gawk* + +g:ale_awk_gawk_executable *g:ale_awk_gawk_executable* + *b:ale_awk_gawk_executable* + Type: |String| + Default: `'gawk'` + + This variable sets executable used for gawk. + + +g:ale_awk_gawk_options *g:ale_awk_gawk_options* + *b:ale_awk_gawk_options* + Type: |String| + Default: `''` + + With this variable we are able to pass extra arguments for gawk + for invocation. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-bats.txt b/dot_vim/plugged/ale/doc/ale-bats.txt new file mode 100644 index 0000000..cf2199e --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-bats.txt @@ -0,0 +1,13 @@ +=============================================================================== +ALE Bats Integration *ale-bats-options* + + +=============================================================================== +shellcheck *ale-bats-shellcheck* + +The `shellcheck` linter for Bats uses the sh options for `shellcheck`; see: +|ale-sh-shellcheck|. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-bazel.txt b/dot_vim/plugged/ale/doc/ale-bazel.txt new file mode 100644 index 0000000..e2922aa --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-bazel.txt @@ -0,0 +1,28 @@ +=============================================================================== +ALE Bazel Integration *ale-bazel-options* + +=============================================================================== +buildifier *ale-bazel-buildifier* + +g:ale_bazel_buildifier_executable *g:ale_bazel_buildifier_executable* + *b:ale_bazel_buildifier_executable* + Type: |String| + Default: `'buildifier'` + + See |ale-integrations-local-executables| + + +g:ale_bazel_buildifier_options *g:ale_bazel_buildifier_options* + *b:ale_bazel_buildifier_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to buildifier. + + +g:ale_bazel_buildifier_use_global *g:ale_bazel_buildifier_use_global* + *b:ale_bazel_buildifier_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| diff --git a/dot_vim/plugged/ale/doc/ale-bib.txt b/dot_vim/plugged/ale/doc/ale-bib.txt new file mode 100644 index 0000000..35998c3 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-bib.txt @@ -0,0 +1,19 @@ +=============================================================================== +ALE BibTeX Integration *ale-bib-options* + + +=============================================================================== +bibclean *ale-bib-bibclean* + +g:ale_bib_bibclean_executable *g:ale_bib_bibclean_executable* + + Type: |String| + Default: `'bibclean'` + +g:ale_bib_bibclean_options *g:ale_bib_bibclean_options* + + Type: |String| + Default: `'-align-equals'` + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-bicep.txt b/dot_vim/plugged/ale/doc/ale-bicep.txt new file mode 100644 index 0000000..d26d67b --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-bicep.txt @@ -0,0 +1,24 @@ +=============================================================================== +ALE Bicep Integration *ale-bicep-options* + + +=============================================================================== +bicep *ale-bicep-bicep* + +g:ale_bicep_bicep_executable *g:ale_bicep_bicep_executable* + *b:ale_bicep_bicep_executable* + Type: |String| + Default: `'bicep'` + + This variable can be set to change the path to bicep. + + +g:ale_bicep_bicep_options *g:ale_bicep_bicep_options* + *b:ale_bicep_bicep_options* + Type: |String| + Default: `'build --outfile /dev/null'` + + This variable can be set to pass additional options to bicep. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-bitbake.txt b/dot_vim/plugged/ale/doc/ale-bitbake.txt new file mode 100644 index 0000000..4c480fd --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-bitbake.txt @@ -0,0 +1,31 @@ +=============================================================================== +ALE BitBake Integration *ale-bitbake-options* + + +=============================================================================== +oelint-adv *ale-bitbake-oelint_adv* + +g:ale_bitbake_oelint_adv_executable *g:ale_bitbake_oelint_adv_executable* + + Type: |String| + Default: `'oelint-adv'` + + This variable can be changed to use a different executable for oelint-adv. + +g:ale_bitbake_oelint_adv_options *g:ale_bitbake_oelint_adv_options* + + Type: |String| + Default: `''` + + This variable can be set to pass additional options to oelint-adv. + + g:ale_bitbake_oelint_adv_config *g:ale_bitbake_oelint_adv_config* + + Type: |String| + Default: `'.oelint.cfg'` + + This variable can be set to use a different config file. + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-c.txt b/dot_vim/plugged/ale/doc/ale-c.txt new file mode 100644 index 0000000..2993386 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-c.txt @@ -0,0 +1,451 @@ +=============================================================================== +ALE C Integration *ale-c-options* + +For basic checking of problems with C files, ALE offers the `cc` linter, which +runs either `clang`, or `gcc`. See |ale-c-cc|. + + +=============================================================================== +Global Options + +g:ale_c_always_make *g:ale_c_always_make* + *b:ale_c_always_make* + Type: |Number| + Default: `has('unix') && !has('macunix')` + + If set to `1`, use `--always-make` for `make`, which means that output will + always be parsed from `make` dry runs with GNU make. BSD `make` does not + support this option, so you probably want to turn this option off when using + a BSD variant. + + +g:ale_c_build_dir_names *g:ale_c_build_dir_names* + *b:ale_c_build_dir_names* + + Type: |List| + Default: `['build', 'bin']` + + A list of directory names to be used when searching upwards from cpp files + to discover compilation databases with. For directory named `'foo'`, ALE + will search for `'foo/compile_commands.json'` in all directories on and + above the directory containing the cpp file to find path to compilation + database. This feature is useful for the clang tools wrapped around + LibTooling (namely here, clang-tidy) + + +g:ale_c_build_dir *g:ale_c_build_dir* + *b:ale_c_build_dir* + + Type: |String| + Default: `''` + + For programs that can read `compile_commands.json` files, this option can be + set to the directory containing the file for the project. ALE will try to + determine the location of `compile_commands.json` automatically, but if your + file exists in some other directory, you can set this option so ALE will + know where it is. + + This directory will be searched instead of |g:ale_c_build_dir_names|. + + +g:ale_c_parse_compile_commands *g:ale_c_parse_compile_commands* + *b:ale_c_parse_compile_commands* + Type: |Number| + Default: `1` + + If set to `1`, ALE will parse `compile_commands.json` files to automatically + determine flags for C or C++ compilers. ALE will first search for the + nearest `compile_commands.json` file, and then look for + `compile_commands.json` files in the directories for + |g:ale_c_build_dir_names|. + + +g:ale_c_parse_makefile *g:ale_c_parse_makefile* + *b:ale_c_parse_makefile* + Type: |Number| + Default: `0` + + If set to `1`, ALE will run `make -n` to automatically determine flags to + set for C or C++ compilers. This can make it easier to determine the correct + build flags to use for different files. + + NOTE: When using this option on BSD, you may need to set + |g:ale_c_always_make| to `0`, and `make -n` will not provide consistent + results if binaries have already been built, so use `make clean` when + editing your files. + + WARNING: Running `make -n` automatically can execute arbitrary code, even + though it's supposed to be a dry run, so enable this option with care. You + might prefer to use the buffer-local version of the option instead with + |g:ale_pattern_options|, or you own code for checking which project you're + in. + + You might want to disable this option if `make -n` takes too long to run for + projects you work on. + + If |g:ale_c_parse_compile_commands| or |b:ale_c_parse_compile_commands| is + set to `1`, flags taken from `compile_commands.json` will be preferred over + `make -n` output. + + +=============================================================================== +astyle *ale-c-astyle* + +g:ale_c_astyle_executable *g:ale_c_astyle_executable* + *b:ale_c_astyle_executable* + Type: |String| + Default: `'astyle'` + + This variable can be changed to use a different executable for astyle. + + +g:ale_c_astyle_project_options *g:ale_c_astyle_project_options* + *b:ale_c_astyle_project_options* + Type: |String| + Default: `''` + + This variable can be changed to use an option file for project level + configurations. Provide only the filename of the option file that should be + present at the project's root directory. + + For example, if .astylrc is specified, the file is searched in the parent + directories of the source file's directory. + + +=============================================================================== +cc *ale-c-cc* + *ale-c-gcc* + *ale-c-clang* + +g:ale_c_cc_executable *g:ale_c_cc_executable* + *b:ale_c_cc_executable* + Type: |String| + Default: `''` + + This variable can be changed to use a different executable for a C compiler. + + ALE will try to use `clang` if Clang is available, otherwise ALE will + default to checking C code with `gcc`. + + +g:ale_c_cc_options *g:ale_c_cc_options* + *b:ale_c_cc_options* + Type: |String| + Default: `'-std=c11 -Wall'` + + This variable can be changed to modify flags given to the C compiler. + + +g:ale_c_cc_use_header_lang_flag *g:ale_c_cc_use_header_lang_flag* + *b:ale_c_cc_use_header_lang_flag* + Type: |Number| + Default: `-1` + + By default, ALE will use `'-x c-header'` instead of `'-x c'` for header files + when using Clang. + + This variable can be changed to manually activate or deactivate this flag + for header files. + + - When set to `-1`, the default beviour is used, `'-x c-header'` is used with + Clang and `'-x c'` is used with other compilers. + - When set to `0`, the flag is deactivated, `'-x c'` is always used + independently of the compiler. + - When set to `1`, the flag is activated, `'-x c-header'` is always used + independently of the compiler. + + Gcc does not support `'-x c-header'` when using `'-'` as input filename, + which is what ALE does. This why, by default, ALE only uses `'-x c-header'` + with Clang. + + +g:ale_c_cc_header_exts *g:ale_c_cc_header_exts* + *b:ale_c_cc_header_exts* + Type: |List| + Default: `['h']` + + This variable can be changed to modify the list of extensions of the files + considered as header files. + + This variable is only used when `'-x c-header'` is used instead of `'-x c'`, + see |ale_c_cc_use_header_lang_flag|. + + +=============================================================================== +ccls *ale-c-ccls* + +g:ale_c_ccls_executable *g:ale_c_ccls_executable* + *b:ale_c_ccls_executable* + Type: |String| + Default: `'ccls'` + + This variable can be changed to use a different executable for ccls. + + +g:ale_c_ccls_init_options *g:ale_c_ccls_init_options* + *b:ale_c_ccls_init_options* + Type: |Dictionary| + Default: `{}` + + This variable can be changed to customize ccls initialization options. + Example: > + { + \ 'cacheDirectory': '/tmp/ccls', + \ 'cacheFormat': 'binary', + \ 'diagnostics': { + \ 'onOpen': 0, + \ 'opChange': 1000, + \ }, + \ } +< + Visit https://github.com/MaskRay/ccls/wiki/Initialization-options for all + available options and explanations. + + +=============================================================================== +clangd *ale-c-clangd* + +g:ale_c_clangd_executable *g:ale_c_clangd_executable* + *b:ale_c_clangd_executable* + Type: |String| + Default: `'clangd'` + + This variable can be changed to use a different executable for clangd. + + +g:ale_c_clangd_options *g:ale_c_clangd_options* + *b:ale_c_clangd_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clangd. + + +=============================================================================== +clang-format *ale-c-clangformat* + +g:ale_c_clangformat_executable *g:ale_c_clangformat_executable* + *b:ale_c_clangformat_executable* + Type: |String| + Default: `'clang-format'` + + This variable can be changed to use a different executable for clang-format. + + +g:ale_c_clangformat_options *g:ale_c_clangformat_options* + *b:ale_c_clangformat_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clang-format. + + +g:ale_c_clangformat_style_option *g:ale_c_clangformat_style_option* + *b:ale_c_clangformat_style_option* + Type: |String| + Default: `''` + + This variable can be changed to modify only the style flag given to + clang-format. The contents of the variable are passed directly to the -style + flag of clang-format. + + Example: > + { + \ BasedOnStyle: Microsoft, + \ ColumnLimit: 80, + \ AllowShortBlocksOnASingleLine: Always, + \ AllowShortFunctionsOnASingleLine: Inline, + \ } +< + If you set this variable, ensure you don't modify -style in + |g:ale_c_clangformat_options|, as this will cause clang-format to error. + + +g:ale_c_clangformat_use_local_file *g:ale_c_clangformat_use_local_file* + *b:ale_c_clangformat_use_local_file* + Type: |Number| + Default: `0` + + This variable can be changed to modify whether to use a local .clang-format + file. If the file is found, the flag '-style=file' is passed to clang-format + and any options configured via |g:ale_c_clangformat_style_option| are not + passed. + + If this option is enabled but no .clang-format file is found, default back to + |g:ale_c_clangformat_style_option|, if it set. + + If you set this variable, ensure you don't modify -style in + |g:ale_c_clangformat_options|, as this will cause clang-format to error. + + +=============================================================================== +clangtidy *ale-c-clangtidy* + +`clang-tidy` will be run only when files are saved to disk, so that +`compile_commands.json` files can be used. It is recommended to use this +linter in combination with `compile_commands.json` files. +Therefore, `clang-tidy` linter reads the options |g:ale_c_build_dir| and +|g:ale_c_build_dir_names|. Also, setting |g:ale_c_build_dir| actually +overrides |g:ale_c_build_dir_names|. + + +g:ale_c_clangtidy_checks *g:ale_c_clangtidy_checks* + *b:ale_c_clangtidy_checks* + Type: |List| + Default: `[]` + + The checks to enable for clang-tidy with the `-checks` argument. + + All options will be joined with commas, and escaped appropriately for + the shell. The `-checks` flag can be removed entirely by setting this + option to an empty List. + + Not all of clangtidy checks are applicable for C. You should consult the + clang documentation for an up-to-date list of compatible checks: + http://clang.llvm.org/extra/clang-tidy/checks/list.html + + +g:ale_c_clangtidy_executable *g:ale_c_clangtidy_executable* + *b:ale_c_clangtidy_executable* + Type: |String| + Default: `'clang-tidy'` + + This variable can be changed to use a different executable for clangtidy. + + +g:ale_c_clangtidy_options *g:ale_c_clangtidy_options* + *b:ale_c_clangtidy_options* + Type: |String| + Default: `''` + + This variable can be changed to modify compiler flags given to clang-tidy. + + - Setting this variable to a non-empty string, + - and working in a buffer where no compilation database is found using + |g:ale_c_build_dir_names| or |g:ale_c_build_dir|, + will cause the `--` argument to be passed to `clang-tidy`, which will mean + that detection of `compile_commands.json` files for compile command + databases will be disabled. + Only set this option if you want to control compiler flags + entirely manually, and no `compile_commands.json` file is in one + of the |g:ale_c_build_dir_names| directories of the project tree. + + +g:ale_c_clangtidy_extra_options *g:ale_c_clangtidy_extra_options* + *b:ale_c_clangtidy_extra_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clang-tidy. + + +g:ale_c_clangtidy_fix_errors *g:ale_c_clangtidy_fix_errors* + *b:ale_c_clangtidy_fix_errors* + Type: |Number| + Default: `1` + + This variable can be changed to disable the `-fix-errors` option for the + |clangtidy| fixer. + + +=============================================================================== +cppcheck *ale-c-cppcheck* + +g:ale_c_cppcheck_executable *g:ale_c_cppcheck_executable* + *b:ale_c_cppcheck_executable* + Type: |String| + Default: `'cppcheck'` + + This variable can be changed to use a different executable for cppcheck. + + +g:ale_c_cppcheck_options *g:ale_c_cppcheck_options* + *b:ale_c_cppcheck_options* + Type: |String| + Default: `'--enable=style'` + + This variable can be changed to modify flags given to cppcheck. + + +=============================================================================== +cquery *ale-c-cquery* + +g:ale_c_cquery_executable *g:ale_c_cquery_executable* + *b:ale_c_cquery_executable* + Type: |String| + Default: `'cquery'` + + This variable can be changed to use a different executable for cquery. + + +g:ale_cpp_cquery_cache_directory *g:ale_c_cquery_cache_directory* + *b:ale_c_cquery_cache_directory* + Type: |String| + Default: `'~/.cache/cquery'` + + This variable can be changed to decide which directory cquery uses for its +cache. + + +=============================================================================== +cspell *ale-c-cspell* + +See |ale-cspell-options| + + +=============================================================================== +flawfinder *ale-c-flawfinder* + +g:ale_c_flawfinder_executable *g:ale_c_flawfinder_executable* + *b:ale_c_flawfinder_executable* + Type: |String| + Default: `'flawfinder'` + + This variable can be changed to use a different executable for flawfinder. + + +g:ale_c_flawfinder_minlevel *g:ale_c_flawfinder_minlevel* + *b:ale_c_flawfinder_minlevel* + Type: |Number| + Default: `1` + + This variable can be changed to ignore risks under the given risk threshold. + + +g:ale_c_flawfinder_options *g:ale-c-flawfinder* + *b:ale-c-flawfinder* + Type: |String| + Default: `''` + + This variable can be used to pass extra options into the flawfinder command. + +g:ale_c_flawfinder_error_severity *g:ale_c_flawfinder_error_severity* + *b:ale_c_flawfinder_error_severity* + Type: |Number| + Default: `6` + + This variable can be changed to set the minimum severity to be treated as an + error. This setting also applies to flawfinder for c++. + + +=============================================================================== +uncrustify *ale-c-uncrustify* + +g:ale_c_uncrustify_executable *g:ale_c_uncrustify_executable* + *b:ale_c_uncrustify_executable* + Type: |String| + Default: `'uncrustify'` + + This variable can be changed to use a different executable for uncrustify. + + +g:ale_c_uncrustify_options *g:ale_c_uncrustify_options* + *b:ale_c_uncrustify_options* + Type: |String| + Default: `''` + + This variable can be change to modify flags given to uncrustify. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-cairo.txt b/dot_vim/plugged/ale/doc/ale-cairo.txt new file mode 100644 index 0000000..0a78e68 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-cairo.txt @@ -0,0 +1,15 @@ +=============================================================================== +ALE Cairo Integration *ale-cairo-options* + + +=============================================================================== +starknet *ale-cairo-starknet* + +g:ale_cairo_starknet_executable *g:ale_cairo_starknet_executable* + *b:ale_cairo_starknet_executable* + + Default: `'starknet-compile'` + + Overrides the starknet-compile binary after installing the cairo-language. + + For more information read 'https://starknet.io/docs/quickstart.html' diff --git a/dot_vim/plugged/ale/doc/ale-chef.txt b/dot_vim/plugged/ale/doc/ale-chef.txt new file mode 100644 index 0000000..75e144e --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-chef.txt @@ -0,0 +1,46 @@ +=============================================================================== +ALE Chef Integration *ale-chef-options* + + +=============================================================================== +cookstyle *ale-chef-cookstyle* + +g:ale_chef_cookstyle_options *g:ale_chef_cookstyle_options* + *b:ale_chef_cookstyle_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to cookstyle. + + +g:ale_chef_cookstyle_executable *g:ale_chef_cookstyle_executable* + *b:ale_chef_cookstyle_executable* + Type: |String| + Default: `'cookstyle'` + + This variable can be changed to point to the cookstyle binary in case it's + not on the $PATH or a specific version/path must be used. + + +=============================================================================== +foodcritic *ale-chef-foodcritic* + +g:ale_chef_foodcritic_options *g:ale_chef_foodcritic_options* + *b:ale_chef_foodcritic_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to foodcritic. + + +g:ale_chef_foodcritic_executable *g:ale_chef_foodcritic_executable* + *b:ale_chef_foodcritic_executable* + Type: |String| + Default: `'foodcritic'` + + This variable can be changed to point to the foodcritic binary in case it's + not on the $PATH or a specific version/path must be used. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-clojure.txt b/dot_vim/plugged/ale/doc/ale-clojure.txt new file mode 100644 index 0000000..3ff367f --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-clojure.txt @@ -0,0 +1,36 @@ +=============================================================================== +ALE Clojure Integration *ale-clojure-options* + + +=============================================================================== +clj-kondo *ale-clojure-clj-kondo* + +A minimal and opinionated linter for code that sparks joy. + +https://github.com/borkdude/clj-kondo + +g:ale_clojure_clj_kondo_options *g:ale_clojure_clj_kondo_options* + *b:ale_clojure_clj_kondo_options* + Type: |String| + Default: `'--cache'` + + This variable can be changed to modify options passed to clj-kondo. + + +=============================================================================== +joker *ale-clojure-joker* + +Joker is a small Clojure interpreter and linter written in Go. + +https://github.com/candid82/joker + +Linting options are not configurable by ale, but instead are controlled by a +`.joker` file in same directory as the file (or current working directory if +linting stdin), a parent directory relative to the file, or the users home +directory. + +see https://github.com/candid82/joker#linter-mode for more information. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: + diff --git a/dot_vim/plugged/ale/doc/ale-cloudformation.txt b/dot_vim/plugged/ale/doc/ale-cloudformation.txt new file mode 100644 index 0000000..9724403 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-cloudformation.txt @@ -0,0 +1,46 @@ +=============================================================================== +ALE CloudFormation Integration *ale-cloudformation-options* + + +=============================================================================== +cfn-python-lint *ale-cloudformation-cfn-python-lint* + +cfn-python-lint is a linter for AWS CloudFormation template file. + +Website: https://github.com/awslabs/cfn-python-lint + +Installation +------------------------------------------------------------------------------- + + +Install cfn-python-lint using either pip or brew: > + +`pip install cfn-lint`. If pip is not available, run +`python setup.py clean --all` then `python setup.py install`. + + Homebrew (macOS): + +`brew install cfn-lint` + +< +Configuration +------------------------------------------------------------------------------- + +To get cloudformation linter to work on only CloudFormation files we must set +the buffer |filetype| to yaml.cloudformation. +This causes ALE to lint the file with linters configured for cloudformation and +yaml files. + +Just put: + +> + + au BufRead,BufNewFile *.template.yaml set filetype=yaml.cloudformation + +< + +on `ftdetect/cloudformation.vim` + +This will get both cloudformation and yaml linters to work on any file with `.template.yaml` ext. +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-cmake.txt b/dot_vim/plugged/ale/doc/ale-cmake.txt new file mode 100644 index 0000000..e44c328 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-cmake.txt @@ -0,0 +1,62 @@ +=============================================================================== +ALE CMake Integration *ale-cmake-options* + + +=============================================================================== +cmakelint *ale-cmake-cmakelint* + +g:ale_cmake_cmakelint_executable *g:ale_cmake_cmakelint_executable* + *b:ale_cmake_cmakelint_executable* + Type: |String| + Default: `'cmakelint'` + + This variable can be set to change the path the cmakelint. + + +g:ale_cmake_cmakelint_options *g:ale_cmake_cmakelint_options* + *b:ale_cmake_cmakelint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to cmakelint. + + +=============================================================================== +cmake-lint *ale-cmake-cmake-lint* + +g:ale_cmake_cmake_lint_executable *g:ale_cmake_cmake_lint_executable* + *b:ale_cmake_cmake_lint_executable* + Type: |String| + Default: `'cmake-lint'` + + This variable can be set to change the path the cmake-lint. + + +g:ale_cmake_cmake_lint_options *g:ale_cmake_cmake_lint_options* + *b:ale_cmake_cmake_lint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to cmake-lint. + + +=============================================================================== +cmake-format *ale-cmake-cmakeformat* + +g:ale_cmake_cmakeformat_executable *g:ale_cmake_cmakeformat_executable* + *b:ale_cmake_cmakeformat_executable* + Type: |String| + Default: `'cmakeformat'` + + This variable can be set to change the path the cmake-format. + + +g:ale_cmake_cmakeformat_options *g:ale_cmake_cmakeformat_options* + *b:ale_cmake_cmakeformat_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to cmake-format. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-cpp.txt b/dot_vim/plugged/ale/doc/ale-cpp.txt new file mode 100644 index 0000000..1ed6d37 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-cpp.txt @@ -0,0 +1,401 @@ +=============================================================================== +ALE C++ Integration *ale-cpp-options* + +For basic checking of problems with C++ files, ALE offers the `cc` linter, +which runs either `clang++`, or `gcc`. See |ale-cpp-cc|. + + +=============================================================================== +Global Options + +The following C options also apply to some C++ linters too. + +* |g:ale_c_always_make| +* |g:ale_c_build_dir_names| +* |g:ale_c_build_dir| +* |g:ale_c_parse_makefile| +* |g:ale_c_parse_compile_commands| + + +=============================================================================== +astyle *ale-cpp-astyle* + +g:ale_cpp_astyle_executable *g:ale_cpp_astyle_executable* + *b:ale_cpp_astyle_executable* + Type: |String| + Default: `'astyle'` + + This variable can be changed to use a different executable for astyle. + + +g:ale_cpp_astyle_project_options *g:ale_cpp_astyle_project_options* + *b:ale_cpp_astyle_project_options* + Type: |String| + Default: `''` + + This variable can be changed to use an option file for project level + configurations. Provide only the filename of the option file that should be + present at the project's root directory. + + For example, if .astylrc is specified, the file is searched in the parent + directories of the source file's directory. + + +=============================================================================== +cc *ale-cpp-cc* + *ale-cpp-gcc* + *ale-cpp-clang* + +g:ale_cpp_cc_executable *g:ale_cpp_cc_executable* + *b:ale_cpp_cc_executable* + Type: |String| + Default: `''` + + This variable can be changed to use a different executable for a C++ compiler. + + ALE will try to use `clang++` if Clang is available, otherwise ALE will + default to checking C++ code with `gcc`. + + +g:ale_cpp_cc_options *g:ale_cpp_cc_options* + *b:ale_cpp_cc_options* + Type: |String| + Default: `'-std=c++14 -Wall'` + + This variable can be changed to modify flags given to the C++ compiler. + + +g:ale_cpp_cc_use_header_lang_flag *g:ale_cpp_cc_use_header_lang_flag* + *b:ale_cpp_cc_use_header_lang_flag* + Type: |Number| + Default: `-1` + + By default, ALE will use `'-x c++-header'` instead of `'-x c++'` for header + files when using Clang. + + This variable can be changed to manually activate or deactivate this flag + for header files. + + - When set to `-1`, the default beviour is used, `'-x c++-header'` is used with + Clang and `'-x c++'` is used with other compilers. + - When set to `0`, the flag is deactivated, `'-x c++'` is always used + independently of the compiler. + - When set to `1`, the flag is activated, `'-x c++-header'` is always used + independently of the compiler. + + Gcc does not support `'-x c++-header'` when using `'-'` as input filename, + which is what ALE does. This why, by default, ALE only uses `'-x c++-header'` + with Clang. + + +g:ale_cpp_cc_header_exts *g:ale_cpp_cc_header_exts* + *b:ale_cpp_cc_header_exts* + Type: |List| + Default: `['h', 'hpp']` + + This variable can be changed to modify the list of extensions of the files + considered as header files. + + This variable is only used when `'-x c++-header'` is used instead of `'-x c++'`, + see |ale_cpp_cc_use_header_lang_flag|. + + +=============================================================================== +ccls *ale-cpp-ccls* + +g:ale_cpp_ccls_executable *g:ale_cpp_ccls_executable* + *b:ale_cpp_ccls_executable* + Type: |String| + Default: `'ccls'` + + This variable can be changed to use a different executable for ccls. + + +g:ale_cpp_ccls_init_options *g:ale_cpp_ccls_init_options* + *b:ale_cpp_ccls_init_options* + Type: |Dictionary| + Default: `{}` + + This variable can be changed to customize ccls initialization options. + Example: > + { + \ 'cacheDirectory': '/tmp/ccls', + \ 'cacheFormat': 'binary', + \ 'diagnostics': { + \ 'onOpen': 0, + \ 'opChange': 1000, + \ }, + \ } +< + Visit https://github.com/MaskRay/ccls/wiki/Initialization-options for all + available options and explanations. + + +=============================================================================== +clangcheck *ale-cpp-clangcheck* + +`clang-check` will be run only when files are saved to disk, so that +`compile_commands.json` files can be used. It is recommended to use this +linter in combination with `compile_commands.json` files. +Therefore, `clang-check` linter reads the options |g:ale_c_build_dir| and +|g:ale_c_build_dir_names|. Also, setting |g:ale_c_build_dir| actually +overrides |g:ale_c_build_dir_names|. + + +g:ale_cpp_clangcheck_executable *g:ale_cpp_clangcheck_executable* + *b:ale_cpp_clangcheck_executable* + Type: |String| + Default: `'clang-check'` + + This variable can be changed to use a different executable for clangcheck. + + +g:ale_cpp_clangcheck_options *g:ale_cpp_clangcheck_options* + *b:ale_cpp_clangcheck_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clang-check. + + This variable should not be set to point to build subdirectory with + `-p path/to/build` option, as it is handled by the |g:ale_c_build_dir| + option. + + +=============================================================================== +clangd *ale-cpp-clangd* + +g:ale_cpp_clangd_executable *g:ale_cpp_clangd_executable* + *b:ale_cpp_clangd_executable* + Type: |String| + Default: `'clangd'` + + This variable can be changed to use a different executable for clangd. + + +g:ale_cpp_clangd_options *g:ale_cpp_clangd_options* + *b:ale_cpp_clangd_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clangd. + + +=============================================================================== +clang-format *ale-cpp-clangformat* + +See |ale-c-clangformat| for information about the available options. +Note that the C options are also used for C++. + + +=============================================================================== +clangtidy *ale-cpp-clangtidy* + +`clang-tidy` will be run only when files are saved to disk, so that +`compile_commands.json` files can be used. It is recommended to use this +linter in combination with `compile_commands.json` files. +Therefore, `clang-tidy` linter reads the options |g:ale_c_build_dir| and +|g:ale_c_build_dir_names|. Also, setting |g:ale_c_build_dir| actually +overrides |g:ale_c_build_dir_names|. + + +g:ale_cpp_clangtidy_checks *g:ale_cpp_clangtidy_checks* + *b:ale_cpp_clangtidy_checks* + Type: |List| + Default: `[]` + + The checks to enable for clang-tidy with the `-checks` argument. + + All options will be joined with commas, and escaped appropriately for + the shell. The `-checks` flag can be removed entirely by setting this + option to an empty List. + + +g:ale_cpp_clangtidy_executable *g:ale_cpp_clangtidy_executable* + *b:ale_cpp_clangtidy_executable* + Type: |String| + Default: `'clang-tidy'` + + This variable can be changed to use a different executable for clangtidy. + + +g:ale_cpp_clangtidy_options *g:ale_cpp_clangtidy_options* + *b:ale_cpp_clangtidy_options* + Type: |String| + Default: `''` + + This variable can be changed to modify compiler flags given to clang-tidy. + + - Setting this variable to a non-empty string, + - and working in a buffer where no compilation database is found using + |g:ale_c_build_dir_names| or |g:ale_c_build_dir|, + will cause the `--` argument to be passed to `clang-tidy`, which will mean + that detection of `compile_commands.json` files for compile command + databases will be disabled. + Only set this option if you want to control compiler flags + entirely manually, and no `compile_commands.json` file is in one + of the |g:ale_c_build_dir_names| directories of the project tree. + + +g:ale_cpp_clangtidy_extra_options *g:ale_cpp_clangtidy_extra_options* + *b:ale_cpp_clangtidy_extra_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clang-tidy. + + +g:ale_cpp_clangtidy_fix_errors *g:ale_cpp_clangtidy_fix_errors* + *b:ale_cpp_clangtidy_fix_errors* + Type: |Number| + Default: `1` + + This variable can be changed to disable the `-fix-errors` option for the + |clangtidy| fixer. + + +=============================================================================== +clazy *ale-cpp-clazy* + +g:ale_cpp_clazy_executable *g:ale_cpp_clazy_executable* + *b:ale_cpp_clazy_executable* + Type: |String| + Default: `'clazy-standalone'` + + This variable can be changed to use a different executable for clazy. + + +g:ale_cpp_clazy_checks *g:ale_cpp_clazy_checks* + *b:ale_cpp_clazy_checks* + Type: |List| + Default: `['level1']` + + The checks to enable for clazy with the `-checks` argument. + + All options will be joined with commas, and escaped appropriately for + the shell. The `-checks` flag can be removed entirely by setting this + option to an empty List. + + +g:ale_cpp_clazy_options *g:ale_cpp_clazy_options* + *b:ale_cpp_clazy_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clazy. + + +=============================================================================== +cppcheck *ale-cpp-cppcheck* + +g:ale_cpp_cppcheck_executable *g:ale_cpp_cppcheck_executable* + *b:ale_cpp_cppcheck_executable* + Type: |String| + Default: `'cppcheck'` + + This variable can be changed to use a different executable for cppcheck. + + +g:ale_cpp_cppcheck_options *g:ale_cpp_cppcheck_options* + *b:ale_cpp_cppcheck_options* + Type: |String| + Default: `'--enable=style'` + + This variable can be changed to modify flags given to cppcheck. + + +=============================================================================== +cpplint *ale-cpp-cpplint* + +g:ale_cpp_cpplint_executable *g:ale_cpp_cpplint_executable* + *b:ale_cpp_cpplint_executable* + Type: |String| + Default: `'cpplint'` + + This variable can be changed to use a different executable for cpplint. + + +g:ale_cpp_cpplint_options *g:ale_cpp_cpplint_options* + *b:ale_cpp_cpplint_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to cpplint. + +g:ale_c_cpplint_executable *g:ale_c_cpplint_executable* + *b:ale_c_cpplint_executable* + Type: |String| + Default: `'cpplint'` + + This variable can be changed to use a different executable for cpplint. + + +g:ale_c_cpplint_options *g:ale_c_cpplint_options* + *b:ale_c_cpplint_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to cpplint. + + +=============================================================================== +cquery *ale-cpp-cquery* + +g:ale_cpp_cquery_executable *g:ale_cpp_cquery_executable* + *b:ale_cpp_cquery_executable* + Type: |String| + Default: `'cquery'` + + This variable can be changed to use a different executable for cquery. + + +g:ale_cpp_cquery_cache_directory *g:ale_cpp_cquery_cache_directory* + *b:ale_cpp_cquery_cache_directory* + Type: |String| + Default: `'~/.cache/cquery'` + + This variable can be changed to decide which directory cquery uses for its + cache. + + +=============================================================================== +cspell *ale-cpp-cspell* + +See |ale-cspell-options| + + +=============================================================================== +flawfinder *ale-cpp-flawfinder* + +g:ale_cpp_flawfinder_executable *g:ale_cpp_flawfinder_executable* + *b:ale_cpp_flawfinder_executable* + Type: |String| + Default: `'flawfinder'` + + This variable can be changed to use a different executable for flawfinder. + + +g:ale_cpp_flawfinder_minlevel *g:ale_cpp_flawfinder_minlevel* + *b:ale_cpp_flawfinder_minlevel* + Type: |Number| + Default: `1` + + This variable can be changed to ignore risks under the given risk threshold. + + +g:ale_cpp_flawfinder_options *g:ale-cpp-flawfinder* + *b:ale-cpp-flawfinder* + Type: |String| + Default: `''` + + This variable can be used to pass extra options into the flawfinder command. + + +=============================================================================== +uncrustify *ale-cpp-uncrustify* + +See |ale-c-uncrustify| for information about the available options. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-cs.txt b/dot_vim/plugged/ale/doc/ale-cs.txt new file mode 100644 index 0000000..d9a9dc0 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-cs.txt @@ -0,0 +1,243 @@ +=============================================================================== +ALE C# Integration *ale-cs-options* + + +In addition to the linters that are provided with ALE, C# code can be checked +with the OmniSharp plugin. See here: https://github.com/OmniSharp/omnisharp-vim + + +=============================================================================== +clang-format *ale-cs-clangformat* + +See |ale-c-clangformat| for information about the available options. +Note that the C options are also used for C#. + + +=============================================================================== +csc *ale-cs-csc* + + The |ale-cs-csc| linter checks for semantic errors when files are opened or + saved. + + See |ale-lint-file-linters| for more information on linters which do not + check for problems while you type. + + The csc linter uses the mono csc compiler, providing full C# 7 and newer + support, to generate a temporary module target file (/t:module). The module + includes all '*.cs' files contained in the directory tree rooted at the path + defined by the |g:ale_cs_csc_source| or |b:ale_cs_csc_source| variable and + all sub directories. + + It will in future replace the |ale-cs-mcs| and |ale-cs-mcsc| linters as both + utilize the mcsc compiler which, according to the mono project, is no longer + actively developed, and only receives maintenance updates. However, because + the csc compiler does not support the -syntax option, this linter does not + offer any as-you-type syntax checking, similar to the |ale-cs-mcsc| linter. + + The paths to search for additional assembly files can be specified using the + |g:ale_cs_csc_assembly_path| or |b:ale_cs_csc_assembly_path| variables. + + NOTE: ALE will not find any errors in files apart from syntax errors if any + one of the source files contains a syntax error. Syntax errors must be fixed + first before other errors will be shown. + + +g:ale_cs_csc_options *g:ale_cs_csc_options* + *b:ale_cs_csc_options* + Type: |String| + Default: `''` + + This option can be set to pass additional arguments to the `csc` compiler. + + For example, to add the dotnet package which is not added per default: > + + let g:ale_cs_mcs_options = ' /warn:4 /langversion:7.2' +< + NOTE: the `/unsafe` option is always passed to `csc`. + + +g:ale_cs_csc_source *g:ale_cs_csc_source* + *b:ale_cs_csc_source* + Type: |String| + Default: `''` + + This variable defines the root path of the directory tree searched for the + '*.cs' files to be linted. If this option is empty, the source file's + directory will be used. + + NOTE: Currently it is not possible to specify sub directories and + directory sub trees which shall not be searched for *.cs files. + + +g:ale_cs_csc_assembly_path *g:ale_cs_csc_assembly_path* + *b:ale_cs_csc_assembly_path* + Type: |List| + Default: `[]` + + This variable defines a list of path strings to be searched for external + assembly files. The list is passed to the csc compiler using the `/lib:` + flag. + + +g:ale_cs_csc_assemblies *g:ale_cs_csc_assemblies* + *b:ale_cs_csc_assemblies* + Type: |List| + Default: `[]` + + This variable defines a list of external assembly (*.dll) files required + by the mono mcs compiler to generate a valid module target. The list is + passed the csc compiler using the `/r:` flag. + + For example: > + + " Compile C# programs with the Unity engine DLL file on Mac. + let g:ale_cs_mcsc_assemblies = [ + \ '/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll', + \ 'path-to-unityproject/obj/Debug', + \] +< + +=============================================================================== +cspell *ale-cs-cspell* + +See |ale-cspell-options| + + +=============================================================================== +dotnet-format *ale-cs-dotnet-format* + +Installation +------------------------------------------------------------------------------- + +Installing .NET SDK should probably ensure that `dotnet` is in your `$PATH`. +For .NET 6 the `dotnet format` tool is already included in the .NET SDK. For +.NET 5 or below you will have to manually install it using the instructions +from listed in this repository: https://github.com/dotnet/format + + +Options +------------------------------------------------------------------------------- + +g:ale_cs_dotnet_format_executable *g:ale_cs_dotnet_format_executable* + *b:ale_cs_dotnet_format_executable* + Type: |String| + Default: `'dotnet'` + + This variable can be set to specify an absolute path to the + `dotnet` executable (or to specify an alternate executable). + + +g:ale_cs_dotnet_format_options *g:ale_cs_dotnet_format_options* + *b:ale_cs_dotnet_format_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the `dotnet format` + fixer. + + +=============================================================================== +mcs *ale-cs-mcs* + + The `mcs` linter looks only for syntax errors while you type. See + |ale-cs-mcsc| for the separately configured linter for checking for semantic + errors. + + +g:ale_cs_mcs_options *g:ale_cs_mcs_options* + *b:ale_cs_mcs_options* + + Type: String + Default: `''` + + This variable can be changed to pass additional flags given to mcs. + + NOTE: The -unsafe flag is selected implicitly and thus does not need to be + explicitly included in the |g:ale_cs_mcs_options| or |b:ale_cs_mcs_options| + parameter. + + +=============================================================================== +mcsc *ale-cs-mcsc* + + The mcsc linter checks for semantic errors when files are opened or saved + See |ale-lint-file-linters| for more information on linters which do not + check for problems while you type. + + The mcsc linter uses the mono mcs compiler to generate a temporary module + target file (-t:module). The module includes including all '*.cs' files + contained in the directory tree rooted at the path defined by the + |g:ale_cs_mcsc_source| or |b:ale_cs_mcsc_source| variable. + variable and all sub directories. + + The paths to search for additional assembly files can be specified using the + |g:ale_cs_mcsc_assembly_path| or |b:ale_cs_mcsc_assembly_path| variables. + + NOTE: ALE will not find any errors in files apart from syntax errors if any + one of the source files contains a syntax error. Syntax errors must be fixed + first before other errors will be shown. + + +g:ale_cs_mcsc_options *g:ale_cs_mcsc_options* + *b:ale_cs_mcsc_options* + Type: |String| + Default: `''` + + This option can be set to pass additional arguments to the `mcs` compiler. + + For example, to add the dotnet package which is not added per default: > + + let g:ale_cs_mcs_options = '-pkg:dotnet' +< + NOTE: the `-unsafe` option is always passed to `mcs`. + + +g:ale_cs_mcsc_source *g:ale_cs_mcsc_source* + *b:ale_cs_mcsc_source* + Type: |String| + Default: `''` + + This variable defines the root path of the directory tree searched for the + '*.cs' files to be linted. If this option is empty, the source file's + directory will be used. + + NOTE: Currently it is not possible to specify sub directories and + directory sub trees which shall not be searched for *.cs files. + + +g:ale_cs_mcsc_assembly_path *g:ale_cs_mcsc_assembly_path* + *b:ale_cs_mcsc_assembly_path* + Type: |List| + Default: `[]` + + This variable defines a list of path strings to be searched for external + assembly files. The list is passed to the mcs compiler using the `-lib:` + flag. + + +g:ale_cs_mcsc_assemblies *g:ale_cs_mcsc_assemblies* + *b:ale_cs_mcsc_assemblies* + Type: |List| + Default: `[]` + + This variable defines a list of external assembly (*.dll) files required + by the mono mcs compiler to generate a valid module target. The list is + passed the mcs compiler using the `-r:` flag. + + For example: > + + " Compile C# programs with the Unity engine DLL file on Mac. + let g:ale_cs_mcsc_assemblies = [ + \ '/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll', + \ 'path-to-unityproject/obj/Debug', + \] +< + +=============================================================================== +uncrustify *ale-cs-uncrustify* + +See |ale-c-uncrustify| for information about the available options. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-css.txt b/dot_vim/plugged/ale/doc/ale-css.txt new file mode 100644 index 0000000..74ca16d --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-css.txt @@ -0,0 +1,93 @@ +=============================================================================== +ALE CSS Integration *ale-css-options* + + +=============================================================================== +cspell *ale-css-cspell* + +See |ale-cspell-options| + + +=============================================================================== +css-beautify *ale-css-css-beautify* + +g:ale_css_css_beautify_executable *g:ale_css_css_beautify_executable* + *b:ale_css_css_beautify_executable* + Type: |String| + Default: `'css-beautify'` + + See |ale-integrations-local-executables| + + +g:ale_css_css_beautify_options *g:ale_css_css_beautify_options* + *b:ale_css_css_beautify_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to css-beautify. + + +g:ale_css_css_beautify_use_global *g:ale_css_css_beautify_use_global* + *b:ale_css_css_beautify_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +fecs *ale-css-fecs* + +`fecs` options for CSS is the same as the options for JavaScript, and both of +them reads `./.fecsrc` as the default configuration file. See: +|ale-javascript-fecs|. + + +=============================================================================== +prettier *ale-css-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +stylelint *ale-css-stylelint* + +g:ale_css_stylelint_executable *g:ale_css_stylelint_executable* + *b:ale_css_stylelint_executable* + Type: |String| + Default: `'stylelint'` + + See |ale-integrations-local-executables| + + +g:ale_css_stylelint_options *g:ale_css_stylelint_options* + *b:ale_css_stylelint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to stylelint. + + +g:ale_css_stylelint_use_global *g:ale_css_stylelint_use_global* + *b:ale_css_stylelint_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +vscodecss *ale-css-vscode* + +Website: https://github.com/hrsh7th/vscode-langservers-extracted + +Installation +------------------------------------------------------------------------------- + +Install VSCode css language server either globally or locally: > + + npm install -g vscode-langservers-extracted +< + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-cuda.txt b/dot_vim/plugged/ale/doc/ale-cuda.txt new file mode 100644 index 0000000..729d86b --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-cuda.txt @@ -0,0 +1,52 @@ +=============================================================================== +ALE CUDA Integration *ale-cuda-options* + + +=============================================================================== +clang-format *ale-cuda-clangformat* + +See |ale-c-clangformat| for information about the available options. +Note that the C options are also used for CUDA. + + +=============================================================================== +clangd *ale-cuda-clangd* + +g:ale_cuda_clangd_executable *g:ale_cuda_clangd_executable* + *b:ale_cuda_clangd_executable* + Type: |String| + Default: `'clangd'` + + This variable can be changed to use a different executable for clangd. + + +g:ale_cuda_clangd_options *g:ale_cuda_clangd_options* + *b:ale_cuda_clangd_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clangd. + + +=============================================================================== +nvcc *ale-cuda-nvcc* + +g:ale_cuda_nvcc_executable *g:ale_cuda_nvcc_executable* + *b:ale_cuda_nvcc_executable* + Type: |String| + Default: `'nvcc'` + + This variable can be changed to use a different executable for nvcc. + Currently only nvcc 8.0 is supported. + + +g:ale_cuda_nvcc_options *g:ale_cuda_nvcc_options* + *b:ale_cuda_nvcc_options* + Type: |String| + Default: `'-std=c++11'` + + This variable can be changed to modify flags given to nvcc. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-d.txt b/dot_vim/plugged/ale/doc/ale-d.txt new file mode 100644 index 0000000..72349a2 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-d.txt @@ -0,0 +1,32 @@ +=============================================================================== +ALE D Integration *ale-d-options* + +=============================================================================== +dfmt *ale-d-dfmt* + +g:ale_d_dfmt_options *g:ale_d_dfmt_options* + *b:ale_d_dfmt_options* + Type: |String| + Default: `''` + +This variable can be set to pass additional options to the dfmt fixer. + +=============================================================================== +dls *ale-d-dls* + +g:ale_d_dls_executable *g:ale_d_dls_executable* + *b:ale_d_dls_executable* + Type: |String| + Default: `dls` + +See |ale-integrations-local-executables| + + +=============================================================================== +uncrustify *ale-d-uncrustify* + +See |ale-c-uncrustify| for information about the available options. + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-dafny.txt b/dot_vim/plugged/ale/doc/ale-dafny.txt new file mode 100644 index 0000000..005170a --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-dafny.txt @@ -0,0 +1,16 @@ +=============================================================================== +ALE Dafny Integration *ale-dafny-options* + + +=============================================================================== +dafny *ale-dafny-dafny* + +g:ale_dafny_dafny_timelimit *g:ale_dafny_dafny_timelimit* + *b:ale_dafny_dafny_timelimit* + Type: |Number| + Default: `10` + + This variable sets the `/timeLimit` used for dafny. + + + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-dart.txt b/dot_vim/plugged/ale/doc/ale-dart.txt new file mode 100644 index 0000000..4824e82 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-dart.txt @@ -0,0 +1,124 @@ +=============================================================================== +ALE Dart Integration *ale-dart-options* + + +=============================================================================== +analysis_server *ale-dart-analysis_server* + +Installation +------------------------------------------------------------------------------- + +Install Dart via whatever means. `analysis_server` will be included in the SDK. + +In case that `dart` is not in your path, try to set the executable option to +its absolute path. : > + " Set the executable path for dart to the absolute path to it. + let g:ale_dart_analysis_server_executable = '/usr/local/bin/dart' +< + +Options +------------------------------------------------------------------------------- + +g:ale_dart_analysis_server_executable *g:ale_dart_analysis_server_executable* + *b:ale_dart_analysis_server_executable* + Type: |String| + Default: `'dart'` + + This variable can be set to change the path of dart. + + +=============================================================================== +dart-analyze *ale-dart-analyze* + +Installation +------------------------------------------------------------------------------- + +Installing Dart should probably ensure that `dart` is in your `$PATH`. + +In case it is not, try to set the executable option to its absolute path. : > + " Set the executable path for dart to the absolute path to it. + let g:ale_dart_format_executable = '/usr/lib/dart/bin/dart' + > + +Install Dart via whatever means. `dart analyze` will be included in the SDK. + +Options +------------------------------------------------------------------------------- + +g:ale_dart_analyze_executable *g:ale_dart_analyze_executable* + *b:ale_dart_analyze_executable* + Type: |String| + Default: `'dart'` + + This variable can be set to specify an absolute path to the + format executable (or to specify an alternate executable). + + +=============================================================================== +dart-format *ale-dart-format* + +Installation +------------------------------------------------------------------------------- + +Installing Dart should probably ensure that `dart` is in your `$PATH`. + +In case it is not, try to set the executable option to its absolute path. : > + " Set the executable path for dart to the absolute path to it. + let g:ale_dart_format_executable = '/usr/lib/dart/bin/dart' + > + +Options +------------------------------------------------------------------------------- + +g:ale_dart_format_executable *g:ale_dart_format_executable* + *b:ale_dart_format_executable* + Type: |String| + Default: `'dart'` + + This variable can be set to specify an absolute path to the + format executable (or to specify an alternate executable). + + +g:ale_dart_format_options *g:ale_dart_format_options* + *b:ale_dart_format_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the dart format fixer. + + +=============================================================================== +dartfmt *ale-dart-dartfmt* + +Installation +------------------------------------------------------------------------------- + +Installing Dart should probably ensure that `dartfmt` is in your `$PATH`. + +In case it is not, try to set the executable option to its absolute path. : > + " Set the executable path for dartfmt to the absolute path to it. + let g:ale_dart_dartfmt_executable = '/usr/lib/dart/bin/dartfmt' + > + +Options +------------------------------------------------------------------------------- + +g:ale_dart_dartfmt_executable *g:ale_dart_dartfmt_executable* + *b:ale_dart_dartfmt_executable* + Type: |String| + Default: `''` + + This variable can be set to specify an absolute path to the + dartfmt executable (or to specify an alternate executable). + + +g:ale_dart_dartfmt_options *g:ale_dart_dartfmt_options* + *b:ale_dart_dartfmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the dartfmt fixer. + +=============================================================================== + + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-desktop.txt b/dot_vim/plugged/ale/doc/ale-desktop.txt new file mode 100644 index 0000000..62269e9 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-desktop.txt @@ -0,0 +1,21 @@ +=============================================================================== +ALE desktop Integration *ale-desktop-options* + + +=============================================================================== +desktop-file-validate *ale-desktop-desktop-file-validate* + +ALE supports checking .desktop files with `desktop-file-validate.` + + +g:ale_desktop_desktop_file_validate_options + *g:ale_desktop_desktop_file_validate_options* + *b:ale_desktop_desktop_file_validate_options* + Type: |String| + Default: `''` + + This variable can be changed to set options for `desktop-file-validate`, + such as `'--warn-kde'`. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-development.txt b/dot_vim/plugged/ale/doc/ale-development.txt new file mode 100644 index 0000000..6bc009f --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-development.txt @@ -0,0 +1,536 @@ +*ale-development.txt* For Vim version 8.0. +*ale-dev* +*ale-development* + +ALE Development Documentation + +=============================================================================== +CONTENTS *ale-development-contents* + + 1. Introduction.........................|ale-development-introduction| + 2. Design Goals.........................|ale-design-goals| + 3. Coding Standards.....................|ale-coding-standards| + 4. Testing ALE..........................|ale-development-tests| + 4.1. Writing Linter Tests.............|ale-development-linter-tests| + 4.2. Writing Fixer Tests..............|ale-development-fixer-tests| + 4.3. Running Tests in a Windows VM....|ale-development-windows-tests| + 5. Contributing.........................|ale-development-contributing| + 5.1. Preparing a Release..............|ale-development-release| + +=============================================================================== +1. Introduction *ale-development-introduction* + +This document contains helpful information for ALE developers, including +design goals, information on how to run the tests, coding standards, and so +on. You should read this document if you want to get involved with ALE +development. + +=============================================================================== +2. Design Goals *ale-design-goals* + +This section lists design goals for ALE, in no particular order. They are as +follows. + +ALE code should be almost 100% VimL. This makes the plugin as portable as +possible. + +ALE should run without needing any other plugins to be installed, to make +installation simple. ALE can integrate with other plugins for more advanced +functionality, non-essential functionality, or improving on basic first party +functionality. + +ALE should check files with as many tools as possible by default, except where +they cause security issues or make excessive use of resources on modern +machines. + +ALE should be free of breaking changes to the public API, which is comprised of +documented functions and options, until a major version is planned. Breaking +changes should be preceded by a deprecation phase complete with warnings. +Changes required for security may be an exception. + +ALE supports Vim 8 and above, and NeoVim 0.2.0 or newer. These are the +earliest versions of Vim and NeoVim which support |job|, |timer|, |closure|, +and |lambda| features. All ALE code should be written so it is compatible with +these versions of Vim, or with version checks so particular features can +degrade or fail gracefully. + +Just about everything should be documented and covered with tests. + +By and large, people shouldn't pay for the functionality they don't use. Care +should be taken when adding new features, so supporting new features doesn't +degrade the general performance of anything ALE does. + +LSP support will become more important as time goes on. ALE should provide +better support for LSP features as time goes on. + +When merging pull requests, you should respond with `Cheers! :beers:`, purely +for comedy value. + +=============================================================================== +3. Coding Standards *ale-coding-standards* + +The following general coding standards should be adhered to for Vim code. + +* Check your Vim code with `Vint` and do everything it says. ALE will check + your Vim code with Vint automatically. See: https://github.com/Kuniwak/vint + Read ALE's `Dockerfile` to see which version of `Vint` it uses. +* Try to write descriptive and concise names for variables and functions. + Names shouldn't be too short or too long. Think about others reading your + code later on. +* Use `snake_case` names for variables and arguments, and `PascalCase` names + for functions. Prefix every variable name with its scope. (`l:`, `g:`, etc.) +* Try to keep lines no longer than 80 characters, but this isn't an absolute + requirement. +* Use 4 spaces for every level of indentation in Vim code. +* Add a blank line before every `function`, `if`, `for`, `while`, or `return`, + which doesn't start a new level of indentation. This makes the logic in + your code easier to follow. +* End every file with a trailing newline character, but not with extra blank + lines. Remove trailing whitespace from the ends of lines. +* Write the full names of commands instead of abbreviations. For example, write + `function` instead of `func`, and `endif` instead of `end`. +* Write functions with `!`, so files can be reloaded. Use the |abort| keyword + for all functions, so functions exit on the first error. +* Make sure to credit yourself in files you have authored with `Author:` + and `Description:` comments. + +In addition to the above general guidelines for the style of your code, you +should also follow some additional rules designed to prevent mistakes. Some of +these are reported with ALE's `custom-linting-rules` script. See +|ale-development-tests|. + +* Don't leave stray `:echo` lines in code. Write `" no-custom-checks` above + the line if you must echo something. +* For strings use |is#| instead of |==#|, `is?` instead of `==?`, `isnot#` + instead of `!=#`, and `isnot?` instead of `!=?`. This is because `'x' ==# 0` + returns 1, while `'x' is# 0` returns 0, so you will experience fewer issues + when numbers are compared with strings. `is` and `isnot` also do not throw + errors when other objects like List or Dictionaries are compared with + strings. +* Don't use the `getcwd()` function in the ALE codebase. Most of ALE's code + runs from asynchronous callback functions, and these functions can execute + from essentially random buffers. Therefore, the `getcwd()` output is + useless. Use `expand('#' . a:buffer . ':p:h')` instead. Don't use + `expand('%...')` for the same reason. +* Don't use the `simplify()` function. It doesn't simplify paths enough. Use + `ale#path#Simplify()` instead. +* Don't use the `shellescape()` function. It doesn't escape arguments properly + on Windows. Use `ale#Escape()` instead, which will avoid escaping where it + isn't needed, and generally escape arguments better on Windows. +* Don't use the `tempname()` function. It doesn't work when `$TMPDIR` isn't + set. Use `ale#util#Tempname()` instead, which temporarily sets `$TMPDIR` + appropriately where needed. +* Use `snake_case` names for linter names, so they can be used as part of + variable names. You can define `aliases` for linters, for other names people + might try to configure linters with. +* Use |v:t_TYPE| variables instead of `type()`, which are more readable. + +Apply the following guidelines when writing Vader test files. + +* Use 2 spaces for Vader test files, instead of the 4 spaces for Vim files. +* If you write `Before` and `After` blocks, you should typically write them at + the top of the file, so they run for all tests. There may be some tests + where it make sense to modify the `Before` and `After` code part of the way + through the file. +* If you modify any settings or global variables, reset them in `After` + blocks. The Vader `Save` and `Restore` commands can be useful for this + purpose. +* If you load or define linters in tests, write `call ale#linter#Reset()` in + an `After` block. +* Just write `Execute` blocks for Vader tests, and don't bother writing `Then` + blocks. `Then` blocks execute after `After` blocks in older versions, and + that can be confusing. + +Apply the following rules when writing Bash scripts. + +* Run `shellcheck`, and do everything it says. + See: https://github.com/koalaman/shellcheck +* Try to write scripts so they will run on Linux, BSD, or Mac OSX. + +=============================================================================== +4. Testing ALE *ale-development-tests* *ale-dev-tests* *ale-tests* + +ALE is tested with a suite of tests executed via GitHub Actions and AppVeyor. +ALE runs tests with the following versions of Vim in the following +environments. + +1. Vim 8.0.0027 on Linux via GitHub Actions. +2. Vim 9.0.0297 on Linux via GitHub Actions. +3. NeoVim 0.2.0 on Linux via GitHub Actions. +4. NeoVim 0.8.0 on Linux via GitHub Actions. +6. Vim 8 (stable builds) on Windows via AppVeyor. + +If you are developing ALE code on Linux, Mac OSX, or BSD, you can run ALEs +tests by installing Docker and running the `run-tests` script. Follow the +instructions on the Docker site for installing Docker. +See: https://docs.docker.com/install/ + +NOTE: Don't forget to add your user to the `docker` group on Linux, or Docker +just won't work. See: https://docs.docker.com/install/linux/linux-postinstall/ + +If you run simply `./run-tests` from the ALE repository root directory, the +latest Docker image for tests will be downloaded if needed, and the script +will run all of the tests in Vader, Vint checks, and several Bash scripts for +finding extra issues. Run `./run-tests --help` to see all of the options the +script supports. Note that the script supports selecting particular test files. + +Once you get used to dealing with Vim and NeoVim compatibility issues, you +probably want to use `./run-tests --fast -q` for running tests with only the +fastest available Vim version, and with success messages from tests +suppressed. + +Generally write tests for any changes you make. The following types of tests +are recommended for the following types of code. + +* New/edited error handler callbacks -> Write tests in `test/handler` +* New/edited linter definition -> Write tests in `test/linter` +* New/edited fixer functions -> Write tests in `test/fixers` + +Look at existing tests in the codebase for examples of how to write tests. +Refer to the Vader documentation for general information on how to write Vader +tests: https://github.com/junegunn/vader.vim + +If you need to add any supporting files for tests, such as empty files present +to test searching upwards through paths for configuration files, they can be +added to the `test/test-files` directory. + +See |ale-development-linter-tests| for more information on how to write linter +tests. + +When you add new linters or fixers, make sure to add them into the tables in +supported-tools.md and |ale-supported-languages-and-tools.txt|. If you forget to +keep them both in sync, you should see an error like the following in the +builds run for GitHub Actions. +> + ======================================== + diff supported-tools.md and doc/ale-supported-languages-and-tools.txt tables + ======================================== + Differences follow: + + --- /tmp/readme.qLjNhJdB 2018-07-01 16:29:55.590331972 +0100 + +++ /tmp/doc.dAi8zfVE 2018-07-01 16:29:55.582331877 +0100 + @@ -1 +1 @@ + - ASM: gcc, foobar + + ASM: gcc +< +Make sure to list documentation entries for linters and fixers in individual +help files in the table of contents, and to align help tags to the right +margin. For example, if you add a heading for an `aardvark` tool to +`ale-python.txt` with a badly aligned doc tag, you will see errors like so. > + + ======================================== + Look for badly aligned doc tags + ======================================== + Badly aligned tags follow: + + doc/ale-python.txt:aardvark ... + ======================================== + Look for table of contents issues + ======================================== + + Check for bad ToC sorting: + + Check for mismatched ToC and headings: + + --- /tmp/table-of-contents.mwCFOgSI 2018-07-01 16:33:25.068811878 +0100 + +++ /tmp/headings.L4WU0hsO 2018-07-01 16:33:25.076811973 +0100 + @@ -168,6 +168,7 @@ + pyrex (cython), ale-pyrex-options + cython, ale-pyrex-cython + python, ale-python-options + + aardvark, ale-python-aardvark + autopep8, ale-python-autopep8 + black, ale-python-black + flake8, ale-python-flake8 +< +Make sure to make the table of contents match the headings, and to keep the +doc tags on the right margin. + +=============================================================================== +4.1 Writing Linter Tests *ale-development-linter-tests* + +Tests for ALE linters take two forms. + +1. Tests for handling the output of commands. +2. Tests for checking which commands are run, or connections are made. + +Tests of the first form should go in the `test/handler` directory, and should +be written like so. > + + Before: + " Load the file which defines the linter. + runtime ale_linters/filetype/linter_name_here.vim + + After: + " Unload all linters again. + call ale#linter#Reset() + + Execute(The output should be correct): + + " Test that the right loclist items are parsed from the handler. + AssertEqual + \ [ + \ { + \ 'lnum': 1, + \ 'type': 'E', + \ 'text': 'Something went wrong', + \ }, + \ ], + \ ale_linters#filetype#linter_name#Handle(bufnr(''), [ + \ '1:Something went wrong', + \ ] +< +Tests for what ALE runs should go in the `test/linter` directory, and should +be written like so. > + + Before: + " Load the linter and set up a series of commands, reset linter variables, + " clear caches, etc. + " + " Vader's 'Save' command will be called here for linter variables. + call ale#assert#SetUpLinterTest('filetype', 'linter_name') + + After: + " Reset linters, variables, etc. + " + " Vader's 'Restore' command will be called here. + call ale#assert#TearDownLinterTest() + + Execute(The default command should be correct): + " AssertLinter checks the executable and command. + " Pass expected_executable, expected_command + AssertLinter 'some-command', ale#Escape('some-command') . ' --foo' + + Execute(Check chained commands): + " GivenCommandOutput can be called with 1 or more list for passing output + " to chained commands. The output for each callback defaults to an empty + " list. + GivenCommandOutput ['v2.1.2'] + " Given a List of commands, check all of them. + " Given a String, only the last command in the chain will be checked. + AssertLinter 'some-command', [ + \ ale#Escape('some-command') . ' --version', + \ ale#Escape('some-command') . ' --foo', + \] +< +The full list of commands that will be temporarily defined for linter tests +given the above setup are as follows. + +`GivenCommandOutput [...]` - Define output for ale#command#Run. +`AssertLinterCwd cwd` - Check the `cwd` for the linter. +`AssertLinter executable, command` - Check the executable and command. +`AssertLinterNotExecuted` - Check that linters will not be executed. +`AssertLSPLanguage language` - Check the language given to an LSP server. +`AssertLSPOptions options_dict` - Check the options given to an LSP server. +`AssertLSPConfig config_dict` - Check the config given to an LSP server. +`AssertLSPProject project_root` - Check the root given to an LSP server. +`AssertLSPAddress address` - Check the address to an LSP server. + +=============================================================================== +4.2 Writing Fixer Tests *ale-development-fixer-tests* + +Tests for ALE fixers should go in the `test/fixers` directory, and should +be written like so. > + + Before: + " Load the fixer and set up a series of commands, reset fixer variables, + " clear caches, etc. + " + " Vader's 'Save' command will be called here for fixer variables. + call ale#assert#SetUpFixerTest('filetype', 'fixer_name') + + After: + " Reset fixers, variables, etc. + " + " Vader's 'Restore' command will be called here. + call ale#assert#TearDownFixerTest() + + Execute(The default command should be correct): + " AssertFixer checks the result of the loaded fixer function. + AssertFixer {'command': ale#Escape('some-command') . ' --foo'} + + Execute(Check chained commands): + " Same as above for linter tests. + GivenCommandOutput ['v2.1.2'] + " Given a List of commands, check all of them. + " Given anything else, only the last result will be checked. + AssertFixer [ + \ ale#Escape('some-command') . ' --version', + \ {'command': ale#Escape('some-command') . ' --foo'} + \] +< +The full list of commands that will be temporarily defined for fixer tests +given the above setup are as follows. + +`GivenCommandOutput [...]` - Define output for ale#command#Run. +`AssertFixerCwd cwd` - Check the `cwd` for the fixer. +`AssertFixer results` - Check the fixer results +`AssertFixerNotExecuted` - Check that fixers will not be executed. + +=============================================================================== +4.3 Running Tests in a Windows VM *ale-development-windows-tests* + +Tests are run for ALE in a build of Vim 8 for Windows via AppVeyor. These +tests can frequently break due to minor differences in paths and how escaping +is done for commands on Windows. If you are a Linux or Mac user, running these +tests locally can be difficult. Here is a process that will make that easier. + +First, you want to install a Windows image with VirtualBox. Install VirtualBox +and grab a VirtualBox image for Windows such as from here: +https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/ + +NOTE: If you need to enter a password for the virtual machine at any point, +the password is "Passw0rd!" without the double quotes. + +NOTE: If your trial period for Windows runs out, run the commands like the +wallpaper tells you to. + +Your virtual machine will need to have PowerShell installed. Before you go any +further, confirm that PowerShell is installed in your Windows virtual machine. + +Consult the VirtualBox documentation on how to install "Guest Additions." +You probably want to install "Guest Additions" for most things to work +properly. + +After you've loaded your virtual machine image, go into "Settings" for your +virtual machine, and "Shared Folders." Add a shared folder with the name +"ale", and set the "Folder Path" to the path to your ALE repository, for +example: "/home/w0rp/ale" + +Find out which drive letter "ale" has been mounted as in Windows. We'll use +"E:" as the drive letter, for example. Open the command prompt as an +administrator by typing in `cmd` in the start menu, right clicking on the +command prompt application, and clicking "Run as administrator." Click "Yes" +when prompted to ask if you're sure you want to run the command prompt. You +should type in the following command to mount the "ale" directory for testing, +where "E:" is replaced with your drive letter. > + + mklink /D C:\testplugin E: +< +Close the administrator Command Prompt, and try running the command +`type C:\testplugin\LICENSE` in a new Command Prompt which you are NOT running +as administrator. You should see the license for ALE in your terminal. After +you have confirmed that you have mounted ALE on your machine, search in the +Start Menu for "power shell," run PowerShell as an administrator, and issue +the following commands to install the correct Vim and Vader versions for +running tests. > + + Add-Type -A System.IO.Compression.FileSystem + + Invoke-WebRequest ftp://ftp.vim.org/pub/vim/pc/vim80-586w32.zip -OutFile C:\vim.zip + [IO.Compression.ZipFile]::ExtractToDirectory('C:\vim.zip', 'C:\vim') + rm C:\vim.zip + + Invoke-WebRequest ftp://ftp.vim.org/pub/vim/pc/vim80-586rt.zip -OutFile C:\rt.zip + [IO.Compression.ZipFile]::ExtractToDirectory('C:\rt.zip', 'C:\vim') + rm C:\rt.zip + + Invoke-WebRequest https://github.com/junegunn/vader.vim/archive/c6243dd81c98350df4dec608fa972df98fa2a3af.zip -OutFile C:\vader.zip + [IO.Compression.ZipFile]::ExtractToDirectory('C:\vader.zip', 'C:\') + mv C:\vader.vim-c6243dd81c98350df4dec608fa972df98fa2a3af C:\vader + rm C:\vader.zip +< +After you have finished installing everything, you can run all of the tests +in Windows by opening a Command Prompt NOT as an administrator by navigating +to the directory where you've mounted the ALE code, which must be named +`C:\testplugin`, and by running the `run-tests.bat` batch file. > + + cd C:\testplugin + run-tests +< +It will probably take several minutes for all of the tests to run. Be patient. +You can run a specific test by passing the filename as an argument to the +batch file, for example: `run-tests test/test_c_flag_parsing.vader` . This will +give you results much more quickly. + +=============================================================================== +5. Contributing *ale-development-contributing* + +All integration of new code into ALE is done through GitHub pull requests. +Using that tool streamlines the process and minimizes the time and effort +required to e.g. ensure test suites are run for every change. + +As for any project hosted by GitHub, the choice of platform demands every +contributor to take care to setup an account and configure it accordingly. + +Due to details of our process, a difference to many other GitHub hosted +projects is that contributors who wish to keep the author fields for their +commits unaltered need to configure a public email address in their account +and profile settings. See: https://docs.github.com/en/account-and-profile/ + +Unless configuring GitHub to expose contact details, commits will be rewritten +to appear by `USERNAME ` . + +=============================================================================== +5.1 Preparing a Release *ale-development-release* + +ALE offers release packages through GitHub, for two reasons: + +1. Some users like to target specific release versions rather than simply + installing the plugin from `master`. This includes users who create Linux + distribution specific packages from GitHub releases. +2. The releases provide a nice way to get an overview of what has changed in + ALE over time. + +ALE has no fixed release schedule. Release versions are created whenever the +ALE developers feel the need to create one. ALE release versions follow the +typical Semantic Versioning scheme. See: https://semver.org/ + +Minor version releases for ALE should be the most common, followed by patch +releases. Every minor version release should be followed by a `vA.B.x` branch +such as `v2.0.x` for version `2.0.0` and every following patch version before +`2.1.0`. The `git` branch strategy for patches is to first merge a bug fix to +`master`, and then `git cherry-pick` a patch to a branch for a specific +version. ALE developers do not generally support anything but `master` or the +last minor version. + +Generally ALE releases hit a major version only when there are breaking +changes to a public ALE setting or function. A "public" setting or function is +defined as any setting or function documented in the `:help` |ale| text file. +Major ALE versions ought to be so rare that they only come once a year at +most. ALE should not typically introduce any breaking changes. + +If there are ever to be any breaking changes made for ALE, there should first +come a minor version release for ALE documenting all of the coming breaking +changes to ALE. It should be described how users can prepare for a breaking +change that is coming before it is done. + +To create a release for ALE, you will need sufficient permissions in GitHub. +Once you do, follow these steps. + +1. Create a new release draft, or edit an existing one. It helps to craft + drafts ahead of time and write the last commit ID checked for release notes + on the last update to a draft. + See the releases page: https://github.com/dense-analysis/ale/releases +2. Examine `git log` and read changes made between the last ID checked, or the + git tag of the previous release, and the current commit in `master`. +3. Write updates in separate sections (except where empty) for: + 3.a. Breaking Changes + 3.b. Deprecated Features + 3.c. New Features + 3.d. New Linters + 3.e. New Fixers + 3.f. Linter Enhancements + 3.g. Fixer Enhancements + 3.h. Bugs Fixed +4. Once you've finished writing the draft for the release, bump + `s:current_ale_version` in `autoload/ale.vim` to the current version, and + add a line to `test/test_ale_has.vader` to test for the version. See + |ale#Has()| documentation for more information. +5. Commit the changes after `./run-tests --fast -q` passes. +6. Tag the release with `git tag vA.B.C`, replacing `A`, `B`, and `C` with the + version numbers. See `git tag --list` for examples. +7. Run `git push` and `git push --tags` to push the commit and the tag. +8. Edit the release draft in GitHub, select the tag you just pushed, and + publish the draft. +9. If you're creating a new major or minor version: `git checkout -b vA.B.x`, + replacing `A` and `B` with the major and minor versions. `git push` the new + branch, and the GitHub branch protection settings should automatically + apply to the new release branch. +10. You have already completed the last step. + +Have fun creating ALE releases. Drink responsibly, or not at all, which is the +preference of w0rp. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-dhall.txt b/dot_vim/plugged/ale/doc/ale-dhall.txt new file mode 100644 index 0000000..9b997b9 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-dhall.txt @@ -0,0 +1,52 @@ +=============================================================================== +ALE Dhall Integration *ale-dhall-options* + +g:ale_dhall_executable *g:ale_dhall_executable* + *b:ale_dhall_executable* + Type: |String| + Default: `'dhall'` + +g:ale_dhall_options *g:ale_dhall_options* + *b:ale_dhall_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the 'dhall` executable. + This is shared with `dhall-freeze` and `dhall-lint`. +> + let g:ale_dhall_options = '--ascii' +< + +=============================================================================== +dhall-format *ale-dhall-format* + +Dhall + (https://dhall-lang.org/) + + +=============================================================================== +dhall-freeze *ale-dhall-freeze* + +Dhall + (https://dhall-lang.org/) + +g:ale_dhall_freeze_options *g:ale_dhall_freeze_options* + *b:ale_dhall_freeze_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the 'dhall freeze` + executable. +> + let g:ale_dhall_freeze_options = '--all' +< + +=============================================================================== +dhall-lint *ale-dhall-lint* + +Dhall + (https://dhall-lang.org/) + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-dockerfile.txt b/dot_vim/plugged/ale/doc/ale-dockerfile.txt new file mode 100644 index 0000000..51b9acc --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-dockerfile.txt @@ -0,0 +1,76 @@ +=============================================================================== +ALE Dockerfile Integration *ale-dockerfile-options* + + +=============================================================================== +dockerfile_lint *ale-dockerfile-dockerfile_lint* + +g:ale_dockerfile_dockerfile_lint_executable + *g:ale_dockerfile_dockerfile_lint_executable* + *b:ale_dockerfile_dockerfile_lint_executable* + Type: |String| + Default: `'dockerfile_lint'` + + This variable can be changed to specify the executable used to run + dockerfile_lint. + + +g:ale_dockerfile_dockerfile_lint_options + *g:ale_dockerfile_dockerfile_lint_options* + *b:ale_dockerfile_dockerfile_lint_options* + Type: |String| + Default: `''` + + This variable can be changed to add additional command-line arguments to + the dockerfile lint invocation - like custom rule file definitions. + + +=============================================================================== +dprint *ale-dockerfile-dprint* + +See |ale-dprint-options| and https://dprint.dev/plugins/dockerfile + + +=============================================================================== +hadolint *ale-dockerfile-hadolint* + + hadolint can be found at: https://github.com/hadolint/hadolint + + +g:ale_dockerfile_hadolint_options *g:ale_dockerfile_hadolint_options* + *b:ale_dockerfile_hadolint_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the hadolint + invocation. These arguments will be used whether docker is being used or not + (see below). + + +g:ale_dockerfile_hadolint_use_docker *g:ale_dockerfile_hadolint_use_docker* + *b:ale_dockerfile_hadolint_use_docker* + Type: |String| + Default: `'never'` + + This variable controls if docker and the hadolint image are used to run this + linter: if 'never', docker will never be used; 'always' means docker will + always be used; 'yes' and docker will be used if the hadolint executable + cannot be found. + + For now, the default is 'never'. This may change as ale's support for using + docker to lint evolves. + + +g:ale_dockerfile_hadolint_image *g:ale_dockerfile_hadolint_image* + *b:ale_dockerfile_hadolint_image* + Type: |String| + Default: `'hadolint/hadolint'` + + This variable controls the docker image used to run hadolint. The default + is hadolint's author's build, and can be found at: + + https://hub.docker.com/r/hadolint/hadolint/ + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-elixir.txt b/dot_vim/plugged/ale/doc/ale-elixir.txt new file mode 100644 index 0000000..693db5a --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-elixir.txt @@ -0,0 +1,108 @@ +=============================================================================== +ALE Elixir Integration *ale-elixir-options* + + +=============================================================================== +mix *ale-elixir-mix* + +The `mix` linter is disabled by default, as it can be too expensive to run. +See `:help g:ale_linters` + + +g:ale_elixir_mix_options *g:ale_elixir_mix_options* + *b:ale_elixir_mix_options* + Type: |String| + Default: `'mix'` + + + This variable can be changed to specify the mix executable. + + +=============================================================================== +mix_format *ale-elixir-mix-format* + +g:ale_elixir_mix_format_options *g:ale_elixir_mix_format_options* + *b:ale_elixir_mix_format_options* + Type: |String| + Default: `''` + + + This variable can be changed to specify the mix options passed to the + mix_format fixer + + +=============================================================================== +dialyxir *ale-elixir-dialyxir* + +Dialyzer, a DIscrepancy AnaLYZer for ERlang programs. +http://erlang.org/doc/man/dialyzer.html + +It can be used with elixir through dialyxir +https://github.com/jeremyjh/dialyxir + +Options for dialyzer are not configurable by ale, but they are instead +configured on your project's `mix.exs`. + +See https://github.com/jeremyjh/dialyxir#with-explaining-stuff for more +information. + + +=============================================================================== +elixir-ls *ale-elixir-elixir-ls* + +Elixir Language Server (https://github.com/JakeBecker/elixir-ls) + +g:ale_elixir_elixir_ls_release *g:ale_elixir_elixir_ls_release* + *b:ale_elixir_elixir_ls_release* + Type: |String| + Default: `'elixir-ls'` + + Location of the elixir-ls release directory. This directory must contain + the language server scripts (language_server.sh and language_server.bat). + +g:ale_elixir_elixir_ls_config *g:ale_elixir_elixir_ls_config* + *b:ale_elixir_elixir_ls_config* + Type: |Dictionary| + Default: `{}` + + Dictionary containing configuration settings that will be passed to the + language server. For example, to disable Dialyzer: > + { + \ 'elixirLS': { + \ 'dialyzerEnabled': v:false, + \ }, + \ } +< + Consult the ElixirLS documentation for more information about settings. + + +=============================================================================== +credo *ale-elixir-credo* + +Credo (https://github.com/rrrene/credo) + +g:ale_elixir_credo_strict *g:ale_elixir_credo_strict* + + Type: |Integer| + Default: `0` + + Tells credo to run in strict mode or suggest mode. Set variable to 1 to + enable --strict mode. + + +g:ale_elixir_credo_config_file *g:ale_elixir_credo_config_file* + + Type: |String| + Default: `''` + + Tells credo to use a custom configuration file. + + +=============================================================================== +cspell *ale-elixir-cspell* + +See |ale-cspell-options| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-elm.txt b/dot_vim/plugged/ale/doc/ale-elm.txt new file mode 100644 index 0000000..b151024 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-elm.txt @@ -0,0 +1,100 @@ +=============================================================================== +ALE Elm Integration *ale-elm-options* + + +=============================================================================== +elm-format *ale-elm-elm-format* + +g:ale_elm_format_executable *g:ale_elm_format_executable* + *b:ale_elm_format_executable* + Type: |String| + Default: `'elm-format'` + + See |ale-integrations-local-executables| + + +g:ale_elm_format_use_global *g:ale_elm_format_use_global* + *b:ale_elm_format_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_elm_format_options *g:ale_elm_format_options* + *b:ale_elm_format_options* + Type: |String| + Default: `'--yes'` + + This variable can be set to pass additional options to elm-format. + +=============================================================================== +elm-ls *ale-elm-elm-ls* + +g:ale_elm_ls_executable *g:ale_elm_ls_executable* + *b:ale_elm_ls_executable* + Type: |String| + Default: `'elm-language-server'` + + See |ale-integrations-local-executables| + + +g:ale_elm_ls_use_global *g:ale_elm_ls_use_global* + *b:ale_elm_ls_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 1)` + + See |ale-integrations-local-executables| + + +g:ale_elm_ls_elm_path *g:ale_elm_ls_elm_path* + *b:ale_elm_ls_elm_path* + Type: |String| + Default: `''` + + See |ale-integrations-local-executables| + + +g:ale_elm_ls_elm_format_path *g:ale_elm_ls_elm_format_path* + *b:ale_elm_ls_elm_format_path* + Type: |String| + Default: `''` + + See |ale-integrations-local-executables| + + +g:ale_elm_ls_elm_test_path *g:ale_elm_ls_elm_test_path* + *b:ale_elm_ls_elm_test_path* + Type: |String| + Default: `''` + + See |ale-integrations-local-executables| + + +g:ale_elm_ls_elm_analyse_trigger *g:ale_elm_ls_elm_analyse_trigger* + *b:ale_elm_ls_elm_analyse_trigger* + Type: |String| + Default: `'change'` + + One of 'change', 'save' or 'never' + +=============================================================================== +elm-make *ale-elm-elm-make* + +g:ale_elm_make_executable *g:ale_elm_make_executable* + *b:ale_elm_make_executable* + Type: |String| + Default: `'elm'` + + See |ale-integrations-local-executables| + + +g:ale_elm_make_use_global *g:ale_elm_make_use_global* + *b:ale_elm_make_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-erlang.txt b/dot_vim/plugged/ale/doc/ale-erlang.txt new file mode 100644 index 0000000..2c6ff22 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-erlang.txt @@ -0,0 +1,131 @@ +=============================================================================== +ALE Erlang Integration *ale-erlang-options* + + +=============================================================================== +dialyzer *ale-erlang-dialyzer* + +g:ale_erlang_dialyzer_executable *g:ale_erlang_dialyzer_executable* + *b:ale_erlang_dialyzer_executable* + Type: |String| + Default: `'dialyzer'` + + This variable can be changed to specify the dialyzer executable. + + +g:ale_erlang_dialyzer_options *g:ale_erlang_dialyzer_options* + *b:ale_erlang_dialyzer_options* + Type: |String| + Default: `'-Wunmatched_returns -Werror_handling -Wrace_conditions -Wunderspec'` + + This variable can be changed to specify the options to pass to the dialyzer + executable. + +g:ale_erlang_dialyzer_plt_file *g:ale_erlang_dialyzer_plt_file* + *b:ale_erlang_dialyzer_plt_file* + Type: |String| + + This variable can be changed to specify the path to the PLT file. By + default, it will search for the PLT file inside the `_build` directory. If + there isn't one, it will fallback to the path `$REBAR_PLT_DIR/dialyzer/plt`. + Otherwise, it will default to `$HOME/.dialyzer_plt`. + + +g:ale_erlang_dialyzer_rebar3_profile *g:ale_erlang_dialyzer_rebar3_profile* + *b:ale_erlang_dialyzer_rebar3_profile* + Type: |String| + Default: `'default'` + + This variable can be changed to specify the profile that is used to + run dialyzer with rebar3. + + +------------------------------------------------------------------------------- +elvis *ale-erlang-elvis* + +g:ale_erlang_elvis_executable *g:ale_erlang_elvis_executable* + *b:ale_erlang_elvis_executable* + Type: |String| + Default: `'elvis'` + + This variable can be changed to specify the elvis executable. + + +------------------------------------------------------------------------------- +erlang_ls *ale-erlang-erlang_ls* + +g:ale_erlang_erlang_ls_executable *g:ale_erlang_erlang_ls_executable* + *b:ale_erlang_erlang_ls_executable* + Type: |String| + Default: `'erlang_ls'` + + This variable can be changed to specify the erlang_ls executable. + +g:ale_erlang_erlang_ls_log_dir *g:ale_erlang_erlang_ls_log_dir* + *b:ale_erlang_erlang_ls_log_dir* + Type: |String| + Default: `''` + + If set this variable overrides default directory where logs will be written. + +g:ale_erlang_erlang_ls_log_level *g:ale_erlang_erlang_ls_log_level* + *b:ale_erlang_erlang_ls_log_level* + Type: |String| + Default: `'info'` + + This variable can be changed to specify log level. + + +------------------------------------------------------------------------------- +erlc *ale-erlang-erlc* + +g:ale_erlang_erlc_executable *g:ale_erlang_erlc_executable* + *b:ale_erlang_erlc_executable* + Type: |String| + Default: `'erlc'` + + This variable can be changed to specify the erlc executable. + + +g:ale_erlang_erlc_options *g:ale_erlang_erlc_options* + *b:ale_erlang_erlc_options* + Type: |String| + Default: `''` + + This variable controls additional parameters passed to `erlc`, such as `-I` + or `-pa`. + + +------------------------------------------------------------------------------- +erlfmt *ale-erlang-erlfmt* + +g:ale_erlang_erlfmt_executable *g:ale_erlang_erlfmt_executable* + *b:ale_erlang_erlfmt_executable* + Type: |String| + Default: `'erlfmt'` + + This variable can be changed to specify the erlfmt executable. + + +g:ale_erlang_erlfmt_options *g:ale_erlang_erlfmt_options* + *b:ale_erlang_erlfmt_options* + Type: |String| + Default: `''` + + This variable controls additional parameters passed to `erlfmt`, such as + `--insert-pragma` or `--print-width`. + + +------------------------------------------------------------------------------- +syntaxerl *ale-erlang-syntaxerl* + +g:ale_erlang_syntaxerl_executable *g:ale_erlang_syntaxerl_executable* + *b:ale_erlang_syntaxerl_executable* + Type: |String| + Default: `'syntaxerl'` + + This variable can be changed to specify the syntaxerl executable. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-eruby.txt b/dot_vim/plugged/ale/doc/ale-eruby.txt new file mode 100644 index 0000000..4cf08d0 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-eruby.txt @@ -0,0 +1,58 @@ +=============================================================================== +ALE Eruby Integration *ale-eruby-options* + +There are four linters for `eruby` files: + +- `erb` +- `erblint` +- `erubis` +- `erubi` +- `ruumba` + +`erb` is in the Ruby standard library and is mostly universal. `erubis` is the +default parser in Rails between 3.0 and 5.1. `erubi` is the default in Rails +5.1 and later. `ruumba` can extract Ruby from eruby files and run rubocop on +the result. To selectively enable a subset, see |g:ale_linters|. + +=============================================================================== +erblint *ale-eruby-erblint* + +g:ale_eruby_erblint_executable *g:ale_eruby_erblint_executable* + *b:ale_eruby_erblint_executable* + Type: |String| + Default: `'erblint'` + + Override the invoked erblint binary. This is useful for running erblint + from binstubs or a bundle. + + +g:ale_eruby_erblint_options *g:ale_ruby_erblint_options* + *b:ale_ruby_erblint_options* + Type: |String| + Default: `''` + + This variable can be change to modify flags given to erblint. + + +=============================================================================== +ruumba *ale-eruby-ruumba* + +g:ale_eruby_ruumba_executable *g:ale_eruby_ruumba_executable* + *b:ale_eruby_ruumba_executable* + Type: |String| + Default: `'ruumba` + + Override the invoked ruumba binary. This is useful for running ruumba + from binstubs or a bundle. + + +g:ale_eruby_ruumba_options *g:ale_ruby_ruumba_options* + *b:ale_ruby_ruumba_options* + Type: |String| + Default: `''` + + This variable can be change to modify flags given to ruumba. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-fish.txt b/dot_vim/plugged/ale/doc/ale-fish.txt new file mode 100644 index 0000000..7dbbc10 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-fish.txt @@ -0,0 +1,31 @@ +=============================================================================== +ALE Fish Integration *ale-fish-options* + +Lints fish files using `fish -n`. + +Note that `fish -n` is not foolproof: it sometimes gives false positives or +errors that are difficult to parse without more context. This integration skips +displaying errors if an error message is not found. + +If ALE is not showing any errors but your file does not run as expected, run +`fish -n ` from the command line. + +=============================================================================== +fish_indent *ale-fish-fish_indent* + +g:ale_fish_fish_indent_executable *g:ale_fish_fish_indent_executable* + *b:ale_fish_fish_indent_executable* + Type: |String| + Default: `'fish_indent'` + + This variable can be changed to use a different executable for fish_indent. + +g:ale_fish_fish_indent_options *g:ale_fish_fish_indent_options* + *b:ale_fish_fish_indent_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to fish_indent. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-fortran.txt b/dot_vim/plugged/ale/doc/ale-fortran.txt new file mode 100644 index 0000000..c9b7e8e --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-fortran.txt @@ -0,0 +1,55 @@ +=============================================================================== +ALE Fortran Integration *ale-fortran-options* + + +=============================================================================== +gcc *ale-fortran-gcc* + +g:ale_fortran_gcc_executable *g:ale_fortran_gcc_executable* + *b:ale_fortran_gcc_executable* + Type: |String| + Default: `'gcc'` + + This variable can be changed to modify the executable used for checking + Fortran code with GCC. + + +g:ale_fortran_gcc_options *g:ale_fortran_gcc_options* + *b:ale_fortran_gcc_options* + Type: |String| + Default: `'-Wall'` + + This variable can be changed to modify flags given to gcc. + + +g:ale_fortran_gcc_use_free_form *g:ale_fortran_gcc_use_free_form* + *b:ale_fortran_gcc_use_free_form* + Type: |Number| + Default: `1` + + When set to `1`, the `-ffree-form` flag will be used for GCC, to check files + with the free form layout. When set to `0`, `-ffixed-form` will be used + instead, for checking files with fixed form layouts. + + +=============================================================================== +language_server *ale-fortran-language-server* + +g:ale_fortran_language_server_executable *g:ale_fortran_language_server_executable* + *b:ale_fortran_language_server_executable* + Type: |String| + Default: `'fortls'` + + This variable can be changed to modify the executable used for the Fortran + Language Server. + +g:ale_fortran_language_server_use_global *g:ale_fortran_language_server_use_global* + *b:ale_fortran_language_server_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-fountain.txt b/dot_vim/plugged/ale/doc/ale-fountain.txt new file mode 100644 index 0000000..ac0870c --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-fountain.txt @@ -0,0 +1,6 @@ +=============================================================================== +ALE Fountain Integration *ale-fountain-options* + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-fuse.txt b/dot_vim/plugged/ale/doc/ale-fuse.txt new file mode 100644 index 0000000..0849c37 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-fuse.txt @@ -0,0 +1,25 @@ +=============================================================================== +ALE FusionScript Integration *ale-fuse-options* + + +=============================================================================== +fusion-lint *ale-fuse-fusionlint* + +g:ale_fusion_fusionlint_executable *g:ale_fuse_fusionlint_executable* + *b:ale_fuse_fusionlint_executable* + Type: |String| + Default: `'fusion-lint'` + + This variable can be changed to change the path to fusion-lint. + + +g:ale_fuse_fusionlint_options *g:ale_fuse_fusionlint_options* + *b:ale_fuse_fusionlint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to fusion-lint. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-gitcommit.txt b/dot_vim/plugged/ale/doc/ale-gitcommit.txt new file mode 100644 index 0000000..38f3fd9 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-gitcommit.txt @@ -0,0 +1,44 @@ +=============================================================================== +ALE Git Commit Integration *ale-gitcommit-options* + + +=============================================================================== +gitlint *ale-gitcommit-gitlint* + +g:ale_gitcommit_gitlint_executable *g:ale_gitcommit_gitlint_executable* + *b:ale_gitcommit_gitlint_executable* + Type: |String| + Default: `'gitlint'` + + This variable can be changed to modify the executable used for gitlint. + + +g:ale_gitcommit_gitlint_options *g:ale_gitcommit_gitlint_options* + *b:ale_gitcommit_gitlint_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the gitlint + invocation. For example, you can specify the path to a configuration file. > + + let g:ale_gitcommit_gitlint_options = '-C /home/user/.config/gitlint.ini' +< + You can also disable particular error codes using this option. For example, + you can ignore errors for git commits with a missing body. > + + let g:ale_gitcommit_gitlint_options = '--ignore B6' +< + +g:ale_gitcommit_gitlint_use_global *g:ale_gitcommit_gitlint_use_global* + *b:ale_gitcommit_gitlint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + This variable controls whether or not ALE will search for gitlint in a + virtualenv directory first. If this variable is set to `1`, then ALE will + always use |g:ale_gitcommit_gitlint_executable| for the executable path. + + Both variables can be set with `b:` buffer variables instead. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-glsl.txt b/dot_vim/plugged/ale/doc/ale-glsl.txt new file mode 100644 index 0000000..257de75 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-glsl.txt @@ -0,0 +1,56 @@ +=============================================================================== +ALE GLSL Integration *ale-glsl-options* + *ale-integration-glsl* + +=============================================================================== +Integration Information + + Since Vim does not detect the glsl file types out-of-the-box, you need the + runtime files for glsl from here: https://github.com/tikhomirov/vim-glsl + + Note that the current glslang-based linter expects glslangValidator in + standard paths. If it's not installed system-wide you can set + |g:ale_glsl_glslang_executable| to a specific path. + + +=============================================================================== +glslang *ale-glsl-glslang* + +g:ale_glsl_glslang_executable *g:ale_glsl_glslang_executable* + *b:ale_glsl_glslang_executable* + Type: |String| + Default: `'glslangValidator'` + + This variable can be changed to change the path to glslangValidator. + + +g:ale_glsl_glslang_options *g:ale_glsl_glslang_options* + *b:ale_glsl_glslang_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to glslangValidator. + + +=============================================================================== +glslls *ale-glsl-glslls* + +g:ale_glsl_glslls_executable *g:ale_glsl_glslls_executable* + *b:ale_glsl_glslls_executable* + Type: |String| + Default: `'glslls'` + + This variable can be changed to change the path to glslls. + See |ale-integrations-local-executables| + +g:ale_glsl_glslls_logfile *g:ale_glsl_glslls_logfile* + *b:ale_glsl_glslls_logfile* + Type: |String| + Default: `''` + + Setting this variable to a writeable file path will enable logging to that + file. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-go.txt b/dot_vim/plugged/ale/doc/ale-go.txt new file mode 100644 index 0000000..367618e --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-go.txt @@ -0,0 +1,372 @@ +=============================================================================== +ALE Go Integration *ale-go-options* + + +=============================================================================== +Integration Information + +The `gometalinter` linter is disabled by default. ALE enables `gofmt`, +`golint` and `go vet` by default. It also supports `staticcheck`, `go +build`, `gosimple`, `golangserver`. + +To enable `gometalinter`, update |g:ale_linters| as appropriate: +> + " Enable all of the linters you want for Go. + let g:ale_linters = {'go': ['gometalinter', 'gofmt']} +< +A possible configuration is to enable `gometalinter` and `gofmt` but paired +with the `--fast` option, set by |g:ale_go_gometalinter_options|. This gets you +the benefit of running a number of linters, more than ALE would by default, +while ensuring it doesn't run any linters known to be slow or resource +intensive. + +g:ale_go_go_executable *g:ale_go_go_executable* + *b:ale_go_go_executable* + + Type: |String| + Default: `'go'` + + The executable that will be run for the `gobuild` and `govet` linters, and + the `gomod` fixer. + + +g:ale_go_go111module *g:ale_go_go111module* + *b:ale_go_go111module* + Type: |String| + Default: `''` + + Override the value of the `$GO111MODULE` environment variable for + golang tools. + + +=============================================================================== +bingo *ale-go-bingo* + +g:ale_go_bingo_executable *g:ale_go_bingo_executable* + *b:ale_go_bingo_executable* + Type: |String| + Default: `'bingo'` + + Location of the bingo binary file. + + +g:ale_go_bingo_options *g:ale_go_bingo_options* + *b:ale_go_bingo_options* + Type: |String| + Default: `''` + + +=============================================================================== +cspell *ale-go-cspell* + +See |ale-cspell-options| + +=============================================================================== +gobuild *ale-go-gobuild* + +g:ale_go_gobuild_options *g:ale_go_gobuild_options* + *b:ale_go_gobuild_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the gobuild linter. + They are injected directly after "go test". + + +=============================================================================== +gofmt *ale-go-gofmt* + +g:ale_go_gofmt_options *g:ale_go_gofmt_options* + *b:ale_go_gofmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the gofmt fixer. + + +=============================================================================== +gofumpt *ale-go-gofumpt* + +g:ale_go_gofumpt_executable *g:ale_go_gofumpt_executable* + *b:ale_go_gofumpt_executable* + Type: |String| + Default: `'gofumpt'` + + Executable to run to use as the gofumpt fixer. + +g:ale_go_gofumpt_options *g:ale_go_gofumpt_options* + *b:ale_go_gofumpt_options* + Type: |String| + Default: `''` + + Options to pass to the gofumpt fixer. + + +=============================================================================== +golangci-lint *ale-go-golangci-lint* + +`golangci-lint` is a `lint_file` linter, which only lints files that are +written to disk. This differs from the default behavior of linting the buffer. +See: |ale-lint-file| + +g:ale_go_golangci_lint_executable *g:ale_go_golangci_lint_executable* + *b:ale_go_golangci_lint_executable* + Type: |String| + Default: `'golangci-lint'` + + The executable that will be run for golangci-lint. + + +g:ale_go_golangci_lint_options *g:ale_go_golangci_lint_options* + *b:ale_go_golangci_lint_options* + Type: |String| + Default: `'--enable-all'` + + This variable can be changed to alter the command-line arguments to the + golangci-lint invocation. + + +g:ale_go_golangci_lint_package *g:ale_go_golangci_lint_package* + *b:ale_go_golangci_lint_package* + Type: |Number| + Default: `0` + + When set to `1`, the whole Go package will be checked instead of only the + current file. + + +=============================================================================== +golangserver *ale-go-golangserver* + +g:ale_go_langserver_executable *g:ale_go_langserver_executable* + *b:ale_go_langserver_executable* + Type: |String| + Default: `'go-langserver'` + + Location of the go-langserver binary file. + + +g:ale_go_langserver_options *g:ale_go_langserver_options* + *b:ale_go_langserver_options* + Type: |String| + Default: `''` + + Additional options passed to the go-langserver command. Note that the + `-gocodecompletion` option is ignored because it is handled automatically + by the |g:ale_completion_enabled| variable. + + +=============================================================================== +golines *ale-go-golines* + +g:ale_go_golines_executable *g:ale_go_lines_executable* + *b:ale_go_lines_executable* + Type: |String| + Default: `'golines'` + + Location of the golines binary file + +g:ale_go_golines_options *g:ale_go_golines_options* + *b:ale_go_golines_options* + Type: |String| + Default: `''` + + Additional options passed to the golines command. By default golines has + --max-length=100 (lines above 100 characters will be wrapped) + + +=============================================================================== +golint *ale-go-golint* + +g:ale_go_golint_executable *g:ale_go_golint_executable* + *b:ale_go_golint_executable* + Type: |String| + Default: `'golint'` + + This variable can be set to change the golint executable path. + + +g:ale_go_golint_options *g:ale_go_golint_options* + *b:ale_go_golint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the golint linter. + + +=============================================================================== +gometalinter *ale-go-gometalinter* + +`gometalinter` is a `lint_file` linter, which only lints files that are +written to disk. This differs from the default behavior of linting the buffer. +See: |ale-lint-file| + +g:ale_go_gometalinter_executable *g:ale_go_gometalinter_executable* + *b:ale_go_gometalinter_executable* + Type: |String| + Default: `'gometalinter'` + + The executable that will be run for gometalinter. + + +g:ale_go_gometalinter_options *g:ale_go_gometalinter_options* + *b:ale_go_gometalinter_options* + Type: |String| + Default: `''` + + This variable can be changed to alter the command-line arguments to the + gometalinter invocation. + + Since `gometalinter` runs a number of linters that can consume a lot of + resources it's recommended to set this option to a value of `--fast` if you + use `gometalinter` as one of the linters in |g:ale_linters|. This disables a + number of linters known to be slow or consume a lot of resources. + + +g:ale_go_gometalinter_lint_package *g:ale_go_gometalinter_lint_package* + *b:ale_go_gometalinter_lint_package* + Type: |Number| + Default: `0` + + When set to `1`, the whole Go package will be checked instead of only the + current file. + + +=============================================================================== +gopls *ale-go-gopls* + +gopls is the official Go language server, and is enabled for use with ALE by +default. + +To install the latest stable version of `gopls` to your `$GOPATH`, try the +following command: > + + GO111MODULE=on go get golang.org/x/tools/gopls@latest +< +If `$GOPATH` is readable by ALE, it should probably work without you having to +do anything else. See the `gopls` README file for more information: + +https://github.com/golang/tools/blob/master/gopls/README.md + + +g:ale_go_gopls_executable *g:ale_go_gopls_executable* + *b:ale_go_gopls_executable* + Type: |String| + Default: `'gopls'` + + See |ale-integrations-local-executables| + + ALE will search for `gopls` in locally installed directories first by + default, and fall back on a globally installed `gopls` if it can't be found + otherwise. + + +g:ale_go_gopls_options *g:ale_go_gopls_options* + *b:ale_go_gopls_options* + Type: |String| + Default: `''` + + Command-line options passed to the gopls executable. See `gopls -h`. + + +g:ale_go_gopls_init_options *g:ale_go_gopls_init_options* + *b:ale_go_gopls_init_options* + Type: |Dictionary| + Default: `{}` + + LSP initialization options passed to gopls. This can be used to configure + the behaviour of gopls. + + Example: > + let g:ale_go_gopls_init_options = {'ui.diagnostic.analyses': { + \ 'composites': v:false, + \ 'unusedparams': v:true, + \ 'unusedresult': v:true, + \ }} +< + + For a full list of supported analyzers, see: + https://github.com/golang/tools/blob/master/gopls/doc/analyzers.md + + +g:ale_go_gopls_use_global *g:ale_go_gopls_use_global* + *b:ale_go_gopls_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +govet *ale-go-govet* + +g:ale_go_govet_options *g:ale_go_govet_options* + *b:ale_go_govet_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the go vet linter. + + +=============================================================================== +revive *ale-go-revive* + +g:ale_go_revive_executable *g:ale_go_revive_executable* + *b:ale_go_revive_executable* + Type: |String| + Default: `'revive'` + + This variable can be set to change the revive executable path. + + +g:ale_go_revive_options *g:ale_go_revive_options* + *b:ale_go_revive_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the revive + + +=============================================================================== +staticcheck *ale-go-staticcheck* + +g:ale_go_staticcheck_executable *g:ale_go_staticcheck_executable* + *b:ale_go_staticcheck_executable* + Type: |String| + Default: `'staticcheck'` + + See |ale-integrations-local-executables| + + ALE will search for `staticcheck` in locally installed directories first by + default, and fall back on a globally installed `staticcheck` if it can't be + found otherwise. + + +g:ale_go_staticcheck_options *g:ale_go_staticcheck_options* + *b:ale_go_staticcheck_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the staticcheck + linter. + + +g:ale_go_staticcheck_lint_package *g:ale_go_staticcheck_lint_package* + *b:ale_go_staticcheck_lint_package* + Type: |Number| + Default: `1` + + When set to `1`, the whole Go package will be checked instead of only the + current file. + + +g:ale_go_staticcheck_use_global *g:ale_go_staticcheck_use_global* + *b:ale_go_staticcheck_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-graphql.txt b/dot_vim/plugged/ale/doc/ale-graphql.txt new file mode 100644 index 0000000..603694b --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-graphql.txt @@ -0,0 +1,22 @@ +=============================================================================== +ALE GraphQL Integration *ale-graphql-options* + + +=============================================================================== +eslint *ale-graphql-eslint* + +The `eslint` linter for GraphQL uses the JavaScript options for `eslint`; see: +|ale-javascript-eslint|. + +You will need the GraphQL ESLint plugin installed for this to work. + +=============================================================================== +gqlint *ale-graphql-gqlint* + +=============================================================================== +prettier *ale-graphql-prettier* + +See |ale-javascript-prettier| for information about the available options. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-hack.txt b/dot_vim/plugged/ale/doc/ale-hack.txt new file mode 100644 index 0000000..4776b8c --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-hack.txt @@ -0,0 +1,51 @@ +=============================================================================== +ALE Hack Integration *ale-hack-options* + *ale-integration-hack* + + HHAST is disabled by default, as it executes code in the project root. + + Currently linters must be enabled globally. HHAST can be enabled with: + +> + let g:ale_linters = {'hack': ['hack', 'hhast']} +< + +=============================================================================== +hack *ale-hack-hack* + +g:ale_hack_hack_executable *g:ale_hack_hack_executable* + *b:ale_hack_hack_executable* + + Type: |String| + Default: `'hh_client'` + + This variable can be set to use a specific executable to interact with the + Hack typechecker. + + +=============================================================================== +hackfmt *ale-hack-hackfmt* + +g:ale_hack_hackfmt_options *g:ale_hack_hackfmt_options* + *b:ale_hack_hackfmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the hackfmt fixer. + + +=============================================================================== +hhast *ale-hack-hhast* + +g:ale_hack_hhast_executable *g:ale_hack_hhast_executable* + *b:ale_hack_hhast_executable* + + Type: |String| + Default: `'vendor/bin/hhast-lint'` + + This variable can be set to use a specific executable to interact with the + Hack typechecker. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-handlebars.txt b/dot_vim/plugged/ale/doc/ale-handlebars.txt new file mode 100644 index 0000000..4a5a387 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-handlebars.txt @@ -0,0 +1,34 @@ +=============================================================================== +ALE Handlebars Integration *ale-handlebars-options* + + +=============================================================================== +prettier *ale-handlebars-prettier* + +See |ale-javascript-prettier| for information about the available options. +Uses glimmer parser by default. + + +=============================================================================== +ember-template-lint *ale-handlebars-embertemplatelint* + +g:ale_handlebars_embertemplatelint_executable + *g:ale_handlebars_embertemplatelint_executable* + *b:ale_handlebars_embertemplatelint_executable* + Type: |String| + Default: `'ember-template-lint'` + + See |ale-integrations-local-executables| + + +g:ale_handlebars_embertemplatelint_use_global + *g:ale_handlebars_embertemplatelint_use_global* + *b:ale_handlebars_embertemplatelint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-haskell.txt b/dot_vim/plugged/ale/doc/ale-haskell.txt new file mode 100644 index 0000000..bd5a5ed --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-haskell.txt @@ -0,0 +1,228 @@ +=============================================================================== +ALE Haskell Integration *ale-haskell-options* + + +=============================================================================== +brittany *ale-haskell-brittany* + +g:ale_haskell_brittany_executable *g:ale_haskell_brittany_executable* + *b:ale_haskell_brittany_executable* + Type: |String| + Default: `'brittany'` + + This variable can be changed to use a different executable for brittany. + + +=============================================================================== +cspell *ale-haskell-cspell* + +See |ale-cspell-options| + + +=============================================================================== +floskell *ale-haskell-floskell* + +g:ale_haskell_floskell_executable *g:ale_haskell_floskell_executable* + *b:ale_haskell_floskell_executable* + Type: |String| + Default: `'floskell'` + + This variable can be changed to use a different executable for floskell. + + +=============================================================================== +ghc *ale-haskell-ghc* + +g:ale_haskell_ghc_options *g:ale_haskell_ghc_options* + *b:ale_haskell_ghc_options* + Type: |String| + Default: `'-fno-code -v0'` + + This variable can be changed to modify flags given to ghc. + + +=============================================================================== +ghc-mod *ale-haskell-ghc-mod* + +g:ale_haskell_ghc_mod_executable *g:ale_haskell_ghc_mod_executable* + *b:ale_haskell_ghc_mod_executable* + Type: |String| + Default: `'ghc-mod'` + + This variable can be changed to use a different executable for ghc-mod. + + +=============================================================================== +cabal-ghc *ale-haskell-cabal-ghc* + +g:ale_haskell_cabal_ghc_options *g:ale_haskell_cabal_ghc_options* + *b:ale_haskell_cabal_ghc_options* + Type: |String| + Default: `'-fno-code -v0'` + + This variable can be changed to modify flags given to ghc through cabal + exec. + + +=============================================================================== +hdevtools *ale-haskell-hdevtools* + +g:ale_haskell_hdevtools_executable *g:ale_haskell_hdevtools_executable* + *b:ale_haskell_hdevtools_executable* + Type: |String| + Default: `'hdevtools'` + + This variable can be changed to use a different executable for hdevtools. + + +g:ale_haskell_hdevtools_options *g:ale_haskell_hdevtools_options* + *b:ale_haskell_hdevtools_options* + Type: |String| + Default: `get(g:, 'hdevtools_options', '-g -Wall')` + + This variable can be changed to modify flags given to hdevtools. + + The hdevtools documentation recommends setting GHC options for `hdevtools` + with `g:hdevtools_options`. ALE will use the value of `g:hdevtools_options` + for the value of `g:ale_haskell_hdevtools_options` by default, so this + option can be respected and overridden specifically for ALE. + + +=============================================================================== +hfmt *ale-haskell-hfmt* + +g:ale_haskell_hfmt_executable *g:ale_haskell_hfmt_executable* + *b:ale_haskell_hfmt_executable* + Type: |String| + Default: `'hfmt'` + + This variable can be changed to use a different executable for hfmt. + + +=============================================================================== +hindent *ale-haskell-hindent* + +g:ale_haskell_hindent_executable *g:ale_haskell_hindent_executable* + *b:ale_haskell_hindent_executable* + Type: |String| + Default: `'hindent'` + + This variable can be changed to use a different executable for hindent. + + +=============================================================================== +hlint *ale-haskell-hlint* + +g:ale_haskell_hlint_executable *g:ale_haskell_hlint_executable* + *b:ale_haskell_hlint_executable* + Type: |String| + Default: `'hlint'` + + This variable can be changed to use a different executable for hlint. + + +g:ale_haskell_hlint_options g:ale_haskell_hlint_options + b:ale_haskell_hlint_options + Type: |String| + Default: `''` + + This variable can be used to pass extra options to the underlying hlint + executable. + + +=============================================================================== +hls *ale-haskell-hls* + +g:ale_haskell_hls_executable *g:ale_haskell_hls_executable* + *b:ale_haskell_hls_executable* + Type: |String| + Default: `'haskell-language-server-wrapper'` + + This variable can be changed to use a different executable for the haskell + language server. + + +g:ale_haskell_hls_config *g:ale_haskell_hls_config* + *b:ale_haskell_hls_config* + Type: |Dictionary| + Default: `{}` + + Dictionary with configuration settings for HLS. For example, to see more + completions: +> + let g:ale_haskell_hls_config = {'haskell': {'maxCompletions': 250}} +< + Refer to HLS documentation for possible settings: + https://haskell-language-server.readthedocs.io/en/latest/configuration.html#language-specific-server-options + + +=============================================================================== +stack-build *ale-haskell-stack-build* + +g:ale_haskell_stack_build_options *g:ale_haskell_stack_build_options* + *b:ale_haskell_stack_build_options* + Type: |String| + Default: `'--fast'` + + We default to using `'--fast'`. Since Stack generates binaries, your + programs will be slower unless you separately rebuild them outside of ALE. + + +=============================================================================== +stack-ghc *ale-haskell-stack-ghc* + +g:ale_haskell_stack_ghc_options *g:ale_haskell_stack_ghc_options* + *b:ale_haskell_stack_ghc_options* + Type: |String| + Default: `'-fno-code -v0'` + + This variable can be changed to modify flags given to ghc through `stack + ghc` + + +=============================================================================== +stylish-haskell *ale-haskell-stylish-haskell* + +g:ale_haskell_stylish_haskell_executable + *g:ale_haskell_stylish_haskell_executable* + *b:ale_haskell_stylish_haskell_executable* + Type: |String| + Default: `'stylish-haskell'` + + This variable can be changed to use a different executable for stylish-haskell. + + +=============================================================================== +hie *ale-haskell-hie* + +g:ale_haskell_hie_executable *g:ale_haskell_hie_executable* + *b:ale_haskell_hie_executable* + Type: |String| + Default: `'hie'` + + This variable can be changed to use a different executable for the haskell + ide engine. i.e. `'hie-wrapper'` + + +=============================================================================== +ormolu *ale-haskell-ormolu* + +g:ale_haskell_ormolu_executable *g:ale_haskell_ormolu_executable* + *b:ale_haskell_ormolu_executable* + Type: |String| + Default: `'ormolu'` + + This variable can be changed to use a different executable for ormolu. + + +g:ale_haskell_ormolu_options *g:ale_haskell_ormolu_options* + *b:ale_haskell_ormolu_options* + Type: |String| + Default: `''` + + This variable can be used to pass extra options to the underlying ormolu + executable. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-hcl.txt b/dot_vim/plugged/ale/doc/ale-hcl.txt new file mode 100644 index 0000000..71e1114 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-hcl.txt @@ -0,0 +1,16 @@ +=============================================================================== +ALE HCL Integration *ale-hcl-options* + + +=============================================================================== +packer-fmt *ale-hcl-packer-fmt* + +See |ale-packer-fmt-fixer| for information about the available options. + +=============================================================================== +terraform-fmt *ale-hcl-terraform-fmt* + +See |ale-terraform-fmt-fixer| for information about the available options. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-help.txt b/dot_vim/plugged/ale/doc/ale-help.txt new file mode 100644 index 0000000..8987254 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-help.txt @@ -0,0 +1,12 @@ +=============================================================================== +ALE Help Integration *ale-help-options* + + +=============================================================================== +cspell *ale-help-cspell* + +See |ale-cspell-options| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-html.txt b/dot_vim/plugged/ale/doc/ale-html.txt new file mode 100644 index 0000000..6d18afd --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-html.txt @@ -0,0 +1,202 @@ +=============================================================================== +ALE HTML Integration *ale-html-options* + + +=============================================================================== +angular *ale-html-angular* + +ALE supports language server features for Angular. You can install it via `npm`: > + + $ npm install --save-dev @angular/language-server +< +Angular 11 and up are supported. + + +g:ale_html_angular_executable *g:ale_html_angular_executable* + *b:ale_html_angular_executable* + Type: |String| + Default: `'ngserver'` + + See |ale-integrations-local-executables| + + +g:ale_html_angular_use_global *g:ale_html_angular_use_global* + *b:ale_html_angular_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +cspell *ale-html-cspell* + +See |ale-cspell-options| + +=============================================================================== +fecs *ale-html-fecs* + +`fecs` options for HTML are the same as the options for JavaScript, and both +of them read `./.fecsrc` as the default configuration file. + +See: |ale-javascript-fecs|. + + +=============================================================================== +html-beautify *ale-html-beautify* + +g:ale_html_beautify_executable *g:ale_html_beautify_executable* + *b:ale_html_beautify_executable* + Type: |String| + Default: `'html-beautify'` + + See |ale-integrations-local-executables| + + +g:ale_html_beautify_options *g:ale_html_beautify_options* + *b:ale_html_beautify_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to html-beautify. + + +g:ale_html_beautify_use_global *g:ale_html_beautify_use_global* + *b:ale_html_beautify_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +htmlhint *ale-html-htmlhint* + +g:ale_html_htmlhint_executable *g:ale_html_htmlhint_executable* + *b:ale_html_htmlhint_executable* + Type: |String| + Default: `'htmlhint'` + + See |ale-integrations-local-executables| + + +g:ale_html_htmlhint_options *g:ale_html_htmlhint_options* + *b:ale_html_htmlhint_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to HTMLHint. + + +g:ale_html_htmlhint_use_global *g:ale_html_htmlhint_use_global* + *b:ale_html_htmlhint_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +prettier *ale-html-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +stylelint *ale-html-stylelint* + +g:ale_html_stylelint_executable *g:ale_html_stylelint_executable* + *b:ale_html_stylelint_executable* + Type: |String| + Default: `'stylelint'` + + See |ale-integrations-local-executables| + + +g:ale_html_stylelint_options *g:ale_html_stylelint_options* + *b:ale_html_stylelint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to stylelint. + + +g:ale_html_stylelint_use_global *g:ale_html_stylelint_use_global* + *b:ale_html_stylelint_use_global* + Type: |String| + Default: `0` + + See |ale-integrations-local-executables| + + +=============================================================================== +tidy *ale-html-tidy* + +`tidy` is a console application which corrects and cleans up HTML and XML +documents by fixing markup errors and upgrading legacy code to modern +standards. + +Note: +`/usr/bin/tidy` on macOS (installed by default) is too old. It was released +on 31 Oct 2006. It does not consider modern HTML specs (HTML5) and shows +outdated warnings. So |ale| ignores `/usr/bin/tidy` on macOS. + +To use `tidy` on macOS, please install the latest version with Homebrew: +> + $ brew install tidy-html5 +< +`/usr/local/bin/tidy` is installed. + +g:ale_html_tidy_executable *g:ale_html_tidy_executable* + *b:ale_html_tidy_executable* + Type: |String| + Default: `'tidy'` + + This variable can be changed to change the path to tidy. + + +g:ale_html_tidy_options *g:ale_html_tidy_options* + *b:ale_html_tidy_options* + Type: |String| + Default: `'-q -e -language en'` + + This variable can be changed to change the arguments provided to the + executable. + + ALE will attempt to automatically detect the appropriate file encoding to + provide to html-tidy, and fall back to UTF-8 when encoding detection fails. + + The recognized file encodings are as follows: ascii, big5, cp1252 (win1252), + cp850 (ibm858), cp932 (shiftjis), iso-2022-jp (iso-2022), latin1, macroman + (mac), sjis (shiftjis), utf-16le, utf-16, utf-8 + + +g:ale_html_tidy_use_global *g:html_tidy_use_global* + + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +vscodehtml *ale-html-vscode* + +Website: https://github.com/hrsh7th/vscode-langservers-extracted + +Installation +------------------------------------------------------------------------------- + +Install VSCode html language server either globally or locally: > + + npm install -g vscode-langservers-extracted +< + +=============================================================================== +write-good *ale-html-write-good* + +See |ale-write-good-options| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-idris.txt b/dot_vim/plugged/ale/doc/ale-idris.txt new file mode 100644 index 0000000..c7500b0 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-idris.txt @@ -0,0 +1,23 @@ +=============================================================================== +ALE Idris Integration *ale-idris-options* + +=============================================================================== +idris *ale-idris-idris* + +g:ale_idris_idris_executable *g:ale_idris_idris_executable* + *b:ale_idris_idris_executable* + Type: |String| + Default: `'idris'` + + This variable can be changed to change the path to idris. + + +g:ale_idris_idris_options *g:ale_idris_idris_options* + *b:ale_idris_idris_options* + Type: |String| + Default: `'--total --warnpartial --warnreach --warnipkg'` + + This variable can be changed to modify flags given to idris. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-ink.txt b/dot_vim/plugged/ale/doc/ale-ink.txt new file mode 100644 index 0000000..9412a09 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-ink.txt @@ -0,0 +1,40 @@ +=============================================================================== +ALE Ink Integration *ale-ink-options* + + +=============================================================================== +ink-language-server *ale-ink-language-server* + +Ink Language Server + (https://github.com/ephraim/ink-language-server) + +g:ale_ink_ls_executable g:ale_ink_ls_executable + b:ale_ink_ls_executable + Type: |String| + Default: `'ink-language-server'` + + Ink language server executable. + +g:ale_ink_ls_initialization_options + g:ale_ink_ls_initialization_options + b:ale_ink_ls_initialization_options + Type: |Dictionary| + Default: `{}` + + Dictionary containing configuration settings that will be passed to the + language server at startup. For certain platforms and certain story + structures, the defaults will suffice. However, many projects will need to + change these settings - see the ink-language-server website for more + information. + + An example of setting non-default options: + { + \ 'ink': { + \ 'mainStoryPath': 'init.ink', + \ 'inklecateExecutablePath': '/usr/local/bin/inklecate', + \ 'runThroughMono': v:false + \ } + \} + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-inko.txt b/dot_vim/plugged/ale/doc/ale-inko.txt new file mode 100644 index 0000000..5ca14af --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-inko.txt @@ -0,0 +1,22 @@ +=============================================================================== +ALE Inko Integration *ale-inko-options* + *ale-integration-inko* + +=============================================================================== +Integration Information + + Currently, the only supported linter for Inko is the Inko compiler itself. + +=============================================================================== +inko *ale-inko-inko* + +g:ale_inko_inko_executable *g:ale_inko_inko_executable* + *b:ale_inko_inko_executable* + Type: |String| + Default: `'inko'` + + This variable can be modified to change the executable path for `inko`. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-ispc.txt b/dot_vim/plugged/ale/doc/ale-ispc.txt new file mode 100644 index 0000000..bf30e8e --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-ispc.txt @@ -0,0 +1,24 @@ +=============================================================================== +ALE ISPC Integration *ale-ispc-options* + + +=============================================================================== +ispc *ale-ispc-ispc* + +g:ale_ispc_ispc_executable *g:ale_ispc_ispc_executable* + *b:ale_ispc_ispc_executable* + Type: |String| + Default: `'ispc'` + + This variable can be changed to use a different executable for ispc. + + +g:ale_ispc_ispc_options *g:ale_ispc_ispc_options* + *b:ale_ispc_ispc_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to ispc. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-java.txt b/dot_vim/plugged/ale/doc/ale-java.txt new file mode 100644 index 0000000..6961186 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-java.txt @@ -0,0 +1,291 @@ +=============================================================================== +ALE Java Integration *ale-java-options* + + +=============================================================================== +checkstyle *ale-java-checkstyle* + +g:ale_java_checkstyle_config *g:ale_java_checkstyle_config* + *b:ale_java_checkstyle_config* + + Type: |String| + Default: `'/google_checks.xml'` + + A path to a checkstyle configuration file. + + If a configuration file is specified with |g:ale_java_checkstyle_options|, + it will be preferred over this setting. + + The path to the configuration file can be an absolute path or a relative + path. ALE will search for the relative path in parent directories. + + +g:ale_java_checkstyle_executable *g:ale_java_checkstyle_executable* + *b:ale_java_checkstyle_executable* + + Type: |String| + Default: `'checkstyle'` + + This variable can be changed to modify the executable used for checkstyle. + + +g:ale_java_checkstyle_options *g:ale_java_checkstyle_options* + *b:ale_java_checkstyle_options* + + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to checkstyle. + + If a configuration file is specified with `-c`, it will be used instead of + configuration files set with |g:ale_java_checkstyle_config|. + + +=============================================================================== +clang-format *ale-java-clangformat* + +See |ale-c-clangformat| for information about the available options. +Note that the C options are also used for Java. + + +=============================================================================== +cspell *ale-java-cspell* + +See |ale-cspell-options| + + +=============================================================================== +javac *ale-java-javac* + +g:ale_java_javac_classpath *g:ale_java_javac_classpath* + *b:ale_java_javac_classpath* + Type: |String| or |List| + Default: `''` + + This variable can be set to change the global classpath for Java. + + +g:ale_java_javac_executable *g:ale_java_javac_executable* + *b:ale_java_javac_executable* + Type: |String| + Default: `'javac'` + + This variable can be set to change the executable path used for javac. + + +g:ale_java_javac_options *g:ale_java_javac_options* + *b:ale_java_javac_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to javac. + +g:ale_java_javac_sourcepath *g:ale_java_javac_sourcepath* + *b:ale_java_javac_sourcepath* + Type: |String| or |List| + Default: `''` + +This variable can set multiple source code paths, the source code path is a +relative path (relative to the project root directory). + +Example: + +String type: +Note that the unix system separator is a colon(`:`) window system +is a semicolon(`;`). +> + let g:ale_java_javac_sourcepath = 'build/gen/source/xx/main:build/gen/source' +< +List type: +> + let g:ale_java_javac_sourcepath = [ + \ 'build/generated/source/querydsl/main', + \ 'target/generated-sources/source/querydsl/main' + \ ] +< + +=============================================================================== +google-java-format *ale-java-google-java-format* + + +g:ale_java_google_java_format_executable + *g:ale_java_google_java_format_executable* + *b:ale_java_google_java_format_executable* + Type: |String| + Default: `'google-java-format'` + + See |ale-integrations-local-executables| + + +g:ale_java_google_java_format_options *g:ale_java_google_java_format_options* + *b:ale_java_google_java_format_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options + + +=============================================================================== +pmd *ale-java-pmd* + +g:ale_java_pmd_options *g:ale_java_pmd_options* + *b:ale_java_pmd_options* + + Type: |String| + Default: `'-R category/java/bestpractices'` + + This variable can be changed to modify flags given to PMD. Do not specify -f + and -d. They are added automatically. + + +=============================================================================== +javalsp *ale-java-javalsp* + +To enable Java LSP linter you need to download and build the vscode-javac +language server from https://github.com/georgewfraser/java-language-server. + +Before building the language server you need to install pre-requisites: npm, +maven, and protobuf. You also need to have Java 13 and JAVA_HOME properly +set. + +After downloading the source code and installing all pre-requisites you can +build the language server with the included build.sh script: + + scripts/build.sh + +This will create launch scripts for Linux, Mac, and Windows in the dist folder +within the repo: + + - lang_server_linux.sh + - lang_server_mac.sh + - lang_server_windows.sh + +To let ALE use this language server you need to set the +g:ale_java_javalsp_executable variable to the absolute path of the launcher +executable for your platform. + +g:ale_java_javalsp_executable *g:ale_java_javalsp_executable* + *b:ale_java_javalsp_executable* + Type: |String| + Default: `''` + +This variable must be set to the absolute path of the language server launcher +executable. For example: +> + let g:ale_java_javalsp_executable=/java-language-server/dist/lang_server_linux.sh +< + +g:ale_java_javalsp_config *g:ale_java_javalsp_config* + *b:ale_java_javalsp_config* + Type: |Dictionary| + Default: `{}` + +The javalsp linter automatically detects external dependencies for Maven and +Gradle projects. In case the javalsp fails to detect some of them, you can +specify them setting a dictionary to |g:ale_java_javalsp_config| variable. +> + let g:ale_java_javalsp_config = + \ { + \ 'java': { + \ 'externalDependencies': [ + \ 'junit:junit:jar:4.12:test', " Maven format + \ 'junit:junit:4.1' " Gradle format + \ ], + \ 'classPath': [ + \ 'lib/some-dependency.jar', + \ '/android-sdk/platforms/android-28.jar' + \ ] + \ } + \ } + +The Java language server will look for the dependencies you specify in +`externalDependencies` array in your Maven and Gradle caches ~/.m2 and +~/.gradle. + + +=============================================================================== +eclipselsp *ale-java-eclipselsp* + +To enable Eclipse JDT LSP linter you need to clone and build the eclipse.jdt.ls +language server from https://github.com/eclipse/eclipse.jdt.ls. Simply +clone the source code repo and then build the plugin: + + ./mvnw clean verify + +Note: currently, the build can only run when launched with JDK 11. More +recent versions can be used to run the server though. + +After build completes the files required to run the language server will be +located inside the repository folder `eclipse.jdt.ls`. Please ensure to set +|g:ale_java_eclipselsp_path| to the absolute path of that folder. + +You could customize compiler options and code assists of the server. +Under your project folder, modify the file `.settings/org.eclipse.jdt.core.prefs` +with options presented at +https://help.eclipse.org/neon/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/JavaCore.html. + +g:ale_java_eclipselsp_path *g:ale_java_eclipselsp_path* + *b:ale_java_eclipselsp_path* + + Type: |String| + Default: `'$HOME/eclipse.jdt.ls'` + + Absolute path to the location of the eclipse.jdt.ls repository folder. Or if + you have VSCode extension installed the absolute path to the VSCode + extensions folder (e.g. $HOME/.vscode/extensions/redhat.java-0.4x.0 in + Linux). + + +g:ale_java_eclipselsp_executable *g:ale_java_eclipse_executable* + *b:ale_java_eclipse_executable* + Type: |String| + Default: `'java'` + + This variable can be set to change the executable path used for java. + + +g:ale_java_eclipselsp_config_path *g:ale_java_eclipse_config_path* + *b:ale_java_eclipse_config_path* + Type: |String| + Default: `''` + + Set this variable to change the configuration directory path used by + eclipselsp (e.g. `$HOME/.jdtls` in Linux). + By default ALE will attempt to use the configuration within the installation + directory. + This setting is particularly useful when eclipselsp is installed in a + non-writable directory like `/usr/share/java/jdtls`, as is the case when + installed via system package. + + +g:ale_java_eclipselsp_workspace_path *g:ale_java_eclipselsp_workspace_path* + *b:ale_java_eclipselsp_workspace_path* + + Type: |String| + Default: `''` + + If you have Eclipse installed is good idea to set this variable to the + absolute path of the Eclipse workspace. If not set this value will be set to + the parent folder of the project root. + +g:ale_java_eclipselsp_javaagent *g:ale_java_eclipselsp_javaagent* + *b:ale_java_eclipselsp_javaagent* + + Type: |String| + Default: `''` + + A variable to add java agent for annotation processing such as Lombok. + If you have multiple java agent files, use space to separate them. + For example: +> + let g:ale_java_eclipselsp_javaagent='/eclipse/lombok.jar /eclipse/jacoco.jar' +< + +=============================================================================== +uncrustify *ale-java-uncrustify* + +See |ale-c-uncrustify| for information about the available options. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-javascript.txt b/dot_vim/plugged/ale/doc/ale-javascript.txt new file mode 100644 index 0000000..a55cd64 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-javascript.txt @@ -0,0 +1,363 @@ +=============================================================================== +ALE JavaScript Integration *ale-javascript-options* + + *ale-eslint-nested-configuration-files* + +For fixing files with ESLint, nested configuration files with `root: false` +are not supported. This is because ALE fixes files by writing the contents of +buffers to temporary files, and then explicitly sets the configuration file. +Configuration files which are set explicitly must be root configuration files. +If you are using nested configuration files, you should restructure your +project so your configuration files use `extends` instead. + +See the ESLint documentation here: +http://eslint.org/docs/user-guide/configuring#extending-configuration-files + +You should change the structure of your project from this: > + /path/foo/.eslintrc.js # root: true + /path/foo/bar/.eslintrc.js # root: false +< + +To this: > + /path/foo/.base-eslintrc.js # Base configuration here + /path/foo/.eslintrc.js # extends: ["/path/foo/.base-eslintrc.js"] + /path/foo/bar/.eslintrc.js # extends: ["/path/foo/.base-eslintrc.js"] +< + + +=============================================================================== +clang-format *ale-javascript-clangformat* + +See |ale-c-clangformat| for information about the available options. +Note that the C options are also used for JavaScript. + + +=============================================================================== +cspell *ale-javascript-cspell* + +See |ale-cspell-options| + + +=============================================================================== +deno *ale-javascript-deno* + +Check the docs over at |ale-typescript-deno|. + + +=============================================================================== +dprint *ale-javascript-dprint* + +See |ale-dprint-options| and https://dprint.dev/plugins/typescript + + +=============================================================================== +eslint *ale-javascript-eslint* + +g:ale_javascript_eslint_executable *g:ale_javascript_eslint_executable* + *b:ale_javascript_eslint_executable* + Type: |String| + Default: `'eslint'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_eslint_options *g:ale_javascript_eslint_options* + *b:ale_javascript_eslint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to eslint. + + +g:ale_javascript_eslint_use_global *g:ale_javascript_eslint_use_global* + *b:ale_javascript_eslint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_javascript_eslint_suppress_eslintignore + *g:ale_javascript_eslint_suppress_eslintignore* + *b:ale_javascript_eslint_suppress_eslintignore* + Type: |Number| + Default: `0` + + This variable can be set to `1` to disable warnings for files being ignored + by eslint. + + +g:ale_javascript_eslint_suppress_missing_config + *g:ale_javascript_eslint_suppress_missing_config* + *b:ale_javascript_eslint_suppress_missing_config* + Type: |Number| + Default: `0` + + This variable can be set to `1` to disable errors for missing eslint + configuration files. + + When turning this option on, eslint will not report any problems when no + configuration files are found. + + +=============================================================================== +fecs *ale-javascript-fecs* + +`fecs` is a lint tool for HTML/CSS/JavaScript, can be installed via: + + `$ npm install --save-dev fecs` + +And the configuration file is located at `./fecsrc`, see http://fecs.baidu.com +for more options. + + +g:ale_javascript_fecs_executable *g:ale_javascript_fecs_executable* + *b:ale_javascript_fecs_executable* + Type: |String| + Default: `'fecs'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_fecs_use_global *g:ale_javascript_fecs_use_global* + *b:ale_javascript_fecs_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +flow *ale-javascript-flow* + +g:ale_javascript_flow_executable *g:ale_javascript_flow_executable* + *b:ale_javascript_flow_executable* + Type: |String| + Default: `'flow'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_flow_use_home_config *g:ale_javascript_flow_use_home_config* + *b:ale_javascript_flow_use_home_config* + Type: |Number| + Default: `0` + + When set to `1`, ALE will allow Flow to be executed with configuration files + from your home directory. ALE will not run Flow with home directory + configuration files by default, as doing so can lead to Vim consuming all of + your RAM and CPU power. + + +g:ale_javascript_flow_use_global *g:ale_javascript_flow_use_global* + *b:ale_javascript_flow_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_javascript_flow_use_respect_pragma + *g:ale_javascript_flow_use_respect_pragma* + *b:ale_javascript_flow_use_respect_pragma* + Type: |Number| + Default: `1` + + By default, ALE will use the `--respect-pragma` option for `flow`, so only + files with the `@flow` pragma are checked by ALE. This option can be set to + `0` to disable that behavior, so all files can be checked by `flow`. + + +=============================================================================== +importjs *ale-javascript-importjs* + +g:ale_javascript_importjs_executable *g:ale_javascript_importjs_executable* + *b:ale_javascript_importjs_executable* + Type: |String| + Default: `'importjs'` + + +=============================================================================== +jscs *ale-javascript-jscs* + +g:ale_javascript_jscs_executable *g:ale_javascript_jscs_executable* + *b:ale_javascript_jscs_executable* + Type: |String| + Default: `'jscs'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_jscs_use_global *g:ale_javascript_jscs_use_global* + *b:ale_javascript_jscs_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +jshint *ale-javascript-jshint* + +g:ale_javascript_jshint_executable *g:ale_javascript_jshint_executable* + *b:ale_javascript_jshint_executable* + Type: |String| + Default: `'jshint'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_jshint_use_global *g:ale_javascript_jshint_use_global* + *b:ale_javascript_jshint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +prettier *ale-javascript-prettier* + +g:ale_javascript_prettier_executable *g:ale_javascript_prettier_executable* + *b:ale_javascript_prettier_executable* + Type: |String| + Default: `'prettier'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_prettier_options *g:ale_javascript_prettier_options* + *b:ale_javascript_prettier_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to prettier. + + +g:ale_javascript_prettier_use_global *g:ale_javascript_prettier_use_global* + *b:ale_javascript_prettier_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +prettier-eslint *ale-javascript-prettier-eslint* + +g:ale_javascript_prettier_eslint_executable + *g:ale_javascript_prettier_eslint_executable* + *b:ale_javascript_prettier_eslint_executable* + Type: |String| + Default: `'prettier-eslint'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_prettier_eslint_options + *g:ale_javascript_prettier_eslint_options* + *b:ale_javascript_prettier_eslint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to prettier-eslint. + + +g:ale_javascript_prettier_eslint_use_global + *g:ale_javascript_prettier_eslint_use_global* + *b:ale_javascript_prettier_eslint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +prettier-standard *ale-javascript-prettier-standard* + + +g:ale_javascript_prettier_standard_executable + *g:ale_javascript_prettier_standard_executable* + *b:ale_javascript_prettier_standard_executable* + Type: |String| + Default: `'prettier-standard'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_prettier_standard_options + *g:ale_javascript_prettier_standard_options* + *b:ale_javascript_prettier_standard_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to prettier-standard. + + +g:ale_javascript_prettier_standard_use_global + *g:ale_javascript_prettier_standard_use_global* + *b:ale_javascript_prettier_standard_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + + + +=============================================================================== +standard *ale-javascript-standard* + +g:ale_javascript_standard_executable *g:ale_javascript_standard_executable* + *b:ale_javascript_standard_executable* + Type: |String| + Default: `'standard'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_standard_options *g:ale_javascript_standard_options* + *b:ale_javascript_standard_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to standard. + + +g:ale_javascript_standard_use_global *g:ale_javascript_standard_use_global* + *b:ale_javascript_standard_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +xo *ale-javascript-xo* + +g:ale_javascript_xo_executable *g:ale_javascript_xo_executable* + *b:ale_javascript_xo_executable* + Type: |String| + Default: `'xo'` + + See |ale-integrations-local-executables| + + +g:ale_javascript_xo_options *g:ale_javascript_xo_options* + *b:ale_javascript_xo_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to xo. + + +g:ale_javascript_xo_use_global *g:ale_javascript_xo_use_global* + *b:ale_javascript_xo_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-json.txt b/dot_vim/plugged/ale/doc/ale-json.txt new file mode 100644 index 0000000..7b24037 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-json.txt @@ -0,0 +1,177 @@ +=============================================================================== +ALE JSON Integration *ale-json-options* + + +=============================================================================== +clang-format *ale-json-clangformat* + +See |ale-c-clangformat| for information about the available options. +Note that the C options are also used for JSON. + + +=============================================================================== +cspell *ale-json-cspell* + +See |ale-cspell-options| + + +=============================================================================== +dprint *ale-json-dprint* + +See |ale-dprint-options| and https://dprint.dev/plugins/json + + +=============================================================================== +eslint *ale-json-eslint* + +The `eslint` linter for JSON uses the JavaScript options for `eslint`; see: +|ale-javascript-eslint|. + +You will need a JSON ESLint plugin installed for this to work. + + +=============================================================================== +fixjson *ale-json-fixjson* + +fixjson is a JSON file fixer/formatter for humans using (relaxed) JSON5. +It provides: + +- Pretty-prints JSON input +- Fixes various failures while humans writing JSON + - Fixes trailing commas objects or arrays + - Fixes missing commas for elements of objects or arrays + - Adds quotes to keys in objects + - Newlines in strings + - Hex numbers + - Fixes single quotes to double quotes + +You can install it using npm: +> + $ npm install -g fixjson +< +ALE provides fixjson integration as a fixer. See |ale-fix|. + +g:ale_json_fixjson_executable *g:ale_json_fixjson_executable* + *b:ale_json_fixjson_executable* + + Type: |String| + Default: `'fixjson'` + + The executable that will be run for fixjson. + +g:ale_json_fixjson_options *g:ale_json_fixjson_options* + *b:ale_json_fixjson_options* + + Type: |String| + Default: `''` + + This variable can add extra options to the command executed for running + fixjson. + +g:ale_json_fixjson_use_global *g:ale_json_fixjson_use_global* + *b:ale_json_fixjson_use_global* + + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +jsonlint *ale-json-jsonlint* + +g:ale_json_jsonlint_executable *g:ale_json_jsonlint_executable* + *b:ale_json_jsonlint_executable* + + Type: |String| + Default: `'jsonlint'` + + The executable that will be run for jsonlint. + +g:ale_json_jsonlint_use_global *g:ale_json_jsonlint_use_global* + *b:ale_json_jsonlint_use_global* + + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +jq *ale-json-jq* + +g:ale_json_jq_executable *g:ale_json_jq_executable* + *b:ale_json_jq_executable* + Type: |String| + Default: `'jq'` + + This option can be changed to change the path for `jq`. + + +g:ale_json_jq_options *g:ale_json_jq_options* + *b:ale_json_jq_options* + Type: |String| + Default: `''` + + This option can be changed to pass extra options to `jq`. + +g:ale_json_jq_filters *g:ale_json_jq_filters* + *b:ale_json_jq_filters* + Type: |String| + Default: `'.'` + + This option can be changed to pass custom filters to `jq`. + + +=============================================================================== +prettier *ale-json-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +spectral *ale-json-spectral* + +Website: https://github.com/stoplightio/spectral + +Installation +------------------------------------------------------------------------------- + +Install spectral either globally or locally: > + + npm install @stoplight/spectral -g # global + npm install @stoplight/spectral # local +< + +Options +------------------------------------------------------------------------------- + +g:ale_json_spectral_executable *g:ale_json_spectral_executable* + *b:ale_json_spectral_executable* + Type: |String| + Default: `'spectral'` + + This variable can be set to change the path to spectral. + +g:ale_json_spectral_use_global *g:ale_json_spectral_use_global* + *b:ale_json_spectral_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + +=============================================================================== +vscodejson *ale-json-vscode* + +Website: https://github.com/hrsh7th/vscode-langservers-extracted + +Installation +------------------------------------------------------------------------------- + +Install VSCode json language server either globally or locally: > + + npm install -g vscode-langservers-extracted +< + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-json5.txt b/dot_vim/plugged/ale/doc/ale-json5.txt new file mode 100644 index 0000000..bafa60d --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-json5.txt @@ -0,0 +1,15 @@ +=============================================================================== +ALE JSON5 Integration *ale-json5-options* + + +=============================================================================== +eslint *ale-json5-eslint* + +The `eslint` linter for JSON uses the JavaScript options for `eslint`; see: +|ale-javascript-eslint|. + +You will need a JSON5 ESLint plugin installed for this to work. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-jsonc.txt b/dot_vim/plugged/ale/doc/ale-jsonc.txt new file mode 100644 index 0000000..92247cd --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-jsonc.txt @@ -0,0 +1,15 @@ +=============================================================================== +ALE JSONC Integration *ale-jsonc-options* + + +=============================================================================== +eslint *ale-jsonc-eslint* + +The `eslint` linter for JSON uses the JavaScript options for `eslint`; see: +|ale-javascript-eslint|. + +You will need a JSONC ESLint plugin installed for this to work. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-jsonnet.txt b/dot_vim/plugged/ale/doc/ale-jsonnet.txt new file mode 100644 index 0000000..f99d415 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-jsonnet.txt @@ -0,0 +1,43 @@ +=============================================================================== +ALE Jsonnet Integration *ale-jsonnet-options* + + +=============================================================================== +jsonnetfmt *ale-jsonnet-jsonnetfmt* + +g:ale_jsonnet_jsonnetfmt_executable *g:ale_jsonnet_jsonnetfmt_executable* + *b:ale_jsonnet_jsonnetfmt_executable* + Type: |String| + Default: `'jsonnetfmt'` + + This option can be changed to change the path for `jsonnetfmt`. + + +g:ale_jsonnet_jsonnetfmt_options *g:ale_jsonnet_jsonnetfmt_options* + *b:ale_jsonnet_jsonnetfmt_options* + Type: |String| + Default: `''` + + This option can be changed to pass extra options to `jsonnetfmt`. + + +=============================================================================== +jsonnet-lint *ale-jsonnet-jsonnet-lint* + +g:ale_jsonnet_jsonnet_lint_executable *g:ale_jsonnet_jsonnet_lint_executable* + *b:ale_jsonnet_jsonnet_lint_executable* + Type: |String| + Default: `'jsonnet-lint'` + + This option can be changed to change the path for `jsonnet-lint`. + + +g:ale_jsonnet_jsonnet_lint_options *g:ale_jsonnet_jsonnet_lint_options* + *b:ale_jsonnet_jsonnet_lint_options* + Type: |String| + Default: `''` + + This option can be changed to pass extra options to `jsonnet-lint`. + + + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-julia.txt b/dot_vim/plugged/ale/doc/ale-julia.txt new file mode 100644 index 0000000..ab74ee1 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-julia.txt @@ -0,0 +1,20 @@ +=============================================================================== +ALE Julia Integration *ale-julia-options* + +=============================================================================== +languageserver *ale-julia-languageserver* + +To enable Julia LSP linter you need to install the LanguageServer.jl package +within julia. + +g:ale_julia_executable *g:ale_julia_executable* + *b:ale_julia_executable* + + Type: |String| + Default: `'julia'` + + Path to the julia exetuable. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: + diff --git a/dot_vim/plugged/ale/doc/ale-kotlin.txt b/dot_vim/plugged/ale/doc/ale-kotlin.txt new file mode 100644 index 0000000..87cf56c --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-kotlin.txt @@ -0,0 +1,113 @@ +=============================================================================== +ALE Kotlin Integration *ale-kotlin-options* + *ale-integration-kotlin* + +=============================================================================== +Integration Information + + Make sure your setup has support for the kotlin file type. A filetype plugin + can be found here: https://github.com/udalov/kotlin-vim + + + Note: Make sure you have a working kotlin compiler + + +=============================================================================== +kotlinc *ale-kotlin-kotlinc* + +g:ale_kotlin_kotlinc_options *g:ale_kotlin_kotlinc_options* + Type: |String| + Default: `''` + + Additional options to pass to the kotlin compiler + +g:ale_kotlin_kotlinc_enable_config *g:ale_kotlin_kotlinc_enable_config* + Type: |Number| + Default: `0` + + Setting this variable to `1` tells the linter to load a configuration file. + This should be set in your vimrc + +g:ale_kotlin_kotlinc_config_file *g:ale_kotlin_kotlinc_config_file* + Type: |String| + Default: `'.ale_kotlin_kotlinc_config'` + + Filename of the configuration file. This should be set in your vimrc + +g:ale_kotlin_kotlinc_classpath *g:ale_kotlin_kotlinc_classpath* + Type: |String| + Default: `''` + + A string containing the paths (separated by the appropriate path separator) + of the source directories. + +g:ale_kotlin_kotlinc_sourcepath *g:ale_kotlin_kotlinc_sourcepath* + Type: |String| + Default: `''` + + A string containing the paths (separated by space) of the source + directories. + +g:ale_kotlin_kotlinc_use_module_file *g:ale_kotlin_kotlinc_use_module_file* + Type: |Number| + Default: `0` + + This option indicates whether the linter should use a module file. It is off + by default. + +g:ale_kotlin_kotlinc_module_filename *g:ale_kotlin_kotlinc_module_filename* + Type: |String| + Default: `'module.xml'` + + The filename of the module file that the linter should pass to the kotlin + compiler. + + +=============================================================================== +ktlint *ale-kotlin-ktlint* + +g:ale_kotlin_ktlint_executable *g:ale_kotlin_ktlint_executable* + Type: |String| + Default: `''` + + The Ktlint executable. + + Posix-compliant shell scripts are the only executables that can be found on + Ktlint's github release page. If you are not on such a system, your best + bet will be to download the ktlint jar and set this option to something + similar to `'java -jar /path/to/ktlint.jar'` + +g:ale_kotlin_ktlint_rulesets *g:ale_kotlin_ktlint_rulesets* + Type: |List| of |String|s + Default: `[]` + + This list should contain paths to ruleset jars and/or strings of maven + artifact triples. Example: + > + let g:ale_kotlin_ktlint_rulesets = ['/path/to/custom-ruleset.jar', + 'com.ktlint.rulesets:mycustomrule:1.0.0'] + +g:ale_kotlin_ktlint_options *g:ale_kotlin_ktlint_options* + Type: |String| + Default: `''` + + Additional options to pass to ktlint for both linting and fixing. Example: + > + let g:ale_kotlin_ktlint_options = '--android' + + +=============================================================================== +languageserver *ale-kotlin-languageserver* + +g:ale_kotlin_languageserver_executable *g:ale_kotlin_languageserver_executable* + Type: |String| + Default: `''` + + The kotlin-language-server executable. + + Executables are located inside the bin/ folder of the language server + release. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-latex.txt b/dot_vim/plugged/ale/doc/ale-latex.txt new file mode 100644 index 0000000..b3029a5 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-latex.txt @@ -0,0 +1,21 @@ +=============================================================================== +ALE LaTeX Integration *ale-latex-options* + + +=============================================================================== +cspell *ale-latex-cspell* + +=============================================================================== +write-good *ale-latex-write-good* + +See |ale-write-good-options| + + +=============================================================================== +textlint *ale-latex-textlint* + +See |ale-text-textlint| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-less.txt b/dot_vim/plugged/ale/doc/ale-less.txt new file mode 100644 index 0000000..040e511 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-less.txt @@ -0,0 +1,66 @@ +=============================================================================== +ALE Less Integration *ale-less-options* + + +=============================================================================== +lessc *ale-less-lessc* + +g:ale_less_lessc_executable *g:ale_less_lessc_executable* + *b:ale_less_lessc_executable* + Type: |String| + Default: `'lessc'` + + See |ale-integrations-local-executables| + + +g:ale_less_lessc_options *g:ale_less_lessc_options* + *b:ale_less_lessc_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to lessc. + + +g:ale_less_lessc_use_global *g:ale_less_lessc_use_global* + *b:ale_less_lessc_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +prettier *ale-less-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +stylelint *ale-less-stylelint* + +g:ale_less_stylelint_executable *g:ale_less_stylelint_executable* + *b:ale_less_stylelint_executable* + Type: |String| + Default: `'stylelint'` + + See |ale-integrations-local-executables| + + +g:ale_less_stylelint_options *g:ale_less_stylelint_options* + *b:ale_less_stylelint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to stylelint. + + +g:ale_less_stylelint_use_global *g:ale_less_stylelint_use_global* + *b:ale_less_stylelint_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-llvm.txt b/dot_vim/plugged/ale/doc/ale-llvm.txt new file mode 100644 index 0000000..fff1c30 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-llvm.txt @@ -0,0 +1,19 @@ +=============================================================================== +ALE LLVM Integration *ale-llvm-options* + + +=============================================================================== +llc *ale-llvm-llc* + +g:ale_llvm_llc_executable *g:ale_llvm_llc_executable* + *b:ale_llvm_llc_executable* + + Type: |String| + Default: `"llc"` + + The command to use for checking. This variable is useful when llc command + has suffix like "llc-5.0". + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-lua.txt b/dot_vim/plugged/ale/doc/ale-lua.txt new file mode 100644 index 0000000..7ee60d0 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-lua.txt @@ -0,0 +1,118 @@ +=============================================================================== +ALE Lua Integration *ale-lua-options* + + +=============================================================================== +cspell *ale-lua-cspell* + +See |ale-cspell-options| + + +=============================================================================== +lua-format *ale-lua-lua-format* + +g:ale_lua_lua_format_executable *g:ale_lua_lua_format_executable* + *b:ale_lua_lua_format_executable* + Type: |String| + Default: `'lua-format'` + + This variable can be changed to change the path to lua-format. + + +g:ale_lua_lua_format_options *g:ale_lua_lua_format_options* + *b:ale_lua_lua_format_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to lua-format. + + +=============================================================================== +luac *ale-lua-luac* + +g:ale_lua_luac_executable *g:ale_lua_luac_executable* + *b:ale_lua_luac_executable* + Type: |String| + Default: `'luac'` + + This variable can be changed to change the path to luac. + + +=============================================================================== +luacheck *ale-lua-luacheck* + +g:ale_lua_luacheck_executable *g:ale_lua_luacheck_executable* + *b:ale_lua_luacheck_executable* + Type: |String| + Default: `'luacheck'` + + This variable can be changed to change the path to luacheck. + + +g:ale_lua_luacheck_options *g:ale_lua_luacheck_options* + *b:ale_lua_luacheck_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to luacheck. + + +=============================================================================== +luafmt *ale-lua-luafmt* + +g:ale_lua_luafmt_executable *g:ale_lua_luafmt_executable* + *b:ale_lua_luafmt_executable* + Type: |String| + Default: `'luafmt'` + + This variable can be set to use a different executable for luafmt. + + +g:ale_lua_luafmt_options *g:ale_lua_luafmt_options* + *b:ale_lua_luafmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the luafmt fixer. + + +=============================================================================== +selene *ale-lua-selene* + +g:ale_lua_selene_executable *g:ale_lua_selene_executable* + *b:ale_lua_selene_executable* + Type: |String| + Default: `'selene'` + + This variable can be set to use a different executable for selene. + + +g:ale_lua_selene_options *g:ale_lua_selene_options* + *b:ale_lua_selene_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to selene. + + +=============================================================================== +stylua *ale-lua-stylua* + +g:ale_lua_stylua_executable *g:ale_lua_stylua_executable* + *b:ale_lua_stylua_executable* + Type: |String| + Default: `'stylua'` + + This variable can be set to use a different executable for stylua. + + +g:ale_lua_stylua_options *g:ale_lua_stylua_options* + *b:ale_lua_stylua_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the stylua fixer. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-make.txt b/dot_vim/plugged/ale/doc/ale-make.txt new file mode 100644 index 0000000..74de798 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-make.txt @@ -0,0 +1,18 @@ +=============================================================================== +ALE Make Integration *ale-make-options* + + +=============================================================================== +checkmake *ale-make-checkmake* + +g:ale_make_checkmake_config *g:ale_make_checkmake_config* + *b:ale_make_checkmake_config* + Type: |String| + Default: `''` + + This variable can be used to set the `--config` option of checkmake command. + if the value is empty, the checkmake command will not be invoked with the + option. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-markdown.txt b/dot_vim/plugged/ale/doc/ale-markdown.txt new file mode 100644 index 0000000..422828f --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-markdown.txt @@ -0,0 +1,122 @@ +=============================================================================== +ALE Markdown Integration *ale-markdown-options* + + +=============================================================================== +cspell *ale-markdown-cspell* + +See |ale-cspell-options| + + +=============================================================================== +dprint *ale-markdown-dprint* + +See |ale-dprint-options| and https://dprint.dev/plugins/markdown + + +=============================================================================== +markdownlint *ale-markdown-markdownlint* + +g:ale_markdown_markdownlint_executable *g:ale_markdown_markdownlint_executable* + *b:ale_markdown_markdownlint_executable* + Type: |String| + Default: `'markdownlint'` + + Override the invoked `markdownlint` binary. You can use other binaries such as + `markdownlint-cli2`. + + +g:ale_markdown_markdownlint_options *g:ale_markdown_markdownlint_options* + *b:ale_markdown_markdownlint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to markdownlint. + + +=============================================================================== +mdl *ale-markdown-mdl* + +g:ale_markdown_mdl_executable *g:ale_markdown_mdl_executable* + *b:ale_markdown_mdl_executable* + Type: |String| + Default: `'mdl'` + + Override the invoked mdl binary. This is useful for running mdl from + binstubs or a bundle. + + +g:ale_markdown_mdl_options *g:ale_markdown_mdl_options* + *b:ale_markdown_mdl_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to mdl. + + +=============================================================================== +pandoc *ale-markdown-pandoc* + +g:ale_markdown_pandoc_executable *g:ale_markdown_pandoc_executable* + *b:ale_markdown_pandoc_executable* + Type: |String| + Default: `'pandoc'` + + This variable can be set to specify where to find the pandoc executable + + +g:ale_markdown_pandoc_options *g:ale_markdown_pandoc_options* + *b:ale_markdown_pandoc_options* + Type: |String| + Default: `'-f gfm -t gfm -s -'` + + This variable can be set to change the default options passed to pandoc + + +=============================================================================== +prettier *ale-markdown-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +remark-lint *ale-markdown-remark-lint* + +g:ale_markdown_remark_lint_executable *g:ale_markdown_remark_lint_executable* + *b:ale_markdown_remark_lint_executable* + Type: |String| + Default: `'remark'` + + See |ale-integrations-local-executables| + + +g:ale_markdown_remark_lint_options *g:ale_markdown_remark_lint_options* + *b:ale_markdown_remark_lint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to remark-lint. + + +g:ale_markdown_remark_lint_use_global *g:ale_markdown_remark_lint_use_global* + *b:ale_markdown_remark_lint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +textlint *ale-markdown-textlint* + +See |ale-text-textlint| + + +=============================================================================== +write-good *ale-markdown-write-good* + +See |ale-write-good-options| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-mercury.txt b/dot_vim/plugged/ale/doc/ale-mercury.txt new file mode 100644 index 0000000..ca06a0a --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-mercury.txt @@ -0,0 +1,26 @@ +=============================================================================== +ALE Mercury Integration *ale-mercury-options* + + +=============================================================================== +mmc *ale-mercury-mmc* + + +g:ale_mercury_mmc_executable *g:ale_mercury_mmc_executable* + *b:ale_mercury_mmc_executable* + Type: |String| + Default: `'mmc'` + + This variable can be changed to use a different executable for mmc. + + +g:ale_mercury_mmc_options *g:ale_mercury_mmc_options* + *b:ale_mercury_mmc_options* + Type: |String| + Default: `'--make --output-compile-error-lines 100'` + + This variable can be set to pass additional options to mmc. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-nasm.txt b/dot_vim/plugged/ale/doc/ale-nasm.txt new file mode 100644 index 0000000..16c024a --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-nasm.txt @@ -0,0 +1,26 @@ +=============================================================================== +ALE NASM Integration *ale-nasm-options* + + +=============================================================================== +nasm *ale-nasm-nasm* + +g:ale_nasm_nasm_executable *g:ale_nasm_nasm_executable* + *b:ale_nasm_nasm_executable* + + Type: |String| + Default `'nasm'` + + This variable can be changed to use different executable for NASM. + + +g:ale_nasm_nasm_options *g:ale_nasm_nasm_options* + *b:ale_nasm_nasm_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to NASM. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-nim.txt b/dot_vim/plugged/ale/doc/ale-nim.txt new file mode 100644 index 0000000..8985aeb --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-nim.txt @@ -0,0 +1,45 @@ +=============================================================================== +ALE Nim Integration *ale-nim-options* + + +=============================================================================== +nimcheck *ale-nim-nimcheck* + + ALE does not provide additional configuration options for `nimcheck` at this + point. + + +=============================================================================== +nimlsp *ale-nim-nimlsp* + +g:nim_nimlsp_nim_sources *g:nim_nimlsp_nim_sources* + + Type: |String| + Default: `''` + + Sets the path to Nim source repository as the first argument to `nimlsp` + command. + + +=============================================================================== +nimpretty *ale-nim-nimpretty* + + +g:ale_nim_nimpretty_executable *g:ale_nim_nimpretty_executable* + *b:ale_nim_nimpretty_executable* + Type: |String| + Default: `'nimpretty'` + + This variable can be changed to use a different executable for nimpretty. + + +g:ale_nim_nimpretty_options *g:ale_nim_nimpretty_options* + *b:ale_nim_nimpretty_options* + Type: |String| + Default: `'--maxLineLen:80'` + + This variable can be changed to modify flags given to nimpretty. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-nix.txt b/dot_vim/plugged/ale/doc/ale-nix.txt new file mode 100644 index 0000000..1df7caf --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-nix.txt @@ -0,0 +1,79 @@ +=============================================================================== +ALE Nix Integration *ale-nix-options* + + +=============================================================================== +nixfmt *ale-nix-nixfmt* + +g:ale_nix_nixfmt_executable *g:ale_nix_nixfmt_executable* + *b:ale_nix_nixfmt_executable* + Type: |String| + Default: `'nixfmt'` + + This variable sets the executable used for nixfmt. + +g:ale_nix_nixfmt_options *g:ale_nix_nixfmt_options* + *b:ale_nix_nixfmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the nixfmt fixer. + + +=============================================================================== +nixpkgs-fmt *ale-nix-nixpkgs-fmt* + +g:ale_nix_nixpkgsfmt_executable *g:ale_nix_nixpkgsfmt_executable* + *b:ale_nix_nixpkgsfmt_executable* + Type: |String| + Default: `'nixpkgs-fmt'` + + This variable sets executable used for nixpkgs-fmt. + +g:ale_nix_nixpkgsfmt_options *g:ale_nix_nixpkgsfmt_options* + *b:ale_nix_nixpkgsfmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the nixpkgs-fmt + fixer. + + +=============================================================================== +statix *ale-nix-statix* + +g:ale_nix_statix_check_executable *g:ale_nix_statix_check_executable* + *b:ale_nix_statix_check_executable* + Type: |String| + Default: `'statix'` + + This variable sets the executable used for statix when running it as a + linter. + +g:ale_nix_statix_check_options *g:ale_nix_statix_check_options* + *b:ale_nix_statix_check_options* + Type: |String| + Default: `''` + + This variable can be used to pass additional options to statix when running + it as a linter. + +g:ale_nix_statix_fix_executable *g:ale_nix_fix_check_executable* + *b:ale_nix_fix_check_executable* + Type: |String| + Default: `'statix'` + + This variable sets the executable used for statix when running it as a + fixer. + +g:ale_nix_statix_fix_options *g:ale_nix_statix_fix_options* + *b:ale_nix_statix_fix_options* + Type: |String| + Default: `''` + + This variable can be used to pass additional options to statix when running + it as a fixer. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-nroff.txt b/dot_vim/plugged/ale/doc/ale-nroff.txt new file mode 100644 index 0000000..62ec789 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-nroff.txt @@ -0,0 +1,12 @@ +=============================================================================== +ALE nroff Integration *ale-nroff-options* + + +=============================================================================== +write-good *ale-nroff-write-good* + +See |ale-write-good-options| + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-objc.txt b/dot_vim/plugged/ale/doc/ale-objc.txt new file mode 100644 index 0000000..e1a0c2a --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-objc.txt @@ -0,0 +1,80 @@ +=============================================================================== +ALE Objective-C Integration *ale-objc-options* + + +=============================================================================== +ccls *ale-objc-ccls* + +g:ale_objc_ccls_executable *g:ale_objc_ccls_executable* + *b:ale_objc_ccls_executable* + Type: |String| + Default: `'ccls'` + + This variable can be changed to use a different executable for ccls. + + +g:ale_objc_ccls_init_options *g:ale_objc_ccls_init_options* + *b:ale_objc_ccls_init_options* + Type: |Dictionary| + Default: `{}` + + This variable can be changed to customize ccls initialization options. + Example: > + { + \ 'cacheDirectory': '/tmp/ccls', + \ 'cacheFormat': 'binary', + \ 'diagnostics': { + \ 'onOpen': 0, + \ 'opChange': 1000, + \ }, + \ } +< + Visit https://github.com/MaskRay/ccls/wiki/Initialization-options for all + available options and explanations. + + +=============================================================================== +clang *ale-objc-clang* + +g:ale_objc_clang_options *g:ale_objc_clang_options* + *b:ale_objc_clang_options* + Type: |String| + Default: `'-std=c11 -Wall'` + + This variable can be changed to modify flags given to clang. + + +=============================================================================== +clang-format *ale-objc-clangformat* + +See |ale-c-clangformat| for information about the available options. +Note that the C options are also used for Objective-C. + + +=============================================================================== +clangd *ale-objc-clangd* + +g:ale_objc_clangd_executable *g:ale_objc_clangd_executable* + *b:ale_objc_clangd_executable* + Type: |String| + Default: `'clangd'` + + This variable can be changed to use a different executable for clangd. + + +g:ale_objc_clangd_options *g:ale_objc_clangd_options* + *b:ale_objc_clangd_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clangd. + + +=============================================================================== +uncrustify *ale-objc-uncrustify* + +See |ale-c-uncrustify| for information about the available options. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-objcpp.txt b/dot_vim/plugged/ale/doc/ale-objcpp.txt new file mode 100644 index 0000000..cd65ab7 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-objcpp.txt @@ -0,0 +1,42 @@ +=============================================================================== +ALE Objective-C++ Integration *ale-objcpp-options* + + +=============================================================================== +clang *ale-objcpp-clang* + +g:ale_objcpp_clang_options *g:ale_objcpp_clang_options* + *b:ale_objcpp_clang_options* + Type: |String| + Default: `'-std=c++14 -Wall'` + + This variable can be changed to modify flags given to clang. + + +=============================================================================== +clangd *ale-objcpp-clangd* + +g:ale_objcpp_clangd_executable *g:ale_objcpp_clangd_executable* + *b:ale_objcpp_clangd_executable* + Type: |String| + Default: `'clangd'` + + This variable can be changed to use a different executable for clangd. + + +g:ale_objcpp_clangd_options *g:ale_objcpp_clangd_options* + *b:ale_objcpp_clangd_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clangd. + + +=============================================================================== +uncrustify *ale-objcpp-uncrustify* + +See |ale-c-uncrustify| for information about the available options. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-ocaml.txt b/dot_vim/plugged/ale/doc/ale-ocaml.txt new file mode 100644 index 0000000..a361a7b --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-ocaml.txt @@ -0,0 +1,117 @@ +=============================================================================== +ALE OCaml Integration *ale-ocaml-options* + + +=============================================================================== +dune *ale-ocaml-dune* + + Dune is a build system for OCaml projects. The `dune format` command is + supported for automatically formatting `dune` and `dune-project` files. + +g:ale_ocaml_dune_executable *g:ale_ocaml_dune_executable* + *b:ale_ocaml_dune_executable* + Type: |String| + Default: `'dune'` + + This variable can be set to pass the path to dune. + +g:ale_ocaml_dune_options *g:ale_ocaml_dune_options* + *b:ale_ocaml_dune_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the dune fixer. + +=============================================================================== +merlin *ale-ocaml-merlin* + + To use merlin linter for OCaml source code you need to make sure Merlin for + Vim is correctly configured. See the corresponding Merlin wiki page for + detailed instructions + (https://github.com/the-lambda-church/merlin/wiki/vim-from-scratch). + +=============================================================================== +ocamllsp *ale-ocaml-ocamllsp* + + The `ocaml-lsp-server` is the official OCaml implementation of the Language + Server Protocol. See the installation instructions: + https://github.com/ocaml/ocaml-lsp#installation + +g:ale_ocaml_ocamllsp_use_opam *g:ale_ocaml_ocamllsp_use_opam* + *b:ale_ocaml_ocamllsp_use_opam* + Type: |Number| + Default: `get(g:, 'ale_ocaml_ocamllsp_use_opam', 1)` + + This variable can be set to change whether or not opam is used to execute + the language server. + +=============================================================================== +ols *ale-ocaml-ols* + + The `ocaml-language-server` is the engine that powers OCaml and ReasonML + editor support using the Language Server Protocol. See the installation + instructions: + https://github.com/freebroccolo/ocaml-language-server#installation + +g:ale_ocaml_ols_executable *g:ale_ocaml_ols_executable* + *b:ale_ocaml_ols_executable* + Type: |String| + Default: `'ocaml-language-server'` + + This variable can be set to change the executable path for `ols`. + +g:ale_ocaml_ols_use_global *g:ale_ocaml_ols_use_global* + *b:ale_ocaml_ols_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + This variable can be set to `1` to always use the globally installed + executable. See also |ale-integrations-local-executables|. + +=============================================================================== +ocamlformat *ale-ocaml-ocamlformat* + +g:ale_ocaml_ocamlformat_executable *g:ale_ocaml_ocamlformat_executable* + *b:ale_ocaml_ocamlformat_executable* + Type: |String| + Default: `'ocamlformat'` + + This variable can be set to pass the path of the ocamlformat fixer. + +g:ale_ocaml_ocamlformat_options *g:ale_ocaml_ocamlformat_options* + *b:ale_ocaml_ocamlformat_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the ocamlformat fixer. + +=============================================================================== +ocp-indent *ale-ocaml-ocp-indent* + +g:ale_ocaml_ocp_indent_executable *g:ale_ocaml_ocp_indent_executable* + *b:ale_ocaml_ocp_indent_executable* + Type: |String| + Default: `ocp-indent` + + This variable can be set to pass the path of the ocp-indent. + +g:ale_ocaml_ocp_indent_options *g:ale_ocaml_ocp_indent_options* + *b:ale_ocaml_ocp_indent_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the ocp-indent. + +g:ale_ocaml_ocp_indent_config *g:ale_ocaml_ocp_indent_config* + *b:ale_ocaml_ocp_indent_config* + Type: |String| + Default: `''` + + This variable can be set to pass additional config to the ocp-indent. + Expand after "--config=". + + "ocp-indent" can also be enabled from ocamlformat config. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-openapi.txt b/dot_vim/plugged/ale/doc/ale-openapi.txt new file mode 100644 index 0000000..1fc41ad --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-openapi.txt @@ -0,0 +1,74 @@ +=============================================================================== +ALE OpenApi Integration *ale-openapi-options* + +=============================================================================== +ibm_validator *ale-openapi-ibm-validator* + +Website: https://github.com/IBM/openapi-validator + + +Installation +------------------------------------------------------------------------------- + +Install ibm-openapi-validator either globally or locally: > + + npm install ibm-openapi-validator -g # global + npm install ibm-openapi-validator # local +< +Configuration +------------------------------------------------------------------------------- + +OpenAPI files can be written in YAML or JSON so in order for ALE plugins to +work with these files we must set the buffer |filetype| to either |openapi.yaml| +or |openapi.json| respectively. This causes ALE to lint the file with linters +configured for openapi and yaml files or openapi and json files respectively. + +For example setting filetype to |openapi.yaml| on a buffer and the following +|g:ale_linters| configuration will enable linting of openapi files using both +|ibm_validator| and |yamlint|: + +> + let g:ale_linters = { + \ 'yaml': ['yamllint'], + \ 'openapi': ['ibm_validator'] + \} +< + +The following plugin will detect openapi files automatically and set the +filetype to |openapi.yaml| or |openapi.json|: + + https://github.com/hsanson/vim-openapi + +Options +------------------------------------------------------------------------------- + +g:ale_openapi_ibm_validator_executable *g:ale_openapi_ibm_validator_executable* + *b:ale_openapi_ibm_validator_executable* + Type: |String| + Default: `'lint-openapi'` + + This variable can be set to change the path to lint-openapi. + + +g:ale_openapi_ibm_validator_options *g:ale_openapi_ibm_validator_options* + *b:ale_openapi_ibm_validator_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to lint-openapi. + + +=============================================================================== +prettier *ale-openapi-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +yamllint *ale-openapi-yamllint* + +See |ale-yaml-yamllint| for information about the available options. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-openscad.txt b/dot_vim/plugged/ale/doc/ale-openscad.txt new file mode 100644 index 0000000..ac416bc --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-openscad.txt @@ -0,0 +1,25 @@ +=============================================================================== +ALE OpenSCAD Integration *ale-openscad-options* + + +=============================================================================== +sca2d *ale-openscad-sca2d* + +g:ale_openscad_sca2d_executable *g:ale_openscad_sca2d_executable* + *b:ale_openscad_sca2d_executable* + Type: |String| + Default: `'sca2d'` + + See |ale-integrations-local-executables| + + +g:ale_openscad_sca2d_options *g:ale_openscad_sca2d_options* + *b:ale_openscad_sca2d_options* + Type: |String| + Default: `''` + + This variable can be set to pass options to sca2d. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-packer.txt b/dot_vim/plugged/ale/doc/ale-packer.txt new file mode 100644 index 0000000..11b7cc2 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-packer.txt @@ -0,0 +1,24 @@ +=============================================================================== +ALE Packer Integration *ale-packer-options* + + +=============================================================================== +packer-fmt-fixer *ale-packer-fmt-fixer* + +g:ale_packer_fmt_executable *g:ale_packer_fmt_executable* + *b:ale_packer_fmt_executable* + + Type: |String| + Default: `'packer'` + + This variable can be changed to use a different executable for packer. + + +g:ale_packer_fmt_options *g:ale_packer_fmt_options* + *b:ale_packer_fmt_options* + Type: |String| + Default: `''` + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-pascal.txt b/dot_vim/plugged/ale/doc/ale-pascal.txt new file mode 100644 index 0000000..03d9a00 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-pascal.txt @@ -0,0 +1,24 @@ +=============================================================================== +ALE Pascal Integration *ale-pascal-options* + +=============================================================================== +ptop *ale-pascal-ptop* + +g:ale_pascal_ptop_executable *g:ale_pascal_ptop_executable* + *b:ale_pascal_ptop_executable* + Type: |String| + Default: `'ptop'` + + This variable can be changed to specify the ptop executable. + + +g:ale_pascal_ptop_options *g:ale_pascal_ptop_options* + *b:ale_pascal_ptop_options* + Type: |String| + Default: `''` + +This variable can be set to pass additional options to the ptop fixer. + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-pawn.txt b/dot_vim/plugged/ale/doc/ale-pawn.txt new file mode 100644 index 0000000..f836df9 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-pawn.txt @@ -0,0 +1,12 @@ +=============================================================================== +ALE Pawn Integration *ale-pawn-options* + + +=============================================================================== +uncrustify *ale-pawn-uncrustify* + +See |ale-c-uncrustify| for information about the available options. + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-perl.txt b/dot_vim/plugged/ale/doc/ale-perl.txt new file mode 100644 index 0000000..5eebc0e --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-perl.txt @@ -0,0 +1,91 @@ +=============================================================================== +ALE Perl Integration *ale-perl-options* + +ALE offers a few ways to check Perl code. Checking code with `perl` is +disabled by default, as `perl` code cannot be checked without executing it. +Specifically, we use the `-c` flag to see if `perl` code compiles. This does +not execute all of the code in a file, but it does run `BEGIN` and `CHECK` +blocks. See `perl --help` and https://stackoverflow.com/a/12908487/406224 + +See |g:ale_linters|. + + +=============================================================================== +perl *ale-perl-perl* + +g:ale_perl_perl_executable *g:ale_perl_perl_executable* + *b:ale_perl_perl_executable* + Type: |String| + Default: `'perl'` + + This variable can be changed to modify the executable used for linting perl. + + +g:ale_perl_perl_options *g:ale_perl_perl_options* + *b:ale_perl_perl_options* + Type: |String| + Default: `'-c -Mwarnings -Ilib'` + + This variable can be changed to alter the command-line arguments to the perl + invocation. + + +=============================================================================== +perlcritic *ale-perl-perlcritic* + +g:ale_perl_perlcritic_executable *g:ale_perl_perlcritic_executable* + *b:ale_perl_perlcritic_executable* + Type: |String| + Default: `'perlcritic'` + + This variable can be changed to modify the perlcritic executable used for + linting perl. + + +g:ale_perl_perlcritic_profile *g:ale_perl_perlcritic_profile* + *b:ale_perl_perlcritic_profile* + Type: |String| + Default: `'.perlcriticrc'` + + This variable can be changed to modify the perlcritic profile used for + linting perl. The current directory is checked for the file, then the + parent directory, etc, until it finds one. If no matching file is found, no + profile is passed to perlcritic. + + Set to an empty string to disable passing a specific profile to perlcritic + with the `'--profile'` option. + + To prevent perlcritic from using any profile, set this variable to an empty + string and pass `'--no-profile'`to perlcritic via the + |g:ale_perl_perlcritic_options| variable. + + +g:ale_perl_perlcritic_options *g:ale_perl_perlcritic_options* + *b:ale_perl_perlcritic_options* + Type: |String| + Default: `''` + + This variable can be changed to supply additional command-line arguments to + the perlcritic invocation. + + +g:ale_perl_perlcritic_showrules *g:ale_perl_perlcritic_showrules* + + Type: |Number| + Default: `0` + + Controls whether perlcritic rule names are shown after the error message. + Defaults to off to reduce length of message. +=============================================================================== +perltidy *ale-perl-perltidy* + +g:ale_perl_perltidy_options *g:ale_perl_perltidy_options* + *b:ale_perl_perltidy_options* + Type: |String| + Default: `''` + + This variable can be changed to alter the command-line arguments to + the perltidy invocation. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-perl6.txt b/dot_vim/plugged/ale/doc/ale-perl6.txt new file mode 100644 index 0000000..94953db --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-perl6.txt @@ -0,0 +1,43 @@ +=============================================================================== +ALE Perl6 Integration *ale-perl6-options* + +Checking code with `perl6` is disabled by default, as `perl6` code cannot be +checked without executing it. Specifically, we use the `-c` flag to see if +`perl6` code compiles. This does not execute all of the code in a file, but it +does run `BEGIN` and `CHECK` blocks. See `perl6 --help` + +Full support requires a perl6 implementation that supports the +PERL6_EXCEPTIONS_HANDLER environment variable and JSON error output, +which was specified in 6.d. Rakudo version 2018.08 is the first rakudo release +that supports this. See `perl6 --version` and +https://docs.perl6.org/programs/03-environment-variables. + +Without this variable, errors and warnings will appear at line 1, and can be +viewed with ALEDetail. This also serves as a fallback for errors and warnings +that do not trigger JSON output. + +See |g:ale_linters|. + + +=============================================================================== +perl6 *ale-perl6-perl6* + +g:ale_perl6_perl6_executable *g:ale_perl6_perl6_executable* + *b:ale_perl6_perl6_executable* + Type: |String| + Default: `'perl6'` + + This variable can be changed to modify the executable used for linting + perl6. + + +g:ale_perl6_perl6_options *g:ale_perl6_perl6_options* + *b:ale_perl6_perl6_options* + Type: |String| + Default: `'-c -Ilib'` + + This variable can be changed to alter the command-line arguments to the + perl6 invocation. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-php.txt b/dot_vim/plugged/ale/doc/ale-php.txt new file mode 100644 index 0000000..2750a31 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-php.txt @@ -0,0 +1,367 @@ +=============================================================================== +ALE PHP Integration *ale-php-options* + + +=============================================================================== +cspell *ale-php-cspell* + +See |ale-cspell-options| + + +=============================================================================== +langserver *ale-php-langserver* + +g:ale_php_langserver_executable *g:ale_php_langserver_executable* + *b:ale_php_langserver_executable* + Type: |String| + Default: `'php-language-server.php'` + + The variable can be set to configure the executable that will be used for + running the PHP language server. `vendor` directory executables will be + preferred instead of this setting if |g:ale_php_langserver_use_global| is `0`. + + See: |ale-integrations-local-executables| + + +g:ale_php_langserver_use_global *g:ale_php_langserver_use_global* + *b:ale_php_langserver_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + This variable can be set to `1` to force the language server to be run with + the executable set for |g:ale_php_langserver_executable|. + + See: |ale-integrations-local-executables| + + +=============================================================================== +phan *ale-php-phan* + +WARNING: please use the phan_client linter if you have an configuration file +for your project because the phan will look into your entirely project and +ale will display in the current buffer warnings that may belong to other file. + +g:ale_php_phan_minimum_severity *g:ale_php_phan_minimum_severity* + *b:ale_php_phan_minimum_severity* + Type: |Number| + Default: `0` + + This variable defines the minimum severity level. + + +g:ale_php_phan_executable *g:ale_php_phan_executable* + *b:ale_php_phan_executable* + Type: |String| + Default: `'phan'` + + This variable sets executable used for phan or phan_client. + + +g:ale_php_phan_use_client *g:ale_php_phan_use_client* + *b:ale_php_phan_use_client* + Type: |Number| + Default: `get(g:, 'ale_php_phan_use_client', 0)` + + This variable can be set to 1 to use the phan_client with phan daemon mode + instead of the phan standalone. + + +=============================================================================== +phpcbf *ale-php-phpcbf* + +g:ale_php_phpcbf_executable *g:ale_php_phpcbf_executable* + *b:ale_php_phpcbf_executable* + Type: |String| + Default: `'phpcbf'` + + See |ale-integrations-local-executables| + + +g:ale_php_phpcbf_standard *g:ale_php_phpcbf_standard* + *b:ale_php_phpcbf_standard* + Type: |String| + Default: `''` + + This variable can be set to specify the coding standard used by phpcbf. If no + coding standard is specified, phpcbf will default to fixing against the + PEAR coding standard, or the standard you have set as the default. + + +g:ale_php_phpcbf_use_global *g:ale_php_phpcbf_use_global* + *b:ale_php_phpcbf_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_php_phpcbf_options *g:ale_php_phpcbf_options* + *b:ale_php_phpcbf_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to php-cbf + + +=============================================================================== +phpcs *ale-php-phpcs* + +g:ale_php_phpcs_executable *g:ale_php_phpcs_executable* + *b:ale_php_phpcs_executable* + Type: |String| + Default: `'phpcs'` + + See |ale-integrations-local-executables| + + +g:ale_php_phpcs_standard *g:ale_php_phpcs_standard* + *b:ale_php_phpcs_standard* + Type: |String| + Default: `''` + + This variable can be set to specify the coding standard used by phpcs. If no + coding standard is specified, phpcs will default to checking against the + PEAR coding standard, or the standard you have set as the default. + + +g:ale_php_phpcs_use_global *g:ale_php_phpcs_use_global* + *b:ale_php_phpcs_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_php_phpcs_options *g:ale_php_phpcs_options* + *b:ale_php_phpcs_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to php-cs + + +=============================================================================== +phpmd *ale-php-phpmd* + +g:ale_php_phpmd_executable *g:ale_php_phpmd_executable* + *b:ale_php_phpmd_executable* + Type: |String| + Default: `'phpmd'` + + This variable sets executable used for phpmd. + + +g:ale_php_phpmd_ruleset *g:ale_php_phpmd_ruleset* + *b:ale_php_phpmd_ruleset* + Type: |String| + Default: `'cleancode,codesize,controversial,design,naming,unusedcode'` + + This variable controls the ruleset used by phpmd. Default is to use all of + the available phpmd rulesets + + +=============================================================================== +phpstan *ale-php-phpstan* + +g:ale_php_phpstan_executable *g:ale_php_phpstan_executable* + *b:ale_php_phpstan_executable* + Type: |String| + Default: `'phpstan'` + + This variable sets executable used for phpstan. + + +g:ale_php_phpstan_level *g:ale_php_phpstan_level* + *b:ale_php_phpstan_level* + Type: |String| + Default: `''` + + This variable controls the rule levels. 0 is the loosest and 7 is the + strictest. If this option isn't set, the rule level will be controlled by + the configuration file. If no configuration file can be detected, `'7'` will + be used instead. + + +g:ale_php_phpstan_configuration *g:ale_php_phpstan_configuration* + *b:ale_php_phpstan_configuration* + Type: |String| + Default: `''` + + This variable sets path to phpstan configuration file. + + +g:ale_php_phpstan_autoload *g:ale_php_phpstan_autoload* + *b:ale_php_phpstan_autoload* + Type: |String| + Default: `''` + + This variable sets path to phpstan autoload file. + + +g:ale_php_phpstan_memory_limit *g:ale_php_phpstan_memory-limit* + *b:ale_php_phpstan_memory-limit* + Type: |String| + Default: `''` + + This variable sets the memory limit for phpstan analysis. This is a string + in the same format as `php.ini` accepts, e.g. `128M`, `1G`. + + +=============================================================================== +psalm *ale-php-psalm* + +g:ale_php_psalm_executable *g:ale_php_psalm_executable* + *b:ale_php_psalm_executable* + Type: |String| + Default: `'psalm'` + + This variable sets the executable used for psalm. + + +g:ale_php_psalm_options *g:ale_php_psalm_options* + *b:ale_php_psalm_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to psalm. + + +g:ale_php_psalm_use_global *g:ale_php_psalm_use_global* + *b:ale_php_psalm_use_global* + Type: |Boolean| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +php-cs-fixer *ale-php-php-cs-fixer* + +g:ale_php_cs_fixer_executable *g:ale_php_cs_fixer_executable* + *b:ale_php_cs_fixer_executable* + Type: |String| + Default: `'php-cs-fixer'` + + This variable sets executable used for php-cs-fixer. + + +g:ale_php_cs_fixer_options *g:ale_php_cs_fixer_options* + *b:ale_php_cs_fixer_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to php-cs-fixer. + + +g:ale_php_cs_fixer_use_global *g:ale_php_cs_fixer_use_global* + *b:ale_php_cs_fixer_use_global* + Type: |Boolean| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +php *ale-php-php* + +g:ale_php_php_executable *g:ale_php_php_executable* + *b:ale_php_php_executable* + Type: |String| + Default: `'php'` + + This variable sets the executable used for php. + + +=============================================================================== +pint *ale-php-pint* + +g:ale_php_pint_executable *g:ale_php_pint_executable* + *b:ale_php_pint_executable* + Type: |String| + Default: `'pint'` + + This variable sets the executable used for pint. + + +g:ale_php_pint_options *g:ale_php_pint_options* + *b:ale_php_pint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to pint. + + +g:ale_php_pint_use_global *g:ale_php_pint_use_global* + *b:ale_php_pint_use_global* + Type: |Boolean| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +tlint *ale-php-tlint* + +g:ale_php_tlint_executable *g:ale_php_tlint_executable* + *b:ale_php_tlint_executable* + Type: |String| + Default: `'tlint'` + + See |ale-integrations-local-executables| + + +g:ale_php_tlint_use_global *g:ale_php_tlint_use_global* + *b:ale_php_tlint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_php_tlint_options *g:ale_php_tlint_options* + *b:ale_php_tlint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to tlint + + +=============================================================================== +intelephense *ale-php-intelephense* + +g:ale_php_intelephense_executable *g:ale_php_intelephense_executable* + *b:ale_php_intelephense_executable* + Type: |String| + Default: `'intelephense'` + + The variable can be set to configure the executable that will be used for + running the intelephense language server. `node_modules` directory + executable will be preferred instead of this setting if + |g:ale_php_intelephense_use_global| is `0`. + + See: |ale-integrations-local-executables| + + +g:ale_php_intelephense_use_global *g:ale_php_intelephense_use_global* + *b:ale_php_intelephense_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + This variable can be set to `1` to force the language server to be run with + the executable set for |g:ale_php_intelephense_executable|. + + See: |ale-integrations-local-executables| + + +g:ale_php_intelephense_config *g:ale_php_intelephense_config* + *b:ale_php_intelephense_config* + Type: |Dictionary| + Default: `{}` + + The initialization options config specified by Intelephense. Refer to the + installation docs provided by intelephense (github.com/bmewburn/intelephense + -docs). + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-po.txt b/dot_vim/plugged/ale/doc/ale-po.txt new file mode 100644 index 0000000..1e03b7b --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-po.txt @@ -0,0 +1,12 @@ +=============================================================================== +ALE PO Integration *ale-po-options* + + +=============================================================================== +write-good *ale-po-write-good* + +See |ale-write-good-options| + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-pod.txt b/dot_vim/plugged/ale/doc/ale-pod.txt new file mode 100644 index 0000000..c7cc0bb --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-pod.txt @@ -0,0 +1,12 @@ +=============================================================================== +ALE Pod Integration *ale-pod-options* + + +=============================================================================== +write-good *ale-pod-write-good* + +See |ale-write-good-options| + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-pony.txt b/dot_vim/plugged/ale/doc/ale-pony.txt new file mode 100644 index 0000000..3b32168 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-pony.txt @@ -0,0 +1,25 @@ +=============================================================================== +ALE Pony Integration *ale-pony-options* + + +=============================================================================== +ponyc *ale-pony-ponyc* + +g:ale_pony_ponyc_executable *g:ale_pony_ponyc_executable* + *b:ale_pony_ponyc_executable* + Type: |String| + Default: `'ponyc'` + + See |ale-integrations-local-executables| + + +g:ale_pony_ponyc_options *g:ale_pony_ponyc_options* + *b:ale_pony_ponyc_options* + Type: |String| + Default: `'--pass paint'` + + This variable can be set to pass options to ponyc. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-powershell.txt b/dot_vim/plugged/ale/doc/ale-powershell.txt new file mode 100644 index 0000000..44a3c61 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-powershell.txt @@ -0,0 +1,75 @@ +=============================================================================== +ALE PowerShell Integration *ale-powershell-options* + + +=============================================================================== +cspell *ale-powershell-cspell* + +See |ale-cspell-options| + + +=============================================================================== +powershell *ale-powershell-powershell* + +g:ale_powershell_powershell_executable *g:ale_powershell_powershell_executable* + *b:ale_powershell_powershell_executable* + Type: |String| + Default: `'pwsh'` + + This variable can be changed to use a different executable for powershell. + +> + " Use powershell.exe rather than the default pwsh + let g:ale_powershell_powershell_executable = 'powershell.exe' +> + +=============================================================================== +psscriptanalyzer *ale-powershell-psscriptanalyzer* + +Installation +------------------------------------------------------------------------------- + +Install PSScriptAnalyzer by any means, so long as it can be automatically +imported in PowerShell. + +g:ale_powershell_psscriptanalyzer_executable +*g:ale_powershell_psscriptanalyzer_executable* + *b:ale_powershell_psscriptanalyzer_executable* + Type: |String| + Default: `'pwsh'` + + This variable sets executable used for powershell. + + For example, on Windows you could set powershell to be Windows Powershell: +> + let g:ale_powershell_psscriptanalyzer_executable = 'powershell.exe' +< + +g:ale_powershell_psscriptanalyzer_module +*g:ale_powershell_psscriptanalyzer_module* + *b:ale_powershell_psscriptanalyzer_module* + Type: |String + Default: `'psscriptanalyzer'` + + This variable sets the name of the psscriptanalyzer module. + for psscriptanalyzer invocation. + + +g:ale_powershell_psscriptanalyzer_exclusions +*g:ale_powershell_psscriptanalyzer_exclusions* + *b:ale_powershell_psscriptanalyzer_exclusions* + Type: |String| + Default: `''` + + Set this variable to exclude test(s) for psscriptanalyzer + (-ExcludeRule option). To exclude more than one option, separate them with + commas. + +> + " Suppress Write-Host and Global vars warnings + let g:ale_powershell_psscriptanalyzer_exclusions = + \ 'PSAvoidUsingWriteHost,PSAvoidGlobalVars' +< + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-prolog.txt b/dot_vim/plugged/ale/doc/ale-prolog.txt new file mode 100644 index 0000000..14062a5 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-prolog.txt @@ -0,0 +1,56 @@ +=============================================================================== +ALE Prolog Integration *ale-prolog-options* + + +=============================================================================== +swipl *ale-prolog-swipl* + +g:ale_prolog_swipl_executable *g:ale_prolog_swipl_executable* + *b:ale_prolog_swipl_executable* + Type: |String| + Default: `'swipl'` + + The executable that will be run for the `swipl` linter. + +g:ale_prolog_swipl_load *g:ale_prolog_swipl_load* + *b:ale_prolog_swipl_load* + Type: |String| + Default: `'current_prolog_flag(argv, [File]), load_files(File, [sandboxed(true)]), halt.'` + + The prolog goals that will be passed to |g:ale_prolog_swipl_executable| with `-g` option. + + It does: + 1. Takes the first command argument (current file path) + 2. Checks (syntactic / semantic) problems and output to stderr + + NOTE: `sandboxed(true)` prohibits executing some directives such as 'initialization main'. + +g:ale_prolog_swipl_timeout *g:ale_prolog_swipl_timeout* + *b:ale_prolog_swipl_timeout* + Type: |Number| + Default: `3` + + Timeout seconds to detect long-running linter. + It is done by setting SIGALRM. + See |g:ale_prolog_swipl_alarm| and |g:ale_prolog_swipl_alarm_handler|. + +g:ale_prolog_swipl_alarm *g:ale_prolog_swipl_alarm* + *b:ale_prolog_swipl_alarm* + Type: |String| + Default: `'alarm(%t, (%h), _, [])'` + + The prolog goals to be expected to set SIGALRM. + `%t` is replaced by |g:ale_prolog_swipl_timeout|. + `%h` is replaced by |g:ale_prolog_swipl_alarm_handler|. + +g:ale_prolog_swipl_alarm_handler *g:ale_prolog_swipl_alarm_handler* + *b:ale_prolog_swipl_alarm_handler* + Type: |String| + Default: `'writeln(user_error, "ERROR: Exceeded %t seconds, Please change g:prolog_swipl_timeout to modify the limit."), halt(1)'` + + The prolog goals to be expected that will be run on SIGALRM. + `%t` is replaced by |g:ale_prolog_swipl_timeout|. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-proto.txt b/dot_vim/plugged/ale/doc/ale-proto.txt new file mode 100644 index 0000000..e7015dc --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-proto.txt @@ -0,0 +1,112 @@ +=============================================================================== +ALE Proto Integration *ale-proto-options* + + +=============================================================================== +Integration Information + +To enable `.proto` file linting, update |g:ale_linters| as appropriate: +> + " Enable linter for .proto files + let g:ale_linters = {'proto': ['buf-lint', 'protoc-gen-lint', 'protolint']} +< + +To enable `.proto` file fixing, update |g:ale_fixers| as appropriate: +> + " Enable linter for .proto files + let b:ale_fixers = {'proto': ['buf-format', 'protolint']} +< + + +=============================================================================== +buf-format *ale-proto-buf-format* + + The formatter uses `buf`, a fully-featured Protobuf compiler that doesn't depend + on `protoc`. Make sure the `buf` binary is available in the system path, or + set ale_proto_buf_format_executable. + +g:ale_proto_buf_format_executable *g:ale_proto_buf_format_executable* + + Type: |String| + Default: `'buf'` + + This variable can be changed to modify the executable used for buf. + + +=============================================================================== +buf-lint *ale-proto-buf-lint* + + The linter uses `buf`, a fully-featured Protobuf compiler that doesn't depend + on `protoc`. Make sure the `buf` binary is available in the system path, or + set ale_proto_buf_lint_executable. + +g:ale_proto_buf_lint_executable *g:ale_proto_buf_lint_executable* + + Type: |String| + Default: `'buf'` + + This variable can be changed to modify the executable used for buf. + +g:ale_proto_buf_lint_config *g:ale_proto_buf_lint_config* + + Type: |String| + Default: `''` + + A path to a buf configuration file. + + The path to the configuration file can be an absolute path or a relative + path. ALE will search for the relative path in parent directories. + + +=============================================================================== +clang-format *ale-proto-clangformat* + +See |ale-c-clangformat| for information about the available options. +Note that the C options are also used for Proto. + + +=============================================================================== +protoc-gen-lint *ale-proto-protoc-gen-lint* + + The linter is a plugin for the `protoc` binary. As long as the binary resides + in the system path, `protoc` will find it. + +g:ale_proto_protoc_gen_lint_options *g:ale_proto_protoc_gen_lint_options* + + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to protoc. Note that the + directory of the linted file is always passed as an include path with '-I' + before any user-supplied options. + + +=============================================================================== +protolint *ale-proto-protolint* + + The linter is a pluggable tool that doesn't depend on the `protoc` binary. + This supports both linting and fixing. + Make sure the binary is available in the system path, or set + ale_proto_protolint_executable. + Note that the binary with v0.22.0 or above is supported. + +g:ale_proto_protolint_executable *g:ale_proto_protolint_executable* + + Type: |String| + Default: `'protolint'` + + This variable can be changed to modify the executable used for protolint. + +g:ale_proto_protolint_config *g:ale_proto_protolint_config* + + Type: |String| + Default: `''` + + A path to a protolint configuration file. + + The path to the configuration file can be an absolute path or a relative + path. ALE will search for the relative path in parent directories. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-pug.txt b/dot_vim/plugged/ale/doc/ale-pug.txt new file mode 100644 index 0000000..e2836f8 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-pug.txt @@ -0,0 +1,44 @@ +=============================================================================== +ALE Pug Integration *ale-pug-options* + + +=============================================================================== +puglint *ale-pug-puglint* + +The puglint linter will detect configuration files based on the path to the +filename automatically. Configuration files will be loaded in this order: + +1. `.pug-lintrc` +2. `.pug-lintrc.js` +3. `.pug-lintrc.json` +4. `package.json` + +You might need to create a configuration file for your project to get +meaningful results. + +g:ale_pug_puglint_executable *g:ale_pug_puglint_executable* + *b:ale_pug_puglint_executable* + Type: |String| + Default: `'pug-lint'` + + See |ale-integrations-local-executables| + + +g:ale_pug_puglint_options *g:ale_pug_puglint_options* + *b:ale_pug_puglint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to pug-lint. + + +g:ale_pug_puglint_use_global *g:ale_pug_puglint_use_global* + *b:ale_pug_puglint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-puppet.txt b/dot_vim/plugged/ale/doc/ale-puppet.txt new file mode 100644 index 0000000..daa8c10 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-puppet.txt @@ -0,0 +1,57 @@ +=============================================================================== +ALE Puppet Integration *ale-puppet-options* + + +=============================================================================== +puppet *ale-puppet-puppet* + +g:ale_puppet_puppet_executable *g:ale_puppet_puppet_executable* + *b:ale_puppet_puppet_executable* + Type: |String| + Default: `'puppet'` + + This variable can be changed to specify the executable used for puppet. + + +g:ale_puppet_puppet_options *g:ale_puppet_puppet_options* + *b:ale_puppet_puppet_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the + puppet parser validate invocation. + + +=============================================================================== +puppetlint *ale-puppet-puppetlint* + +g:ale_puppet_puppetlint_executable *g:ale_puppet_puppetlint_executable* + *b:ale_puppet_puppetlint_executable* + Type: |String| + Default: `'puppet-lint'` + + This variable can be changed to specify the executable used for puppet-lint. + + +g:ale_puppet_puppetlint_options *g:ale_puppet_puppetlint_options* + *b:ale_puppet_puppetlint_options* + Type: |String| + Default: `'--no-autoloader_layout-check'` + + This variable can be changed to add command-line arguments to the + puppet-lint invocation. + + +=============================================================================== +puppet-languageserver *ale-puppet-languageserver* + +g:ale_puppet_languageserver_executable *g:ale_puppet_languageserver_executable* + *b:ale_puppet_languageserver_executable* + type: |String| + Default: `'puppet-languageserver'` + + This variable can be used to specify the executable used for + puppet-languageserver. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-purescript.txt b/dot_vim/plugged/ale/doc/ale-purescript.txt new file mode 100644 index 0000000..25b3dd8 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-purescript.txt @@ -0,0 +1,69 @@ +=============================================================================== +ALE PureScript Integration *ale-purescript-options* + + +=============================================================================== +purescript-language-server *ale-purescript-language-server* + +PureScript Language Server + (https://github.com/nwolverson/purescript-language-server) + +g:ale_purescript_ls_executable g:ale_purescript_ls_executable + b:ale_purescript_ls_executable + Type: |String| + Default: `'purescript-language-server'` + + PureScript language server executable. + +g:ale_purescript_ls_config g:ale_purescript_ls_config + b:ale_purescript_ls_config + Type: |Dictionary| + Default: `{}` + + Dictionary containing configuration settings that will be passed to the + language server. For example, with a spago project: + { + \ 'purescript': { + \ 'addSpagoSources': v:true, + \ 'addNpmPath': v:true, + \ 'buildCommand': 'spago --quiet build --purs-args --json-errors' + \ } + \} +=============================================================================== +purs-tidy *ale-purescript-tidy* + +g:ale_purescript_tidy_executable *g:ale_purescript_tidy_executable* + *b:ale_purescript_tidy_executable* + Type: |String| + Default: `'purs-tidy'` + + This variable can be changed to use a different executable for purs-tidy. + +g:ale_purescript_tidy_use_global *g:ale_purescript_tidy_use_global* + *b:ale_purescript_tidy_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + +g:ale_purescript_tidy_options *g:ale_purescript_tidy_options* + *b:ale_purescript_tidy_options* + Type: |String| + Default: `''` + + This variable can be set to pass in additional option to the 'purs-tidy' + executable. +> + let g:ale_purescript_options = '--indent 3' +< +=============================================================================== +purty *ale-purescript-purty* + +g:ale_purescript_purty_executable *g:ale_purescript_purty_executable* + *b:ale_purescript_purty_executable* + Type: |String| + Default: `'purty'` + + This variable can be changed to use a different executable for purty. +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-pyrex.txt b/dot_vim/plugged/ale/doc/ale-pyrex.txt new file mode 100644 index 0000000..245e611 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-pyrex.txt @@ -0,0 +1,25 @@ +=============================================================================== +ALE Pyrex (Cython) Integration *ale-pyrex-options* + + +=============================================================================== +cython *ale-pyrex-cython* + +g:ale_pyrex_cython_executable *g:ale_pyrex_cython_executable* + *b:ale_pyrex_cython_executable* + Type: |String| + Default: `'cython'` + + This variable can be changed to use a different executable for cython. + + +g:ale_pyrex_cython_options *g:ale_pyrex_cython_options* + *b:ale_pyrex_cython_options* + Type: |String| + Default: `'--warning-extra --warning-errors'` + + This variable can be changed to modify flags given to cython. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-python.txt b/dot_vim/plugged/ale/doc/ale-python.txt new file mode 100644 index 0000000..07f54db --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-python.txt @@ -0,0 +1,1353 @@ +=============================================================================== +ALE Python Integration *ale-python-options* + + +g:ale_python_auto_pipenv *g:ale_python_auto_pipenv* + *b:ale_python_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_auto_poetry *g:ale_python_auto_poetry* + *b:ale_python_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +ALE Python Project Root Behavior *ale-python-root* + +For some linters, ALE will search for a Python project root by looking at the +files in directories on or above where a file being checked is. ALE applies +the following methods, in order: + +1. Find the first directory containing a common Python configuration file. +2. If no configuration file can be found, use the first directory which does + not contain a readable file named `__init__.py`. + +ALE will look for configuration files with the following filenames. > + + MANIFEST.in + setup.cfg + pytest.ini + tox.ini + .pyre_configuration.local + mypy.ini + .mypy.ini + pycodestyle.cfg + .flake8 + .flake8rc + pylama.ini + pylintrc + .pylintrc + pyrightconfig.json + pyrightconfig.toml + Pipfile + Pipfile.lock + poetry.lock + pyproject.toml + .tool-versions +< + +The first directory containing any of the files named above will be used. + + +=============================================================================== +autoflake *ale-python-autoflake* + +g:ale_python_autoflake_executable *g:ale_python_autoflake_executable* + *b:ale_python_autoflake_executable* + Type: |String| + Default: `'autoflake'` + + See |ale-integrations-local-executables| + + +g:ale_python_autoflake_options *g:ale_python_autoflake_options* + *b:ale_python_autoflake_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to autoflake. + + +g:ale_python_autoflake_use_global *g:ale_python_autoflake_use_global* + *b:ale_python_autoflake_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +autoimport *ale-python-autoimport* + +g:ale_python_autoimport_executable *g:ale_python_autoimport_executable* + *b:ale_python_autoimport_executable* + Type: |String| + Default: `'autoimport'` + + See |ale-integrations-local-executables| + + +g:ale_python_autoimport_options *g:ale_python_autoimport_options* + *b:ale_python_autoimport_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to autoimport. + + +g:ale_python_autoimport_use_global *g:ale_python_autoimport_use_global* + *b:ale_python_autoimport_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +autopep8 *ale-python-autopep8* + +g:ale_python_autopep8_executable *g:ale_python_autopep8_executable* + *b:ale_python_autopep8_executable* + Type: |String| + Default: `'autopep8'` + + See |ale-integrations-local-executables| + + +g:ale_python_autopep8_options *g:ale_python_autopep8_options* + *b:ale_python_autopep8_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to autopep8. + + +g:ale_python_autopep8_use_global *g:ale_python_autopep8_use_global* + *b:ale_python_autopep8_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +bandit *ale-python-bandit* + +g:ale_python_bandit_executable *g:ale_python_bandit_executable* + *b:ale_python_bandit_executable* + Type: |String| + Default: `'bandit'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `bandit'`. + Set this to `'poetry'` to invoke `'poetry` `run` `bandit'`. + + +g:ale_python_bandit_options *g:ale_python_bandit_options* + *b:ale_python_bandit_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the + bandit invocation. + + +g:ale_python_bandit_use_config *g:ale_python_bandit_use_config* + *b:ale_python_bandit_use_config* + Type: |Number| + Default: `1` + + If this variable is true and a `.bandit` file exists in the directory of the + file being checked or a parent directory, an `--ini` option is added to the + `bandit` command for the nearest `.bandit` file. Set this variable false to + disable adding the `--ini` option automatically. + + +g:ale_python_bandit_use_global *g:ale_python_bandit_use_global* + *b:ale_python_bandit_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_bandit_auto_pipenv *g:ale_python_bandit_auto_pipenv* + *b:ale_python_bandit_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_bandit_auto_poetry *g:ale_python_bandit_auto_poetry* + *b:ale_python_bandit_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +black *ale-python-black* + +g:ale_python_black_executable *g:ale_python_black_executable* + *b:ale_python_black_executable* + Type: |String| + Default: `'black'` + + See |ale-integrations-local-executables| + + +g:ale_python_black_options *g:ale_python_black_options* + *b:ale_python_black_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to black. + + +g:ale_python_black_use_global *g:ale_python_black_use_global* + *b:ale_python_black_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_black_auto_pipenv *g:ale_python_black_auto_pipenv* + *b:ale_python_black_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_black_auto_poetry *g:ale_python_black_auto_poetry* + *b:ale_python_black_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +g:ale_python_black_change_directory *g:ale_python_black_change_directory* + *b:ale_python_black_change_directory* + Type: |Number| + Default: `1` + + If set to `1`, ALE will switch to the directory the Python file being + checked with `black` is in before checking it. This helps `black` find + configuration files more easily. This option can be turned off if you want + to control the directory Python is executed from yourself. + + +=============================================================================== +cspell *ale-python-cspell* + +See |ale-cspell-options| + + +=============================================================================== +flake8 *ale-python-flake8* + +g:ale_python_flake8_change_directory *g:ale_python_flake8_change_directory* + *b:ale_python_flake8_change_directory* + Type: |String| + Default: `'project'` + + If set to `project`, ALE will switch to the project root before checking file. + If set to `file`, ALE will first switch to the directory containing the + Python file being checked with `flake8` before checking it. + You can turn it off with `off` option if you want to control the directory + Python is executed from yourself. + + +g:ale_python_flake8_executable *g:ale_python_flake8_executable* + *b:ale_python_flake8_executable* + Type: |String| + Default: `'flake8'` + + This variable can be changed to modify the executable used for flake8. Set + this to `'pipenv'` to invoke `'pipenv` `run` `flake8'`. Set this to + `'poetry'` to invoke `'poetry` `run` `flake8'`. + + +g:ale_python_flake8_options *g:ale_python_flake8_options* + *b:ale_python_flake8_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the flake8 + invocation. + + For example, to dynamically switch between programs targeting Python 2 and + Python 3, you may want to set > + + let g:ale_python_flake8_executable = 'python3' " or 'python' for Python 2 + let g:ale_python_flake8_options = '-m flake8' +< + after making sure it's installed for the appropriate Python versions (e.g. + `python3 -m pip install --user flake8`). + + +g:ale_python_flake8_use_global *g:ale_python_flake8_use_global* + *b:ale_python_flake8_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + This variable controls whether or not ALE will search for flake8 in a + virtualenv directory first. If this variable is set to `1`, then ALE will + always use |g:ale_python_flake8_executable| for the executable path. + + Both variables can be set with `b:` buffer variables instead. + + +g:ale_python_flake8_auto_pipenv *g:ale_python_flake8_auto_pipenv* + *b:ale_python_flake8_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_flake8_auto_poetry *g:ale_python_flake8_auto_poetry* + *b:ale_python_flake8_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +flakehell *ale-python-flakehell* + +g:ale_python_flakehell_change_directory*g:ale_python_flakehell_change_directory* + *b:ale_python_flakehell_change_directory* + Type: |String| + Default: `project` + + If set to `project`, ALE will switch to the project root before checking file. + If set to `file`, ALE will switch to directory the Python file being + checked with `flakehell` is in before checking it. + You can turn it off with `off` option if you want to control the directory + Python is executed from yourself. + + +g:ale_python_flakehell_executable *g:ale_python_flakehell_executable* + *b:ale_python_flakehell_executable* + Type: |String| + Default: `'flakehell'` + + This variable can be changed to modify the executable used for flakehell. Set + this to `'pipenv'` to invoke `'pipenv` `run` `flakehell'`. Set this to + `'poetry'` to invoke `'poetry` `run` `flakehell'`. Set this to `'python'` to + invoke `'python` `-m` `flakehell'`. + + +g:ale_python_flakehell_options *g:ale_python_flakehell_options* + *b:ale_python_flakehell_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the flakehell + lint invocation. + + +g:ale_python_flakehell_use_global *g:ale_python_flakehell_use_global* + *b:ale_python_flakehell_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + This variable controls whether or not ALE will search for flakehell in a + virtualenv directory first. If this variable is set to `1`, then ALE will + always use |g:ale_python_flakehell_executable| for the executable path. + + Both variables can be set with `b:` buffer variables instead. + + +g:ale_python_flakehell_auto_pipenv *g:ale_python_flakehell_auto_pipenv* + *b:ale_python_flakehell_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_flakehell_auto_poetry *g:ale_python_flakehell_auto_poetry* + *b:ale_python_flakehell_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +isort *ale-python-isort* + +g:ale_python_isort_executable *g:ale_python_isort_executable* + *b:ale_python_isort_executable* + Type: |String| + Default: `'isort'` + + See |ale-integrations-local-executables| + + +g:ale_python_isort_options *g:ale_python_isort_options* + *b:ale_python_isort_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to isort. + + +g:ale_python_isort_use_global *g:ale_python_isort_use_global* + *b:ale_python_isort_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_isort_auto_pipenv *g:ale_python_isort_auto_pipenv* + *b:ale_python_isort_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_isort_auto_poetry *g:ale_python_isort_auto_poetry* + *b:ale_python_isort_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +mypy *ale-python-mypy* + +The minimum supported version of mypy that ALE supports is v0.4.4. This is +the first version containing the `--shadow-file` option ALE needs to be able +to check for errors while you type. + +`mypy` will be run from a detected project root, per |ale-python-root|. + + +g:ale_python_mypy_auto_pipenv *g:ale_python_mypy_auto_pipenv* + *b:ale_python_mypy_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_mypy_auto_poetry *g:ale_python_mypy_auto_poetry* + *b:ale_python_mypy_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +g:ale_python_mypy_executable *g:ale_python_mypy_executable* + *b:ale_python_mypy_executable* + Type: |String| + Default: `'mypy'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `mypy'`. + Set this to `'poetry'` to invoke `'poetry` `run` `mypy'`. + + +g:ale_python_mypy_ignore_invalid_syntax + *g:ale_python_mypy_ignore_invalid_syntax* + *b:ale_python_mypy_ignore_invalid_syntax* + Type: |Number| + Default: `0` + + When set to `1`, syntax error messages for mypy will be ignored. This option + can be used when running other Python linters which check for syntax errors, + as mypy can take a while to finish executing. + + +g:ale_python_mypy_options *g:ale_python_mypy_options* + *b:ale_python_mypy_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the mypy + invocation. + + +g:ale_python_mypy_show_notes *g:ale_python_mypy_show_notes* + *b:ale_python_mypy_show_notes* + Type: |Number| + Default: `1` + + If enabled, notes on lines will be displayed as 'I' (info) messages. + + +g:ale_python_mypy_use_global *g:ale_python_mypy_use_global* + *b:ale_python_mypy_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +prospector *ale-python-prospector* + +g:ale_python_prospector_executable *g:ale_python_prospector_executable* + *b:ale_python_prospector_executable* + Type: |String| + Default: `'prospector'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `prospector'`. + Set this to `'poetry'` to invoke `'poetry` `run` `prospector'`. + + +g:ale_python_prospector_options *g:ale_python_prospector_options* + *b:ale_python_prospector_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the prospector + invocation. + + For example, to dynamically switch between programs targeting Python 2 and + Python 3, you may want to set > + + let g:ale_python_prospector_executable = 'python3' + " or 'python' for Python 2 + let g:ale_python_prospector_options = '--rcfile /path/to/.prospector.yaml' + " The virtualenv detection needs to be disabled. + let g:ale_python_prospector_use_global = 0 + + after making sure it's installed for the appropriate Python versions (e.g. + `python3 -m pip install --user prospector`). + + +g:ale_python_prospector_use_global *g:ale_python_prospector_use_global* + *b:ale_python_prospector_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_prospector_auto_pipenv *g:ale_python_prospector_auto_pipenv* + *b:ale_python_prospector_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_prospector_auto_poetry *g:ale_python_prospector_auto_poetry* + *b:ale_python_prospector_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +pycodestyle *ale-python-pycodestyle* + +g:ale_python_pycodestyle_executable *g:ale_python_pycodestyle_executable* + *b:ale_python_pycodestyle_executable* + Type: |String| + Default: `'pycodestyle'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `pycodestyle'`. + Set this to `'poetry'` to invoke `'poetry` `run` `pycodestyle'`. + + +g:ale_python_pycodestyle_options *g:ale_python_pycodestyle_options* + *b:ale_python_pycodestyle_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the + pycodestyle invocation. + + +g:ale_python_pycodestyle_use_global *g:ale_python_pycodestyle_use_global* + *b:ale_python_pycodestyle_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_pycodestyle_auto_pipenv *g:ale_python_pycodestyle_auto_pipenv* + *b:ale_python_pycodestyle_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pycodestyle_auto_poetry *g:ale_python_pycodestyle_auto_poetry* + *b:ale_python_pycodestyle_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +pydocstyle *ale-python-pydocstyle* + +g:ale_python_pydocstyle_executable *g:ale_python_pydocstyle_executable* + *b:ale_python_pydocstyle_executable* + Type: |String| + Default: `'pydocstyle'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `pydocstyle'`. + Set this to `'poetry'` to invoke `'poetry` `run` `pydocstyle'`. + + +g:ale_python_pydocstyle_options *g:ale_python_pydocstyle_options* + *b:ale_python_pydocstyle_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the + pydocstyle invocation. + + +g:ale_python_pydocstyle_use_global *g:ale_python_pydocstyle_use_global* + *b:ale_python_pydocstyle_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_pydocstyle_auto_pipenv *g:ale_python_pydocstyle_auto_pipenv* + *b:ale_python_pydocstyle_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pydocstyle_auto_poetry *g:ale_python_pydocstyle_auto_poetry* + *b:ale_python_pydocstyle_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +pyflakes *ale-python-pyflakes* + +g:ale_python_pyflakes_executable *g:ale_python_pyflakes_executable* + *b:ale_python_pyflakes_executable* + Type: |String| + Default: `'pyflakes'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `pyflakes'`. + Set this to `'poetry'` to invoke `'poetry` `run` `pyflakes'`. + + +g:ale_python_pyflakes_auto_pipenv *g:ale_python_pyflakes_auto_pipenv* + *b:ale_python_pyflakes_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pyflakes_auto_poetry *g:ale_python_pyflakes_auto_poetry* + *b:ale_python_pyflakes_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +pyflyby *ale-python-pyflyby* + +g:ale_python_pyflyby_executable *g:ale_python_pyflyby_executable* + *b:ale_python_pyflyby_executable* + Type: |String| + Default: `'tidy-imports'` + + See |ale-integrations-local-executables| + + +g:ale_python_pyflyby_options *g:ale_python_pyflyby_options* + *b:ale_python_pyflyby_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the pyflyby + tidy-imports invocation. + + +g:ale_python_pyflyby_use_global *g:ale_python_pyflyby_use_global* + *b:ale_python_pyflyby_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_pyflyby_auto_pipenv *g:ale_python_pyflyby_auto_pipenv* + *b:ale_python_pyflyby_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pyflyby_auto_poetry *g:ale_python_pyflyby_auto_poetry* + *b:ale_python_pyflyby_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +pylama *ale-python-pylama* + +g:ale_python_pylama_change_directory *g:ale_python_pylama_change_directory* + *b:ale_python_pylama_change_directory* + Type: |Number| + Default: `1` + + If set to `1`, `pylama` will be run from a detected project root, per + |ale-python-root|. This is useful because `pylama` only searches for + configuration files in its current directory and applies file masks using + paths relative to its current directory. This option can be turned off if + you want to control the directory in which `pylama` is executed. + + +g:ale_python_pylama_executable *g:ale_python_pylama_executable* + *b:ale_python_pylama_executable* + Type: |String| + Default: `'pylama'` + + This variable can be changed to modify the executable used for pylama. Set + this to `'pipenv'` to invoke `'pipenv` `run` `pylama'`. Set this to + `'poetry'` to invoke `'poetry` `run` `pylama'`. + + +g:ale_python_pylama_options *g:ale_python_pylama_options* + *b:ale_python_pylama_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the pylama + invocation. + + +g:ale_python_pylama_use_global *g:ale_python_pylama_use_global* + *b:ale_python_pylama_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + This variable controls whether or not ALE will search for pylama in a + virtualenv directory first. If this variable is set to `1`, then ALE will + always use |g:ale_python_pylama_executable| for the executable path. + + Both variables can be set with `b:` buffer variables instead. + + +g:ale_python_pylama_auto_pipenv *g:ale_python_pylama_auto_pipenv* + *b:ale_python_pylama_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pylama_auto_poetry *g:ale_python_pylama_auto_poetry* + *b:ale_python_pylama_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +pylint *ale-python-pylint* + +g:ale_python_pylint_change_directory *g:ale_python_pylint_change_directory* + *b:ale_python_pylint_change_directory* + Type: |Number| + Default: `1` + + If set to `1`, `pylint` will be run from a detected project root, per + |ale-python-root|. Since `pylint` only checks for `pylintrc` in the packages + above its current directory before falling back to user and global `pylintrc` + files, this is necessary for `pylint` to use a project `pylintrc` file, if + present. This option can be turned off if you want to control the directory + Python is executed from yourself. + + +g:ale_python_pylint_executable *g:ale_python_pylint_executable* + *b:ale_python_pylint_executable* + Type: |String| + Default: `'pylint'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `pylint'`. + Set this to `'poetry'` to invoke `'poetry` `run` `pylint'`. + + +g:ale_python_pylint_options *g:ale_python_pylint_options* + *b:ale_python_pylint_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the pylint + invocation. + + For example, to dynamically switch between programs targeting Python 2 and + Python 3, you may want to set > + + let g:ale_python_pylint_executable = 'python3' " or 'python' for Python 2 + let g:ale_python_pylint_options = '--rcfile /path/to/pylint.rc' + " The virtualenv detection needs to be disabled. + let g:ale_python_pylint_use_global = 0 + + after making sure it's installed for the appropriate Python versions (e.g. + `python3 -m pip install --user pylint`). + + +g:ale_python_pylint_use_global *g:ale_python_pylint_use_global* + *b:ale_python_pylint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_pylint_auto_pipenv *g:ale_python_pylint_auto_pipenv* + *b:ale_python_pylint_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pylint_auto_poetry *g:ale_python_pylint_auto_poetry* + *b:ale_python_pylint_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pylint_use_msg_id *g:ale_python_pylint_use_msg_id* + *b:ale_python_pylint_use_msg_id* + Type: |Number| + Default: `0` + + Use message for output (e.g. I0011) instead of symbolic name of the message + (e.g. locally-disabled). + + +=============================================================================== +pylsp *ale-python-pylsp* + +`pylsp` will be run from a detected project root, per |ale-python-root|. + + +g:ale_python_pylsp_executable *g:ale_python_pylsp_executable* + *b:ale_python_pylsp_executable* + Type: |String| + Default: `'pylsp'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `pylsp'`. + Set this to `'poetry'` to invoke `'poetry` `run` `pyls'`. + + +g:ale_python_pylsp_use_global *g:ale_python_pylsp_use_global* + *b:ale_python_pylsp_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_pylsp_auto_pipenv *g:ale_python_pylsp_auto_pipenv* + *b:ale_python_pylsp_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pylsp_auto_poetry *g:ale_python_pylsp_auto_poetry* + *b:ale_python_pylsp_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pylsp_config *g:ale_python_pylsp_config* + *b:ale_python_pylsp_config* + Type: |Dictionary| + Default: `{}` + + Dictionary with configuration settings for pylsp. For example, to disable + the pycodestyle linter: > + { + \ 'pylsp': { + \ 'plugins': { + \ 'pycodestyle': { + \ 'enabled': v:false + \ } + \ } + \ }, + \ } +< + +g:ale_python_pylsp_options *g:ale_python_pylsp_options* + *b:ale_python_pylsp_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the pylsp + invocation. Note that this is not the same thing as ale_python_pylsp_config, + which allows configuration of how pylsp functions; this is intended to + provide flexibility in how the pylsp command is invoked. + + For example, if you had installed `pylsp` but your `pylsp` executable was not + on your `PATH` for some reason, an alternative way to run the pylsp server + would be: + let g:ale_python_pylsp_executable = 'python3' + let g:ale_python_pylsp_options = '-m pylsp' + + An example strategy for installing `pylsp`: + `python3 -m pip install --user pylsp` + + +=============================================================================== +pyre *ale-python-pyre* + +`pyre` will be run from a detected project root, per |ale-python-root|. + + +g:ale_python_pyre_executable *g:ale_python_pyre_executable* + *b:ale_python_pyre_executable* + Type: |String| + Default: `'pyre'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `pyre'`. + Set this to `'poetry'` to invoke `'poetry` `run` `pyre'`. + + +g:ale_python_pyre_use_global *g:ale_python_pyre_use_global* + *b:ale_python_pyre_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_pyre_auto_pipenv *g:ale_python_pyre_auto_pipenv* + *b:ale_python_pyre_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_pyre_auto_poetry *g:ale_python_pyre_auto_poetry* + *b:ale_python_pyre_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +pyright *ale-python-pyright* + +The `pyright` linter requires a recent version of `pyright` which includes +the `pyright-langserver` executable. You can install `pyright` on your system +through `npm` with `sudo npm install -g pyright` or similar. + +Refer to their README for installation instructions: +https://github.com/Microsoft/pyright + +`pyright` needs to know the path to your Python executable and probably a +virtualenv to run. ALE will try to detect these automatically. +See |g:ale_python_pyright_config|. + + +g:ale_python_pyright_executable *g:ale_python_pyright_executable* + *b:ale_python_pyright_executable* + Type: |String| + Default: `'pyright-langserver'` + + The executable for running `pyright`, which is typically installed globally. + + +g:ale_python_pyright_config *g:ale_python_pyright_config* + *b:ale_python_pyright_config* + Type: |Dictionary| + Default: `{}` + + Settings for configuring the `pyright` language server. + + See pyright's documentation for a full list of options: + https://github.com/microsoft/pyright/blob/master/docs/settings.md + + ALE will automatically try to set defaults for `venvPath` and `pythonPath` + so your project can automatically be checked with the right libraries. + You can override these settings with whatever you want in your ftplugin + file like so: > + + let b:ale_python_pyright_config = { + \ 'python': { + \ 'pythonPath': '/bin/python', + \ 'venvPath': '/other/dir', + \ }, + \} +< + If `venvPath` is set, but `pythonPath` is not, + ALE will use `venvPath . '/bin/python'` or similar as `pythonPath`. + + A commonly used setting for `pyright` is disabling language services + apart from type checking and "hover" (|ale-hover|), you can set this + setting like so, or use whatever other settings you want: > + + let b:ale_python_pyright_config = { + \ 'pyright': { + \ 'disableLanguageServices': v:true, + \ }, + \} +< + +=============================================================================== +refurb *ale-python-refurb* + +g:ale_python_refurb_change_directory *g:ale_python_refurb_change_directory* + *b:ale_python_refurb_change_directory* + Type: |Number| + Default: `1` + + If set to `1`, `refurb` will be run from a detected project root, per + |ale-python-root|. if set to `0` or no project root detected, + `refurb` will be run from the buffer's directory. + + +g:ale_python_refurb_executable *g:ale_python_refurb_executable* + *b:ale_python_refurb_executable* + Type: |String| + Default: `'refurb'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `refurb'`. + Set this to `'poetry'` to invoke `'poetry` `run` `refurb'`. + + +g:ale_python_refurb_options *g:ale_python_refurb_options* + *b:ale_python_refurb_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the refurb + invocation. + + For example, to select/enable and/or disable some error codes, + you may want to set > + let g:ale_python_refurb_options = '--ignore 100' +g:ale_python_refurb_use_global *g:ale_python_refurb_use_global* + *b:ale_python_refurb_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_refurb_auto_pipenv *g:ale_python_refurb_auto_pipenv* + *b:ale_python_refurb_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_refurb_auto_poetry *g:ale_python_refurb_auto_poetry* + *b:ale_python_refurb_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +reorder-python-imports *ale-python-reorder_python_imports* + +g:ale_python_reorder_python_imports_executable + *g:ale_python_reorder_python_imports_executable* + *b:ale_python_reorder_python_imports_executable* + Type: |String| + Default: `'reorder-python-imports'` + + See |ale-integrations-local-executables| + + +g:ale_python_reorder_python_imports_options + *g:ale_python_reorder_python_imports_options* + *b:ale_python_reorder_python_imports_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to reorder-python-imports. + + +g:ale_python_reorder_python_imports_use_global + *g:ale_python_reorder_python_imports_use_global* + *b:ale_python_reorder_python_imports_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +ruff *ale-python-ruff* + +g:ale_python_ruff_change_directory *g:ale_python_ruff_change_directory* + *b:ale_python_ruff_change_directory* + Type: |Number| + Default: `1` + + If set to `1`, `ruff` will be run from a detected project root, per + |ale-python-root|. if set to `0` or no project root detected, + `ruff` will be run from the buffer's directory. + + +g:ale_python_ruff_executable *g:ale_python_ruff_executable* + *b:ale_python_ruff_executable* + Type: |String| + Default: `'ruff'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `ruff'`. + Set this to `'poetry'` to invoke `'poetry` `run` `ruff'`. + + +g:ale_python_ruff_options *g:ale_python_ruff_options* + *b:ale_python_ruff_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the ruff + invocation. + + For example, to select/enable and/or disable some error codes, + you may want to set > + let g:ale_python_ruff_options = '--ignore F401' + + +g:ale_python_ruff_use_global *g:ale_python_ruff_use_global* + *b:ale_python_ruff_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_ruff_auto_pipenv *g:ale_python_ruff_auto_pipenv* + *b:ale_python_ruff_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_ruff_auto_poetry *g:ale_python_ruff_auto_poetry* + *b:ale_python_ruff_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +=============================================================================== +unimport *ale-python-unimport* + +`unimport` will be run from a detected project root, per |ale-python-root|. + + +g:ale_python_unimport_auto_pipenv *g:ale_python_unimport_auto_pipenv* + *b:ale_python_unimport_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_unimport_auto_poetry *g:ale_python_unimport_auto_poetry* + *b:ale_python_unimport_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + +g:ale_python_unimport_executable *g:ale_python_unimport_executable* + *b:ale_python_unimport_executable* + Type: |String| + Default: `'unimport'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `unimport'`. + Set this to `'poetry'` to invoke `'poetry` `run` `unimport'`. + + +g:ale_python_unimport_options *g:ale_python_unimport_options* + *b:ale_python_unimport_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the unimport + invocation. + + +g:ale_python_unimport_use_global *g:ale_python_unimport_use_global* + *b:ale_python_unimport_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +vulture *ale-python-vulture* + +g:ale_python_vulture_change_directory *g:ale_python_vulture_change_directory* + *b:ale_python_vulture_change_directory* + Type: |Number| + Default: `1` + + If set to `1`, ALE will switch to the directory the Python file being + checked with `vulture` is in before checking it and check the whole project + directory instead of checking only the file opened in the current buffer. + This helps `vulture` to know the context and avoid false-negative results. + + +g:ale_python_vulture_executable *g:ale_python_vulture_executable* + *b:ale_python_vulture_executable* + Type: |String| + Default: `'vulture'` + + See |ale-integrations-local-executables| + + +g:ale_python_vulture_options *g:ale_python_vulture_options* + *b:ale_python_vulture_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the vulture + invocation. + + +g:ale_python_vulture_use_global *g:ale_python_vulture_use_global* + *b:ale_python_vulture_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +yapf *ale-python-yapf* + +g:ale_python_yapf_executable *g:ale_python_yapf_executable* + *b:ale_python_yapf_executable* + Type: |String| + Default: `'yapf'` + + See |ale-integrations-local-executables| + + +g:ale_python_yapf_use_global *g:ale_python_yapf_use_global* + *b:ale_python_yapf_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-qml.txt b/dot_vim/plugged/ale/doc/ale-qml.txt new file mode 100644 index 0000000..f6d715a --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-qml.txt @@ -0,0 +1,18 @@ +=============================================================================== +ALE QML Integration *ale-qml-options* + + +=============================================================================== +qmlfmt *ale-qml-qmlfmt* + +g:ale_qml_qmlfmt_executable *g:ale_qml_qmlfmt_executable* + *b:ale_qml_qmlfmt_executable* + Type: |String| + Default: `'qmlfmt'` + + This variable can be set to change the path to qmlfmt. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: + diff --git a/dot_vim/plugged/ale/doc/ale-r.txt b/dot_vim/plugged/ale/doc/ale-r.txt new file mode 100644 index 0000000..3fabf70 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-r.txt @@ -0,0 +1,68 @@ +=============================================================================== +ALE R Integration *ale-r-options* + + +=============================================================================== +languageserver *ale-r-languageserver* + +g:ale_r_languageserver_cmd *g:ale_r_languageserver_cmd* + *b:ale_r_languageserver_cmd* + Type: |String| + Default: `'languageserver::run()'` + + This option can be configured to change the execution command for + languageserver. + + See the languageserver documentation for more options. + + +g:ale_r_languageserver_config *g:ale_r_languageserver_config* + *b:ale_r_languageserver_config* + Type: |Dictionary| + Default: `{}` + + This option can be configured to change settings for languageserver. See the + languageserver documentation for more information. + + +=============================================================================== +lintr *ale-r-lintr* + +g:ale_r_lintr_options *g:ale_r_lintr_options* + *b:ale_r_lintr_options* + Type: |String| + Default: `'lintr::with_defaults()'` + + This option can be configured to change the options for lintr. + + The value of this option will be run with `eval` for the `lintr::lint` + options. Consult the lintr documentation for more information. + + +g:ale_r_lintr_lint_package *g:ale_r_lintr_lint_package* + *b:ale_r_lintr_lint_package* + Type: |Number| + Default: `0` + + When set to `1`, the file will be checked with `lintr::lint_package` instead + of `lintr::lint`. This prevents erroneous namespace warnings when linting + package files. + + +=============================================================================== +styler *ale-r-styler* + +g:ale_r_styler_options *g:ale_r_styler_options* + *b:ale_r_styler_options* + Type: |String| + Default: `'styler::tidyverse_style'` + + This option can be configured to change the options for styler. + + The value of this option will be used as the `style` argument for the + `styler::style_file` options. Consult the styler documentation + for more information. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-racket.txt b/dot_vim/plugged/ale/doc/ale-racket.txt new file mode 100644 index 0000000..7e78702 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-racket.txt @@ -0,0 +1,41 @@ +=============================================================================== +ALE Racket Integration *ale-racket-options* + +=============================================================================== +racket_langserver *ale-racket-langserver* + +1. Install racket-langserver as described here: + https://github.com/jeapostrophe/racket-langserver +2. Have `racket` available in the `$PATH` environment variable, currently there + is no way to specify path to custom location of `racket`. +3. set `racket_langserver` as a linter for `racket` like: > + let g:ale_linters['racket'] += ['racket_langserver'] + +You should be able to see linter results and use LSP features of `ALE` like +`ALEGoToDefinition` with `racket-langserver`. + +=============================================================================== +raco_fmt *ale-racket-raco-fmt* + +g:ale_racket_raco_fmt_executable *g:ale_racket_raco_fmt_executable* + *b:ale_racket_raco_fmt_executable* + Type: |String| + Default: `'raco'` + + If the `raco` excutable is not in the `$PATH` environment variable, or you + prefer to use one installed in a custom location, set this option to the + path to the specific `raco` executable. + +g:ale_racket_raco_fmt_options *g:ale_racket_raco_fmt_options* + *b:ale_racket_raco_fmt_options* + Type: |String| + Default: `''` + + Use this variable to pass command-line flags/parameters to `raco_fmt` + + For example, set the page width limit to 40 > + let g:ale_racket_raco_fmt_options = '--width 40' + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-reasonml.txt b/dot_vim/plugged/ale/doc/ale-reasonml.txt new file mode 100644 index 0000000..b8729a5 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-reasonml.txt @@ -0,0 +1,76 @@ +=============================================================================== +ALE ReasonML Integration *ale-reasonml-options* + + +=============================================================================== +merlin *ale-reasonml-merlin* + +To use merlin linter for ReasonML source code you need to make sure Merlin for +Vim is correctly configured. See the corresponding Merlin wiki page for +detailed instructions: +https://github.com/the-lambda-church/merlin/wiki/vim-from-scratch + +=============================================================================== +ols *ale-reasonml-ols* + +The `ocaml-language-server` is the engine that powers OCaml and ReasonML +editor support using the Language Server Protocol. See the installation +instructions: +https://github.com/freebroccolo/ocaml-language-server#installation + + +g:ale_reason_ols_executable *g:ale_reason_ols_executable* + *b:ale_reason_ols_executable* + Type: |String| + Default: `'ocaml-language-server'` + + This variable can be set to change the executable path for `ols`. + + +g:ale_reason_ols_use_global *g:ale_reason_ols_use_global* + *b:ale_reason_ols_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + This variable can be set to `1` to always use the globally installed + executable. See also |ale-integrations-local-executables|. + + +=============================================================================== +reason-language-server *ale-reasonml-language-server* + +Note: You must set an executable - there is no 'default' install location. +Go to https://github.com/jaredly/reason-language-server and download the +latest release. You can place it anywhere, but ensure you set the executable +path. + + +g:ale_reason_ls_executable *g:ale_reason_ls_executable* + *b:ale_reason_ls_executable* + Type: |String| + + This variable defines the standard location of the language server + executable. This must be set. + + +=============================================================================== +refmt *ale-reasonml-refmt* + +g:ale_reasonml_refmt_executable *g:ale_reasonml_refmt_executable* + *b:ale_reasonml_refmt_executable* + Type: |String| + Default: `'refmt'` + + This variable can be set to pass the path of the refmt fixer. + + +g:ale_reasonml_refmt_options *g:ale_reasonml_refmt_options* + *b:ale_reasonml_refmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the refmt fixer. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-rego.txt b/dot_vim/plugged/ale/doc/ale-rego.txt new file mode 100644 index 0000000..9a39dbf --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-rego.txt @@ -0,0 +1,50 @@ +=============================================================================== +ALE Rego Integration *ale-rego-options* + + +=============================================================================== +cspell *ale-rego-cspell* + +See |ale-cspell-options| + + +=============================================================================== +opacheck *ale-rego-opa-check* + +g:ale_rego_opacheck_executable *g:rego_opacheck_executable* + *b:rego_opacheck_executable* + + Type: |String| + Default: `'opa'` + + This variable can be changed to use a different executable for opa. + + +g:rego_opacheck_options *g:rego_opacheck_options* + *b:rego_opacheck_options* + Type: |String| + Default: `''` + + This variable can be changed to pass custom CLI flags to opa check. + + +=============================================================================== +opafmt *ale-rego-opa-fmt-fixer* + +g:ale_opa_fmt_executable *g:ale_opa_fmt_executable* + *b:ale_opa_fmt_executable* + + Type: |String| + Default: `'opa'` + + This variable can be changed to use a different executable for opa. + + +g:ale_opa_fmt_options *g:ale_opa_fmt_options* + *b:ale_opa_fmt_options* + Type: |String| + Default: `''` + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-restructuredtext.txt b/dot_vim/plugged/ale/doc/ale-restructuredtext.txt new file mode 100644 index 0000000..7af6213 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-restructuredtext.txt @@ -0,0 +1,33 @@ +=============================================================================== +ALE reStructuredText Integration *ale-restructuredtext-options* + + +=============================================================================== +cspell *ale-restructuredtext-cspell* + +See |ale-cspell-options| + + +=============================================================================== +textlint *ale-restructuredtext-textlint* + +To use textlint at reStructuredText, please install `textlint-plugin-rst`. +https://github.com/jimo1001/textlint-plugin-rst +> + $ npm install textlint-plugin-rst + +To install `textlint-plugin-rst`, `docutils-ast-writer` python package +must be installed. +See: https://github.com/jimo1001/docutils-ast-writer + +See |ale-text-textlint| + + +=============================================================================== +write-good *ale-restructuredtext-write-good* + +See |ale-write-good-options| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-robot.txt b/dot_vim/plugged/ale/doc/ale-robot.txt new file mode 100644 index 0000000..405ae27 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-robot.txt @@ -0,0 +1,16 @@ +=============================================================================== +ALE Robot Integration *ale-robot-options* + + +=============================================================================== +rflint *ale-robot-rflint* + +g:ale_robot_rflint_executable *g:ale_robot_rflint_executable* + *b:ale_robot_rflint_executable* + Type: |String| + Default: `'rflint'` + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: + diff --git a/dot_vim/plugged/ale/doc/ale-ruby.txt b/dot_vim/plugged/ale/doc/ale-ruby.txt new file mode 100644 index 0000000..b0773fd --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-ruby.txt @@ -0,0 +1,243 @@ +=============================================================================== +ALE Ruby Integration *ale-ruby-options* + + +=============================================================================== +brakeman *ale-ruby-brakeman* + +g:ale_ruby_brakeman_executable *g:ale_ruby_brakeman_executable* + *b:ale_ruby_brakeman_executable* + Type: |String| + Default: `'brakeman'` + + Override the invoked brakeman binary. Set this to `'bundle'` to invoke + `'bundle` `exec` brakeman'. + + +g:ale_ruby_brakeman_options *g:ale_ruby_brakeman_options* + *b:ale_ruby_brakeman_options* + Type: |String| + Default: `''` + + The contents of this variable will be passed through to brakeman. + + +=============================================================================== +cspell *ale-ruby-cspell* + +See |ale-cspell-options| + + +=============================================================================== +debride *ale-ruby-debride* + +g:ale_ruby_debride_executable *g:ale_ruby_debride_executable* + *b:ale_ruby_debride_executable* + Type: |String| + Default: `'debride'` + + Override the invoked debride binary. Set this to `'bundle'` to invoke + `'bundle` `exec` debride'. + + +g:ale_ruby_debride_options *g:ale_ruby_debride_options* + *b:ale_ruby_debride_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to debride. + + +=============================================================================== +prettier *ale-ruby-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +rails_best_practices *ale-ruby-rails_best_practices* + +g:ale_ruby_rails_best_practices_executable + *g:ale_ruby_rails_best_practices_executable* + *b:ale_ruby_rails_best_practices_executable* + Type: |String| + Default: `'rails_best_practices'` + + Override the invoked rails_best_practices binary. Set this to `'bundle'` to + invoke `'bundle` `exec` rails_best_practices'. + + +g:ale_ruby_rails_best_practices_options + *g:ale_ruby_rails_best_practices_options* + *b:ale_ruby_rails_best_practices_options* + Type: |String| + Default: `''` + + The contents of this variable will be passed through to rails_best_practices. + + +=============================================================================== +reek *ale-ruby-reek* + +g:ale_ruby_reek_executable *g:ale_ruby_reek_executable* + *b:ale_ruby_reek_executable* + Type: |String| + Default: `'reek'` + + Override the invoked reek binary. Set this to `'bundle'` to invoke + `'bundle` `exec` reek'. + + +g:ale_ruby_reek_show_context *g:ale_ruby_reek_show_context* + *b:ale_ruby_reek_show_context* + Type: |Number| + Default: `0` + + Controls whether context is included in the linter message. Defaults to off + because context is usually obvious while viewing a file. + + +g:ale_ruby_reek_show_wiki_link *g:ale_ruby_reek_show_wiki_link* + *b:ale_ruby_reek_show_wiki_link* + Type: |Number| + Default: `0` + + Controls whether linter messages contain a link to an explanatory wiki page + for the type of code smell. Defaults to off to improve readability. + + +=============================================================================== +rubocop *ale-ruby-rubocop* + +g:ale_ruby_rubocop_executable *g:ale_ruby_rubocop_executable* + *b:ale_ruby_rubocop_executable* + Type: |String| + Default: `'rubocop'` + + Override the invoked rubocop binary. Set this to `'bundle'` to invoke + `'bundle` `exec` rubocop'. + + +g:ale_ruby_rubocop_options *g:ale_ruby_rubocop_options* + *b:ale_ruby_rubocop_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to rubocop. + + +g:ale_ruby_rubocop_auto_correct_all *g:ale_ruby_rubocop_auto_correct_all* + *b:ale_ruby_rubocop_auto_correct_all* + Type: |Number| + Default: `0` + + This variable can be changed to make rubocop to correct all offenses (unsafe). + + +=============================================================================== +ruby *ale-ruby-ruby* + +g:ale_ruby_ruby_executable *g:ale_ruby_ruby_executable* + *b:ale_ruby_ruby_executable* + Type: |String| + Default: `'ruby'` + + This variable can be changed to use a different executable for ruby. + + +=============================================================================== +rufo *ale-ruby-rufo* + +g:ale_ruby_rufo_executable *g:ale_ruby_rufo_executable* + *b:ale_ruby_rufo_executable* + Type: |String| + Default: `'rufo'` + + Override the invoked rufo binary. This is useful for running rufo from + binstubs or a bundle. + + +=============================================================================== +solargraph *ale-ruby-solargraph* + +g:ale_ruby_solargraph_executable *g:ale_ruby_solargraph_executable* + *b:ale_ruby_solargraph_executable* + Type: |String| + Default: `'solargraph'` + + Override the invoked solargraph binary. This is useful for running solargraph + from binstubs or a bundle. + + +=============================================================================== +sorbet *ale-ruby-sorbet* + +g:ale_ruby_sorbet_executable *g:ale_ruby_sorbet_executable* + *b:ale_ruby_sorbet_executable* + Type: |String| + Default: `'srb'` + + Override the invoked sorbet binary. Set this to `'bundle'` to invoke + `'bundle` `exec` srb'. + + +g:ale_ruby_sorbet_options *g:ale_ruby_sorbet_options* + *b:ale_ruby_sorbet_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to sorbet. + + +g:ale_ruby_sorbet_enable_watchman *g:ale_ruby_sorbet_enable_watchman* + *b:ale_ruby_sorbet_enable_watchman* + Type: |Number| + Default: `0` + + Whether or not to use watchman to let the LSP server to know about changes + to files from outside of vim. Defaults to disable watchman because it + requires watchman to be installed separately from sorbet. + + +=============================================================================== +standardrb *ale-ruby-standardrb* + +g:ale_ruby_standardrb_executable *g:ale_ruby_standardrb_executable* + *b:ale_ruby_standardrb_executable* + Type: |String| + Default: `'standardrb'` + + Override the invoked standardrb binary. Set this to `'bundle'` to invoke + `'bundle` `exec` standardrb'. + + +g:ale_ruby_standardrb_options *g:ale_ruby_standardrb_options* + *b:ale_ruby_standardrb_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to standardrb. + + +=============================================================================== +syntax_tree *ale-ruby-syntax_tree* + +g:ale_ruby_syntax_tree_executable *g:ale_ruby_syntax_tree_executable* + *b:ale_ruby_syntax_tree_executable* + Type: |String| + Default: `'stree'` + + Override the invoked SyntaxTree binary. Set this to `'bundle'` to invoke + `'bundle` `exec` stree'. + + +g:ale_ruby_syntax_tree_options *g:ale_ruby_syntax_tree_options* + *b:ale_ruby_syntax_tree_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to SyntaxTree. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-rust.txt b/dot_vim/plugged/ale/doc/ale-rust.txt new file mode 100644 index 0000000..36d69b5 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-rust.txt @@ -0,0 +1,300 @@ +=============================================================================== +ALE Rust Integration *ale-rust-options* + *ale-integration-rust* + +=============================================================================== +Integration Information + + If Vim does not detect the Rust file type out-of-the-box, you need the runtime + files for Rust distributed in Vim >=8.0.0501 or upstream: + https://github.com/rust-lang/rust.vim + + Note that there are several possible linters and fixers for Rust files: + + 1. rustc -- The Rust compiler is used to check the currently edited file. + So, if your project consists of multiple files, you will get some errors + when you use e.g. a struct which is defined in another file. You can use + |g:ale_rust_ignore_error_codes| to ignore some of these errors. + 2. cargo -- If your project is managed by Cargo, the whole project is + checked. That means that all errors are properly shown, but cargo can + only operate on the files written on disk, so errors will not be reported + while you type. + 3. rls -- If you have `rls` installed, you might prefer using this linter + over cargo. rls implements the Language Server Protocol for incremental + compilation of Rust code, and can check Rust files while you type. `rls` + requires Rust files to be contained in Cargo projects. + 4. analyzer -- If you have rust-analyzer installed, you might prefer using + this linter over cargo and rls. rust-analyzer also implements the + Language Server Protocol for incremental compilation of Rust code, and is + the next iteration of rls. rust-analyzer either requires Rust files to be + contained in Cargo projects or requires the project to be described in + the rust-project.json format: + https://rust-analyzer.github.io/manual.html#non-cargo-based-projects + 5. rustfmt -- If you have `rustfmt` installed, you can use it as a fixer to + consistently reformat your Rust code. + + Only cargo and rls are enabled by default. To switch to using rustc instead + of cargo, configure |g:ale_linters| appropriately: > + + " See the help text for the option for more information. + let g:ale_linters = {'rust': ['rustc', 'rls']} +< + + Also note that rustc 1.18. or later is needed. + + +=============================================================================== +analyzer *ale-rust-analyzer* + +g:ale_rust_analyzer_executable *g:ale_rust_analyzer_executable* + *b:ale_rust_analyzer_executable* + Type: |String| + Default: `'rust-analyzer'` + + This variable can be modified to change the executable path for + `rust-analyzer`. + + +g:ale_rust_analyzer_config *g:ale_rust_analyzer_config* + *b:ale_rust_analyzer_config* + Type: |Dictionary| + Default: `{}` + + Dictionary with configuration settings for rust-analyzer. + + +=============================================================================== +cargo *ale-rust-cargo* + +g:ale_rust_cargo_use_check *g:ale_rust_cargo_use_check* + *b:ale_rust_cargo_use_check* + Type: |Number| + Default: `1` + + When set to `1`, this option will cause ALE to use `cargo check` instead of + `cargo build` . `cargo check` is supported since version 1.16.0 of Rust. + + ALE will never use `cargo check` when the version of `cargo` is less than + 0.17.0. + + +g:ale_rust_cargo_check_all_targets *g:ale_rust_cargo_check_all_targets* + *b:ale_rust_cargo_check_all_targets* + Type: |Number| + Default: `0` + + When set to `1`, ALE will set the `--all-targets` option when `cargo check` + is used. See |g:ale_rust_cargo_use_check|, + + +g:ale_rust_cargo_check_tests *g:ale_rust_cargo_check_tests* + *b:ale_rust_cargo_check_tests* + Type: |Number| + Default: `0` + + When set to `1`, ALE will set the `--tests` option when `cargo check` + is used. This allows for linting of tests which are normally excluded. + See |g:ale_rust_cargo_use_check|, + + +g:ale_rust_cargo_check_examples *g:ale_rust_cargo_check_examples* + *b:ale_rust_cargo_check_examples* + Type: |Number| + Default: `0` + + When set to `1`, ALE will set the `--examples` option when `cargo check` + is used. This allows for linting of examples which are normally excluded. + See |g:ale_rust_cargo_use_check|, + + +g:ale_rust_cargo_default_feature_behavior + *g:ale_rust_cargo_default_feature_behavior* + *b:ale_rust_cargo_default_feature_behavior* + Type: |String| + Default: `default` + + When set to `none`, ALE will set the `--no-default-features` option when + invoking `cargo`. Only the features specified in + |g:ale_rust_cargo_include_features| will be included when performing the + lint check. + + When set to `default`, ALE will instruct `cargo` to build all default + features specified in the project's `Cargo.toml` file, in addition to + including any additional features defined in + |g:ale_rust_cargo_include_features|. + + When set to `all`, ALE will set the `--all-features` option when + invoking `cargo`, which will include all features defined in the project's + `Cargo.toml` file when performing the lint check. + + +g:ale_rust_cargo_include_features *g:ale_rust_cargo_include_features* + *b:ale_rust_cargo_include_features* + Type: |String| + Default: `''` + + When defined, ALE will set the `--features` option when invoking `cargo` to + perform the lint check. See |g:ale_rust_cargo_default_feature_behavior|. + + +g:ale_rust_cargo_avoid_whole_workspace *g:ale_rust_cargo_avoid_whole_workspace* + *b:ale_rust_cargo_avoid_whole_workspace* + Type: |Number| + Default: `1` + + When set to 1, and ALE is used to edit a crate that is part of a Cargo + workspace, avoid building the entire workspace by invoking `cargo` directly + in the crate's directory. Otherwise, behave as usual. + + +g:ale_rust_cargo_use_clippy *g:ale_rust_cargo_use_clippy* + *b:ale_rust_cargo_use_clippy* + Type: |Number| + Default: `0` + + When set to 1, `cargo clippy` will be used instead of `cargo check` or + `cargo build` as linter. + For details of `cargo clippy`, please visit the following link: + + https://github.com/rust-lang-nursery/rust-clippy + + Since `cargo clippy` is optional toolchain, it's safer to check whether + `cargo-clippy` is executable as follows: +> + let g:ale_rust_cargo_use_clippy = executable('cargo-clippy') +< + +g:ale_rust_cargo_clippy_options *g:ale_rust_cargo_clippy_options* + *b:ale_rust_cargo_clippy_options* + + Type: |String| + Default: `''` + + When `cargo clippy` is used, this value will be added to a command line to run + it. This variable is useful when you want to add some extra options which + only `cargo clippy` supports (e.g. `--deny`). + + +g:ale_rust_cargo_target_dir *g:ale_rust_cargo_target_dir* + *b:ale_rust_cargo_target_dir* + + Type: |String| + Default: `''` + + Use a custom target directory when running the commands for ALE. This can + help to avoid "waiting for file lock on build directory" messages when + running `cargo` commands manually while ALE is performing its checks. + + +=============================================================================== +cspell *ale-rust-cspell* + +See |ale-cspell-options| + + +=============================================================================== +rls *ale-rust-rls* + +g:ale_rust_rls_executable *g:ale_rust_rls_executable* + *b:ale_rust_rls_executable* + Type: |String| + Default: `'rls'` + + This variable can be modified to change the executable path for `rls`. + + +g:ale_rust_rls_toolchain *g:ale_rust_rls_toolchain* + *b:ale_rust_rls_toolchain* + Type: |String| + Default: `''` + + This option can be set to change the toolchain used for `rls`. Possible + values include `'nightly'`, `'beta'`, `'stable'`, and `''`. When using + option `''`, rls will automatically find the default toolchain set by + rustup. If you want to use `rls` from a specific toolchain version, you may + also use values like `'channel-yyyy-mm-dd-arch-target'` as long as + `'rls +{toolchain_name} -V'` runs correctly in your command line. + + The `rls` server will only be started once per executable. + + +g:ale_rust_rls_config *g:ale_rust_rls_config* + *b:ale_rust_rls_config* + Type: |Dictionary| + Default: `{}` + + Dictionary with configuration settings for rls. For example, to force + using clippy as linter: > + { + \ 'rust': { + \ 'clippy_preference': 'on' + \ } + \ } + + +=============================================================================== +rustc *ale-rust-rustc* + + +g:ale_rust_rustc_options *g:ale_rust_rustc_options* + *b:ale_rust_rustc_options* + Type: |String| + Default: `'--emit=mir -o /dev/null'` + + The variable can be used to change the options passed to `rustc`. + + Users of nightly builds of Rust might want to use `-Z no-codegen` instead. + Be careful when setting the options, as running `rustc` could execute code + or generate binary files. + + +g:ale_rust_ignore_error_codes *g:ale_rust_ignore_error_codes* + *b:ale_rust_ignore_error_codes* + Type: |List| of |String|s + Default: `[]` + + This variable can contain error codes which will be ignored. For example, to + ignore most errors regarding failed imports, put this in your .vimrc + > + let g:ale_rust_ignore_error_codes = ['E0432', 'E0433'] + + +g:ale_rust_ignore_secondary_spans *g:ale_rust_ignore_secondary_spans* + *b:ale_rust_ignore_secondary_spans* + Type: |Number| + Default: `0` + + When set to 1, instructs the Rust error reporting to ignore secondary spans. + The problem with secondary spans is that they sometimes appear in error + messages before the main cause of the error, for example: > + + 1 src/main.rs|98 col 5 error| this function takes 4 parameters but 5 + parameters were supplied: defined here + 2 src/main.rs|430 col 32 error| this function takes 4 parameters but 5 + parameters were supplied: expected 4 parameters +< + This is due to the sorting by line numbers. With this option set to 1, + the 'defined here' span will not be presented. + + +=============================================================================== +rustfmt *ale-rust-rustfmt* + +g:ale_rust_rustfmt_options *g:ale_rust_rustfmt_options* + *b:ale_rust_rustfmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the rustfmt fixer. + + +g:ale_rust_rustfmt_executable *g:ale_rust_rustfmt_executable* + *b:ale_rust_rustfmt_executable* + Type: |String| + Default: `'rustfmt'` + + This variable can be modified to change the executable path for `rustfmt`. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-salt.tmt b/dot_vim/plugged/ale/doc/ale-salt.tmt new file mode 100644 index 0000000..ac500d3 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-salt.tmt @@ -0,0 +1,43 @@ +=============================================================================== +ALE SALT Integration *ale-salt-options* + +=============================================================================== +salt-lint *ale-salt-salt-lint* + +Website: https://github.com/warpnet/salt-lint + + +Installation +------------------------------------------------------------------------------- + +Install salt-lint in your a virtualenv directory, locally, or globally: > + + pip install salt-lint # After activating virtualenv + pip install --user salt-lint # Install to ~/.local/bin + sudo pip install salt-lint # Install globally + +See |g:ale_virtualenv_dir_names| for configuring how ALE searches for +virtualenv directories. + + +Options +------------------------------------------------------------------------------- + +g:ale_salt_salt-lint_executable *g:ale_salt_salt_lint_executable* + *b:ale_salt_salt_lint_executable* + Type: |String| + Default: `'salt-lint'` + + This variable can be set to change the path to salt-lint. + + +g:ale_salt_salt-lint_options *g:ale_salt_salt-lint_options* + *b:ale_salt_salt-lint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to salt-lint. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-sass.txt b/dot_vim/plugged/ale/doc/ale-sass.txt new file mode 100644 index 0000000..22d7c47 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-sass.txt @@ -0,0 +1,31 @@ +=============================================================================== +ALE Sass Integration *ale-sass-options* + + +=============================================================================== +sasslint *ale-sass-sasslint* + +See |ale-scss-sasslint| for information about the available options. + + +=============================================================================== +stylelint *ale-sass-stylelint* + +g:ale_sass_stylelint_executable *g:ale_sass_stylelint_executable* + *b:ale_sass_stylelint_executable* + Type: |String| + Default: `'stylelint'` + + See |ale-integrations-local-executables| + + +g:ale_sass_stylelint_use_global *g:ale_sass_stylelint_use_global* + *b:ale_sass_stylelint_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-scala.txt b/dot_vim/plugged/ale/doc/ale-scala.txt new file mode 100644 index 0000000..0b0f1a9 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-scala.txt @@ -0,0 +1,130 @@ +=============================================================================== +ALE Scala Integration *ale-scala-options* + + +=============================================================================== +cspell *ale-scala-cspell* + +See |ale-cspell-options| + + +=============================================================================== +metals *ale-scala-metals* + +`metals` requires either an SBT project, a Mill project, or a running Bloop +server. + + +g:ale_scala_metals_executable *g:ale_scala_metals_executable* + *b:ale_scala_metals_executable* + Type: |String| + Default: `'metals-vim'` + + Override the invoked `metals` binary. + + +g:ale_scala_metals_project_root *g:ale_scala_metals_project_root* + *b:ale_scala_metals_project_root* + Type: |String| + Default: `''` + + By default the project root is found by searching upwards for `build.sbt`, + `build.sc`, `.bloop` or `.metals`. + If the project root is elsewhere, you can override the project root + directory. + + +=============================================================================== +sbtserver *ale-scala-sbtserver* + +`sbtserver` requires a running ^1.1.x sbt shell to connect to. It will attempt +to connect via TCP to the address defined in `g:ale_scala_sbtserver_address`. +As `sbt` defaults to listening via unix sockets, place these settings into +your `~/.sbt/1.0/global.sbt` to ensure that ale will always attempt to connect +to the right socket: + +`serverConnectionType := ConnectionType.Tcp` and `serverPort := 4273` + + +g:ale_scala_sbtserver_address *g:ale_scala_sbtserver_address* + *b:ale_scala_sbtserver_address* + Type: |String| + Default: `'127.0.0.1:4273'` + + By default the address is found by parsing `active.json`, however, reading a + file is a blocking operation which should be avoided in ale. The easy way + around this is to configure sbt to always connect to the same port, which + the instructions above describe. + + +g:ale_scala_sbtserver_project_root *g:ale_scala_sbtserver_project_root* + *b:ale_scala_sbtserver_project_root* + Type: |String| + Default: `''` + + By default the project root is found by searching upwards for `build.sbt`. + If the project root is elsewhere, you can override the project root + directory. + + +=============================================================================== +scalafmt *ale-scala-scalafmt* + +If Nailgun is used, override `g:ale_scala_scalafmt_executable` like so: > + let g:ale_scala_scalafmt_executable = 'ng' + + +g:ale_scala_scalafmt_executable *g:ale_scala_scalafmt_executable* + *b:ale_scala_scalafmt_executable* + Type: |String| + Default: `'scalafmt'` + + Override the invoked `scalafmt` binary. This is useful for running `scalafmt` + with Nailgun. + + +g:ale_scala_scalafmt_options *g:ale_scala_scalafmt_options* + *b:ale_scala_scalafmt_options* + Type: |String| + Default: `''` + + A string containing additional options to pass to `'scalafmt'`, or + `'ng scalafmt'` if Nailgun is used. + + +=============================================================================== +scalastyle *ale-scala-scalastyle* + +`scalastyle` requires a configuration file for a project to run. When no +configuration file can be found, ALE will report a problem saying that a +configuration file is required at line 1. + +To disable `scalastyle` globally, use |g:ale_linters| like so: > + let g:ale_linters = {'scala': ['scalac']} " Enable only scalac instead +< + +See |g:ale_linters| for more information on disabling linters. + + +g:ale_scala_scalastyle_config *g:ale_scala_scalastyle_config* + *b:ale_scala_scalastyle_config* + Type: |String| + Default: `''` + + A string containing the location of a global fallback configuration file. + + By default, ALE will look for a configuration file named + `scalastyle_config.xml` or `scalastyle-config.xml` in the current file's + directory or parent directories. + + +g:ale_scala_scalastyle_options *g:ale_scala_scalastyle_options* + *b:ale_scala_scalastyle_options* + Type: |String| + Default: `''` + + A string containing additional options to pass to scalastyle. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-scss.txt b/dot_vim/plugged/ale/doc/ale-scss.txt new file mode 100644 index 0000000..07a94fe --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-scss.txt @@ -0,0 +1,64 @@ +=============================================================================== +ALE SCSS Integration *ale-scss-options* + + +=============================================================================== +prettier *ale-scss-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +sasslint *ale-scss-sasslint* + +g:ale_scss_sasslint_executable *g:ale_scss_sasslint_executable* + *b:ale_scss_sasslint_executable* + Type: |String| + Default: `'sass-lint'` + + See |ale-integrations-local-executables| + + +g:ale_scss_sasslint_options *g:ale_scss_sasslint_options* + *b:ale_scss_sasslint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to sass-lint. + + +g:ale_scss_sasslint_use_global *g:ale_scss_sasslint_use_global* + *b:ale_scss_sasslint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +stylelint *ale-scss-stylelint* + +g:ale_scss_stylelint_executable *g:ale_scss_stylelint_executable* + *b:ale_scss_stylelint_executable* + Type: |String| + Default: `'stylelint'` + + See |ale-integrations-local-executables| + +g:ale_scss_stylelint_options *g:ale_scss_stylelint_options* + *b:ale_scss_stylelint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to stylelint. + +g:ale_scss_stylelint_use_global *g:ale_scss_stylelint_use_global* + *b:ale_scss_stylelint_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-sh.txt b/dot_vim/plugged/ale/doc/ale-sh.txt new file mode 100644 index 0000000..9a1928c --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-sh.txt @@ -0,0 +1,144 @@ +=============================================================================== +ALE Shell Integration *ale-sh-options* + + +=============================================================================== +bashate *ale-sh-bashate* + +g:ale_sh_bashate_executable *g:ale_sh_bashate_executable* + *b:ale_sh_bashate_executable* + Type: |String| + Default: `'bashate'` + + This variable sets executable used for bashate. + + +g:ale_sh_bashate_options *g:ale_sh_bashate_options* + *b:ale_sh_bashate_options* + Type: |String| + Default: `''` + + With this variable we are able to pass extra arguments for bashate. For + example to ignore the indentation rule: + +> + let g:ale_sh_bashate_options = '-i E003' +< + +=============================================================================== +cspell *ale-sh-cspell* + +See |ale-cspell-options| + + +=============================================================================== +sh-language-server *ale-sh-language-server* + +g:ale_sh_language_server_executable *g:ale_sh_language_server_executable* + *b:ale_sh_language_server_executable* + Type: |String| + Default: `'bash-language-server'` + + See |ale-integrations-local-executables| + + +g:ale_sh_language_server_use_global *g:ale_sh_language_server_use_global* + *b:ale_sh_language_server_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +shell *ale-sh-shell* + +g:ale_sh_shell_default_shell *g:ale_sh_shell_default_shell* + *b:ale_sh_shell_default_shell* + Type: |String| + Default: The current shell (`$SHELL`). Falls back to `'bash'` if that cannot be + read or if the current shell is `'fish'`. + + When ALE runs the linter for shells with the `-n` flag, it will attempt to + read the shell from the shebang (`#!`) line from the shell script to + determine the shell program to run. When this detection fails, this variable + will be used instead. + + +=============================================================================== +shellcheck *ale-sh-shellcheck* + +g:ale_sh_shellcheck_executable *g:ale_sh_shellcheck_executable* + *b:ale_sh_shellcheck_executable* + Type: |String| + Default: `'shellcheck'` + + This variable sets executable used for shellcheck. + + +g:ale_sh_shellcheck_options *g:ale_sh_shellcheck_options* + *b:ale_sh_shellcheck_options* + Type: |String| + Default: `''` + + With this variable we are able to pass extra arguments for shellcheck + for shellcheck invocation. + + For example, if we want shellcheck to follow external sources (`see SC1091`) + we can set the variable as such: +> + let g:ale_sh_shellcheck_options = '-x' +< + + +g:ale_sh_shellcheck_change_directory *g:ale_sh_shellcheck_change_directory* + *b:ale_sh_shellcheck_change_directory* + Type: |Number| + Default: `1` + + If set to `1`, ALE will switch to the directory the shell file being + checked with `shellcheck` is in before checking it. This helps `shellcheck` + determine the path to sourced files more easily. This option can be turned + off if you want to control the directory `shellcheck` is executed from + yourself. + + +g:ale_sh_shellcheck_dialect *g:ale_sh_shellcheck_dialect* + *b:ale_sh_shellcheck_dialect* + Type: |String| + Default: `'auto'` + + This variable specifies the shellcheck dialect (`-s` option). The value + `'auto'` causes ALE to detect the dialect automatically, based on the shebang + line (if present) or the value of `b:is_bash`, `b:is_sh`, or `b:is_kornshell` + (set and used by |sh.vim|). + + +g:ale_sh_shellcheck_exclusions *g:ale_sh_shellcheck_exclusions* + *b:ale_sh_shellcheck_exclusions* + Type: |String| + Default: `''` + + Set this variable to exclude test(s) for shellcheck (-e/--exclude option). + To exclude more than one option, separate them with commas. + + For example, to ignore some warnings that aren't applicable to files that + will be sourced by other scripts, use the buffer-local variant: +> + autocmd BufEnter PKGBUILD,.env + \ let b:ale_sh_shellcheck_exclusions = 'SC2034,SC2154,SC2164' +< + +=============================================================================== +shfmt *ale-sh-shfmt* + +g:ale_sh_shfmt_options *g:ale_sh_shfmt_options* + *b:ale_sh_shfmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the shfmt fixer. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-sml.txt b/dot_vim/plugged/ale/doc/ale-sml.txt new file mode 100644 index 0000000..cc8d679 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-sml.txt @@ -0,0 +1,36 @@ +=============================================================================== +ALE SML Integration *ale-sml-options* + +=============================================================================== +smlnj *ale-sml-smlnj* + *ale-sml-smlnj-cm* + +There are two SML/NJ powered checkers: + +- one using Compilation Manager that works on whole projects, but requires you + to save before errors show up +- one using the SML/NJ REPL that works as you change the text, but might fail + if your project can only be built with CM. + +We dynamically select which one to use based whether we find a `*.cm` file at +or above the directory of the file being checked. Only one checker (`smlnj`, +`smlnj-cm`) will be enabled at a time. + +------------------------------------------------------------------------------- + +g:ale_sml_smlnj_cm_file *g:ale_sml_smlnj_cm_file* + *b:ale_sml_smlnj_cm_file* + Type: |String| + Default: `'*.cm'` + + By default, ALE will look for a `*.cm` file in your current directory, + searching upwards. It stops when it finds at least one `*.cm` file (taking + the first file if there are more than one). + + Change this option (in the buffer or global scope) to control how ALE finds + CM files. For example, to always search for a CM file named `sandbox.cm`: +> + let g:ale_sml_smlnj_cm_file = 'sandbox.cm' + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-solidity.txt b/dot_vim/plugged/ale/doc/ale-solidity.txt new file mode 100644 index 0000000..c4d2f02 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-solidity.txt @@ -0,0 +1,41 @@ +=============================================================================== +ALE Solidity Integration *ale-solidity-options* + + +=============================================================================== +solc *ale-solidity-solc* + +g:ale_solidity_solc_executable *g:ale_solidity_solc_executable* + *b:ale_solidity_solc_executable* + Type: |String| + Default: `'solc'` + + Override the invoked solc binary. For truffle/hardhat binaries. + +g:ale_solidity_solc_options *g:ale_solidity_solc_options* + *b:ale_solidity_solc_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to solc. + + +=============================================================================== +solhint *ale-solidity-solhint* + + Solhint should work out-of-the-box. You can further configure it using a + `.solihint.json` file. See https://github.com/protofire/solhint for more + information. + + +=============================================================================== +solium *ale-solidity-solium* + + Use of Solium linter for Solidity source code requires a .soliumrc.json + file in project root. This file can be generated by running `solium --init`. + See the corresponding solium usage for detailed instructions + (https://github.com/duaraghav8/Solium#usage). + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-spec.txt b/dot_vim/plugged/ale/doc/ale-spec.txt new file mode 100644 index 0000000..3da950c --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-spec.txt @@ -0,0 +1,43 @@ +=============================================================================== +ALE Spec Integration *ale-spec-options* + *ale-integration-spec* + +=============================================================================== +Integration Information + + The rpmlint linter is disabled by default, because running rpmlint can + result in the execution of code embedded in the spec file and rpmlint makes + no distinction between checks which are safe to run on untrusted files and + those which are not. + + Currently linters must be enabled globally. The rpmlint linter can be + enabled with: +> + let g:ale_linters = {'spec': ['rpmlint']} +< + +=============================================================================== +rpmlint *ale-spec-rpmlint* + +g:ale_spec_rpmlint_executable *g:ale_spec_rpmlint_executable* + *b:ale_spec_rpmlint_executable* + Type: |String| + Default: `'rpmlint'` + + This variable sets executable used for rpmlint. + + +g:ale_spec_rpmlint_options *g:ale_spec_rpmlint_options* + *b:ale_spec_rpmlint_options* + Type: |String| + Default: `''` + + Set this to pass extra arguments to rpmlint. + + For example, to instruct rpmlint to use a specific configuration file: +> + let g:ale_spec_rpmlint_options = '-f custom.cf' +< + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-sql.txt b/dot_vim/plugged/ale/doc/ale-sql.txt new file mode 100644 index 0000000..225ac7d --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-sql.txt @@ -0,0 +1,89 @@ +=============================================================================== +ALE SQL Integration *ale-sql-options* + + +=============================================================================== +dprint *ale-sql-dprint* + +See |ale-dprint-options| +and https://github.com/dprint/dprint-plugin-sql/releases + + +=============================================================================== +pgformatter *ale-sql-pgformatter* + +g:ale_sql_pgformatter_executable *g:ale_sql_pgformatter_executable* + *b:ale_sql_pgformatter_executable* + Type: |String| + Default: `'pg_format'` + + This variable sets executable used for pgformatter. + +g:ale_sql_pgformatter_options *g:ale_sql_pgformatter_options* + *b:ale_sql_pgformatter_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the pgformatter fixer. + + +=============================================================================== +sqlfluff *ale-sql-sqlfluff* + +g:ale_sql_sqlfluff_executable *g:ale_sql_sqlfluff_executable* + *b:ale_sql_sqlfluff_executable* + Type: |String| + Default: `'sqlfluff'` + + This variable sets executable used for sqlfluff. + +g:ale_sql_sqlfluff_options *g:ale_sql_sqlfluff_options* + *b:ale_sql_sqlfluff_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the sqlfluff linter. + + +=============================================================================== + + +=============================================================================== +sqlfmt *ale-sql-sqlfmt* + +g:ale_sql_sqlfmt_executable *g:ale_sql_sqlfmt_executable* + *b:ale_sql_sqlfmt_executable* + Type: |String| + Default: `'sqlfmt'` + + This variable sets executable used for sqlfmt. + +g:ale_sql_sqlfmt_options *g:ale_sql_sqlfmt_options* + *b:ale_sql_sqlfmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the sqlfmt fixer. + At this time only the -u flag is available to format with upper-case. + + +=============================================================================== +sqlformat *ale-sql-sqlformat* + +g:ale_sql_sqlformat_executable *g:ale_sql_sqlformat_executable* + *b:ale_sql_sqlformat_executable* + Type: |String| + Default: `'sqlformat'` + + This variable sets executable used for sqlformat. + +g:ale_sql_sqlformat_options *g:ale_sql_sqlformat_options* + *b:ale_sql_sqlformat_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the sqlformat fixer. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-stylus.txt b/dot_vim/plugged/ale/doc/ale-stylus.txt new file mode 100644 index 0000000..3e6ba90 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-stylus.txt @@ -0,0 +1,33 @@ +=============================================================================== +ALE Stylus Integration *ale-stylus-options* + + +=============================================================================== +stylelint *ale-stylus-stylelint* + +g:ale_stylus_stylelint_executable *g:ale_stylus_stylelint_executable* + *b:ale_stylus_stylelint_executable* + Type: |String| + Default: `'stylelint'` + + See |ale-integrations-local-executables| + + +g:ale_stylus_stylelint_options *g:ale_stylus_stylelint_options* + *b:ale_stylus_stylelint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to stylelint. + + +g:ale_stylus_stylelint_use_global *g:ale_stylus_stylelint_use_global* + *b:ale_stylus_stylelint_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-sugarss.txt b/dot_vim/plugged/ale/doc/ale-sugarss.txt new file mode 100644 index 0000000..8e991e5 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-sugarss.txt @@ -0,0 +1,31 @@ +=============================================================================== +ALE SugarSS Integration *ale-sugarss-options* + + +=============================================================================== +stylelint *ale-sugarss-stylelint* + +g:ale_sugarss_stylelint_executable *g:ale_sugarss_stylelint_executable* + *b:ale_sugarss_stylelint_executable* + Type: |String| + Default: `'stylelint'` + + See |ale-integrations-local-executables| + +g:ale_sugarss_stylelint_options *g:ale_sugarss_stylelint_options* + *b:ale_sugarss_stylelint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to stylelint. + +g:ale_sugarss_stylelint_use_global *g:ale_sugarss_stylelint_use_global* + *b:ale_sugarss_stylelint_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-supported-languages-and-tools.txt b/dot_vim/plugged/ale/doc/ale-supported-languages-and-tools.txt new file mode 100644 index 0000000..4edc10c --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-supported-languages-and-tools.txt @@ -0,0 +1,701 @@ +*ale-supported-languages-and-tools.txt* For Vim version 8.0. +*ale-supported-list* + +ALE Supported Languages and Tools + +=============================================================================== + +The following languages and tools are supported by ALE. + +Notes: + +`^` No linters for text or Vim help filetypes are enabled by default. +`!!` These linters check only files on disk. See |ale-lint-file-linters| + +* Ada + * `ada_language_server` + * `cspell` + * `gcc` + * `gnatpp` +* Ansible + * `ansible-language-server` + * `ansible-lint`!! +* API Blueprint + * `drafter` +* APKBUILD + * `apkbuild-lint` + * `secfixes-check` +* AsciiDoc + * `alex` + * `cspell` + * `languagetool`!! + * `proselint` + * `redpen` + * `textlint` + * `vale` + * `write-good` +* ASM + * `gcc` +* AVRA + * `avra` +* Awk + * `gawk` +* Bash + * `bashate` + * `cspell` + * `language-server` + * `shell` (-n flag) + * `shellcheck` + * `shfmt` +* Bats + * `shellcheck` +* Bazel + * `buildifier` +* BibTeX + * `bibclean` +* Bicep + * `bicep` +* BitBake + * `oelint-adv` +* Bourne Shell + * `shell` (-n flag) + * `shellcheck` + * `shfmt` +* C + * `astyle` + * `ccls` + * `clang` (`cc`) + * `clang-format` + * `clangd` + * `clangtidy`!! + * `cppcheck` + * `cpplint`!! + * `cquery` + * `cspell` + * `flawfinder` + * `gcc` (`cc`) + * `uncrustify` +* C# + * `clang-format` + * `csc`!! + * `cspell` + * `dotnet-format` + * `mcs` + * `mcsc`!! + * `uncrustify` +* C++ (filetype cpp) + * `astyle` + * `ccls` + * `clang` (`cc`) + * `clang-format` + * `clangcheck`!! + * `clangd` + * `clangtidy`!! + * `clazy`!! + * `cppcheck` + * `cpplint`!! + * `cquery` + * `cspell` + * `flawfinder` + * `gcc` (`cc`) + * `uncrustify` +* Cairo + * `starknet` +* Chef + * `cookstyle` + * `foodcritic`!! +* Clojure + * `clj-kondo` + * `joker` +* CloudFormation + * `cfn-python-lint` +* CMake + * `cmake-format` + * `cmake-lint` + * `cmakelint` +* CoffeeScript + * `coffee` + * `coffeelint` +* Crystal + * `ameba`!! + * `crystal`!! +* CSS + * `VSCode CSS language server` + * `cspell` + * `css-beautify` + * `csslint` + * `fecs` + * `prettier` + * `stylelint` +* Cucumber + * `cucumber` +* CUDA + * `clang-format` + * `clangd` + * `nvcc`!! +* Cypher + * `cypher-lint` +* Cython (pyrex filetype) + * `cython` +* D + * `dfmt` + * `dls` + * `dmd` + * `uncrustify` +* Dafny + * `dafny`!! +* Dart + * `analysis_server` + * `dart-analyze`!! + * `dart-format`!! + * `dartfmt`!! + * `language_server` +* desktop + * `desktop-file-validate` +* Dhall + * `dhall-format` + * `dhall-freeze` + * `dhall-lint` +* Dockerfile + * `dockerfile_lint` + * `dprint` + * `hadolint` +* Elixir + * `credo` + * `cspell` + * `dialyxir` + * `dogma`!! + * `elixir-ls` + * `mix`!! +* Elm + * `elm-format` + * `elm-ls` + * `elm-make` +* Erb + * `erb` + * `erblint` + * `erubi` + * `erubis` + * `ruumba` +* Erlang + * `SyntaxErl` + * `dialyzer`!! + * `elvis`!! + * `erlang_ls` + * `erlc` + * `erlfmt` +* Fish + * `fish` (-n flag) + * `fish_indent` +* Fortran + * `gcc` + * `language_server` +* Fountain + * `proselint` +* FusionScript + * `fusion-lint` +* Git Commit Messages + * `gitlint` +* GLSL + * `glslang` + * `glslls` +* Go + * `bingo` + * `cspell` + * `go build`!! + * `go mod`!! + * `go vet`!! + * `gofmt` + * `gofumpt` + * `goimports` + * `golangci-lint`!! + * `golangserver` + * `golines` + * `golint` + * `gometalinter`!! + * `gopls` + * `gosimple`!! + * `gotype`!! + * `revive`!! + * `staticcheck`!! +* GraphQL + * `eslint` + * `gqlint` + * `prettier` +* Hack + * `hack` + * `hackfmt` + * `hhast` +* Haml + * `haml-lint` +* Handlebars + * `ember-template-lint` +* Haskell + * `brittany` + * `cabal-ghc` + * `cspell` + * `floskell` + * `ghc` + * `ghc-mod` + * `hdevtools` + * `hfmt` + * `hie` + * `hindent` + * `hlint` + * `hls` + * `ormolu` + * `stack-build`!! + * `stack-ghc` + * `stylish-haskell` +* HCL + * `packer-fmt` + * `terraform-fmt` +* HTML + * `VSCode HTML language server` + * `alex` + * `angular` + * `cspell` + * `fecs` + * `html-beautify` + * `htmlhint` + * `prettier` + * `proselint` + * `tidy` + * `write-good` +* Idris + * `idris` +* Ink + * `ink-language-server` +* Inko + * `inko` !! +* ISPC + * `ispc`!! +* Java + * `PMD` + * `checkstyle`!! + * `clang-format` + * `cspell` + * `eclipselsp` + * `google-java-format` + * `javac` + * `javalsp` + * `uncrustify` +* JavaScript + * `clang-format` + * `cspell` + * `deno` + * `dprint` + * `eslint` + * `fecs` + * `flow` + * `jscs` + * `jshint` + * `prettier` + * `prettier-eslint` + * `prettier-standard` + * `standard` + * `tsserver` + * `xo` +* JSON + * `VSCode JSON language server` + * `clang-format` + * `cspell` + * `dprint` + * `eslint` + * `fixjson` + * `jq` + * `jsonlint` + * `prettier` + * `spectral` +* JSON5 + * `eslint` +* JSONC + * `eslint` +* Jsonnet + * `jsonnet-lint` + * `jsonnetfmt` +* Julia + * `languageserver` +* Kotlin + * `kotlinc`!! + * `ktlint` + * `languageserver` +* LaTeX (tex) + * `alex` + * `chktex` + * `cspell` + * `lacheck` + * `proselint` + * `redpen` + * `texlab` + * `textlint` + * `vale` + * `write-good` +* Less + * `lessc` + * `prettier` + * `stylelint` +* LLVM + * `llc` +* Lua + * `cspell` + * `lua-format` + * `luac` + * `luacheck` + * `luafmt` + * `selene` + * `stylua` +* Mail + * `alex` + * `languagetool`!! + * `proselint` + * `vale` +* Make + * `checkmake` +* Markdown + * `alex` + * `cspell` + * `languagetool`!! + * `markdownlint`!! + * `mdl` + * `pandoc` + * `prettier` + * `proselint` + * `redpen` + * `remark-lint` + * `textlint` + * `vale` + * `write-good` +* MATLAB + * `mlint` +* Mercury + * `mmc`!! +* NASM + * `nasm`!! +* Nim + * `nim check`!! + * `nimlsp` + * `nimpretty` +* nix + * `nix-instantiate` + * `nixfmt` + * `nixpkgs-fmt` + * `rnix-lsp` + * `statix` +* nroff + * `alex` + * `proselint` + * `write-good` +* Objective-C + * `ccls` + * `clang` + * `clang-format` + * `clangd` + * `uncrustify` +* Objective-C++ + * `clang` + * `clangd` + * `uncrustify` +* OCaml + * `dune` + * `merlin` (see |ale-ocaml-merlin|) + * `ocamlformat` + * `ocamllsp` + * `ocp-indent` + * `ols` +* OpenApi + * `ibm_validator` + * `prettier` + * `yamllint` +* OpenSCAD + * `SCA2D` +* Packer + * `packer-fmt-fixer` +* Pascal + * `ptop` +* Pawn + * `uncrustify` +* Perl + * `perl -c` + * `perl-critic` + * `perltidy` +* Perl6 + * `perl6 -c` +* PHP + * `cspell` + * `intelephense` + * `langserver` + * `phan` + * `php -l` + * `php-cs-fixer` + * `phpactor` + * `phpcbf` + * `phpcs` + * `phpmd` + * `phpstan` + * `pint` + * `psalm`!! + * `tlint` +* PO + * `alex` + * `msgfmt` + * `proselint` + * `write-good` +* Pod + * `alex` + * `proselint` + * `write-good` +* Pony + * `ponyc` +* PowerShell + * `cspell` + * `powershell` + * `psscriptanalyzer` +* Prolog + * `swipl` +* proto + * `buf-format`!! + * `buf-lint`!! + * `clang-format` + * `protoc-gen-lint`!! + * `protolint`!! +* Pug + * `pug-lint` +* Puppet + * `languageserver` + * `puppet` + * `puppet-lint` +* PureScript + * `purescript-language-server` + * `purs-tidy` + * `purty` +* Python + * `autoflake`!! + * `autoimport` + * `autopep8` + * `bandit` + * `black` + * `cspell` + * `flake8` + * `flakehell` + * `isort` + * `mypy` + * `prospector`!! + * `pycodestyle` + * `pydocstyle` + * `pyflakes` + * `pyflyby` + * `pylama`!! + * `pylint`!! + * `pylsp` + * `pyre` + * `pyright` + * `refurb` + * `reorder-python-imports` + * ruff + * `unimport` + * `vulture`!! + * `yapf` +* QML + * `qmlfmt` + * `qmllint` +* R + * `languageserver` + * `lintr` + * `styler` +* Racket + * `racket-langserver` + * `raco` + * `raco_fmt` +* Re:VIEW + * `redpen` +* ReasonML + * `merlin` + * `ols` + * `reason-language-server` + * `refmt` +* Rego + * `cspell` + * `opacheck` + * `opafmt` +* reStructuredText + * `alex` + * `cspell` + * `proselint` + * `redpen` + * `rstcheck` + * `textlint` + * `vale` + * `write-good` +* Robot + * `rflint` +* RPM spec + * `rpmlint` +* Ruby + * `brakeman`!! + * `cspell` + * `debride` + * `prettier` + * `rails_best_practices`!! + * `reek` + * `rubocop` + * `ruby` + * `rufo` + * `solargraph` + * `sorbet` + * `standardrb` + * `syntax_tree` +* Rust + * `cargo`!! + * `cspell` + * `rls` + * `rust-analyzer` + * `rustc` (see |ale-integration-rust|) + * `rustfmt` +* Salt + * `salt-lint` +* Sass + * `sass-lint` + * `stylelint` +* Scala + * `cspell` + * `fsc` + * `metals` + * `sbtserver` + * `scalac` + * `scalafmt` + * `scalastyle` +* SCSS + * `prettier` + * `sass-lint` + * `scss-lint` + * `stylelint` +* Slim + * `slim-lint` +* SML + * `smlnj` +* Solidity + * `solc` + * `solhint` + * `solium` +* SQL + * `dprint` + * `pgformatter` + * `sql-lint` + * `sqlfluff` + * `sqlfmt` + * `sqlformat` + * `sqlint` +* Stylus + * `stylelint` +* SugarSS + * `stylelint` +* Svelte + * `prettier` + * `svelteserver` +* Swift + * Apple `swift-format` + * `cspell` + * `sourcekit-lsp` + * `swiftformat` + * `swiftlint` +* systemd + * `systemd-analyze`!! +* Tcl + * `nagelfar`!! +* Terraform + * `checkov` + * `terraform` + * `terraform-fmt-fixer` + * `terraform-ls` + * `terraform-lsp` + * `tflint` + * `tfsec` +* Texinfo + * `alex` + * `cspell` + * `proselint` + * `write-good` +* Text^ + * `alex` + * `cspell` + * `languagetool`!! + * `proselint` + * `redpen` + * `textlint` + * `vale` + * `write-good` +* Thrift + * `thrift` + * `thriftcheck` +* TOML + * `dprint` +* TypeScript + * `cspell` + * `deno` + * `dprint` + * `eslint` + * `fecs` + * `prettier` + * `standard` + * `tslint` + * `tsserver` + * `typecheck` +* V + * `v`!! + * `vfmt` +* VALA + * `uncrustify` + * `vala_lint`!! +* Verilog + * `hdl-checker` + * `iverilog` + * `verilator` + * `vlog` + * `xvlog` + * `yosys`!! +* VHDL + * `ghdl` + * `vcom` + * `xvhdl` +* Vim + * `vimls` + * `vint` +* Vim help^ + * `alex` + * `proselint` + * `write-good` +* Vue + * `cspell` + * `prettier` + * `vls` + * `volar` +* WGSL + * `naga` +* XHTML + * `alex` + * `cspell` + * `proselint` + * `write-good` +* XML + * `xmllint` +* YAML + * `actionlint` + * `circleci`!! + * `gitlablint` + * `prettier` + * `spectral` + * `swaglint` + * `yaml-language-server` + * `yamlfix` + * `yamllint` +* YANG + * `yang-lsp` +* Zeek + * `zeek`!! +* Zig + * `zigfmt` + * `zls` + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-svelte.txt b/dot_vim/plugged/ale/doc/ale-svelte.txt new file mode 100644 index 0000000..92f109f --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-svelte.txt @@ -0,0 +1,31 @@ +=============================================================================== +ALE Svelte Integration *ale-svelte-options* + + +=============================================================================== +prettier *ale-svelte-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +svelteserver *ale-svelte-svelteserver* + +g:ale_svelte_svelteserver_executable *g:ale_svelte_svelteserver_executable* + *b:ale_svelte_svelteserver_executable* + Type: |String| + Default: `'svelteserver'` + + See |ale-integrations-local-executables| + + +g:ale_svelte_svelteserver_use_global *g:ale_svelte_svelteserver_use_global* + *b:ale_svelte_svelteserver_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-swift.txt b/dot_vim/plugged/ale/doc/ale-swift.txt new file mode 100644 index 0000000..a443eab --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-swift.txt @@ -0,0 +1,67 @@ +=============================================================================== +ALE Swift Integration *ale-swift-options* + + +=============================================================================== +apple-swift-format *ale-swift-apple-swift-format* + +There are 3 options to enable linting and fixing with Apple's swift-format: + +1. Install the local executable in your path, as described here: + https://github.com/apple/swift-format +2. Install the executable via your OS package manager, for instance via + Homebrew with `brew install swift-format` +3. Your Swift project has a dependency on the swift-format package, so it can + be run with `swift run swift-format lint ...` In this case, you need to set + a variable, see |g:ale_swift_appleswiftformat_use_swiftpm|. + +Additionally, ALE tries to locate and use the nearest existing `.swift-format` +configuration file. + + +g:ale_swift_appleswiftformat_executable + *g:ale_swift_appleswiftformat_executable* + *b:ale_swift_appleswiftformat_executable* + Type: |String| + Default: `'swift-format'` + + This variable can be modified to change the executable path for + `swift-format`. + + +g:ale_swift_appleswiftformat_use_swiftpm + *g:ale_swift_appleswiftformat_use_swiftpm* + *b:ale_swift_appleswiftformat_use_swiftpm* + Type: |Number| + Default: `0` + + When set to `1`, this option will cause ALE to use + `swift run swift-format lint ...` instead of the global executable. Use this + option if your Swift project has a dependency on the swift-format package. + + See |ale-integrations-local-executables| + + +=============================================================================== +cspell *ale-swift-cspell* + +See |ale-cspell-options| + + +=============================================================================== +sourcekitlsp *ale-swift-sourcekitlsp* + +To enable the SourceKit-LSP you need to install and build the executable as +described here: https://github.com/apple/sourcekit-lsp#building-sourcekit-lsp + + +g:ale_sourcekit_lsp_executable *g:ale_sourcekit_lsp_executable* + *b:ale_sourcekit_lsp_executable* + Type: |String| + Default: `'sourcekit-lsp'` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-systemd.txt b/dot_vim/plugged/ale/doc/ale-systemd.txt new file mode 100644 index 0000000..13c7037 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-systemd.txt @@ -0,0 +1,14 @@ +=============================================================================== +ALE systemd Integration *ale-systemd-options* + + +=============================================================================== +systemd-analyze *ale-systemd-analyze* + +ALE supports checking user systemd units with `systemd-analyze --user verify` +Checks will only work with user unit files in their proper location. There +aren't any options, and checks can only run after saving the file. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-tcl.txt b/dot_vim/plugged/ale/doc/ale-tcl.txt new file mode 100644 index 0000000..497c9fd --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-tcl.txt @@ -0,0 +1,25 @@ +=============================================================================== +ALE Tcl Integration *ale-tcl-options* + + +=============================================================================== +nagelfar *ale-tcl-nagelfar* + +g:ale_tcl_nagelfar_executable *g:ale_tcl_nagelfar_executable* + *b:ale_tcl_nagelfar_executable* + Type: |String| + Default: `'nagelfar.tcl'` + + This variable can be changed to change the path to nagelfar. + + +g:ale_tcl_nagelfar_options *g:ale_tcl_nagelfar_options* + *b:ale_tcl_nagelfar_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to nagelfar. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-terraform.txt b/dot_vim/plugged/ale/doc/ale-terraform.txt new file mode 100644 index 0000000..91a7dd1 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-terraform.txt @@ -0,0 +1,138 @@ +=============================================================================== +ALE Terraform Integration *ale-terraform-options* + + +=============================================================================== +checkov *ale-terraform-checkov* + +g:ale_terraform_checkov_executable *g:ale_terraform_checkov_executable* + *b:ale_terraform_checkov_executable* + + Type: |String| + Default: `'checkov'` + + This variable can be changed to use a different executable for checkov. + + +g:ale_terraform_checkov_options *g:ale_terraform_checkov_options* + *b:ale_terraform_checkov_options* + Type: |String| + Default: `''` + + This variable can be changed to set additional options for checkov. + +=============================================================================== +terraform-fmt-fixer *ale-terraform-fmt-fixer* + +g:ale_terraform_fmt_executable *g:ale_terraform_fmt_executable* + *b:ale_terraform_fmt_executable* + + Type: |String| + Default: `'terraform'` + + This variable can be changed to use a different executable for terraform. + + +g:ale_terraform_fmt_options *g:ale_terraform_fmt_options* + *b:ale_terraform_fmt_options* + Type: |String| + Default: `''` + + +=============================================================================== +terraform *ale-terraform-terraform* + +g:ale_terraform_terraform_executable *g:ale_terraform_terraform_executable* + *b:ale_terraform_terraform_executable* + + Type: |String| + Default: `'terraform'` + + This variable can be changed to use a different executable for terraform. + + +=============================================================================== +terraform-ls *ale-terraform-terraform-ls* + +Official terraform language server. More stable than *terraform-lsp* but +currently has less features. + +g:ale_terraform_ls_executable *g:ale_terraform_ls_executable* + *b:ale_terraform_ls_executable* + Type: |String| + Default: `'terraform-ls'` + + This variable can be changed to use a different executable for terraform-ls. + + +g:ale_terraform_ls_options *g:ale_terraform_ls_options* + *b:ale_terraform_ls_options* + Type: |String| + Default: `''` + + This variable can be changed to pass custom CLI flags to terraform-ls. + + +=============================================================================== +terraform-lsp *ale-terraform-terraform-lsp* + +g:ale_terraform_langserver_executable *g:ale_terraform_langserver_executable* + *b:ale_terraform_langserver_executable* + Type: |String| + Default: `'terraform-lsp'` + + This variable can be changed to use a different executable for terraform-lsp. + + +g:ale_terraform_langserver_options *g:ale_terraform_langserver_options* + *b:ale_terraform_langserver_options* + Type: |String| + Default: `''` + + This variable can be changed to pass custom CLI flags to terraform-lsp. + + +=============================================================================== +tflint *ale-terraform-tflint* + +g:ale_terraform_tflint_executable *g:ale_terraform_tflint_executable* + *b:ale_terraform_tflint_executable* + + Type: |String| + Default: `'tflint'` + + This variable can be changed to use a different executable for tflint. + + +g:ale_terraform_tflint_options *g:ale_terraform_tflint_options* + *b:ale_terraform_tflint_options* + Type: |String| + Default: `'-f json'` + + This variable can be changed to pass different options to tflint. Ale does + expect json output from tflint, so if you change this, you'll probably want + to include '-f json' in your new value. + + +=============================================================================== +tfsec *ale-terraform-tfsec* + +g:ale_terraform_tfsec_executable *g:ale_terraform_tfsec_executable* + *b:ale_terraform_tfsec_executable* + + Type: |String| + Default: `'tfsec'` + + This variable can be changed to use a different executable for tfsec. + +g:ale_terraform_tfsec_options *g:ale_terraform_tfsec_options* + *b:ale_terraform_tfsec_options* + + Type: |String| + Default: `''` + + This variable can be changed to pass custom CLI flags to tfsec. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: + diff --git a/dot_vim/plugged/ale/doc/ale-tex.txt b/dot_vim/plugged/ale/doc/ale-tex.txt new file mode 100644 index 0000000..fa0d827 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-tex.txt @@ -0,0 +1,95 @@ +=============================================================================== +ALE TeX Integration *ale-tex-options* + + +=============================================================================== +chktex *ale-tex-chktex* + +g:ale_tex_chktex_executable *g:ale_tex_chktex_executable* + *b:ale_tex_chktex_executable* + Type: |String| + Default: `'chktex'` + + This variable can be changed to change the path to chktex. + + +g:ale_tex_chktex_options *g:ale_tex_chktex_options* + *b:ale_tex_chktex_options* + Type: |String| + Default: `'-I'` + + This variable can be changed to modify flags given to chktex. + + +=============================================================================== +cspell *ale-tex-cspell* + +See |ale-cspell-options| + + +=============================================================================== +lacheck *ale-tex-lacheck* + +g:ale_lacheck_executable *g:ale_lacheck_executable* + *b:ale_lacheck_executable* + Type: |String| + Default: `'lacheck'` + + This variable can be changed to change the path to lacheck. + + +=============================================================================== +latexindent *ale-tex-latexindent* + +g:ale_tex_latexindent_executable *g:ale_tex_latexindent_executable* + *b:ale_tex_latexindent_executable* + Type: |String| + Default: `'latexindent'` + + This variable can be changed to change the path to latexindent. + + +g:ale_tex_latexindent_options *g:ale_tex_latexindent_options* + *b:ale_tex_latexindent_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to latexindent. + + +=============================================================================== +texlab *ale-tex-texlab* + +g:ale_tex_texlab_executable *g:ale_tex_texlab_executable* + *b:ale_tex_texlab_executable* + Type: |String| + Default: `'texlab'` + + This variable can be changed to change the path to texlab. + + +g:ale_tex_texlab_options *g:ale_tex_texlab_options* + *b:ale_tex_texlab_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to texlab command. + +g:ale_tex_texlab_config *g:ale_tex_texlab_config* + *b:ale_tex_texlab_config* + Type: |Dictionary| + Default: `{}` + + Dictionary containing LSP configuration settings used to initialize texlab + language server. Refer to texlab documentation for possible settings: + + https://github.com/latex-lsp/texlab/blob/master/docs/options.md + + For example to set build onSave initialization setting: + +> + let g:ale_tex_texlab_config = {"build":{"onSave":v:true}} +< + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-texinfo.txt b/dot_vim/plugged/ale/doc/ale-texinfo.txt new file mode 100644 index 0000000..53d42b6 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-texinfo.txt @@ -0,0 +1,18 @@ +=============================================================================== +ALE Texinfo Integration *ale-texinfo-options* + + +=============================================================================== +cspell *ale-texinfo-cspell* + +See |ale-cspell-options| + + +=============================================================================== +write-good *ale-texinfo-write-good* + +See |ale-write-good-options| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-text.txt b/dot_vim/plugged/ale/doc/ale-text.txt new file mode 100644 index 0000000..4e4d0b2 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-text.txt @@ -0,0 +1,48 @@ +=============================================================================== +ALE Text Integration *ale-text-options* + + +============================================================================== +cspell *ale-text-cspell* + +See |ale-cspell-options| + + +=============================================================================== +textlint *ale-text-textlint* + +The options for the textlint linter are global because it does not make +sense to have them specified on a per-language basis. + +g:ale_textlint_executable *g:ale_textlint_executable* + *b:ale_textlint_executable* + Type: |String| + Default: `'textlint'` + + See |ale-integrations-local-executables| + + +g:ale_textlint_options *g:ale_textlint_options* + *b:ale_textlint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to textlint. + + +g:ale_textlint_use_global *g:ale_textlint_use_global* + *b:ale_textlint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +write-good *ale-text-write-good* + +See |ale-write-good-options| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-thrift.txt b/dot_vim/plugged/ale/doc/ale-thrift.txt new file mode 100644 index 0000000..810127b --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-thrift.txt @@ -0,0 +1,65 @@ +=============================================================================== +ALE Thrift Integration *ale-thrift-options* + + +=============================================================================== +thrift *ale-thrift-thrift* + +The `thrift` linter works by compiling the buffer's contents and reporting any +errors reported by the parser and the configured code generator(s). + +g:ale_thrift_thrift_executable *g:ale_thrift_thrift_executable* + *b:ale_thrift_thrift_executable* + Type: |String| + Default: `'thrift'` + + See |ale-integrations-local-executables| + + +g:ale_thrift_thrift_generators *g:ale_thrift_thrift_generators* + *b:ale_thrift_thrift_generators* + Type: |List| of |String|s + Default: `['cpp']` + + This list must contain one or more named code generators. Generator options + can be included as part of each string, e.g. `['py:dynamic']`. + + +g:ale_thrift_thrift_includes *g:ale_thrift_thrift_includes* + *b:ale_thrift_thrift_includes* + Type: |List| of |String|s + Default: `['.']` + + This list contains paths that will be searched for thrift `include` + directives. + + +g:ale_thrift_thrift_options *g:ale_thrift_thrift_options* + *b:ale_thrift_thrift_options* + Type: |String| + Default: `'-strict'` + + This variable can be changed to customize the additional command-line + arguments that are passed to the thrift compiler. + +=============================================================================== +thriftcheck *ale-thrift-thriftcheck* + +g:ale_thrift_thriftcheck_executable *g:ale_thrift_thriftcheck_executable* + *b:ale_thrift_thriftcheck_executable* + Type: |String| + Default: `'thriftcheck'` + + See |ale-integrations-local-executables| + + +g:ale_thrift_thriftcheck_options *g:ale_thrift_thriftcheck_options* + *b:ale_thrift_thriftcheck_options* + Type: |String| + Default: `''` + + This variable can be changed to customize the additional command-line + arguments that are passed to thriftcheck. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-toml.txt b/dot_vim/plugged/ale/doc/ale-toml.txt new file mode 100644 index 0000000..222a91f --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-toml.txt @@ -0,0 +1,12 @@ +=============================================================================== +ALE TOML Integration *ale-toml-options* + + +=============================================================================== +dprint *ale-toml-dprint* + +See |ale-dprint-options| and https://dprint.dev/plugins/toml + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-typescript.txt b/dot_vim/plugged/ale/doc/ale-typescript.txt new file mode 100644 index 0000000..4a99379 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-typescript.txt @@ -0,0 +1,223 @@ +=============================================================================== +ALE TypeScript Integration *ale-typescript-options* + + +=============================================================================== +cspell *ale-typescript-cspell* + +See |ale-cspell-options| + + +=============================================================================== +deno *ale-typescript-deno* + +Starting from version 1.6.0, Deno comes with its own language server. Earlier +versions are not supported. + +g:ale_deno_executable *g:ale_deno_executable* + *b:ale_deno_executable* + Type: |String| + Default: `'deno'` + + +g:ale_deno_lsp_project_root *g:ale_deno_lsp_project_root* + *b:ale_deno_lsp_project_root* + Type: |String| + Default: `''` + + If this variable is left unset, ALE will try to find the project root by + executing the following steps in the given order: + + 1. Find an ancestor directory containing a tsconfig.json. + 2. Find an ancestor directory containing a .git folder. + 3. Use the directory of the current buffer (if the buffer was opened from + a file). + + +g:ale_deno_unstable *g:ale_deno_unstable* + *b:ale_deno_unstable* + Type: |Number| + Default: `0` + + Enable or disable unstable Deno features and APIs. + + +g:ale_deno_importMap *g:ale_deno_importMap* + *b:ale_deno_importMap* + Type: |String| + Default: `'import_map.json'` + + Specify the import map filename to load url maps in a deno project. + + +=============================================================================== +dprint *ale-typescript-dprint* + +See |ale-dprint-options| and https://dprint.dev/plugins/typescript + + +=============================================================================== +eslint *ale-typescript-eslint* + +Because of how TypeScript compiles code to JavaScript and how interrelated +the two languages are, the `eslint` linter for TypeScript uses the JavaScript +options for `eslint` too. See: |ale-javascript-eslint|. + + +=============================================================================== +prettier *ale-typescript-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +standard *ale-typescript-standard* + +g:ale_typescript_standard_executable *g:ale_typescript_standard_executable* + *b:ale_typescript_standard_executable* + Type: |String| + Default: `'standard'` + + See |ale-integrations-local-executables| + + +g:ale_typescript_standard_options *g:ale_typescript_standard_options* + *b:ale_typescript_standard_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to standard. + + +g:ale_typescript_standard_use_global *g:ale_typescript_standard_use_global* + *b:ale_typescript_standard_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +tslint *ale-typescript-tslint* + +This linter isn't recommended, because TSLint can't be used for checking for +problems while you type. You should probably use the tsserver plugin instead. +tsserver plugins are described here: +https://github.com/Microsoft/TypeScript/wiki/Writing-a-Language-Service-Plugin + +Follow the instructions on the plugin website for installing it: +https://github.com/Microsoft/typescript-tslint-plugin + +Then disable TSLint in vimrc or any other Vim configuration file. > + let g:ale_linters_ignore = {'typescript': ['tslint']} +< + +g:ale_typescript_tslint_executable *g:ale_typescript_tslint_executable* + *b:ale_typescript_tslint_executable* + Type: |String| + Default: `'tslint'` + + See |ale-integrations-local-executables| + + +g:ale_typescript_tslint_config_path *g:ale_typescript_tslint_config_path* + *b:ale_typescript_tslint_config_path* + Type: |String| + Default: `''` + + ALE will first discover the tslint.json path in an ancestor directory. If no + such path exists, this variable will be used instead. + + +g:ale_typescript_tslint_ignore_empty_files + *g:ale_typescript_tslint_ignore_empty_files* + *b:ale_typescript_tslint_ignore_empty_files* + Type: |Number| + Default: `0` + + When set to `1`, ALE will not report any problems for empty files with + TSLint. ALE will still execute TSLint for the files, but ignore any problems + reported. This stops ALE from complaining about newly created files, + and files where lines have been added and then removed. + + +g:ale_typescript_tslint_rules_dir *g:ale_typescript_tslint_rules_dir* + *b:ale_typescript_tslint_rules_dir* + Type: |String| + Default: `''` + + If this variable is set, ALE will use it as the rules directory for tslint. + + +g:ale_typescript_tslint_use_global *g:ale_typescript_tslint_use_global* + *b:ale_typescript_tslint_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +tsserver *ale-typescript-tsserver* + +g:ale_typescript_tsserver_executable *g:ale_typescript_tsserver_executable* + *b:ale_typescript_tsserver_executable* + Type: |String| + Default: `'tsserver'` + + ALE will first discover the tsserver path in an ancestor node_modules + directory. If no such path exists, this variable will be used instead. + + If you wish to use only a globally installed version of tsserver, set + |g:ale_typescript_tsserver_use_global| to `1`. + + +g:ale_typescript_tsserver_config_path *g:ale_typescript_tsserver_config_path* + *b:ale_typescript_tsserver_config_path* + Type: |String| + Default: `''` + + ALE will first discover the tsserver.json path in an ancestor directory. If + no such path exists, this variable will be used instead. + + +g:ale_typescript_tsserver_use_global *g:ale_typescript_tsserver_use_global* + *b:ale_typescript_tsserver_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + This variable controls whether or not ALE will search for a local path for + tsserver first. If this variable is set to `1`, then ALE will always use the + global version of tsserver, in preference to locally installed versions of + tsserver in node_modules. + + +=============================================================================== +xo *ale-typescript-xo* + +g:ale_typescript_xo_executable *g:ale_typescript_xo_executable* + *b:ale_typescript_xo_executable* + Type: |String| + Default: `'xo'` + + See |ale-integrations-local-executables| + + +g:ale_typescript_xo_options *g:ale_typescript_xo_options* + *b:ale_typescript_xo_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to xo. + + +g:ale_typescript_xo_use_global *g:ale_typescript_xo_use_global* + *b:ale_typescript_xo_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-v.txt b/dot_vim/plugged/ale/doc/ale-v.txt new file mode 100644 index 0000000..8c64144 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-v.txt @@ -0,0 +1,45 @@ +=============================================================================== +ALE V Integration *ale-v-options* + + +=============================================================================== +Integration Information + +`v` is V's build tool. `vfmt` (called as `v fmt` from the same +executable that does the builds) is the autoformatter/fixer. + +g:ale_v_v_executable *g:ale_v_v_executable* + *b:ale_v_v_executable* + + Type: |String| + Default: `'v'` + + The executable that will be run for the `v` linter and the `vfmt` fixer. + + +=============================================================================== +v *ale-v-v* + +g:ale_v_v_options *g:ale_v_v_options* + *b:ale_v_v_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the v linter. + They are injected directly after "v .". + + +=============================================================================== +vfmt *ale-v-vfmt* + +g:ale_v_vfmt_options *g:ale_v_vfmt_options* + *b:ale_v_vfmt_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the vfmt fixer. + They are injected directly after "v fmt". + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-vala.txt b/dot_vim/plugged/ale/doc/ale-vala.txt new file mode 100644 index 0000000..d48f68b --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-vala.txt @@ -0,0 +1,33 @@ +=============================================================================== +ALE VALA Integration *ale-vala-options* + + +=============================================================================== +uncrustify *ale-vala-uncrustify* + +See |ale-c-uncrustify| for information about the available options. + + +=============================================================================== +Vala-Lint *ale-vala-vala-lint* + +g:vala_vala_lint_executable *g:vala_vala_lint_executable* + *b:vala_vala_lint_executable* + Type: |String| + Default: `'io.elementary.vala-lint'` + + This variable can be set to specify a Vala-Lint executable file. + + +g:vala_vala_lint_config_filename *g:vala_vala_lint_config_filename* + *b:vala_vala_lint_config_filename* + Type: |String| + Default: `'vala-lint.conf'` + + This variable can be set to specify a Vala-Lint config filename. When a file + with the specified name was not found or this variable was set to empty, + Vala-Lint will be executed without specifying a config filename. + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-verilog.txt b/dot_vim/plugged/ale/doc/ale-verilog.txt new file mode 100644 index 0000000..611ed2f --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-verilog.txt @@ -0,0 +1,142 @@ +=============================================================================== +ALE Verilog/SystemVerilog Integration *ale-verilog-options* + + +=============================================================================== +ALE can use six different linters for Verilog HDL: + + HDL Checker + Using `hdl_checker --lsp` + + iverilog: + Using `iverilog -t null -Wall` + + verilator + Using `verilator --lint-only -Wall` + + ModelSim/Questa + Using `vlog -quiet -lint` + + Vivado + Using `xvlog` + + Yosys + Using `ysoys -Q -T -p 'read_verilog'` + +By default, both 'verilog' and 'systemverilog' filetypes are checked. + +You can limit 'systemverilog' files to be checked using only 'verilator' by +defining 'g:ale_linters' variable: +> + au FileType systemverilog + \ let g:ale_linters = {'systemverilog' : ['verilator'],} +< + +=============================================================================== +General notes + +Linters/compilers that utilize a "work" directory for analyzing designs- such +as ModelSim and Vivado- can be passed the location of these directories as +part of their respective option strings listed below. This is useful for +holistic analysis of a file (e.g. a design with components, packages, or other +code defined external to the current file as part of a larger project) or +when wanting to simply pass an alternative location for the auto-generated +work directories (such as '/tmp') so as to not muddle the current directory. +Since these type of linters often use this work directory for holding compiled +design data as part of a single build process, they sometimes cannot handle +the frequent, asynchronous application launches when linting while text is +changing. This can happen in the form of hangs or crashes. To help prevent +this when using these linters, it may help to run linting less frequently; for +example, only when a file is saved. + +HDL Checker is an alternative for some of the issues described above. It wraps +around ghdl, Vivado and ModelSim/Questa and, when using the latter, it can +handle mixed language (VHDL, Verilog, SystemVerilog) designs. + +=============================================================================== +hdl-checker *ale-verilog-hdl-checker* + +See |ale-vhdl-hdl-checker| + + +=============================================================================== +iverilog *ale-verilog-iverilog* + + No additional options + + +=============================================================================== +verilator *ale-verilog-verilator* + +g:ale_verilog_verilator_options *g:ale_verilog_verilator_options* + *b:ale_verilog_verilator_options* + Type: |String| + Default: `''` + + This variable can be changed to modify 'verilator' command arguments + + For example `'-sv --default-language "1800-2012"'` if you want to enable + SystemVerilog parsing and select the 2012 version of the language. + + +=============================================================================== +vlog *ale-verilog-vlog* + +g:ale_verilog_vlog_executable *g:ale_verilog_vlog_executable* + *b:ale_verilog_vlog_executable* + Type: |String| + Default: `'vlog'` + + This variable can be changed to the path to the 'vlog' executable. + + +g:ale_verilog_vlog_options *g:ale_verilog_vlog_options* + *b:ale_verilog_vlog_options* + Type: |String| + Default: `'-quiet -lint'` + + This variable can be changed to modify the flags/options passed to 'vlog'. + + +=============================================================================== +xvlog *ale-verilog-xvlog* + +g:ale_verilog_xvlog_executable *g:ale_verilog_xvlog_executable* + *b:ale_verilog_xvlog_executable* + Type: |String| + Default: `'xvlog'` + + This variable can be changed to the path to the 'xvlog' executable. + + +g:ale_verilog_xvlog_options *g:ale_verilog_xvlog_options* + *b:ale_verilog_xvlog_options* + Type: |String| + Default: `''` + + This variable can be changed to modify the flags/options passed to 'xvlog'. + + +=============================================================================== +yosys *ale-verilog-yosys* + +g:ale_verilog_yosys_executable *g:ale_verilog_yosys_executable* + *b:ale_verilog_yosys_executable* + Type: |String| + Default: `'yosys'` + + This variable can be changed to the path to the 'yosys' executable. + + +g:ale_verilog_yosys_options *g:ale_verilog_yosys_options* + *b:ale_verilog_yosys_options* + Type: |String| + Default: `'-Q -T -p ''read_verilog %s'''` + + This variable can be changed to modify the flags/options passed to 'yosys'. + By default, Yosys is an interactive program. To obtain linting functionality, + the `'read_verilog'` command is used. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-vhdl.txt b/dot_vim/plugged/ale/doc/ale-vhdl.txt new file mode 100644 index 0000000..c287024 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-vhdl.txt @@ -0,0 +1,157 @@ +=============================================================================== +ALE VHDL Integration *ale-vhdl-options* + + +=============================================================================== +ALE can use four different linters for VHDL: + + ghdl: + Using `ghdl --std=08` + + ModelSim/Questa + Using `vcom -2008 -quiet -lint` + + Vivado + Using `xvhdl --2008` + + HDL Checker + Using `hdl_checker --lsp` + +=============================================================================== +General notes + +ghdl, ModelSim/Questa and Vivado linters default to VHDL-2008 support. This, +and other options, can be changed with each linter's respective option +variable. + +Linters/compilers that utilize a "work" directory for analyzing designs- such +as ModelSim and Vivado- can be passed the location of these directories as +part of their respective option strings listed below. This is useful for +holistic analysis of a file (e.g. a design with components, packages, or other +code defined external to the current file as part of a larger project) or +when wanting to simply pass an alternative location for the auto-generated +work directories (such as '/tmp') so as to not muddle the current directory. +Since these type of linters often use this work directory for holding compiled +design data as part of a single build process, they sometimes cannot handle +the frequent, asynchronous application launches when linting while text is +changing. This can happen in the form of hangs or crashes. To help prevent +this when using these linters, it may help to run linting less frequently; for +example, only when a file is saved. + +HDL Checker is an alternative for some of the issues described above. It wraps +around ghdl, Vivado and ModelSim/Questa and, when using the latter, it can +handle mixed language (VHDL, Verilog, SystemVerilog) designs. + +=============================================================================== +ghdl *ale-vhdl-ghdl* + +g:ale_vhdl_ghdl_executable *g:ale_vhdl_ghdl_executable* + *b:ale_vhdl_ghdl_executable* + Type: |String| + Default: `'ghdl'` + + This variable can be changed to the path to the 'ghdl' executable. + + +g:ale_vhdl_ghdl_options *g:ale_vhdl_ghdl_options* + *b:ale_vhdl_ghdl_options* + Type: |String| + Default: `'--std=08'` + + This variable can be changed to modify the flags/options passed to 'ghdl'. + + +=============================================================================== +hdl-checker *ale-vhdl-hdl-checker* + +HDL Checker is a wrapper for VHDL/Verilg/SystemVerilog tools that aims to +reduce the boilerplate code needed to set things up. It can automatically +infer libraries for VHDL sources, determine the compilation order and provide +some static checks. + +You can install it using pip: +> + $ pip install hdl-checker + +`hdl-checker` will be run from a detected project root, determined by the +following methods, in order: + +1. Find the first directory containing a configuration file (see + |g:ale_hdl_checker_config_file|) +2. If no configuration file can be found, find the first directory containing + a folder named `'.git' +3. If no such folder is found, use the directory of the current buffer + + +g:ale_hdl_checker_executable + *g:ale_hdl_checker_executable* + *b:ale_hdl_checker_executable* + Type: |String| + Default: `'hdl_checker'` + + This variable can be changed to the path to the 'hdl_checker' executable. + + +g:ale_hdl_checker_options *g:ale_hdl_checker_options* + *b:ale_hdl_checker_options* + Type: |String| + Default: `''` + + This variable can be changed to modify the flags/options passed to the + 'hdl_checker' server startup command. + + +g:ale_hdl_checker_config_file *g:ale_hdl_checker_config_file* + *b:ale_hdl_checker_config_file* + Type: |String| + Default: `'.hdl_checker.config'` (Unix), + `'_hdl_checker.config'` (Windows) + + This variable can be changed to modify the config file HDL Checker will try + to look for. It will also affect how the project's root directory is + determined (see |ale-vhdl-hdl-checker|). + + More info on the configuration file format can be found at: + https://github.com/suoto/hdl_checker/wiki/Setting-up-a-project + + +=============================================================================== +vcom *ale-vhdl-vcom* + +g:ale_vhdl_vcom_executable *g:ale_vhdl_vcom_executable* + *b:ale_vhdl_vcom_executable* + Type: |String| + Default: `'vcom'` + + This variable can be changed to the path to the 'vcom' executable. + + +g:ale_vhdl_vcom_options *g:ale_vhdl_vcom_options* + *b:ale_vhdl_vcom_options* + Type: |String| + Default: `'-2008 -quiet -lint'` + + This variable can be changed to modify the flags/options passed to 'vcom'. + + +=============================================================================== +xvhdl *ale-vhdl-xvhdl* + +g:ale_vhdl_xvhdl_executable *g:ale_vhdl_xvhdl_executable* + *b:ale_vhdl_xvhdl_executable* + Type: |String| + Default: `'xvhdl'` + + This variable can be changed to the path to the 'xvhdl' executable. + + +g:ale_vhdl_xvhdl_options *g:ale_vhdl_xvhdl_options* + *b:ale_vhdl_xvhdl_options* + Type: |String| + Default: `'--2008'` + + This variable can be changed to modify the flags/options passed to 'xvhdl'. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-vim-help.txt b/dot_vim/plugged/ale/doc/ale-vim-help.txt new file mode 100644 index 0000000..3cbe20d --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-vim-help.txt @@ -0,0 +1,12 @@ +=============================================================================== +ALE Vim help Integration *ale-vim-help-options* + + +=============================================================================== +write-good *ale-vim-help-write-good* + +See |ale-write-good-options| + + +=============================================================================== +vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-vim.txt b/dot_vim/plugged/ale/doc/ale-vim.txt new file mode 100644 index 0000000..f85b43e --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-vim.txt @@ -0,0 +1,82 @@ +=============================================================================== +ALE Vim Integration *ale-vim-options* + + +=============================================================================== +vimls *ale-vim-vimls* + + The `vim-language-server` is the engine that powers VimL editor support + using the Language Server Protocol. See the installation instructions: + https://github.com/iamcco/vim-language-server#install + +g:ale_vim_vimls_executable *g:ale_vim_vimls_executable* + *b:ale_vim_vimls_executable* + Type: |String| + Default: `'vim-language-server'` + + This option can be set to change the executable path for vimls. + + +g:ale_vim_vimls_config *g:ale_vim_vimls_config* + *b:ale_vim_vimls_config* + Type: |Dictionary| + Default: `{}` + + Dictionary containing configuration settings that will be passed to the + language server. For example: > + { + \ 'vim': { + \ 'iskeyword': '@,48-57,_,192-255,-#', + \ 'vimruntime': '', + \ 'runtimepath': '', + \ 'diagnostic': { + \ 'enable': v:true + \ }, + \ 'indexes': { + \ 'runtimepath': v:true, + \ 'gap': 100, + \ 'count': 3, + \ 'projectRootPatterns' : ['.git', 'autoload', 'plugin'] + \ }, + \ 'suggest': { + \ 'fromVimruntime': v:true, + \ 'fromRuntimepath': v:false + \ }, + \ } + \} +< + Consult the vim-language-server documentation for more information about + settings. + + +g:ale_vim_vimls_use_global *g:ale_vim_vimls_use_global* + *b:ale_vim_vimls_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +vint *ale-vim-vint* + +g:ale_vim_vint_executable *g:ale_vim_vint_executable* + *b:ale_vim_vint_executable* + Type: |String| + Default: `'vint'` + + This option can be set to change the executable path for Vint. + + +g:ale_vim_vint_show_style_issues *g:ale_vim_vint_show_style_issues* + *b:ale_vim_vint_show_style_issues* + Type: |Number| + Default: `1` + + This variable will enable/disable style issues for Vint. When this option + is disabled, only warnings and errors which are not purely style issues + will be reported. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-vue.txt b/dot_vim/plugged/ale/doc/ale-vue.txt new file mode 100644 index 0000000..40106b2 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-vue.txt @@ -0,0 +1,68 @@ +=============================================================================== +ALE Vue Integration *ale-vue-options* + + +=============================================================================== +cspell *ale-vue-cspell* + +See |ale-cspell-options| + + +=============================================================================== +prettier *ale-vue-prettier* + +See |ale-javascript-prettier| for information about the available options. + + +=============================================================================== +vls *ale-vue-vls* + +g:ale_vue_vls_executable *g:ale_vue_vls_executable* + *b:ale_vue_vls_executable* + Type: |String| + Default: `'vls'` + + See |ale-integrations-local-executables| + + +g:ale_vue_vls_use_global *g:ale_vue_vls_use_global* + *b:ale_vue_vls_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +volar *ale-vue-volar* + + It is required to have typescript installed in your project as your dev + dependency: `npm i -D typescript` + +g:ale_vue_volar_executable *g:ale_vue_volar_executable* + *b:ale_vue_volar_executable* + Type: |String| + Default: `'vue-language-server'` + + See |ale-integrations-local-executables| + + +g:ale_vue_volar_use_global *g:ale_vue_volar_use_global* + *b:ale_vue_volar_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:vue_volar_init_options *g:ale_vue_volar_init_options* + *b:ale_vue_volar_init_options* + Type: |Dictionary| + Default: `{ ... }` + + Default is too long to show here, take a look at it over + `ale_linters/vue/volar.vim` + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-wgsl.txt b/dot_vim/plugged/ale/doc/ale-wgsl.txt new file mode 100644 index 0000000..5254f43 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-wgsl.txt @@ -0,0 +1,17 @@ +=============================================================================== +ALE WGSL Integration *ale-wgsl-options* + + +=============================================================================== +naga *ale-wgsl-naga* + +g:ale_wgsl_naga_executable *g:ale_wgsl_naga_executable* + *b:ale_wgsl_naga_executable* + Type: |String| + Default: `'naga'` + + The executable that will be run for the `naga` linter. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-xhtml.txt b/dot_vim/plugged/ale/doc/ale-xhtml.txt new file mode 100644 index 0000000..10ca5b8 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-xhtml.txt @@ -0,0 +1,18 @@ +=============================================================================== +ALE XHTML Integration *ale-xhtml-options* + + +=============================================================================== +cspell *ale-xhtml-cspell* + +See |ale-cspell-options| + + +=============================================================================== +write-good *ale-xhtml-write-good* + +See |ale-write-good-options| + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-xml.txt b/dot_vim/plugged/ale/doc/ale-xml.txt new file mode 100644 index 0000000..a7180df --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-xml.txt @@ -0,0 +1,34 @@ +=============================================================================== +ALE XML Integration *ale-xml-options* + + +=============================================================================== +xmllint *ale-xml-xmllint* + +g:ale_xml_xmllint_executable *g:ale_xml_xmllint_executable* + *b:ale_xml_xmllint_executable* + Type: |String| + Default: `'xmllint'` + + This variable can be set to change the path to xmllint. + + +g:ale_xml_xmllint_options *g:ale_xml_xmllint_options* + *b:ale_xml_xmllint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to xmllint. + + +g:ale_xml_xmllint_indentsize *g:ale_xml_xmllint_indentsize* + *b:ale_xml_xmllint_indentsize* + Type: |Number| + Default: `2` + + This variable can be sent to specify the amount of spaces used for + indentation. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: + diff --git a/dot_vim/plugged/ale/doc/ale-yaml.txt b/dot_vim/plugged/ale/doc/ale-yaml.txt new file mode 100644 index 0000000..b3450b8 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-yaml.txt @@ -0,0 +1,331 @@ +=============================================================================== +ALE YAML Integration *ale-yaml-options* + + +=============================================================================== +actionlint *ale-yaml-actionlint* + +Website: https://github.com/rhysd/actionlint + + +Installation +------------------------------------------------------------------------------- + +See installation guide: https://github.com/rhysd/actionlint#quick-start + +This linter is disabled by default and must be enabled by setting `g:ale_linters`. +To enable it only for Github Action YAML files a configuration like this is +better: + +> + au BufRead,BufNewFile */.github/*/*.y{,a}ml + \ let b:ale_linters = {'yaml': ['actionlint']} +< + +Options +------------------------------------------------------------------------------- + +g:ale_yaml_actionlint_executable *g:ale_yaml_actionlint_executable* + *b:ale_yaml_actionlint_executable* + Type: |String| + Default: `'actionlint'` + + This variable can be set to change the path to actionlint. + +g:ale_yaml_actionlint_options *g:ale_yaml_actionlint_options* + *b:ale_yaml_actionlint_options* + + Type: |String| + Default: `''` + + This variable can be set to add extra options to actionlint executable. + + For example, to disable running `shellcheck` and `pyflakes` external commands, + you may want to set: +> + let g:ale_yaml_actionlint_options = '-shellcheck= -pyflakes=' +< + Please note that passing `-format` as option is not supported at the moment. + +=============================================================================== +circleci *ale-yaml-circleci* + +Website: https://circleci.com/docs/2.0/local-cli + + +Installation +------------------------------------------------------------------------------- + +Follow the instructions on the website, and make sure to test that you can +validate configuration files with: > + + circleci config validate - < .circleci/config.yml +< + +As long as the validator runs correctly, you should be able to see errors when +you save the configuration file. The validator doesn't run as you type because +it sends network requests, and running too often would overload the circleci +servers. + + +=============================================================================== +prettier *ale-yaml-prettier* + +Website: https://github.com/prettier/prettier + + +Installation +------------------------------------------------------------------------------- + +Install prettier either globally or locally: > + + npm install prettier -g # global + npm install prettier # local +< + +=============================================================================== +spectral *ale-yaml-spectral* + +Website: https://github.com/stoplightio/spectral + + +Installation +------------------------------------------------------------------------------- + +Install spectral either globally or locally: > + + npm install @stoplight/spectral -g # global + npm install @stoplight/spectral # local +< + +Options +------------------------------------------------------------------------------- + +g:ale_yaml_spectral_executable *g:ale_yaml_spectral_executable* + *b:ale_yaml_spectral_executable* + Type: |String| + Default: `'spectral'` + + This variable can be set to change the path to spectral. + +g:ale_yaml_spectral_use_global *g:ale_yaml_spectral_use_global* + *b:ale_yaml_spectral_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +swaglint *ale-yaml-swaglint* + +Website: https://github.com/byCedric/swaglint + + +Installation +------------------------------------------------------------------------------- + +Install swaglint either globally or locally: > + + npm install swaglint -g # global + npm install swaglint # local +< + +Options +------------------------------------------------------------------------------- + +g:ale_yaml_swaglint_executable *g:ale_yaml_swaglint_executable* + *b:ale_yaml_swaglint_executable* + Type: |String| + Default: `'swaglint'` + + This variable can be set to change the path to swaglint. + + +g:ale_yaml_swaglint_use_global *g:ale_yaml_swaglint_use_global* + *b:ale_yaml_swaglint_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +yaml-language-server *ale-yaml-language-server* + +Website: https://github.com/redhat-developer/yaml-language-server + + +Installation +------------------------------------------------------------------------------- + +Install yaml-language-server either globally or locally: > + + npm install yaml-language-server -g # global + npm install yaml-language-server # local + + +Options +------------------------------------------------------------------------------- + +g:ale_yaml_ls_executable *g:ale_yaml_ls_executable* + *b:ale_yaml_ls_executable* + Type: |String| + Default: `'yaml-language-server'` + + This variable can be set to change the path to yaml-language-server. + + +g:ale_yaml_ls_config *g:ale_yaml_ls_config* + *b:ale_yaml_ls_config* + Type: |Dictionary| + Default: `{}` + + Dictionary containing configuration settings that will be passed to the + language server. For example, to enable schema store: > + { + \ 'yaml': { + \ 'schemaStore': { + \ 'enable': v:true, + \ }, + \ }, + \ } +< + Consult the yaml-language-server documentation for more information about + settings. + + +g:ale_yaml_ls_use_global *g:ale_yaml_ls_use_global* + *b:ale_yaml_ls_use_global* + Type: |String| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +yamlfix *ale-yaml-yamlfix* + +Website: https://lyz-code.github.io/yamlfix + + +Installation +------------------------------------------------------------------------------- + +Install yamlfix: > + + pip install yamlfix +< + +Options +------------------------------------------------------------------------------- +g:ale_yaml_yamlfix_executable *g:ale_yaml_yamlfix_executable* + *b:ale_yaml_yamlfix_executable* + Type: |String| + Default: `'yamlfix'` + + See |ale-integrations-local-executables| + + +g:ale_yaml_yamlfix_options *g:ale_yaml_yamlfix_options* + *b:ale_yaml_yamlfix_options* + Type: |String| + Default: `''` + + This variable can be set to pass extra options to yamlfix. + +g:ale_yaml_yamlfix_use_global *g:ale_yaml_yamlfix_use_global* + *b:ale_yaml_yamlfix_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +=============================================================================== +yamllint *ale-yaml-yamllint* + +Website: https://github.com/adrienverge/yamllint + + +Installation +------------------------------------------------------------------------------- + +Install yamllint in your a virtualenv directory, locally, or globally: > + + pip install yamllint # After activating virtualenv + pip install --user yamllint # Install to ~/.local/bin + sudo pip install yamllint # Install globally + +See |g:ale_virtualenv_dir_names| for configuring how ALE searches for +virtualenv directories. + + +Options +------------------------------------------------------------------------------- + +g:ale_yaml_yamllint_executable *g:ale_yaml_yamllint_executable* + *b:ale_yaml_yamllint_executable* + Type: |String| + Default: `'yamllint'` + + This variable can be set to change the path to yamllint. + + +g:ale_yaml_yamllint_options *g:ale_yaml_yamllint_options* + *b:ale_yaml_yamllint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to yamllint. + + +=============================================================================== +gitlablint *ale-yaml-gitlablint* + +Website: https://github.com/elijah-roberts/gitlab-lint + + +Installation +------------------------------------------------------------------------------- + +Install yamllint in your a virtualenv directory, locally, or globally: > + + pip3 install gitlab_lint # After activating virtualenv + pip3 install --user gitlab_lint # Install to ~/.local/bin + sudo pip3 install gitlab_lint # Install globally + +See |g:ale_virtualenv_dir_names| for configuring how ALE searches for +virtualenv directories. + +Is recommended to use |g:ale_pattern_options| to enable this linter so it only +applies to 'gitlab-ci.yml' files and not all yaml files: +> + let g:ale_pattern_options = { + \ '.gitlab-ci\.yml$': { + \ 'ale_linters': ['gitlablint'], + \ }, + \} +< + +Options +------------------------------------------------------------------------------- + +g:ale_yaml_gitlablint_executable *g:ale_yaml_gitlablint_executable* + *b:ale_yaml_gitlablint_executable* + Type: |String| + Default: `'gll'` + + This variable can be set to change the path to gll. + + +g:ale_yaml_gitlablint_options *g:ale_yaml_gitlablint_options* + *b:ale_yaml_gitlablint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to gll. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-yang.txt b/dot_vim/plugged/ale/doc/ale-yang.txt new file mode 100644 index 0000000..ad61973 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-yang.txt @@ -0,0 +1,17 @@ +=============================================================================== +ALE YANG Integration *ale-yang-options* + + +=============================================================================== +yang-lsp *ale-yang-lsp* + +g:ale_yang_lsp_executable *g:ale_yang_lsp_executable* + *b:ale_yang_lsp_executable* + Type: |String| + Default: `'yang-language-server'` + + This variable can be changed to use a different executable for yang-lsp. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale-zeek.txt b/dot_vim/plugged/ale/doc/ale-zeek.txt new file mode 100644 index 0000000..910bc06 --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-zeek.txt @@ -0,0 +1,23 @@ +=============================================================================== +ALE Zeek Integration *ale-zeek-options* + *ale-integration-zeek* + +=============================================================================== +Integration Information + + Currently, the only supported linter for Zeek is zeek. + +=============================================================================== +zeek *ale-zeek-zeek* + +g:ale_zeek_zeek_executable *g:ale_zeek_zeek_executable* + *b:ale_zeek_zeek_executable* + Type: |String| + Default: `'zeek'` + + This variable can be modified to change the executable path for `zeek`. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: + diff --git a/dot_vim/plugged/ale/doc/ale-zig.txt b/dot_vim/plugged/ale/doc/ale-zig.txt new file mode 100644 index 0000000..cafa12a --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale-zig.txt @@ -0,0 +1,45 @@ +=============================================================================== +ALE Zig Integration *ale-zig-options* + *ale-integration-zig* + +=============================================================================== +Integration Information + + Currently, the only supported linter for zig is zls. + + +=============================================================================== +zigfmt *ale-zig-zigfmt* + +g:ale_zig_zigfmt_executable *g:ale_zig_zigfmt_executable* + *b:ale_zig_zigfmt_executable* + Type: |String| + Default: `'zig'` + + The executable that will be run for the `zig fmt` fixer. + + +=============================================================================== +zls *ale-zig-zls* + +g:ale_zig_zls_executable *g:ale_zig_zls_executable* + *b:ale_zig_zls_executable* + Type: |String| + Default: `'zls'` + + This variable can be modified to change the executable path for `zls`. + + +g:ale_zig_zls_config *g:ale_zig_zls_config* + *b:ale_zig_zls_config* + Type: |Dictionary| + Default: `{}` + + WARNING: As of writing, zls does not support receiving configuration + from the client. This variable is a PLACEHOLDER until it does. + + Dictionary with configuration settings for zls. + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/ale.txt b/dot_vim/plugged/ale/doc/ale.txt new file mode 100644 index 0000000..949ceae --- /dev/null +++ b/dot_vim/plugged/ale/doc/ale.txt @@ -0,0 +1,4660 @@ +*ale.txt* Plugin to lint and fix files asynchronously +*ale* + +ALE - Asynchronous Lint Engine + +=============================================================================== +CONTENTS *ale-contents* + + 1. Introduction.........................|ale-introduction| + 2. Supported Languages & Tools..........|ale-support| + 3. Linting..............................|ale-lint| + 3.1 Linting On Other Machines.........|ale-lint-other-machines| + 3.2 Adding Language Servers...........|ale-lint-language-servers| + 3.3 Other Sources.....................|ale-lint-other-sources| + 4. Fixing Problems......................|ale-fix| + 5. Language Server Protocol Support.....|ale-lsp| + 5.1 Completion........................|ale-completion| + 5.2 Go To Definition..................|ale-go-to-definition| + 5.3 Go To Type Definition.............|ale-go-to-type-definition| + 5.4 Go To Implementation..............|ale-go-to-type-implementation| + 5.5 Find References...................|ale-find-references| + 5.6 Hovering..........................|ale-hover| + 5.7 Symbol Search.....................|ale-symbol-search| + 5.8 Refactoring: Rename, Actions......|ale-refactor| + 6. Global Options.......................|ale-options| + 6.1 Highlights........................|ale-highlights| + 7. Linter/Fixer Options.................|ale-integration-options| + 7.1 Options for alex..................|ale-alex-options| + 7.2 Options for cspell................|ale-cspell-options| + 7.3 Options for languagetool..........|ale-languagetool-options| + 7.4 Options for write-good............|ale-write-good-options| + 7.5 Other Linter/Fixer Options........|ale-other-integration-options| + 8. Commands/Keybinds....................|ale-commands| + 9. API..................................|ale-api| + 10. Special Thanks......................|ale-special-thanks| + 11. Contact.............................|ale-contact| + +=============================================================================== +1. Introduction *ale-introduction* + +ALE provides the means to run linters asynchronously in Vim in a variety of +languages and tools. ALE sends the contents of buffers to linter programs +using the |job-control| features available in Vim 8 and NeoVim. For Vim 8, +Vim must be compiled with the |job| and |channel| and |timers| features +as a minimum. + +ALE supports the following key features for linting: + +1. Running linters when text is changed. +2. Running linters when files are opened. +3. Running linters when files are saved. (When a global flag is set.) +4. Populating the |loclist| with warning and errors. +5. Setting |signs| with warnings and errors for error markers. +6. Using |echo| to show error messages when the cursor moves. +7. Setting syntax highlights for errors. + +ALE can fix problems with files with the |ALEFix| command, using the same job +control functionality used for checking for problems. Try using the +|ALEFixSuggest| command for browsing tools that can be used to fix problems +for the current buffer. + +If you are interested in contributing to the development of ALE, read the +developer documentation. See |ale-development| + +=============================================================================== +2. Supported Languages & Tools *ale-support* + +ALE supports a wide variety of languages and tools. See |ale-supported-list| +for the full list. + +=============================================================================== +3. Linting *ale-lint* + +ALE's primary focus is on checking for problems with your code with various +programs via some Vim code for integrating with those programs, referred to +as 'linters.' ALE supports a wide array of programs for linting by default, +but additional programs can be added easily by defining files in |runtimepath| +with the filename pattern `ale_linters//.vim`. For more +information on defining new linters, see the extensive documentation +for |ale#linter#Define()|. + +Without any configuration, ALE will attempt to check all of the code for every +file you open in Vim with all available tools by default. To see what ALE +is doing, and what options have been set, try using the |:ALEInfo| command. + +Most of the linters ALE runs will check the Vim buffer you are editing instead +of the file on disk. This allows you to check your code for errors before you +have even saved your changes. ALE will check your code in the following +circumstances, which can be configured with the associated options. + +* When you modify a buffer. - |g:ale_lint_on_text_changed| +* On leaving insert mode. - |g:ale_lint_on_insert_leave| +* When you open a new or modified buffer. - |g:ale_lint_on_enter| +* When you save a buffer. - |g:ale_lint_on_save| +* When the filetype changes for a buffer. - |g:ale_lint_on_filetype_changed| +* If ALE is used to check code manually. - |:ALELint| + + *ale-lint-settings-on-startup* + +It is worth reading the documentation for every option. You should configure +which events ALE will use before ALE is loaded, so it can optimize which +autocmd commands to run. You can force autocmd commands to be reloaded with +`:ALEDisable | ALEEnable` + +This also applies to the autocmd commands used for |g:ale_echo_cursor|. + + *ale-lint-file-linters* + +Some programs must be run against files which have been saved to disk, and +simply do not support reading temporary files or stdin, either of which are +required for ALE to be able to check for errors as you type. The programs +which behave this way are documented in the lists and tables of supported +programs. ALE will only lint files with these programs in the following +circumstances. + +* When you open a new or modified buffer. - |g:ale_lint_on_enter| +* When you save a buffer. - |g:ale_lint_on_save| +* When the filetype changes for a buffer. - |g:ale_lint_on_filetype_changed| +* If ALE is used to check code manually. - |:ALELint| + +ALE will report problems with your code in the following ways, listed with +their relevant options. + +* By updating loclist. (On by default) - |g:ale_set_loclist| +* By updating quickfix. (Off by default) - |g:ale_set_quickfix| +* By setting error highlights. - |g:ale_set_highlights| +* By creating signs in the sign column. - |g:ale_set_signs| +* By echoing messages based on your cursor. - |g:ale_echo_cursor| +* By inline text based on your cursor. - |g:ale_virtualtext_cursor| +* By displaying the preview based on your cursor. - |g:ale_cursor_detail| +* By showing balloons for your mouse cursor - |g:ale_set_balloons| + +Please consult the documentation for each option, which can reveal some other +ways of tweaking the behavior of each way of displaying problems. You can +disable or enable whichever options you prefer. + +Most settings can be configured for each buffer. (|b:| instead of |g:|), +including disabling ALE for certain buffers with |b:ale_enabled|. The +|g:ale_pattern_options| setting can be used to configure files differently +based on regular expressions for filenames. For configuring entire projects, +the buffer-local options can be used with external plugins for reading Vim +project configuration files. Buffer-local settings can also be used in +ftplugin files for different filetypes. + +ALE offers several options for controlling which linters are run. + +* Selecting linters to run. - |g:ale_linters| +* Aliasing filetypes for linters - |g:ale_linter_aliases| +* Only running linters you asked for. - |g:ale_linters_explicit| +* Disabling only a subset of linters. - |g:ale_linters_ignore| +* Disabling LSP linters and `tsserver`. - |g:ale_disable_lsp| + +You can stop ALE any currently running linters with the |ALELintStop| command. +Any existing problems will be kept. + +------------------------------------------------------------------------------- +3.1 Linting On Other Machines *ale-lint-other-machines* + +ALE offers support for running linters or fixers on files you are editing +locally on other machines, so long as the other machine has access to the file +you are editing. This could be a linter or fixer run inside of a Docker image, +running in a virtual machine, running on a remote server, etc. + +In order to run tools on other machines, you will need to configure your tools +to run via scripts that execute commands on those machines, such as by setting +the ALE `_executable` options for those tools to a path for a script to run, +or by using |g:ale_command_wrapper| to specify a script to wrap all commands +that are run by ALE, before they are executed. For tools that ALE runs where +ALE looks for locally installed executables first, you may need to set the +`_use_global` options for those tools to `1`, or you can set +|g:ale_use_global_executables| to `1` before ALE is loaded to only use global +executables for all tools. + +In order for ALE to properly lint or fix files which are running on another +file system, you must provide ALE with |List|s of strings for mapping paths to +and from your local file system and the remote file system, such as the file +system of your Docker container. See |g:ale_filename_mappings| for all of the +different ways these filename mappings can be configured. + +For example, you might configure `pylint` to run via Docker by creating a +script like so. > + + #!/usr/bin/env bash + + exec docker run -i --rm -v "$(pwd):/data" cytopia/pylint "$@" +< + +You will run to run Docker commands with `-i` in order to read from stdin. + +With the above script in mind, you might configure ALE to lint your Python +project with `pylint` by providing the path to the script to execute, and +mappings which describe how to between the two file systems in your +`python.vim` |ftplugin| file, like so: > + + if expand('%:p') =~# '^/home/w0rp/git/test-pylint/' + let b:ale_linters = ['pylint'] + let b:ale_python_pylint_use_global = 1 + " This is the path to the script above. + let b:ale_python_pylint_executable = '/home/w0rp/git/test-pylint/pylint.sh' + " /data matches the path in Docker. + let b:ale_filename_mappings = { + \ 'pylint': [ + \ ['/home/w0rp/git/test-pylint', '/data'], + \ ], + \} + endif +< + +You might consider using a Vim plugin for loading Vim configuration files +specific to each project, if you have a lot of projects to manage. + + +------------------------------------------------------------------------------- +3.2 Adding Language Servers *ale-lint-language-servers* + +ALE comes with many default configurations for language servers, so they can +be detected and run automatically. ALE can connect to other language servers +by defining a new linter for a filetype. New linters can be defined in |vimrc|, +in plugin files, or `ale_linters` directories in |runtimepath|. + +See |ale-linter-loading-behavior| for more information on loading linters. + +A minimal configuration for a language server linter might look so. > + + call ale#linter#Define('filetype_here', { + \ 'name': 'any_name_you_want', + \ 'lsp': 'stdio', + \ 'executable': '/path/to/executable', + \ 'command': '%e run', + \ 'project_root': '/path/to/root_of_project', + \}) +< +For language servers that use a TCP or named pipe socket connection, you +should define the address to connect to instead. > + + call ale#linter#Define('filetype_here', { + \ 'name': 'any_name_you_want', + \ 'lsp': 'socket', + \ 'address': 'servername:1234', + \ 'project_root': '/path/to/root_of_project', + \}) +< + Most of the options for a language server can be replaced with a |Funcref| + for a function accepting a buffer number for dynamically computing values + such as the executable path, the project path, the server address, etc, + most of which can also be determined based on executing some other + asynchronous task. See |ale#command#Run()| for computing linter options + based on asynchronous results. + + See |ale#linter#Define()| for a detailed explanation of all of the options + for configuring linters. + + +------------------------------------------------------------------------------- +3.3 Other Sources *ale-lint-other-sources* + +Problems for a buffer can be taken from other sources and rendered by ALE. +This allows ALE to be used in combination with other plugins which also want +to display any problems they might find with a buffer. ALE's API includes the +following components for making this possible. + +* |ale#other_source#StartChecking()| - Tell ALE that a buffer is being checked. +* |ale#other_source#ShowResults()| - Show results from another source. +* |ALEWantResults| - A signal for when ALE wants results. + +Other resources can provide results for ALE to display at any time, following +ALE's loclist format. (See |ale-loclist-format|) For example: > + + " Tell ALE to show some results. + " This function can be called at any time. + call ale#other_source#ShowResults(bufnr(''), 'some-linter-name', [ + \ {'text': 'Something went wrong', 'lnum': 13}, + \]) +< + +Other sources should use a unique name for identifying themselves. A single +linter name can be used for all problems from another source, or a series of +unique linter names can be used. Results can be cleared for that source by +providing an empty List. + +|ale#other_source#StartChecking()| should be called whenever another source +starts checking a buffer, so other tools can know that a buffer is being +checked by some plugin. The |ALEWantResults| autocmd event can be used to +start checking a buffer for problems every time that ALE does. When +|ALEWantResults| is signaled, |g:ale_want_results_buffer| will be set to the +number of the buffer that ALE wants to check. +|ale#other_source#StartChecking()| should be called synchronously, and other +sources should perform their checks on a buffer in the background +asynchronously, so they don't interrupt editing. + +|ale#other_source#ShowResults()| must not be called synchronously before +ALE's engine executes its code after the |ALEWantResults| event runs. If +there are immediate results to provide to ALE, a 0 millisecond timer with +|timer_start()| can be set instead up to call |ale#other_source#ShowResults()| +after ALE has first executed its engine code for its own sources. + +A plugin might integrate its own checks with ALE like so: > + + augroup SomeGroupName + autocmd! + autocmd User ALEWantResults call Hook(g:ale_want_results_buffer) + augroup END + + function! DoBackgroundWork(buffer) abort + " Start some work in the background here. + " ... + " Then call WorkDone(a:buffer, results) + endfunction + + function! Hook(buffer) abort + " Tell ALE we're going to check this buffer. + call ale#other_source#StartChecking(a:buffer, 'some-name') + call DoBackgroundWork(a:buffer) + endfunction + + function! WorkDone(buffer, results) abort + " Send results to ALE after they have been collected. + call ale#other_source#ShowResults(a:buffer, 'some-name', a:results) + endfunction +< + +=============================================================================== +4. Fixing Problems *ale-fix* + +ALE can fix problems with files with the |ALEFix| command. |ALEFix| +accepts names of fixers to be applied as arguments. Alternatively, +when no arguments are provided, the variable |g:ale_fixers| will be +read for getting a |List| of commands for filetypes, split on `.`, and +the functions named in |g:ale_fixers| will be executed for fixing the +errors. + +The |ALEFixSuggest| command can be used to suggest tools that be used to +fix problems for the current buffer. + +The values for `g:ale_fixers` can be a list of |String|, |Funcref|, or +|lambda| values. String values must either name a function, or a short name +for a function set in the ALE fixer registry. + +Each function for fixing errors must accept either one argument `(buffer)` or +two arguments `(buffer, lines)`, representing the buffer being fixed and the +lines to fix. The functions must return either `0`, for changing nothing, a +|List| for new lines to set, a |Dictionary| for describing a command to be +run in the background, or the result of |ale#command#Run()|. + +Functions receiving a variable number of arguments will not receive the second +argument `lines`. Functions should name two arguments if the `lines` argument +is desired. This is required to avoid unnecessary copying of the lines of +the buffers being checked. + +When a |Dictionary| is returned for an |ALEFix| callback, the following keys +are supported for running the commands. + + `cwd` An optional |String| for setting the working directory + for the command. + + If not set, or `v:null`, the `cwd` of the last command + that spawn this one will be used. + + `command` A |String| for the command to run. This key is required. + + When `%t` is included in a command string, a temporary + file will be created, containing the lines from the file + after previous adjustment have been done. + + See |ale-command-format-strings| for formatting options. + + `read_temporary_file` When set to `1`, ALE will read the contents of the + temporary file created for `%t`. This option can be used + for commands which need to modify some file on disk in + order to fix files. + + `process_with` An optional callback for post-processing. + + The callback must accept arguments `(bufnr, output)`: + the buffer number undergoing fixing and the fixer's + output as a |List| of |String|s. It must return a |List| + of |String|s that will be the new contents of the + buffer. + + This callback is useful to remove excess lines from the + command's output or apply additional changes to the + output. + + + `read_buffer` An optional key for disabling reading the buffer. + + When set to `0`, ALE will not pipe the buffer's data + into the command via stdin. This option is ignored and + the buffer is not read when `read_temporary_file` is + `1`. + + This option defaults to `1`. + + *ale-fix-configuration* + +Synchronous functions and asynchronous jobs will be run in a sequence for +fixing files, and can be combined. For example: +> + let g:ale_fixers = { + \ 'javascript': [ + \ 'DoSomething', + \ 'eslint', + \ {buffer, lines -> filter(lines, 'v:val !=~ ''^\s*//''')}, + \ ], + \} + + ALEFix +< +The above example will call a function called `DoSomething` which could act +upon some lines immediately, then run `eslint` from the ALE registry, and +then call a lambda function which will remove every single line comment +from the file. + +For buffer-local settings, such as in |g:ale_pattern_options| or in ftplugin +files, a |List| may be used for configuring the fixers instead. +> + " Same as the above, only a List can be used instead of a Dictionary. + let b:ale_fixers = [ + \ 'DoSomething', + \ 'eslint', + \ {buffer, lines -> filter(lines, 'v:val !=~ ''^\s*//''')}, + \] + + ALEFix +< +For convenience, a plug mapping is defined for |ALEFix|, so you can set up a +keybind easily for fixing files. > + + " Bind F8 to fixing problems with ALE + nmap (ale_fix) +< +Files can be fixed automatically with the following options, which are all off +by default. + +|g:ale_fix_on_save| - Fix files when they are saved. + +Fixers can be disabled on save with |g:ale_fix_on_save_ignore|. They will +still be run when you manually run |ALEFix|. + +Fixers can be run on another machines, just like linters, such as fixers run +from a Docker container, running in a virtual machine, running a remote +server, etc. See |ale-lint-other-machines|. + + +=============================================================================== +5. Language Server Protocol Support *ale-lsp* + +ALE offers some support for integrating with Language Server Protocol (LSP) +servers. LSP linters can be used in combination with any other linter, and +will automatically connect to LSP servers when needed. ALE also supports +`tsserver` for TypeScript, which uses a different but very similar protocol. + +If you want to use another plugin for LSP features and tsserver, you can use +the |g:ale_disable_lsp| setting to disable ALE's own LSP integrations, or +ignore particular linters with |g:ale_linters_ignore|. + +------------------------------------------------------------------------------- +5.1 Completion *ale-completion* + +ALE offers support for automatic completion of code while you type. +Completion is only supported while at least one LSP linter is enabled. ALE +will only suggest symbols provided by the LSP servers. + + *ale-deoplete-integration* + +ALE integrates with Deoplete for offering automatic completion data. ALE's +completion source for Deoplete is named `'ale'`, and should enabled +automatically if Deoplete is enabled and configured correctly. Deoplete +integration should not be combined with ALE's own implementation. + + *ale-asyncomplete-integration* + +ALE additionally integrates with asyncomplete.vim for offering automatic +completion data. ALE's asyncomplete source requires registration and should +use the defaults provided by the |asyncomplete#sources#ale#get_source_options| function > + + " Use ALE's function for asyncomplete defaults + au User asyncomplete_setup call asyncomplete#register_source(asyncomplete#sources#ale#get_source_options({ + \ 'priority': 10, " Provide your own overrides here + \ })) +> +ALE also offers its own completion implementation, which does not require any +other plugins. Suggestions will be made while you type after completion is +enabled. ALE's own completion implementation can be enabled by setting +|g:ale_completion_enabled| to `1`. This setting must be set to `1` before ALE +is loaded. The delay for completion can be configured with +|g:ale_completion_delay|. This setting should not be enabled if you wish to +use ALE as a completion source for other plugins. + +ALE automatic completion will not work when 'paste' is active. Only set +'paste' when you are copy and pasting text into your buffers. + +ALE automatic completion will interfere with default insert completion with +`CTRL-N` and so on (|compl-vim|). You can write your own keybinds and a +function in your |vimrc| file to force insert completion instead, like so: > + + function! SmartInsertCompletion() abort + " Use the default CTRL-N in completion menus + if pumvisible() + return "\" + endif + + " Exit and re-enter insert mode, and use insert completion + return "\a\" + endfunction + + inoremap =SmartInsertCompletion() +< +ALE provides an 'omnifunc' function |ale#completion#OmniFunc| for triggering +completion manually with CTRL-X CTRL-O. |i_CTRL-X_CTRL-O| > + + " Use ALE's function for omnicompletion. + set omnifunc=ale#completion#OmniFunc +< + *ale-completion-fallback* + +You can write your own completion function and fallback on other methods of +completion by checking if there are no results that ALE can determine. For +example, for Python code, you could fall back on the `python3complete` +function. > + + function! TestCompletionFunc(findstart, base) abort + let l:result = ale#completion#OmniFunc(a:findstart, a:base) + + " Check if ALE couldn't find anything. + if (a:findstart && l:result is -3) + \|| (!a:findstart && empty(l:result)) + " Defer to another omnifunc if ALE couldn't find anything. + return python3complete#Complete(a:findstart, a:base) + endif + + return l:result + endfunction + + set omnifunc=TestCompletionFunc +< +See |complete-functions| for documentation on how to write completion +functions. + +ALE will only suggest so many possible matches for completion. The maximum +number of items can be controlled with |g:ale_completion_max_suggestions|. + +If you don't like some of the suggestions you see, you can filter them out +with |g:ale_completion_excluded_words| or |b:ale_completion_excluded_words|. + +The |ALEComplete| command can be used to show completion suggestions manually, +even when |g:ale_completion_enabled| is set to `0`. For manually requesting +completion information with Deoplete, consult Deoplete's documentation. + +ALE supports automatic imports from external modules. This behavior can be +disabled by setting the |g:ale_completion_autoimport| variable to `0`. +Disabling automatic imports can drop some or all completion items from +some LSP servers (e.g. eclipselsp). + +You can manually request imports for symbols at the cursor with the +|ALEImport| command. The word at the cursor must be an exact match for some +potential completion result which includes additional text to insert into the +current buffer, which ALE will assume is code for an import line. This command +can be useful when your code already contains something you need to import. + +You can execute other commands whenever ALE inserts some completion text with +the |ALECompletePost| event. + +When working with TypeScript files, ALE can remove warnings from your +completions by setting the |g:ale_completion_tsserver_remove_warnings| +variable to 1. + + *ale-completion-completeopt-bug* + +ALE Automatic completion implementation replaces |completeopt| before opening +the omnicomplete menu with . In some versions of Vim, the value set +for the option will not be respected. If you experience issues with Vim +automatically inserting text while you type, set the following option in +vimrc, and your issues should go away. > + + set completeopt=menu,menuone,preview,noselect,noinsert +< +Or alternatively, if you want to show documentation in popups: > + + set completeopt=menu,menuone,popup,noselect,noinsert +< + *ale-symbols* + +ALE provides a set of basic completion symbols. If you want to replace those +symbols with others, you can set the variable |g:ale_completion_symbols| with +a mapping of the type of completion to the symbol or other string that you +would like to use. An example here shows the available options for symbols > + + let g:ale_completion_symbols = { + \ 'text': '', + \ 'method': '', + \ 'function': '', + \ 'constructor': '', + \ 'field': 'ï‚­', + \ 'variable': 'ï„¡', + \ 'class': '', + \ 'interface': '', + \ 'module': '', + \ 'property': 'ï‚­', + \ 'unit': 'unit', + \ 'value': 'val', + \ 'enum': '', + \ 'keyword': 'keyword', + \ 'snippet': '', + \ 'color': 'color', + \ 'file': '', + \ 'reference': 'ref', + \ 'folder': 'î—¿', + \ 'enum member': '', + \ 'constant': 'ï„¡', + \ 'struct': '', + \ 'event': 'event', + \ 'operator': 'ï‚­', + \ 'type_parameter': 'type param', + \ '': 'v' + \ } +< +------------------------------------------------------------------------------- +5.2 Go To Definition *ale-go-to-definition* + +ALE supports jumping to the files and locations where symbols are defined +through any enabled LSP linters. The locations ALE will jump to depend on the +information returned by LSP servers. The |ALEGoToDefinition| command will jump +to the definition of symbols under the cursor. See the documentation for the +command for configuring how the location will be displayed. + +ALE will update Vim's |tagstack| automatically unless |g:ale_update_tagstack| is +set to `0`. + +------------------------------------------------------------------------------- +5.3 Go To Type Definition *ale-go-to-type-definition* + +ALE supports jumping to the files and locations where symbols' types are +defined through any enabled LSP linters. The locations ALE will jump to depend +on the information returned by LSP servers. The |ALEGoToTypeDefinition| +command will jump to the definition of symbols under the cursor. See the +documentation for the command for configuring how the location will be +displayed. + +------------------------------------------------------------------------------- +5.4 Go To Implementation *ale-go-to-implementation* + +ALE supports jumping to the files and locations where symbols are implemented +through any enabled LSP linters. The locations ALE will jump to depend on the +information returned by LSP servers. The |ALEGoToImplementation| command will +jump to the implementation of symbols under the cursor. See the documentation +for the command for configuring how the location will be displayed. + +------------------------------------------------------------------------------- +5.5 Find References *ale-find-references* + +ALE supports finding references for symbols though any enabled LSP linters +with the |ALEFindReferences| command. See the documentation for the command +for a full list of options. + +------------------------------------------------------------------------------- +5.6 Hovering *ale-hover* + +ALE supports "hover" information for printing brief information about symbols +at the cursor taken from LSP linters. The following commands are supported: + +|ALEHover| - Print information about the symbol at the cursor. + +Truncated information will be displayed when the cursor rests on a symbol by +default, as long as there are no problems on the same line. You can disable +this behavior by setting |g:ale_hover_cursor| to `0`. + +If |g:ale_set_balloons| is set to `1` and your version of Vim supports the +|balloon_show()| function, then "hover" information also show up when you move +the mouse over a symbol in a buffer. Diagnostic information will take priority +over hover information for balloons. If a line contains a problem, that +problem will be displayed in a balloon instead of hover information. + +Hover information can be displayed in the preview window instead by setting +|g:ale_hover_to_preview| to `1`. + +When using Neovim or Vim with |popupwin|, if |g:ale_hover_to_floating_preview| +or |g:ale_floating_preview| is set to 1, the hover information will show in a +floating window. The borders of the floating preview window can be customized +by setting |g:ale_floating_window_border|. + +For Vim 8.1+ terminals, mouse hovering is disabled by default. Enabling +|balloonexpr| commands in terminals can cause scrolling issues in terminals, +so ALE will not attempt to show balloons unless |g:ale_set_balloons| is set to +`1` before ALE is loaded. + +For enabling mouse support in terminals, you may have to change your mouse +settings. For example: > + + " Example mouse settings. + " You will need to try different settings, depending on your terminal. + set mouse=a + set ttymouse=xterm +< + +Documentation for symbols at the cursor can be retrieved using the +|ALEDocumentation| command. This command is only available for `tsserver`. + +------------------------------------------------------------------------------- +5.7 Symbol Search *ale-symbol-search* + +ALE supports searching for workspace symbols via LSP linters with the +|ALESymbolSearch| command. See the documentation for the command +for a full list of options. + +------------------------------------------------------------------------------- +5.8 Refactoring: Rename, Actions *ale-refactor* + +ALE supports renaming symbols in code such as variables or class names with +the |ALERename| command. + +`ALEFileRename` will rename file and fix import paths (tsserver only). + +|ALECodeAction| will execute actions on the cursor or applied to a visual +range selection, such as automatically fixing errors. + +Actions will appear in the right click mouse menu by default for GUI versions +of Vim, unless disabled by setting |g:ale_popup_menu_enabled| to `0`. + +Make sure to set your Vim to move the cursor position whenever you right +click, and enable the mouse menu: > + + set mouse=a + set mousemodel=popup_setpos +< +You may wish to remove some other menu items you don't want to see: > + + silent! aunmenu PopUp.Select\ Word + silent! aunmenu PopUp.Select\ Sentence + silent! aunmenu PopUp.Select\ Paragraph + silent! aunmenu PopUp.Select\ Line + silent! aunmenu PopUp.Select\ Block + silent! aunmenu PopUp.Select\ Blockwise + silent! aunmenu PopUp.Select\ All +< +=============================================================================== +6. Global Options *ale-options* + +g:airline#extensions#ale#enabled *g:airline#extensions#ale#enabled* + + Type: |Number| + Default: `1` + + Enables or disables the |airline|'s native extension for ale, which displays + warnings and errors in the status line, prefixed by + |airline#extensions#ale#error_symbol| and + |airline#extensions#ale#warning_symbol|. + + +g:ale_cache_executable_check_failures *g:ale_cache_executable_check_failures* + + Type: |Number| + Default: not set + + When set to `1`, ALE will cache failing executable checks for linters. By + default, only executable checks which succeed will be cached. + + When this option is set to `1`, Vim will have to be restarted after new + executables are installed for ALE to be able to run linters for those + executables. + + +g:ale_change_sign_column_color *g:ale_change_sign_column_color* + + Type: |Number| + Default: `0` + + When set to `1`, this option will set different highlights for the sign + column itself when ALE reports problems with a file. This option can be + combined with |g:ale_sign_column_always|. + + ALE uses the following highlight groups for highlighting the sign column: + + `ALESignColumnWithErrors` - Links to `error` by default. + `ALESignColumnWithoutErrors` - Uses the value for `SignColumn` by default. + + The sign column color can only be changed globally in Vim. The sign column + might produce unexpected results if editing different files in split + windows. + + +g:ale_close_preview_on_insert *g:ale_close_preview_on_insert* + + Type: |Number| + Default: `0` + + When this option is set to `1`, ALE's |preview-window| will be automatically + closed upon entering Insert Mode. This option can be used in combination + with |g:ale_cursor_detail| for automatically displaying the preview window + on problem lines, and automatically closing it again when editing text. + + This setting must be set to `1` before ALE is loaded for this behavior + to be enabled. See |ale-lint-settings-on-startup|. + + +g:ale_command_wrapper *g:ale_command_wrapper* + *b:ale_command_wrapper* + Type: |String| + Default: `''` + + An option for wrapping all commands that ALE runs, for linters, fixers, + and LSP commands. This option can be set globally, or for specific buffers. + + This option can be used to apply nice to all commands. For example: > + + " Prefix all commands with nice. + let g:ale_command_wrapper = 'nice -n5' +< + Use the |ALEInfo| command to view the commands that are run. All of the + arguments for commands will be put on the end of the wrapped command by + default. A `%*` marker can be used to spread the arguments in the wrapped + command. > + + " Has the same effect as the above. + let g:ale_command_wrapper = 'nice -n5 %*' +< + + For passing all of the arguments for a command as one argument to a wrapper, + `%@` can be used instead. > + + " Will result in say: /bin/bash -c 'other-wrapper -c "some command" -x' + let g:ale_command_wrapper = 'other-wrapper -c %@ -x' +< + For commands including `&&` or `;`, only the last command in the list will + be passed to the wrapper. `&&` is most commonly used in ALE to change the + working directory before running a command. + + +g:ale_completion_delay *g:ale_completion_delay* + + Type: |Number| + Default: `100` + + The number of milliseconds before ALE will send a request to a language + server for completions after you have finished typing. + + See |ale-completion| + + +g:ale_completion_enabled *g:ale_completion_enabled* + *b:ale_completion_enabled* + + Type: |Number| + Default: `0` + + When this option is set to `1`, completion support will be enabled. + + This setting must be set to `1` before ALE is loaded for this behavior + to be enabled. + + This setting should not be enabled if you wish to use ALE as a completion + source for other completion plugins. + + ALE automatic completion will not work when 'paste' is active. Only set + 'paste' when you are copy and pasting text into your buffers. + + A buffer-local version of this setting `b:ale_completion_enabled` can be set + to `0` to disable ALE's automatic completion support for a single buffer. + ALE's completion support must be enabled globally to be enabled locally. + + See |ale-completion| + + + *g:ale_completion_tsserver_remove_warnings* +g:ale_completion_tsserver_remove_warnings + + Type: |Number| + Default: `0` + + When this option is set to `0`, ALE will return all completion items, + including those that are a warning. Warnings can be excluded from completed + items by setting it to `1`. + + +g:ale_completion_autoimport *g:ale_completion_autoimport* + + Type: |Number| + Default: `1` + + When this option is set to `1`, ALE will try to automatically import + completion results from external modules. It can be disabled by setting it + to `0`. Some LSP servers include auto imports on every completion item so + disabling automatic imports may drop some or all completion items returnend + by it (e.g. eclipselsp). + + +g:ale_completion_excluded_words *g:ale_completion_excluded_words* + *b:ale_completion_excluded_words* + Type: |List| + Default: `[]` + + This option can be set to a list of |String| values for "words" to exclude + from completion results, as in the words for |complete-items|. The strings + will be matched exactly in a case-sensitive manner. (|==#|) + + This setting can be configured in ftplugin files with buffer variables, so + that different lists can be used for different filetypes. For example: > + + " In ~/.vim/ftplugin/typescript.vim + + " Don't suggest `it` or `describe` so we can use snippets for those words. + let b:ale_completion_excluded_words = ['it', 'describe'] +< + +g:ale_completion_symbols *g:ale_completion_symbols* + + Type: |Dictionary| + + + A mapping from completion types to symbols for completions. See + |ale-symbols| for more information. + + By default, this mapping only uses built in Vim completion kinds, but it can + be updated to use any unicode character for the completion kind. For + example: > + let g:ale_completion_symbols = { + \ 'text': '', + \ 'method': '', + \ 'function': '', + \ 'constructor': '', + \ 'field': 'ï‚­', + \ 'variable': 'ï„¡', + \ 'class': '', + \ 'interface': '', + \ 'module': '', + \ 'property': 'ï‚­', + \ 'unit': 'v', + \ 'value': 'v', + \ 'enum': 't', + \ 'keyword': 'v', + \ 'snippet': 'v', + \ 'color': 'v', + \ 'file': 'v', + \ 'reference': 'v', + \ 'folder': 'v', + \ 'enum_member': 'm', + \ 'constant': 'm', + \ 'struct': 't', + \ 'event': 'v', + \ 'operator': 'f', + \ 'type_parameter': 'p', + \ '': 'v' + \ }) +< + +g:ale_completion_max_suggestions *g:ale_completion_max_suggestions* + + Type: |Number| + Default: `50` + + The maximum number of items ALE will suggest in completion menus for + automatic completion. + + Setting this number higher will require more processing time, and may + suggest too much noise. Setting this number lower will require less + processing time, but some suggestions will not be included, so you might not + be able to see the suggestions you want. + + Adjust this option as needed, depending on the complexity of your codebase + and your available processing power. + +g:ale_cursor_detail *g:ale_cursor_detail* + + Type: |Number| + Default: `0` + + When this option is set to `1`, ALE's |preview-window| will be automatically + opened when the cursor moves onto lines with problems. ALE will search for + problems using the same logic that |g:ale_echo_cursor| uses. The preview + window will be closed automatically when you move away from the line. + + Messages are only displayed after a short delay. See |g:ale_echo_delay|. + + The preview window is opened without stealing focus, which means your cursor + will stay in the same buffer as it currently is. + + The preview window can be closed automatically upon entering Insert mode + by setting |g:ale_close_preview_on_insert| to `1`. + + Either this setting or |g:ale_echo_cursor| must be set to `1` before ALE is + loaded for messages to be displayed. See |ale-lint-settings-on-startup|. + + +g:ale_default_navigation *g:ale_default_navigation* + *b:ale_default_navigation* + + Type: |String| + Default: `'buffer'` + + The default method for navigating away from the current buffer to another + buffer, such as for |ALEFindReferences|, or |ALEGoToDefinition|. + + +g:ale_detail_to_floating_preview *g:ale_detail_to_floating_preview* + *b:ale_detail_to_floating_preview* + Type: |Number| + Default: `0` + + When this option is set to `1`, Neovim or Vim with |popupwin| will use a + floating window for ALEDetail output. + + +g:ale_disable_lsp *g:ale_disable_lsp* + *b:ale_disable_lsp* + + Type: |Number| + Default: `0` + + When this option is set to `1`, ALE ignores all linters powered by LSP, + and also `tsserver`. + + Please see also |ale-lsp|. + + +g:ale_echo_cursor *g:ale_echo_cursor* + + Type: |Number| + Default: `1` + + When this option is set to `1`, a truncated message will be echoed when a + cursor is near a warning or error. ALE will attempt to find the warning or + error at a column nearest to the cursor when the cursor is resting on a line + which contains a warning or error. This option can be set to `0` to disable + this behavior. + + Messages are only displayed after a short delay. See |g:ale_echo_delay|. + + The format of the message can be customized with |g:ale_echo_msg_format|. + + Either this setting or |g:ale_cursor_detail| must be set to `1` before ALE + is loaded for messages to be displayed. See |ale-lint-settings-on-startup|. + + +g:ale_echo_delay *g:ale_echo_delay* + *b:ale_echo_delay* + Type: |Number| + Default: `10` + + Given any integer, this option controls the number of milliseconds before + ALE will echo or preview a message for a problem near the cursor. + + The value can be increased to decrease the amount of processing ALE will do + for files displaying a large number of problems. + + +g:ale_echo_msg_error_str *g:ale_echo_msg_error_str* + + Type: |String| + Default: `'Error'` + + The string used for `%severity%` for errors. See |g:ale_echo_msg_format| + + +g:ale_echo_msg_format *g:ale_echo_msg_format* + *b:ale_echo_msg_format* + + Type: |String| + Default: `'%code: %%s'` + + This variable defines a message format for echoed messages. The following + sequences of characters will be replaced. + + `%s` - replaced with the text for the problem + `%...code...% `- replaced with the error code + `%linter%` - replaced with the name of the linter + `%severity%` - replaced with the severity of the problem (e.g. `Error`) + `%type%` - replaced with the type of the problem (e.g. `E`) + + The strings for `%severity%` can be configured with the following options. + + |g:ale_echo_msg_error_str| - Defaults to `'Error'` + |g:ale_echo_msg_info_str| - Defaults to `'Info'` + |g:ale_echo_msg_warning_str| - Defaults to `'Warning'` + + `%code%` is replaced with the error code, and replaced with an empty string + when there is no error code. Any extra characters between the percent signs + will be printed when an error code is present. For example, a message like + `(error code): message` will be printed for `'%(code): %%s'` and simply the + message will be printed when there is no code. + + |g:ale_echo_cursor| needs to be set to 1 for messages to be displayed. + + The echo message format can also be configured separately for each buffer, + so different formats can be used for different languages. (Say in ftplugin + files.) + + +g:ale_echo_msg_info_str *g:ale_echo_msg_info_str* + + Type: |String| + Default: `'Info'` + + The string used for `%severity%` for info. See |g:ale_echo_msg_format| + + +g:ale_echo_msg_log_str *g:ale_echo_msg_log_str* + + Type: |String| + Default: `'Log'` + + The string used for `%severity%` for log, used only for handling LSP show + message requests. See |g:ale_lsp_show_message_format| + + +g:ale_echo_msg_warning_str *g:ale_echo_msg_warning_str* + + Type: |String| + Default: `'Warning'` + + The string used for `%severity%` for warnings. See |g:ale_echo_msg_format| + + +g:ale_enabled *g:ale_enabled* + *b:ale_enabled* + + Type: |Number| + Default: `1` + + When set to `0`, this option will completely disable ALE, such that no + error checking will be performed, etc. ALE can be toggled on and off with + the |ALEToggle| command, which changes this option. + + ALE can be disabled in each buffer by setting `let b:ale_enabled = 0` + Disabling ALE based on filename patterns can be accomplished by setting + a regular expression for |g:ale_pattern_options|. For example: > + + " Disable linting for all minified JS files. + let g:ale_pattern_options = {'\.min.js$': {'ale_enabled': 0}} +< + + See |g:ale_pattern_options| for more information on that option. + + +g:ale_exclude_highlights *g:ale_exclude_highlights* + *b:ale_exclude_highlights* + + Type: |List| + Default: `[]` + + A list of regular expressions for matching against highlight messages to + remove. For example: > + + " Do not highlight messages matching strings like these. + let b:ale_exclude_highlights = ['line too long', 'foo.*bar'] +< + See also: |g:ale_set_highlights| + + +g:ale_fixers *g:ale_fixers* + *b:ale_fixers* + + Type: |Dictionary| + Default: `{}` + + A mapping from filetypes to |List| values for functions for fixing errors. + See |ale-fix| for more information. + + This variable can be overridden with variables in each buffer. + `b:ale_fixers` can be set to a |List| of callbacks instead, which can be + more convenient. + + A special `'*'` key be used as a wildcard filetype for configuring fixers + for every other type of file. For example: > + + " Fix Python files with 'bar'. + " Don't fix 'html' files. + " Fix everything else with 'foo'. + let g:ale_fixers = {'python': ['bar'], 'html': [], '*': ['foo']} +< + +g:ale_fix_on_save *g:ale_fix_on_save* + *b:ale_fix_on_save* + + Type: |Number| + Default: `0` + + When set to 1, ALE will fix files when they are saved. + + If |g:ale_lint_on_save| is set to 1, files will be checked with linters + after files are fixed, only when the buffer is open, or re-opened. Changes + to the file will be saved to the file on disk. + + Files will not be fixed on `:wq`, so you should check your code before + closing a buffer. + + Fixing files can be disabled or enabled for individual buffers by setting + `b:ale_fix_on_save` to `0` or `1`. + + Some fixers can be excluded from being run automatically when you save files + with the |g:ale_fix_on_save_ignore| setting. + + +g:ale_fix_on_save_ignore *g:ale_fix_on_save_ignore* + *b:ale_fix_on_save_ignore* + + Type: |Dictionary| or |List| + Default: `{}` + + Given a |Dictionary| mapping filetypes to |Lists| of fixers to ignore, or + just a |List| of fixers to ignore, exclude those fixers from being run + automatically when files are saved. + + You can disable some fixers in your ftplugin file: > + + " Disable fixers 'b' and 'c' when fixing on safe for this buffer. + let b:ale_fix_on_save_ignore = ['b', 'c'] + " Alternatively, define ignore lists for different filetypes. + let b:ale_fix_on_save_ignore = {'foo': ['b'], 'bar': ['c']} +< + You can disable some fixers globally per filetype like so: > + + let g:ale_fixers = {'foo': ['a', 'b'], 'bar': ['c', 'd']} + let g:ale_fix_on_save = 1 + " For filetype `foo.bar`, only fixers 'b' and 'd' will be run on save. + let g:ale_fix_on_save_ignore = {'foo': ['a'], 'bar': ['c']} + " Alternatively, disable these fixers on save for all filetypes. + let g:ale_fix_on_save_ignore = ['a', 'c'] +< + You can ignore fixers based on matching |Funcref| values too: > + + let g:AddBar = {buffer, lines -> lines + ['bar']} + let g:ale_fixers = {'foo': g:AddBar} + " The lambda fixer will be ignored, as it will be found in the ignore list. + let g:ale_fix_on_save_ignore = [g:AddBar] +< + +g:ale_floating_preview *g:ale_floating_preview* + + Type: |Number| + Default: `0` + + When set to `1`, Neovim or Vim with |popupwin| will use a floating window + for ale's preview window. + This is equivalent to setting |g:ale_hover_to_floating_preview| and + |g:ale_detail_to_floating_preview| to `1`. + + +g:ale_floating_preview_popup_opts *g:ale_floating_preview_popup_opts* + + Type: |String| or |Dictionary| + Default: `''` + + Either a dictionary of options or the string name of a function that returns a + dictionary of options. This will be used as an argument to |popup_create| for + Vim users or |nvim_open_win| for NeoVim users. Note that in either case, the + resulting dictionary is merged with ALE defaults rather than expliciting overriding + them. This only takes effect if |g:ale_floating_preview| is enabled. + + NOTE: for Vim users see |popup_create-arguments|, for NeoVim users see + |nvim_open_win| for argument details + + For example, to enhance popups with a title: > + + function! CustomOpts() abort { + let [l:info, l:loc] = ale#util#FindItemAtCursor(bufnr('')) + return {'title': ' ALE: ' . (l:loc.linter_name) . ' '} + endfunction +< + + +g:ale_floating_window_border *g:ale_floating_window_border* + + Type: |List| + Default: `['|', '-', '+', '+', '+', '+', '|', '-']` + + When set to `[]`, window borders are disabled. The elements in the list set + the the characters for the left side, top, top-left corner, top-right + corner, bottom-right corner, bottom-left corner, right side, and bottom of + the floating window, respectively. + + If the terminal supports Unicode, you might try setting the value to + ` ['│', '─', 'â•­', 'â•®', '╯', 'â•°', '│', '─']`, to make it look nicer. + + NOTE: For compatibility with previous versions, if the list does not have + elements for the right side and bottom, the left side and top will be used + instead. + + +g:ale_history_enabled *g:ale_history_enabled* + + Type: |Number| + Default: `1` + + When set to `1`, ALE will remember the last few commands which were run + for every buffer which is open. This information can be viewed with the + |ALEInfo| command. The size of the buffer can be controlled with the + |g:ale_max_buffer_history_size| option. + + This option can be disabled if storing a command history is not desired. + + +g:ale_history_log_output *g:ale_history_log_output* + + Type: |Number| + Default: `1` + + When set to `1`, ALE will store the output of commands which have completed + successfully in the command history, and the output will be displayed when + using |ALEInfo|. + + |g:ale_history_enabled| must be set to `1` for this output to be stored or + printed. + + Some memory will be consumed by this option. It is very useful for figuring + out what went wrong with linters, and for bug reports. Turn this option off + if you want to save on some memory usage. + + +g:ale_hover_cursor *g:ale_hover_cursor* + + Type: |Number| + Default: `1` + + If set to `1`, ALE will show truncated information in the echo line about + the symbol at the cursor automatically when the |CursorHold| event is fired. + The delay before requesting hover information is based on 'updatetime', as + with all |CursorHold| events. + + If there's a problem on the line where the cursor is resting, ALE will not + show any hover information. + + See |ale-hover| for more information on hover information. + + This setting must be set to `1` before ALE is loaded for this behavior + to be enabled. See |ale-lint-settings-on-startup|. + + +g:ale_hover_to_preview *g:ale_hover_to_preview* + *b:ale_hover_to_preview* + Type: |Number| + Default: `0` + + If set to `1`, hover messages will be displayed in the preview window, + instead of in balloons or the message line. + + +g:ale_hover_to_floating_preview *g:ale_hover_to_floating_preview* + *b:ale_hover_to_floating_preview* + Type: |Number| + Default: `0` + + If set to `1`, Neovim or Vim with |popupwin| will use floating windows for + hover messages. + + +g:ale_keep_list_window_open *g:ale_keep_list_window_open* + *b:ale_keep_list_window_open* + Type: |Number| + Default: `0` + + When set to `1`, this option will keep the loclist or quickfix windows event + after all warnings/errors have been removed for files. By default the + loclist or quickfix windows will be closed automatically when there are no + warnings or errors. + + See |g:ale_open_list| + + +g:ale_list_window_size *g:ale_list_window_size* + *b:ale_list_window_size* + Type: |Number| + Default: `10` + + This number configures the number of lines to set for the height of windows + opened automatically for ALE problems. The default of `10` matches the Vim + default height. + + See |g:ale_open_list| for information on automatically opening windows + for quickfix or the loclist. + + +g:ale_lint_delay *g:ale_lint_delay* + *b:ale_lint_delay* + Type: |Number| + Default: `200` + + This variable controls the milliseconds delay after which the linters will + be run after text is changed. This option is only meaningful with the + |g:ale_lint_on_text_changed| variable set to `always`, `insert`, or `normal`. + + A buffer-local option, `b:ale_lint_delay`, can be set to change the delay + for different buffers, such as in |ftplugin| files. + + +g:ale_lint_on_enter *g:ale_lint_on_enter* + + Type: |Number| + Default: `1` + + When this option is set to `1`, the |BufWinEnter| event will be used to + apply linters when buffers are first opened. If this is not desired, this + variable can be set to `0` in your vimrc file to disable this behavior. + + The |FileChangedShellPost| and |BufEnter| events will be used to check if + files have been changed outside of Vim. If a file is changed outside of + Vim, it will be checked when it is next opened. + + You should set this setting once before ALE is loaded, and restart Vim if + you want to change your preferences. See |ale-lint-settings-on-startup|. + + +g:ale_lint_on_filetype_changed *g:ale_lint_on_filetype_changed* + + Type: |Number| + Default: `1` + + This option will cause ALE to run when the filetype for a file is changed + after a buffer has first been loaded. A short delay will be used before + linting will be done, so the filetype can be changed quickly several times + in a row, but resulting in only one lint cycle. + + You should set this setting once before ALE is loaded, and restart Vim if + you want to change your preferences. See |ale-lint-settings-on-startup|. + + +g:ale_lint_on_save *g:ale_lint_on_save* + + Type: |Number| + Default: `1` + + This option will make ALE run the linters whenever a file is saved when it + it set to `1` in your vimrc file. This option can be used in combination + with the |g:ale_lint_on_enter| and |g:ale_lint_on_text_changed| options to + make ALE only check files after that have been saved, if that is what is + desired. + + +g:ale_lint_on_text_changed *g:ale_lint_on_text_changed* + + Type: |String| + Default: `'normal'` + + This option controls how ALE will check your files as you make changes. + The following values can be used. + + `'always'`, `'1'`, or `1` - Check buffers on |TextChanged| or |TextChangedI|. + `'normal'` - Check buffers only on |TextChanged|. + `'insert'` - Check buffers only on |TextChangedI|. + `'never'`, `'0'`, or `0` - Never check buffers on changes. + + ALE will check buffers after a short delay, with a timer which resets on + each change. The delay can be configured by adjusting the |g:ale_lint_delay| + variable. + *ale-linting-interrupts-mapping* + + Due to a bug in Vim, ALE can interrupt mappings with pending key presses, + per |timeoutlen|. If this happens, follow the advice for enabling + |g:ale_lint_on_insert_leave| below, and set this option to `'normal'`, or + disable it entirely. + + You should set this setting once before ALE is loaded, and restart Vim if + you want to change your preferences. See |ale-lint-settings-on-startup|. + + +g:ale_lint_on_insert_leave *g:ale_lint_on_insert_leave* + *b:ale_lint_on_insert_leave* + + Type: |Number| + Default: `1` + + When set to `1` in your vimrc file, this option will cause ALE to run + linters when you leave insert mode. + + ALE will not lint files when you escape insert mode with |CTRL-C| by + default. You can make ALE lint files with this option when you use |CTRL-C| + with the following mapping. > + + " Make using Ctrl+C do the same as Escape, to trigger autocmd commands + inoremap +< + A buffer-local version of this setting `b:ale_lint_on_insert_leave` can be + set to `0` to disable linting when leaving insert mode. The setting must + be enabled globally to be enabled locally. + + You should set this setting once before ALE is loaded, and restart Vim if + you want to change your preferences. See |ale-lint-settings-on-startup|. + + +g:ale_linter_aliases *g:ale_linter_aliases* + *b:ale_linter_aliases* + Type: |Dictionary| + Default: `{}` + + The |g:ale_linter_aliases| option can be used to set aliases from one + filetype to another. A given filetype can be mapped to use the linters + run for another given filetype. + + This |Dictionary| will be merged with a default dictionary containing the + following values: > + + { + \ 'Dockerfile': 'dockerfile', + \ 'csh': 'sh', + \ 'javascriptreact': ['javascript', 'jsx'], + \ 'plaintex': 'tex', + \ 'ps1': 'powershell', + \ 'rmarkdown': 'r', + \ 'rmd': 'r', + \ 'systemverilog': 'verilog', + \ 'typescriptreact': ['typescript', 'tsx'], + \ 'vader': ['vim', 'vader'], + \ 'verilog_systemverilog': ['verilog_systemverilog', 'verilog'], + \ 'vimwiki': 'markdown', + \ 'vue': ['vue', 'javascript'], + \ 'xsd': ['xsd', 'xml'], + \ 'xslt': ['xslt', 'xml'], + \ 'zsh': 'sh', + \} +< + For example, if you wish to map a new filetype `'foobar'` to run the `'php'` + linters, you could set the following: > + + let g:ale_linter_aliases = {'foobar': 'php'} +< + When combined with the |g:ale_linters| option, the original filetype + (`'foobar'`) will be used for determining which linters to run, + not the aliased type (`'php'`). This allows an aliased type to run a + different set of linters from the type it is being mapped to. + + Passing a list of filetypes is also supported. Say you want to lint + javascript and css embedded in HTML (using linters that support that). + You could alias `html` like so: + + `let g:ale_linter_aliases = {'html': ['html', 'javascript', 'css']}` + + Note that `html` itself was included as an alias. That is because aliases + will override the original linters for the aliased filetype. + + Linter aliases can be configured in each buffer with buffer-local variables. + ALE will first look for aliases for filetypes in the `b:ale_linter_aliases` + variable, then `g:ale_linter_aliases`, and then a default Dictionary. + + `b:ale_linter_aliases` can be set to a |List| or a |String|, to tell ALE to + load the linters for specific filetypes for a given buffer. > + + let b:ale_linter_aliases = ['html', 'javascript', 'css'] + " OR, Alias a filetype to only a single filetype with a String. + let b:ale_linter_aliases = 'javascript' +< + No linters will be loaded when the buffer's filetype is empty. + + +g:ale_filename_mappings *g:ale_filename_mappings* + *b:ale_filename_mappings* + + Type: |Dictionary| or |List| + Default: `{}` + + Either a |Dictionary| mapping a linter or fixer name, as displayed in + |:ALEInfo|, to a |List| of two-item |List|s for filename mappings, or just a + |List| of two-item |List|s. When given some paths to files, the value of + this setting will be used to convert filenames on a local file system to + filenames on some remote file system, such as paths in a Docker image, + virtual machine, or network drive. + + For example: > + + let g:ale_filename_mappings = { + \ 'pylint': [ + \ ['/home/john/proj', '/data'], + \ ], + \} +< + With the above configuration, a filename such as `/home/john/proj/foo.py` + will be provided to the linter/fixer as `/data/foo.py`, and paths parsed + from linter results such as `/data/foo.py` will be converted back to + `/home/john/proj/foo.py`. + + You can use `*` as to apply a |List| of filename mappings to all other + linters or fixers not otherwise matched. > + + " Use one List of paths for pylint. + " Use another List of paths for everything else. + let g:ale_filename_mappings = { + \ 'pylint': [ + \ ['/home/john/proj', '/data'], + \ ], + \ '*': [ + \ ['/home/john/proj', '/other-data'], + \ ], + \} +< + If you just want every single linter or fixer to use the same filename + mapping, you can just use a |List|. > + + " Same as above, but for ALL linters and fixers. + let g:ale_filename_mappings = [ + \ ['/home/john/proj', '/data'], + \] +< + You can provide many such filename paths for multiple projects. Paths are + matched by checking if the start of a file path matches the given strings, + in a case-sensitive manner. Earlier entries in the |List| will be tried + before later entries when mapping to a given file system. + + Buffer-local options can be set to the same values to override the global + options, such as in |ftplugin| files. + + NOTE: Only fixers registered with a short name can support filename mapping + by their fixer names. See |ale-fix|. Filename mappings set for all tools by + using only a |List| for the setting will also be applied to fixers not in + the registry. + + NOTE: In order for this filename mapping to work correctly, linters and + fixers must exclusively determine paths to files to lint or fix via ALE + command formatting as per |ale-command-format-strings|, and paths parsed + from linter files must be provided in `filename` keys if a linter returns + results for more than one file at a time, as per |ale-loclist-format|. If + you discover a linter or fixer which does not behave properly, please report + it as an issue. + + If you are running a linter or fixer through Docker or another remote file + system, you may have to mount your temporary directory, which you can + discover with the following command: > + + :echo fnamemodify(tempname(), ':h:h') +< + You should provide a mapping from this temporary directory to whatever you + mount this directory to in Docker, or whatever remote file system you are + working with. + + You can inspect the filename mappings ALE will use with the + |ale#GetFilenameMappings()| function. + + +g:ale_linters *g:ale_linters* + *b:ale_linters* + Type: |Dictionary| + Default: `{}` + + The |g:ale_linters| option sets a |Dictionary| mapping a filetype to a + |List| of linter programs to be run when checking particular filetypes. + + This |Dictionary| will be merged with a default dictionary containing the + following values: > + + { + \ 'apkbuild': ['apkbuild_lint', 'secfixes_check'], + \ 'csh': ['shell'], + \ 'elixir': ['credo', 'dialyxir', 'dogma'], + \ 'go': ['gofmt', 'golint', 'gopls', 'govet'], + \ 'hack': ['hack'], + \ 'help': [], + \ 'inko': ['inko'], + \ 'json': ['jsonlint', 'spectral'], + \ 'json': ['jsonlint', 'spectral', 'vscodejson'], + \ 'json5': [], + \ 'jsonc': [], + \ 'perl': ['perlcritic'], + \ 'perl6': [], + \ 'python': ['flake8', 'mypy', 'pylint', 'pyright', 'ruff'], + \ 'rust': ['cargo', 'rls'], + \ 'spec': [], + \ 'text': [], + \ 'vader': ['vimls'], + \ 'vue': ['eslint', 'vls'], + \ 'zsh': ['shell'], + \ 'v': ['v'], + \ 'yaml': ['spectral', 'yaml-language-server', 'yamllint'], + \} +< + This option can be used to enable only a particular set of linters for a + file. For example, you can enable only `eslint` for JavaScript files: > + + let g:ale_linters = {'javascript': ['eslint']} +< + If you want to disable all linters for a particular filetype, you can pass + an empty list of linters as the value: > + + let g:ale_linters = {'javascript': []} +< + All linters will be run for unspecified filetypes. All available linters can + be enabled explicitly for a given filetype by passing the string `'all'`, + instead of a List. > + + let g:ale_linters = {'c': 'all'} +< + Linters can be configured in each buffer with buffer-local variables. ALE + will first look for linters for filetypes in the `b:ale_linters` variable, + then `g:ale_linters`, and then the default Dictionary mentioned above. + + `b:ale_linters` can be set to a List, or the string `'all'`. When linters + for two different filetypes share the same name, the first linter loaded + will be used. Any ambiguity can be resolved by using a Dictionary specifying + which linter to run for which filetype instead. > + + " Use ESLint for the buffer if the filetype includes 'javascript'. + let b:ale_linters = {'javascript': ['eslint'], 'html': ['tidy']} + " Use a List for the same setting. This will work in most cases. + let b:ale_linters = ['eslint', 'tidy'] + " Disable all linters for the buffer. + let b:ale_linters = [] + " Explicitly enable all available linters for the filetype. + let b:ale_linters = 'all' +< + ALE can be configured to disable all linters unless otherwise specified with + `g:ale_enabled` or `b:ale_enabled` with the option |g:ale_linters_explicit|. + + +g:ale_linters_explicit *g:ale_linters_explicit* + + Type: |Number| + Default: `0` + + When set to `1`, only the linters from |g:ale_linters| and |b:ale_linters| + will be enabled. The default behavior for ALE is to enable as many linters + as possible, unless otherwise specified. + + +g:ale_linters_ignore *g:ale_linters_ignore* + *b:ale_linters_ignore* + + Type: |Dictionary| or |List| + Default: `{}` + + Linters to ignore. Commands for ignored linters will not be run, and + diagnostics for LSP linters will be ignored. (See |ale-lsp|) + + This setting can be set to a |Dictionary| mapping filetypes to linter names, + just like |g:ale_linters|, to list linters to ignore. Ignore lists will be + applied after everything else. > + + " Select flake8 and pylint, and ignore pylint, so only flake8 is run. + let g:ale_linters = {'python': ['flake8', 'pylint']} + let g:ale_linters_ignore = {'python': ['pylint']} +< + This setting can be set to simply a |List| of linter names, which is + especially more convenient when using the setting in ftplugin files for + particular buffers. > + + " The same as above, in a ftplugin/python.vim. + let b:ale_linters = ['flake8', 'pylint'] + let b:ale_linters_ignore = ['pylint'] +< + +g:ale_list_vertical *g:ale_list_vertical* + *b:ale_list_vertical* + Type: |Number| + Default: `0` + + When set to `1`, this will cause ALE to open any windows (loclist or + quickfix) vertically instead of horizontally (|vert| |lopen|) or (|vert| + |copen|) + + +g:ale_loclist_msg_format *g:ale_loclist_msg_format* + *b:ale_loclist_msg_format* + + Type: |String| + Default: `g:ale_echo_msg_format` + + This option is the same as |g:ale_echo_msg_format|, but for formatting the + message used for the loclist and the quickfix list. + + The strings for configuring `%severity%` are also used for this option. + + +g:ale_lsp_show_message_format *g:ale_lsp_show_message_format* + + Type: |String| + Default: `'%severity%:%linter%: %s'` + + This variable defines the format that messages received from an LSP will + have when echoed. The following sequences of characters will be replaced. + + `%s` - replaced with the message text + `%linter%` - replaced with the name of the linter + `%severity%` - replaced with the severity of the message + + The strings for `%severity%` levels "error", "info" and "warning" are shared + with |g:ale_echo_msg_format|. Severity "log" is unique to + |g:ale_lsp_show_message_format| and it can be configured via + + |g:ale_echo_msg_log_str| - Defaults to `'Log'` + + Please note that |g:ale_lsp_show_message_format| *can not* be configured + separately for each buffer like |g:ale_echo_msg_format| can. + + +g:ale_lsp_show_message_severity *g:ale_lsp_show_message_severity* + + Type: |String| + Default: `'error'` + + This variable defines the minimum severity level an LSP message needs to be + displayed. Messages below this level are discarded; please note that + messages with `Log` severity level are always discarded. + + Possible values follow the LSP spec `MessageType` definition: + + `'error'` - Displays only errors. + `'warning'` - Displays errors and warnings. + `'information'` - Displays errors, warnings and infos + `'log'` - Same as `'information'` + `'disabled'` - Doesn't display any information at all. + + +g:ale_lsp_suggestions *g:ale_lsp_suggestions* + + Type: |Number| + Default: `0` + + If set to `1`, show hints/suggestions from LSP servers or tsserver, in + addition to warnings and errors. + + +g:ale_max_buffer_history_size *g:ale_max_buffer_history_size* + + Type: |Number| + Default: `20` + + This setting controls the maximum number of commands which will be stored in + the command history used for |ALEInfo|. Command history will be rotated in + a FIFO manner. If set to a number <= 0, then the history will be + continuously set to an empty |List|. + + History can be disabled completely with |g:ale_history_enabled|. + + +g:ale_max_signs *g:ale_max_signs* + *b:ale_max_signs* + Type: |Number| + Default: `-1` + + When set to any positive integer, ALE will not render any more than the + given number of signs for any one buffer. + + When set to `0`, no signs will be set, but sign processing will still be + done, so existing signs can be removed. + + When set to any other value, no limit will be imposed on the number of signs + set. + + For disabling sign processing, see |g:ale_set_signs|. + + +g:ale_maximum_file_size *g:ale_maximum_file_size* + *b:ale_maximum_file_size* + Type: |Number| + Default: not set + + A maximum file size in bytes for ALE to check. If set to any positive + number, ALE will skip checking files larger than the given size. + + +g:ale_open_list *g:ale_open_list* + *b:ale_open_list* + Type: |Number| or |String| + Default: `0` + + When set to `1`, this will cause ALE to automatically open a window for the + loclist (|lopen|) or for the quickfix list instead if |g:ale_set_quickfix| + is `1`. (|copen|) + + When set to any higher numberical value, ALE will only open the window when + the number of warnings or errors are at least that many. + + When set to `'on_save'`, ALE will only open the loclist after buffers have + been saved. The list will be opened some time after buffers are saved and + any linter for a buffer returns results. + + The window will be kept open until all warnings or errors are cleared, + including those not set by ALE, unless |g:ale_keep_list_window_open| is set + to `1`, in which case the window will be kept open when no problems are + found. + + The window size can be configured with |g:ale_list_window_size|. + + Windows can be opened vertically with |g:ale_list_vertical|. + + If you want to close the loclist window automatically when the buffer is + closed, you can set up the following |autocmd| command: > + + augroup CloseLoclistWindowGroup + autocmd! + autocmd QuitPre * if empty(&buftype) | lclose | endif + augroup END + +< +g:ale_pattern_options *g:ale_pattern_options* + + Type: |Dictionary| + Default: not set + + This option maps regular expression patterns to |Dictionary| values for + buffer variables. This option can be set to automatically configure + different settings for different files. For example: > + + " Use just ESLint for linting and fixing files which end in '.foo.js' + let g:ale_pattern_options = { + \ '\.foo\.js$': { + \ 'ale_linters': ['eslint'], + \ 'ale_fixers': ['eslint'], + \ }, + \} +< + See |b:ale_linters| and |b:ale_fixers| for information for those options. + + Filenames are matched with |match()|, and patterns depend on the |magic| + setting, unless prefixed with the special escape sequences like `'\v'`, etc. + The patterns can match any part of a filename. The absolute path of the + filename will be used for matching, taken from `expand('%:p')`. + + The options for every match for the filename will be applied, with the + pattern keys sorted in alphabetical order. Options for `'zebra'` will + override the options for `'alpha'` for a filename `alpha-zebra`. + + +g:ale_pattern_options_enabled *g:ale_pattern_options_enabled* + + Type: |Number| + Default: not set + + This option can be used for disabling pattern options. If set to `0`, ALE + will not set buffer variables per |g:ale_pattern_options|. + + +g:ale_popup_menu_enabled *g:ale_popup_menu_enabled* + + Type: |Number| + Default: `has('gui_running')` + + When this option is set to `1`, ALE will show code actions and rename + capabilities in the right click mouse menu when there's a LSP server or + tsserver available. See |ale-refactor|. + + This feature is only supported in GUI versions of Vim. + + This setting must be set to `1` before ALE is loaded for this behavior + to be enabled. See |ale-lint-settings-on-startup|. + + +g:ale_rename_tsserver_find_in_comments *g:ale_rename_tsserver_find_in_comments* + + Type: |Number| + Default: `0` + + If enabled, this option will tell tsserver to find and replace text in + comments when calling |ALERename|. It can be enabled by settings the value + to `1`. + + +g:ale_rename_tsserver_find_in_strings *g:ale_rename_tsserver_find_in_strings* + + + Type: |Number| + Default: `0` + + If enabled, this option will tell tsserver to find and replace text in + strings when calling |ALERename|. It can be enabled by settings the value to + `1`. + + +g:ale_root *g:ale_root* + *b:ale_root* + + Type: |Dictionary| or |String| + Default: `{}` + + This option is used to determine the project root for a linter. If the value + is a |Dictionary|, it maps a linter to either a |String| containing the + project root or a |Funcref| to call to look up the root. The |Funcref| is + provided the buffer number as its argument. + + The buffer-specific variable may additionally be a string containing the + project root itself. + + If neither variable yields a result, a linter-specific function is invoked to + detect a project root. If this, too, yields no result, and the linter is an + LSP linter, it will not run. + + +g:ale_set_balloons *g:ale_set_balloons* + *b:ale_set_balloons* + + Type: |Number| or |String| + Default: `has('balloon_eval') && has('gui_running')` + + When this option is set to `1`, balloon messages will be displayed for + problems or hover information if available. + + Problems nearest to the line the mouse cursor is over will be displayed. If + there are no problems to show, and one of the linters is an LSP linter + supporting "Hover" information, per |ale-hover|, then brief information + about the symbol under the cursor will be displayed in a balloon. + + This option can be set to `'hover'` to only enable balloons for hover + message, so diagnostics are never shown in balloons. You may wish to + configure use this setting only in GUI Vim like so: > + + let g:ale_set_balloons = has('gui_running') ? 'hover' : 0 +< + + Balloons can be enabled for terminal versions of Vim that support balloons, + but some versions of Vim will produce strange mouse behavior when balloons + are enabled. To configure balloons for your terminal, you should first + configure your |ttymouse| setting, and then consider setting + `g:ale_set_balloons` to `1` before ALE is loaded. + + `b:ale_set_balloons` can be set to `0` to disable balloons for a buffer. + Balloons cannot be enabled for a specific buffer when not initially enabled + globally. + + Balloons will not be shown when |g:ale_enabled| or |b:ale_enabled| is `0`. + + +g:ale_set_balloons_legacy_echo *g:ale_set_balloons_legacy_echo* + *b:ale_set_balloons_legacy_echo* + Type: |Number| + Default: not set + + If set to `1`, moving your mouse over documents in Vim will make ALE ask + `tsserver` or `LSP` servers for information about the symbol where the mouse + cursor is, and print that information into Vim's echo line. This is an + option for supporting older versions of Vim which do not properly support + balloons in an asynchronous manner. + + If your version of Vim supports the |balloon_show| function, then this + option does nothing meaningful. + + +g:ale_set_highlights *g:ale_set_highlights* + + Type: |Number| + Default: `has('syntax')` + + When this option is set to `1`, highlights will be set for problems. + + ALE will use the following highlight groups for problems: + + |ALEError| - Items with `'type': 'E'` + |ALEWarning| - Items with `'type': 'W'` + |ALEInfo.| - Items with `'type': 'I'` + |ALEStyleError| - Items with `'type': 'E'` and `'sub_type': 'style'` + |ALEStyleWarning| - Items with `'type': 'W'` and `'sub_type': 'style'` + + When |g:ale_set_signs| is set to `0`, the following highlights for entire + lines will be set. + + |ALEErrorLine| - All items with `'type': 'E'` + |ALEWarningLine| - All items with `'type': 'W'` + |ALEInfoLine| - All items with `'type': 'I'` + + Vim can only highlight the characters up to the last column in a buffer for + match highlights, whereas the line highlights when signs are enabled will + run to the edge of the screen. + + Highlights can be excluded with the |g:ale_exclude_highlights| option. + + +g:ale_set_loclist *g:ale_set_loclist* + + Type: |Number| + Default: `1` + + When this option is set to `1`, the |loclist| will be populated with any + warnings and errors which are found by ALE. This feature can be used to + implement jumping between errors through typical use of |lnext| and |lprev|. + + +g:ale_set_quickfix *g:ale_set_quickfix* + + Type: |Number| + Default: `0` + + When this option is set to `1`, the |quickfix| list will be populated with + any problems which are found by ALE, instead of the |loclist|. The loclist + will never be populated when this option is on. + + Problems from every buffer ALE has checked will be included in the quickfix + list, which can be checked with |:copen|. Problems will be de-duplicated. + + This feature should not be used in combination with tools for searching for + matches and commands like |:cfdo|, as ALE will replace the quickfix list + pretty frequently. If you wish to use such tools, you should populate the + loclist or use |ALEPopulateQuickfix| instead. + + +g:ale_set_signs *g:ale_set_signs* + + Type: |Number| + Default: `has('signs')` + + When this option is set to `1`, the |sign| column will be populated with + signs marking where problems appear in the file. + + ALE will use the following highlight groups for problems: + + |ALEErrorSign| - Items with `'type': 'E'` + |ALEWarningSign| - Items with `'type': 'W'` + |ALEInfoSign| - Items with `'type': 'I'` + |ALEStyleErrorSign| - Items with `'type': 'E'` and `'sub_type': 'style'` + |ALEStyleWarningSign| - Items with `'type': 'W'` and `'sub_type': 'style'` + + In addition to the style of the signs, the style of lines where signs appear + can be configured with the following highlights: + + |ALEErrorLine| - All items with `'type': 'E'` + |ALEWarningLine| - All items with `'type': 'W'` + |ALEInfoLine| - All items with `'type': 'I'` + + With Neovim 0.3.2 or higher, ALE can use the `numhl` option to highlight the + 'number' column. It uses the following highlight groups. + + |ALEErrorSignLineNr| - Items with `'type': 'E'` + |ALEWarningSignLineNr| - Items with `'type': 'W'` + |ALEInfoSignLineNr| - Items with `'type': 'I'` + |ALEStyleErrorSignLineNr| - Items with `'type': 'E'` and `'sub_type': 'style'` + |ALEStyleWarningSignLineNr| - Items with `'type': 'W'` and `'sub_type': 'style'` + + To enable line number highlighting |g:ale_sign_highlight_linenrs| must be + set to `1` before ALE is loaded. + + The markers for the highlights can be customized with the following options: + + |g:ale_sign_error| + |g:ale_sign_warning| + |g:ale_sign_info| + |g:ale_sign_style_error| + |g:ale_sign_style_warning| + + When multiple problems exist on the same line, the signs will take + precedence in the order above, from highest to lowest. + + To limit the number of signs ALE will set, see |g:ale_max_signs|. + + +g:ale_sign_priority *g:ale_sign_priority* + + Type: |Number| + Default: `30` + + From Neovim 0.4.0 and Vim 8.1, ALE can set sign priority to all signs. The + larger this value is, the higher priority ALE signs have over other plugin + signs. See |sign-priority| for further details on how priority works. + + +g:ale_shell *g:ale_shell* + *b:ale_shell* + + Type: |String| + Default: not set + + Override the shell used by ALE for executing commands. ALE uses 'shell' by + default, but falls back in `/bin/sh` if the default shell looks like `fish` + or `pwsh`, which are not compatible with all of the commands run by ALE. The + shell specified with this option will be used even if it might not work in + all cases. + + For Windows, ALE uses `cmd` when this option isn't set. Setting this option + will apply shell escaping to the command string, even on Windows. + + NOTE: Consider setting |g:ale_shell_arguments| if this option is defined. + + +g:ale_shell_arguments *g:ale_shell_arguments* + *b:ale_shell_arguments* + + Type: |String| + Default: not set + + This option specifies the arguments to use for executing a command with a + custom shell, per |g:ale_shell|. If this option is not set, 'shellcmdflag' + will be used instead. + + +g:ale_sign_column_always *g:ale_sign_column_always* + + Type: |Number| + Default: `0` + + By default, the sign gutter will disappear when all warnings and errors have + been fixed for a file. When this option is set to `1`, the sign column will + remain open. This can be preferable if you don't want the text in your file + to move around as you edit a file. + + +g:ale_sign_error *g:ale_sign_error* + + Type: |String| + Default: `'>>'` + + The sign for errors in the sign gutter. + + +g:ale_sign_info *g:ale_sign_info* + + Type: |String| + Default: `g:ale_sign_warning` + + The sign for "info" markers in the sign gutter. + + +g:ale_sign_style_error *g:ale_sign_style_error* + + Type: |String| + Default: `g:ale_sign_error` + + The sign for style errors in the sign gutter. + + +g:ale_sign_style_warning *g:ale_sign_style_warning* + + Type: |String| + Default: `g:ale_sign_warning` + + The sign for style warnings in the sign gutter. + + +g:ale_sign_offset *g:ale_sign_offset* + + Type: |Number| + Default: `1000000` + + This variable controls offset from which numeric IDs will be generated for + new signs. Signs cannot share the same ID values, so when two Vim plugins + set signs at the same time, the IDs have to be configured such that they do + not conflict with one another. If the IDs used by ALE are found to conflict + with some other plugin, this offset value can be changed, and hopefully both + plugins will work together. See |sign-place| for more information on how + signs are set. + + +g:ale_sign_warning *g:ale_sign_warning* + + Type: |String| + Default: `'--'` + + The sign for warnings in the sign gutter. + + +g:ale_sign_highlight_linenrs *g:ale_sign_highlight_linenrs* + + Type: |Number| + Default: `0` + + When set to `1`, this option enables highlighting problems on the 'number' + column in Vim versions that support `numhl` highlights. This option must be + configured before ALE is loaded. + + +g:ale_update_tagstack *g:ale_update_tagstack* + *b:ale_update_tagstack* + Type: |Number| + Default: `1` + + This option can be set to disable updating Vim's |tagstack| automatically. + + +g:ale_type_map *g:ale_type_map* + *b:ale_type_map* + Type: |Dictionary| + Default: `{}` + + This option can be set re-map problem types for linters. Each key in the + |Dictionary| should be the name of a linter, and each value must be a + |Dictionary| mapping problem types from one type to another. The following + types are supported: + + `'E'` - `{'type': 'E'}` + `'ES'` - `{'type': 'E', 'sub_type': 'style'}` + `'W'` - `{'type': 'W'}` + `'WS'` - `{'type': 'W', 'sub_type': 'style'}` + `'I'` - `{'type': 'I'}` + + For example, if you want to turn flake8 errors into warnings, you can write + the following: > + + let g:ale_type_map = {'flake8': {'ES': 'WS', 'E': 'W'}} +< + If you wanted to turn style errors and warnings into regular errors and + warnings, you can write the following: > + + let g:ale_type_map = {'flake8': {'ES': 'E', 'WS': 'W'}} +< + Type maps can be set per-buffer with `b:ale_type_map`. + + +g:ale_use_global_executables *g:ale_use_global_executables* + + Type: |Number| + Default: not set + + This option can be set to change the default for all `_use_global` options. + This option must be set before ALE is loaded, preferably in a vimrc file. + + See |ale-integrations-local-executables| for more information on those + options. + + +g:ale_virtualtext_cursor *g:ale_virtualtext_cursor* + + Type: |Number| + Default: `'all'` (if supported, otherwise `'disabled'`) + + This option controls how ALE will display problems using |virtual-text|. + The following values can be used. + + `'all'`, `'2'`, or `2` - Show problems for all lines. + `'current'`, `'1'`, or `1` - Show problems for the current line. + `'disabled'`, `'0'`, or `0` - Do not show problems with virtual-text. + + Messages are only displayed after a short delay. See |g:ale_virtualtext_delay|. + + Messages can be prefixed prefixed with a string. See |g:ale_virtualtext_prefix|. + + ALE will use the following highlight groups for problems: + + |ALEVirtualTextError| - Items with `'type': 'E'` + |ALEVirtualTextWarning| - Items with `'type': 'W'` + |ALEVirtualTextInfo| - Items with `'type': 'I'` + |ALEVirtualTextStyleError| - Items with `'type': 'E'` and `'sub_type': 'style'` + |ALEVirtualTextStyleWarning| - Items with `'type': 'W'` and `'sub_type': 'style'` + + +g:ale_virtualtext_delay *g:ale_virtualtext_delay* + *b:ale_virtualtext_delay* + Type: |Number| + Default: `10` + + Given any integer, this option controls the number of milliseconds before + ALE will show a message for a problem near the cursor. + + The value can be increased to decrease the amount of processing ALE will do + for files displaying a large number of problems. + + +g:ale_virtualtext_prefix *g:ale_virtualtext_prefix* + *b:ale_virtualtext_prefix* + Type: |String| + Default: `'%comment% %type%: '` + + Prefix to be used with |g:ale_virtualtext_cursor|. + + This setting can be changed in each buffer with `b:ale_virtualtext_prefix`. + + All of the same format markers used for |g:ale_echo_msg_format| can be used + for defining the prefix, including some additional sequences of characters. + + `%comment%` - replaced with comment characters in the current language + + ALE will read the comment characters from |&commentstring|, reading only the + part before `%s`, with whitespace trimmed. If comment syntax cannot be + pulled from |&commentstring|, ALE will default to `'#'`. + + +g:ale_virtualenv_dir_names *g:ale_virtualenv_dir_names* + *b:ale_virtualenv_dir_names* + + Type: |List| + Default: `['.env', '.venv', 'env', 've-py3', 've', 'virtualenv', 'venv']` + + A list of directory names to be used when searching upwards from Python + files to discover virtulenv directories with. + + For directory named `'foo'`, ALE will search for `'foo/bin/activate'` + (`foo\Scripts\activate\` on Windows) in all directories on and above the + directory containing the Python file to find virtualenv paths. + + +g:ale_warn_about_trailing_blank_lines *g:ale_warn_about_trailing_blank_lines* + *b:ale_warn_about_trailing_blank_lines* + + Type: |Number| + Default: `1` + + When this option is set to `1`, warnings about trailing blank lines will be + shown. + + This option behaves similarly to |g:ale_warn_about_trailing_whitespace|. + + +g:ale_warn_about_trailing_whitespace *g:ale_warn_about_trailing_whitespace* + *b:ale_warn_about_trailing_whitespace* + + Type: |Number| + Default: `1` + + When this option is set to `1`, warnings relating to trailing whitespace on + lines will be shown. If warnings are too irritating while editing buffers, + and you have configured Vim to automatically remove trailing whitespace, + you can disable these warnings by setting this option to `0`. + + Not all linters may respect this option. If a linter does not, please file a + bug report, and it may be possible to add such support. + + This option may be configured on a per buffer basis. + + +g:ale_windows_node_executable_path *g:ale_windows_node_executable_path* + *b:ale_windows_node_executable_path* + + Type: |String| + Default: `'node.exe'` + + This variable is used as the path to the executable to use for executing + scripts with Node.js on Windows. + + For Windows, any file with a `.js` file extension needs to be executed with + the node executable explicitly. Otherwise, Windows could try and open the + scripts with other applications, like a text editor. Therefore, these + scripts are executed with whatever executable is configured with this + setting. + + +------------------------------------------------------------------------------- +6.1. Highlights *ale-highlights* + +ALEError *ALEError* + + Default: `highlight link ALEError SpellBad` + + The highlight for highlighted errors. See |g:ale_set_highlights|. + + +ALEErrorLine *ALEErrorLine* + + Default: Undefined + + The highlight for an entire line where errors appear. Only the first + line for a problem will be highlighted. + + See |g:ale_set_signs| and |g:ale_set_highlights|. + + +ALEErrorSign *ALEErrorSign* + + Default: `highlight link ALEErrorSign error` + + The highlight for error signs. See |g:ale_set_signs|. + + +ALEErrorSignLineNr *ALEErrorSignLineNr* + + Default: `highlight link ALEErrorSignLineNr CursorLineNr` + + The highlight for error signs. See |g:ale_set_signs|. + + NOTE: This highlight is only available on Neovim 0.3.2 or higher. + + +ALEInfo *ALEInfo.* + *ALEInfo-highlight* + Default: `highlight link ALEInfo ALEWarning` + + The highlight for highlighted info messages. See |g:ale_set_highlights|. + + +ALEInfoSign *ALEInfoSign* + + Default: `highlight link ALEInfoSign ALEWarningSign` + + The highlight for info message signs. See |g:ale_set_signs|. + + +ALEInfoLine *ALEInfoLine* + + Default: Undefined + + The highlight for entire lines where info messages appear. Only the first + line for a problem will be highlighted. + + See |g:ale_set_signs| and |g:ale_set_highlights|. + + +ALEInfoSignLineNr *ALEInfoSignLineNr* + + Default: `highlight link ALEInfoSignLineNr CursorLineNr` + + The highlight for error signs. See |g:ale_set_signs|. + + NOTE: This highlight is only available on Neovim 0.3.2 or higher. + + +ALEStyleError *ALEStyleError* + + Default: `highlight link ALEStyleError ALEError` + + The highlight for highlighted style errors. See |g:ale_set_highlights|. + + +ALEStyleErrorSign *ALEStyleErrorSign* + + Default: `highlight link ALEStyleErrorSign ALEErrorSign` + + The highlight for style error signs. See |g:ale_set_signs|. + + +ALEStyleErrorSignLineNr *ALEStyleErrorSignLineNr* + + Default: `highlight link ALEStyleErrorSignLineNr CursorLineNr` + + The highlight for error signs. See |g:ale_set_signs|. + + NOTE: This highlight is only available on Neovim 0.3.2 or higher. + + +ALEStyleWarning *ALEStyleWarning* + + Default: `highlight link ALEStyleWarning ALEError` + + The highlight for highlighted style warnings. See |g:ale_set_highlights|. + + +ALEStyleWarningSign *ALEStyleWarningSign* + + Default: `highlight link ALEStyleWarningSign ALEWarningSign` + + The highlight for style warning signs. See |g:ale_set_signs|. + + +ALEStyleWarningSignLineNr *ALEStyleWarningSignLineNr* + + Default: `highlight link ALEStyleWarningSignLineNr CursorLineNr` + + The highlight for error signs. See |g:ale_set_signs|. + + NOTE: This highlight is only available on Neovim 0.3.2 or higher. + + +ALEVirtualTextError *ALEVirtualTextError* + + Default: `highlight link ALEVirtualTextError Comment` + + The highlight for virtualtext errors. See |g:ale_virtualtext_cursor|. + + +ALEVirtualTextInfo *ALEVirtualTextInfo* + + Default: `highlight link ALEVirtualTextInfo ALEVirtualTextWarning` + + The highlight for virtualtext info. See |g:ale_virtualtext_cursor|. + + +ALEVirtualTextStyleError *ALEVirtualTextStyleError* + + Default: `highlight link ALEVirtualTextStyleError ALEVirtualTextError` + + The highlight for virtualtext style errors. See |g:ale_virtualtext_cursor|. + + +ALEVirtualTextStyleWarning *ALEVirtualTextStyleWarning* + + Default: `highlight link ALEVirtualTextStyleWarning ALEVirtualTextWarning` + + The highlight for virtualtext style warnings. See |g:ale_virtualtext_cursor|. + + +ALEVirtualTextWarning *ALEVirtualTextWarning* + + Default: `highlight link ALEVirtualTextWarning Comment` + + The highlight for virtualtext errors. See |g:ale_virtualtext_cursor|. + + +ALEWarning *ALEWarning* + + Default: `highlight link ALEWarning SpellCap` + + The highlight for highlighted warnings. See |g:ale_set_highlights|. + + +ALEWarningLine *ALEWarningLine* + + Default: Undefined + + The highlight for entire lines where warnings appear. Only the first line + for a problem will be highlighted. + + See |g:ale_set_signs| and |g:ale_set_highlights|. + + +ALEWarningSign *ALEWarningSign* + + Default: `highlight link ALEWarningSign todo` + + The highlight for warning signs. See |g:ale_set_signs|. + + +ALEWarningSignLineNr *ALEWarningSignLineNr* + + Default: `highlight link ALEWarningSignLineNr CursorLineNr` + + The highlight for error signs. See |g:ale_set_signs|. + + NOTE: This highlight is only available on Neovim 0.3.2 or higher. + + +=============================================================================== +7. Linter/Fixer Options *ale-integration-options* + +Linter and fixer options are documented below and in individual help files. + +Every option for programs can be set globally, or individually for each +buffer. For example, `b:ale_python_flake8_executable` will override any +values set for `g:ale_python_flake8_executable`. + + *ale-integrations-local-executables* + +Some tools will prefer to search for locally-installed executables, unless +configured otherwise. For example, the `eslint` linter will search for +various executable paths in `node_modules`. The `flake8` linter will search +for virtualenv directories. + +If you prefer to use global executables for those tools, set the relevant +`_use_global` and `_executable` options for those linters. > + + " Use the global executable with a special name for eslint. + let g:ale_javascript_eslint_executable = 'special-eslint' + let g:ale_javascript_eslint_use_global = 1 + + " Use the global executable with a special name for flake8. + let g:ale_python_flake8_executable = '/foo/bar/flake8' + let g:ale_python_flake8_use_global = 1 +< +|g:ale_use_global_executables| can be set to `1` in your vimrc file to make +ALE use global executables for all linters by default. + +The option |g:ale_virtualenv_dir_names| controls the local virtualenv paths +ALE will use to search for Python executables. + + +------------------------------------------------------------------------------- +7.1. Options for alex *ale-alex-options* + +The options for `alex` are shared between all filetypes, so options can be +configured once. + +g:ale_alex_executable *g:ale_alex_executable* + *b:ale_alex_executable* + Type: |String| + Default: `'alex'` + + See |ale-integrations-local-executables| + + +g:ale_alex_use_global *g:ale_alex_use_global* + *b:ale_alex_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +------------------------------------------------------------------------------- +7.2. Options for cspell *ale-cspell-options* + +The options for `cspell` are shared between all filetypes, so options can be +configured only once. + +g:ale_cspell_executable *g:ale_cspell_executable* + *b:ale_cspell_executable* + Type: |String| + Default: `'cspell'` + + See |ale-integrations-local-executables| + + +g:ale_cspell_options *g:ale_cspell_options* + *b:ale_cspell_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to `cspell`. + + +g:ale_cspell_use_global *g:ale_cspell_use_global* + *b:ale_cspell_use_global* + Type: |Number| + Default: `get(g: 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +------------------------------------------------------------------------------- +7.3. Options for dprint *ale-dprint-options* + +`dprint` is a fixer for many file types, including: (java|type)script, +json(c?), markdown, and more. See https://dprint.dev/plugins for an up-to-date +list of supported plugins and their configuration options. + +g:ale_dprint_executable *g:ale_dprint_executable* + *b:ale_dprint_executable* + Type: |String| + Default: `'dprint'` + + See |ale-integrations-local-executables| + + +g:ale_dprint_config *g:ale_dprint_config* + *b:ale_dprint_config* + Type: |String| + Default: `'dprint.json'` + + This variable can be changed to provide a config file to `dprint`. The + default is the nearest `dprint.json` searching upward from the current + buffer. + + See https://dprint.dev/config and https://plugins.dprint.dev + + +g:ale_dprint_options *g:ale_dprint_options* + *b:ale_dprint_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to `dprint`. + + +g:ale_dprint_use_global *g:ale_dprint_use_global* + *b:ale_dprint_use_global* + Type: |Number| + Default: `get(g: 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +------------------------------------------------------------------------------- +7.4. Options for languagetool *ale-languagetool-options* + +g:ale_languagetool_executable *g:ale_languagetool_executable* + *b:ale_languagetool_executable* + + Type: |String| + Default: `'languagetool'` + + The executable to run for languagetool. + + +g:ale_languagetool_options *g:ale_languagetool_options* + *b:ale_languagetool_options* + Type: |String| + Default: `'--autoDetect'` + + This variable can be set to pass additional options to languagetool. + + +------------------------------------------------------------------------------- +7.5. Options for write-good *ale-write-good-options* + +The options for `write-good` are shared between all filetypes, so options can +be configured once. + +g:ale_writegood_executable *g:ale_writegood_executable* + *b:ale_writegood_executable* + Type: |String| + Default: `'writegood'` + + See |ale-integrations-local-executables| + + +g:ale_writegood_options *g:ale_writegood_options* + *b:ale_writegood_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to writegood. + + +g:ale_writegood_use_global *g:ale_writegood_use_global* + *b:ale_writegood_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +------------------------------------------------------------------------------- +7.6. Other Linter/Fixer Options *ale-other-integration-options* + +ALE supports a very wide variety of tools. Other linter or fixer options are +documented in additional help files. + + ada.....................................|ale-ada-options| + cspell................................|ale-ada-cspell| + gcc...................................|ale-ada-gcc| + gnatpp................................|ale-ada-gnatpp| + ada-language-server...................|ale-ada-language-server| + ansible.................................|ale-ansible-options| + ansible-language-server...............|ale-ansible-language-server| + ansible-lint..........................|ale-ansible-ansible-lint| + apkbuild................................|ale-apkbuild-options| + apkbuild-lint.........................|ale-apkbuild-apkbuild-lint| + secfixes-check........................|ale-apkbuild-secfixes-check| + asciidoc................................|ale-asciidoc-options| + cspell................................|ale-asciidoc-cspell| + write-good............................|ale-asciidoc-write-good| + textlint..............................|ale-asciidoc-textlint| + asm.....................................|ale-asm-options| + gcc...................................|ale-asm-gcc| + avra....................................|ale-avra-options| + avra..................................|ale-avra-avra| + awk.....................................|ale-awk-options| + gawk..................................|ale-awk-gawk| + bats....................................|ale-bats-options| + shellcheck............................|ale-bats-shellcheck| + bazel...................................|ale-bazel-options| + buildifier............................|ale-bazel-buildifier| + bib.....................................|ale-bib-options| + bibclean..............................|ale-bib-bibclean| + bicep...................................|ale-bicep-options| + bicep.................................|ale-bicep-bicep| + bitbake.................................|ale-bitbake-options| + oelint-adv............................|ale-bitbake-oelint_adv| + c.......................................|ale-c-options| + astyle................................|ale-c-astyle| + cc....................................|ale-c-cc| + ccls..................................|ale-c-ccls| + clangd................................|ale-c-clangd| + clang-format..........................|ale-c-clangformat| + clangtidy.............................|ale-c-clangtidy| + cppcheck..............................|ale-c-cppcheck| + cquery................................|ale-c-cquery| + cspell................................|ale-c-cspell| + flawfinder............................|ale-c-flawfinder| + uncrustify............................|ale-c-uncrustify| + cairo...................................|ale-cairo-options| + starknet..............................|ale-cairo-starknet| + chef....................................|ale-chef-options| + cookstyle.............................|ale-chef-cookstyle| + foodcritic............................|ale-chef-foodcritic| + clojure.................................|ale-clojure-options| + clj-kondo.............................|ale-clojure-clj-kondo| + joker.................................|ale-clojure-joker| + cloudformation..........................|ale-cloudformation-options| + cfn-python-lint.......................|ale-cloudformation-cfn-python-lint| + cmake...................................|ale-cmake-options| + cmakelint.............................|ale-cmake-cmakelint| + cmake-lint............................|ale-cmake-cmake-lint| + cmake-format..........................|ale-cmake-cmakeformat| + cpp.....................................|ale-cpp-options| + astyle................................|ale-cpp-astyle| + cc....................................|ale-cpp-cc| + ccls..................................|ale-cpp-ccls| + clangcheck............................|ale-cpp-clangcheck| + clangd................................|ale-cpp-clangd| + clang-format..........................|ale-cpp-clangformat| + clangtidy.............................|ale-cpp-clangtidy| + clazy.................................|ale-cpp-clazy| + cppcheck..............................|ale-cpp-cppcheck| + cpplint...............................|ale-cpp-cpplint| + cquery................................|ale-cpp-cquery| + cspell................................|ale-cpp-cspell| + flawfinder............................|ale-cpp-flawfinder| + uncrustify............................|ale-cpp-uncrustify| + c#......................................|ale-cs-options| + clang-format..........................|ale-cs-clangformat| + csc...................................|ale-cs-csc| + cspell................................|ale-cs-cspell| + dotnet-format.........................|ale-cs-dotnet-format| + mcs...................................|ale-cs-mcs| + mcsc..................................|ale-cs-mcsc| + uncrustify............................|ale-cs-uncrustify| + css.....................................|ale-css-options| + cspell................................|ale-css-cspell| + css-beautify..........................|ale-css-css-beautify| + fecs..................................|ale-css-fecs| + prettier..............................|ale-css-prettier| + stylelint.............................|ale-css-stylelint| + vscodecss.............................|ale-css-vscode| + cuda....................................|ale-cuda-options| + clang-format..........................|ale-cuda-clangformat| + clangd................................|ale-cuda-clangd| + nvcc..................................|ale-cuda-nvcc| + d.......................................|ale-d-options| + dfmt..................................|ale-d-dfmt| + dls...................................|ale-d-dls| + uncrustify............................|ale-d-uncrustify| + dafny...................................|ale-dafny-options| + dafny.................................|ale-dafny-dafny| + dart....................................|ale-dart-options| + analysis_server.......................|ale-dart-analysis_server| + dart-analyze..........................|ale-dart-analyze| + dart-format...........................|ale-dart-format| + dartfmt...............................|ale-dart-dartfmt| + desktop.................................|ale-desktop-options| + desktop-file-validate.................|ale-desktop-desktop-file-validate| + dhall...................................|ale-dhall-options| + dhall-format..........................|ale-dhall-format| + dhall-freeze..........................|ale-dhall-freeze| + dhall-lint............................|ale-dhall-lint| + dockerfile..............................|ale-dockerfile-options| + dockerfile_lint.......................|ale-dockerfile-dockerfile_lint| + dprint................................|ale-dockerfile-dprint| + hadolint..............................|ale-dockerfile-hadolint| + elixir..................................|ale-elixir-options| + mix...................................|ale-elixir-mix| + mix_format............................|ale-elixir-mix-format| + dialyxir..............................|ale-elixir-dialyxir| + elixir-ls.............................|ale-elixir-elixir-ls| + credo.................................|ale-elixir-credo| + cspell................................|ale-elixir-cspell| + elm.....................................|ale-elm-options| + elm-format............................|ale-elm-elm-format| + elm-ls................................|ale-elm-elm-ls| + elm-make..............................|ale-elm-elm-make| + erlang..................................|ale-erlang-options| + dialyzer..............................|ale-erlang-dialyzer| + elvis.................................|ale-erlang-elvis| + erlang_ls.............................|ale-erlang-erlang_ls| + erlc..................................|ale-erlang-erlc| + erlfmt................................|ale-erlang-erlfmt| + syntaxerl.............................|ale-erlang-syntaxerl| + eruby...................................|ale-eruby-options| + erblint...............................|ale-eruby-erblint| + ruumba................................|ale-eruby-ruumba| + fish....................................|ale-fish-options| + fish_indent...........................|ale-fish-fish_indent| + fortran.................................|ale-fortran-options| + gcc...................................|ale-fortran-gcc| + language_server.......................|ale-fortran-language-server| + fountain................................|ale-fountain-options| + fusionscript............................|ale-fuse-options| + fusion-lint...........................|ale-fuse-fusionlint| + git commit..............................|ale-gitcommit-options| + gitlint...............................|ale-gitcommit-gitlint| + glsl....................................|ale-glsl-options| + glslang...............................|ale-glsl-glslang| + glslls................................|ale-glsl-glslls| + go......................................|ale-go-options| + bingo.................................|ale-go-bingo| + cspell................................|ale-go-cspell| + gobuild...............................|ale-go-gobuild| + gofmt.................................|ale-go-gofmt| + gofumpt...............................|ale-go-gofumpt| + golangci-lint.........................|ale-go-golangci-lint| + golangserver..........................|ale-go-golangserver| + golines...............................|ale-go-golines| + golint................................|ale-go-golint| + gometalinter..........................|ale-go-gometalinter| + gopls.................................|ale-go-gopls| + govet.................................|ale-go-govet| + revive................................|ale-go-revive| + staticcheck...........................|ale-go-staticcheck| + graphql.................................|ale-graphql-options| + eslint................................|ale-graphql-eslint| + gqlint................................|ale-graphql-gqlint| + prettier..............................|ale-graphql-prettier| + hack....................................|ale-hack-options| + hack..................................|ale-hack-hack| + hackfmt...............................|ale-hack-hackfmt| + hhast.................................|ale-hack-hhast| + handlebars..............................|ale-handlebars-options| + prettier..............................|ale-handlebars-prettier| + ember-template-lint...................|ale-handlebars-embertemplatelint| + haskell.................................|ale-haskell-options| + brittany..............................|ale-haskell-brittany| + cspell................................|ale-haskell-cspell| + floskell..............................|ale-haskell-floskell| + ghc...................................|ale-haskell-ghc| + ghc-mod...............................|ale-haskell-ghc-mod| + cabal-ghc.............................|ale-haskell-cabal-ghc| + hdevtools.............................|ale-haskell-hdevtools| + hfmt..................................|ale-haskell-hfmt| + hindent...............................|ale-haskell-hindent| + hlint.................................|ale-haskell-hlint| + hls...................................|ale-haskell-hls| + stack-build...........................|ale-haskell-stack-build| + stack-ghc.............................|ale-haskell-stack-ghc| + stylish-haskell.......................|ale-haskell-stylish-haskell| + hie...................................|ale-haskell-hie| + ormolu................................|ale-haskell-ormolu| + hcl.....................................|ale-hcl-options| + packer-fmt............................|ale-hcl-packer-fmt| + terraform-fmt.........................|ale-hcl-terraform-fmt| + help....................................|ale-help-options| + cspell................................|ale-help-cspell| + html....................................|ale-html-options| + angular...............................|ale-html-angular| + cspell................................|ale-html-cspell| + fecs..................................|ale-html-fecs| + html-beautify.........................|ale-html-beautify| + htmlhint..............................|ale-html-htmlhint| + prettier..............................|ale-html-prettier| + stylelint.............................|ale-html-stylelint| + tidy..................................|ale-html-tidy| + vscodehtml............................|ale-html-vscode| + write-good............................|ale-html-write-good| + idris...................................|ale-idris-options| + idris.................................|ale-idris-idris| + ink.....................................|ale-ink-options| + ink-language-server...................|ale-ink-language-server| + inko....................................|ale-inko-options| + inko..................................|ale-inko-inko| + ispc....................................|ale-ispc-options| + ispc..................................|ale-ispc-ispc| + java....................................|ale-java-options| + checkstyle............................|ale-java-checkstyle| + clang-format..........................|ale-java-clangformat| + cspell................................|ale-java-cspell| + javac.................................|ale-java-javac| + google-java-format....................|ale-java-google-java-format| + pmd...................................|ale-java-pmd| + javalsp...............................|ale-java-javalsp| + eclipselsp............................|ale-java-eclipselsp| + uncrustify............................|ale-java-uncrustify| + javascript..............................|ale-javascript-options| + clang-format..........................|ale-javascript-clangformat| + cspell................................|ale-javascript-cspell| + deno..................................|ale-javascript-deno| + dprint................................|ale-javascript-dprint| + eslint................................|ale-javascript-eslint| + fecs..................................|ale-javascript-fecs| + flow..................................|ale-javascript-flow| + importjs..............................|ale-javascript-importjs| + jscs..................................|ale-javascript-jscs| + jshint................................|ale-javascript-jshint| + prettier..............................|ale-javascript-prettier| + prettier-eslint.......................|ale-javascript-prettier-eslint| + prettier-standard.....................|ale-javascript-prettier-standard| + standard..............................|ale-javascript-standard| + xo....................................|ale-javascript-xo| + json....................................|ale-json-options| + clang-format..........................|ale-json-clangformat| + cspell................................|ale-json-cspell| + dprint................................|ale-json-dprint| + eslint................................|ale-json-eslint| + fixjson...............................|ale-json-fixjson| + jsonlint..............................|ale-json-jsonlint| + jq....................................|ale-json-jq| + prettier..............................|ale-json-prettier| + spectral..............................|ale-json-spectral| + vscodejson............................|ale-json-vscode| + jsonc...................................|ale-jsonc-options| + eslint................................|ale-jsonc-eslint| + jsonnet.................................|ale-jsonnet-options| + jsonnetfmt............................|ale-jsonnet-jsonnetfmt| + jsonnet-lint..........................|ale-jsonnet-jsonnet-lint| + json5...................................|ale-json5-options| + eslint................................|ale-json5-eslint| + julia...................................|ale-julia-options| + languageserver........................|ale-julia-languageserver| + kotlin..................................|ale-kotlin-options| + kotlinc...............................|ale-kotlin-kotlinc| + ktlint................................|ale-kotlin-ktlint| + languageserver........................|ale-kotlin-languageserver| + latex...................................|ale-latex-options| + cspell................................|ale-latex-cspell| + write-good............................|ale-latex-write-good| + textlint..............................|ale-latex-textlint| + less....................................|ale-less-options| + lessc.................................|ale-less-lessc| + prettier..............................|ale-less-prettier| + stylelint.............................|ale-less-stylelint| + llvm....................................|ale-llvm-options| + llc...................................|ale-llvm-llc| + lua.....................................|ale-lua-options| + cspell................................|ale-lua-cspell| + lua-format............................|ale-lua-lua-format| + luac..................................|ale-lua-luac| + luacheck..............................|ale-lua-luacheck| + luafmt................................|ale-lua-luafmt| + selene................................|ale-lua-selene| + stylua................................|ale-lua-stylua| + make....................................|ale-make-options| + checkmake.............................|ale-make-checkmake| + markdown................................|ale-markdown-options| + cspell................................|ale-markdown-cspell| + dprint................................|ale-markdown-dprint| + markdownlint..........................|ale-markdown-markdownlint| + mdl...................................|ale-markdown-mdl| + pandoc................................|ale-markdown-pandoc| + prettier..............................|ale-markdown-prettier| + remark-lint...........................|ale-markdown-remark-lint| + textlint..............................|ale-markdown-textlint| + write-good............................|ale-markdown-write-good| + mercury.................................|ale-mercury-options| + mmc...................................|ale-mercury-mmc| + nasm....................................|ale-nasm-options| + nasm..................................|ale-nasm-nasm| + nim.....................................|ale-nim-options| + nimcheck..............................|ale-nim-nimcheck| + nimlsp................................|ale-nim-nimlsp| + nimpretty.............................|ale-nim-nimpretty| + nix.....................................|ale-nix-options| + nixfmt................................|ale-nix-nixfmt| + nixpkgs-fmt...........................|ale-nix-nixpkgs-fmt| + statix................................|ale-nix-statix| + nroff...................................|ale-nroff-options| + write-good............................|ale-nroff-write-good| + objc....................................|ale-objc-options| + ccls..................................|ale-objc-ccls| + clang.................................|ale-objc-clang| + clang-format..........................|ale-objc-clangformat| + clangd................................|ale-objc-clangd| + uncrustify............................|ale-objc-uncrustify| + objcpp..................................|ale-objcpp-options| + clang.................................|ale-objcpp-clang| + clangd................................|ale-objcpp-clangd| + uncrustify............................|ale-objcpp-uncrustify| + ocaml...................................|ale-ocaml-options| + dune..................................|ale-ocaml-dune| + merlin................................|ale-ocaml-merlin| + ocamllsp..............................|ale-ocaml-ocamllsp| + ols...................................|ale-ocaml-ols| + ocamlformat...........................|ale-ocaml-ocamlformat| + ocp-indent............................|ale-ocaml-ocp-indent| + openapi.................................|ale-openapi-options| + ibm_validator.........................|ale-openapi-ibm-validator| + prettier..............................|ale-openapi-prettier| + yamllint..............................|ale-openapi-yamllint| + openscad................................|ale-openscad-options| + sca2d.................................|ale-openscad-sca2d| + packer..................................|ale-packer-options| + packer-fmt-fixer......................|ale-packer-fmt-fixer| + pascal..................................|ale-pascal-options| + ptop..................................|ale-pascal-ptop| + pawn....................................|ale-pawn-options| + uncrustify............................|ale-pawn-uncrustify| + perl....................................|ale-perl-options| + perl..................................|ale-perl-perl| + perlcritic............................|ale-perl-perlcritic| + perltidy..............................|ale-perl-perltidy| + perl6...................................|ale-perl6-options| + perl6.................................|ale-perl6-perl6| + php.....................................|ale-php-options| + cspell................................|ale-php-cspell| + langserver............................|ale-php-langserver| + phan..................................|ale-php-phan| + phpcbf................................|ale-php-phpcbf| + phpcs.................................|ale-php-phpcs| + phpmd.................................|ale-php-phpmd| + phpstan...............................|ale-php-phpstan| + psalm.................................|ale-php-psalm| + php-cs-fixer..........................|ale-php-php-cs-fixer| + php...................................|ale-php-php| + pint..................................|ale-php-pint| + tlint.................................|ale-php-tlint| + intelephense..........................|ale-php-intelephense| + po......................................|ale-po-options| + write-good............................|ale-po-write-good| + pod.....................................|ale-pod-options| + write-good............................|ale-pod-write-good| + pony....................................|ale-pony-options| + ponyc.................................|ale-pony-ponyc| + powershell..............................|ale-powershell-options| + cspell................................|ale-powershell-cspell| + powershell............................|ale-powershell-powershell| + psscriptanalyzer......................|ale-powershell-psscriptanalyzer| + prolog..................................|ale-prolog-options| + swipl.................................|ale-prolog-swipl| + proto...................................|ale-proto-options| + buf-format............................|ale-proto-buf-format| + buf-lint..............................|ale-proto-buf-lint| + clang-format..........................|ale-proto-clangformat| + protoc-gen-lint.......................|ale-proto-protoc-gen-lint| + protolint.............................|ale-proto-protolint| + pug.....................................|ale-pug-options| + puglint...............................|ale-pug-puglint| + puppet..................................|ale-puppet-options| + puppet................................|ale-puppet-puppet| + puppetlint............................|ale-puppet-puppetlint| + puppet-languageserver.................|ale-puppet-languageserver| + purescript..............................|ale-purescript-options| + purescript-language-server............|ale-purescript-language-server| + purs-tidy.............................|ale-purescript-tidy| + purty.................................|ale-purescript-purty| + pyrex (cython)..........................|ale-pyrex-options| + cython................................|ale-pyrex-cython| + python..................................|ale-python-options| + autoflake.............................|ale-python-autoflake| + autoimport............................|ale-python-autoimport| + autopep8..............................|ale-python-autopep8| + bandit................................|ale-python-bandit| + black.................................|ale-python-black| + cspell................................|ale-python-cspell| + flake8................................|ale-python-flake8| + flakehell.............................|ale-python-flakehell| + isort.................................|ale-python-isort| + mypy..................................|ale-python-mypy| + prospector............................|ale-python-prospector| + pycodestyle...........................|ale-python-pycodestyle| + pydocstyle............................|ale-python-pydocstyle| + pyflakes..............................|ale-python-pyflakes| + pyflyby...............................|ale-python-pyflyby| + pylama................................|ale-python-pylama| + pylint................................|ale-python-pylint| + pylsp.................................|ale-python-pylsp| + pyre..................................|ale-python-pyre| + pyright...............................|ale-python-pyright| + refurb................................|ale-python-refurb| + reorder-python-imports................|ale-python-reorder_python_imports| + ruff..................................|ale-python-ruff| + unimport..............................|ale-python-unimport| + vulture...............................|ale-python-vulture| + yapf..................................|ale-python-yapf| + qml.....................................|ale-qml-options| + qmlfmt................................|ale-qml-qmlfmt| + r.......................................|ale-r-options| + languageserver........................|ale-r-languageserver| + lintr.................................|ale-r-lintr| + styler................................|ale-r-styler| + racket..................................|ale-racket-options| + racket_langserver.....................|ale-racket-langserver| + raco_fmt..............................|ale-racket-raco-fmt| + reasonml................................|ale-reasonml-options| + merlin................................|ale-reasonml-merlin| + ols...................................|ale-reasonml-ols| + reason-language-server................|ale-reasonml-language-server| + refmt.................................|ale-reasonml-refmt| + rego....................................|ale-rego-options| + cspell................................|ale-rego-cspell| + opacheck..............................|ale-rego-opa-check| + opafmt................................|ale-rego-opa-fmt-fixer| + restructuredtext........................|ale-restructuredtext-options| + cspell................................|ale-restructuredtext-cspell| + textlint..............................|ale-restructuredtext-textlint| + write-good............................|ale-restructuredtext-write-good| + robot...................................|ale-robot-options| + rflint................................|ale-robot-rflint| + ruby....................................|ale-ruby-options| + brakeman..............................|ale-ruby-brakeman| + cspell................................|ale-ruby-cspell| + debride...............................|ale-ruby-debride| + prettier..............................|ale-ruby-prettier| + rails_best_practices..................|ale-ruby-rails_best_practices| + reek..................................|ale-ruby-reek| + rubocop...............................|ale-ruby-rubocop| + ruby..................................|ale-ruby-ruby| + rufo..................................|ale-ruby-rufo| + solargraph............................|ale-ruby-solargraph| + sorbet................................|ale-ruby-sorbet| + standardrb............................|ale-ruby-standardrb| + syntax_tree...........................|ale-ruby-syntax_tree| + rust....................................|ale-rust-options| + analyzer..............................|ale-rust-analyzer| + cargo.................................|ale-rust-cargo| + cspell................................|ale-rust-cspell| + rls...................................|ale-rust-rls| + rustc.................................|ale-rust-rustc| + rustfmt...............................|ale-rust-rustfmt| + salt....................................|ale-salt-options| + salt-lint.............................|ale-salt-salt-lint| + sass....................................|ale-sass-options| + sasslint..............................|ale-sass-sasslint| + stylelint.............................|ale-sass-stylelint| + scala...................................|ale-scala-options| + cspell................................|ale-scala-cspell| + metals................................|ale-scala-metals| + sbtserver.............................|ale-scala-sbtserver| + scalafmt..............................|ale-scala-scalafmt| + scalastyle............................|ale-scala-scalastyle| + scss....................................|ale-scss-options| + prettier..............................|ale-scss-prettier| + sasslint..............................|ale-scss-sasslint| + stylelint.............................|ale-scss-stylelint| + sh......................................|ale-sh-options| + bashate...............................|ale-sh-bashate| + cspell................................|ale-sh-cspell| + sh-language-server....................|ale-sh-language-server| + shell.................................|ale-sh-shell| + shellcheck............................|ale-sh-shellcheck| + shfmt.................................|ale-sh-shfmt| + sml.....................................|ale-sml-options| + smlnj.................................|ale-sml-smlnj| + solidity................................|ale-solidity-options| + solc..................................|ale-solidity-solc| + solhint...............................|ale-solidity-solhint| + solium................................|ale-solidity-solium| + spec....................................|ale-spec-options| + rpmlint...............................|ale-spec-rpmlint| + sql.....................................|ale-sql-options| + dprint................................|ale-sql-dprint| + pgformatter...........................|ale-sql-pgformatter| + sqlfluff..............................|ale-sql-sqlfluff| + sqlfmt................................|ale-sql-sqlfmt| + sqlformat.............................|ale-sql-sqlformat| + stylus..................................|ale-stylus-options| + stylelint.............................|ale-stylus-stylelint| + sugarss.................................|ale-sugarss-options| + stylelint.............................|ale-sugarss-stylelint| + svelte..................................|ale-svelte-options| + prettier..............................|ale-svelte-prettier| + svelteserver..........................|ale-svelte-svelteserver| + swift...................................|ale-swift-options| + apple-swift-format....................|ale-swift-apple-swift-format| + cspell................................|ale-swift-cspell| + sourcekitlsp..........................|ale-swift-sourcekitlsp| + systemd.................................|ale-systemd-options| + systemd-analyze.......................|ale-systemd-analyze| + tcl.....................................|ale-tcl-options| + nagelfar..............................|ale-tcl-nagelfar| + terraform...............................|ale-terraform-options| + checkov...............................|ale-terraform-checkov| + terraform-fmt-fixer...................|ale-terraform-fmt-fixer| + terraform.............................|ale-terraform-terraform| + terraform-ls..........................|ale-terraform-terraform-ls| + terraform-lsp.........................|ale-terraform-terraform-lsp| + tflint................................|ale-terraform-tflint| + tfsec.................................|ale-terraform-tfsec| + tex.....................................|ale-tex-options| + chktex................................|ale-tex-chktex| + cspell................................|ale-tex-cspell| + lacheck...............................|ale-tex-lacheck| + latexindent...........................|ale-tex-latexindent| + texlab................................|ale-tex-texlab| + texinfo.................................|ale-texinfo-options| + cspell................................|ale-texinfo-cspell| + write-good............................|ale-texinfo-write-good| + text....................................|ale-text-options| + cspell................................|ale-text-cspell| + textlint..............................|ale-text-textlint| + write-good............................|ale-text-write-good| + thrift..................................|ale-thrift-options| + thrift................................|ale-thrift-thrift| + thriftcheck...........................|ale-thrift-thriftcheck| + toml....................................|ale-toml-options| + dprint................................|ale-toml-dprint| + typescript..............................|ale-typescript-options| + cspell................................|ale-typescript-cspell| + deno..................................|ale-typescript-deno| + dprint................................|ale-typescript-dprint| + eslint................................|ale-typescript-eslint| + prettier..............................|ale-typescript-prettier| + standard..............................|ale-typescript-standard| + tslint................................|ale-typescript-tslint| + tsserver..............................|ale-typescript-tsserver| + xo....................................|ale-typescript-xo| + v.......................................|ale-v-options| + v.....................................|ale-v-v| + vfmt..................................|ale-v-vfmt| + vala....................................|ale-vala-options| + uncrustify............................|ale-vala-uncrustify| + verilog/systemverilog...................|ale-verilog-options| + hdl-checker...........................|ale-verilog-hdl-checker| + iverilog..............................|ale-verilog-iverilog| + verilator.............................|ale-verilog-verilator| + vlog..................................|ale-verilog-vlog| + xvlog.................................|ale-verilog-xvlog| + yosys.................................|ale-verilog-yosys| + vhdl....................................|ale-vhdl-options| + ghdl..................................|ale-vhdl-ghdl| + hdl-checker...........................|ale-vhdl-hdl-checker| + vcom..................................|ale-vhdl-vcom| + xvhdl.................................|ale-vhdl-xvhdl| + vim help................................|ale-vim-help-options| + write-good............................|ale-vim-help-write-good| + vim.....................................|ale-vim-options| + vimls.................................|ale-vim-vimls| + vint..................................|ale-vim-vint| + vue.....................................|ale-vue-options| + cspell................................|ale-vue-cspell| + prettier..............................|ale-vue-prettier| + vls...................................|ale-vue-vls| + volar.................................|ale-vue-volar| + wgsl....................................|ale-wgsl-options| + naga..................................|ale-wgsl-naga| + xhtml...................................|ale-xhtml-options| + cspell................................|ale-xhtml-cspell| + write-good............................|ale-xhtml-write-good| + xml.....................................|ale-xml-options| + xmllint...............................|ale-xml-xmllint| + yaml....................................|ale-yaml-options| + actionlint............................|ale-yaml-actionlint| + circleci..............................|ale-yaml-circleci| + prettier..............................|ale-yaml-prettier| + spectral..............................|ale-yaml-spectral| + swaglint..............................|ale-yaml-swaglint| + yaml-language-server..................|ale-yaml-language-server| + yamlfix...............................|ale-yaml-yamlfix| + yamllint..............................|ale-yaml-yamllint| + gitlablint............................|ale-yaml-gitlablint| + yang....................................|ale-yang-options| + yang-lsp..............................|ale-yang-lsp| + zeek....................................|ale-zeek-options| + zeek..................................|ale-zeek-zeek| + zig.....................................|ale-zig-options| + zigfmt................................|ale-zig-zigfmt| + zls...................................|ale-zig-zls| + + +=============================================================================== +8. Commands/Keybinds *ale-commands* + +ALEComplete *ALEComplete* + + Manually trigger LSP autocomplete and show the menu. Works only when called + from insert mode. > + + inoremap :ALEComplete +< + A plug mapping `(ale_complete)` is defined for this command. > + + imap (ale_complete) +< +ALEDocumentation *ALEDocumentation* + + Similar to the |ALEHover| command, retrieve documentation information for + the symbol at the cursor. Documentation data will always be shown in a + preview window, no matter how small the documentation content is. + + NOTE: This command is only available for `tsserver`. + + A plug mapping `(ale_documentation)` is defined for this command. + + +ALEFindReferences *ALEFindReferences* + + Find references in the codebase for the symbol under the cursor using the + enabled LSP linters for the buffer. ALE will display a preview window + containing the results if some references are found. + + The window can be navigated using the usual Vim navigation commands. The + Enter key (``) can be used to jump to a referencing location, or the `t` + key can be used to jump to the location in a new tab. + + The locations opened in different ways using the following variations. + + `:ALEFindReferences -tab` - Open the location in a new tab. + `:ALEFindReferences -split` - Open the location in a horizontal split. + `:ALEFindReferences -vsplit` - Open the location in a vertical split. + `:ALEFindReferences -quickfix` - Put the locations into quickfix list. + + The default method used for navigating to a new location can be changed + by modifying |g:ale_default_navigation|. + + You can add `-relative` to the command to view results with relatives paths, + instead of absolute paths. This option has no effect if `-quickfix` is used. + + The selection can be opened again with the |ALERepeatSelection| command. + + You can jump back to the position you were at before going to a reference of + something with jump motions like CTRL-O. See |jump-motions|. + + A plug mapping `(ale_find_references)` is defined for this command. + You can define additional plug mapping with any additional options you want + like so: > + + nnoremap (my_mapping) :ALEFindReferences -relative +< + +ALEFix *ALEFix* + + Fix problems with the current buffer. See |ale-fix| for more information. + + If the command is run with a bang (`:ALEFix!`), all warnings will be + suppressed, including warnings about no fixers being defined, and warnings + about not being able to apply fixes to a file because it has been changed. + + A plug mapping `(ale_fix)` is defined for this command. + + +ALEFixSuggest *ALEFixSuggest* + + Suggest tools that can be used to fix problems in the current buffer. + + See |ale-fix| for more information. + + +ALEGoToDefinition `` *ALEGoToDefinition* + + Jump to the definition of a symbol under the cursor using the enabled LSP + linters for the buffer. ALE will jump to a definition if an LSP server + provides a location to jump to. Otherwise, ALE will do nothing. + + The locations opened in different ways using the following variations. + + `:ALEGoToDefinition -tab` - Open the location in a new tab. + `:ALEGoToDefinition -split` - Open the location in a horizontal split. + `:ALEGoToDefinition -vsplit` - Open the location in a vertical split. + + The default method used for navigating to a new location can be changed + by modifying |g:ale_default_navigation|. + + You can jump back to the position you were at before going to the definition + of something with jump motions like CTRL-O. See |jump-motions|. + + You should consider using the 'hidden' option in combination with this + command. Otherwise, Vim will refuse to leave the buffer you're jumping from + unless you have saved your edits. + + The following Plug mappings are defined for this command, which correspond + to the following commands. + + `(ale_go_to_definition)` - `:ALEGoToDefinition` + `(ale_go_to_definition_in_tab)` - `:ALEGoToDefinition -tab` + `(ale_go_to_definition_in_split)` - `:ALEGoToDefinition -split` + `(ale_go_to_definition_in_vsplit)` - `:ALEGoToDefinition -vsplit` + + +ALEGoToTypeDefinition *ALEGoToTypeDefinition* + + This works similar to |ALEGoToDefinition| but instead jumps to the + definition of a type of a symbol under the cursor. ALE will jump to a + definition if an LSP server provides a location to jump to. Otherwise, ALE + will do nothing. + + The locations opened in different ways using the following variations. + + `:ALEGoToTypeDefinition -tab` - Open the location in a new tab. + `:ALEGoToTypeDefinition -split` - Open the location in a horizontal split. + `:ALEGoToTypeDefinition -vsplit` - Open the location in a vertical split. + + The default method used for navigating to a new location can be changed + by modifying |g:ale_default_navigation|. + + You can jump back to the position you were at before going to the definition + of something with jump motions like CTRL-O. See |jump-motions|. + + The following Plug mappings are defined for this command, which correspond + to the following commands. + + `(ale_go_to_type_definition)` - `:ALEGoToTypeDefinition` + `(ale_go_to_type_definition_in_tab)` - `:ALEGoToTypeDefinition -tab` + `(ale_go_to_type_definition_in_split)` - `:ALEGoToTypeDefinition -split` + `(ale_go_to_type_definition_in_vsplit)` - `:ALEGoToTypeDefinition -vsplit` + + +ALEGoToImplementation *ALEGoToImplementation* + + This works similar to |ALEGoToDefinition| but instead jumps to the + implementation of symbol under the cursor. ALE will jump to a definition if + an LSP server provides a location to jump to. Otherwise, ALE will do nothing. + + The locations opened in different ways using the following variations. + + `:ALEGoToImplementation -tab` - Open the location in a new tab. + `:ALEGoToImplementation -split` - Open the location in a horizontal split. + `:ALEGoToImplementation -vsplit` - Open the location in a vertical split. + + The default method used for navigating to a new location can be changed + by modifying |g:ale_default_navigation|. + + You can jump back to the position you were at before going to the definition + of something with jump motions like CTRL-O. See |jump-motions|. + + The following Plug mappings are defined for this command, which correspond + to the following commands. + + `(ale_go_to_implementation)` - `:ALEGoToImplementation` + `(ale_go_to_implementation_in_tab)` - `:ALEGoToImplementation -tab` + `(ale_go_to_implementation_in_split)` - `:ALEGoToImplementation -split` + `(ale_go_to_implementation_in_vsplit)` - `:ALEGoToImplementation -vsplit` + + +ALEHover *ALEHover* + + Print brief information about the symbol under the cursor, taken from any + available LSP linters. There may be a small non-blocking delay before + information is printed. + + NOTE: In Vim 8, long messages will be shown in a preview window, as Vim 8 + does not support showing a prompt to press enter to continue for long + messages from asynchronous callbacks. + + A plug mapping `(ale_hover)` is defined for this command. + + +ALEImport *ALEImport* + + Try to import a symbol using `tsserver` or a Language Server. + + ALE will look for completions for the word at the cursor which contain + additional text edits that possible insert lines to import the symbol. The + first match with additional text edits will be used, and may add other code + to the current buffer other than import lines. + + If linting is enabled, and |g:ale_lint_on_text_changed| is set to ever check + buffers when text is changed, the buffer will be checked again after changes + are made. + + A Plug mapping `(ale_import)` is defined for this command. This + mapping should only be bound for normal mode. + + +ALEOrganizeImports *ALEOrganizeImports* + + Organize imports using tsserver. Currently not implemented for LSPs. + + +ALERename *ALERename* + + Rename a symbol using `tsserver` or a Language Server. + + The symbol where the cursor is resting will be the symbol renamed, and a + prompt will open to request a new name. + + The rename operation will save all modified buffers when `set nohidden` is + set, because that disables leaving unsaved buffers in the background. See + `:help hidden` for more details. + +ALEFileRename *ALEFileRename* + + Rename a file and fix imports using `tsserver`. + +ALECodeAction *ALECodeAction* + + Apply a code action via LSP servers or `tsserver`. + + If there is an error present on a line that can be fixed, ALE will + automatically fix a line, unless there are multiple possible code fixes to + apply. + + This command can be run in visual mode apply actions, such as applicable + refactors. A menu will be shown to select code action to apply. + + +ALERepeatSelection *ALERepeatSelection* + + Repeat the last selection displayed in the preview window. + + +ALESymbolSearch `` *ALESymbolSearch* + + Search for symbols in the workspace, taken from any available LSP linters. + + The arguments provided to this command will be used as a search query for + finding symbols in the workspace, such as functions, types, etc. + + You can add `-relative` to the command to view results with relatives paths, + instead of absolute paths. + + *:ALELint* +ALELint *ALELint* + + Run ALE once for the current buffer. This command can be used to run ALE + manually, instead of automatically, if desired. + + This command will also run linters where `lint_file` is evaluates to `1`, + meaning linters which check the file instead of the Vim buffer. + + A plug mapping `(ale_lint)` is defined for this command. + + +ALELintStop *ALELintStop* + + Stop any currently running jobs for checking the current buffer. + + Any problems from previous linter results will continue to be shown. + + +ALEPopulateQuickfix *ALEPopulateQuickfix* +ALEPopulateLocList *ALEPopulateLocList* + + Manually populate the |quickfix| or |location-list| and show the + corresponding list. Useful when you have other uses for both the |quickfix| + and |location-list| and don't want them automatically populated. Be sure to + disable auto populating: > + + let g:ale_set_quickfix = 0 + let g:ale_set_loclist = 0 +< + With these settings, ALE will still run checking and display it with signs, + highlighting, and other output described in |ale-lint-file-linters|. + +ALEPrevious *ALEPrevious* +ALEPreviousWrap *ALEPreviousWrap* +ALENext *ALENext* +ALENextWrap *ALENextWrap* +ALEFirst *ALEFirst* +ALELast *ALELast* + *ale-navigation-commands* + + Move between warnings or errors in a buffer. ALE will only navigate between + the errors or warnings it generated, even if both |g:ale_set_quickfix| + and |g:ale_set_loclist| are set to `0`. + + `ALEPrevious` and `ALENext` will stop at the top and bottom of a file, while + `ALEPreviousWrap` and `ALENextWrap` will wrap around the file to find + the last or first warning or error in the file, respectively. + + `ALEPrevious` and `ALENext` take optional flags arguments to custom their + behavior : + `-wrap` enable wrapping around the file + `-error`, `-warning` and `-info` enable jumping to errors, warnings or infos + respectively, ignoring anything else. They are mutually exclusive and if + several are provided the priority is the following: error > warning > info. + `-style` and `-nostyle` allow you to jump respectively to style error or + warning and to not style error or warning. They also are mutually + exclusive and nostyle has priority over style. + + Flags can be combined to create create custom jumping. Thus you can use + ":ALENext -wrap -error -nosyle" to jump to the next error which is not a + style error while going back to the beginning of the file if needed. + + `ALEFirst` goes to the first error or warning in the buffer, while `ALELast` + goes to the last one. + + The following || mappings are defined for the commands: > + (ale_previous) - ALEPrevious + (ale_previous_wrap) - ALEPreviousWrap + (ale_previous_error) - ALEPrevious -error + (ale_previous_wrap_error) - ALEPrevious -wrap -error + (ale_previous_warning) - ALEPrevious -warning + (ale_previous_wrap_warning) - ALEPrevious -wrap -warning + (ale_next) - ALENext + (ale_next_wrap) - ALENextWrap + (ale_next_error) - ALENext -error + (ale_next_wrap_error) - ALENext -wrap -error + (ale_next_warning) - ALENext -warning + (ale_next_wrap_warning) - ALENext -wrap -warning + (ale_first) - ALEFirst + (ale_last) - ALELast +< + For example, these commands could be bound to the keys Ctrl + j + and Ctrl + k: > + + " Map movement through errors without wrapping. + nmap (ale_previous) + nmap (ale_next) + " OR map keys to use wrapping. + nmap (ale_previous_wrap) + nmap (ale_next_wrap) +< + +ALEToggle *ALEToggle* +ALEEnable *ALEEnable* +ALEDisable *ALEDisable* +ALEToggleBuffer *ALEToggleBuffer* +ALEEnableBuffer *ALEEnableBuffer* +ALEDisableBuffer *ALEDisableBuffer* + + `ALEToggle`, `ALEEnable`, and `ALEDisable` enable or disable ALE linting, + including all of its autocmd events, loclist items, quickfix items, signs, + current jobs, etc., globally. Executing any of these commands will change + the |g:ale_enabled| variable. + + ALE can be disabled or enabled for only a single buffer with + `ALEToggleBuffer`, `ALEEnableBuffer`, and `ALEDisableBuffer`. Disabling ALE + for a buffer will not remove autocmd events, but will prevent ALE from + checking for problems and reporting problems for whatever buffer the + `ALEDisableBuffer` or `ALEToggleBuffer` command is executed from. These + commands can be used for temporarily disabling ALE for a buffer. These + commands will modify the |b:ale_enabled| variable. + + ALE linting cannot be enabled for a single buffer when it is disabled + globally, as disabling ALE globally removes the autocmd events needed to + perform linting with. + + The following plug mappings are defined, for conveniently defining keybinds: + + |ALEToggle| - `(ale_toggle)` + |ALEEnable| - `(ale_enable)` + |ALEDisable| - `(ale_disable)` + |ALEToggleBuffer| - `(ale_toggle_buffer)` + |ALEEnableBuffer| - `(ale_enable_buffer)` + |ALEDisableBuffer| - `(ale_disable_buffer)` + + For removing problems reported by ALE, but leaving ALE enabled, see + |ALEReset| and |ALEResetBuffer|. + + *:ALEDetail* +ALEDetail *ALEDetail* + + Show the full linter message for the problem nearest to the cursor on the + given line in the preview window. The preview window can be easily closed + with the `q` key. If there is no message to show, the window will not be + opened. + + If a loclist item has a `detail` key set, the message for that key will be + preferred over `text`. See |ale-loclist-format|. + + A plug mapping `(ale_detail)` is defined for this command. + + + *:ALEInfo* +ALEInfo *ALEInfo* +ALEInfoToClipboard *ALEInfoToClipboard* + + Print runtime information about ALE, including the values of global and + buffer-local settings for ALE, the linters that are enabled, the commands + that have been run, and the output of commands. + + ALE will log the commands that are run by default. If you wish to disable + this, set |g:ale_history_enabled| to `0`. Because it could be expensive, ALE + does not remember the output of recent commands by default. Set + |g:ale_history_log_output| to `1` to enable logging of output for commands. + ALE will only log the output captured for parsing problems, etc. + + The command `:ALEInfoToClipboard` can be used to output ALEInfo directly to + your clipboard. This might not work on every machine. + + `:ALEInfoToFile` will write the ALE runtime information to a given filename. + The filename works just like |:w|. + + +ALEReset *ALEReset* +ALEResetBuffer *ALEResetBuffer* + + `ALEReset` will remove all problems reported by ALE for all buffers. + `ALEResetBuffer` will remove all problems reported for a single buffer. + + Either command will leave ALE linting enabled, so ALE will report problems + when linting is performed again. See |ale-lint| for more information. + + The following plug mappings are defined, for conveniently defining keybinds: + + |ALEReset| - `(ale_reset)` + |ALEResetBuffer| - `(ale_reset_buffer)` + + ALE can be disabled globally or for a buffer with |ALEDisable| or + |ALEDisableBuffer|. + + +ALEStopAllLSPs *ALEStopAllLSPs* + + `ALEStopAllLSPs` will close and stop all channels and jobs for all LSP-like + clients, including tsserver, remove all of the data stored for them, and + delete all of the problems found for them, updating every linted buffer. + + This command can be used when LSP clients mess up and need to be restarted. + + +=============================================================================== +9. API *ale-api* + +ALE offers a number of functions for running linters or fixers, or defining +them. The following functions are part of the publicly documented part of that +API, and should be expected to continue to work. + + +ale#Env(variable_name, value) *ale#Env()* + + Given a variable name and a string value, produce a string for including in + a command for setting environment variables. This function can be used for + building a command like so. > + + :echo string(ale#Env('VAR', 'some value') . 'command') + 'VAR=''some value'' command' # On Linux or Mac OSX + 'set VAR="some value" && command' # On Windows + + +ale#GetFilenameMappings(buffer, name) *ale#GetFilenameMappings()* + + Given a `buffer` and the `name` of either a linter for fixer, return a + |List| of two-item |List|s that describe mapping to and from the local and + foreign file systems for running a particular linter or fixer. + + See |g:ale_filename_mappings| for details on filename mapping. + + +ale#Has(feature) *ale#Has()* + + Return `1` if ALE supports a given feature, like |has()| for Vim features. + + ALE versions can be checked with version strings in the format + `ale#Has('ale-x.y.z')`, such as `ale#Has('ale-2.4.0')`. + + +ale#Pad(string) *ale#Pad()* + + Given a string or any |empty()| value, return either the string prefixed + with a single space, or an empty string. This function can be used to build + parts of a command from variables. + + +ale#Queue(delay, [linting_flag, buffer_number]) *ale#Queue()* + + Run linters for the current buffer, based on the filetype of the buffer, + with a given `delay`. A `delay` of `0` will run the linters immediately. + The linters will always be run in the background. Calling this function + again from the same buffer + + An optional `linting_flag` argument can be given. If `linting_flag` is + `'lint_file'`, then linters where the `lint_file` option evaluates to `1` + will be run. Otherwise, those linters will not be run. + + An optional `buffer_number` argument can be given for specifying the buffer + to check. The active buffer (`bufnr('')`) will be checked by default. + + *ale-cool-down* + If an exception is thrown when queuing/running ALE linters, ALE will enter + a cool down period where it will stop checking anything for a short period + of time. This is to prevent ALE from seriously annoying users if a linter + is broken, or when developing ALE itself. + + +ale#command#CreateDirectory(buffer) *ale#command#CreateDirectory()* + + Create a new temporary directory with a unique name, and manage that + directory with |ale#command#ManageDirectory()|, so it will be removed as soon + as possible. + + It is advised to only call this function from a callback function for + returning a linter command to run. + + +ale#command#CreateFile(buffer) *ale#command#CreateFile()* + + Create a new temporary file with a unique name, and manage that file with + |ale#command#ManageFile()|, so it will be removed as soon as possible. + + It is advised to only call this function from a callback function for + returning a linter command to run. + + +ale#command#Run(buffer, command, callback, [options]) *ale#command#Run()* + + Start running a job in the background, and pass the results to the given + callback later. + + This function can be used for computing the results of ALE linter or fixer + functions asynchronously with jobs. `buffer` must match the buffer being + linted or fixed, `command` must be a |String| for a shell command to + execute, `callback` must be defined as a |Funcref| to call later with the + results, and an optional |Dictionary| of `options` can be provided. + + The `callback` will receive the arguments `(buffer, output, metadata)`, + where the `buffer` will match the buffer given to the function, the `output` + will be a `List` of lines of output from the job that was run, and the + `metadata` will be a |Dictionary| with additional information about the job + that was run, including: + + `exit_code` - A |Number| with the exit code for the program that was run. + + The result of this function is either a special |Dictionary| ALE will use + for waiting for the command to finish, or `0` if the job is not started. The + The return value of the `callback` will be used as the eventual result for + whatever value is being given to ALE. For example: > + + function! s:GetCommand(buffer, output, meta) abort + " Do something with a:output here, from the foo command. + + " This is used as the command to run for linting. + return 'final command' + endfunction + + " ... + + 'command': {b -> ale#command#Run(b, 'foo', function('s:GetCommand'))} +< + The result of a callback can also be the result of another call to this + function, so that several commands can be arbitrarily chained together. For + example: > + + function! s:GetAnotherCommand(buffer, output, meta) abort + " We can finally return this command. + return 'last command' + endfunction + + function! s:GetCommand(buffer, output, meta) abort + " We can return another deferred result. + return ale#command#Run( + \ a:buffer, + \ 'second command', + \ function('s:GetAnotherCommand') + \) + endfunction + + " ... + + 'command': {b -> ale#command#Run(b, 'foo', function('s:GetCommand'))} +< + The following `options` can be provided. + + `cwd` - An optional |String| for setting the working directory + for the command, just as per |ale#linter#Define|. + + If not set, or `v:null`, the `cwd` of the last command + that spawned this one will be used. + + `output_stream` - Either `'stdout'`, `'stderr'`, `'both'`, or + `'none`' for selecting which output streams to read + lines from. + + The default is `'stdout'` + + `executable` - An executable for formatting into `%e` in the + command. If this option is not provided, formatting + commands with `%e` will not work. + + `read_buffer` - If set to `1`, the buffer will be piped into the + command. + + The default is `0`. + + `input` - When creating temporary files with `%t` or piping + text into a command `input` can be set to a |List| of + text to use instead of the buffer's text. + + `filename_mappings` - A |List| of two-item |List|s describing filename + mappings to apply for formatted filenames in the + command string, as per |g:ale_filename_mappings|. + + If the call to this function is being used for a + linter or fixer, the mappings should be provided with + this option, and can be retrieved easily with + |ale#GetFilenameMappings()|. + + The default is `[]`. + + + +ale#command#EscapeCommandPart(command_part) *ale#command#EscapeCommandPart()* + + Given a |String|, return a |String| with all `%` characters replaced with + `%%` instead. This function can be used to escape strings which are + dynamically generated for commands before handing them over to ALE, + so that ALE doesn't treat any strings with `%` formatting sequences + specially. + + +ale#command#ManageDirectory(buffer, directory) *ale#command#ManageDirectory()* + + Like |ale#command#ManageFile()|, but directories and all of their contents + will be deleted, akin to `rm -rf directory`, which could lead to loss of + data if mistakes are made. This command will also delete any temporary + filenames given to it. + + It is advised to use |ale#command#ManageFile()| instead for deleting single + files. + + +ale#command#ManageFile(buffer, filename) *ale#command#ManageFile()* + + Given a buffer number for a buffer currently running some linting or fixing + tasks and a filename, register a filename with ALE for automatic deletion + after linting or fixing is complete, or when Vim exits. + + If Vim exits suddenly, ALE will try its best to remove temporary files, but + ALE cannot guarantee with absolute certainty that the files will be removed. + It is advised to create temporary files in the operating system's managed + temporary file directory, such as with |tempname()|. + + Directory names should not be given to this function. ALE will only delete + files and symlinks given to this function. This is to prevent entire + directories from being accidentally deleted, say in cases of writing + `dir . '/' . filename` where `filename` is actually `''`, etc. ALE instead + manages directories separately with the |ale#command#ManageDirectory| function. + + +ale#completion#OmniFunc(findstart, base) *ale#completion#OmniFunc()* + + A completion function to use with 'omnifunc'. + + See |ale-completion|. + + +ale#engine#GetLoclist(buffer) *ale#engine#GetLoclist()* + + Given a buffer number, this function will return the list of problems + reported by ALE for a given buffer in the format accepted by |setqflist()|. + + A reference to the buffer's list of problems will be returned. The list must + be copied before applying |map()| or |filter()|. + + +ale#engine#IsCheckingBuffer(buffer) *ale#engine#IsCheckingBuffer()* + + Given a buffer number, returns `1` when ALE is busy checking that buffer. + + This function can be used for status lines, tab names, etc. + + +ale#fix#registry#Add(name, func, filetypes, desc, [aliases]) + *ale#fix#registry#Add()* + + Given a |String| `name` for a name to add to the registry, a |String| `func` + for a function name, a |List| `filetypes` for a list of filetypes to + set for suggestions, and a |String| `desc` for a short description of + the fixer, register a fixer in the registry. + + The `name` can then be used for |g:ale_fixers| in place of the function + name, and suggested for fixing files. + + An optional |List| of |String|s for aliases can be passed as the `aliases` + argument. These aliases can also be used for looking up a fixer function. + ALE will search for fixers in the registry first by `name`, then by their + `aliases`. + + For example to register a custom fixer for `luafmt`: > + + function! FormatLua(buffer) abort + return { + \ 'command': 'luafmt --stdin' + \} + endfunction + + execute ale#fix#registry#Add('luafmt', 'FormatLua', ['lua'], 'luafmt for lua') + + " You can now use it in g:ale_fixers + let g:ale_fixers = { + \ 'lua': ['luafmt'] + } +< + +ale#linter#Define(filetype, linter) *ale#linter#Define()* + + Given a |String| for a filetype and a |Dictionary| Describing a linter + configuration, add a linter for the given filetype. The dictionaries each + offer the following options: + + `name` The name of the linter. These names will be used by + |g:ale_linters| option for enabling/disabling + particular linters. + + This argument is required. + + `callback` A |String| or |Funcref| for a callback function + accepting two arguments (buffer, lines), for a + buffer number the output is for, and the lines of + output from a linter. + + This callback function should return a |List| of + |Dictionary| objects in the format accepted by + |setqflist()|. The |List| will be sorted by line and + then column order so it can be searched with a binary + search by in future before being passed on to the + |loclist|, etc. + + This argument is required, unless the linter is an + LSP linter. In which case, this argument must not be + defined, as LSP linters handle diagnostics + automatically. See |ale-lsp-linters|. + + If the function named does not exist, including if + the function is later deleted, ALE will behave as if + the callback returned an empty list. + + The keys for each item in the List will be handled in + the following manner: + *ale-loclist-format* + `text` - This error message is required. + `detail` - An optional, more descriptive message. + This message can be displayed with the |ALEDetail| + command instead of the message for `text`, if set. + `lnum` - The line number is required. Any strings + will be automatically converted to numbers by + using `str2nr()`. + + Line 0 will be moved to line 1, and lines beyond + the end of the file will be moved to the end. + `col` - The column number is optional and will + default to `0`. Any strings will be automatically + converted to number using `str2nr()`. + `end_col` - An optional end column number. + This key can be set to specify the column problems + end on, for improved highlighting. + `end_lnum` - An optional end line number. + This key can set along with `end_col` for + highlighting multi-line problems. + `bufnr` - This key represents the buffer number the + problems are for. This value will default to + the buffer number being checked. + + The `filename` key can be set instead of this key, + and then the eventual `bufnr` value in the final + list will either represent the number for an open + buffer or `-1` for a file not open in any buffer. + `filename` - An optional filename for the file the + problems are for. This should be an absolute path to + a file. + + Problems for files which have not yet been opened + will be set in those files after they are opened + and have been checked at least once. + + Temporary files in directories used for Vim + temporary files with `tempname()` will be assumed + to be the buffer being checked, unless the `bufnr` + key is also set with a valid number for some other + buffer. + `vcol` - Defaults to `0`. + + If set to `1`, ALE will convert virtual column + positions for `col` and `end_col` to byte column + positions. If the buffer is changed in-between + checking it and displaying the results, the + calculated byte column positions will probably be + wrong. + `type` - Defaults to `'E'`. + `nr` - Defaults to `-1`. + + Numeric error code. If `nr` is not `-1`, `code` + likely should contain the string representation of + the same value. + `code` - No default; may be unset. + + Human-readable |String| error code. + + `executable` A |String| naming the executable itself which + will be run, or a |Funcref| for a function to call + for computing the executable, accepting a buffer + number. + + The result can be computed with |ale#command#Run()|. + + This value will be used to check if the program + requested is installed or not. + + If an `executable` is not defined, the command will + be run without checking if a program is executable + first. Defining an executable path is recommended to + avoid starting too many processes. + + `command` A |String| for a command to run asynchronously, or a + |Funcref| for a function to call for computing the + command, accepting a buffer number. + + The result can be computed with |ale#command#Run()|. + + The command string can be formatted with format + markers. See |ale-command-format-strings|. + + This command will be fed the lines from the buffer to + check, and will produce the lines of output given to + the `callback`. + + `cwd` An optional |String| for setting the working + directory for the command, or a |Funcref| for a + function to call for computing the command, accepting + a buffer number. The working directory can be + specified as a format string for determining the path + dynamically. See |ale-command-format-strings|. + + To set the working directory to the directory + containing the file you're checking, you should + probably use `'%s:h'` as the option value. + + If this option is absent or the string is empty, the + `command` will be run with no determined working + directory in particular. + + The directory specified with this option will be used + as the default working directory for all commands run + in a chain with |ale#command#Run()|, unless otherwise + specified. + + `output_stream` A |String| for the output stream the lines of output + should be read from for the command which is run. The + accepted values are `'stdout'`, `'stderr'`, and + `'both'`. This argument defaults to `'stdout'`. This + argument can be set for linter programs which output + their errors and warnings to the stderr stream + instead of stdout. The option `'both'` will read + from both stder and stdout at the same time. + + `read_buffer` A |Number| (`0` or `1`) indicating whether a command + should read the Vim buffer as input via stdin. This + option is set to `1` by default, and can be disabled + if a command manually reads from a temporary file + instead, etc. + + This option behaves as if it was set to `0` when the + `lint_file` option evaluates to `1`. + + *ale-lint-file* + `lint_file` A |Number| (`0` or `1`), or a |Funcref| for a function + accepting a buffer number for computing either `0` or + `1`, indicating whether a command should read the file + instead of the Vim buffer. This option can be used + for linters which must check the file on disk, and + which cannot check a Vim buffer instead. + + The result can be computed with |ale#command#Run()|. + + Linters where the eventual value of this option + evaluates to `1` will not be run as a user types, per + |g:ale_lint_on_text_changed|. Linters will instead be + run only when events occur against the file on disk, + including |g:ale_lint_on_enter| and + |g:ale_lint_on_save|. Linters where this option + evaluates to `1` will also be run when the |ALELint| + command is run. + + When this option is evaluates to `1`, ALE will behave + as if `read_buffer` was set to `0`. + + *ale-lsp-linters* + `lsp` A |String| for defining LSP (Language Server Protocol) + linters. + + This argument may be omitted or `''` when a linter + does not represent an LSP linter. + + When this argument is set to `'stdio'`, then the + linter will be defined as an LSP linter which keeps a + process for a language server running, and + communicates with it directly via a |channel|. + `executable` and `command` must be set. + + When this argument is set to `'socket'`, then the + linter will be defined as an LSP linter via a TCP + or named pipe socket connection. `address` must be set. + + ALE will not start a server automatically. + + When this argument is not empty `project_root` must + be defined. + + `language` can be defined to describe the language + for a file. The filetype will be used as the language + by default. + + LSP linters handle diagnostics automatically, so + the `callback` argument must not be defined. + + An optional `completion_filter` callback may be + defined for filtering completion results. + + `initialization_options` may be defined to pass + initialization options to the LSP. + + `lsp_config` may be defined to pass configuration + settings to the LSP. + + `address` A |String| representing an address to connect to, + or a |Funcref| accepting a buffer number and + returning the |String|. If the value contains a + colon, it is interpreted as referring to a TCP + socket; otherwise it is interpreted as the path of a + named pipe. + + The result can be computed with |ale#command#Run()|. + + This argument must only be set if the `lsp` argument + is set to `'socket'`. + + `project_root` A |String| representing a path to the project for + the file being checked with the language server, or + a |Funcref| accepting a buffer number and returning + the |String|. + + If an empty string is returned, the file will not be + checked at all. + + This argument must only be set if the `lsp` argument + is also set to a non-empty string. + + `language` A |String| representing the name of the language + being checked, or a |Funcref| accepting a buffer + number and returning the |String|. This string will + be sent to the LSP to tell it what type of language + is being checked. + + If a language isn't provided, the language will + default to the value of the filetype given to + |ale#linter#Define|. + + `completion_filter` A |String| or |Funcref| for a callback function + accepting a buffer number and a completion item. + + The completion item will be a |Dictionary| following + the Language Server Protocol `CompletionItem` + interface as described in the specification, + available online here: + https://microsoft.github.io/language-server-protocol + + `aliases` A |List| of aliases for the linter name. + + This argument can be set with alternative names for + selecting the linter with |g:ale_linters|. This + setting can make it easier to guess the linter name + by offering a few alternatives. + + `initialization_options` A |Dictionary| of initialization options for LSPs, + or a |Funcref| for a callback function accepting + a buffer number and returning the |Dictionary|. + + This will be fed (as JSON) to the LSP in the + initialize command. + + `lsp_config` A |Dictionary| for configuring a language server, + or a |Funcref| for a callback function accepting + a buffer number and returning the |Dictionary|. + + This will be fed (as JSON) to the LSP in the + workspace/didChangeConfiguration command. + + If temporary files or directories are created for commands run with + `command`, then these temporary files or directories can be managed by ALE, + for automatic deletion. See |ale#command#ManageFile()| and + |ale#command#ManageDirectory| for more information. + + *ale-command-format-strings* + + All command strings will be formatted for special character sequences. + Any substring `%s` will be replaced with the full path to the current file + being edited. This format option can be used to pass the exact filename + being edited to a program. + + For example: > + 'command': 'eslint -f unix --stdin --stdin-filename %s' +< + Any substring `%t` will be replaced with a path to a temporary file. Merely + adding `%t` will cause ALE to create a temporary file containing the + contents of the buffer being checked. All occurrences of `%t` in command + strings will reference the one temporary file. The temporary file will be + created inside a temporary directory, and the entire temporary directory + will be automatically deleted, following the behavior of + |ale#command#ManageDirectory|. This option can be used for some linters which + do not support reading from stdin. + + For example: > + 'command': 'ghc -fno-code -v0 %t', +< + Any substring `%e` will be replaced with the escaped executable supplied + with `executable`. This provides a convenient way to define a command string + which needs to include a dynamic executable name, but which is otherwise + static. + + For example: > + 'command': '%e --some-argument', +< + The character sequence `%%` can be used to emit a literal `%` into a + command, so literal character sequences `%s` and `%t` can be escaped by + using `%%s` and `%%t` instead, etc. + + Some |filename-modifiers| can be applied to `%s` and `%t`. Only `:h`, `:t`, + `:r`, and `:e` may be applied, other modifiers will be ignored. Filename + modifiers can be applied to the format markers by placing them after them. + + For example: > + 'command': '%s:h %s:e %s:h:t', +< + Given a path `/foo/baz/bar.txt`, the above command string will generate + something akin to `'/foo/baz' 'txt' 'baz'` + + If a callback for a command generates part of a command string which might + possibly contain `%%`, `%s`, `%t`, or `%e`, where the special formatting + behavior is not desired, the |ale#command#EscapeCommandPart()| function can + be used to replace those characters to avoid formatting issues. + + *ale-linter-loading-behavior* + + Linters for ALE will be loaded by searching |runtimepath| in the following + format: > + + ale_linters//.vim +< + Any linters which exist anywhere in |runtimepath| with that directory + structure will be automatically loaded for the matching |filetype|. Filetypes + containing `.` characters will be split into individual parts, and files + will be loaded for each filetype between the `.` characters. + + Linters can be defined from vimrc and other files as long as this function + is loaded first. For example, the following code will define a Hello World + linter in vimrc in Vim 8: > + + " Plugins have to be loaded first. + " If you are using a plugin manager, run that first. + packloadall + + call ale#linter#Define('vim', { + \ 'name': 'echo-test', + \ 'executable': 'echo', + \ 'command': 'echo hello world', + \ 'callback': {buffer, lines -> map(lines, '{"text": v:val, "lnum": 1}')}, + \}) +< + +ale#linter#Get(filetype) *ale#linter#Get()* + + Return all of linters configured for a given filetype as a |List| of + |Dictionary| values in the format specified by |ale#linter#Define()|. + + Filetypes may be dot-separated to invoke linters for multiple filetypes: + for instance, the filetype `javascript.jsx` will return linters for both the + `javascript` and `jsx` filetype. + + Aliases may be defined in as described in |g:ale_linter_aliases|. Aliases + are applied after dot-separated filetypes are broken up into their + components. + + +ale#linter#PreventLoading(filetype) *ale#linter#PreventLoading()* + + Given a `filetype`, prevent any more linters from being loaded from + |runtimepath| for that filetype. This function can be called from vimrc or + similar to prevent ALE from loading linters. + + +ale#lsp_linter#SendRequest(buffer, linter_name, message, [Handler]) + *ale#lsp_linter#SendRequest()* + + Send a custom request to an LSP linter. The arguments are defined as + follows: + + `buffer` A valid buffer number. + + `linter_name` A |String| identifying an LSP linter that is available and + enabled for the |filetype| of `buffer`. + + `message` A |List| in the form `[is_notification, method, parameters]`, + containing three elements: + `is_notification` - an |Integer| that has value 1 if the + request is a notification, 0 otherwise; + `method` - a |String|, identifying an LSP method supported + by `linter`; + `parameters` - a |dictionary| of LSP parameters that are + applicable to `method`. + + `Handler` Optional argument, meaningful only when `message[0]` is 0. + A |Funcref| that is called when a response to the request is + received, and takes as unique argument a dictionary + representing the response obtained from the server. + + +ale#other_source#ShowResults(buffer, linter_name, loclist) + *ale#other_source#ShowResults()* + + Show results from another source of information. + + `buffer` must be a valid buffer number, and `linter_name` must be a unique + name for identifying another source of information. The `loclist` given + where the problems in a buffer are, and should be provided in the format ALE + uses for regular linter results. See |ale-loclist-format|. + + +ale#other_source#StartChecking(buffer, linter_name) + *ale#other_source#StartChecking()* + + Tell ALE that another source of information has started checking a buffer. + + `buffer` must be a valid buffer number, and `linter_name` must be a unique + name for identifying another source of information. + + +ale#statusline#Count(buffer) *ale#statusline#Count()* + + Given the number of a buffer which may have problems, return a |Dictionary| + containing information about the number of problems detected by ALE. The + following keys are supported: + + `error` -> The number of problems with type `E` and `sub_type != 'style'` + `warning` -> The number of problems with type `W` and `sub_type != 'style'` + `info` -> The number of problems with type `I` + `style_error` -> The number of problems with type `E` and `sub_type == 'style'` + `style_warning` -> The number of problems with type `W` and `sub_type == 'style'` + `total` -> The total number of problems. + + +ale#statusline#FirstProblem(buffer, type) *ale#statusline#FirstProblem()* + + Returns a copy of the first entry in the `loclist` that matches the supplied + buffer number and problem type. If there is no such entry, an empty dictionary + is returned. + Problem type should be one of the strings listed below: + + `error` -> Returns the first `loclist` item with type `E` and + `sub_type != 'style'` + `warning` -> First item with type `W` and `sub_type != 'style'` + `info` -> First item with type `I` + `style_error` -> First item with type `E` and `sub_type == 'style'` + `style_warning` -> First item with type `W` and `sub_type == 'style'` + + +b:ale_linted *b:ale_linted* + + `b:ale_linted` is set to the number of times a buffer has been checked by + ALE after all linters for one lint cycle have finished checking a buffer. + This variable may not be defined until ALE first checks a buffer, so it + should be accessed with |get()| or |getbufvar()|. For example: > + + " Print a message indicating how many times ALE has checked this buffer. + echo 'ALE has checked this buffer ' . get(b:, 'ale_linted') . ' time(s).' + " Print 'checked' using getbufvar() if a buffer has been checked. + echo getbufvar(bufnr(''), 'ale_linted', 0) > 0 ? 'checked' : 'not checked' +< + +g:ale_want_results_buffer *g:ale_want_results_buffer* + + `g:ale_want_results_buffer` is set to the number of the buffer being checked + when the |ALEWantResults| event is signaled. This variable should be read to + figure out which buffer other sources should lint. + + +ALECompletePost *ALECompletePost-autocmd* + *ALECompletePost* + + This |User| autocmd is triggered after ALE inserts an item on + |CompleteDone|. This event can be used to run commands after a buffer + is changed by ALE as the result of completion. For example, |ALEFix| can + be configured to run automatically when completion is done: > + + augroup FixAfterComplete + autocmd! + " Run ALEFix when completion items are added. + autocmd User ALECompletePost ALEFix! + " If ALE starts fixing a file, stop linters running for now. + autocmd User ALEFixPre ALELintStop + augroup END +< + +ALELintPre *ALELintPre-autocmd* + *ALELintPre* +ALELintPost *ALELintPost-autocmd* + *ALELintPost* +ALEFixPre *ALEFixPre-autocmd* + *ALEFixPre* +ALEFixPost *ALEFixPost-autocmd* + *ALEFixPost* + + These |User| autocommands are triggered before and after every lint or fix + cycle. They can be used to update statuslines, send notifications, etc. + The autocmd commands are run with |:silent|, so |:unsilent| is required for + echoing messages. + + For example to change the color of the statusline while the linter is + running: +> + augroup ALEProgress + autocmd! + autocmd User ALELintPre hi Statusline ctermfg=darkgrey + autocmd User ALELintPost hi Statusline ctermfg=NONE + augroup END +< + Or to display the progress in the statusline: +> + let s:ale_running = 0 + let l:stl .= '%{s:ale_running ? "[linting]" : ""}' + augroup ALEProgress + autocmd! + autocmd User ALELintPre let s:ale_running = 1 | redrawstatus + autocmd User ALELintPost let s:ale_running = 0 | redrawstatus + augroup END + +< +ALEJobStarted *ALEJobStarted-autocmd* + *ALEJobStarted* + + This |User| autocommand is triggered immediately after a job is successfully + run. This provides better accuracy for checking linter status with + |ale#engine#IsCheckingBuffer()| over |ALELintPre-autocmd|, which is actually + triggered before any linters are executed. + +ALELSPStarted *ALELSPStarted-autocmd* + *ALELSPStarted* + + This |User| autocommand is triggered immediately after an LSP connection is + successfully initialized. This provides a way to perform any additional + initialization work, such as setting up buffer-level mappings. + + +ALEWantResults *ALEWantResults-autocmd* + *ALEWantResults* + + This |User| autocommand is triggered before ALE begins a lint cycle. Another + source can respond by calling |ale#other_source#StartChecking()|, and + |ALELintPre| will be signaled thereafter, to allow other plugins to know + that another source is checking the buffer. + + |g:ale_want_results_buffer| will be set to the number for a buffer being + checked when the event is signaled, and deleted after the event is done. + This variable should be read to know which buffer to check. + + Other plugins can use this event to start checking buffers when ALE events + for checking buffers are triggered. + + +=============================================================================== +10. Special Thanks *ale-special-thanks* + +Special thanks to Mark Grealish (https://www.bhalash.com/) for providing ALE's +snazzy looking ale glass logo. Cheers, Mark! + +=============================================================================== +11. Contact *ale-contact* + +If you like this plugin, and wish to get in touch, check out the GitHub +page for issues and more at https://github.com/dense-analysis/ale + +If you wish to contact the author of this plugin directly, please feel +free to send an email to devw0rp@gmail.com. + +Please drink responsibly, or not at all, which is ironically the preference +of w0rp, who is teetotal. + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/dot_vim/plugged/ale/doc/tags b/dot_vim/plugged/ale/doc/tags new file mode 100644 index 0000000..88da9b4 --- /dev/null +++ b/dot_vim/plugged/ale/doc/tags @@ -0,0 +1,2561 @@ +:ALEDetail ale.txt /*:ALEDetail* +:ALEInfo ale.txt /*:ALEInfo* +:ALELint ale.txt /*:ALELint* +ALECodeAction ale.txt /*ALECodeAction* +ALEComplete ale.txt /*ALEComplete* +ALECompletePost ale.txt /*ALECompletePost* +ALECompletePost-autocmd ale.txt /*ALECompletePost-autocmd* +ALEDetail ale.txt /*ALEDetail* +ALEDisable ale.txt /*ALEDisable* +ALEDisableBuffer ale.txt /*ALEDisableBuffer* +ALEDocumentation ale.txt /*ALEDocumentation* +ALEEnable ale.txt /*ALEEnable* +ALEEnableBuffer ale.txt /*ALEEnableBuffer* +ALEError ale.txt /*ALEError* +ALEErrorLine ale.txt /*ALEErrorLine* +ALEErrorSign ale.txt /*ALEErrorSign* +ALEErrorSignLineNr ale.txt /*ALEErrorSignLineNr* +ALEFileRename ale.txt /*ALEFileRename* +ALEFindReferences ale.txt /*ALEFindReferences* +ALEFirst ale.txt /*ALEFirst* +ALEFix ale.txt /*ALEFix* +ALEFixPost ale.txt /*ALEFixPost* +ALEFixPost-autocmd ale.txt /*ALEFixPost-autocmd* +ALEFixPre ale.txt /*ALEFixPre* +ALEFixPre-autocmd ale.txt /*ALEFixPre-autocmd* +ALEFixSuggest ale.txt /*ALEFixSuggest* +ALEGoToDefinition ale.txt /*ALEGoToDefinition* +ALEGoToImplementation ale.txt /*ALEGoToImplementation* +ALEGoToTypeDefinition ale.txt /*ALEGoToTypeDefinition* +ALEHover ale.txt /*ALEHover* +ALEImport ale.txt /*ALEImport* +ALEInfo ale.txt /*ALEInfo* +ALEInfo-highlight ale.txt /*ALEInfo-highlight* +ALEInfo. ale.txt /*ALEInfo.* +ALEInfoLine ale.txt /*ALEInfoLine* +ALEInfoSign ale.txt /*ALEInfoSign* +ALEInfoSignLineNr ale.txt /*ALEInfoSignLineNr* +ALEInfoToClipboard ale.txt /*ALEInfoToClipboard* +ALEJobStarted ale.txt /*ALEJobStarted* +ALEJobStarted-autocmd ale.txt /*ALEJobStarted-autocmd* +ALELSPStarted ale.txt /*ALELSPStarted* +ALELSPStarted-autocmd ale.txt /*ALELSPStarted-autocmd* +ALELast ale.txt /*ALELast* +ALELint ale.txt /*ALELint* +ALELintPost ale.txt /*ALELintPost* +ALELintPost-autocmd ale.txt /*ALELintPost-autocmd* +ALELintPre ale.txt /*ALELintPre* +ALELintPre-autocmd ale.txt /*ALELintPre-autocmd* +ALELintStop ale.txt /*ALELintStop* +ALENext ale.txt /*ALENext* +ALENextWrap ale.txt /*ALENextWrap* +ALEOrganizeImports ale.txt /*ALEOrganizeImports* +ALEPopulateLocList ale.txt /*ALEPopulateLocList* +ALEPopulateQuickfix ale.txt /*ALEPopulateQuickfix* +ALEPrevious ale.txt /*ALEPrevious* +ALEPreviousWrap ale.txt /*ALEPreviousWrap* +ALERename ale.txt /*ALERename* +ALERepeatSelection ale.txt /*ALERepeatSelection* +ALEReset ale.txt /*ALEReset* +ALEResetBuffer ale.txt /*ALEResetBuffer* +ALEStopAllLSPs ale.txt /*ALEStopAllLSPs* +ALEStyleError ale.txt /*ALEStyleError* +ALEStyleErrorSign ale.txt /*ALEStyleErrorSign* +ALEStyleErrorSignLineNr ale.txt /*ALEStyleErrorSignLineNr* +ALEStyleWarning ale.txt /*ALEStyleWarning* +ALEStyleWarningSign ale.txt /*ALEStyleWarningSign* +ALEStyleWarningSignLineNr ale.txt /*ALEStyleWarningSignLineNr* +ALESymbolSearch ale.txt /*ALESymbolSearch* +ALEToggle ale.txt /*ALEToggle* +ALEToggleBuffer ale.txt /*ALEToggleBuffer* +ALEVirtualTextError ale.txt /*ALEVirtualTextError* +ALEVirtualTextInfo ale.txt /*ALEVirtualTextInfo* +ALEVirtualTextStyleError ale.txt /*ALEVirtualTextStyleError* +ALEVirtualTextStyleWarning ale.txt /*ALEVirtualTextStyleWarning* +ALEVirtualTextWarning ale.txt /*ALEVirtualTextWarning* +ALEWantResults ale.txt /*ALEWantResults* +ALEWantResults-autocmd ale.txt /*ALEWantResults-autocmd* +ALEWarning ale.txt /*ALEWarning* +ALEWarningLine ale.txt /*ALEWarningLine* +ALEWarningSign ale.txt /*ALEWarningSign* +ALEWarningSignLineNr ale.txt /*ALEWarningSignLineNr* +ale ale.txt /*ale* +ale#Env() ale.txt /*ale#Env()* +ale#GetFilenameMappings() ale.txt /*ale#GetFilenameMappings()* +ale#Has() ale.txt /*ale#Has()* +ale#Pad() ale.txt /*ale#Pad()* +ale#Queue() ale.txt /*ale#Queue()* +ale#command#CreateDirectory() ale.txt /*ale#command#CreateDirectory()* +ale#command#CreateFile() ale.txt /*ale#command#CreateFile()* +ale#command#EscapeCommandPart() ale.txt /*ale#command#EscapeCommandPart()* +ale#command#ManageDirectory() ale.txt /*ale#command#ManageDirectory()* +ale#command#ManageFile() ale.txt /*ale#command#ManageFile()* +ale#command#Run() ale.txt /*ale#command#Run()* +ale#completion#OmniFunc() ale.txt /*ale#completion#OmniFunc()* +ale#engine#GetLoclist() ale.txt /*ale#engine#GetLoclist()* +ale#engine#IsCheckingBuffer() ale.txt /*ale#engine#IsCheckingBuffer()* +ale#fix#registry#Add() ale.txt /*ale#fix#registry#Add()* +ale#linter#Define() ale.txt /*ale#linter#Define()* +ale#linter#Get() ale.txt /*ale#linter#Get()* +ale#linter#PreventLoading() ale.txt /*ale#linter#PreventLoading()* +ale#lsp_linter#SendRequest() ale.txt /*ale#lsp_linter#SendRequest()* +ale#other_source#ShowResults() ale.txt /*ale#other_source#ShowResults()* +ale#other_source#StartChecking() ale.txt /*ale#other_source#StartChecking()* +ale#statusline#Count() ale.txt /*ale#statusline#Count()* +ale#statusline#FirstProblem() ale.txt /*ale#statusline#FirstProblem()* +ale-ada-cspell ale-ada.txt /*ale-ada-cspell* +ale-ada-gcc ale-ada.txt /*ale-ada-gcc* +ale-ada-gnatpp ale-ada.txt /*ale-ada-gnatpp* +ale-ada-language-server ale-ada.txt /*ale-ada-language-server* +ale-ada-options ale-ada.txt /*ale-ada-options* +ale-alex-options ale.txt /*ale-alex-options* +ale-ansible-ansible-lint ale-ansible.txt /*ale-ansible-ansible-lint* +ale-ansible-language-server ale-ansible.txt /*ale-ansible-language-server* +ale-ansible-options ale-ansible.txt /*ale-ansible-options* +ale-api ale.txt /*ale-api* +ale-apkbuild-apkbuild-lint ale-apkbuild.txt /*ale-apkbuild-apkbuild-lint* +ale-apkbuild-options ale-apkbuild.txt /*ale-apkbuild-options* +ale-apkbuild-secfixes-check ale-apkbuild.txt /*ale-apkbuild-secfixes-check* +ale-asciidoc-cspell ale-asciidoc.txt /*ale-asciidoc-cspell* +ale-asciidoc-options ale-asciidoc.txt /*ale-asciidoc-options* +ale-asciidoc-textlint ale-asciidoc.txt /*ale-asciidoc-textlint* +ale-asciidoc-write-good ale-asciidoc.txt /*ale-asciidoc-write-good* +ale-asm-gcc ale-asm.txt /*ale-asm-gcc* +ale-asm-options ale-asm.txt /*ale-asm-options* +ale-asyncomplete-integration ale.txt /*ale-asyncomplete-integration* +ale-avra-avra ale-avra.txt /*ale-avra-avra* +ale-avra-options ale-avra.txt /*ale-avra-options* +ale-awk-gawk ale-awk.txt /*ale-awk-gawk* +ale-awk-options ale-awk.txt /*ale-awk-options* +ale-bats-options ale-bats.txt /*ale-bats-options* +ale-bats-shellcheck ale-bats.txt /*ale-bats-shellcheck* +ale-bazel-buildifier ale-bazel.txt /*ale-bazel-buildifier* +ale-bazel-options ale-bazel.txt /*ale-bazel-options* +ale-bib-bibclean ale-bib.txt /*ale-bib-bibclean* +ale-bib-options ale-bib.txt /*ale-bib-options* +ale-bicep-bicep ale-bicep.txt /*ale-bicep-bicep* +ale-bicep-options ale-bicep.txt /*ale-bicep-options* +ale-bitbake-oelint_adv ale-bitbake.txt /*ale-bitbake-oelint_adv* +ale-bitbake-options ale-bitbake.txt /*ale-bitbake-options* +ale-c-astyle ale-c.txt /*ale-c-astyle* +ale-c-cc ale-c.txt /*ale-c-cc* +ale-c-ccls ale-c.txt /*ale-c-ccls* +ale-c-clang ale-c.txt /*ale-c-clang* +ale-c-clangd ale-c.txt /*ale-c-clangd* +ale-c-clangformat ale-c.txt /*ale-c-clangformat* +ale-c-clangtidy ale-c.txt /*ale-c-clangtidy* +ale-c-cppcheck ale-c.txt /*ale-c-cppcheck* +ale-c-cquery ale-c.txt /*ale-c-cquery* +ale-c-cspell ale-c.txt /*ale-c-cspell* +ale-c-flawfinder ale-c.txt /*ale-c-flawfinder* +ale-c-gcc ale-c.txt /*ale-c-gcc* +ale-c-options ale-c.txt /*ale-c-options* +ale-c-uncrustify ale-c.txt /*ale-c-uncrustify* +ale-cairo-options ale-cairo.txt /*ale-cairo-options* +ale-cairo-starknet ale-cairo.txt /*ale-cairo-starknet* +ale-chef-cookstyle ale-chef.txt /*ale-chef-cookstyle* +ale-chef-foodcritic ale-chef.txt /*ale-chef-foodcritic* +ale-chef-options ale-chef.txt /*ale-chef-options* +ale-clojure-clj-kondo ale-clojure.txt /*ale-clojure-clj-kondo* +ale-clojure-joker ale-clojure.txt /*ale-clojure-joker* +ale-clojure-options ale-clojure.txt /*ale-clojure-options* +ale-cloudformation-cfn-python-lint ale-cloudformation.txt /*ale-cloudformation-cfn-python-lint* +ale-cloudformation-options ale-cloudformation.txt /*ale-cloudformation-options* +ale-cmake-cmake-lint ale-cmake.txt /*ale-cmake-cmake-lint* +ale-cmake-cmakeformat ale-cmake.txt /*ale-cmake-cmakeformat* +ale-cmake-cmakelint ale-cmake.txt /*ale-cmake-cmakelint* +ale-cmake-options ale-cmake.txt /*ale-cmake-options* +ale-coding-standards ale-development.txt /*ale-coding-standards* +ale-command-format-strings ale.txt /*ale-command-format-strings* +ale-commands ale.txt /*ale-commands* +ale-completion ale.txt /*ale-completion* +ale-completion-completeopt-bug ale.txt /*ale-completion-completeopt-bug* +ale-completion-fallback ale.txt /*ale-completion-fallback* +ale-contact ale.txt /*ale-contact* +ale-contents ale.txt /*ale-contents* +ale-cool-down ale.txt /*ale-cool-down* +ale-cpp-astyle ale-cpp.txt /*ale-cpp-astyle* +ale-cpp-cc ale-cpp.txt /*ale-cpp-cc* +ale-cpp-ccls ale-cpp.txt /*ale-cpp-ccls* +ale-cpp-clang ale-cpp.txt /*ale-cpp-clang* +ale-cpp-clangcheck ale-cpp.txt /*ale-cpp-clangcheck* +ale-cpp-clangd ale-cpp.txt /*ale-cpp-clangd* +ale-cpp-clangformat ale-cpp.txt /*ale-cpp-clangformat* +ale-cpp-clangtidy ale-cpp.txt /*ale-cpp-clangtidy* +ale-cpp-clazy ale-cpp.txt /*ale-cpp-clazy* +ale-cpp-cppcheck ale-cpp.txt /*ale-cpp-cppcheck* +ale-cpp-cpplint ale-cpp.txt /*ale-cpp-cpplint* +ale-cpp-cquery ale-cpp.txt /*ale-cpp-cquery* +ale-cpp-cspell ale-cpp.txt /*ale-cpp-cspell* +ale-cpp-flawfinder ale-cpp.txt /*ale-cpp-flawfinder* +ale-cpp-gcc ale-cpp.txt /*ale-cpp-gcc* +ale-cpp-options ale-cpp.txt /*ale-cpp-options* +ale-cpp-uncrustify ale-cpp.txt /*ale-cpp-uncrustify* +ale-cs-clangformat ale-cs.txt /*ale-cs-clangformat* +ale-cs-csc ale-cs.txt /*ale-cs-csc* +ale-cs-cspell ale-cs.txt /*ale-cs-cspell* +ale-cs-dotnet-format ale-cs.txt /*ale-cs-dotnet-format* +ale-cs-mcs ale-cs.txt /*ale-cs-mcs* +ale-cs-mcsc ale-cs.txt /*ale-cs-mcsc* +ale-cs-options ale-cs.txt /*ale-cs-options* +ale-cs-uncrustify ale-cs.txt /*ale-cs-uncrustify* +ale-cspell-options ale.txt /*ale-cspell-options* +ale-css-cspell ale-css.txt /*ale-css-cspell* +ale-css-css-beautify ale-css.txt /*ale-css-css-beautify* +ale-css-fecs ale-css.txt /*ale-css-fecs* +ale-css-options ale-css.txt /*ale-css-options* +ale-css-prettier ale-css.txt /*ale-css-prettier* +ale-css-stylelint ale-css.txt /*ale-css-stylelint* +ale-css-vscode ale-css.txt /*ale-css-vscode* +ale-cuda-clangd ale-cuda.txt /*ale-cuda-clangd* +ale-cuda-clangformat ale-cuda.txt /*ale-cuda-clangformat* +ale-cuda-nvcc ale-cuda.txt /*ale-cuda-nvcc* +ale-cuda-options ale-cuda.txt /*ale-cuda-options* +ale-d-dfmt ale-d.txt /*ale-d-dfmt* +ale-d-dls ale-d.txt /*ale-d-dls* +ale-d-options ale-d.txt /*ale-d-options* +ale-d-uncrustify ale-d.txt /*ale-d-uncrustify* +ale-dafny-dafny ale-dafny.txt /*ale-dafny-dafny* +ale-dafny-options ale-dafny.txt /*ale-dafny-options* +ale-dart-analysis_server ale-dart.txt /*ale-dart-analysis_server* +ale-dart-analyze ale-dart.txt /*ale-dart-analyze* +ale-dart-dartfmt ale-dart.txt /*ale-dart-dartfmt* +ale-dart-format ale-dart.txt /*ale-dart-format* +ale-dart-options ale-dart.txt /*ale-dart-options* +ale-deoplete-integration ale.txt /*ale-deoplete-integration* +ale-design-goals ale-development.txt /*ale-design-goals* +ale-desktop-desktop-file-validate ale-desktop.txt /*ale-desktop-desktop-file-validate* +ale-desktop-options ale-desktop.txt /*ale-desktop-options* +ale-dev ale-development.txt /*ale-dev* +ale-dev-tests ale-development.txt /*ale-dev-tests* +ale-development ale-development.txt /*ale-development* +ale-development-contents ale-development.txt /*ale-development-contents* +ale-development-contributing ale-development.txt /*ale-development-contributing* +ale-development-fixer-tests ale-development.txt /*ale-development-fixer-tests* +ale-development-introduction ale-development.txt /*ale-development-introduction* +ale-development-linter-tests ale-development.txt /*ale-development-linter-tests* +ale-development-release ale-development.txt /*ale-development-release* +ale-development-tests ale-development.txt /*ale-development-tests* +ale-development-windows-tests ale-development.txt /*ale-development-windows-tests* +ale-development.txt ale-development.txt /*ale-development.txt* +ale-dhall-format ale-dhall.txt /*ale-dhall-format* +ale-dhall-freeze ale-dhall.txt /*ale-dhall-freeze* +ale-dhall-lint ale-dhall.txt /*ale-dhall-lint* +ale-dhall-options ale-dhall.txt /*ale-dhall-options* +ale-dockerfile-dockerfile_lint ale-dockerfile.txt /*ale-dockerfile-dockerfile_lint* +ale-dockerfile-dprint ale-dockerfile.txt /*ale-dockerfile-dprint* +ale-dockerfile-hadolint ale-dockerfile.txt /*ale-dockerfile-hadolint* +ale-dockerfile-options ale-dockerfile.txt /*ale-dockerfile-options* +ale-dprint-options ale.txt /*ale-dprint-options* +ale-elixir-credo ale-elixir.txt /*ale-elixir-credo* +ale-elixir-cspell ale-elixir.txt /*ale-elixir-cspell* +ale-elixir-dialyxir ale-elixir.txt /*ale-elixir-dialyxir* +ale-elixir-elixir-ls ale-elixir.txt /*ale-elixir-elixir-ls* +ale-elixir-mix ale-elixir.txt /*ale-elixir-mix* +ale-elixir-mix-format ale-elixir.txt /*ale-elixir-mix-format* +ale-elixir-options ale-elixir.txt /*ale-elixir-options* +ale-elm-elm-format ale-elm.txt /*ale-elm-elm-format* +ale-elm-elm-ls ale-elm.txt /*ale-elm-elm-ls* +ale-elm-elm-make ale-elm.txt /*ale-elm-elm-make* +ale-elm-options ale-elm.txt /*ale-elm-options* +ale-erlang-dialyzer ale-erlang.txt /*ale-erlang-dialyzer* +ale-erlang-elvis ale-erlang.txt /*ale-erlang-elvis* +ale-erlang-erlang_ls ale-erlang.txt /*ale-erlang-erlang_ls* +ale-erlang-erlc ale-erlang.txt /*ale-erlang-erlc* +ale-erlang-erlfmt ale-erlang.txt /*ale-erlang-erlfmt* +ale-erlang-options ale-erlang.txt /*ale-erlang-options* +ale-erlang-syntaxerl ale-erlang.txt /*ale-erlang-syntaxerl* +ale-eruby-erblint ale-eruby.txt /*ale-eruby-erblint* +ale-eruby-options ale-eruby.txt /*ale-eruby-options* +ale-eruby-ruumba ale-eruby.txt /*ale-eruby-ruumba* +ale-eslint-nested-configuration-files ale-javascript.txt /*ale-eslint-nested-configuration-files* +ale-find-references ale.txt /*ale-find-references* +ale-fish-fish_indent ale-fish.txt /*ale-fish-fish_indent* +ale-fish-options ale-fish.txt /*ale-fish-options* +ale-fix ale.txt /*ale-fix* +ale-fix-configuration ale.txt /*ale-fix-configuration* +ale-fortran-gcc ale-fortran.txt /*ale-fortran-gcc* +ale-fortran-language-server ale-fortran.txt /*ale-fortran-language-server* +ale-fortran-options ale-fortran.txt /*ale-fortran-options* +ale-fountain-options ale-fountain.txt /*ale-fountain-options* +ale-fuse-fusionlint ale-fuse.txt /*ale-fuse-fusionlint* +ale-fuse-options ale-fuse.txt /*ale-fuse-options* +ale-gitcommit-gitlint ale-gitcommit.txt /*ale-gitcommit-gitlint* +ale-gitcommit-options ale-gitcommit.txt /*ale-gitcommit-options* +ale-glsl-glslang ale-glsl.txt /*ale-glsl-glslang* +ale-glsl-glslls ale-glsl.txt /*ale-glsl-glslls* +ale-glsl-options ale-glsl.txt /*ale-glsl-options* +ale-go-bingo ale-go.txt /*ale-go-bingo* +ale-go-cspell ale-go.txt /*ale-go-cspell* +ale-go-gobuild ale-go.txt /*ale-go-gobuild* +ale-go-gofmt ale-go.txt /*ale-go-gofmt* +ale-go-gofumpt ale-go.txt /*ale-go-gofumpt* +ale-go-golangci-lint ale-go.txt /*ale-go-golangci-lint* +ale-go-golangserver ale-go.txt /*ale-go-golangserver* +ale-go-golines ale-go.txt /*ale-go-golines* +ale-go-golint ale-go.txt /*ale-go-golint* +ale-go-gometalinter ale-go.txt /*ale-go-gometalinter* +ale-go-gopls ale-go.txt /*ale-go-gopls* +ale-go-govet ale-go.txt /*ale-go-govet* +ale-go-options ale-go.txt /*ale-go-options* +ale-go-revive ale-go.txt /*ale-go-revive* +ale-go-staticcheck ale-go.txt /*ale-go-staticcheck* +ale-go-to-definition ale.txt /*ale-go-to-definition* +ale-go-to-implementation ale.txt /*ale-go-to-implementation* +ale-go-to-type-definition ale.txt /*ale-go-to-type-definition* +ale-graphql-eslint ale-graphql.txt /*ale-graphql-eslint* +ale-graphql-gqlint ale-graphql.txt /*ale-graphql-gqlint* +ale-graphql-options ale-graphql.txt /*ale-graphql-options* +ale-graphql-prettier ale-graphql.txt /*ale-graphql-prettier* +ale-hack-hack ale-hack.txt /*ale-hack-hack* +ale-hack-hackfmt ale-hack.txt /*ale-hack-hackfmt* +ale-hack-hhast ale-hack.txt /*ale-hack-hhast* +ale-hack-options ale-hack.txt /*ale-hack-options* +ale-handlebars-embertemplatelint ale-handlebars.txt /*ale-handlebars-embertemplatelint* +ale-handlebars-options ale-handlebars.txt /*ale-handlebars-options* +ale-handlebars-prettier ale-handlebars.txt /*ale-handlebars-prettier* +ale-haskell-brittany ale-haskell.txt /*ale-haskell-brittany* +ale-haskell-cabal-ghc ale-haskell.txt /*ale-haskell-cabal-ghc* +ale-haskell-cspell ale-haskell.txt /*ale-haskell-cspell* +ale-haskell-floskell ale-haskell.txt /*ale-haskell-floskell* +ale-haskell-ghc ale-haskell.txt /*ale-haskell-ghc* +ale-haskell-ghc-mod ale-haskell.txt /*ale-haskell-ghc-mod* +ale-haskell-hdevtools ale-haskell.txt /*ale-haskell-hdevtools* +ale-haskell-hfmt ale-haskell.txt /*ale-haskell-hfmt* +ale-haskell-hie ale-haskell.txt /*ale-haskell-hie* +ale-haskell-hindent ale-haskell.txt /*ale-haskell-hindent* +ale-haskell-hlint ale-haskell.txt /*ale-haskell-hlint* +ale-haskell-hls ale-haskell.txt /*ale-haskell-hls* +ale-haskell-options ale-haskell.txt /*ale-haskell-options* +ale-haskell-ormolu ale-haskell.txt /*ale-haskell-ormolu* +ale-haskell-stack-build ale-haskell.txt /*ale-haskell-stack-build* +ale-haskell-stack-ghc ale-haskell.txt /*ale-haskell-stack-ghc* +ale-haskell-stylish-haskell ale-haskell.txt /*ale-haskell-stylish-haskell* +ale-hcl-options ale-hcl.txt /*ale-hcl-options* +ale-hcl-packer-fmt ale-hcl.txt /*ale-hcl-packer-fmt* +ale-hcl-terraform-fmt ale-hcl.txt /*ale-hcl-terraform-fmt* +ale-help-cspell ale-help.txt /*ale-help-cspell* +ale-help-options ale-help.txt /*ale-help-options* +ale-highlights ale.txt /*ale-highlights* +ale-hover ale.txt /*ale-hover* +ale-html-angular ale-html.txt /*ale-html-angular* +ale-html-beautify ale-html.txt /*ale-html-beautify* +ale-html-cspell ale-html.txt /*ale-html-cspell* +ale-html-fecs ale-html.txt /*ale-html-fecs* +ale-html-htmlhint ale-html.txt /*ale-html-htmlhint* +ale-html-options ale-html.txt /*ale-html-options* +ale-html-prettier ale-html.txt /*ale-html-prettier* +ale-html-stylelint ale-html.txt /*ale-html-stylelint* +ale-html-tidy ale-html.txt /*ale-html-tidy* +ale-html-vscode ale-html.txt /*ale-html-vscode* +ale-html-write-good ale-html.txt /*ale-html-write-good* +ale-idris-idris ale-idris.txt /*ale-idris-idris* +ale-idris-options ale-idris.txt /*ale-idris-options* +ale-ink-language-server ale-ink.txt /*ale-ink-language-server* +ale-ink-options ale-ink.txt /*ale-ink-options* +ale-inko-inko ale-inko.txt /*ale-inko-inko* +ale-inko-options ale-inko.txt /*ale-inko-options* +ale-integration-glsl ale-glsl.txt /*ale-integration-glsl* +ale-integration-hack ale-hack.txt /*ale-integration-hack* +ale-integration-inko ale-inko.txt /*ale-integration-inko* +ale-integration-kotlin ale-kotlin.txt /*ale-integration-kotlin* +ale-integration-options ale.txt /*ale-integration-options* +ale-integration-rust ale-rust.txt /*ale-integration-rust* +ale-integration-spec ale-spec.txt /*ale-integration-spec* +ale-integration-zeek ale-zeek.txt /*ale-integration-zeek* +ale-integration-zig ale-zig.txt /*ale-integration-zig* +ale-integrations-local-executables ale.txt /*ale-integrations-local-executables* +ale-introduction ale.txt /*ale-introduction* +ale-ispc-ispc ale-ispc.txt /*ale-ispc-ispc* +ale-ispc-options ale-ispc.txt /*ale-ispc-options* +ale-java-checkstyle ale-java.txt /*ale-java-checkstyle* +ale-java-clangformat ale-java.txt /*ale-java-clangformat* +ale-java-cspell ale-java.txt /*ale-java-cspell* +ale-java-eclipselsp ale-java.txt /*ale-java-eclipselsp* +ale-java-google-java-format ale-java.txt /*ale-java-google-java-format* +ale-java-javac ale-java.txt /*ale-java-javac* +ale-java-javalsp ale-java.txt /*ale-java-javalsp* +ale-java-options ale-java.txt /*ale-java-options* +ale-java-pmd ale-java.txt /*ale-java-pmd* +ale-java-uncrustify ale-java.txt /*ale-java-uncrustify* +ale-javascript-clangformat ale-javascript.txt /*ale-javascript-clangformat* +ale-javascript-cspell ale-javascript.txt /*ale-javascript-cspell* +ale-javascript-deno ale-javascript.txt /*ale-javascript-deno* +ale-javascript-dprint ale-javascript.txt /*ale-javascript-dprint* +ale-javascript-eslint ale-javascript.txt /*ale-javascript-eslint* +ale-javascript-fecs ale-javascript.txt /*ale-javascript-fecs* +ale-javascript-flow ale-javascript.txt /*ale-javascript-flow* +ale-javascript-importjs ale-javascript.txt /*ale-javascript-importjs* +ale-javascript-jscs ale-javascript.txt /*ale-javascript-jscs* +ale-javascript-jshint ale-javascript.txt /*ale-javascript-jshint* +ale-javascript-options ale-javascript.txt /*ale-javascript-options* +ale-javascript-prettier ale-javascript.txt /*ale-javascript-prettier* +ale-javascript-prettier-eslint ale-javascript.txt /*ale-javascript-prettier-eslint* +ale-javascript-prettier-standard ale-javascript.txt /*ale-javascript-prettier-standard* +ale-javascript-standard ale-javascript.txt /*ale-javascript-standard* +ale-javascript-xo ale-javascript.txt /*ale-javascript-xo* +ale-json-clangformat ale-json.txt /*ale-json-clangformat* +ale-json-cspell ale-json.txt /*ale-json-cspell* +ale-json-dprint ale-json.txt /*ale-json-dprint* +ale-json-eslint ale-json.txt /*ale-json-eslint* +ale-json-fixjson ale-json.txt /*ale-json-fixjson* +ale-json-jq ale-json.txt /*ale-json-jq* +ale-json-jsonlint ale-json.txt /*ale-json-jsonlint* +ale-json-options ale-json.txt /*ale-json-options* +ale-json-prettier ale-json.txt /*ale-json-prettier* +ale-json-spectral ale-json.txt /*ale-json-spectral* +ale-json-vscode ale-json.txt /*ale-json-vscode* +ale-json5-eslint ale-json5.txt /*ale-json5-eslint* +ale-json5-options ale-json5.txt /*ale-json5-options* +ale-jsonc-eslint ale-jsonc.txt /*ale-jsonc-eslint* +ale-jsonc-options ale-jsonc.txt /*ale-jsonc-options* +ale-jsonnet-jsonnet-lint ale-jsonnet.txt /*ale-jsonnet-jsonnet-lint* +ale-jsonnet-jsonnetfmt ale-jsonnet.txt /*ale-jsonnet-jsonnetfmt* +ale-jsonnet-options ale-jsonnet.txt /*ale-jsonnet-options* +ale-julia-languageserver ale-julia.txt /*ale-julia-languageserver* +ale-julia-options ale-julia.txt /*ale-julia-options* +ale-kotlin-kotlinc ale-kotlin.txt /*ale-kotlin-kotlinc* +ale-kotlin-ktlint ale-kotlin.txt /*ale-kotlin-ktlint* +ale-kotlin-languageserver ale-kotlin.txt /*ale-kotlin-languageserver* +ale-kotlin-options ale-kotlin.txt /*ale-kotlin-options* +ale-languagetool-options ale.txt /*ale-languagetool-options* +ale-latex-cspell ale-latex.txt /*ale-latex-cspell* +ale-latex-options ale-latex.txt /*ale-latex-options* +ale-latex-textlint ale-latex.txt /*ale-latex-textlint* +ale-latex-write-good ale-latex.txt /*ale-latex-write-good* +ale-less-lessc ale-less.txt /*ale-less-lessc* +ale-less-options ale-less.txt /*ale-less-options* +ale-less-prettier ale-less.txt /*ale-less-prettier* +ale-less-stylelint ale-less.txt /*ale-less-stylelint* +ale-lint ale.txt /*ale-lint* +ale-lint-file ale.txt /*ale-lint-file* +ale-lint-file-linters ale.txt /*ale-lint-file-linters* +ale-lint-language-servers ale.txt /*ale-lint-language-servers* +ale-lint-other-machines ale.txt /*ale-lint-other-machines* +ale-lint-other-sources ale.txt /*ale-lint-other-sources* +ale-lint-settings-on-startup ale.txt /*ale-lint-settings-on-startup* +ale-linter-loading-behavior ale.txt /*ale-linter-loading-behavior* +ale-linting-interrupts-mapping ale.txt /*ale-linting-interrupts-mapping* +ale-llvm-llc ale-llvm.txt /*ale-llvm-llc* +ale-llvm-options ale-llvm.txt /*ale-llvm-options* +ale-loclist-format ale.txt /*ale-loclist-format* +ale-lsp ale.txt /*ale-lsp* +ale-lsp-linters ale.txt /*ale-lsp-linters* +ale-lua-cspell ale-lua.txt /*ale-lua-cspell* +ale-lua-lua-format ale-lua.txt /*ale-lua-lua-format* +ale-lua-luac ale-lua.txt /*ale-lua-luac* +ale-lua-luacheck ale-lua.txt /*ale-lua-luacheck* +ale-lua-luafmt ale-lua.txt /*ale-lua-luafmt* +ale-lua-options ale-lua.txt /*ale-lua-options* +ale-lua-selene ale-lua.txt /*ale-lua-selene* +ale-lua-stylua ale-lua.txt /*ale-lua-stylua* +ale-make-checkmake ale-make.txt /*ale-make-checkmake* +ale-make-options ale-make.txt /*ale-make-options* +ale-markdown-cspell ale-markdown.txt /*ale-markdown-cspell* +ale-markdown-dprint ale-markdown.txt /*ale-markdown-dprint* +ale-markdown-markdownlint ale-markdown.txt /*ale-markdown-markdownlint* +ale-markdown-mdl ale-markdown.txt /*ale-markdown-mdl* +ale-markdown-options ale-markdown.txt /*ale-markdown-options* +ale-markdown-pandoc ale-markdown.txt /*ale-markdown-pandoc* +ale-markdown-prettier ale-markdown.txt /*ale-markdown-prettier* +ale-markdown-remark-lint ale-markdown.txt /*ale-markdown-remark-lint* +ale-markdown-textlint ale-markdown.txt /*ale-markdown-textlint* +ale-markdown-write-good ale-markdown.txt /*ale-markdown-write-good* +ale-mercury-mmc ale-mercury.txt /*ale-mercury-mmc* +ale-mercury-options ale-mercury.txt /*ale-mercury-options* +ale-nasm-nasm ale-nasm.txt /*ale-nasm-nasm* +ale-nasm-options ale-nasm.txt /*ale-nasm-options* +ale-navigation-commands ale.txt /*ale-navigation-commands* +ale-nim-nimcheck ale-nim.txt /*ale-nim-nimcheck* +ale-nim-nimlsp ale-nim.txt /*ale-nim-nimlsp* +ale-nim-nimpretty ale-nim.txt /*ale-nim-nimpretty* +ale-nim-options ale-nim.txt /*ale-nim-options* +ale-nix-nixfmt ale-nix.txt /*ale-nix-nixfmt* +ale-nix-nixpkgs-fmt ale-nix.txt /*ale-nix-nixpkgs-fmt* +ale-nix-options ale-nix.txt /*ale-nix-options* +ale-nix-statix ale-nix.txt /*ale-nix-statix* +ale-nroff-options ale-nroff.txt /*ale-nroff-options* +ale-nroff-write-good ale-nroff.txt /*ale-nroff-write-good* +ale-objc-ccls ale-objc.txt /*ale-objc-ccls* +ale-objc-clang ale-objc.txt /*ale-objc-clang* +ale-objc-clangd ale-objc.txt /*ale-objc-clangd* +ale-objc-clangformat ale-objc.txt /*ale-objc-clangformat* +ale-objc-options ale-objc.txt /*ale-objc-options* +ale-objc-uncrustify ale-objc.txt /*ale-objc-uncrustify* +ale-objcpp-clang ale-objcpp.txt /*ale-objcpp-clang* +ale-objcpp-clangd ale-objcpp.txt /*ale-objcpp-clangd* +ale-objcpp-options ale-objcpp.txt /*ale-objcpp-options* +ale-objcpp-uncrustify ale-objcpp.txt /*ale-objcpp-uncrustify* +ale-ocaml-dune ale-ocaml.txt /*ale-ocaml-dune* +ale-ocaml-merlin ale-ocaml.txt /*ale-ocaml-merlin* +ale-ocaml-ocamlformat ale-ocaml.txt /*ale-ocaml-ocamlformat* +ale-ocaml-ocamllsp ale-ocaml.txt /*ale-ocaml-ocamllsp* +ale-ocaml-ocp-indent ale-ocaml.txt /*ale-ocaml-ocp-indent* +ale-ocaml-ols ale-ocaml.txt /*ale-ocaml-ols* +ale-ocaml-options ale-ocaml.txt /*ale-ocaml-options* +ale-openapi-ibm-validator ale-openapi.txt /*ale-openapi-ibm-validator* +ale-openapi-options ale-openapi.txt /*ale-openapi-options* +ale-openapi-prettier ale-openapi.txt /*ale-openapi-prettier* +ale-openapi-yamllint ale-openapi.txt /*ale-openapi-yamllint* +ale-openscad-options ale-openscad.txt /*ale-openscad-options* +ale-openscad-sca2d ale-openscad.txt /*ale-openscad-sca2d* +ale-options ale.txt /*ale-options* +ale-other-integration-options ale.txt /*ale-other-integration-options* +ale-packer-fmt-fixer ale-packer.txt /*ale-packer-fmt-fixer* +ale-packer-options ale-packer.txt /*ale-packer-options* +ale-pascal-options ale-pascal.txt /*ale-pascal-options* +ale-pascal-ptop ale-pascal.txt /*ale-pascal-ptop* +ale-pawn-options ale-pawn.txt /*ale-pawn-options* +ale-pawn-uncrustify ale-pawn.txt /*ale-pawn-uncrustify* +ale-perl-options ale-perl.txt /*ale-perl-options* +ale-perl-perl ale-perl.txt /*ale-perl-perl* +ale-perl-perlcritic ale-perl.txt /*ale-perl-perlcritic* +ale-perl-perltidy ale-perl.txt /*ale-perl-perltidy* +ale-perl6-options ale-perl6.txt /*ale-perl6-options* +ale-perl6-perl6 ale-perl6.txt /*ale-perl6-perl6* +ale-php-cspell ale-php.txt /*ale-php-cspell* +ale-php-intelephense ale-php.txt /*ale-php-intelephense* +ale-php-langserver ale-php.txt /*ale-php-langserver* +ale-php-options ale-php.txt /*ale-php-options* +ale-php-phan ale-php.txt /*ale-php-phan* +ale-php-php ale-php.txt /*ale-php-php* +ale-php-php-cs-fixer ale-php.txt /*ale-php-php-cs-fixer* +ale-php-phpcbf ale-php.txt /*ale-php-phpcbf* +ale-php-phpcs ale-php.txt /*ale-php-phpcs* +ale-php-phpmd ale-php.txt /*ale-php-phpmd* +ale-php-phpstan ale-php.txt /*ale-php-phpstan* +ale-php-pint ale-php.txt /*ale-php-pint* +ale-php-psalm ale-php.txt /*ale-php-psalm* +ale-php-tlint ale-php.txt /*ale-php-tlint* +ale-po-options ale-po.txt /*ale-po-options* +ale-po-write-good ale-po.txt /*ale-po-write-good* +ale-pod-options ale-pod.txt /*ale-pod-options* +ale-pod-write-good ale-pod.txt /*ale-pod-write-good* +ale-pony-options ale-pony.txt /*ale-pony-options* +ale-pony-ponyc ale-pony.txt /*ale-pony-ponyc* +ale-powershell-cspell ale-powershell.txt /*ale-powershell-cspell* +ale-powershell-options ale-powershell.txt /*ale-powershell-options* +ale-powershell-powershell ale-powershell.txt /*ale-powershell-powershell* +ale-powershell-psscriptanalyzer ale-powershell.txt /*ale-powershell-psscriptanalyzer* +ale-prolog-options ale-prolog.txt /*ale-prolog-options* +ale-prolog-swipl ale-prolog.txt /*ale-prolog-swipl* +ale-proto-buf-format ale-proto.txt /*ale-proto-buf-format* +ale-proto-buf-lint ale-proto.txt /*ale-proto-buf-lint* +ale-proto-clangformat ale-proto.txt /*ale-proto-clangformat* +ale-proto-options ale-proto.txt /*ale-proto-options* +ale-proto-protoc-gen-lint ale-proto.txt /*ale-proto-protoc-gen-lint* +ale-proto-protolint ale-proto.txt /*ale-proto-protolint* +ale-pug-options ale-pug.txt /*ale-pug-options* +ale-pug-puglint ale-pug.txt /*ale-pug-puglint* +ale-puppet-languageserver ale-puppet.txt /*ale-puppet-languageserver* +ale-puppet-options ale-puppet.txt /*ale-puppet-options* +ale-puppet-puppet ale-puppet.txt /*ale-puppet-puppet* +ale-puppet-puppetlint ale-puppet.txt /*ale-puppet-puppetlint* +ale-purescript-language-server ale-purescript.txt /*ale-purescript-language-server* +ale-purescript-options ale-purescript.txt /*ale-purescript-options* +ale-purescript-purty ale-purescript.txt /*ale-purescript-purty* +ale-purescript-tidy ale-purescript.txt /*ale-purescript-tidy* +ale-pyrex-cython ale-pyrex.txt /*ale-pyrex-cython* +ale-pyrex-options ale-pyrex.txt /*ale-pyrex-options* +ale-python-autoflake ale-python.txt /*ale-python-autoflake* +ale-python-autoimport ale-python.txt /*ale-python-autoimport* +ale-python-autopep8 ale-python.txt /*ale-python-autopep8* +ale-python-bandit ale-python.txt /*ale-python-bandit* +ale-python-black ale-python.txt /*ale-python-black* +ale-python-cspell ale-python.txt /*ale-python-cspell* +ale-python-flake8 ale-python.txt /*ale-python-flake8* +ale-python-flakehell ale-python.txt /*ale-python-flakehell* +ale-python-isort ale-python.txt /*ale-python-isort* +ale-python-mypy ale-python.txt /*ale-python-mypy* +ale-python-options ale-python.txt /*ale-python-options* +ale-python-prospector ale-python.txt /*ale-python-prospector* +ale-python-pycodestyle ale-python.txt /*ale-python-pycodestyle* +ale-python-pydocstyle ale-python.txt /*ale-python-pydocstyle* +ale-python-pyflakes ale-python.txt /*ale-python-pyflakes* +ale-python-pyflyby ale-python.txt /*ale-python-pyflyby* +ale-python-pylama ale-python.txt /*ale-python-pylama* +ale-python-pylint ale-python.txt /*ale-python-pylint* +ale-python-pylsp ale-python.txt /*ale-python-pylsp* +ale-python-pyre ale-python.txt /*ale-python-pyre* +ale-python-pyright ale-python.txt /*ale-python-pyright* +ale-python-refurb ale-python.txt /*ale-python-refurb* +ale-python-reorder_python_imports ale-python.txt /*ale-python-reorder_python_imports* +ale-python-root ale-python.txt /*ale-python-root* +ale-python-ruff ale-python.txt /*ale-python-ruff* +ale-python-unimport ale-python.txt /*ale-python-unimport* +ale-python-vulture ale-python.txt /*ale-python-vulture* +ale-python-yapf ale-python.txt /*ale-python-yapf* +ale-qml-options ale-qml.txt /*ale-qml-options* +ale-qml-qmlfmt ale-qml.txt /*ale-qml-qmlfmt* +ale-r-languageserver ale-r.txt /*ale-r-languageserver* +ale-r-lintr ale-r.txt /*ale-r-lintr* +ale-r-options ale-r.txt /*ale-r-options* +ale-r-styler ale-r.txt /*ale-r-styler* +ale-racket-langserver ale-racket.txt /*ale-racket-langserver* +ale-racket-options ale-racket.txt /*ale-racket-options* +ale-racket-raco-fmt ale-racket.txt /*ale-racket-raco-fmt* +ale-reasonml-language-server ale-reasonml.txt /*ale-reasonml-language-server* +ale-reasonml-merlin ale-reasonml.txt /*ale-reasonml-merlin* +ale-reasonml-ols ale-reasonml.txt /*ale-reasonml-ols* +ale-reasonml-options ale-reasonml.txt /*ale-reasonml-options* +ale-reasonml-refmt ale-reasonml.txt /*ale-reasonml-refmt* +ale-refactor ale.txt /*ale-refactor* +ale-rego-cspell ale-rego.txt /*ale-rego-cspell* +ale-rego-opa-check ale-rego.txt /*ale-rego-opa-check* +ale-rego-opa-fmt-fixer ale-rego.txt /*ale-rego-opa-fmt-fixer* +ale-rego-options ale-rego.txt /*ale-rego-options* +ale-restructuredtext-cspell ale-restructuredtext.txt /*ale-restructuredtext-cspell* +ale-restructuredtext-options ale-restructuredtext.txt /*ale-restructuredtext-options* +ale-restructuredtext-textlint ale-restructuredtext.txt /*ale-restructuredtext-textlint* +ale-restructuredtext-write-good ale-restructuredtext.txt /*ale-restructuredtext-write-good* +ale-robot-options ale-robot.txt /*ale-robot-options* +ale-robot-rflint ale-robot.txt /*ale-robot-rflint* +ale-ruby-brakeman ale-ruby.txt /*ale-ruby-brakeman* +ale-ruby-cspell ale-ruby.txt /*ale-ruby-cspell* +ale-ruby-debride ale-ruby.txt /*ale-ruby-debride* +ale-ruby-options ale-ruby.txt /*ale-ruby-options* +ale-ruby-prettier ale-ruby.txt /*ale-ruby-prettier* +ale-ruby-rails_best_practices ale-ruby.txt /*ale-ruby-rails_best_practices* +ale-ruby-reek ale-ruby.txt /*ale-ruby-reek* +ale-ruby-rubocop ale-ruby.txt /*ale-ruby-rubocop* +ale-ruby-ruby ale-ruby.txt /*ale-ruby-ruby* +ale-ruby-rufo ale-ruby.txt /*ale-ruby-rufo* +ale-ruby-solargraph ale-ruby.txt /*ale-ruby-solargraph* +ale-ruby-sorbet ale-ruby.txt /*ale-ruby-sorbet* +ale-ruby-standardrb ale-ruby.txt /*ale-ruby-standardrb* +ale-ruby-syntax_tree ale-ruby.txt /*ale-ruby-syntax_tree* +ale-rust-analyzer ale-rust.txt /*ale-rust-analyzer* +ale-rust-cargo ale-rust.txt /*ale-rust-cargo* +ale-rust-cspell ale-rust.txt /*ale-rust-cspell* +ale-rust-options ale-rust.txt /*ale-rust-options* +ale-rust-rls ale-rust.txt /*ale-rust-rls* +ale-rust-rustc ale-rust.txt /*ale-rust-rustc* +ale-rust-rustfmt ale-rust.txt /*ale-rust-rustfmt* +ale-sass-options ale-sass.txt /*ale-sass-options* +ale-sass-sasslint ale-sass.txt /*ale-sass-sasslint* +ale-sass-stylelint ale-sass.txt /*ale-sass-stylelint* +ale-scala-cspell ale-scala.txt /*ale-scala-cspell* +ale-scala-metals ale-scala.txt /*ale-scala-metals* +ale-scala-options ale-scala.txt /*ale-scala-options* +ale-scala-sbtserver ale-scala.txt /*ale-scala-sbtserver* +ale-scala-scalafmt ale-scala.txt /*ale-scala-scalafmt* +ale-scala-scalastyle ale-scala.txt /*ale-scala-scalastyle* +ale-scss-options ale-scss.txt /*ale-scss-options* +ale-scss-prettier ale-scss.txt /*ale-scss-prettier* +ale-scss-sasslint ale-scss.txt /*ale-scss-sasslint* +ale-scss-stylelint ale-scss.txt /*ale-scss-stylelint* +ale-sh-bashate ale-sh.txt /*ale-sh-bashate* +ale-sh-cspell ale-sh.txt /*ale-sh-cspell* +ale-sh-language-server ale-sh.txt /*ale-sh-language-server* +ale-sh-options ale-sh.txt /*ale-sh-options* +ale-sh-shell ale-sh.txt /*ale-sh-shell* +ale-sh-shellcheck ale-sh.txt /*ale-sh-shellcheck* +ale-sh-shfmt ale-sh.txt /*ale-sh-shfmt* +ale-sml-options ale-sml.txt /*ale-sml-options* +ale-sml-smlnj ale-sml.txt /*ale-sml-smlnj* +ale-sml-smlnj-cm ale-sml.txt /*ale-sml-smlnj-cm* +ale-solidity-options ale-solidity.txt /*ale-solidity-options* +ale-solidity-solc ale-solidity.txt /*ale-solidity-solc* +ale-solidity-solhint ale-solidity.txt /*ale-solidity-solhint* +ale-solidity-solium ale-solidity.txt /*ale-solidity-solium* +ale-spec-options ale-spec.txt /*ale-spec-options* +ale-spec-rpmlint ale-spec.txt /*ale-spec-rpmlint* +ale-special-thanks ale.txt /*ale-special-thanks* +ale-sql-dprint ale-sql.txt /*ale-sql-dprint* +ale-sql-options ale-sql.txt /*ale-sql-options* +ale-sql-pgformatter ale-sql.txt /*ale-sql-pgformatter* +ale-sql-sqlfluff ale-sql.txt /*ale-sql-sqlfluff* +ale-sql-sqlfmt ale-sql.txt /*ale-sql-sqlfmt* +ale-sql-sqlformat ale-sql.txt /*ale-sql-sqlformat* +ale-stylus-options ale-stylus.txt /*ale-stylus-options* +ale-stylus-stylelint ale-stylus.txt /*ale-stylus-stylelint* +ale-sugarss-options ale-sugarss.txt /*ale-sugarss-options* +ale-sugarss-stylelint ale-sugarss.txt /*ale-sugarss-stylelint* +ale-support ale.txt /*ale-support* +ale-supported-languages-and-tools.txt ale-supported-languages-and-tools.txt /*ale-supported-languages-and-tools.txt* +ale-supported-list ale-supported-languages-and-tools.txt /*ale-supported-list* +ale-svelte-options ale-svelte.txt /*ale-svelte-options* +ale-svelte-prettier ale-svelte.txt /*ale-svelte-prettier* +ale-svelte-svelteserver ale-svelte.txt /*ale-svelte-svelteserver* +ale-swift-apple-swift-format ale-swift.txt /*ale-swift-apple-swift-format* +ale-swift-cspell ale-swift.txt /*ale-swift-cspell* +ale-swift-options ale-swift.txt /*ale-swift-options* +ale-swift-sourcekitlsp ale-swift.txt /*ale-swift-sourcekitlsp* +ale-symbol-search ale.txt /*ale-symbol-search* +ale-symbols ale.txt /*ale-symbols* +ale-systemd-analyze ale-systemd.txt /*ale-systemd-analyze* +ale-systemd-options ale-systemd.txt /*ale-systemd-options* +ale-tcl-nagelfar ale-tcl.txt /*ale-tcl-nagelfar* +ale-tcl-options ale-tcl.txt /*ale-tcl-options* +ale-terraform-checkov ale-terraform.txt /*ale-terraform-checkov* +ale-terraform-fmt-fixer ale-terraform.txt /*ale-terraform-fmt-fixer* +ale-terraform-options ale-terraform.txt /*ale-terraform-options* +ale-terraform-terraform ale-terraform.txt /*ale-terraform-terraform* +ale-terraform-terraform-ls ale-terraform.txt /*ale-terraform-terraform-ls* +ale-terraform-terraform-lsp ale-terraform.txt /*ale-terraform-terraform-lsp* +ale-terraform-tflint ale-terraform.txt /*ale-terraform-tflint* +ale-terraform-tfsec ale-terraform.txt /*ale-terraform-tfsec* +ale-tests ale-development.txt /*ale-tests* +ale-tex-chktex ale-tex.txt /*ale-tex-chktex* +ale-tex-cspell ale-tex.txt /*ale-tex-cspell* +ale-tex-lacheck ale-tex.txt /*ale-tex-lacheck* +ale-tex-latexindent ale-tex.txt /*ale-tex-latexindent* +ale-tex-options ale-tex.txt /*ale-tex-options* +ale-tex-texlab ale-tex.txt /*ale-tex-texlab* +ale-texinfo-cspell ale-texinfo.txt /*ale-texinfo-cspell* +ale-texinfo-options ale-texinfo.txt /*ale-texinfo-options* +ale-texinfo-write-good ale-texinfo.txt /*ale-texinfo-write-good* +ale-text-cspell ale-text.txt /*ale-text-cspell* +ale-text-options ale-text.txt /*ale-text-options* +ale-text-textlint ale-text.txt /*ale-text-textlint* +ale-text-write-good ale-text.txt /*ale-text-write-good* +ale-thrift-options ale-thrift.txt /*ale-thrift-options* +ale-thrift-thrift ale-thrift.txt /*ale-thrift-thrift* +ale-thrift-thriftcheck ale-thrift.txt /*ale-thrift-thriftcheck* +ale-toml-dprint ale-toml.txt /*ale-toml-dprint* +ale-toml-options ale-toml.txt /*ale-toml-options* +ale-typescript-cspell ale-typescript.txt /*ale-typescript-cspell* +ale-typescript-deno ale-typescript.txt /*ale-typescript-deno* +ale-typescript-dprint ale-typescript.txt /*ale-typescript-dprint* +ale-typescript-eslint ale-typescript.txt /*ale-typescript-eslint* +ale-typescript-options ale-typescript.txt /*ale-typescript-options* +ale-typescript-prettier ale-typescript.txt /*ale-typescript-prettier* +ale-typescript-standard ale-typescript.txt /*ale-typescript-standard* +ale-typescript-tslint ale-typescript.txt /*ale-typescript-tslint* +ale-typescript-tsserver ale-typescript.txt /*ale-typescript-tsserver* +ale-typescript-xo ale-typescript.txt /*ale-typescript-xo* +ale-v-options ale-v.txt /*ale-v-options* +ale-v-v ale-v.txt /*ale-v-v* +ale-v-vfmt ale-v.txt /*ale-v-vfmt* +ale-vala-options ale-vala.txt /*ale-vala-options* +ale-vala-uncrustify ale-vala.txt /*ale-vala-uncrustify* +ale-vala-vala-lint ale-vala.txt /*ale-vala-vala-lint* +ale-verilog-hdl-checker ale-verilog.txt /*ale-verilog-hdl-checker* +ale-verilog-iverilog ale-verilog.txt /*ale-verilog-iverilog* +ale-verilog-options ale-verilog.txt /*ale-verilog-options* +ale-verilog-verilator ale-verilog.txt /*ale-verilog-verilator* +ale-verilog-vlog ale-verilog.txt /*ale-verilog-vlog* +ale-verilog-xvlog ale-verilog.txt /*ale-verilog-xvlog* +ale-verilog-yosys ale-verilog.txt /*ale-verilog-yosys* +ale-vhdl-ghdl ale-vhdl.txt /*ale-vhdl-ghdl* +ale-vhdl-hdl-checker ale-vhdl.txt /*ale-vhdl-hdl-checker* +ale-vhdl-options ale-vhdl.txt /*ale-vhdl-options* +ale-vhdl-vcom ale-vhdl.txt /*ale-vhdl-vcom* +ale-vhdl-xvhdl ale-vhdl.txt /*ale-vhdl-xvhdl* +ale-vim-help-options ale-vim-help.txt /*ale-vim-help-options* +ale-vim-help-write-good ale-vim-help.txt /*ale-vim-help-write-good* +ale-vim-options ale-vim.txt /*ale-vim-options* +ale-vim-vimls ale-vim.txt /*ale-vim-vimls* +ale-vim-vint ale-vim.txt /*ale-vim-vint* +ale-vue-cspell ale-vue.txt /*ale-vue-cspell* +ale-vue-options ale-vue.txt /*ale-vue-options* +ale-vue-prettier ale-vue.txt /*ale-vue-prettier* +ale-vue-vls ale-vue.txt /*ale-vue-vls* +ale-vue-volar ale-vue.txt /*ale-vue-volar* +ale-wgsl-naga ale-wgsl.txt /*ale-wgsl-naga* +ale-wgsl-options ale-wgsl.txt /*ale-wgsl-options* +ale-write-good-options ale.txt /*ale-write-good-options* +ale-xhtml-cspell ale-xhtml.txt /*ale-xhtml-cspell* +ale-xhtml-options ale-xhtml.txt /*ale-xhtml-options* +ale-xhtml-write-good ale-xhtml.txt /*ale-xhtml-write-good* +ale-xml-options ale-xml.txt /*ale-xml-options* +ale-xml-xmllint ale-xml.txt /*ale-xml-xmllint* +ale-yaml-actionlint ale-yaml.txt /*ale-yaml-actionlint* +ale-yaml-circleci ale-yaml.txt /*ale-yaml-circleci* +ale-yaml-gitlablint ale-yaml.txt /*ale-yaml-gitlablint* +ale-yaml-language-server ale-yaml.txt /*ale-yaml-language-server* +ale-yaml-options ale-yaml.txt /*ale-yaml-options* +ale-yaml-prettier ale-yaml.txt /*ale-yaml-prettier* +ale-yaml-spectral ale-yaml.txt /*ale-yaml-spectral* +ale-yaml-swaglint ale-yaml.txt /*ale-yaml-swaglint* +ale-yaml-yamlfix ale-yaml.txt /*ale-yaml-yamlfix* +ale-yaml-yamllint ale-yaml.txt /*ale-yaml-yamllint* +ale-yang-lsp ale-yang.txt /*ale-yang-lsp* +ale-yang-options ale-yang.txt /*ale-yang-options* +ale-zeek-options ale-zeek.txt /*ale-zeek-options* +ale-zeek-zeek ale-zeek.txt /*ale-zeek-zeek* +ale-zig-options ale-zig.txt /*ale-zig-options* +ale-zig-zigfmt ale-zig.txt /*ale-zig-zigfmt* +ale-zig-zls ale-zig.txt /*ale-zig-zls* +ale.txt ale.txt /*ale.txt* +b:ale-c-flawfinder ale-c.txt /*b:ale-c-flawfinder* +b:ale-cpp-flawfinder ale-cpp.txt /*b:ale-cpp-flawfinder* +b:ale_ada_adals_encoding ale-ada.txt /*b:ale_ada_adals_encoding* +b:ale_ada_adals_executable ale-ada.txt /*b:ale_ada_adals_executable* +b:ale_ada_adals_project ale-ada.txt /*b:ale_ada_adals_project* +b:ale_ada_gcc_executable ale-ada.txt /*b:ale_ada_gcc_executable* +b:ale_ada_gcc_options ale-ada.txt /*b:ale_ada_gcc_options* +b:ale_ada_gnatpp_options ale-ada.txt /*b:ale_ada_gnatpp_options* +b:ale_alex_executable ale.txt /*b:ale_alex_executable* +b:ale_alex_use_global ale.txt /*b:ale_alex_use_global* +b:ale_ansible_ansible_lint_executable ale-ansible.txt /*b:ale_ansible_ansible_lint_executable* +b:ale_ansible_language_server ale-ansible.txt /*b:ale_ansible_language_server* +b:ale_ansible_language_server_config ale-ansible.txt /*b:ale_ansible_language_server_config* +b:ale_apkbuild_apkbuild_lint_executable ale-apkbuild.txt /*b:ale_apkbuild_apkbuild_lint_executable* +b:ale_apkbuild_secfixes_check_executable ale-apkbuild.txt /*b:ale_apkbuild_secfixes_check_executable* +b:ale_asm_gcc_executable ale-asm.txt /*b:ale_asm_gcc_executable* +b:ale_asm_gcc_options ale-asm.txt /*b:ale_asm_gcc_options* +b:ale_avra_avra_executable ale-avra.txt /*b:ale_avra_avra_executable* +b:ale_avra_avra_options ale-avra.txt /*b:ale_avra_avra_options* +b:ale_awk_gawk_executable ale-awk.txt /*b:ale_awk_gawk_executable* +b:ale_awk_gawk_options ale-awk.txt /*b:ale_awk_gawk_options* +b:ale_bazel_buildifier_executable ale-bazel.txt /*b:ale_bazel_buildifier_executable* +b:ale_bazel_buildifier_options ale-bazel.txt /*b:ale_bazel_buildifier_options* +b:ale_bazel_buildifier_use_global ale-bazel.txt /*b:ale_bazel_buildifier_use_global* +b:ale_bicep_bicep_executable ale-bicep.txt /*b:ale_bicep_bicep_executable* +b:ale_bicep_bicep_options ale-bicep.txt /*b:ale_bicep_bicep_options* +b:ale_c_always_make ale-c.txt /*b:ale_c_always_make* +b:ale_c_astyle_executable ale-c.txt /*b:ale_c_astyle_executable* +b:ale_c_astyle_project_options ale-c.txt /*b:ale_c_astyle_project_options* +b:ale_c_build_dir ale-c.txt /*b:ale_c_build_dir* +b:ale_c_build_dir_names ale-c.txt /*b:ale_c_build_dir_names* +b:ale_c_cc_executable ale-c.txt /*b:ale_c_cc_executable* +b:ale_c_cc_header_exts ale-c.txt /*b:ale_c_cc_header_exts* +b:ale_c_cc_options ale-c.txt /*b:ale_c_cc_options* +b:ale_c_cc_use_header_lang_flag ale-c.txt /*b:ale_c_cc_use_header_lang_flag* +b:ale_c_ccls_executable ale-c.txt /*b:ale_c_ccls_executable* +b:ale_c_ccls_init_options ale-c.txt /*b:ale_c_ccls_init_options* +b:ale_c_clangd_executable ale-c.txt /*b:ale_c_clangd_executable* +b:ale_c_clangd_options ale-c.txt /*b:ale_c_clangd_options* +b:ale_c_clangformat_executable ale-c.txt /*b:ale_c_clangformat_executable* +b:ale_c_clangformat_options ale-c.txt /*b:ale_c_clangformat_options* +b:ale_c_clangformat_style_option ale-c.txt /*b:ale_c_clangformat_style_option* +b:ale_c_clangformat_use_local_file ale-c.txt /*b:ale_c_clangformat_use_local_file* +b:ale_c_clangtidy_checks ale-c.txt /*b:ale_c_clangtidy_checks* +b:ale_c_clangtidy_executable ale-c.txt /*b:ale_c_clangtidy_executable* +b:ale_c_clangtidy_extra_options ale-c.txt /*b:ale_c_clangtidy_extra_options* +b:ale_c_clangtidy_fix_errors ale-c.txt /*b:ale_c_clangtidy_fix_errors* +b:ale_c_clangtidy_options ale-c.txt /*b:ale_c_clangtidy_options* +b:ale_c_cppcheck_executable ale-c.txt /*b:ale_c_cppcheck_executable* +b:ale_c_cppcheck_options ale-c.txt /*b:ale_c_cppcheck_options* +b:ale_c_cpplint_executable ale-cpp.txt /*b:ale_c_cpplint_executable* +b:ale_c_cpplint_options ale-cpp.txt /*b:ale_c_cpplint_options* +b:ale_c_cquery_cache_directory ale-c.txt /*b:ale_c_cquery_cache_directory* +b:ale_c_cquery_executable ale-c.txt /*b:ale_c_cquery_executable* +b:ale_c_flawfinder_error_severity ale-c.txt /*b:ale_c_flawfinder_error_severity* +b:ale_c_flawfinder_executable ale-c.txt /*b:ale_c_flawfinder_executable* +b:ale_c_flawfinder_minlevel ale-c.txt /*b:ale_c_flawfinder_minlevel* +b:ale_c_parse_compile_commands ale-c.txt /*b:ale_c_parse_compile_commands* +b:ale_c_parse_makefile ale-c.txt /*b:ale_c_parse_makefile* +b:ale_c_uncrustify_executable ale-c.txt /*b:ale_c_uncrustify_executable* +b:ale_c_uncrustify_options ale-c.txt /*b:ale_c_uncrustify_options* +b:ale_cairo_starknet_executable ale-cairo.txt /*b:ale_cairo_starknet_executable* +b:ale_chef_cookstyle_executable ale-chef.txt /*b:ale_chef_cookstyle_executable* +b:ale_chef_cookstyle_options ale-chef.txt /*b:ale_chef_cookstyle_options* +b:ale_chef_foodcritic_executable ale-chef.txt /*b:ale_chef_foodcritic_executable* +b:ale_chef_foodcritic_options ale-chef.txt /*b:ale_chef_foodcritic_options* +b:ale_clojure_clj_kondo_options ale-clojure.txt /*b:ale_clojure_clj_kondo_options* +b:ale_cmake_cmake_lint_executable ale-cmake.txt /*b:ale_cmake_cmake_lint_executable* +b:ale_cmake_cmake_lint_options ale-cmake.txt /*b:ale_cmake_cmake_lint_options* +b:ale_cmake_cmakeformat_executable ale-cmake.txt /*b:ale_cmake_cmakeformat_executable* +b:ale_cmake_cmakeformat_options ale-cmake.txt /*b:ale_cmake_cmakeformat_options* +b:ale_cmake_cmakelint_executable ale-cmake.txt /*b:ale_cmake_cmakelint_executable* +b:ale_cmake_cmakelint_options ale-cmake.txt /*b:ale_cmake_cmakelint_options* +b:ale_command_wrapper ale.txt /*b:ale_command_wrapper* +b:ale_completion_enabled ale.txt /*b:ale_completion_enabled* +b:ale_completion_excluded_words ale.txt /*b:ale_completion_excluded_words* +b:ale_cpp_astyle_executable ale-cpp.txt /*b:ale_cpp_astyle_executable* +b:ale_cpp_astyle_project_options ale-cpp.txt /*b:ale_cpp_astyle_project_options* +b:ale_cpp_cc_executable ale-cpp.txt /*b:ale_cpp_cc_executable* +b:ale_cpp_cc_header_exts ale-cpp.txt /*b:ale_cpp_cc_header_exts* +b:ale_cpp_cc_options ale-cpp.txt /*b:ale_cpp_cc_options* +b:ale_cpp_cc_use_header_lang_flag ale-cpp.txt /*b:ale_cpp_cc_use_header_lang_flag* +b:ale_cpp_ccls_executable ale-cpp.txt /*b:ale_cpp_ccls_executable* +b:ale_cpp_ccls_init_options ale-cpp.txt /*b:ale_cpp_ccls_init_options* +b:ale_cpp_clangcheck_executable ale-cpp.txt /*b:ale_cpp_clangcheck_executable* +b:ale_cpp_clangcheck_options ale-cpp.txt /*b:ale_cpp_clangcheck_options* +b:ale_cpp_clangd_executable ale-cpp.txt /*b:ale_cpp_clangd_executable* +b:ale_cpp_clangd_options ale-cpp.txt /*b:ale_cpp_clangd_options* +b:ale_cpp_clangtidy_checks ale-cpp.txt /*b:ale_cpp_clangtidy_checks* +b:ale_cpp_clangtidy_executable ale-cpp.txt /*b:ale_cpp_clangtidy_executable* +b:ale_cpp_clangtidy_extra_options ale-cpp.txt /*b:ale_cpp_clangtidy_extra_options* +b:ale_cpp_clangtidy_fix_errors ale-cpp.txt /*b:ale_cpp_clangtidy_fix_errors* +b:ale_cpp_clangtidy_options ale-cpp.txt /*b:ale_cpp_clangtidy_options* +b:ale_cpp_clazy_checks ale-cpp.txt /*b:ale_cpp_clazy_checks* +b:ale_cpp_clazy_executable ale-cpp.txt /*b:ale_cpp_clazy_executable* +b:ale_cpp_clazy_options ale-cpp.txt /*b:ale_cpp_clazy_options* +b:ale_cpp_cppcheck_executable ale-cpp.txt /*b:ale_cpp_cppcheck_executable* +b:ale_cpp_cppcheck_options ale-cpp.txt /*b:ale_cpp_cppcheck_options* +b:ale_cpp_cpplint_executable ale-cpp.txt /*b:ale_cpp_cpplint_executable* +b:ale_cpp_cpplint_options ale-cpp.txt /*b:ale_cpp_cpplint_options* +b:ale_cpp_cquery_cache_directory ale-cpp.txt /*b:ale_cpp_cquery_cache_directory* +b:ale_cpp_cquery_executable ale-cpp.txt /*b:ale_cpp_cquery_executable* +b:ale_cpp_flawfinder_executable ale-cpp.txt /*b:ale_cpp_flawfinder_executable* +b:ale_cpp_flawfinder_minlevel ale-cpp.txt /*b:ale_cpp_flawfinder_minlevel* +b:ale_cs_csc_assemblies ale-cs.txt /*b:ale_cs_csc_assemblies* +b:ale_cs_csc_assembly_path ale-cs.txt /*b:ale_cs_csc_assembly_path* +b:ale_cs_csc_options ale-cs.txt /*b:ale_cs_csc_options* +b:ale_cs_csc_source ale-cs.txt /*b:ale_cs_csc_source* +b:ale_cs_dotnet_format_executable ale-cs.txt /*b:ale_cs_dotnet_format_executable* +b:ale_cs_dotnet_format_options ale-cs.txt /*b:ale_cs_dotnet_format_options* +b:ale_cs_mcs_options ale-cs.txt /*b:ale_cs_mcs_options* +b:ale_cs_mcsc_assemblies ale-cs.txt /*b:ale_cs_mcsc_assemblies* +b:ale_cs_mcsc_assembly_path ale-cs.txt /*b:ale_cs_mcsc_assembly_path* +b:ale_cs_mcsc_options ale-cs.txt /*b:ale_cs_mcsc_options* +b:ale_cs_mcsc_source ale-cs.txt /*b:ale_cs_mcsc_source* +b:ale_cspell_executable ale.txt /*b:ale_cspell_executable* +b:ale_cspell_options ale.txt /*b:ale_cspell_options* +b:ale_cspell_use_global ale.txt /*b:ale_cspell_use_global* +b:ale_css_css_beautify_executable ale-css.txt /*b:ale_css_css_beautify_executable* +b:ale_css_css_beautify_options ale-css.txt /*b:ale_css_css_beautify_options* +b:ale_css_css_beautify_use_global ale-css.txt /*b:ale_css_css_beautify_use_global* +b:ale_css_stylelint_executable ale-css.txt /*b:ale_css_stylelint_executable* +b:ale_css_stylelint_options ale-css.txt /*b:ale_css_stylelint_options* +b:ale_css_stylelint_use_global ale-css.txt /*b:ale_css_stylelint_use_global* +b:ale_cuda_clangd_executable ale-cuda.txt /*b:ale_cuda_clangd_executable* +b:ale_cuda_clangd_options ale-cuda.txt /*b:ale_cuda_clangd_options* +b:ale_cuda_nvcc_executable ale-cuda.txt /*b:ale_cuda_nvcc_executable* +b:ale_cuda_nvcc_options ale-cuda.txt /*b:ale_cuda_nvcc_options* +b:ale_d_dfmt_options ale-d.txt /*b:ale_d_dfmt_options* +b:ale_d_dls_executable ale-d.txt /*b:ale_d_dls_executable* +b:ale_dafny_dafny_timelimit ale-dafny.txt /*b:ale_dafny_dafny_timelimit* +b:ale_dart_analysis_server_executable ale-dart.txt /*b:ale_dart_analysis_server_executable* +b:ale_dart_analyze_executable ale-dart.txt /*b:ale_dart_analyze_executable* +b:ale_dart_dartfmt_executable ale-dart.txt /*b:ale_dart_dartfmt_executable* +b:ale_dart_dartfmt_options ale-dart.txt /*b:ale_dart_dartfmt_options* +b:ale_dart_format_executable ale-dart.txt /*b:ale_dart_format_executable* +b:ale_dart_format_options ale-dart.txt /*b:ale_dart_format_options* +b:ale_default_navigation ale.txt /*b:ale_default_navigation* +b:ale_deno_executable ale-typescript.txt /*b:ale_deno_executable* +b:ale_deno_importMap ale-typescript.txt /*b:ale_deno_importMap* +b:ale_deno_lsp_project_root ale-typescript.txt /*b:ale_deno_lsp_project_root* +b:ale_deno_unstable ale-typescript.txt /*b:ale_deno_unstable* +b:ale_desktop_desktop_file_validate_options ale-desktop.txt /*b:ale_desktop_desktop_file_validate_options* +b:ale_detail_to_floating_preview ale.txt /*b:ale_detail_to_floating_preview* +b:ale_dhall_executable ale-dhall.txt /*b:ale_dhall_executable* +b:ale_dhall_freeze_options ale-dhall.txt /*b:ale_dhall_freeze_options* +b:ale_dhall_options ale-dhall.txt /*b:ale_dhall_options* +b:ale_disable_lsp ale.txt /*b:ale_disable_lsp* +b:ale_dockerfile_dockerfile_lint_executable ale-dockerfile.txt /*b:ale_dockerfile_dockerfile_lint_executable* +b:ale_dockerfile_dockerfile_lint_options ale-dockerfile.txt /*b:ale_dockerfile_dockerfile_lint_options* +b:ale_dockerfile_hadolint_image ale-dockerfile.txt /*b:ale_dockerfile_hadolint_image* +b:ale_dockerfile_hadolint_options ale-dockerfile.txt /*b:ale_dockerfile_hadolint_options* +b:ale_dockerfile_hadolint_use_docker ale-dockerfile.txt /*b:ale_dockerfile_hadolint_use_docker* +b:ale_dprint_config ale.txt /*b:ale_dprint_config* +b:ale_dprint_executable ale.txt /*b:ale_dprint_executable* +b:ale_dprint_options ale.txt /*b:ale_dprint_options* +b:ale_dprint_use_global ale.txt /*b:ale_dprint_use_global* +b:ale_echo_delay ale.txt /*b:ale_echo_delay* +b:ale_echo_msg_format ale.txt /*b:ale_echo_msg_format* +b:ale_elixir_elixir_ls_config ale-elixir.txt /*b:ale_elixir_elixir_ls_config* +b:ale_elixir_elixir_ls_release ale-elixir.txt /*b:ale_elixir_elixir_ls_release* +b:ale_elixir_mix_format_options ale-elixir.txt /*b:ale_elixir_mix_format_options* +b:ale_elixir_mix_options ale-elixir.txt /*b:ale_elixir_mix_options* +b:ale_elm_format_executable ale-elm.txt /*b:ale_elm_format_executable* +b:ale_elm_format_options ale-elm.txt /*b:ale_elm_format_options* +b:ale_elm_format_use_global ale-elm.txt /*b:ale_elm_format_use_global* +b:ale_elm_ls_elm_analyse_trigger ale-elm.txt /*b:ale_elm_ls_elm_analyse_trigger* +b:ale_elm_ls_elm_format_path ale-elm.txt /*b:ale_elm_ls_elm_format_path* +b:ale_elm_ls_elm_path ale-elm.txt /*b:ale_elm_ls_elm_path* +b:ale_elm_ls_elm_test_path ale-elm.txt /*b:ale_elm_ls_elm_test_path* +b:ale_elm_ls_executable ale-elm.txt /*b:ale_elm_ls_executable* +b:ale_elm_ls_use_global ale-elm.txt /*b:ale_elm_ls_use_global* +b:ale_elm_make_executable ale-elm.txt /*b:ale_elm_make_executable* +b:ale_elm_make_use_global ale-elm.txt /*b:ale_elm_make_use_global* +b:ale_enabled ale.txt /*b:ale_enabled* +b:ale_erlang_dialyzer_executable ale-erlang.txt /*b:ale_erlang_dialyzer_executable* +b:ale_erlang_dialyzer_options ale-erlang.txt /*b:ale_erlang_dialyzer_options* +b:ale_erlang_dialyzer_plt_file ale-erlang.txt /*b:ale_erlang_dialyzer_plt_file* +b:ale_erlang_dialyzer_rebar3_profile ale-erlang.txt /*b:ale_erlang_dialyzer_rebar3_profile* +b:ale_erlang_elvis_executable ale-erlang.txt /*b:ale_erlang_elvis_executable* +b:ale_erlang_erlang_ls_executable ale-erlang.txt /*b:ale_erlang_erlang_ls_executable* +b:ale_erlang_erlang_ls_log_dir ale-erlang.txt /*b:ale_erlang_erlang_ls_log_dir* +b:ale_erlang_erlang_ls_log_level ale-erlang.txt /*b:ale_erlang_erlang_ls_log_level* +b:ale_erlang_erlc_executable ale-erlang.txt /*b:ale_erlang_erlc_executable* +b:ale_erlang_erlc_options ale-erlang.txt /*b:ale_erlang_erlc_options* +b:ale_erlang_erlfmt_executable ale-erlang.txt /*b:ale_erlang_erlfmt_executable* +b:ale_erlang_erlfmt_options ale-erlang.txt /*b:ale_erlang_erlfmt_options* +b:ale_erlang_syntaxerl_executable ale-erlang.txt /*b:ale_erlang_syntaxerl_executable* +b:ale_eruby_erblint_executable ale-eruby.txt /*b:ale_eruby_erblint_executable* +b:ale_eruby_ruumba_executable ale-eruby.txt /*b:ale_eruby_ruumba_executable* +b:ale_exclude_highlights ale.txt /*b:ale_exclude_highlights* +b:ale_filename_mappings ale.txt /*b:ale_filename_mappings* +b:ale_fish_fish_indent_executable ale-fish.txt /*b:ale_fish_fish_indent_executable* +b:ale_fish_fish_indent_options ale-fish.txt /*b:ale_fish_fish_indent_options* +b:ale_fix_on_save ale.txt /*b:ale_fix_on_save* +b:ale_fix_on_save_ignore ale.txt /*b:ale_fix_on_save_ignore* +b:ale_fixers ale.txt /*b:ale_fixers* +b:ale_fortran_gcc_executable ale-fortran.txt /*b:ale_fortran_gcc_executable* +b:ale_fortran_gcc_options ale-fortran.txt /*b:ale_fortran_gcc_options* +b:ale_fortran_gcc_use_free_form ale-fortran.txt /*b:ale_fortran_gcc_use_free_form* +b:ale_fortran_language_server_executable ale-fortran.txt /*b:ale_fortran_language_server_executable* +b:ale_fortran_language_server_use_global ale-fortran.txt /*b:ale_fortran_language_server_use_global* +b:ale_fuse_fusionlint_executable ale-fuse.txt /*b:ale_fuse_fusionlint_executable* +b:ale_fuse_fusionlint_options ale-fuse.txt /*b:ale_fuse_fusionlint_options* +b:ale_gitcommit_gitlint_executable ale-gitcommit.txt /*b:ale_gitcommit_gitlint_executable* +b:ale_gitcommit_gitlint_options ale-gitcommit.txt /*b:ale_gitcommit_gitlint_options* +b:ale_gitcommit_gitlint_use_global ale-gitcommit.txt /*b:ale_gitcommit_gitlint_use_global* +b:ale_glsl_glslang_executable ale-glsl.txt /*b:ale_glsl_glslang_executable* +b:ale_glsl_glslang_options ale-glsl.txt /*b:ale_glsl_glslang_options* +b:ale_glsl_glslls_executable ale-glsl.txt /*b:ale_glsl_glslls_executable* +b:ale_glsl_glslls_logfile ale-glsl.txt /*b:ale_glsl_glslls_logfile* +b:ale_go_bingo_executable ale-go.txt /*b:ale_go_bingo_executable* +b:ale_go_bingo_options ale-go.txt /*b:ale_go_bingo_options* +b:ale_go_go111module ale-go.txt /*b:ale_go_go111module* +b:ale_go_go_executable ale-go.txt /*b:ale_go_go_executable* +b:ale_go_gobuild_options ale-go.txt /*b:ale_go_gobuild_options* +b:ale_go_gofmt_options ale-go.txt /*b:ale_go_gofmt_options* +b:ale_go_gofumpt_executable ale-go.txt /*b:ale_go_gofumpt_executable* +b:ale_go_gofumpt_options ale-go.txt /*b:ale_go_gofumpt_options* +b:ale_go_golangci_lint_executable ale-go.txt /*b:ale_go_golangci_lint_executable* +b:ale_go_golangci_lint_options ale-go.txt /*b:ale_go_golangci_lint_options* +b:ale_go_golangci_lint_package ale-go.txt /*b:ale_go_golangci_lint_package* +b:ale_go_golines_options ale-go.txt /*b:ale_go_golines_options* +b:ale_go_golint_executable ale-go.txt /*b:ale_go_golint_executable* +b:ale_go_golint_options ale-go.txt /*b:ale_go_golint_options* +b:ale_go_gometalinter_executable ale-go.txt /*b:ale_go_gometalinter_executable* +b:ale_go_gometalinter_lint_package ale-go.txt /*b:ale_go_gometalinter_lint_package* +b:ale_go_gometalinter_options ale-go.txt /*b:ale_go_gometalinter_options* +b:ale_go_gopls_executable ale-go.txt /*b:ale_go_gopls_executable* +b:ale_go_gopls_init_options ale-go.txt /*b:ale_go_gopls_init_options* +b:ale_go_gopls_options ale-go.txt /*b:ale_go_gopls_options* +b:ale_go_gopls_use_global ale-go.txt /*b:ale_go_gopls_use_global* +b:ale_go_govet_options ale-go.txt /*b:ale_go_govet_options* +b:ale_go_langserver_executable ale-go.txt /*b:ale_go_langserver_executable* +b:ale_go_langserver_options ale-go.txt /*b:ale_go_langserver_options* +b:ale_go_lines_executable ale-go.txt /*b:ale_go_lines_executable* +b:ale_go_revive_executable ale-go.txt /*b:ale_go_revive_executable* +b:ale_go_revive_options ale-go.txt /*b:ale_go_revive_options* +b:ale_go_staticcheck_executable ale-go.txt /*b:ale_go_staticcheck_executable* +b:ale_go_staticcheck_lint_package ale-go.txt /*b:ale_go_staticcheck_lint_package* +b:ale_go_staticcheck_options ale-go.txt /*b:ale_go_staticcheck_options* +b:ale_go_staticcheck_use_global ale-go.txt /*b:ale_go_staticcheck_use_global* +b:ale_hack_hack_executable ale-hack.txt /*b:ale_hack_hack_executable* +b:ale_hack_hackfmt_options ale-hack.txt /*b:ale_hack_hackfmt_options* +b:ale_hack_hhast_executable ale-hack.txt /*b:ale_hack_hhast_executable* +b:ale_handlebars_embertemplatelint_executable ale-handlebars.txt /*b:ale_handlebars_embertemplatelint_executable* +b:ale_handlebars_embertemplatelint_use_global ale-handlebars.txt /*b:ale_handlebars_embertemplatelint_use_global* +b:ale_haskell_brittany_executable ale-haskell.txt /*b:ale_haskell_brittany_executable* +b:ale_haskell_cabal_ghc_options ale-haskell.txt /*b:ale_haskell_cabal_ghc_options* +b:ale_haskell_floskell_executable ale-haskell.txt /*b:ale_haskell_floskell_executable* +b:ale_haskell_ghc_mod_executable ale-haskell.txt /*b:ale_haskell_ghc_mod_executable* +b:ale_haskell_ghc_options ale-haskell.txt /*b:ale_haskell_ghc_options* +b:ale_haskell_hdevtools_executable ale-haskell.txt /*b:ale_haskell_hdevtools_executable* +b:ale_haskell_hdevtools_options ale-haskell.txt /*b:ale_haskell_hdevtools_options* +b:ale_haskell_hfmt_executable ale-haskell.txt /*b:ale_haskell_hfmt_executable* +b:ale_haskell_hie_executable ale-haskell.txt /*b:ale_haskell_hie_executable* +b:ale_haskell_hindent_executable ale-haskell.txt /*b:ale_haskell_hindent_executable* +b:ale_haskell_hlint_executable ale-haskell.txt /*b:ale_haskell_hlint_executable* +b:ale_haskell_hls_config ale-haskell.txt /*b:ale_haskell_hls_config* +b:ale_haskell_hls_executable ale-haskell.txt /*b:ale_haskell_hls_executable* +b:ale_haskell_ormolu_executable ale-haskell.txt /*b:ale_haskell_ormolu_executable* +b:ale_haskell_ormolu_options ale-haskell.txt /*b:ale_haskell_ormolu_options* +b:ale_haskell_stack_build_options ale-haskell.txt /*b:ale_haskell_stack_build_options* +b:ale_haskell_stack_ghc_options ale-haskell.txt /*b:ale_haskell_stack_ghc_options* +b:ale_haskell_stylish_haskell_executable ale-haskell.txt /*b:ale_haskell_stylish_haskell_executable* +b:ale_hdl_checker_config_file ale-vhdl.txt /*b:ale_hdl_checker_config_file* +b:ale_hdl_checker_executable ale-vhdl.txt /*b:ale_hdl_checker_executable* +b:ale_hdl_checker_options ale-vhdl.txt /*b:ale_hdl_checker_options* +b:ale_hover_to_floating_preview ale.txt /*b:ale_hover_to_floating_preview* +b:ale_hover_to_preview ale.txt /*b:ale_hover_to_preview* +b:ale_html_angular_executable ale-html.txt /*b:ale_html_angular_executable* +b:ale_html_angular_use_global ale-html.txt /*b:ale_html_angular_use_global* +b:ale_html_beautify_executable ale-html.txt /*b:ale_html_beautify_executable* +b:ale_html_beautify_options ale-html.txt /*b:ale_html_beautify_options* +b:ale_html_beautify_use_global ale-html.txt /*b:ale_html_beautify_use_global* +b:ale_html_htmlhint_executable ale-html.txt /*b:ale_html_htmlhint_executable* +b:ale_html_htmlhint_options ale-html.txt /*b:ale_html_htmlhint_options* +b:ale_html_htmlhint_use_global ale-html.txt /*b:ale_html_htmlhint_use_global* +b:ale_html_stylelint_executable ale-html.txt /*b:ale_html_stylelint_executable* +b:ale_html_stylelint_options ale-html.txt /*b:ale_html_stylelint_options* +b:ale_html_stylelint_use_global ale-html.txt /*b:ale_html_stylelint_use_global* +b:ale_html_tidy_executable ale-html.txt /*b:ale_html_tidy_executable* +b:ale_html_tidy_options ale-html.txt /*b:ale_html_tidy_options* +b:ale_idris_idris_executable ale-idris.txt /*b:ale_idris_idris_executable* +b:ale_idris_idris_options ale-idris.txt /*b:ale_idris_idris_options* +b:ale_inko_inko_executable ale-inko.txt /*b:ale_inko_inko_executable* +b:ale_ispc_ispc_executable ale-ispc.txt /*b:ale_ispc_ispc_executable* +b:ale_ispc_ispc_options ale-ispc.txt /*b:ale_ispc_ispc_options* +b:ale_java_checkstyle_config ale-java.txt /*b:ale_java_checkstyle_config* +b:ale_java_checkstyle_executable ale-java.txt /*b:ale_java_checkstyle_executable* +b:ale_java_checkstyle_options ale-java.txt /*b:ale_java_checkstyle_options* +b:ale_java_eclipse_config_path ale-java.txt /*b:ale_java_eclipse_config_path* +b:ale_java_eclipse_executable ale-java.txt /*b:ale_java_eclipse_executable* +b:ale_java_eclipselsp_javaagent ale-java.txt /*b:ale_java_eclipselsp_javaagent* +b:ale_java_eclipselsp_path ale-java.txt /*b:ale_java_eclipselsp_path* +b:ale_java_eclipselsp_workspace_path ale-java.txt /*b:ale_java_eclipselsp_workspace_path* +b:ale_java_google_java_format_executable ale-java.txt /*b:ale_java_google_java_format_executable* +b:ale_java_google_java_format_options ale-java.txt /*b:ale_java_google_java_format_options* +b:ale_java_javac_classpath ale-java.txt /*b:ale_java_javac_classpath* +b:ale_java_javac_executable ale-java.txt /*b:ale_java_javac_executable* +b:ale_java_javac_options ale-java.txt /*b:ale_java_javac_options* +b:ale_java_javac_sourcepath ale-java.txt /*b:ale_java_javac_sourcepath* +b:ale_java_javalsp_config ale-java.txt /*b:ale_java_javalsp_config* +b:ale_java_javalsp_executable ale-java.txt /*b:ale_java_javalsp_executable* +b:ale_java_pmd_options ale-java.txt /*b:ale_java_pmd_options* +b:ale_javascript_eslint_executable ale-javascript.txt /*b:ale_javascript_eslint_executable* +b:ale_javascript_eslint_options ale-javascript.txt /*b:ale_javascript_eslint_options* +b:ale_javascript_eslint_suppress_eslintignore ale-javascript.txt /*b:ale_javascript_eslint_suppress_eslintignore* +b:ale_javascript_eslint_suppress_missing_config ale-javascript.txt /*b:ale_javascript_eslint_suppress_missing_config* +b:ale_javascript_eslint_use_global ale-javascript.txt /*b:ale_javascript_eslint_use_global* +b:ale_javascript_fecs_executable ale-javascript.txt /*b:ale_javascript_fecs_executable* +b:ale_javascript_fecs_use_global ale-javascript.txt /*b:ale_javascript_fecs_use_global* +b:ale_javascript_flow_executable ale-javascript.txt /*b:ale_javascript_flow_executable* +b:ale_javascript_flow_use_global ale-javascript.txt /*b:ale_javascript_flow_use_global* +b:ale_javascript_flow_use_home_config ale-javascript.txt /*b:ale_javascript_flow_use_home_config* +b:ale_javascript_flow_use_respect_pragma ale-javascript.txt /*b:ale_javascript_flow_use_respect_pragma* +b:ale_javascript_importjs_executable ale-javascript.txt /*b:ale_javascript_importjs_executable* +b:ale_javascript_jscs_executable ale-javascript.txt /*b:ale_javascript_jscs_executable* +b:ale_javascript_jscs_use_global ale-javascript.txt /*b:ale_javascript_jscs_use_global* +b:ale_javascript_jshint_executable ale-javascript.txt /*b:ale_javascript_jshint_executable* +b:ale_javascript_jshint_use_global ale-javascript.txt /*b:ale_javascript_jshint_use_global* +b:ale_javascript_prettier_eslint_executable ale-javascript.txt /*b:ale_javascript_prettier_eslint_executable* +b:ale_javascript_prettier_eslint_options ale-javascript.txt /*b:ale_javascript_prettier_eslint_options* +b:ale_javascript_prettier_eslint_use_global ale-javascript.txt /*b:ale_javascript_prettier_eslint_use_global* +b:ale_javascript_prettier_executable ale-javascript.txt /*b:ale_javascript_prettier_executable* +b:ale_javascript_prettier_options ale-javascript.txt /*b:ale_javascript_prettier_options* +b:ale_javascript_prettier_standard_executable ale-javascript.txt /*b:ale_javascript_prettier_standard_executable* +b:ale_javascript_prettier_standard_options ale-javascript.txt /*b:ale_javascript_prettier_standard_options* +b:ale_javascript_prettier_standard_use_global ale-javascript.txt /*b:ale_javascript_prettier_standard_use_global* +b:ale_javascript_prettier_use_global ale-javascript.txt /*b:ale_javascript_prettier_use_global* +b:ale_javascript_standard_executable ale-javascript.txt /*b:ale_javascript_standard_executable* +b:ale_javascript_standard_options ale-javascript.txt /*b:ale_javascript_standard_options* +b:ale_javascript_standard_use_global ale-javascript.txt /*b:ale_javascript_standard_use_global* +b:ale_javascript_xo_executable ale-javascript.txt /*b:ale_javascript_xo_executable* +b:ale_javascript_xo_options ale-javascript.txt /*b:ale_javascript_xo_options* +b:ale_javascript_xo_use_global ale-javascript.txt /*b:ale_javascript_xo_use_global* +b:ale_json_fixjson_executable ale-json.txt /*b:ale_json_fixjson_executable* +b:ale_json_fixjson_options ale-json.txt /*b:ale_json_fixjson_options* +b:ale_json_fixjson_use_global ale-json.txt /*b:ale_json_fixjson_use_global* +b:ale_json_jq_executable ale-json.txt /*b:ale_json_jq_executable* +b:ale_json_jq_filters ale-json.txt /*b:ale_json_jq_filters* +b:ale_json_jq_options ale-json.txt /*b:ale_json_jq_options* +b:ale_json_jsonlint_executable ale-json.txt /*b:ale_json_jsonlint_executable* +b:ale_json_jsonlint_use_global ale-json.txt /*b:ale_json_jsonlint_use_global* +b:ale_json_spectral_executable ale-json.txt /*b:ale_json_spectral_executable* +b:ale_json_spectral_use_global ale-json.txt /*b:ale_json_spectral_use_global* +b:ale_jsonnet_jsonnet_lint_executable ale-jsonnet.txt /*b:ale_jsonnet_jsonnet_lint_executable* +b:ale_jsonnet_jsonnet_lint_options ale-jsonnet.txt /*b:ale_jsonnet_jsonnet_lint_options* +b:ale_jsonnet_jsonnetfmt_executable ale-jsonnet.txt /*b:ale_jsonnet_jsonnetfmt_executable* +b:ale_jsonnet_jsonnetfmt_options ale-jsonnet.txt /*b:ale_jsonnet_jsonnetfmt_options* +b:ale_julia_executable ale-julia.txt /*b:ale_julia_executable* +b:ale_keep_list_window_open ale.txt /*b:ale_keep_list_window_open* +b:ale_lacheck_executable ale-tex.txt /*b:ale_lacheck_executable* +b:ale_languagetool_executable ale.txt /*b:ale_languagetool_executable* +b:ale_languagetool_options ale.txt /*b:ale_languagetool_options* +b:ale_less_lessc_executable ale-less.txt /*b:ale_less_lessc_executable* +b:ale_less_lessc_options ale-less.txt /*b:ale_less_lessc_options* +b:ale_less_lessc_use_global ale-less.txt /*b:ale_less_lessc_use_global* +b:ale_less_stylelint_executable ale-less.txt /*b:ale_less_stylelint_executable* +b:ale_less_stylelint_options ale-less.txt /*b:ale_less_stylelint_options* +b:ale_less_stylelint_use_global ale-less.txt /*b:ale_less_stylelint_use_global* +b:ale_lint_delay ale.txt /*b:ale_lint_delay* +b:ale_lint_on_insert_leave ale.txt /*b:ale_lint_on_insert_leave* +b:ale_linted ale.txt /*b:ale_linted* +b:ale_linter_aliases ale.txt /*b:ale_linter_aliases* +b:ale_linters ale.txt /*b:ale_linters* +b:ale_linters_ignore ale.txt /*b:ale_linters_ignore* +b:ale_list_vertical ale.txt /*b:ale_list_vertical* +b:ale_list_window_size ale.txt /*b:ale_list_window_size* +b:ale_llvm_llc_executable ale-llvm.txt /*b:ale_llvm_llc_executable* +b:ale_loclist_msg_format ale.txt /*b:ale_loclist_msg_format* +b:ale_lua_lua_format_executable ale-lua.txt /*b:ale_lua_lua_format_executable* +b:ale_lua_lua_format_options ale-lua.txt /*b:ale_lua_lua_format_options* +b:ale_lua_luac_executable ale-lua.txt /*b:ale_lua_luac_executable* +b:ale_lua_luacheck_executable ale-lua.txt /*b:ale_lua_luacheck_executable* +b:ale_lua_luacheck_options ale-lua.txt /*b:ale_lua_luacheck_options* +b:ale_lua_luafmt_executable ale-lua.txt /*b:ale_lua_luafmt_executable* +b:ale_lua_luafmt_options ale-lua.txt /*b:ale_lua_luafmt_options* +b:ale_lua_selene_executable ale-lua.txt /*b:ale_lua_selene_executable* +b:ale_lua_selene_options ale-lua.txt /*b:ale_lua_selene_options* +b:ale_lua_stylua_executable ale-lua.txt /*b:ale_lua_stylua_executable* +b:ale_lua_stylua_options ale-lua.txt /*b:ale_lua_stylua_options* +b:ale_make_checkmake_config ale-make.txt /*b:ale_make_checkmake_config* +b:ale_markdown_markdownlint_executable ale-markdown.txt /*b:ale_markdown_markdownlint_executable* +b:ale_markdown_markdownlint_options ale-markdown.txt /*b:ale_markdown_markdownlint_options* +b:ale_markdown_mdl_executable ale-markdown.txt /*b:ale_markdown_mdl_executable* +b:ale_markdown_mdl_options ale-markdown.txt /*b:ale_markdown_mdl_options* +b:ale_markdown_pandoc_executable ale-markdown.txt /*b:ale_markdown_pandoc_executable* +b:ale_markdown_pandoc_options ale-markdown.txt /*b:ale_markdown_pandoc_options* +b:ale_markdown_remark_lint_executable ale-markdown.txt /*b:ale_markdown_remark_lint_executable* +b:ale_markdown_remark_lint_options ale-markdown.txt /*b:ale_markdown_remark_lint_options* +b:ale_markdown_remark_lint_use_global ale-markdown.txt /*b:ale_markdown_remark_lint_use_global* +b:ale_max_signs ale.txt /*b:ale_max_signs* +b:ale_maximum_file_size ale.txt /*b:ale_maximum_file_size* +b:ale_mercury_mmc_executable ale-mercury.txt /*b:ale_mercury_mmc_executable* +b:ale_mercury_mmc_options ale-mercury.txt /*b:ale_mercury_mmc_options* +b:ale_nasm_nasm_executable ale-nasm.txt /*b:ale_nasm_nasm_executable* +b:ale_nasm_nasm_options ale-nasm.txt /*b:ale_nasm_nasm_options* +b:ale_nim_nimpretty_executable ale-nim.txt /*b:ale_nim_nimpretty_executable* +b:ale_nim_nimpretty_options ale-nim.txt /*b:ale_nim_nimpretty_options* +b:ale_nix_fix_check_executable ale-nix.txt /*b:ale_nix_fix_check_executable* +b:ale_nix_nixfmt_executable ale-nix.txt /*b:ale_nix_nixfmt_executable* +b:ale_nix_nixfmt_options ale-nix.txt /*b:ale_nix_nixfmt_options* +b:ale_nix_nixpkgsfmt_executable ale-nix.txt /*b:ale_nix_nixpkgsfmt_executable* +b:ale_nix_nixpkgsfmt_options ale-nix.txt /*b:ale_nix_nixpkgsfmt_options* +b:ale_nix_statix_check_executable ale-nix.txt /*b:ale_nix_statix_check_executable* +b:ale_nix_statix_check_options ale-nix.txt /*b:ale_nix_statix_check_options* +b:ale_nix_statix_fix_options ale-nix.txt /*b:ale_nix_statix_fix_options* +b:ale_objc_ccls_executable ale-objc.txt /*b:ale_objc_ccls_executable* +b:ale_objc_ccls_init_options ale-objc.txt /*b:ale_objc_ccls_init_options* +b:ale_objc_clang_options ale-objc.txt /*b:ale_objc_clang_options* +b:ale_objc_clangd_executable ale-objc.txt /*b:ale_objc_clangd_executable* +b:ale_objc_clangd_options ale-objc.txt /*b:ale_objc_clangd_options* +b:ale_objcpp_clang_options ale-objcpp.txt /*b:ale_objcpp_clang_options* +b:ale_objcpp_clangd_executable ale-objcpp.txt /*b:ale_objcpp_clangd_executable* +b:ale_objcpp_clangd_options ale-objcpp.txt /*b:ale_objcpp_clangd_options* +b:ale_ocaml_dune_executable ale-ocaml.txt /*b:ale_ocaml_dune_executable* +b:ale_ocaml_dune_options ale-ocaml.txt /*b:ale_ocaml_dune_options* +b:ale_ocaml_ocamlformat_executable ale-ocaml.txt /*b:ale_ocaml_ocamlformat_executable* +b:ale_ocaml_ocamlformat_options ale-ocaml.txt /*b:ale_ocaml_ocamlformat_options* +b:ale_ocaml_ocamllsp_use_opam ale-ocaml.txt /*b:ale_ocaml_ocamllsp_use_opam* +b:ale_ocaml_ocp_indent_config ale-ocaml.txt /*b:ale_ocaml_ocp_indent_config* +b:ale_ocaml_ocp_indent_executable ale-ocaml.txt /*b:ale_ocaml_ocp_indent_executable* +b:ale_ocaml_ocp_indent_options ale-ocaml.txt /*b:ale_ocaml_ocp_indent_options* +b:ale_ocaml_ols_executable ale-ocaml.txt /*b:ale_ocaml_ols_executable* +b:ale_ocaml_ols_use_global ale-ocaml.txt /*b:ale_ocaml_ols_use_global* +b:ale_opa_fmt_executable ale-rego.txt /*b:ale_opa_fmt_executable* +b:ale_opa_fmt_options ale-rego.txt /*b:ale_opa_fmt_options* +b:ale_open_list ale.txt /*b:ale_open_list* +b:ale_openapi_ibm_validator_executable ale-openapi.txt /*b:ale_openapi_ibm_validator_executable* +b:ale_openapi_ibm_validator_options ale-openapi.txt /*b:ale_openapi_ibm_validator_options* +b:ale_openscad_sca2d_executable ale-openscad.txt /*b:ale_openscad_sca2d_executable* +b:ale_openscad_sca2d_options ale-openscad.txt /*b:ale_openscad_sca2d_options* +b:ale_packer_fmt_executable ale-packer.txt /*b:ale_packer_fmt_executable* +b:ale_packer_fmt_options ale-packer.txt /*b:ale_packer_fmt_options* +b:ale_pascal_ptop_executable ale-pascal.txt /*b:ale_pascal_ptop_executable* +b:ale_pascal_ptop_options ale-pascal.txt /*b:ale_pascal_ptop_options* +b:ale_perl6_perl6_executable ale-perl6.txt /*b:ale_perl6_perl6_executable* +b:ale_perl6_perl6_options ale-perl6.txt /*b:ale_perl6_perl6_options* +b:ale_perl_perl_executable ale-perl.txt /*b:ale_perl_perl_executable* +b:ale_perl_perl_options ale-perl.txt /*b:ale_perl_perl_options* +b:ale_perl_perlcritic_executable ale-perl.txt /*b:ale_perl_perlcritic_executable* +b:ale_perl_perlcritic_options ale-perl.txt /*b:ale_perl_perlcritic_options* +b:ale_perl_perlcritic_profile ale-perl.txt /*b:ale_perl_perlcritic_profile* +b:ale_perl_perltidy_options ale-perl.txt /*b:ale_perl_perltidy_options* +b:ale_php_cs_fixer_executable ale-php.txt /*b:ale_php_cs_fixer_executable* +b:ale_php_cs_fixer_options ale-php.txt /*b:ale_php_cs_fixer_options* +b:ale_php_cs_fixer_use_global ale-php.txt /*b:ale_php_cs_fixer_use_global* +b:ale_php_intelephense_config ale-php.txt /*b:ale_php_intelephense_config* +b:ale_php_intelephense_executable ale-php.txt /*b:ale_php_intelephense_executable* +b:ale_php_intelephense_use_global ale-php.txt /*b:ale_php_intelephense_use_global* +b:ale_php_langserver_executable ale-php.txt /*b:ale_php_langserver_executable* +b:ale_php_langserver_use_global ale-php.txt /*b:ale_php_langserver_use_global* +b:ale_php_phan_executable ale-php.txt /*b:ale_php_phan_executable* +b:ale_php_phan_minimum_severity ale-php.txt /*b:ale_php_phan_minimum_severity* +b:ale_php_phan_use_client ale-php.txt /*b:ale_php_phan_use_client* +b:ale_php_php_executable ale-php.txt /*b:ale_php_php_executable* +b:ale_php_phpcbf_executable ale-php.txt /*b:ale_php_phpcbf_executable* +b:ale_php_phpcbf_options ale-php.txt /*b:ale_php_phpcbf_options* +b:ale_php_phpcbf_standard ale-php.txt /*b:ale_php_phpcbf_standard* +b:ale_php_phpcbf_use_global ale-php.txt /*b:ale_php_phpcbf_use_global* +b:ale_php_phpcs_executable ale-php.txt /*b:ale_php_phpcs_executable* +b:ale_php_phpcs_options ale-php.txt /*b:ale_php_phpcs_options* +b:ale_php_phpcs_standard ale-php.txt /*b:ale_php_phpcs_standard* +b:ale_php_phpcs_use_global ale-php.txt /*b:ale_php_phpcs_use_global* +b:ale_php_phpmd_executable ale-php.txt /*b:ale_php_phpmd_executable* +b:ale_php_phpmd_ruleset ale-php.txt /*b:ale_php_phpmd_ruleset* +b:ale_php_phpstan_autoload ale-php.txt /*b:ale_php_phpstan_autoload* +b:ale_php_phpstan_configuration ale-php.txt /*b:ale_php_phpstan_configuration* +b:ale_php_phpstan_executable ale-php.txt /*b:ale_php_phpstan_executable* +b:ale_php_phpstan_level ale-php.txt /*b:ale_php_phpstan_level* +b:ale_php_phpstan_memory-limit ale-php.txt /*b:ale_php_phpstan_memory-limit* +b:ale_php_pint_executable ale-php.txt /*b:ale_php_pint_executable* +b:ale_php_pint_options ale-php.txt /*b:ale_php_pint_options* +b:ale_php_pint_use_global ale-php.txt /*b:ale_php_pint_use_global* +b:ale_php_psalm_executable ale-php.txt /*b:ale_php_psalm_executable* +b:ale_php_psalm_options ale-php.txt /*b:ale_php_psalm_options* +b:ale_php_psalm_use_global ale-php.txt /*b:ale_php_psalm_use_global* +b:ale_php_tlint_executable ale-php.txt /*b:ale_php_tlint_executable* +b:ale_php_tlint_options ale-php.txt /*b:ale_php_tlint_options* +b:ale_php_tlint_use_global ale-php.txt /*b:ale_php_tlint_use_global* +b:ale_pony_ponyc_executable ale-pony.txt /*b:ale_pony_ponyc_executable* +b:ale_pony_ponyc_options ale-pony.txt /*b:ale_pony_ponyc_options* +b:ale_powershell_powershell_executable ale-powershell.txt /*b:ale_powershell_powershell_executable* +b:ale_powershell_psscriptanalyzer_exclusions ale-powershell.txt /*b:ale_powershell_psscriptanalyzer_exclusions* +b:ale_powershell_psscriptanalyzer_executable ale-powershell.txt /*b:ale_powershell_psscriptanalyzer_executable* +b:ale_powershell_psscriptanalyzer_module ale-powershell.txt /*b:ale_powershell_psscriptanalyzer_module* +b:ale_prolog_swipl_alarm ale-prolog.txt /*b:ale_prolog_swipl_alarm* +b:ale_prolog_swipl_alarm_handler ale-prolog.txt /*b:ale_prolog_swipl_alarm_handler* +b:ale_prolog_swipl_executable ale-prolog.txt /*b:ale_prolog_swipl_executable* +b:ale_prolog_swipl_load ale-prolog.txt /*b:ale_prolog_swipl_load* +b:ale_prolog_swipl_timeout ale-prolog.txt /*b:ale_prolog_swipl_timeout* +b:ale_pug_puglint_executable ale-pug.txt /*b:ale_pug_puglint_executable* +b:ale_pug_puglint_options ale-pug.txt /*b:ale_pug_puglint_options* +b:ale_pug_puglint_use_global ale-pug.txt /*b:ale_pug_puglint_use_global* +b:ale_puppet_languageserver_executable ale-puppet.txt /*b:ale_puppet_languageserver_executable* +b:ale_puppet_puppet_executable ale-puppet.txt /*b:ale_puppet_puppet_executable* +b:ale_puppet_puppet_options ale-puppet.txt /*b:ale_puppet_puppet_options* +b:ale_puppet_puppetlint_executable ale-puppet.txt /*b:ale_puppet_puppetlint_executable* +b:ale_puppet_puppetlint_options ale-puppet.txt /*b:ale_puppet_puppetlint_options* +b:ale_purescript_purty_executable ale-purescript.txt /*b:ale_purescript_purty_executable* +b:ale_purescript_tidy_executable ale-purescript.txt /*b:ale_purescript_tidy_executable* +b:ale_purescript_tidy_options ale-purescript.txt /*b:ale_purescript_tidy_options* +b:ale_purescript_tidy_use_global ale-purescript.txt /*b:ale_purescript_tidy_use_global* +b:ale_pyrex_cython_executable ale-pyrex.txt /*b:ale_pyrex_cython_executable* +b:ale_pyrex_cython_options ale-pyrex.txt /*b:ale_pyrex_cython_options* +b:ale_python_auto_pipenv ale-python.txt /*b:ale_python_auto_pipenv* +b:ale_python_auto_poetry ale-python.txt /*b:ale_python_auto_poetry* +b:ale_python_autoflake_executable ale-python.txt /*b:ale_python_autoflake_executable* +b:ale_python_autoflake_options ale-python.txt /*b:ale_python_autoflake_options* +b:ale_python_autoflake_use_global ale-python.txt /*b:ale_python_autoflake_use_global* +b:ale_python_autoimport_executable ale-python.txt /*b:ale_python_autoimport_executable* +b:ale_python_autoimport_options ale-python.txt /*b:ale_python_autoimport_options* +b:ale_python_autoimport_use_global ale-python.txt /*b:ale_python_autoimport_use_global* +b:ale_python_autopep8_executable ale-python.txt /*b:ale_python_autopep8_executable* +b:ale_python_autopep8_options ale-python.txt /*b:ale_python_autopep8_options* +b:ale_python_autopep8_use_global ale-python.txt /*b:ale_python_autopep8_use_global* +b:ale_python_bandit_auto_pipenv ale-python.txt /*b:ale_python_bandit_auto_pipenv* +b:ale_python_bandit_auto_poetry ale-python.txt /*b:ale_python_bandit_auto_poetry* +b:ale_python_bandit_executable ale-python.txt /*b:ale_python_bandit_executable* +b:ale_python_bandit_options ale-python.txt /*b:ale_python_bandit_options* +b:ale_python_bandit_use_config ale-python.txt /*b:ale_python_bandit_use_config* +b:ale_python_bandit_use_global ale-python.txt /*b:ale_python_bandit_use_global* +b:ale_python_black_auto_pipenv ale-python.txt /*b:ale_python_black_auto_pipenv* +b:ale_python_black_auto_poetry ale-python.txt /*b:ale_python_black_auto_poetry* +b:ale_python_black_change_directory ale-python.txt /*b:ale_python_black_change_directory* +b:ale_python_black_executable ale-python.txt /*b:ale_python_black_executable* +b:ale_python_black_options ale-python.txt /*b:ale_python_black_options* +b:ale_python_black_use_global ale-python.txt /*b:ale_python_black_use_global* +b:ale_python_flake8_auto_pipenv ale-python.txt /*b:ale_python_flake8_auto_pipenv* +b:ale_python_flake8_auto_poetry ale-python.txt /*b:ale_python_flake8_auto_poetry* +b:ale_python_flake8_change_directory ale-python.txt /*b:ale_python_flake8_change_directory* +b:ale_python_flake8_executable ale-python.txt /*b:ale_python_flake8_executable* +b:ale_python_flake8_options ale-python.txt /*b:ale_python_flake8_options* +b:ale_python_flake8_use_global ale-python.txt /*b:ale_python_flake8_use_global* +b:ale_python_flakehell_auto_pipenv ale-python.txt /*b:ale_python_flakehell_auto_pipenv* +b:ale_python_flakehell_auto_poetry ale-python.txt /*b:ale_python_flakehell_auto_poetry* +b:ale_python_flakehell_change_directory ale-python.txt /*b:ale_python_flakehell_change_directory* +b:ale_python_flakehell_executable ale-python.txt /*b:ale_python_flakehell_executable* +b:ale_python_flakehell_options ale-python.txt /*b:ale_python_flakehell_options* +b:ale_python_flakehell_use_global ale-python.txt /*b:ale_python_flakehell_use_global* +b:ale_python_isort_auto_pipenv ale-python.txt /*b:ale_python_isort_auto_pipenv* +b:ale_python_isort_auto_poetry ale-python.txt /*b:ale_python_isort_auto_poetry* +b:ale_python_isort_executable ale-python.txt /*b:ale_python_isort_executable* +b:ale_python_isort_options ale-python.txt /*b:ale_python_isort_options* +b:ale_python_isort_use_global ale-python.txt /*b:ale_python_isort_use_global* +b:ale_python_mypy_auto_pipenv ale-python.txt /*b:ale_python_mypy_auto_pipenv* +b:ale_python_mypy_auto_poetry ale-python.txt /*b:ale_python_mypy_auto_poetry* +b:ale_python_mypy_executable ale-python.txt /*b:ale_python_mypy_executable* +b:ale_python_mypy_ignore_invalid_syntax ale-python.txt /*b:ale_python_mypy_ignore_invalid_syntax* +b:ale_python_mypy_options ale-python.txt /*b:ale_python_mypy_options* +b:ale_python_mypy_show_notes ale-python.txt /*b:ale_python_mypy_show_notes* +b:ale_python_mypy_use_global ale-python.txt /*b:ale_python_mypy_use_global* +b:ale_python_prospector_auto_pipenv ale-python.txt /*b:ale_python_prospector_auto_pipenv* +b:ale_python_prospector_auto_poetry ale-python.txt /*b:ale_python_prospector_auto_poetry* +b:ale_python_prospector_executable ale-python.txt /*b:ale_python_prospector_executable* +b:ale_python_prospector_options ale-python.txt /*b:ale_python_prospector_options* +b:ale_python_prospector_use_global ale-python.txt /*b:ale_python_prospector_use_global* +b:ale_python_pycodestyle_auto_pipenv ale-python.txt /*b:ale_python_pycodestyle_auto_pipenv* +b:ale_python_pycodestyle_auto_poetry ale-python.txt /*b:ale_python_pycodestyle_auto_poetry* +b:ale_python_pycodestyle_executable ale-python.txt /*b:ale_python_pycodestyle_executable* +b:ale_python_pycodestyle_options ale-python.txt /*b:ale_python_pycodestyle_options* +b:ale_python_pycodestyle_use_global ale-python.txt /*b:ale_python_pycodestyle_use_global* +b:ale_python_pydocstyle_auto_pipenv ale-python.txt /*b:ale_python_pydocstyle_auto_pipenv* +b:ale_python_pydocstyle_auto_poetry ale-python.txt /*b:ale_python_pydocstyle_auto_poetry* +b:ale_python_pydocstyle_executable ale-python.txt /*b:ale_python_pydocstyle_executable* +b:ale_python_pydocstyle_options ale-python.txt /*b:ale_python_pydocstyle_options* +b:ale_python_pydocstyle_use_global ale-python.txt /*b:ale_python_pydocstyle_use_global* +b:ale_python_pyflakes_auto_pipenv ale-python.txt /*b:ale_python_pyflakes_auto_pipenv* +b:ale_python_pyflakes_auto_poetry ale-python.txt /*b:ale_python_pyflakes_auto_poetry* +b:ale_python_pyflakes_executable ale-python.txt /*b:ale_python_pyflakes_executable* +b:ale_python_pyflyby_auto_pipenv ale-python.txt /*b:ale_python_pyflyby_auto_pipenv* +b:ale_python_pyflyby_auto_poetry ale-python.txt /*b:ale_python_pyflyby_auto_poetry* +b:ale_python_pyflyby_executable ale-python.txt /*b:ale_python_pyflyby_executable* +b:ale_python_pyflyby_options ale-python.txt /*b:ale_python_pyflyby_options* +b:ale_python_pyflyby_use_global ale-python.txt /*b:ale_python_pyflyby_use_global* +b:ale_python_pylama_auto_pipenv ale-python.txt /*b:ale_python_pylama_auto_pipenv* +b:ale_python_pylama_auto_poetry ale-python.txt /*b:ale_python_pylama_auto_poetry* +b:ale_python_pylama_change_directory ale-python.txt /*b:ale_python_pylama_change_directory* +b:ale_python_pylama_executable ale-python.txt /*b:ale_python_pylama_executable* +b:ale_python_pylama_options ale-python.txt /*b:ale_python_pylama_options* +b:ale_python_pylama_use_global ale-python.txt /*b:ale_python_pylama_use_global* +b:ale_python_pylint_auto_pipenv ale-python.txt /*b:ale_python_pylint_auto_pipenv* +b:ale_python_pylint_auto_poetry ale-python.txt /*b:ale_python_pylint_auto_poetry* +b:ale_python_pylint_change_directory ale-python.txt /*b:ale_python_pylint_change_directory* +b:ale_python_pylint_executable ale-python.txt /*b:ale_python_pylint_executable* +b:ale_python_pylint_options ale-python.txt /*b:ale_python_pylint_options* +b:ale_python_pylint_use_global ale-python.txt /*b:ale_python_pylint_use_global* +b:ale_python_pylint_use_msg_id ale-python.txt /*b:ale_python_pylint_use_msg_id* +b:ale_python_pylsp_auto_pipenv ale-python.txt /*b:ale_python_pylsp_auto_pipenv* +b:ale_python_pylsp_auto_poetry ale-python.txt /*b:ale_python_pylsp_auto_poetry* +b:ale_python_pylsp_config ale-python.txt /*b:ale_python_pylsp_config* +b:ale_python_pylsp_executable ale-python.txt /*b:ale_python_pylsp_executable* +b:ale_python_pylsp_options ale-python.txt /*b:ale_python_pylsp_options* +b:ale_python_pylsp_use_global ale-python.txt /*b:ale_python_pylsp_use_global* +b:ale_python_pyre_auto_pipenv ale-python.txt /*b:ale_python_pyre_auto_pipenv* +b:ale_python_pyre_auto_poetry ale-python.txt /*b:ale_python_pyre_auto_poetry* +b:ale_python_pyre_executable ale-python.txt /*b:ale_python_pyre_executable* +b:ale_python_pyre_use_global ale-python.txt /*b:ale_python_pyre_use_global* +b:ale_python_pyright_config ale-python.txt /*b:ale_python_pyright_config* +b:ale_python_pyright_executable ale-python.txt /*b:ale_python_pyright_executable* +b:ale_python_refurb_auto_pipenv ale-python.txt /*b:ale_python_refurb_auto_pipenv* +b:ale_python_refurb_auto_poetry ale-python.txt /*b:ale_python_refurb_auto_poetry* +b:ale_python_refurb_change_directory ale-python.txt /*b:ale_python_refurb_change_directory* +b:ale_python_refurb_executable ale-python.txt /*b:ale_python_refurb_executable* +b:ale_python_refurb_options ale-python.txt /*b:ale_python_refurb_options* +b:ale_python_refurb_use_global ale-python.txt /*b:ale_python_refurb_use_global* +b:ale_python_reorder_python_imports_executable ale-python.txt /*b:ale_python_reorder_python_imports_executable* +b:ale_python_reorder_python_imports_options ale-python.txt /*b:ale_python_reorder_python_imports_options* +b:ale_python_reorder_python_imports_use_global ale-python.txt /*b:ale_python_reorder_python_imports_use_global* +b:ale_python_ruff_auto_pipenv ale-python.txt /*b:ale_python_ruff_auto_pipenv* +b:ale_python_ruff_auto_poetry ale-python.txt /*b:ale_python_ruff_auto_poetry* +b:ale_python_ruff_change_directory ale-python.txt /*b:ale_python_ruff_change_directory* +b:ale_python_ruff_executable ale-python.txt /*b:ale_python_ruff_executable* +b:ale_python_ruff_options ale-python.txt /*b:ale_python_ruff_options* +b:ale_python_ruff_use_global ale-python.txt /*b:ale_python_ruff_use_global* +b:ale_python_unimport_auto_pipenv ale-python.txt /*b:ale_python_unimport_auto_pipenv* +b:ale_python_unimport_auto_poetry ale-python.txt /*b:ale_python_unimport_auto_poetry* +b:ale_python_unimport_executable ale-python.txt /*b:ale_python_unimport_executable* +b:ale_python_unimport_options ale-python.txt /*b:ale_python_unimport_options* +b:ale_python_unimport_use_global ale-python.txt /*b:ale_python_unimport_use_global* +b:ale_python_vulture_change_directory ale-python.txt /*b:ale_python_vulture_change_directory* +b:ale_python_vulture_executable ale-python.txt /*b:ale_python_vulture_executable* +b:ale_python_vulture_options ale-python.txt /*b:ale_python_vulture_options* +b:ale_python_vulture_use_global ale-python.txt /*b:ale_python_vulture_use_global* +b:ale_python_yapf_executable ale-python.txt /*b:ale_python_yapf_executable* +b:ale_python_yapf_use_global ale-python.txt /*b:ale_python_yapf_use_global* +b:ale_qml_qmlfmt_executable ale-qml.txt /*b:ale_qml_qmlfmt_executable* +b:ale_r_languageserver_cmd ale-r.txt /*b:ale_r_languageserver_cmd* +b:ale_r_languageserver_config ale-r.txt /*b:ale_r_languageserver_config* +b:ale_r_lintr_lint_package ale-r.txt /*b:ale_r_lintr_lint_package* +b:ale_r_lintr_options ale-r.txt /*b:ale_r_lintr_options* +b:ale_r_styler_options ale-r.txt /*b:ale_r_styler_options* +b:ale_racket_raco_fmt_executable ale-racket.txt /*b:ale_racket_raco_fmt_executable* +b:ale_racket_raco_fmt_options ale-racket.txt /*b:ale_racket_raco_fmt_options* +b:ale_reason_ls_executable ale-reasonml.txt /*b:ale_reason_ls_executable* +b:ale_reason_ols_executable ale-reasonml.txt /*b:ale_reason_ols_executable* +b:ale_reason_ols_use_global ale-reasonml.txt /*b:ale_reason_ols_use_global* +b:ale_reasonml_refmt_executable ale-reasonml.txt /*b:ale_reasonml_refmt_executable* +b:ale_reasonml_refmt_options ale-reasonml.txt /*b:ale_reasonml_refmt_options* +b:ale_robot_rflint_executable ale-robot.txt /*b:ale_robot_rflint_executable* +b:ale_root ale.txt /*b:ale_root* +b:ale_ruby_brakeman_executable ale-ruby.txt /*b:ale_ruby_brakeman_executable* +b:ale_ruby_brakeman_options ale-ruby.txt /*b:ale_ruby_brakeman_options* +b:ale_ruby_debride_executable ale-ruby.txt /*b:ale_ruby_debride_executable* +b:ale_ruby_debride_options ale-ruby.txt /*b:ale_ruby_debride_options* +b:ale_ruby_erblint_options ale-eruby.txt /*b:ale_ruby_erblint_options* +b:ale_ruby_rails_best_practices_executable ale-ruby.txt /*b:ale_ruby_rails_best_practices_executable* +b:ale_ruby_rails_best_practices_options ale-ruby.txt /*b:ale_ruby_rails_best_practices_options* +b:ale_ruby_reek_executable ale-ruby.txt /*b:ale_ruby_reek_executable* +b:ale_ruby_reek_show_context ale-ruby.txt /*b:ale_ruby_reek_show_context* +b:ale_ruby_reek_show_wiki_link ale-ruby.txt /*b:ale_ruby_reek_show_wiki_link* +b:ale_ruby_rubocop_auto_correct_all ale-ruby.txt /*b:ale_ruby_rubocop_auto_correct_all* +b:ale_ruby_rubocop_executable ale-ruby.txt /*b:ale_ruby_rubocop_executable* +b:ale_ruby_rubocop_options ale-ruby.txt /*b:ale_ruby_rubocop_options* +b:ale_ruby_ruby_executable ale-ruby.txt /*b:ale_ruby_ruby_executable* +b:ale_ruby_rufo_executable ale-ruby.txt /*b:ale_ruby_rufo_executable* +b:ale_ruby_ruumba_options ale-eruby.txt /*b:ale_ruby_ruumba_options* +b:ale_ruby_solargraph_executable ale-ruby.txt /*b:ale_ruby_solargraph_executable* +b:ale_ruby_sorbet_enable_watchman ale-ruby.txt /*b:ale_ruby_sorbet_enable_watchman* +b:ale_ruby_sorbet_executable ale-ruby.txt /*b:ale_ruby_sorbet_executable* +b:ale_ruby_sorbet_options ale-ruby.txt /*b:ale_ruby_sorbet_options* +b:ale_ruby_standardrb_executable ale-ruby.txt /*b:ale_ruby_standardrb_executable* +b:ale_ruby_standardrb_options ale-ruby.txt /*b:ale_ruby_standardrb_options* +b:ale_ruby_syntax_tree_executable ale-ruby.txt /*b:ale_ruby_syntax_tree_executable* +b:ale_ruby_syntax_tree_options ale-ruby.txt /*b:ale_ruby_syntax_tree_options* +b:ale_rust_analyzer_config ale-rust.txt /*b:ale_rust_analyzer_config* +b:ale_rust_analyzer_executable ale-rust.txt /*b:ale_rust_analyzer_executable* +b:ale_rust_cargo_avoid_whole_workspace ale-rust.txt /*b:ale_rust_cargo_avoid_whole_workspace* +b:ale_rust_cargo_check_all_targets ale-rust.txt /*b:ale_rust_cargo_check_all_targets* +b:ale_rust_cargo_check_examples ale-rust.txt /*b:ale_rust_cargo_check_examples* +b:ale_rust_cargo_check_tests ale-rust.txt /*b:ale_rust_cargo_check_tests* +b:ale_rust_cargo_clippy_options ale-rust.txt /*b:ale_rust_cargo_clippy_options* +b:ale_rust_cargo_default_feature_behavior ale-rust.txt /*b:ale_rust_cargo_default_feature_behavior* +b:ale_rust_cargo_include_features ale-rust.txt /*b:ale_rust_cargo_include_features* +b:ale_rust_cargo_target_dir ale-rust.txt /*b:ale_rust_cargo_target_dir* +b:ale_rust_cargo_use_check ale-rust.txt /*b:ale_rust_cargo_use_check* +b:ale_rust_cargo_use_clippy ale-rust.txt /*b:ale_rust_cargo_use_clippy* +b:ale_rust_ignore_error_codes ale-rust.txt /*b:ale_rust_ignore_error_codes* +b:ale_rust_ignore_secondary_spans ale-rust.txt /*b:ale_rust_ignore_secondary_spans* +b:ale_rust_rls_config ale-rust.txt /*b:ale_rust_rls_config* +b:ale_rust_rls_executable ale-rust.txt /*b:ale_rust_rls_executable* +b:ale_rust_rls_toolchain ale-rust.txt /*b:ale_rust_rls_toolchain* +b:ale_rust_rustc_options ale-rust.txt /*b:ale_rust_rustc_options* +b:ale_rust_rustfmt_executable ale-rust.txt /*b:ale_rust_rustfmt_executable* +b:ale_rust_rustfmt_options ale-rust.txt /*b:ale_rust_rustfmt_options* +b:ale_sass_stylelint_executable ale-sass.txt /*b:ale_sass_stylelint_executable* +b:ale_sass_stylelint_use_global ale-sass.txt /*b:ale_sass_stylelint_use_global* +b:ale_scala_metals_executable ale-scala.txt /*b:ale_scala_metals_executable* +b:ale_scala_metals_project_root ale-scala.txt /*b:ale_scala_metals_project_root* +b:ale_scala_sbtserver_address ale-scala.txt /*b:ale_scala_sbtserver_address* +b:ale_scala_sbtserver_project_root ale-scala.txt /*b:ale_scala_sbtserver_project_root* +b:ale_scala_scalafmt_executable ale-scala.txt /*b:ale_scala_scalafmt_executable* +b:ale_scala_scalafmt_options ale-scala.txt /*b:ale_scala_scalafmt_options* +b:ale_scala_scalastyle_config ale-scala.txt /*b:ale_scala_scalastyle_config* +b:ale_scala_scalastyle_options ale-scala.txt /*b:ale_scala_scalastyle_options* +b:ale_scss_sasslint_executable ale-scss.txt /*b:ale_scss_sasslint_executable* +b:ale_scss_sasslint_options ale-scss.txt /*b:ale_scss_sasslint_options* +b:ale_scss_sasslint_use_global ale-scss.txt /*b:ale_scss_sasslint_use_global* +b:ale_scss_stylelint_executable ale-scss.txt /*b:ale_scss_stylelint_executable* +b:ale_scss_stylelint_options ale-scss.txt /*b:ale_scss_stylelint_options* +b:ale_scss_stylelint_use_global ale-scss.txt /*b:ale_scss_stylelint_use_global* +b:ale_set_balloons ale.txt /*b:ale_set_balloons* +b:ale_set_balloons_legacy_echo ale.txt /*b:ale_set_balloons_legacy_echo* +b:ale_sh_bashate_executable ale-sh.txt /*b:ale_sh_bashate_executable* +b:ale_sh_bashate_options ale-sh.txt /*b:ale_sh_bashate_options* +b:ale_sh_language_server_executable ale-sh.txt /*b:ale_sh_language_server_executable* +b:ale_sh_language_server_use_global ale-sh.txt /*b:ale_sh_language_server_use_global* +b:ale_sh_shell_default_shell ale-sh.txt /*b:ale_sh_shell_default_shell* +b:ale_sh_shellcheck_change_directory ale-sh.txt /*b:ale_sh_shellcheck_change_directory* +b:ale_sh_shellcheck_dialect ale-sh.txt /*b:ale_sh_shellcheck_dialect* +b:ale_sh_shellcheck_exclusions ale-sh.txt /*b:ale_sh_shellcheck_exclusions* +b:ale_sh_shellcheck_executable ale-sh.txt /*b:ale_sh_shellcheck_executable* +b:ale_sh_shellcheck_options ale-sh.txt /*b:ale_sh_shellcheck_options* +b:ale_sh_shfmt_options ale-sh.txt /*b:ale_sh_shfmt_options* +b:ale_shell ale.txt /*b:ale_shell* +b:ale_shell_arguments ale.txt /*b:ale_shell_arguments* +b:ale_sml_smlnj_cm_file ale-sml.txt /*b:ale_sml_smlnj_cm_file* +b:ale_solidity_solc_executable ale-solidity.txt /*b:ale_solidity_solc_executable* +b:ale_solidity_solc_options ale-solidity.txt /*b:ale_solidity_solc_options* +b:ale_sourcekit_lsp_executable ale-swift.txt /*b:ale_sourcekit_lsp_executable* +b:ale_spec_rpmlint_executable ale-spec.txt /*b:ale_spec_rpmlint_executable* +b:ale_spec_rpmlint_options ale-spec.txt /*b:ale_spec_rpmlint_options* +b:ale_sql_pgformatter_executable ale-sql.txt /*b:ale_sql_pgformatter_executable* +b:ale_sql_pgformatter_options ale-sql.txt /*b:ale_sql_pgformatter_options* +b:ale_sql_sqlfluff_executable ale-sql.txt /*b:ale_sql_sqlfluff_executable* +b:ale_sql_sqlfluff_options ale-sql.txt /*b:ale_sql_sqlfluff_options* +b:ale_sql_sqlfmt_executable ale-sql.txt /*b:ale_sql_sqlfmt_executable* +b:ale_sql_sqlfmt_options ale-sql.txt /*b:ale_sql_sqlfmt_options* +b:ale_sql_sqlformat_executable ale-sql.txt /*b:ale_sql_sqlformat_executable* +b:ale_sql_sqlformat_options ale-sql.txt /*b:ale_sql_sqlformat_options* +b:ale_stylus_stylelint_executable ale-stylus.txt /*b:ale_stylus_stylelint_executable* +b:ale_stylus_stylelint_options ale-stylus.txt /*b:ale_stylus_stylelint_options* +b:ale_stylus_stylelint_use_global ale-stylus.txt /*b:ale_stylus_stylelint_use_global* +b:ale_sugarss_stylelint_executable ale-sugarss.txt /*b:ale_sugarss_stylelint_executable* +b:ale_sugarss_stylelint_options ale-sugarss.txt /*b:ale_sugarss_stylelint_options* +b:ale_sugarss_stylelint_use_global ale-sugarss.txt /*b:ale_sugarss_stylelint_use_global* +b:ale_svelte_svelteserver_executable ale-svelte.txt /*b:ale_svelte_svelteserver_executable* +b:ale_svelte_svelteserver_use_global ale-svelte.txt /*b:ale_svelte_svelteserver_use_global* +b:ale_swift_appleswiftformat_executable ale-swift.txt /*b:ale_swift_appleswiftformat_executable* +b:ale_swift_appleswiftformat_use_swiftpm ale-swift.txt /*b:ale_swift_appleswiftformat_use_swiftpm* +b:ale_tcl_nagelfar_executable ale-tcl.txt /*b:ale_tcl_nagelfar_executable* +b:ale_tcl_nagelfar_options ale-tcl.txt /*b:ale_tcl_nagelfar_options* +b:ale_terraform_checkov_executable ale-terraform.txt /*b:ale_terraform_checkov_executable* +b:ale_terraform_checkov_options ale-terraform.txt /*b:ale_terraform_checkov_options* +b:ale_terraform_fmt_executable ale-terraform.txt /*b:ale_terraform_fmt_executable* +b:ale_terraform_fmt_options ale-terraform.txt /*b:ale_terraform_fmt_options* +b:ale_terraform_langserver_executable ale-terraform.txt /*b:ale_terraform_langserver_executable* +b:ale_terraform_langserver_options ale-terraform.txt /*b:ale_terraform_langserver_options* +b:ale_terraform_ls_executable ale-terraform.txt /*b:ale_terraform_ls_executable* +b:ale_terraform_ls_options ale-terraform.txt /*b:ale_terraform_ls_options* +b:ale_terraform_terraform_executable ale-terraform.txt /*b:ale_terraform_terraform_executable* +b:ale_terraform_tflint_executable ale-terraform.txt /*b:ale_terraform_tflint_executable* +b:ale_terraform_tflint_options ale-terraform.txt /*b:ale_terraform_tflint_options* +b:ale_terraform_tfsec_executable ale-terraform.txt /*b:ale_terraform_tfsec_executable* +b:ale_terraform_tfsec_options ale-terraform.txt /*b:ale_terraform_tfsec_options* +b:ale_tex_chktex_executable ale-tex.txt /*b:ale_tex_chktex_executable* +b:ale_tex_chktex_options ale-tex.txt /*b:ale_tex_chktex_options* +b:ale_tex_latexindent_executable ale-tex.txt /*b:ale_tex_latexindent_executable* +b:ale_tex_latexindent_options ale-tex.txt /*b:ale_tex_latexindent_options* +b:ale_tex_texlab_config ale-tex.txt /*b:ale_tex_texlab_config* +b:ale_tex_texlab_executable ale-tex.txt /*b:ale_tex_texlab_executable* +b:ale_tex_texlab_options ale-tex.txt /*b:ale_tex_texlab_options* +b:ale_textlint_executable ale-text.txt /*b:ale_textlint_executable* +b:ale_textlint_options ale-text.txt /*b:ale_textlint_options* +b:ale_textlint_use_global ale-text.txt /*b:ale_textlint_use_global* +b:ale_thrift_thrift_executable ale-thrift.txt /*b:ale_thrift_thrift_executable* +b:ale_thrift_thrift_generators ale-thrift.txt /*b:ale_thrift_thrift_generators* +b:ale_thrift_thrift_includes ale-thrift.txt /*b:ale_thrift_thrift_includes* +b:ale_thrift_thrift_options ale-thrift.txt /*b:ale_thrift_thrift_options* +b:ale_thrift_thriftcheck_executable ale-thrift.txt /*b:ale_thrift_thriftcheck_executable* +b:ale_thrift_thriftcheck_options ale-thrift.txt /*b:ale_thrift_thriftcheck_options* +b:ale_type_map ale.txt /*b:ale_type_map* +b:ale_typescript_standard_executable ale-typescript.txt /*b:ale_typescript_standard_executable* +b:ale_typescript_standard_options ale-typescript.txt /*b:ale_typescript_standard_options* +b:ale_typescript_standard_use_global ale-typescript.txt /*b:ale_typescript_standard_use_global* +b:ale_typescript_tslint_config_path ale-typescript.txt /*b:ale_typescript_tslint_config_path* +b:ale_typescript_tslint_executable ale-typescript.txt /*b:ale_typescript_tslint_executable* +b:ale_typescript_tslint_ignore_empty_files ale-typescript.txt /*b:ale_typescript_tslint_ignore_empty_files* +b:ale_typescript_tslint_rules_dir ale-typescript.txt /*b:ale_typescript_tslint_rules_dir* +b:ale_typescript_tslint_use_global ale-typescript.txt /*b:ale_typescript_tslint_use_global* +b:ale_typescript_tsserver_config_path ale-typescript.txt /*b:ale_typescript_tsserver_config_path* +b:ale_typescript_tsserver_executable ale-typescript.txt /*b:ale_typescript_tsserver_executable* +b:ale_typescript_tsserver_use_global ale-typescript.txt /*b:ale_typescript_tsserver_use_global* +b:ale_typescript_xo_executable ale-typescript.txt /*b:ale_typescript_xo_executable* +b:ale_typescript_xo_options ale-typescript.txt /*b:ale_typescript_xo_options* +b:ale_typescript_xo_use_global ale-typescript.txt /*b:ale_typescript_xo_use_global* +b:ale_update_tagstack ale.txt /*b:ale_update_tagstack* +b:ale_v_v_executable ale-v.txt /*b:ale_v_v_executable* +b:ale_v_v_options ale-v.txt /*b:ale_v_v_options* +b:ale_v_vfmt_options ale-v.txt /*b:ale_v_vfmt_options* +b:ale_verilog_verilator_options ale-verilog.txt /*b:ale_verilog_verilator_options* +b:ale_verilog_vlog_executable ale-verilog.txt /*b:ale_verilog_vlog_executable* +b:ale_verilog_vlog_options ale-verilog.txt /*b:ale_verilog_vlog_options* +b:ale_verilog_xvlog_executable ale-verilog.txt /*b:ale_verilog_xvlog_executable* +b:ale_verilog_xvlog_options ale-verilog.txt /*b:ale_verilog_xvlog_options* +b:ale_verilog_yosys_executable ale-verilog.txt /*b:ale_verilog_yosys_executable* +b:ale_verilog_yosys_options ale-verilog.txt /*b:ale_verilog_yosys_options* +b:ale_vhdl_ghdl_executable ale-vhdl.txt /*b:ale_vhdl_ghdl_executable* +b:ale_vhdl_ghdl_options ale-vhdl.txt /*b:ale_vhdl_ghdl_options* +b:ale_vhdl_vcom_executable ale-vhdl.txt /*b:ale_vhdl_vcom_executable* +b:ale_vhdl_vcom_options ale-vhdl.txt /*b:ale_vhdl_vcom_options* +b:ale_vhdl_xvhdl_executable ale-vhdl.txt /*b:ale_vhdl_xvhdl_executable* +b:ale_vhdl_xvhdl_options ale-vhdl.txt /*b:ale_vhdl_xvhdl_options* +b:ale_vim_vimls_config ale-vim.txt /*b:ale_vim_vimls_config* +b:ale_vim_vimls_executable ale-vim.txt /*b:ale_vim_vimls_executable* +b:ale_vim_vimls_use_global ale-vim.txt /*b:ale_vim_vimls_use_global* +b:ale_vim_vint_executable ale-vim.txt /*b:ale_vim_vint_executable* +b:ale_vim_vint_show_style_issues ale-vim.txt /*b:ale_vim_vint_show_style_issues* +b:ale_virtualenv_dir_names ale.txt /*b:ale_virtualenv_dir_names* +b:ale_virtualtext_delay ale.txt /*b:ale_virtualtext_delay* +b:ale_virtualtext_prefix ale.txt /*b:ale_virtualtext_prefix* +b:ale_vue_vls_executable ale-vue.txt /*b:ale_vue_vls_executable* +b:ale_vue_vls_use_global ale-vue.txt /*b:ale_vue_vls_use_global* +b:ale_vue_volar_executable ale-vue.txt /*b:ale_vue_volar_executable* +b:ale_vue_volar_init_options ale-vue.txt /*b:ale_vue_volar_init_options* +b:ale_vue_volar_use_global ale-vue.txt /*b:ale_vue_volar_use_global* +b:ale_warn_about_trailing_blank_lines ale.txt /*b:ale_warn_about_trailing_blank_lines* +b:ale_warn_about_trailing_whitespace ale.txt /*b:ale_warn_about_trailing_whitespace* +b:ale_wgsl_naga_executable ale-wgsl.txt /*b:ale_wgsl_naga_executable* +b:ale_windows_node_executable_path ale.txt /*b:ale_windows_node_executable_path* +b:ale_writegood_executable ale.txt /*b:ale_writegood_executable* +b:ale_writegood_options ale.txt /*b:ale_writegood_options* +b:ale_writegood_use_global ale.txt /*b:ale_writegood_use_global* +b:ale_xml_xmllint_executable ale-xml.txt /*b:ale_xml_xmllint_executable* +b:ale_xml_xmllint_indentsize ale-xml.txt /*b:ale_xml_xmllint_indentsize* +b:ale_xml_xmllint_options ale-xml.txt /*b:ale_xml_xmllint_options* +b:ale_yaml_actionlint_executable ale-yaml.txt /*b:ale_yaml_actionlint_executable* +b:ale_yaml_actionlint_options ale-yaml.txt /*b:ale_yaml_actionlint_options* +b:ale_yaml_gitlablint_executable ale-yaml.txt /*b:ale_yaml_gitlablint_executable* +b:ale_yaml_gitlablint_options ale-yaml.txt /*b:ale_yaml_gitlablint_options* +b:ale_yaml_ls_config ale-yaml.txt /*b:ale_yaml_ls_config* +b:ale_yaml_ls_executable ale-yaml.txt /*b:ale_yaml_ls_executable* +b:ale_yaml_ls_use_global ale-yaml.txt /*b:ale_yaml_ls_use_global* +b:ale_yaml_spectral_executable ale-yaml.txt /*b:ale_yaml_spectral_executable* +b:ale_yaml_spectral_use_global ale-yaml.txt /*b:ale_yaml_spectral_use_global* +b:ale_yaml_swaglint_executable ale-yaml.txt /*b:ale_yaml_swaglint_executable* +b:ale_yaml_swaglint_use_global ale-yaml.txt /*b:ale_yaml_swaglint_use_global* +b:ale_yaml_yamlfix_executable ale-yaml.txt /*b:ale_yaml_yamlfix_executable* +b:ale_yaml_yamlfix_options ale-yaml.txt /*b:ale_yaml_yamlfix_options* +b:ale_yaml_yamlfix_use_global ale-yaml.txt /*b:ale_yaml_yamlfix_use_global* +b:ale_yaml_yamllint_executable ale-yaml.txt /*b:ale_yaml_yamllint_executable* +b:ale_yaml_yamllint_options ale-yaml.txt /*b:ale_yaml_yamllint_options* +b:ale_yang_lsp_executable ale-yang.txt /*b:ale_yang_lsp_executable* +b:ale_zeek_zeek_executable ale-zeek.txt /*b:ale_zeek_zeek_executable* +b:ale_zig_zigfmt_executable ale-zig.txt /*b:ale_zig_zigfmt_executable* +b:ale_zig_zls_config ale-zig.txt /*b:ale_zig_zls_config* +b:ale_zig_zls_executable ale-zig.txt /*b:ale_zig_zls_executable* +b:rego_opacheck_executable ale-rego.txt /*b:rego_opacheck_executable* +b:rego_opacheck_options ale-rego.txt /*b:rego_opacheck_options* +b:vala_vala_lint_config_filename ale-vala.txt /*b:vala_vala_lint_config_filename* +b:vala_vala_lint_executable ale-vala.txt /*b:vala_vala_lint_executable* +g:airline#extensions#ale#enabled ale.txt /*g:airline#extensions#ale#enabled* +g:ale-c-flawfinder ale-c.txt /*g:ale-c-flawfinder* +g:ale-cpp-flawfinder ale-cpp.txt /*g:ale-cpp-flawfinder* +g:ale_ada_adals_encoding ale-ada.txt /*g:ale_ada_adals_encoding* +g:ale_ada_adals_executable ale-ada.txt /*g:ale_ada_adals_executable* +g:ale_ada_adals_project ale-ada.txt /*g:ale_ada_adals_project* +g:ale_ada_gcc_executable ale-ada.txt /*g:ale_ada_gcc_executable* +g:ale_ada_gcc_options ale-ada.txt /*g:ale_ada_gcc_options* +g:ale_ada_gnatpp_options ale-ada.txt /*g:ale_ada_gnatpp_options* +g:ale_alex_executable ale.txt /*g:ale_alex_executable* +g:ale_alex_use_global ale.txt /*g:ale_alex_use_global* +g:ale_ansible_ansible_lint_executable ale-ansible.txt /*g:ale_ansible_ansible_lint_executable* +g:ale_ansible_language_server ale-ansible.txt /*g:ale_ansible_language_server* +g:ale_ansible_language_server_config ale-ansible.txt /*g:ale_ansible_language_server_config* +g:ale_apkbuild_apkbuild_lint_executable ale-apkbuild.txt /*g:ale_apkbuild_apkbuild_lint_executable* +g:ale_apkbuild_secfixes_check_executable ale-apkbuild.txt /*g:ale_apkbuild_secfixes_check_executable* +g:ale_asm_gcc_executable ale-asm.txt /*g:ale_asm_gcc_executable* +g:ale_asm_gcc_options ale-asm.txt /*g:ale_asm_gcc_options* +g:ale_avra_avra_executable ale-avra.txt /*g:ale_avra_avra_executable* +g:ale_avra_avra_options ale-avra.txt /*g:ale_avra_avra_options* +g:ale_awk_gawk_executable ale-awk.txt /*g:ale_awk_gawk_executable* +g:ale_awk_gawk_options ale-awk.txt /*g:ale_awk_gawk_options* +g:ale_bazel_buildifier_executable ale-bazel.txt /*g:ale_bazel_buildifier_executable* +g:ale_bazel_buildifier_options ale-bazel.txt /*g:ale_bazel_buildifier_options* +g:ale_bazel_buildifier_use_global ale-bazel.txt /*g:ale_bazel_buildifier_use_global* +g:ale_bib_bibclean_executable ale-bib.txt /*g:ale_bib_bibclean_executable* +g:ale_bib_bibclean_options ale-bib.txt /*g:ale_bib_bibclean_options* +g:ale_bicep_bicep_executable ale-bicep.txt /*g:ale_bicep_bicep_executable* +g:ale_bicep_bicep_options ale-bicep.txt /*g:ale_bicep_bicep_options* +g:ale_bitbake_oelint_adv_config ale-bitbake.txt /*g:ale_bitbake_oelint_adv_config* +g:ale_bitbake_oelint_adv_executable ale-bitbake.txt /*g:ale_bitbake_oelint_adv_executable* +g:ale_bitbake_oelint_adv_options ale-bitbake.txt /*g:ale_bitbake_oelint_adv_options* +g:ale_c_always_make ale-c.txt /*g:ale_c_always_make* +g:ale_c_astyle_executable ale-c.txt /*g:ale_c_astyle_executable* +g:ale_c_astyle_project_options ale-c.txt /*g:ale_c_astyle_project_options* +g:ale_c_build_dir ale-c.txt /*g:ale_c_build_dir* +g:ale_c_build_dir_names ale-c.txt /*g:ale_c_build_dir_names* +g:ale_c_cc_executable ale-c.txt /*g:ale_c_cc_executable* +g:ale_c_cc_header_exts ale-c.txt /*g:ale_c_cc_header_exts* +g:ale_c_cc_options ale-c.txt /*g:ale_c_cc_options* +g:ale_c_cc_use_header_lang_flag ale-c.txt /*g:ale_c_cc_use_header_lang_flag* +g:ale_c_ccls_executable ale-c.txt /*g:ale_c_ccls_executable* +g:ale_c_ccls_init_options ale-c.txt /*g:ale_c_ccls_init_options* +g:ale_c_clangd_executable ale-c.txt /*g:ale_c_clangd_executable* +g:ale_c_clangd_options ale-c.txt /*g:ale_c_clangd_options* +g:ale_c_clangformat_executable ale-c.txt /*g:ale_c_clangformat_executable* +g:ale_c_clangformat_options ale-c.txt /*g:ale_c_clangformat_options* +g:ale_c_clangformat_style_option ale-c.txt /*g:ale_c_clangformat_style_option* +g:ale_c_clangformat_use_local_file ale-c.txt /*g:ale_c_clangformat_use_local_file* +g:ale_c_clangtidy_checks ale-c.txt /*g:ale_c_clangtidy_checks* +g:ale_c_clangtidy_executable ale-c.txt /*g:ale_c_clangtidy_executable* +g:ale_c_clangtidy_extra_options ale-c.txt /*g:ale_c_clangtidy_extra_options* +g:ale_c_clangtidy_fix_errors ale-c.txt /*g:ale_c_clangtidy_fix_errors* +g:ale_c_clangtidy_options ale-c.txt /*g:ale_c_clangtidy_options* +g:ale_c_cppcheck_executable ale-c.txt /*g:ale_c_cppcheck_executable* +g:ale_c_cppcheck_options ale-c.txt /*g:ale_c_cppcheck_options* +g:ale_c_cpplint_executable ale-cpp.txt /*g:ale_c_cpplint_executable* +g:ale_c_cpplint_options ale-cpp.txt /*g:ale_c_cpplint_options* +g:ale_c_cquery_cache_directory ale-c.txt /*g:ale_c_cquery_cache_directory* +g:ale_c_cquery_executable ale-c.txt /*g:ale_c_cquery_executable* +g:ale_c_flawfinder_error_severity ale-c.txt /*g:ale_c_flawfinder_error_severity* +g:ale_c_flawfinder_executable ale-c.txt /*g:ale_c_flawfinder_executable* +g:ale_c_flawfinder_minlevel ale-c.txt /*g:ale_c_flawfinder_minlevel* +g:ale_c_parse_compile_commands ale-c.txt /*g:ale_c_parse_compile_commands* +g:ale_c_parse_makefile ale-c.txt /*g:ale_c_parse_makefile* +g:ale_c_uncrustify_executable ale-c.txt /*g:ale_c_uncrustify_executable* +g:ale_c_uncrustify_options ale-c.txt /*g:ale_c_uncrustify_options* +g:ale_cache_executable_check_failures ale.txt /*g:ale_cache_executable_check_failures* +g:ale_cairo_starknet_executable ale-cairo.txt /*g:ale_cairo_starknet_executable* +g:ale_change_sign_column_color ale.txt /*g:ale_change_sign_column_color* +g:ale_chef_cookstyle_executable ale-chef.txt /*g:ale_chef_cookstyle_executable* +g:ale_chef_cookstyle_options ale-chef.txt /*g:ale_chef_cookstyle_options* +g:ale_chef_foodcritic_executable ale-chef.txt /*g:ale_chef_foodcritic_executable* +g:ale_chef_foodcritic_options ale-chef.txt /*g:ale_chef_foodcritic_options* +g:ale_clojure_clj_kondo_options ale-clojure.txt /*g:ale_clojure_clj_kondo_options* +g:ale_close_preview_on_insert ale.txt /*g:ale_close_preview_on_insert* +g:ale_cmake_cmake_lint_executable ale-cmake.txt /*g:ale_cmake_cmake_lint_executable* +g:ale_cmake_cmake_lint_options ale-cmake.txt /*g:ale_cmake_cmake_lint_options* +g:ale_cmake_cmakeformat_executable ale-cmake.txt /*g:ale_cmake_cmakeformat_executable* +g:ale_cmake_cmakeformat_options ale-cmake.txt /*g:ale_cmake_cmakeformat_options* +g:ale_cmake_cmakelint_executable ale-cmake.txt /*g:ale_cmake_cmakelint_executable* +g:ale_cmake_cmakelint_options ale-cmake.txt /*g:ale_cmake_cmakelint_options* +g:ale_command_wrapper ale.txt /*g:ale_command_wrapper* +g:ale_completion_autoimport ale.txt /*g:ale_completion_autoimport* +g:ale_completion_delay ale.txt /*g:ale_completion_delay* +g:ale_completion_enabled ale.txt /*g:ale_completion_enabled* +g:ale_completion_excluded_words ale.txt /*g:ale_completion_excluded_words* +g:ale_completion_max_suggestions ale.txt /*g:ale_completion_max_suggestions* +g:ale_completion_symbols ale.txt /*g:ale_completion_symbols* +g:ale_completion_tsserver_remove_warnings ale.txt /*g:ale_completion_tsserver_remove_warnings* +g:ale_cpp_astyle_executable ale-cpp.txt /*g:ale_cpp_astyle_executable* +g:ale_cpp_astyle_project_options ale-cpp.txt /*g:ale_cpp_astyle_project_options* +g:ale_cpp_cc_executable ale-cpp.txt /*g:ale_cpp_cc_executable* +g:ale_cpp_cc_header_exts ale-cpp.txt /*g:ale_cpp_cc_header_exts* +g:ale_cpp_cc_options ale-cpp.txt /*g:ale_cpp_cc_options* +g:ale_cpp_cc_use_header_lang_flag ale-cpp.txt /*g:ale_cpp_cc_use_header_lang_flag* +g:ale_cpp_ccls_executable ale-cpp.txt /*g:ale_cpp_ccls_executable* +g:ale_cpp_ccls_init_options ale-cpp.txt /*g:ale_cpp_ccls_init_options* +g:ale_cpp_clangcheck_executable ale-cpp.txt /*g:ale_cpp_clangcheck_executable* +g:ale_cpp_clangcheck_options ale-cpp.txt /*g:ale_cpp_clangcheck_options* +g:ale_cpp_clangd_executable ale-cpp.txt /*g:ale_cpp_clangd_executable* +g:ale_cpp_clangd_options ale-cpp.txt /*g:ale_cpp_clangd_options* +g:ale_cpp_clangtidy_checks ale-cpp.txt /*g:ale_cpp_clangtidy_checks* +g:ale_cpp_clangtidy_executable ale-cpp.txt /*g:ale_cpp_clangtidy_executable* +g:ale_cpp_clangtidy_extra_options ale-cpp.txt /*g:ale_cpp_clangtidy_extra_options* +g:ale_cpp_clangtidy_fix_errors ale-cpp.txt /*g:ale_cpp_clangtidy_fix_errors* +g:ale_cpp_clangtidy_options ale-cpp.txt /*g:ale_cpp_clangtidy_options* +g:ale_cpp_clazy_checks ale-cpp.txt /*g:ale_cpp_clazy_checks* +g:ale_cpp_clazy_executable ale-cpp.txt /*g:ale_cpp_clazy_executable* +g:ale_cpp_clazy_options ale-cpp.txt /*g:ale_cpp_clazy_options* +g:ale_cpp_cppcheck_executable ale-cpp.txt /*g:ale_cpp_cppcheck_executable* +g:ale_cpp_cppcheck_options ale-cpp.txt /*g:ale_cpp_cppcheck_options* +g:ale_cpp_cpplint_executable ale-cpp.txt /*g:ale_cpp_cpplint_executable* +g:ale_cpp_cpplint_options ale-cpp.txt /*g:ale_cpp_cpplint_options* +g:ale_cpp_cquery_cache_directory ale-cpp.txt /*g:ale_cpp_cquery_cache_directory* +g:ale_cpp_cquery_executable ale-cpp.txt /*g:ale_cpp_cquery_executable* +g:ale_cpp_flawfinder_executable ale-cpp.txt /*g:ale_cpp_flawfinder_executable* +g:ale_cpp_flawfinder_minlevel ale-cpp.txt /*g:ale_cpp_flawfinder_minlevel* +g:ale_cs_csc_assemblies ale-cs.txt /*g:ale_cs_csc_assemblies* +g:ale_cs_csc_assembly_path ale-cs.txt /*g:ale_cs_csc_assembly_path* +g:ale_cs_csc_options ale-cs.txt /*g:ale_cs_csc_options* +g:ale_cs_csc_source ale-cs.txt /*g:ale_cs_csc_source* +g:ale_cs_dotnet_format_executable ale-cs.txt /*g:ale_cs_dotnet_format_executable* +g:ale_cs_dotnet_format_options ale-cs.txt /*g:ale_cs_dotnet_format_options* +g:ale_cs_mcs_options ale-cs.txt /*g:ale_cs_mcs_options* +g:ale_cs_mcsc_assemblies ale-cs.txt /*g:ale_cs_mcsc_assemblies* +g:ale_cs_mcsc_assembly_path ale-cs.txt /*g:ale_cs_mcsc_assembly_path* +g:ale_cs_mcsc_options ale-cs.txt /*g:ale_cs_mcsc_options* +g:ale_cs_mcsc_source ale-cs.txt /*g:ale_cs_mcsc_source* +g:ale_cspell_executable ale.txt /*g:ale_cspell_executable* +g:ale_cspell_options ale.txt /*g:ale_cspell_options* +g:ale_cspell_use_global ale.txt /*g:ale_cspell_use_global* +g:ale_css_css_beautify_executable ale-css.txt /*g:ale_css_css_beautify_executable* +g:ale_css_css_beautify_options ale-css.txt /*g:ale_css_css_beautify_options* +g:ale_css_css_beautify_use_global ale-css.txt /*g:ale_css_css_beautify_use_global* +g:ale_css_stylelint_executable ale-css.txt /*g:ale_css_stylelint_executable* +g:ale_css_stylelint_options ale-css.txt /*g:ale_css_stylelint_options* +g:ale_css_stylelint_use_global ale-css.txt /*g:ale_css_stylelint_use_global* +g:ale_cuda_clangd_executable ale-cuda.txt /*g:ale_cuda_clangd_executable* +g:ale_cuda_clangd_options ale-cuda.txt /*g:ale_cuda_clangd_options* +g:ale_cuda_nvcc_executable ale-cuda.txt /*g:ale_cuda_nvcc_executable* +g:ale_cuda_nvcc_options ale-cuda.txt /*g:ale_cuda_nvcc_options* +g:ale_cursor_detail ale.txt /*g:ale_cursor_detail* +g:ale_d_dfmt_options ale-d.txt /*g:ale_d_dfmt_options* +g:ale_d_dls_executable ale-d.txt /*g:ale_d_dls_executable* +g:ale_dafny_dafny_timelimit ale-dafny.txt /*g:ale_dafny_dafny_timelimit* +g:ale_dart_analysis_server_executable ale-dart.txt /*g:ale_dart_analysis_server_executable* +g:ale_dart_analyze_executable ale-dart.txt /*g:ale_dart_analyze_executable* +g:ale_dart_dartfmt_executable ale-dart.txt /*g:ale_dart_dartfmt_executable* +g:ale_dart_dartfmt_options ale-dart.txt /*g:ale_dart_dartfmt_options* +g:ale_dart_format_executable ale-dart.txt /*g:ale_dart_format_executable* +g:ale_dart_format_options ale-dart.txt /*g:ale_dart_format_options* +g:ale_default_navigation ale.txt /*g:ale_default_navigation* +g:ale_deno_executable ale-typescript.txt /*g:ale_deno_executable* +g:ale_deno_importMap ale-typescript.txt /*g:ale_deno_importMap* +g:ale_deno_lsp_project_root ale-typescript.txt /*g:ale_deno_lsp_project_root* +g:ale_deno_unstable ale-typescript.txt /*g:ale_deno_unstable* +g:ale_desktop_desktop_file_validate_options ale-desktop.txt /*g:ale_desktop_desktop_file_validate_options* +g:ale_detail_to_floating_preview ale.txt /*g:ale_detail_to_floating_preview* +g:ale_dhall_executable ale-dhall.txt /*g:ale_dhall_executable* +g:ale_dhall_freeze_options ale-dhall.txt /*g:ale_dhall_freeze_options* +g:ale_dhall_options ale-dhall.txt /*g:ale_dhall_options* +g:ale_disable_lsp ale.txt /*g:ale_disable_lsp* +g:ale_dockerfile_dockerfile_lint_executable ale-dockerfile.txt /*g:ale_dockerfile_dockerfile_lint_executable* +g:ale_dockerfile_dockerfile_lint_options ale-dockerfile.txt /*g:ale_dockerfile_dockerfile_lint_options* +g:ale_dockerfile_hadolint_image ale-dockerfile.txt /*g:ale_dockerfile_hadolint_image* +g:ale_dockerfile_hadolint_options ale-dockerfile.txt /*g:ale_dockerfile_hadolint_options* +g:ale_dockerfile_hadolint_use_docker ale-dockerfile.txt /*g:ale_dockerfile_hadolint_use_docker* +g:ale_dprint_config ale.txt /*g:ale_dprint_config* +g:ale_dprint_executable ale.txt /*g:ale_dprint_executable* +g:ale_dprint_options ale.txt /*g:ale_dprint_options* +g:ale_dprint_use_global ale.txt /*g:ale_dprint_use_global* +g:ale_echo_cursor ale.txt /*g:ale_echo_cursor* +g:ale_echo_delay ale.txt /*g:ale_echo_delay* +g:ale_echo_msg_error_str ale.txt /*g:ale_echo_msg_error_str* +g:ale_echo_msg_format ale.txt /*g:ale_echo_msg_format* +g:ale_echo_msg_info_str ale.txt /*g:ale_echo_msg_info_str* +g:ale_echo_msg_log_str ale.txt /*g:ale_echo_msg_log_str* +g:ale_echo_msg_warning_str ale.txt /*g:ale_echo_msg_warning_str* +g:ale_elixir_credo_config_file ale-elixir.txt /*g:ale_elixir_credo_config_file* +g:ale_elixir_credo_strict ale-elixir.txt /*g:ale_elixir_credo_strict* +g:ale_elixir_elixir_ls_config ale-elixir.txt /*g:ale_elixir_elixir_ls_config* +g:ale_elixir_elixir_ls_release ale-elixir.txt /*g:ale_elixir_elixir_ls_release* +g:ale_elixir_mix_format_options ale-elixir.txt /*g:ale_elixir_mix_format_options* +g:ale_elixir_mix_options ale-elixir.txt /*g:ale_elixir_mix_options* +g:ale_elm_format_executable ale-elm.txt /*g:ale_elm_format_executable* +g:ale_elm_format_options ale-elm.txt /*g:ale_elm_format_options* +g:ale_elm_format_use_global ale-elm.txt /*g:ale_elm_format_use_global* +g:ale_elm_ls_elm_analyse_trigger ale-elm.txt /*g:ale_elm_ls_elm_analyse_trigger* +g:ale_elm_ls_elm_format_path ale-elm.txt /*g:ale_elm_ls_elm_format_path* +g:ale_elm_ls_elm_path ale-elm.txt /*g:ale_elm_ls_elm_path* +g:ale_elm_ls_elm_test_path ale-elm.txt /*g:ale_elm_ls_elm_test_path* +g:ale_elm_ls_executable ale-elm.txt /*g:ale_elm_ls_executable* +g:ale_elm_ls_use_global ale-elm.txt /*g:ale_elm_ls_use_global* +g:ale_elm_make_executable ale-elm.txt /*g:ale_elm_make_executable* +g:ale_elm_make_use_global ale-elm.txt /*g:ale_elm_make_use_global* +g:ale_enabled ale.txt /*g:ale_enabled* +g:ale_erlang_dialyzer_executable ale-erlang.txt /*g:ale_erlang_dialyzer_executable* +g:ale_erlang_dialyzer_options ale-erlang.txt /*g:ale_erlang_dialyzer_options* +g:ale_erlang_dialyzer_plt_file ale-erlang.txt /*g:ale_erlang_dialyzer_plt_file* +g:ale_erlang_dialyzer_rebar3_profile ale-erlang.txt /*g:ale_erlang_dialyzer_rebar3_profile* +g:ale_erlang_elvis_executable ale-erlang.txt /*g:ale_erlang_elvis_executable* +g:ale_erlang_erlang_ls_executable ale-erlang.txt /*g:ale_erlang_erlang_ls_executable* +g:ale_erlang_erlang_ls_log_dir ale-erlang.txt /*g:ale_erlang_erlang_ls_log_dir* +g:ale_erlang_erlang_ls_log_level ale-erlang.txt /*g:ale_erlang_erlang_ls_log_level* +g:ale_erlang_erlc_executable ale-erlang.txt /*g:ale_erlang_erlc_executable* +g:ale_erlang_erlc_options ale-erlang.txt /*g:ale_erlang_erlc_options* +g:ale_erlang_erlfmt_executable ale-erlang.txt /*g:ale_erlang_erlfmt_executable* +g:ale_erlang_erlfmt_options ale-erlang.txt /*g:ale_erlang_erlfmt_options* +g:ale_erlang_syntaxerl_executable ale-erlang.txt /*g:ale_erlang_syntaxerl_executable* +g:ale_eruby_erblint_executable ale-eruby.txt /*g:ale_eruby_erblint_executable* +g:ale_eruby_ruumba_executable ale-eruby.txt /*g:ale_eruby_ruumba_executable* +g:ale_exclude_highlights ale.txt /*g:ale_exclude_highlights* +g:ale_filename_mappings ale.txt /*g:ale_filename_mappings* +g:ale_fish_fish_indent_executable ale-fish.txt /*g:ale_fish_fish_indent_executable* +g:ale_fish_fish_indent_options ale-fish.txt /*g:ale_fish_fish_indent_options* +g:ale_fix_on_save ale.txt /*g:ale_fix_on_save* +g:ale_fix_on_save_ignore ale.txt /*g:ale_fix_on_save_ignore* +g:ale_fixers ale.txt /*g:ale_fixers* +g:ale_floating_preview ale.txt /*g:ale_floating_preview* +g:ale_floating_preview_popup_opts ale.txt /*g:ale_floating_preview_popup_opts* +g:ale_floating_window_border ale.txt /*g:ale_floating_window_border* +g:ale_fortran_gcc_executable ale-fortran.txt /*g:ale_fortran_gcc_executable* +g:ale_fortran_gcc_options ale-fortran.txt /*g:ale_fortran_gcc_options* +g:ale_fortran_gcc_use_free_form ale-fortran.txt /*g:ale_fortran_gcc_use_free_form* +g:ale_fortran_language_server_executable ale-fortran.txt /*g:ale_fortran_language_server_executable* +g:ale_fortran_language_server_use_global ale-fortran.txt /*g:ale_fortran_language_server_use_global* +g:ale_fuse_fusionlint_executable ale-fuse.txt /*g:ale_fuse_fusionlint_executable* +g:ale_fuse_fusionlint_options ale-fuse.txt /*g:ale_fuse_fusionlint_options* +g:ale_gitcommit_gitlint_executable ale-gitcommit.txt /*g:ale_gitcommit_gitlint_executable* +g:ale_gitcommit_gitlint_options ale-gitcommit.txt /*g:ale_gitcommit_gitlint_options* +g:ale_gitcommit_gitlint_use_global ale-gitcommit.txt /*g:ale_gitcommit_gitlint_use_global* +g:ale_glsl_glslang_executable ale-glsl.txt /*g:ale_glsl_glslang_executable* +g:ale_glsl_glslang_options ale-glsl.txt /*g:ale_glsl_glslang_options* +g:ale_glsl_glslls_executable ale-glsl.txt /*g:ale_glsl_glslls_executable* +g:ale_glsl_glslls_logfile ale-glsl.txt /*g:ale_glsl_glslls_logfile* +g:ale_go_bingo_executable ale-go.txt /*g:ale_go_bingo_executable* +g:ale_go_bingo_options ale-go.txt /*g:ale_go_bingo_options* +g:ale_go_go111module ale-go.txt /*g:ale_go_go111module* +g:ale_go_go_executable ale-go.txt /*g:ale_go_go_executable* +g:ale_go_gobuild_options ale-go.txt /*g:ale_go_gobuild_options* +g:ale_go_gofmt_options ale-go.txt /*g:ale_go_gofmt_options* +g:ale_go_gofumpt_executable ale-go.txt /*g:ale_go_gofumpt_executable* +g:ale_go_gofumpt_options ale-go.txt /*g:ale_go_gofumpt_options* +g:ale_go_golangci_lint_executable ale-go.txt /*g:ale_go_golangci_lint_executable* +g:ale_go_golangci_lint_options ale-go.txt /*g:ale_go_golangci_lint_options* +g:ale_go_golangci_lint_package ale-go.txt /*g:ale_go_golangci_lint_package* +g:ale_go_golines_options ale-go.txt /*g:ale_go_golines_options* +g:ale_go_golint_executable ale-go.txt /*g:ale_go_golint_executable* +g:ale_go_golint_options ale-go.txt /*g:ale_go_golint_options* +g:ale_go_gometalinter_executable ale-go.txt /*g:ale_go_gometalinter_executable* +g:ale_go_gometalinter_lint_package ale-go.txt /*g:ale_go_gometalinter_lint_package* +g:ale_go_gometalinter_options ale-go.txt /*g:ale_go_gometalinter_options* +g:ale_go_gopls_executable ale-go.txt /*g:ale_go_gopls_executable* +g:ale_go_gopls_init_options ale-go.txt /*g:ale_go_gopls_init_options* +g:ale_go_gopls_options ale-go.txt /*g:ale_go_gopls_options* +g:ale_go_gopls_use_global ale-go.txt /*g:ale_go_gopls_use_global* +g:ale_go_govet_options ale-go.txt /*g:ale_go_govet_options* +g:ale_go_langserver_executable ale-go.txt /*g:ale_go_langserver_executable* +g:ale_go_langserver_options ale-go.txt /*g:ale_go_langserver_options* +g:ale_go_lines_executable ale-go.txt /*g:ale_go_lines_executable* +g:ale_go_revive_executable ale-go.txt /*g:ale_go_revive_executable* +g:ale_go_revive_options ale-go.txt /*g:ale_go_revive_options* +g:ale_go_staticcheck_executable ale-go.txt /*g:ale_go_staticcheck_executable* +g:ale_go_staticcheck_lint_package ale-go.txt /*g:ale_go_staticcheck_lint_package* +g:ale_go_staticcheck_options ale-go.txt /*g:ale_go_staticcheck_options* +g:ale_go_staticcheck_use_global ale-go.txt /*g:ale_go_staticcheck_use_global* +g:ale_hack_hack_executable ale-hack.txt /*g:ale_hack_hack_executable* +g:ale_hack_hackfmt_options ale-hack.txt /*g:ale_hack_hackfmt_options* +g:ale_hack_hhast_executable ale-hack.txt /*g:ale_hack_hhast_executable* +g:ale_handlebars_embertemplatelint_executable ale-handlebars.txt /*g:ale_handlebars_embertemplatelint_executable* +g:ale_handlebars_embertemplatelint_use_global ale-handlebars.txt /*g:ale_handlebars_embertemplatelint_use_global* +g:ale_haskell_brittany_executable ale-haskell.txt /*g:ale_haskell_brittany_executable* +g:ale_haskell_cabal_ghc_options ale-haskell.txt /*g:ale_haskell_cabal_ghc_options* +g:ale_haskell_floskell_executable ale-haskell.txt /*g:ale_haskell_floskell_executable* +g:ale_haskell_ghc_mod_executable ale-haskell.txt /*g:ale_haskell_ghc_mod_executable* +g:ale_haskell_ghc_options ale-haskell.txt /*g:ale_haskell_ghc_options* +g:ale_haskell_hdevtools_executable ale-haskell.txt /*g:ale_haskell_hdevtools_executable* +g:ale_haskell_hdevtools_options ale-haskell.txt /*g:ale_haskell_hdevtools_options* +g:ale_haskell_hfmt_executable ale-haskell.txt /*g:ale_haskell_hfmt_executable* +g:ale_haskell_hie_executable ale-haskell.txt /*g:ale_haskell_hie_executable* +g:ale_haskell_hindent_executable ale-haskell.txt /*g:ale_haskell_hindent_executable* +g:ale_haskell_hlint_executable ale-haskell.txt /*g:ale_haskell_hlint_executable* +g:ale_haskell_hls_config ale-haskell.txt /*g:ale_haskell_hls_config* +g:ale_haskell_hls_executable ale-haskell.txt /*g:ale_haskell_hls_executable* +g:ale_haskell_ormolu_executable ale-haskell.txt /*g:ale_haskell_ormolu_executable* +g:ale_haskell_ormolu_options ale-haskell.txt /*g:ale_haskell_ormolu_options* +g:ale_haskell_stack_build_options ale-haskell.txt /*g:ale_haskell_stack_build_options* +g:ale_haskell_stack_ghc_options ale-haskell.txt /*g:ale_haskell_stack_ghc_options* +g:ale_haskell_stylish_haskell_executable ale-haskell.txt /*g:ale_haskell_stylish_haskell_executable* +g:ale_hdl_checker_config_file ale-vhdl.txt /*g:ale_hdl_checker_config_file* +g:ale_hdl_checker_executable ale-vhdl.txt /*g:ale_hdl_checker_executable* +g:ale_hdl_checker_options ale-vhdl.txt /*g:ale_hdl_checker_options* +g:ale_history_enabled ale.txt /*g:ale_history_enabled* +g:ale_history_log_output ale.txt /*g:ale_history_log_output* +g:ale_hover_cursor ale.txt /*g:ale_hover_cursor* +g:ale_hover_to_floating_preview ale.txt /*g:ale_hover_to_floating_preview* +g:ale_hover_to_preview ale.txt /*g:ale_hover_to_preview* +g:ale_html_angular_executable ale-html.txt /*g:ale_html_angular_executable* +g:ale_html_angular_use_global ale-html.txt /*g:ale_html_angular_use_global* +g:ale_html_beautify_executable ale-html.txt /*g:ale_html_beautify_executable* +g:ale_html_beautify_options ale-html.txt /*g:ale_html_beautify_options* +g:ale_html_beautify_use_global ale-html.txt /*g:ale_html_beautify_use_global* +g:ale_html_htmlhint_executable ale-html.txt /*g:ale_html_htmlhint_executable* +g:ale_html_htmlhint_options ale-html.txt /*g:ale_html_htmlhint_options* +g:ale_html_htmlhint_use_global ale-html.txt /*g:ale_html_htmlhint_use_global* +g:ale_html_stylelint_executable ale-html.txt /*g:ale_html_stylelint_executable* +g:ale_html_stylelint_options ale-html.txt /*g:ale_html_stylelint_options* +g:ale_html_stylelint_use_global ale-html.txt /*g:ale_html_stylelint_use_global* +g:ale_html_tidy_executable ale-html.txt /*g:ale_html_tidy_executable* +g:ale_html_tidy_options ale-html.txt /*g:ale_html_tidy_options* +g:ale_idris_idris_executable ale-idris.txt /*g:ale_idris_idris_executable* +g:ale_idris_idris_options ale-idris.txt /*g:ale_idris_idris_options* +g:ale_inko_inko_executable ale-inko.txt /*g:ale_inko_inko_executable* +g:ale_ispc_ispc_executable ale-ispc.txt /*g:ale_ispc_ispc_executable* +g:ale_ispc_ispc_options ale-ispc.txt /*g:ale_ispc_ispc_options* +g:ale_java_checkstyle_config ale-java.txt /*g:ale_java_checkstyle_config* +g:ale_java_checkstyle_executable ale-java.txt /*g:ale_java_checkstyle_executable* +g:ale_java_checkstyle_options ale-java.txt /*g:ale_java_checkstyle_options* +g:ale_java_eclipse_config_path ale-java.txt /*g:ale_java_eclipse_config_path* +g:ale_java_eclipse_executable ale-java.txt /*g:ale_java_eclipse_executable* +g:ale_java_eclipselsp_javaagent ale-java.txt /*g:ale_java_eclipselsp_javaagent* +g:ale_java_eclipselsp_path ale-java.txt /*g:ale_java_eclipselsp_path* +g:ale_java_eclipselsp_workspace_path ale-java.txt /*g:ale_java_eclipselsp_workspace_path* +g:ale_java_google_java_format_executable ale-java.txt /*g:ale_java_google_java_format_executable* +g:ale_java_google_java_format_options ale-java.txt /*g:ale_java_google_java_format_options* +g:ale_java_javac_classpath ale-java.txt /*g:ale_java_javac_classpath* +g:ale_java_javac_executable ale-java.txt /*g:ale_java_javac_executable* +g:ale_java_javac_options ale-java.txt /*g:ale_java_javac_options* +g:ale_java_javac_sourcepath ale-java.txt /*g:ale_java_javac_sourcepath* +g:ale_java_javalsp_config ale-java.txt /*g:ale_java_javalsp_config* +g:ale_java_javalsp_executable ale-java.txt /*g:ale_java_javalsp_executable* +g:ale_java_pmd_options ale-java.txt /*g:ale_java_pmd_options* +g:ale_javascript_eslint_executable ale-javascript.txt /*g:ale_javascript_eslint_executable* +g:ale_javascript_eslint_options ale-javascript.txt /*g:ale_javascript_eslint_options* +g:ale_javascript_eslint_suppress_eslintignore ale-javascript.txt /*g:ale_javascript_eslint_suppress_eslintignore* +g:ale_javascript_eslint_suppress_missing_config ale-javascript.txt /*g:ale_javascript_eslint_suppress_missing_config* +g:ale_javascript_eslint_use_global ale-javascript.txt /*g:ale_javascript_eslint_use_global* +g:ale_javascript_fecs_executable ale-javascript.txt /*g:ale_javascript_fecs_executable* +g:ale_javascript_fecs_use_global ale-javascript.txt /*g:ale_javascript_fecs_use_global* +g:ale_javascript_flow_executable ale-javascript.txt /*g:ale_javascript_flow_executable* +g:ale_javascript_flow_use_global ale-javascript.txt /*g:ale_javascript_flow_use_global* +g:ale_javascript_flow_use_home_config ale-javascript.txt /*g:ale_javascript_flow_use_home_config* +g:ale_javascript_flow_use_respect_pragma ale-javascript.txt /*g:ale_javascript_flow_use_respect_pragma* +g:ale_javascript_importjs_executable ale-javascript.txt /*g:ale_javascript_importjs_executable* +g:ale_javascript_jscs_executable ale-javascript.txt /*g:ale_javascript_jscs_executable* +g:ale_javascript_jscs_use_global ale-javascript.txt /*g:ale_javascript_jscs_use_global* +g:ale_javascript_jshint_executable ale-javascript.txt /*g:ale_javascript_jshint_executable* +g:ale_javascript_jshint_use_global ale-javascript.txt /*g:ale_javascript_jshint_use_global* +g:ale_javascript_prettier_eslint_executable ale-javascript.txt /*g:ale_javascript_prettier_eslint_executable* +g:ale_javascript_prettier_eslint_options ale-javascript.txt /*g:ale_javascript_prettier_eslint_options* +g:ale_javascript_prettier_eslint_use_global ale-javascript.txt /*g:ale_javascript_prettier_eslint_use_global* +g:ale_javascript_prettier_executable ale-javascript.txt /*g:ale_javascript_prettier_executable* +g:ale_javascript_prettier_options ale-javascript.txt /*g:ale_javascript_prettier_options* +g:ale_javascript_prettier_standard_executable ale-javascript.txt /*g:ale_javascript_prettier_standard_executable* +g:ale_javascript_prettier_standard_options ale-javascript.txt /*g:ale_javascript_prettier_standard_options* +g:ale_javascript_prettier_standard_use_global ale-javascript.txt /*g:ale_javascript_prettier_standard_use_global* +g:ale_javascript_prettier_use_global ale-javascript.txt /*g:ale_javascript_prettier_use_global* +g:ale_javascript_standard_executable ale-javascript.txt /*g:ale_javascript_standard_executable* +g:ale_javascript_standard_options ale-javascript.txt /*g:ale_javascript_standard_options* +g:ale_javascript_standard_use_global ale-javascript.txt /*g:ale_javascript_standard_use_global* +g:ale_javascript_xo_executable ale-javascript.txt /*g:ale_javascript_xo_executable* +g:ale_javascript_xo_options ale-javascript.txt /*g:ale_javascript_xo_options* +g:ale_javascript_xo_use_global ale-javascript.txt /*g:ale_javascript_xo_use_global* +g:ale_json_fixjson_executable ale-json.txt /*g:ale_json_fixjson_executable* +g:ale_json_fixjson_options ale-json.txt /*g:ale_json_fixjson_options* +g:ale_json_fixjson_use_global ale-json.txt /*g:ale_json_fixjson_use_global* +g:ale_json_jq_executable ale-json.txt /*g:ale_json_jq_executable* +g:ale_json_jq_filters ale-json.txt /*g:ale_json_jq_filters* +g:ale_json_jq_options ale-json.txt /*g:ale_json_jq_options* +g:ale_json_jsonlint_executable ale-json.txt /*g:ale_json_jsonlint_executable* +g:ale_json_jsonlint_use_global ale-json.txt /*g:ale_json_jsonlint_use_global* +g:ale_json_spectral_executable ale-json.txt /*g:ale_json_spectral_executable* +g:ale_json_spectral_use_global ale-json.txt /*g:ale_json_spectral_use_global* +g:ale_jsonnet_jsonnet_lint_executable ale-jsonnet.txt /*g:ale_jsonnet_jsonnet_lint_executable* +g:ale_jsonnet_jsonnet_lint_options ale-jsonnet.txt /*g:ale_jsonnet_jsonnet_lint_options* +g:ale_jsonnet_jsonnetfmt_executable ale-jsonnet.txt /*g:ale_jsonnet_jsonnetfmt_executable* +g:ale_jsonnet_jsonnetfmt_options ale-jsonnet.txt /*g:ale_jsonnet_jsonnetfmt_options* +g:ale_julia_executable ale-julia.txt /*g:ale_julia_executable* +g:ale_keep_list_window_open ale.txt /*g:ale_keep_list_window_open* +g:ale_kotlin_kotlinc_classpath ale-kotlin.txt /*g:ale_kotlin_kotlinc_classpath* +g:ale_kotlin_kotlinc_config_file ale-kotlin.txt /*g:ale_kotlin_kotlinc_config_file* +g:ale_kotlin_kotlinc_enable_config ale-kotlin.txt /*g:ale_kotlin_kotlinc_enable_config* +g:ale_kotlin_kotlinc_module_filename ale-kotlin.txt /*g:ale_kotlin_kotlinc_module_filename* +g:ale_kotlin_kotlinc_options ale-kotlin.txt /*g:ale_kotlin_kotlinc_options* +g:ale_kotlin_kotlinc_sourcepath ale-kotlin.txt /*g:ale_kotlin_kotlinc_sourcepath* +g:ale_kotlin_kotlinc_use_module_file ale-kotlin.txt /*g:ale_kotlin_kotlinc_use_module_file* +g:ale_kotlin_ktlint_executable ale-kotlin.txt /*g:ale_kotlin_ktlint_executable* +g:ale_kotlin_ktlint_options ale-kotlin.txt /*g:ale_kotlin_ktlint_options* +g:ale_kotlin_ktlint_rulesets ale-kotlin.txt /*g:ale_kotlin_ktlint_rulesets* +g:ale_kotlin_languageserver_executable ale-kotlin.txt /*g:ale_kotlin_languageserver_executable* +g:ale_lacheck_executable ale-tex.txt /*g:ale_lacheck_executable* +g:ale_languagetool_executable ale.txt /*g:ale_languagetool_executable* +g:ale_languagetool_options ale.txt /*g:ale_languagetool_options* +g:ale_less_lessc_executable ale-less.txt /*g:ale_less_lessc_executable* +g:ale_less_lessc_options ale-less.txt /*g:ale_less_lessc_options* +g:ale_less_lessc_use_global ale-less.txt /*g:ale_less_lessc_use_global* +g:ale_less_stylelint_executable ale-less.txt /*g:ale_less_stylelint_executable* +g:ale_less_stylelint_options ale-less.txt /*g:ale_less_stylelint_options* +g:ale_less_stylelint_use_global ale-less.txt /*g:ale_less_stylelint_use_global* +g:ale_lint_delay ale.txt /*g:ale_lint_delay* +g:ale_lint_on_enter ale.txt /*g:ale_lint_on_enter* +g:ale_lint_on_filetype_changed ale.txt /*g:ale_lint_on_filetype_changed* +g:ale_lint_on_insert_leave ale.txt /*g:ale_lint_on_insert_leave* +g:ale_lint_on_save ale.txt /*g:ale_lint_on_save* +g:ale_lint_on_text_changed ale.txt /*g:ale_lint_on_text_changed* +g:ale_linter_aliases ale.txt /*g:ale_linter_aliases* +g:ale_linters ale.txt /*g:ale_linters* +g:ale_linters_explicit ale.txt /*g:ale_linters_explicit* +g:ale_linters_ignore ale.txt /*g:ale_linters_ignore* +g:ale_list_vertical ale.txt /*g:ale_list_vertical* +g:ale_list_window_size ale.txt /*g:ale_list_window_size* +g:ale_llvm_llc_executable ale-llvm.txt /*g:ale_llvm_llc_executable* +g:ale_loclist_msg_format ale.txt /*g:ale_loclist_msg_format* +g:ale_lsp_show_message_format ale.txt /*g:ale_lsp_show_message_format* +g:ale_lsp_show_message_severity ale.txt /*g:ale_lsp_show_message_severity* +g:ale_lsp_suggestions ale.txt /*g:ale_lsp_suggestions* +g:ale_lua_lua_format_executable ale-lua.txt /*g:ale_lua_lua_format_executable* +g:ale_lua_lua_format_options ale-lua.txt /*g:ale_lua_lua_format_options* +g:ale_lua_luac_executable ale-lua.txt /*g:ale_lua_luac_executable* +g:ale_lua_luacheck_executable ale-lua.txt /*g:ale_lua_luacheck_executable* +g:ale_lua_luacheck_options ale-lua.txt /*g:ale_lua_luacheck_options* +g:ale_lua_luafmt_executable ale-lua.txt /*g:ale_lua_luafmt_executable* +g:ale_lua_luafmt_options ale-lua.txt /*g:ale_lua_luafmt_options* +g:ale_lua_selene_executable ale-lua.txt /*g:ale_lua_selene_executable* +g:ale_lua_selene_options ale-lua.txt /*g:ale_lua_selene_options* +g:ale_lua_stylua_executable ale-lua.txt /*g:ale_lua_stylua_executable* +g:ale_lua_stylua_options ale-lua.txt /*g:ale_lua_stylua_options* +g:ale_make_checkmake_config ale-make.txt /*g:ale_make_checkmake_config* +g:ale_markdown_markdownlint_executable ale-markdown.txt /*g:ale_markdown_markdownlint_executable* +g:ale_markdown_markdownlint_options ale-markdown.txt /*g:ale_markdown_markdownlint_options* +g:ale_markdown_mdl_executable ale-markdown.txt /*g:ale_markdown_mdl_executable* +g:ale_markdown_mdl_options ale-markdown.txt /*g:ale_markdown_mdl_options* +g:ale_markdown_pandoc_executable ale-markdown.txt /*g:ale_markdown_pandoc_executable* +g:ale_markdown_pandoc_options ale-markdown.txt /*g:ale_markdown_pandoc_options* +g:ale_markdown_remark_lint_executable ale-markdown.txt /*g:ale_markdown_remark_lint_executable* +g:ale_markdown_remark_lint_options ale-markdown.txt /*g:ale_markdown_remark_lint_options* +g:ale_markdown_remark_lint_use_global ale-markdown.txt /*g:ale_markdown_remark_lint_use_global* +g:ale_max_buffer_history_size ale.txt /*g:ale_max_buffer_history_size* +g:ale_max_signs ale.txt /*g:ale_max_signs* +g:ale_maximum_file_size ale.txt /*g:ale_maximum_file_size* +g:ale_mercury_mmc_executable ale-mercury.txt /*g:ale_mercury_mmc_executable* +g:ale_mercury_mmc_options ale-mercury.txt /*g:ale_mercury_mmc_options* +g:ale_nasm_nasm_executable ale-nasm.txt /*g:ale_nasm_nasm_executable* +g:ale_nasm_nasm_options ale-nasm.txt /*g:ale_nasm_nasm_options* +g:ale_nim_nimpretty_executable ale-nim.txt /*g:ale_nim_nimpretty_executable* +g:ale_nim_nimpretty_options ale-nim.txt /*g:ale_nim_nimpretty_options* +g:ale_nix_fix_check_executable ale-nix.txt /*g:ale_nix_fix_check_executable* +g:ale_nix_nixfmt_executable ale-nix.txt /*g:ale_nix_nixfmt_executable* +g:ale_nix_nixfmt_options ale-nix.txt /*g:ale_nix_nixfmt_options* +g:ale_nix_nixpkgsfmt_executable ale-nix.txt /*g:ale_nix_nixpkgsfmt_executable* +g:ale_nix_nixpkgsfmt_options ale-nix.txt /*g:ale_nix_nixpkgsfmt_options* +g:ale_nix_statix_check_executable ale-nix.txt /*g:ale_nix_statix_check_executable* +g:ale_nix_statix_check_options ale-nix.txt /*g:ale_nix_statix_check_options* +g:ale_nix_statix_fix_options ale-nix.txt /*g:ale_nix_statix_fix_options* +g:ale_objc_ccls_executable ale-objc.txt /*g:ale_objc_ccls_executable* +g:ale_objc_ccls_init_options ale-objc.txt /*g:ale_objc_ccls_init_options* +g:ale_objc_clang_options ale-objc.txt /*g:ale_objc_clang_options* +g:ale_objc_clangd_executable ale-objc.txt /*g:ale_objc_clangd_executable* +g:ale_objc_clangd_options ale-objc.txt /*g:ale_objc_clangd_options* +g:ale_objcpp_clang_options ale-objcpp.txt /*g:ale_objcpp_clang_options* +g:ale_objcpp_clangd_executable ale-objcpp.txt /*g:ale_objcpp_clangd_executable* +g:ale_objcpp_clangd_options ale-objcpp.txt /*g:ale_objcpp_clangd_options* +g:ale_ocaml_dune_executable ale-ocaml.txt /*g:ale_ocaml_dune_executable* +g:ale_ocaml_dune_options ale-ocaml.txt /*g:ale_ocaml_dune_options* +g:ale_ocaml_ocamlformat_executable ale-ocaml.txt /*g:ale_ocaml_ocamlformat_executable* +g:ale_ocaml_ocamlformat_options ale-ocaml.txt /*g:ale_ocaml_ocamlformat_options* +g:ale_ocaml_ocamllsp_use_opam ale-ocaml.txt /*g:ale_ocaml_ocamllsp_use_opam* +g:ale_ocaml_ocp_indent_config ale-ocaml.txt /*g:ale_ocaml_ocp_indent_config* +g:ale_ocaml_ocp_indent_executable ale-ocaml.txt /*g:ale_ocaml_ocp_indent_executable* +g:ale_ocaml_ocp_indent_options ale-ocaml.txt /*g:ale_ocaml_ocp_indent_options* +g:ale_ocaml_ols_executable ale-ocaml.txt /*g:ale_ocaml_ols_executable* +g:ale_ocaml_ols_use_global ale-ocaml.txt /*g:ale_ocaml_ols_use_global* +g:ale_opa_fmt_executable ale-rego.txt /*g:ale_opa_fmt_executable* +g:ale_opa_fmt_options ale-rego.txt /*g:ale_opa_fmt_options* +g:ale_open_list ale.txt /*g:ale_open_list* +g:ale_openapi_ibm_validator_executable ale-openapi.txt /*g:ale_openapi_ibm_validator_executable* +g:ale_openapi_ibm_validator_options ale-openapi.txt /*g:ale_openapi_ibm_validator_options* +g:ale_openscad_sca2d_executable ale-openscad.txt /*g:ale_openscad_sca2d_executable* +g:ale_openscad_sca2d_options ale-openscad.txt /*g:ale_openscad_sca2d_options* +g:ale_packer_fmt_executable ale-packer.txt /*g:ale_packer_fmt_executable* +g:ale_packer_fmt_options ale-packer.txt /*g:ale_packer_fmt_options* +g:ale_pascal_ptop_executable ale-pascal.txt /*g:ale_pascal_ptop_executable* +g:ale_pascal_ptop_options ale-pascal.txt /*g:ale_pascal_ptop_options* +g:ale_pattern_options ale.txt /*g:ale_pattern_options* +g:ale_pattern_options_enabled ale.txt /*g:ale_pattern_options_enabled* +g:ale_perl6_perl6_executable ale-perl6.txt /*g:ale_perl6_perl6_executable* +g:ale_perl6_perl6_options ale-perl6.txt /*g:ale_perl6_perl6_options* +g:ale_perl_perl_executable ale-perl.txt /*g:ale_perl_perl_executable* +g:ale_perl_perl_options ale-perl.txt /*g:ale_perl_perl_options* +g:ale_perl_perlcritic_executable ale-perl.txt /*g:ale_perl_perlcritic_executable* +g:ale_perl_perlcritic_options ale-perl.txt /*g:ale_perl_perlcritic_options* +g:ale_perl_perlcritic_profile ale-perl.txt /*g:ale_perl_perlcritic_profile* +g:ale_perl_perlcritic_showrules ale-perl.txt /*g:ale_perl_perlcritic_showrules* +g:ale_perl_perltidy_options ale-perl.txt /*g:ale_perl_perltidy_options* +g:ale_php_cs_fixer_executable ale-php.txt /*g:ale_php_cs_fixer_executable* +g:ale_php_cs_fixer_options ale-php.txt /*g:ale_php_cs_fixer_options* +g:ale_php_cs_fixer_use_global ale-php.txt /*g:ale_php_cs_fixer_use_global* +g:ale_php_intelephense_config ale-php.txt /*g:ale_php_intelephense_config* +g:ale_php_intelephense_executable ale-php.txt /*g:ale_php_intelephense_executable* +g:ale_php_intelephense_use_global ale-php.txt /*g:ale_php_intelephense_use_global* +g:ale_php_langserver_executable ale-php.txt /*g:ale_php_langserver_executable* +g:ale_php_langserver_use_global ale-php.txt /*g:ale_php_langserver_use_global* +g:ale_php_phan_executable ale-php.txt /*g:ale_php_phan_executable* +g:ale_php_phan_minimum_severity ale-php.txt /*g:ale_php_phan_minimum_severity* +g:ale_php_phan_use_client ale-php.txt /*g:ale_php_phan_use_client* +g:ale_php_php_executable ale-php.txt /*g:ale_php_php_executable* +g:ale_php_phpcbf_executable ale-php.txt /*g:ale_php_phpcbf_executable* +g:ale_php_phpcbf_options ale-php.txt /*g:ale_php_phpcbf_options* +g:ale_php_phpcbf_standard ale-php.txt /*g:ale_php_phpcbf_standard* +g:ale_php_phpcbf_use_global ale-php.txt /*g:ale_php_phpcbf_use_global* +g:ale_php_phpcs_executable ale-php.txt /*g:ale_php_phpcs_executable* +g:ale_php_phpcs_options ale-php.txt /*g:ale_php_phpcs_options* +g:ale_php_phpcs_standard ale-php.txt /*g:ale_php_phpcs_standard* +g:ale_php_phpcs_use_global ale-php.txt /*g:ale_php_phpcs_use_global* +g:ale_php_phpmd_executable ale-php.txt /*g:ale_php_phpmd_executable* +g:ale_php_phpmd_ruleset ale-php.txt /*g:ale_php_phpmd_ruleset* +g:ale_php_phpstan_autoload ale-php.txt /*g:ale_php_phpstan_autoload* +g:ale_php_phpstan_configuration ale-php.txt /*g:ale_php_phpstan_configuration* +g:ale_php_phpstan_executable ale-php.txt /*g:ale_php_phpstan_executable* +g:ale_php_phpstan_level ale-php.txt /*g:ale_php_phpstan_level* +g:ale_php_phpstan_memory-limit ale-php.txt /*g:ale_php_phpstan_memory-limit* +g:ale_php_pint_executable ale-php.txt /*g:ale_php_pint_executable* +g:ale_php_pint_options ale-php.txt /*g:ale_php_pint_options* +g:ale_php_pint_use_global ale-php.txt /*g:ale_php_pint_use_global* +g:ale_php_psalm_executable ale-php.txt /*g:ale_php_psalm_executable* +g:ale_php_psalm_options ale-php.txt /*g:ale_php_psalm_options* +g:ale_php_psalm_use_global ale-php.txt /*g:ale_php_psalm_use_global* +g:ale_php_tlint_executable ale-php.txt /*g:ale_php_tlint_executable* +g:ale_php_tlint_options ale-php.txt /*g:ale_php_tlint_options* +g:ale_php_tlint_use_global ale-php.txt /*g:ale_php_tlint_use_global* +g:ale_pony_ponyc_executable ale-pony.txt /*g:ale_pony_ponyc_executable* +g:ale_pony_ponyc_options ale-pony.txt /*g:ale_pony_ponyc_options* +g:ale_popup_menu_enabled ale.txt /*g:ale_popup_menu_enabled* +g:ale_powershell_powershell_executable ale-powershell.txt /*g:ale_powershell_powershell_executable* +g:ale_powershell_psscriptanalyzer_exclusions ale-powershell.txt /*g:ale_powershell_psscriptanalyzer_exclusions* +g:ale_powershell_psscriptanalyzer_executable ale-powershell.txt /*g:ale_powershell_psscriptanalyzer_executable* +g:ale_powershell_psscriptanalyzer_module ale-powershell.txt /*g:ale_powershell_psscriptanalyzer_module* +g:ale_prolog_swipl_alarm ale-prolog.txt /*g:ale_prolog_swipl_alarm* +g:ale_prolog_swipl_alarm_handler ale-prolog.txt /*g:ale_prolog_swipl_alarm_handler* +g:ale_prolog_swipl_executable ale-prolog.txt /*g:ale_prolog_swipl_executable* +g:ale_prolog_swipl_load ale-prolog.txt /*g:ale_prolog_swipl_load* +g:ale_prolog_swipl_timeout ale-prolog.txt /*g:ale_prolog_swipl_timeout* +g:ale_proto_buf_format_executable ale-proto.txt /*g:ale_proto_buf_format_executable* +g:ale_proto_buf_lint_config ale-proto.txt /*g:ale_proto_buf_lint_config* +g:ale_proto_buf_lint_executable ale-proto.txt /*g:ale_proto_buf_lint_executable* +g:ale_proto_protoc_gen_lint_options ale-proto.txt /*g:ale_proto_protoc_gen_lint_options* +g:ale_proto_protolint_config ale-proto.txt /*g:ale_proto_protolint_config* +g:ale_proto_protolint_executable ale-proto.txt /*g:ale_proto_protolint_executable* +g:ale_pug_puglint_executable ale-pug.txt /*g:ale_pug_puglint_executable* +g:ale_pug_puglint_options ale-pug.txt /*g:ale_pug_puglint_options* +g:ale_pug_puglint_use_global ale-pug.txt /*g:ale_pug_puglint_use_global* +g:ale_puppet_languageserver_executable ale-puppet.txt /*g:ale_puppet_languageserver_executable* +g:ale_puppet_puppet_executable ale-puppet.txt /*g:ale_puppet_puppet_executable* +g:ale_puppet_puppet_options ale-puppet.txt /*g:ale_puppet_puppet_options* +g:ale_puppet_puppetlint_executable ale-puppet.txt /*g:ale_puppet_puppetlint_executable* +g:ale_puppet_puppetlint_options ale-puppet.txt /*g:ale_puppet_puppetlint_options* +g:ale_purescript_purty_executable ale-purescript.txt /*g:ale_purescript_purty_executable* +g:ale_purescript_tidy_executable ale-purescript.txt /*g:ale_purescript_tidy_executable* +g:ale_purescript_tidy_options ale-purescript.txt /*g:ale_purescript_tidy_options* +g:ale_purescript_tidy_use_global ale-purescript.txt /*g:ale_purescript_tidy_use_global* +g:ale_pyrex_cython_executable ale-pyrex.txt /*g:ale_pyrex_cython_executable* +g:ale_pyrex_cython_options ale-pyrex.txt /*g:ale_pyrex_cython_options* +g:ale_python_auto_pipenv ale-python.txt /*g:ale_python_auto_pipenv* +g:ale_python_auto_poetry ale-python.txt /*g:ale_python_auto_poetry* +g:ale_python_autoflake_executable ale-python.txt /*g:ale_python_autoflake_executable* +g:ale_python_autoflake_options ale-python.txt /*g:ale_python_autoflake_options* +g:ale_python_autoflake_use_global ale-python.txt /*g:ale_python_autoflake_use_global* +g:ale_python_autoimport_executable ale-python.txt /*g:ale_python_autoimport_executable* +g:ale_python_autoimport_options ale-python.txt /*g:ale_python_autoimport_options* +g:ale_python_autoimport_use_global ale-python.txt /*g:ale_python_autoimport_use_global* +g:ale_python_autopep8_executable ale-python.txt /*g:ale_python_autopep8_executable* +g:ale_python_autopep8_options ale-python.txt /*g:ale_python_autopep8_options* +g:ale_python_autopep8_use_global ale-python.txt /*g:ale_python_autopep8_use_global* +g:ale_python_bandit_auto_pipenv ale-python.txt /*g:ale_python_bandit_auto_pipenv* +g:ale_python_bandit_auto_poetry ale-python.txt /*g:ale_python_bandit_auto_poetry* +g:ale_python_bandit_executable ale-python.txt /*g:ale_python_bandit_executable* +g:ale_python_bandit_options ale-python.txt /*g:ale_python_bandit_options* +g:ale_python_bandit_use_config ale-python.txt /*g:ale_python_bandit_use_config* +g:ale_python_bandit_use_global ale-python.txt /*g:ale_python_bandit_use_global* +g:ale_python_black_auto_pipenv ale-python.txt /*g:ale_python_black_auto_pipenv* +g:ale_python_black_auto_poetry ale-python.txt /*g:ale_python_black_auto_poetry* +g:ale_python_black_change_directory ale-python.txt /*g:ale_python_black_change_directory* +g:ale_python_black_executable ale-python.txt /*g:ale_python_black_executable* +g:ale_python_black_options ale-python.txt /*g:ale_python_black_options* +g:ale_python_black_use_global ale-python.txt /*g:ale_python_black_use_global* +g:ale_python_flake8_auto_pipenv ale-python.txt /*g:ale_python_flake8_auto_pipenv* +g:ale_python_flake8_auto_poetry ale-python.txt /*g:ale_python_flake8_auto_poetry* +g:ale_python_flake8_change_directory ale-python.txt /*g:ale_python_flake8_change_directory* +g:ale_python_flake8_executable ale-python.txt /*g:ale_python_flake8_executable* +g:ale_python_flake8_options ale-python.txt /*g:ale_python_flake8_options* +g:ale_python_flake8_use_global ale-python.txt /*g:ale_python_flake8_use_global* +g:ale_python_flakehell_auto_pipenv ale-python.txt /*g:ale_python_flakehell_auto_pipenv* +g:ale_python_flakehell_auto_poetry ale-python.txt /*g:ale_python_flakehell_auto_poetry* +g:ale_python_flakehell_executable ale-python.txt /*g:ale_python_flakehell_executable* +g:ale_python_flakehell_options ale-python.txt /*g:ale_python_flakehell_options* +g:ale_python_flakehell_use_global ale-python.txt /*g:ale_python_flakehell_use_global* +g:ale_python_isort_auto_pipenv ale-python.txt /*g:ale_python_isort_auto_pipenv* +g:ale_python_isort_auto_poetry ale-python.txt /*g:ale_python_isort_auto_poetry* +g:ale_python_isort_executable ale-python.txt /*g:ale_python_isort_executable* +g:ale_python_isort_options ale-python.txt /*g:ale_python_isort_options* +g:ale_python_isort_use_global ale-python.txt /*g:ale_python_isort_use_global* +g:ale_python_mypy_auto_pipenv ale-python.txt /*g:ale_python_mypy_auto_pipenv* +g:ale_python_mypy_auto_poetry ale-python.txt /*g:ale_python_mypy_auto_poetry* +g:ale_python_mypy_executable ale-python.txt /*g:ale_python_mypy_executable* +g:ale_python_mypy_ignore_invalid_syntax ale-python.txt /*g:ale_python_mypy_ignore_invalid_syntax* +g:ale_python_mypy_options ale-python.txt /*g:ale_python_mypy_options* +g:ale_python_mypy_show_notes ale-python.txt /*g:ale_python_mypy_show_notes* +g:ale_python_mypy_use_global ale-python.txt /*g:ale_python_mypy_use_global* +g:ale_python_prospector_auto_pipenv ale-python.txt /*g:ale_python_prospector_auto_pipenv* +g:ale_python_prospector_auto_poetry ale-python.txt /*g:ale_python_prospector_auto_poetry* +g:ale_python_prospector_executable ale-python.txt /*g:ale_python_prospector_executable* +g:ale_python_prospector_options ale-python.txt /*g:ale_python_prospector_options* +g:ale_python_prospector_use_global ale-python.txt /*g:ale_python_prospector_use_global* +g:ale_python_pycodestyle_auto_pipenv ale-python.txt /*g:ale_python_pycodestyle_auto_pipenv* +g:ale_python_pycodestyle_auto_poetry ale-python.txt /*g:ale_python_pycodestyle_auto_poetry* +g:ale_python_pycodestyle_executable ale-python.txt /*g:ale_python_pycodestyle_executable* +g:ale_python_pycodestyle_options ale-python.txt /*g:ale_python_pycodestyle_options* +g:ale_python_pycodestyle_use_global ale-python.txt /*g:ale_python_pycodestyle_use_global* +g:ale_python_pydocstyle_auto_pipenv ale-python.txt /*g:ale_python_pydocstyle_auto_pipenv* +g:ale_python_pydocstyle_auto_poetry ale-python.txt /*g:ale_python_pydocstyle_auto_poetry* +g:ale_python_pydocstyle_executable ale-python.txt /*g:ale_python_pydocstyle_executable* +g:ale_python_pydocstyle_options ale-python.txt /*g:ale_python_pydocstyle_options* +g:ale_python_pydocstyle_use_global ale-python.txt /*g:ale_python_pydocstyle_use_global* +g:ale_python_pyflakes_auto_pipenv ale-python.txt /*g:ale_python_pyflakes_auto_pipenv* +g:ale_python_pyflakes_auto_poetry ale-python.txt /*g:ale_python_pyflakes_auto_poetry* +g:ale_python_pyflakes_executable ale-python.txt /*g:ale_python_pyflakes_executable* +g:ale_python_pyflyby_auto_pipenv ale-python.txt /*g:ale_python_pyflyby_auto_pipenv* +g:ale_python_pyflyby_auto_poetry ale-python.txt /*g:ale_python_pyflyby_auto_poetry* +g:ale_python_pyflyby_executable ale-python.txt /*g:ale_python_pyflyby_executable* +g:ale_python_pyflyby_options ale-python.txt /*g:ale_python_pyflyby_options* +g:ale_python_pyflyby_use_global ale-python.txt /*g:ale_python_pyflyby_use_global* +g:ale_python_pylama_auto_pipenv ale-python.txt /*g:ale_python_pylama_auto_pipenv* +g:ale_python_pylama_auto_poetry ale-python.txt /*g:ale_python_pylama_auto_poetry* +g:ale_python_pylama_change_directory ale-python.txt /*g:ale_python_pylama_change_directory* +g:ale_python_pylama_executable ale-python.txt /*g:ale_python_pylama_executable* +g:ale_python_pylama_options ale-python.txt /*g:ale_python_pylama_options* +g:ale_python_pylama_use_global ale-python.txt /*g:ale_python_pylama_use_global* +g:ale_python_pylint_auto_pipenv ale-python.txt /*g:ale_python_pylint_auto_pipenv* +g:ale_python_pylint_auto_poetry ale-python.txt /*g:ale_python_pylint_auto_poetry* +g:ale_python_pylint_change_directory ale-python.txt /*g:ale_python_pylint_change_directory* +g:ale_python_pylint_executable ale-python.txt /*g:ale_python_pylint_executable* +g:ale_python_pylint_options ale-python.txt /*g:ale_python_pylint_options* +g:ale_python_pylint_use_global ale-python.txt /*g:ale_python_pylint_use_global* +g:ale_python_pylint_use_msg_id ale-python.txt /*g:ale_python_pylint_use_msg_id* +g:ale_python_pylsp_auto_pipenv ale-python.txt /*g:ale_python_pylsp_auto_pipenv* +g:ale_python_pylsp_auto_poetry ale-python.txt /*g:ale_python_pylsp_auto_poetry* +g:ale_python_pylsp_config ale-python.txt /*g:ale_python_pylsp_config* +g:ale_python_pylsp_executable ale-python.txt /*g:ale_python_pylsp_executable* +g:ale_python_pylsp_options ale-python.txt /*g:ale_python_pylsp_options* +g:ale_python_pylsp_use_global ale-python.txt /*g:ale_python_pylsp_use_global* +g:ale_python_pyre_auto_pipenv ale-python.txt /*g:ale_python_pyre_auto_pipenv* +g:ale_python_pyre_auto_poetry ale-python.txt /*g:ale_python_pyre_auto_poetry* +g:ale_python_pyre_executable ale-python.txt /*g:ale_python_pyre_executable* +g:ale_python_pyre_use_global ale-python.txt /*g:ale_python_pyre_use_global* +g:ale_python_pyright_config ale-python.txt /*g:ale_python_pyright_config* +g:ale_python_pyright_executable ale-python.txt /*g:ale_python_pyright_executable* +g:ale_python_refurb_auto_pipenv ale-python.txt /*g:ale_python_refurb_auto_pipenv* +g:ale_python_refurb_auto_poetry ale-python.txt /*g:ale_python_refurb_auto_poetry* +g:ale_python_refurb_change_directory ale-python.txt /*g:ale_python_refurb_change_directory* +g:ale_python_refurb_executable ale-python.txt /*g:ale_python_refurb_executable* +g:ale_python_refurb_options ale-python.txt /*g:ale_python_refurb_options* +g:ale_python_refurb_use_global ale-python.txt /*g:ale_python_refurb_use_global* +g:ale_python_reorder_python_imports_executable ale-python.txt /*g:ale_python_reorder_python_imports_executable* +g:ale_python_reorder_python_imports_options ale-python.txt /*g:ale_python_reorder_python_imports_options* +g:ale_python_reorder_python_imports_use_global ale-python.txt /*g:ale_python_reorder_python_imports_use_global* +g:ale_python_ruff_auto_pipenv ale-python.txt /*g:ale_python_ruff_auto_pipenv* +g:ale_python_ruff_auto_poetry ale-python.txt /*g:ale_python_ruff_auto_poetry* +g:ale_python_ruff_change_directory ale-python.txt /*g:ale_python_ruff_change_directory* +g:ale_python_ruff_executable ale-python.txt /*g:ale_python_ruff_executable* +g:ale_python_ruff_options ale-python.txt /*g:ale_python_ruff_options* +g:ale_python_ruff_use_global ale-python.txt /*g:ale_python_ruff_use_global* +g:ale_python_unimport_auto_pipenv ale-python.txt /*g:ale_python_unimport_auto_pipenv* +g:ale_python_unimport_auto_poetry ale-python.txt /*g:ale_python_unimport_auto_poetry* +g:ale_python_unimport_executable ale-python.txt /*g:ale_python_unimport_executable* +g:ale_python_unimport_options ale-python.txt /*g:ale_python_unimport_options* +g:ale_python_unimport_use_global ale-python.txt /*g:ale_python_unimport_use_global* +g:ale_python_vulture_change_directory ale-python.txt /*g:ale_python_vulture_change_directory* +g:ale_python_vulture_executable ale-python.txt /*g:ale_python_vulture_executable* +g:ale_python_vulture_options ale-python.txt /*g:ale_python_vulture_options* +g:ale_python_vulture_use_global ale-python.txt /*g:ale_python_vulture_use_global* +g:ale_python_yapf_executable ale-python.txt /*g:ale_python_yapf_executable* +g:ale_python_yapf_use_global ale-python.txt /*g:ale_python_yapf_use_global* +g:ale_qml_qmlfmt_executable ale-qml.txt /*g:ale_qml_qmlfmt_executable* +g:ale_r_languageserver_cmd ale-r.txt /*g:ale_r_languageserver_cmd* +g:ale_r_languageserver_config ale-r.txt /*g:ale_r_languageserver_config* +g:ale_r_lintr_lint_package ale-r.txt /*g:ale_r_lintr_lint_package* +g:ale_r_lintr_options ale-r.txt /*g:ale_r_lintr_options* +g:ale_r_styler_options ale-r.txt /*g:ale_r_styler_options* +g:ale_racket_raco_fmt_executable ale-racket.txt /*g:ale_racket_raco_fmt_executable* +g:ale_racket_raco_fmt_options ale-racket.txt /*g:ale_racket_raco_fmt_options* +g:ale_reason_ls_executable ale-reasonml.txt /*g:ale_reason_ls_executable* +g:ale_reason_ols_executable ale-reasonml.txt /*g:ale_reason_ols_executable* +g:ale_reason_ols_use_global ale-reasonml.txt /*g:ale_reason_ols_use_global* +g:ale_reasonml_refmt_executable ale-reasonml.txt /*g:ale_reasonml_refmt_executable* +g:ale_reasonml_refmt_options ale-reasonml.txt /*g:ale_reasonml_refmt_options* +g:ale_rename_tsserver_find_in_comments ale.txt /*g:ale_rename_tsserver_find_in_comments* +g:ale_rename_tsserver_find_in_strings ale.txt /*g:ale_rename_tsserver_find_in_strings* +g:ale_robot_rflint_executable ale-robot.txt /*g:ale_robot_rflint_executable* +g:ale_root ale.txt /*g:ale_root* +g:ale_ruby_brakeman_executable ale-ruby.txt /*g:ale_ruby_brakeman_executable* +g:ale_ruby_brakeman_options ale-ruby.txt /*g:ale_ruby_brakeman_options* +g:ale_ruby_debride_executable ale-ruby.txt /*g:ale_ruby_debride_executable* +g:ale_ruby_debride_options ale-ruby.txt /*g:ale_ruby_debride_options* +g:ale_ruby_erblint_options ale-eruby.txt /*g:ale_ruby_erblint_options* +g:ale_ruby_rails_best_practices_executable ale-ruby.txt /*g:ale_ruby_rails_best_practices_executable* +g:ale_ruby_rails_best_practices_options ale-ruby.txt /*g:ale_ruby_rails_best_practices_options* +g:ale_ruby_reek_executable ale-ruby.txt /*g:ale_ruby_reek_executable* +g:ale_ruby_reek_show_context ale-ruby.txt /*g:ale_ruby_reek_show_context* +g:ale_ruby_reek_show_wiki_link ale-ruby.txt /*g:ale_ruby_reek_show_wiki_link* +g:ale_ruby_rubocop_auto_correct_all ale-ruby.txt /*g:ale_ruby_rubocop_auto_correct_all* +g:ale_ruby_rubocop_executable ale-ruby.txt /*g:ale_ruby_rubocop_executable* +g:ale_ruby_rubocop_options ale-ruby.txt /*g:ale_ruby_rubocop_options* +g:ale_ruby_ruby_executable ale-ruby.txt /*g:ale_ruby_ruby_executable* +g:ale_ruby_rufo_executable ale-ruby.txt /*g:ale_ruby_rufo_executable* +g:ale_ruby_ruumba_options ale-eruby.txt /*g:ale_ruby_ruumba_options* +g:ale_ruby_solargraph_executable ale-ruby.txt /*g:ale_ruby_solargraph_executable* +g:ale_ruby_sorbet_enable_watchman ale-ruby.txt /*g:ale_ruby_sorbet_enable_watchman* +g:ale_ruby_sorbet_executable ale-ruby.txt /*g:ale_ruby_sorbet_executable* +g:ale_ruby_sorbet_options ale-ruby.txt /*g:ale_ruby_sorbet_options* +g:ale_ruby_standardrb_executable ale-ruby.txt /*g:ale_ruby_standardrb_executable* +g:ale_ruby_standardrb_options ale-ruby.txt /*g:ale_ruby_standardrb_options* +g:ale_ruby_syntax_tree_executable ale-ruby.txt /*g:ale_ruby_syntax_tree_executable* +g:ale_ruby_syntax_tree_options ale-ruby.txt /*g:ale_ruby_syntax_tree_options* +g:ale_rust_analyzer_config ale-rust.txt /*g:ale_rust_analyzer_config* +g:ale_rust_analyzer_executable ale-rust.txt /*g:ale_rust_analyzer_executable* +g:ale_rust_cargo_avoid_whole_workspace ale-rust.txt /*g:ale_rust_cargo_avoid_whole_workspace* +g:ale_rust_cargo_check_all_targets ale-rust.txt /*g:ale_rust_cargo_check_all_targets* +g:ale_rust_cargo_check_examples ale-rust.txt /*g:ale_rust_cargo_check_examples* +g:ale_rust_cargo_check_tests ale-rust.txt /*g:ale_rust_cargo_check_tests* +g:ale_rust_cargo_clippy_options ale-rust.txt /*g:ale_rust_cargo_clippy_options* +g:ale_rust_cargo_default_feature_behavior ale-rust.txt /*g:ale_rust_cargo_default_feature_behavior* +g:ale_rust_cargo_include_features ale-rust.txt /*g:ale_rust_cargo_include_features* +g:ale_rust_cargo_target_dir ale-rust.txt /*g:ale_rust_cargo_target_dir* +g:ale_rust_cargo_use_check ale-rust.txt /*g:ale_rust_cargo_use_check* +g:ale_rust_cargo_use_clippy ale-rust.txt /*g:ale_rust_cargo_use_clippy* +g:ale_rust_ignore_error_codes ale-rust.txt /*g:ale_rust_ignore_error_codes* +g:ale_rust_ignore_secondary_spans ale-rust.txt /*g:ale_rust_ignore_secondary_spans* +g:ale_rust_rls_config ale-rust.txt /*g:ale_rust_rls_config* +g:ale_rust_rls_executable ale-rust.txt /*g:ale_rust_rls_executable* +g:ale_rust_rls_toolchain ale-rust.txt /*g:ale_rust_rls_toolchain* +g:ale_rust_rustc_options ale-rust.txt /*g:ale_rust_rustc_options* +g:ale_rust_rustfmt_executable ale-rust.txt /*g:ale_rust_rustfmt_executable* +g:ale_rust_rustfmt_options ale-rust.txt /*g:ale_rust_rustfmt_options* +g:ale_sass_stylelint_executable ale-sass.txt /*g:ale_sass_stylelint_executable* +g:ale_sass_stylelint_use_global ale-sass.txt /*g:ale_sass_stylelint_use_global* +g:ale_scala_metals_executable ale-scala.txt /*g:ale_scala_metals_executable* +g:ale_scala_metals_project_root ale-scala.txt /*g:ale_scala_metals_project_root* +g:ale_scala_sbtserver_address ale-scala.txt /*g:ale_scala_sbtserver_address* +g:ale_scala_sbtserver_project_root ale-scala.txt /*g:ale_scala_sbtserver_project_root* +g:ale_scala_scalafmt_executable ale-scala.txt /*g:ale_scala_scalafmt_executable* +g:ale_scala_scalafmt_options ale-scala.txt /*g:ale_scala_scalafmt_options* +g:ale_scala_scalastyle_config ale-scala.txt /*g:ale_scala_scalastyle_config* +g:ale_scala_scalastyle_options ale-scala.txt /*g:ale_scala_scalastyle_options* +g:ale_scss_sasslint_executable ale-scss.txt /*g:ale_scss_sasslint_executable* +g:ale_scss_sasslint_options ale-scss.txt /*g:ale_scss_sasslint_options* +g:ale_scss_sasslint_use_global ale-scss.txt /*g:ale_scss_sasslint_use_global* +g:ale_scss_stylelint_executable ale-scss.txt /*g:ale_scss_stylelint_executable* +g:ale_scss_stylelint_options ale-scss.txt /*g:ale_scss_stylelint_options* +g:ale_scss_stylelint_use_global ale-scss.txt /*g:ale_scss_stylelint_use_global* +g:ale_set_balloons ale.txt /*g:ale_set_balloons* +g:ale_set_balloons_legacy_echo ale.txt /*g:ale_set_balloons_legacy_echo* +g:ale_set_highlights ale.txt /*g:ale_set_highlights* +g:ale_set_loclist ale.txt /*g:ale_set_loclist* +g:ale_set_quickfix ale.txt /*g:ale_set_quickfix* +g:ale_set_signs ale.txt /*g:ale_set_signs* +g:ale_sh_bashate_executable ale-sh.txt /*g:ale_sh_bashate_executable* +g:ale_sh_bashate_options ale-sh.txt /*g:ale_sh_bashate_options* +g:ale_sh_language_server_executable ale-sh.txt /*g:ale_sh_language_server_executable* +g:ale_sh_language_server_use_global ale-sh.txt /*g:ale_sh_language_server_use_global* +g:ale_sh_shell_default_shell ale-sh.txt /*g:ale_sh_shell_default_shell* +g:ale_sh_shellcheck_change_directory ale-sh.txt /*g:ale_sh_shellcheck_change_directory* +g:ale_sh_shellcheck_dialect ale-sh.txt /*g:ale_sh_shellcheck_dialect* +g:ale_sh_shellcheck_exclusions ale-sh.txt /*g:ale_sh_shellcheck_exclusions* +g:ale_sh_shellcheck_executable ale-sh.txt /*g:ale_sh_shellcheck_executable* +g:ale_sh_shellcheck_options ale-sh.txt /*g:ale_sh_shellcheck_options* +g:ale_sh_shfmt_options ale-sh.txt /*g:ale_sh_shfmt_options* +g:ale_shell ale.txt /*g:ale_shell* +g:ale_shell_arguments ale.txt /*g:ale_shell_arguments* +g:ale_sign_column_always ale.txt /*g:ale_sign_column_always* +g:ale_sign_error ale.txt /*g:ale_sign_error* +g:ale_sign_highlight_linenrs ale.txt /*g:ale_sign_highlight_linenrs* +g:ale_sign_info ale.txt /*g:ale_sign_info* +g:ale_sign_offset ale.txt /*g:ale_sign_offset* +g:ale_sign_priority ale.txt /*g:ale_sign_priority* +g:ale_sign_style_error ale.txt /*g:ale_sign_style_error* +g:ale_sign_style_warning ale.txt /*g:ale_sign_style_warning* +g:ale_sign_warning ale.txt /*g:ale_sign_warning* +g:ale_sml_smlnj_cm_file ale-sml.txt /*g:ale_sml_smlnj_cm_file* +g:ale_solidity_solc_executable ale-solidity.txt /*g:ale_solidity_solc_executable* +g:ale_solidity_solc_options ale-solidity.txt /*g:ale_solidity_solc_options* +g:ale_sourcekit_lsp_executable ale-swift.txt /*g:ale_sourcekit_lsp_executable* +g:ale_spec_rpmlint_executable ale-spec.txt /*g:ale_spec_rpmlint_executable* +g:ale_spec_rpmlint_options ale-spec.txt /*g:ale_spec_rpmlint_options* +g:ale_sql_pgformatter_executable ale-sql.txt /*g:ale_sql_pgformatter_executable* +g:ale_sql_pgformatter_options ale-sql.txt /*g:ale_sql_pgformatter_options* +g:ale_sql_sqlfluff_executable ale-sql.txt /*g:ale_sql_sqlfluff_executable* +g:ale_sql_sqlfluff_options ale-sql.txt /*g:ale_sql_sqlfluff_options* +g:ale_sql_sqlfmt_executable ale-sql.txt /*g:ale_sql_sqlfmt_executable* +g:ale_sql_sqlfmt_options ale-sql.txt /*g:ale_sql_sqlfmt_options* +g:ale_sql_sqlformat_executable ale-sql.txt /*g:ale_sql_sqlformat_executable* +g:ale_sql_sqlformat_options ale-sql.txt /*g:ale_sql_sqlformat_options* +g:ale_stylus_stylelint_executable ale-stylus.txt /*g:ale_stylus_stylelint_executable* +g:ale_stylus_stylelint_options ale-stylus.txt /*g:ale_stylus_stylelint_options* +g:ale_stylus_stylelint_use_global ale-stylus.txt /*g:ale_stylus_stylelint_use_global* +g:ale_sugarss_stylelint_executable ale-sugarss.txt /*g:ale_sugarss_stylelint_executable* +g:ale_sugarss_stylelint_options ale-sugarss.txt /*g:ale_sugarss_stylelint_options* +g:ale_sugarss_stylelint_use_global ale-sugarss.txt /*g:ale_sugarss_stylelint_use_global* +g:ale_svelte_svelteserver_executable ale-svelte.txt /*g:ale_svelte_svelteserver_executable* +g:ale_svelte_svelteserver_use_global ale-svelte.txt /*g:ale_svelte_svelteserver_use_global* +g:ale_swift_appleswiftformat_executable ale-swift.txt /*g:ale_swift_appleswiftformat_executable* +g:ale_swift_appleswiftformat_use_swiftpm ale-swift.txt /*g:ale_swift_appleswiftformat_use_swiftpm* +g:ale_tcl_nagelfar_executable ale-tcl.txt /*g:ale_tcl_nagelfar_executable* +g:ale_tcl_nagelfar_options ale-tcl.txt /*g:ale_tcl_nagelfar_options* +g:ale_terraform_checkov_executable ale-terraform.txt /*g:ale_terraform_checkov_executable* +g:ale_terraform_checkov_options ale-terraform.txt /*g:ale_terraform_checkov_options* +g:ale_terraform_fmt_executable ale-terraform.txt /*g:ale_terraform_fmt_executable* +g:ale_terraform_fmt_options ale-terraform.txt /*g:ale_terraform_fmt_options* +g:ale_terraform_langserver_executable ale-terraform.txt /*g:ale_terraform_langserver_executable* +g:ale_terraform_langserver_options ale-terraform.txt /*g:ale_terraform_langserver_options* +g:ale_terraform_ls_executable ale-terraform.txt /*g:ale_terraform_ls_executable* +g:ale_terraform_ls_options ale-terraform.txt /*g:ale_terraform_ls_options* +g:ale_terraform_terraform_executable ale-terraform.txt /*g:ale_terraform_terraform_executable* +g:ale_terraform_tflint_executable ale-terraform.txt /*g:ale_terraform_tflint_executable* +g:ale_terraform_tflint_options ale-terraform.txt /*g:ale_terraform_tflint_options* +g:ale_terraform_tfsec_executable ale-terraform.txt /*g:ale_terraform_tfsec_executable* +g:ale_terraform_tfsec_options ale-terraform.txt /*g:ale_terraform_tfsec_options* +g:ale_tex_chktex_executable ale-tex.txt /*g:ale_tex_chktex_executable* +g:ale_tex_chktex_options ale-tex.txt /*g:ale_tex_chktex_options* +g:ale_tex_latexindent_executable ale-tex.txt /*g:ale_tex_latexindent_executable* +g:ale_tex_latexindent_options ale-tex.txt /*g:ale_tex_latexindent_options* +g:ale_tex_texlab_config ale-tex.txt /*g:ale_tex_texlab_config* +g:ale_tex_texlab_executable ale-tex.txt /*g:ale_tex_texlab_executable* +g:ale_tex_texlab_options ale-tex.txt /*g:ale_tex_texlab_options* +g:ale_textlint_executable ale-text.txt /*g:ale_textlint_executable* +g:ale_textlint_options ale-text.txt /*g:ale_textlint_options* +g:ale_textlint_use_global ale-text.txt /*g:ale_textlint_use_global* +g:ale_thrift_thrift_executable ale-thrift.txt /*g:ale_thrift_thrift_executable* +g:ale_thrift_thrift_generators ale-thrift.txt /*g:ale_thrift_thrift_generators* +g:ale_thrift_thrift_includes ale-thrift.txt /*g:ale_thrift_thrift_includes* +g:ale_thrift_thrift_options ale-thrift.txt /*g:ale_thrift_thrift_options* +g:ale_thrift_thriftcheck_executable ale-thrift.txt /*g:ale_thrift_thriftcheck_executable* +g:ale_thrift_thriftcheck_options ale-thrift.txt /*g:ale_thrift_thriftcheck_options* +g:ale_type_map ale.txt /*g:ale_type_map* +g:ale_typescript_standard_executable ale-typescript.txt /*g:ale_typescript_standard_executable* +g:ale_typescript_standard_options ale-typescript.txt /*g:ale_typescript_standard_options* +g:ale_typescript_standard_use_global ale-typescript.txt /*g:ale_typescript_standard_use_global* +g:ale_typescript_tslint_config_path ale-typescript.txt /*g:ale_typescript_tslint_config_path* +g:ale_typescript_tslint_executable ale-typescript.txt /*g:ale_typescript_tslint_executable* +g:ale_typescript_tslint_ignore_empty_files ale-typescript.txt /*g:ale_typescript_tslint_ignore_empty_files* +g:ale_typescript_tslint_rules_dir ale-typescript.txt /*g:ale_typescript_tslint_rules_dir* +g:ale_typescript_tslint_use_global ale-typescript.txt /*g:ale_typescript_tslint_use_global* +g:ale_typescript_tsserver_config_path ale-typescript.txt /*g:ale_typescript_tsserver_config_path* +g:ale_typescript_tsserver_executable ale-typescript.txt /*g:ale_typescript_tsserver_executable* +g:ale_typescript_tsserver_use_global ale-typescript.txt /*g:ale_typescript_tsserver_use_global* +g:ale_typescript_xo_executable ale-typescript.txt /*g:ale_typescript_xo_executable* +g:ale_typescript_xo_options ale-typescript.txt /*g:ale_typescript_xo_options* +g:ale_typescript_xo_use_global ale-typescript.txt /*g:ale_typescript_xo_use_global* +g:ale_update_tagstack ale.txt /*g:ale_update_tagstack* +g:ale_use_global_executables ale.txt /*g:ale_use_global_executables* +g:ale_v_v_executable ale-v.txt /*g:ale_v_v_executable* +g:ale_v_v_options ale-v.txt /*g:ale_v_v_options* +g:ale_v_vfmt_options ale-v.txt /*g:ale_v_vfmt_options* +g:ale_verilog_verilator_options ale-verilog.txt /*g:ale_verilog_verilator_options* +g:ale_verilog_vlog_executable ale-verilog.txt /*g:ale_verilog_vlog_executable* +g:ale_verilog_vlog_options ale-verilog.txt /*g:ale_verilog_vlog_options* +g:ale_verilog_xvlog_executable ale-verilog.txt /*g:ale_verilog_xvlog_executable* +g:ale_verilog_xvlog_options ale-verilog.txt /*g:ale_verilog_xvlog_options* +g:ale_verilog_yosys_executable ale-verilog.txt /*g:ale_verilog_yosys_executable* +g:ale_verilog_yosys_options ale-verilog.txt /*g:ale_verilog_yosys_options* +g:ale_vhdl_ghdl_executable ale-vhdl.txt /*g:ale_vhdl_ghdl_executable* +g:ale_vhdl_ghdl_options ale-vhdl.txt /*g:ale_vhdl_ghdl_options* +g:ale_vhdl_vcom_executable ale-vhdl.txt /*g:ale_vhdl_vcom_executable* +g:ale_vhdl_vcom_options ale-vhdl.txt /*g:ale_vhdl_vcom_options* +g:ale_vhdl_xvhdl_executable ale-vhdl.txt /*g:ale_vhdl_xvhdl_executable* +g:ale_vhdl_xvhdl_options ale-vhdl.txt /*g:ale_vhdl_xvhdl_options* +g:ale_vim_vimls_config ale-vim.txt /*g:ale_vim_vimls_config* +g:ale_vim_vimls_executable ale-vim.txt /*g:ale_vim_vimls_executable* +g:ale_vim_vimls_use_global ale-vim.txt /*g:ale_vim_vimls_use_global* +g:ale_vim_vint_executable ale-vim.txt /*g:ale_vim_vint_executable* +g:ale_vim_vint_show_style_issues ale-vim.txt /*g:ale_vim_vint_show_style_issues* +g:ale_virtualenv_dir_names ale.txt /*g:ale_virtualenv_dir_names* +g:ale_virtualtext_cursor ale.txt /*g:ale_virtualtext_cursor* +g:ale_virtualtext_delay ale.txt /*g:ale_virtualtext_delay* +g:ale_virtualtext_prefix ale.txt /*g:ale_virtualtext_prefix* +g:ale_vue_vls_executable ale-vue.txt /*g:ale_vue_vls_executable* +g:ale_vue_vls_use_global ale-vue.txt /*g:ale_vue_vls_use_global* +g:ale_vue_volar_executable ale-vue.txt /*g:ale_vue_volar_executable* +g:ale_vue_volar_init_options ale-vue.txt /*g:ale_vue_volar_init_options* +g:ale_vue_volar_use_global ale-vue.txt /*g:ale_vue_volar_use_global* +g:ale_want_results_buffer ale.txt /*g:ale_want_results_buffer* +g:ale_warn_about_trailing_blank_lines ale.txt /*g:ale_warn_about_trailing_blank_lines* +g:ale_warn_about_trailing_whitespace ale.txt /*g:ale_warn_about_trailing_whitespace* +g:ale_wgsl_naga_executable ale-wgsl.txt /*g:ale_wgsl_naga_executable* +g:ale_windows_node_executable_path ale.txt /*g:ale_windows_node_executable_path* +g:ale_writegood_executable ale.txt /*g:ale_writegood_executable* +g:ale_writegood_options ale.txt /*g:ale_writegood_options* +g:ale_writegood_use_global ale.txt /*g:ale_writegood_use_global* +g:ale_xml_xmllint_executable ale-xml.txt /*g:ale_xml_xmllint_executable* +g:ale_xml_xmllint_indentsize ale-xml.txt /*g:ale_xml_xmllint_indentsize* +g:ale_xml_xmllint_options ale-xml.txt /*g:ale_xml_xmllint_options* +g:ale_yaml_actionlint_executable ale-yaml.txt /*g:ale_yaml_actionlint_executable* +g:ale_yaml_actionlint_options ale-yaml.txt /*g:ale_yaml_actionlint_options* +g:ale_yaml_gitlablint_executable ale-yaml.txt /*g:ale_yaml_gitlablint_executable* +g:ale_yaml_gitlablint_options ale-yaml.txt /*g:ale_yaml_gitlablint_options* +g:ale_yaml_ls_config ale-yaml.txt /*g:ale_yaml_ls_config* +g:ale_yaml_ls_executable ale-yaml.txt /*g:ale_yaml_ls_executable* +g:ale_yaml_ls_use_global ale-yaml.txt /*g:ale_yaml_ls_use_global* +g:ale_yaml_spectral_executable ale-yaml.txt /*g:ale_yaml_spectral_executable* +g:ale_yaml_spectral_use_global ale-yaml.txt /*g:ale_yaml_spectral_use_global* +g:ale_yaml_swaglint_executable ale-yaml.txt /*g:ale_yaml_swaglint_executable* +g:ale_yaml_swaglint_use_global ale-yaml.txt /*g:ale_yaml_swaglint_use_global* +g:ale_yaml_yamlfix_executable ale-yaml.txt /*g:ale_yaml_yamlfix_executable* +g:ale_yaml_yamlfix_options ale-yaml.txt /*g:ale_yaml_yamlfix_options* +g:ale_yaml_yamlfix_use_global ale-yaml.txt /*g:ale_yaml_yamlfix_use_global* +g:ale_yaml_yamllint_executable ale-yaml.txt /*g:ale_yaml_yamllint_executable* +g:ale_yaml_yamllint_options ale-yaml.txt /*g:ale_yaml_yamllint_options* +g:ale_yang_lsp_executable ale-yang.txt /*g:ale_yang_lsp_executable* +g:ale_zeek_zeek_executable ale-zeek.txt /*g:ale_zeek_zeek_executable* +g:ale_zig_zigfmt_executable ale-zig.txt /*g:ale_zig_zigfmt_executable* +g:ale_zig_zls_config ale-zig.txt /*g:ale_zig_zls_config* +g:ale_zig_zls_executable ale-zig.txt /*g:ale_zig_zls_executable* +g:html_tidy_use_global ale-html.txt /*g:html_tidy_use_global* +g:nim_nimlsp_nim_sources ale-nim.txt /*g:nim_nimlsp_nim_sources* +g:rego_opacheck_executable ale-rego.txt /*g:rego_opacheck_executable* +g:rego_opacheck_options ale-rego.txt /*g:rego_opacheck_options* +g:vala_vala_lint_config_filename ale-vala.txt /*g:vala_vala_lint_config_filename* +g:vala_vala_lint_executable ale-vala.txt /*g:vala_vala_lint_executable* +terraform-lsp ale-terraform.txt /*terraform-lsp* diff --git a/dot_vim/plugged/ale/dot_appveyor.yml b/dot_vim/plugged/ale/dot_appveyor.yml new file mode 100644 index 0000000..e6f2a1e --- /dev/null +++ b/dot_vim/plugged/ale/dot_appveyor.yml @@ -0,0 +1,48 @@ +--- +# Disabling building for AppVeyor. We are just testing things. +build: false +clone_depth: 10 +# Use the directory C:\testplugin so test directories will mostly work. +clone_folder: C:\testplugin + +branches: + only: + - master + - /v\d+\.\d+\.(x|\d+)/ + +# Cache the vim and vader directories between builds. +cache: + - C:\vim -> .appveyor.yml + - C:\vader -> .appveyor.yml + +init: + # Stop git from changing newlines + - git config --global core.autocrlf input + +# NOTE: If you change the Vim or Vader versions here, please also update the +# instructions for running tests on Windows in ale-development.txt + +install: + # Download and unpack Vim + - ps: >- + if (!(Test-Path -Path C:\vim)){ + Add-Type -A System.IO.Compression.FileSystem + Invoke-WebRequest ftp://ftp.vim.org/pub/vim/pc/vim80-586w32.zip ` + -OutFile C:\vim.zip + [IO.Compression.ZipFile]::ExtractToDirectory('C:\vim.zip', 'C:\vim') + Invoke-WebRequest ftp://ftp.vim.org/pub/vim/pc/vim80-586rt.zip ` + -OutFile C:\rt.zip + [IO.Compression.ZipFile]::ExtractToDirectory('C:\rt.zip', 'C:\vim') + } + # Clone Vader and check out the commit we want + - ps: >- + if (!(Test-Path -Path C:\vader)){ + git clone https://github.com/junegunn/vader.vim C:\vader 2> $null + cd C:\vader + git checkout -qf c6243dd81c98350df4dec608fa972df98fa2a3af 2> $null + } + +test_script: + - cd C:\testplugin + - 'C:\vim\vim\vim80\vim.exe -u test\vimrc "+Vader! + test/*.vader test/*/*.vader test/*/*/*.vader test/*/*/*.vader"' diff --git a/dot_vim/plugged/ale/dot_editorconfig b/dot_vim/plugged/ale/dot_editorconfig new file mode 100644 index 0000000..d9b95d6 --- /dev/null +++ b/dot_vim/plugged/ale/dot_editorconfig @@ -0,0 +1,14 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# Top-most EditorConfig file +root = true + +# Match and apply these rules for all file +# types you open in your code editor +[*] +# Unix-style newlines +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true diff --git a/dot_vim/plugged/ale/dot_git/HEAD b/dot_vim/plugged/ale/dot_git/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/dot_vim/plugged/ale/dot_git/branches/.keep b/dot_vim/plugged/ale/dot_git/branches/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_vim/plugged/ale/dot_git/config b/dot_vim/plugged/ale/dot_git/config new file mode 100644 index 0000000..c8dc9b2 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/config @@ -0,0 +1,11 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + url = https://github.com/dense-analysis/ale.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff --git a/dot_vim/plugged/ale/dot_git/description b/dot_vim/plugged/ale/dot_git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/dot_vim/plugged/ale/dot_git/hooks/applypatch-msg.sample b/dot_vim/plugged/ale/dot_git/hooks/applypatch-msg.sample new file mode 100644 index 0000000..a5d7b84 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/dot_vim/plugged/ale/dot_git/hooks/commit-msg.sample b/dot_vim/plugged/ale/dot_git/hooks/commit-msg.sample new file mode 100644 index 0000000..b58d118 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/dot_vim/plugged/ale/dot_git/hooks/fsmonitor-watchman.sample b/dot_vim/plugged/ale/dot_git/hooks/fsmonitor-watchman.sample new file mode 100644 index 0000000..23e856f --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/dot_vim/plugged/ale/dot_git/hooks/post-update.sample b/dot_vim/plugged/ale/dot_git/hooks/post-update.sample new file mode 100644 index 0000000..ec17ec1 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/dot_vim/plugged/ale/dot_git/hooks/pre-applypatch.sample b/dot_vim/plugged/ale/dot_git/hooks/pre-applypatch.sample new file mode 100644 index 0000000..4142082 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/dot_vim/plugged/ale/dot_git/hooks/pre-commit.sample b/dot_vim/plugged/ale/dot_git/hooks/pre-commit.sample new file mode 100644 index 0000000..e144712 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/dot_vim/plugged/ale/dot_git/hooks/pre-merge-commit.sample b/dot_vim/plugged/ale/dot_git/hooks/pre-merge-commit.sample new file mode 100644 index 0000000..399eab1 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/dot_vim/plugged/ale/dot_git/hooks/pre-push.sample b/dot_vim/plugged/ale/dot_git/hooks/pre-push.sample new file mode 100644 index 0000000..4ce688d --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/dot_vim/plugged/ale/dot_git/hooks/pre-rebase.sample b/dot_vim/plugged/ale/dot_git/hooks/pre-rebase.sample new file mode 100644 index 0000000..6cbef5c --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/dot_vim/plugged/ale/dot_git/hooks/pre-receive.sample b/dot_vim/plugged/ale/dot_git/hooks/pre-receive.sample new file mode 100644 index 0000000..a1fd29e --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/dot_vim/plugged/ale/dot_git/hooks/prepare-commit-msg.sample b/dot_vim/plugged/ale/dot_git/hooks/prepare-commit-msg.sample new file mode 100644 index 0000000..10fa14c --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/dot_vim/plugged/ale/dot_git/hooks/push-to-checkout.sample b/dot_vim/plugged/ale/dot_git/hooks/push-to-checkout.sample new file mode 100644 index 0000000..af5a0c0 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/dot_vim/plugged/ale/dot_git/index b/dot_vim/plugged/ale/dot_git/index new file mode 100644 index 0000000000000000000000000000000000000000..fe03eb07630202a351dfde23052ebca2673e2f15 GIT binary patch literal 230424 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 1673460166 +0200 clone: from https://github.com/dense-analysis/ale.git +69c1dc8b5f3d215d4a0538265b2d257c2ed7a8fa 69c1dc8b5f3d215d4a0538265b2d257c2ed7a8fa LinlyBoi 1673460166 +0200 checkout: moving from master to master diff --git a/dot_vim/plugged/ale/dot_git/logs/refs/heads/master b/dot_vim/plugged/ale/dot_git/logs/refs/heads/master new file mode 100644 index 0000000..9a1ad84 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 69c1dc8b5f3d215d4a0538265b2d257c2ed7a8fa LinlyBoi 1673460166 +0200 clone: from https://github.com/dense-analysis/ale.git diff --git a/dot_vim/plugged/ale/dot_git/logs/refs/remotes/origin/HEAD b/dot_vim/plugged/ale/dot_git/logs/refs/remotes/origin/HEAD new file mode 100644 index 0000000..9a1ad84 --- /dev/null +++ b/dot_vim/plugged/ale/dot_git/logs/refs/remotes/origin/HEAD @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 69c1dc8b5f3d215d4a0538265b2d257c2ed7a8fa LinlyBoi 1673460166 +0200 clone: from https://github.com/dense-analysis/ale.git diff --git a/dot_vim/plugged/ale/dot_git/objects/info/.keep b/dot_vim/plugged/ale/dot_git/objects/info/.keep new file mode 100644 index 0000000..e69de29 diff --git a/dot_vim/plugged/ale/dot_git/objects/pack/readonly_pack-065dba8ccc2287167c324ef036a5261c7f156062.idx b/dot_vim/plugged/ale/dot_git/objects/pack/readonly_pack-065dba8ccc2287167c324ef036a5261c7f156062.idx new file mode 100644 index 0000000000000000000000000000000000000000..461a536ead1d0c366530758037c38058671ca5e4 GIT binary patch literal 221852 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%0DVuOpThP!~fHcbiUcj@Fjz@ync1e0%_Qn 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

Lq#ISM621Fj2szQa0ZAU+&|>}ot2 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 -VS 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%0ATMO8Fi;Fm}zyIj;j2G1_#q*sCkxN-N{^or6 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≶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

V7WV~yP!5fqyE)KpVM^liLfu7`K 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%0D%pIgYG8s41^H@igP!W$KtG^cj_2JaPBGE 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%0Ardu5=|}^e)&+r16X~G~prn<8HAExa!vsUZAHukB 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 D#)|+s literal 0 HcmV?d00001 diff --git a/dot_vim/plugged/ale/dot_git/objects/pack/readonly_pack-065dba8ccc2287167c324ef036a5261c7f156062.pack b/dot_vim/plugged/ale/dot_git/objects/pack/readonly_pack-065dba8ccc2287167c324ef036a5261c7f156062.pack new file mode 100644 index 0000000000000000000000000000000000000000..3470b3ce9fbc17a91417c7ccfe331e8885036a5b GIT binary patch literal 10366847 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