vim-settings/install-language-servers.sh

249 lines
6.6 KiB
Bash
Executable File

#! /bin/bash
# Clear explicit PYTHONPATH since this gets confused between py2 and py3
export PYTHONPATH=""
# Languages to install helpers for
declare -a VIM_LANGS
# Read flag for ignore missing and args for languages
while [[ $# -gt 0 ]]; do
case "$1" in
--ignore-missing)
VIM_IGNORE_MISSING=true
;;
*)
VIM_LANGS+=("$1")
;;
esac
shift
done
function want_lang() {
if [ "${#VIM_LANGS[@]}" -eq 0 ]; then
return 0
fi
for l in "${VIM_LANGS[@]}"; do
if [ "$l" == "$1" ]; then
return 0
fi
done
return 1
}
# Ignore failed installs
if [ -z "$VIM_IGNORE_MISSING" ]; then
set -e
else
set +e
fi
# Determines if a command exists or not
function command_exist() {
command -v "$1" > /dev/null 2>&1;
}
# Runs a command or spits out the output
function maybe_run() {
if command_exist "$1" ;then
echo "> $*"
# shellcheck disable=2048,2086
eval $*
else
echo "ERROR: $1 does not exist. Could not run $*"
fi
}
# Runs the "right" pip for installing
function maybe_pip_install() {
if command_exist pipx ;then
# Prefer pipx to keep environments isolated
pipx upgrade "$@"
else
if command_exist pip3 ;then
# If pip3 is there, use it to ensure we're using pytho3
pip3 install --user --upgrade "$@"
else
# Use pip and hope for the best
pip install --user --upgrade "$@"
fi
fi
}
## Language servers
function install_language_servers() {
echo "### Installing language servers..."
# bash
if want_lang bash ;then
maybe_run npm install -g bash-language-server
fi
# Kotlin
# https://github.com/fwcd/kotlin-language-server/blob/master/BUILDING.md
# Python
if want_lang python ;then
maybe_run npm install -g pyright
fi
# Rust
if want_lang rust ;then
maybe_run rustup component add rustfmt rust-analysis rust-src clippy rust-analyzer
if ! command_exists rustup ;then
maybe_run release-gitter --git-url "https://github.com/rust-lang/rust-analyzer" \
--map-system Windows=pc-windows-msvc --map-system Linux=unknown-linux-gnu --map-system Darwin=apple-darwin \
--exec "'F={}; gzip -d /tmp/\$F && mv /tmp/\$(echo \$F|sed s/\.gz\$//) ~/bin/rust-analyzer && chmod +x ~/bin/rust-analyzer'" \
"rust-analyzer-{arch}-{system}.gz" /tmp/
fi
fi
# Go
if want_lang go ;then
maybe_run env GO111MODULE=on go install golang.org/x/tools/gopls@latest
fi
echo ""
}
## Linters
function install_linters() {
echo "### Installing linters..."
# Python
if want_lang python ;then
maybe_pip_install mypy || echo "WARNING: mypy is py3 only"
fi
# CSS
if want_lang css || want_lang web ;then
maybe_run npm install -g csslint
fi
# Vim
if want_lang vim || want_lang neovim ;then
maybe_pip_install vim-vint
fi
# YAML
if want_lang yaml ;then
maybe_pip_install yamllint
fi
# Text / Markdown
if want_lang text || want_lang prose ;then
maybe_run npm install -g alex write-good
maybe_pip_install proselint
fi
# Makefile
# maybe_run go install github.com/mrtazz/checkmake@latest
# Go
if want_lang go ;then
maybe_run release-gitter --git-url "https://github.com/golangci/golangci-lint" \
--map-system Windows=windows --map-system Linux=linux --map-system Darwin=darwin \
--map-arch x86_64=amd64 --map-arch armv7l=armv7 --map-arch aarch64=arm64 \
--extract-all --exec "'mv /tmp/\$(echo {}|sed s/\.tar\.gz\$//)/golangci-lint ~/bin/'" \
"golangci-lint-{version}-{system}-{arch}.tar.gz" /tmp/
fi
# Lua
if want_lang lua || want_lang neovim ;then
maybe_run luarocks --local install luafilesystem
# Version pinned to version in pre-commit
maybe_run luarocks --local install luacheck 1.1.0
fi
# Docker
if want_lang docker ;then
hadolint_arm64=arm64
if [ "$(uname -s)" == "Darwin" ]; then
hadolint_arm64=x86_64
fi
maybe_run release-gitter --git-url "https://github.com/hadolint/hadolint" \
--map-arch aarch64=$hadolint_arm64 \
--map-arch arm64=$hadolint_arm64 \
--exec "'mv ~/bin/{} ~/bin/hadolint && chmod +x ~/bin/hadolint'" \
"hadolint-{system}-{arch}" ~/bin
fi
# Terraform
if want_lang terraform ;then
maybe_run release-gitter --git-url "https://github.com/aquasecurity/tfsec" \
--map-arch x86_64=amd64 \
--map-arch aarch64=arm64 \
--map-system Linux=linux --map-system Darwin=darwin \
--exec "'mv ~/bin/{} ~/bin/tfsec && chmod +x ~/bin/tfsec'" \
"tfsec-{system}-{arch}" ~/bin
maybe_run release-gitter --git-url "https://github.com/terraform-linters/tflint" \
--map-arch x86_64=amd64 \
--map-arch aarch64=arm64 \
--map-system Linux=linux --map-system Darwin=darwin \
--extract-all --exec "'chmod +x ~/bin/tflint'" \
"tflint_{system}_{arch}.zip" ~/bin
fi
echo ""
}
## Fixers
function install_fixers() {
echo "### Installing fixers..."
# CSS/JS/HTML/JSON/YAML/Markdown/and more!
if want_lang javascript || want_lang html || want_lang css || want_lang web || want_lang json ;then
maybe_run npm install -g prettier
fi
# Python
if want_lang python ;then
maybe_pip_install black autopep8 reorder-python-imports
fi
# Rust
if want_lang rust ;then
maybe_run rustup component add rustfmt
fi
# Lua
if want_lang lua || want_lang neovim ;then
# Version pinned to version in pre-commit
local stylua_version=0.17.1
if ! release-gitter --git-url "https://github.com/JohnnyMorganz/StyLua" \
--version "v$stylua_version" \
--map-arch arm64=aarch64 \
--map-system Windows=windows --map-system Linux=linux --map-system Darwin=macos \
--extract-all --exec "chmod +x ~/bin/stylua" \
"stylua-{system}-{arch}.zip" ~/bin ; then
maybe_run cargo install --version "$stylua_version" stylua
fi
fi
echo ""
}
## Debuggers
function install_debuggers() {
# Python
if want_lang python ;then
maybe_pip_install debugpy
fi
}
function main() {
maybe_pip_install release-gitter
install_language_servers
install_linters
install_fixers
install_debuggers
echo ""
echo "DONE"
}
main