#!/usr/bin/env bash set -E DIRS="syntax indent compiler autoload ftplugin after/syntax after/indent after/ftplugin" # shellcheck disable=SC2034 DIRS_BASIC="syntax compiler indent after/syntax after/indent" # shellcheck disable=SC2034 DIRS_ALL="syntax indent compiler autoload ftplugin after" # shellcheck disable=SC2034 DIRS_SYNTAX="syntax indent after/syntax after/indent" DIRS_JAVASCRIPT="${DIRS} extras" read -r -a DIRS_RM <<<"$DIRS_JAVASCRIPT" OUTPUT="" output() { OUTPUT="$OUTPUT$1" echo -n "$1" } download() { for pack in $1; do path="$(cut -d ':' -f 2 <<<"$pack")" dir="tmp/$(cut -d '/' -f 2 <<<"$path")" rm -rf "$dir" (mkdir -p "$dir" && curl --silent -L "https://codeload.github.com/$path/tar.gz/master" | tar -zx -C "$dir" --strip 1 && printf '.') & done wait } extract() { echo cat config.vim >> tmp/polyglot.vim for pack in $1; do name="$(cut -d ':' -f 1 <<<"$pack")" path="$(cut -d ':' -f 2 <<<"$pack")" dir="tmp/$(cut -d '/' -f 2 <<<"$path")" directories="DIRS$(cut -d ':' -f 3 <<<"$pack")" subtree="$(cut -d ':' -f 4 <<<"$pack")" output "- [$name](https://github.com/$path) (" subdirs="" for subdir in ${!directories}; do if [ -d "${dir}${subtree:-/}${subdir}" ]; then base="$(basename "$subdir")" if [[ "$subdirs" != *"$base"* ]]; then subdirs="$subdirs, $base" fi copy_dir "${dir}${subtree}" "$subdir" "$name" fi done # syntax for go.vim depends on autoload for go.vim, but we exclude the # autoload always and the ftplugin because it's too complex. FML. if [ "${pack%%:*}" = "go" ]; then copy_file "${dir}${subtree}" "${dir}${subtree}/autoload/go/config.vim" "${name}" fi output "${subdirs##, })"$'\n' if (echo "julia coffee-script elixir fish git plantuml scala swift jinja" | grep -qF "$name"); then echo "Skipping ftdetect installation of $name" >&2 continue fi [ -d "${dir}${subtree:-/}ftdetect" ] && for f in "${dir}${subtree:-/}ftdetect/"*; do cat <> tmp/polyglot.vim if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, '${pack%%:*}') == -1 augroup filetypedetect " ${pack%%:*}, from ${f##*/ftdetect/} in ${pack#*:} $(cat "${f}") augroup end endif EOF done done mv tmp/polyglot.vim ftdetect/ for pack in $1; do name="$(cut -d ':' -f 1 <<<"$pack")" path="$(cut -d ':' -f 2 <<<"$pack")" dir="tmp/$(cut -d '/' -f 2 <<<"$path")" subtree="$(cut -d ':' -f 4 <<<"$pack")" if [ -d "$dir${subtree:-/}plugin" ]; then echo "Possible error (plugin directory exists): $path" >&2 fi done } copy_dir() { find "$1/$2" \( -name '*.vim' -o -name '*.vital' \) -print0 | while read -r -d $'\0' file; do copy_file "$1" "$file" "$3" done } copy_file() { ## $1 is the build dir (e.g. tmp/vim-go) ## $2 is the full file path, as returned by `find` (e.g. tmp/vim-go/indent/go.vim) ## $3 is the name of the package (so that we can detect if it's disabled at runtime) local tmp_dir="$1" local file_in_tmp="$2" local file_basename="${2##*/}" local file_path="${file_in_tmp##$tmp_dir/}" # Just this file's (full) path file_path="${file_path%/*}" # Minus the actual name of the file local file_in_dst="${file_path}/${file_basename}" # Could also be ${file_in_tmp##$tmp_dir/} local package_name="$3" if [ "${file_in_tmp##$tmp_dir/}" != "${file_in_dst}" ]; then echo "Failure in logic in build script; '${file_in_tmp##$tmp_dir/}' != '${file_in_dst}'. Bailing." >&2 exit 1 fi mkdir -p "${file_path}" touch "$file_in_dst" # Use comma instead of / to handle cases like c/c++ sed -e "s,%%PACK%%,${package_name}," -e "/%%CONTENT%%/{r ${file_in_tmp}" -e "d;}" plugin_guard.vim.template >> "$file_in_dst" } update_readme() { local tf of tf="$(mktemp)" of="$(mktemp)" LC_ALL=C sort <<<"$OUTPUT" | grep -vxE '[[:space:]]*' > "$of" awk 'suppress == 0 { gsub(/[^<]*/, "'"$(awk 'END {print NR}' "$of")"'"); print; } // { suppress = 1; while ( ( getline line < "'"$of"'" ) > 0 ) { print line; } } // { suppress = 0; print; }' "README.md" >"$tf" mv "$tf" "README.md" } PACKS=" ansible:pearofducks/ansible-vim apiblueprint:sheerun/apiblueprint.vim applescript:mityu/vim-applescript:_SYNTAX arduino:sudar/vim-arduino-syntax asciidoc:asciidoc/vim-asciidoc autohotkey:hnamikaw/vim-autohotkey blade:jwalton512/vim-blade c++11:octol/vim-cpp-enhanced-highlight c/c++:vim-jp/vim-cpp caddyfile:isobit/vim-caddyfile carp:hellerve/carp-vim cjsx:mtscout6/vim-cjsx clojure:guns/vim-clojure-static cmake:pboettch/vim-cmake-syntax coffee-script:kchmck/vim-coffee-script cql:elubow/cql-vim cryptol:victoredwardocallaghan/cryptol.vim crystal:rhysd/vim-crystal cucumber:tpope/vim-cucumber cue:mgrabovsky/vim-cuesheet dart:dart-lang/dart-vim-plugin dockerfile:ekalinin/Dockerfile.vim elixir:elixir-lang/vim-elixir elm:ElmCast/elm-vim emberscript:yalesov/vim-ember-script emblem:yalesov/vim-emblem erlang:vim-erlang/vim-erlang-runtime ferm:vim-scripts/ferm.vim fish:dag/vim-fish flatbuffers:dcharbon/vim-flatbuffers fsharp:fsharp/vim-fsharp:_BASIC git:tpope/vim-git glsl:tikhomirov/vim-glsl gmpl:maelvalais/gmpl.vim gnuplot:vim-scripts/gnuplot-syntax-highlighting go:fatih/vim-go:_BASIC gradle:tfnico/vim-gradle graphql:jparise/vim-graphql groovy:vim-scripts/groovy.vim groovy-indent:vim-scripts/groovyindent-unix haml:sheerun/vim-haml handlebars:mustache/vim-mustache-handlebars haproxy:CH-DanReif/haproxy.vim haskell:neovimhaskell/haskell-vim haxe:yaymukund/vim-haxe html5:othree/html5.vim i3:mboughaba/i3config.vim idris:idris-hackers/idris-vim jasmine:glanotte/vim-jasmine javascript:pangloss/vim-javascript:_JAVASCRIPT jenkins:martinda/Jenkinsfile-vim-syntax jinja:lepture/vim-jinja json5:GutenYe/json5.vim json:elzr/vim-json jst:briancollins/vim-jst jsx:amadeus/vim-jsx julia:JuliaEditorSupport/julia-vim kotlin:udalov/kotlin-vim latex:LaTeX-Box-Team/LaTeX-Box less:groenewege/vim-less liquid:tpope/vim-liquid livescript:gkz/vim-ls lua:tbastos/vim-lua mako:sophacles/vim-bundle-mako markdown:plasticboy/vim-markdown:_SYNTAX mathematica:rsmenon/vim-mathematica meson:mesonbuild/meson:_ALL:/data/syntax-highlighting/vim/ moonscript:leafo/moonscript-vim nginx:chr4/nginx.vim nim:zah/nim.vim:_BASIC nix:LnL7/vim-nix objc:b4winckler/vim-objc ocaml:jrk/vim-ocaml octave:vim-scripts/octave.vim-- opencl:petRUShka/vim-opencl perl:vim-perl/vim-perl pgsql:exu/pgsql.vim php:StanAngeloff/php.vim plantuml:aklt/plantuml-syntax pony:jakwings/vim-pony powershell:PProvost/vim-ps1 protobuf:uarun/vim-protobuf pug:digitaltoad/vim-pug puppet:voxpupuli/vim-puppet purescript:purescript-contrib/purescript-vim python-compiler:aliev/vim-compiler-python python-ident:Vimjas/vim-python-pep8-indent python:vim-python/python-syntax qmake:artoj/qmake-syntax-vim qml:peterhoeg/vim-qml r-lang:vim-scripts/R.vim racket:wlangstroth/vim-racket ragel:jneen/ragel.vim raml:IN3D/vim-raml reason:reasonml-editor/vim-reason-plus rspec:sheerun/rspec.vim rst:marshallward/vim-restructuredtext ruby:vim-ruby/vim-ruby rust:rust-lang/rust.vim sbt:derekwyatt/vim-sbt scala:derekwyatt/vim-scala scss:cakebaker/scss-syntax.vim slim:slim-template/vim-slim slime:slime-lang/vim-slime-syntax solidity:tomlion/vim-solidity stylus:wavded/vim-stylus swift:keith/swift.vim sxhkd:baskerville/vim-sxhkdrc systemd:wgwoods/vim-systemd-syntax terraform:hashivim/vim-terraform textile:timcharper/textile.vim thrift:solarnz/thrift.vim tmux:keith/tmux.vim tomdoc:wellbredgrapefruit/tomdoc.vim toml:cespare/vim-toml twig:lumiliet/vim-twig typescript:leafgarland/typescript-vim vala:arrufat/vala.vim vbnet:vim-scripts/vbnet.vim vcl:smerrill/vcl-vim-plugin vifm:vifm/vifm.vim vm:lepture/vim-velocity vue:posva/vim-vue xml:amadeus/vim-xml xls:vim-scripts/XSLT-syntax yaml:stephpy/vim-yaml yard:sheerun/vim-yardoc " rm -rf tmp rm -rf "${DIRS_RM[@]}" mkdir tmp printf "Downloading packs..." download "$(sed '/^#/d' <<<"$PACKS")" extract "$(sed '/^#/d' <<<"$PACKS")" update_readme rm -rf tmp