-
-
Notifications
You must be signed in to change notification settings - Fork 17
install_neovim
Ronald Record edited this page Sep 16, 2023
·
11 revisions
During initialization the lazyman command runs the install_neovim
script to install Neovim, dependencies, and tools.
The source code for the install_neovim script:
#!/usr/bin/env bash # # Copyright (C) 2023 Ronald Record <ronaldrecord@gmail.com> # Copyright (C) 2022 Michael Peter <michaeljohannpeter@gmail.com> # # Install Neovim and all dependencies for the Neovim config at: # https://github.com/doctorfree/nvim-lazyman # # shellcheck disable=SC2001,SC2016,SC2006,SC2086,SC2181,SC2129,SC2059,SC2164 DOC_HOMEBREW="https://docs.brew.sh" BREW_EXE="brew" HOMEBREW_HOME= PYTHON= export PATH=${HOME}/.local/bin:${PATH} abort() { printf "\nERROR: %s\n" "$@" >&2 exit 1 } log() { [ "$quiet" ] || { printf "\n\t%s" "$@" } } calc_elapsed() { FINISH_SECONDS=$(date +%s) ELAPSECS=$((FINISH_SECONDS - START_SECONDS)) ELAPSED=$(eval "echo $(date -ud "@$ELAPSECS" +'$((%s/3600/24)) days %H hr %M min %S sec')") } check_prerequisites() { if [ "${BASH_VERSION:-}" = "" ]; then abort "Bash is required to interpret this script." fi [ "${BASH_VERSINFO:-0}" -ge 4 ] || install_bash=1 if [[ $EUID -eq 0 ]]; then abort "Script must not be run as root user" fi } get_platform() { platform=$(uname -s) if [ "$platform" == "Darwin" ]; then darwin=1 else if [ -f /etc/os-release ]; then . /etc/os-release [ "${ID}" == "debian" ] || [ "${ID_LIKE}" == "debian" ] && debian=1 [ "${ID}" == "arch" ] || [ "${ID_LIKE}" == "arch" ] && arch=1 [ "${ID}" == "alpine" ] && alpine=1 [ "${ID}" == "fedora" ] && redhat=1 [ "${ID}" == "centos" ] && redhat=1 [ "${ID}" == "opensuse" ] && suse=1 [ "${ID}" == "void" ] && void=1 [ "${alpine}" ] || [ "${arch}" ] || [ "${debian}" ] \ || [ "${redhat}" ] || [ "${suse}" ] || [ "${void}" ] || { echo "${ID_LIKE}" | grep debian >/dev/null && debian=1 echo "${ID_LIKE}" | grep suse >/dev/null && suse=1 echo "${ID_LIKE}" | grep void >/dev/null && void=1 } else if [ -f /etc/arch-release ]; then arch=1 else if [ "${have_apt}" ]; then debian=1 else if [ -f /etc/fedora-release ]; then redhat=1 else if [ "${have_dnf}" ] || [ "${have_yum}" ]; then redhat=1 else if [ "${have_zyp}" ]; then suse=1 else if [ "${have_xbps}" ]; then void=1 else if [ "${have_apk}" ]; then alpine=1 else printf "\nUnknown operating system distribution\n" fi fi fi fi fi fi fi fi fi [ "${debian}" ] && { PKGMGR="APT" if [ "${have_apt}" ]; then APT="apt -q -y" else if [ "${have_aptget}" ]; then APT="apt-get -q -y" else printf "\nCould not locate apt or apt-get" printf "\nUsing Homebrew to install Neovim dependencies and tools\n" native= fi fi } [ "${redhat}" ] && { if [ "${have_dnf}" ]; then DNF="dnf --assumeyes --quiet" PKGMGR="DNF" else if [ "${have_yum}" ]; then DNF="yum --assumeyes --quiet" PKGMGR="YUM" else printf "\nCould not locate dnf or yum" printf "\nUsing Homebrew to install Neovim dependencies and tools\n" native= fi fi } [ "${suse}" ] && { if [ "${have_zyp}" ]; then PKGMGR="DNF" else printf "\nCould not locate zypper" printf "\nUsing Homebrew to install Neovim dependencies and tools\n" native= fi } [ "${alpine}" ] && { if [ "${have_apk}" ]; then PKGMGR="APK" else printf "\nCould not locate apk" printf "\nUsing Homebrew to install Neovim dependencies and tools\n" native= fi } [ "${arch}" ] && { if [ "${have_pac}" ]; then PKGMGR="PACMAN" else printf "\nCould not locate pacman" printf "\nUsing Homebrew to install Neovim dependencies and tools\n" native= fi } [ "${void}" ] && { if [ "${have_xbps}" ]; then PKGMGR="XBPS" else printf "\nCould not locate xbps-install" printf "\nUsing Homebrew to install Neovim dependencies and tools\n" native= fi } } # Compare two version strings [1ドル: version string 1 (v1), 2ドル: version string 2 (v2)] # Return values: # 0: v1 == v2 # 1: v1 > v2 # 2: v1 < v2 # Based on https://stackoverflow.com/a/4025065 by Dennis Williamson # and https://stackoverflow.com/questions/4023830/how-to-compare-two-strings-in-dot-separated-version-format-in-bash/49351294#49351294 by Github user @fonic compare_versions() { # Trivial v1 == v2 test based on string comparison [[ "1ドル" == "2ドル" ]] && return 0 # Local variables local regex="^(.*)-r([0-9]*)$" va1=() vr1=0 va2=() vr2=0 len i IFS="." # Split version strings into arrays, extract trailing revisions if [[ "1ドル" =~ ${regex} ]]; then va1=("${BASH_REMATCH[1]}") [[ -n "${BASH_REMATCH[2]}" ]] && vr1=${BASH_REMATCH[2]} else va1=("1ドル") fi if [[ "2ドル" =~ ${regex} ]]; then va2=("${BASH_REMATCH[1]}") [[ -n "${BASH_REMATCH[2]}" ]] && vr2=${BASH_REMATCH[2]} else va2=("2ドル") fi # Bring va1 and va2 to same length by filling empty fields with zeros ((${#va1[@]} > ${#va2[@]})) && len=${#va1[@]} || len=${#va2[@]} for ((i = 0; i < len; ++i)); do [[ -z "${va1[i]}" ]] && va1[i]="0" [[ -z "${va2[i]}" ]] && va2[i]="0" done # Append revisions, increment length va1+=("$vr1") va2+=("$vr2") len=$((len + 1)) # Compare version elements, check if v1 > v2 or v1 < v2 for ((i = 0; i < len; ++i)); do if ((10#${va1[i]} > 10#${va2[i]})); then return 1 elif ((10#${va1[i]} < 10#${va2[i]})); then return 2 fi done # All elements are equal, thus v1 == v2 return 0 } install_homebrew() { if ! command -v brew >/dev/null 2>&1; then [ "$debug" ] && START_SECONDS=$(date +%s) log "Installing Homebrew ..." BREW_URL="https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh" curl -fsSL "$BREW_URL" >/tmp/brew-$$.sh [ $? -eq 0 ] || { rm -f /tmp/brew-$$.sh curl -kfsSL "$BREW_URL" >/tmp/brew-$$.sh } [ -f /tmp/brew-$$.sh ] || abort "Brew install script download failed" chmod 755 /tmp/brew-$$.sh NONINTERACTIVE=1 /bin/bash -c "/tmp/brew-$$.sh" >/dev/null 2>&1 rm -f /tmp/brew-$$.sh export HOMEBREW_NO_INSTALL_CLEANUP=1 export HOMEBREW_NO_ENV_HINTS=1 export HOMEBREW_NO_AUTO_UPDATE=1 [ "$quiet" ] || printf " done" if [ -x /home/linuxbrew/.linuxbrew/bin/brew ]; then HOMEBREW_HOME="/home/linuxbrew/.linuxbrew" BREW_EXE="${HOMEBREW_HOME}/bin/brew" else if [ -x /usr/local/bin/brew ]; then HOMEBREW_HOME="/usr/local" BREW_EXE="${HOMEBREW_HOME}/bin/brew" else if [ -x /opt/homebrew/bin/brew ]; then HOMEBREW_HOME="/opt/homebrew" BREW_EXE="${HOMEBREW_HOME}/bin/brew" else abort "Homebrew brew executable could not be located" fi fi fi if [ -f "${HOME}/.bashrc" ]; then grep "eval \"\$(${BREW_EXE} shellenv)\"" "${HOME}/.bashrc" >/dev/null || { echo 'if [ -x XXX ]; then' | sed -e "s%XXX%${BREW_EXE}%" >>"${HOME}/.bashrc" echo ' eval "$(XXX shellenv)"' | sed -e "s%XXX%${BREW_EXE}%" >>"${HOME}/.bashrc" echo 'fi' >>"${HOME}/.bashrc" } else echo 'if [ -x XXX ]; then' | sed -e "s%XXX%${BREW_EXE}%" >"${HOME}/.bashrc" echo ' eval "$(XXX shellenv)"' | sed -e "s%XXX%${BREW_EXE}%" >>"${HOME}/.bashrc" echo 'fi' >>"${HOME}/.bashrc" fi [ -f "${HOME}/.zshrc" ] && { grep "eval \"\$(${BREW_EXE} shellenv)\"" "${HOME}/.zshrc" >/dev/null || { echo 'if [ -x XXX ]; then' | sed -e "s%XXX%${BREW_EXE}%" >>"${HOME}/.zshrc" echo ' eval "$(XXX shellenv)"' | sed -e "s%XXX%${BREW_EXE}%" >>"${HOME}/.zshrc" echo 'fi' >>"${HOME}/.zshrc" } } [ "$debug" ] && { calc_elapsed printf "\nHomebrew install elapsed time = ${ELAPSED}\n" } log "Homebrew installed in ${HOMEBREW_HOME}" log "See ${DOC_HOMEBREW}" fi eval "$("$BREW_EXE" shellenv)" have_brew=$(type -p brew) [ "$have_brew" ] && BREW_EXE="brew" [ "$HOMEBREW_HOME" ] || { brewpath=$(command -v brew) if [ $? -eq 0 ]; then HOMEBREW_HOME=$(dirname "$brewpath" | sed -e "s%/bin$%%") else HOMEBREW_HOME="Unknown" fi } } brew_install() { brewpkg="1ドル" if command -v "$brewpkg" >/dev/null 2>&1; then log "Using previously installed ${brewpkg}" else log "Installing ${brewpkg} ..." [ "$debug" ] && START_SECONDS=$(date +%s) "$BREW_EXE" install --quiet "$brewpkg" >/dev/null 2>&1 [ $? -eq 0 ] || "$BREW_EXE" link --overwrite --quiet "$brewpkg" >/dev/null 2>&1 [ "$quiet" ] || printf " done" if [ "$debug" ]; then calc_elapsed printf " elapsed time = %s${ELAPSED}" fi fi } platform_install() { platpkg="1ドル" if [ "2ドル" ]; then pkgname="2ドル" else pkgname="$platpkg" fi if command -v "$pkgname" >/dev/null 2>&1; then log "Using previously installed ${platpkg}" else log "Installing ${platpkg} ..." [ "$debug" ] && START_SECONDS=$(date +%s) if [ "${debian}" ]; then if [ "${APT}" ]; then sudo ${APT} install ${platpkg} >/dev/null 2>&1 else [ "${quiet}" ] || printf "\n\t\tCannot locate apt to install. Skipping ..." fi else if [ "${redhat}" ]; then if [ "${DNF}" ]; then sudo ${DNF} install ${platpkg} >/dev/null 2>&1 else [ "${quiet}" ] || { printf "\n\t\tCannot locate dnf to install. Skipping ..." } fi else [ "${arch}" ] && { if [ "${have_pac}" ]; then sudo pacman -S --noconfirm ${platpkg} >/dev/null 2>&1 else [ "${quiet}" ] || { printf "\n\t\tCannot locate pacman to install. Skipping ..." } fi } [ "${suse}" ] && { if [ "${have_zyp}" ]; then sudo zypper install ${platpkg} >/dev/null 2>&1 else [ "${quiet}" ] || { printf "\n\t\tCannot locate zypper to install. Skipping ..." } fi } [ "${alpine}" ] && { if [ "${have_apk}" ]; then sudo apk add ${platpkg} >/dev/null 2>&1 else [ "${quiet}" ] || { printf "\n\t\tCannot locate apk to install. Skipping ..." } fi } [ "${void}" ] && { if [ "${have_xbps}" ]; then sudo xbps-install -S ${platpkg} >/dev/null 2>&1 else [ "${quiet}" ] || { printf "\n\t\tCannot locate xbps-install to install. Skipping ..." } fi } fi fi [ "$quiet" ] || printf " done" if [ "$debug" ]; then calc_elapsed printf " elapsed time = %s${ELAPSED}" fi fi } plat_install() { if [ "${use_homebrew}" ]; then brew_install "1ドル" else platform_install "1ドル" fi } install_neovim_dependencies() { [ "$quiet" ] || printf "\nInstalling dependencies" [ "$install_bash" ] && { log "Installing a modern version of bash ..." [ "$debug" ] && START_SECONDS=$(date +%s) if [ "${use_homebrew}" ]; then "$BREW_EXE" install --quiet bash >/dev/null 2>&1 [ $? -eq 0 ] || "$BREW_EXE" link --overwrite --quiet bash >/dev/null 2>&1 else platform_install bash xxxfoobaryyy fi if [ "$debug" ]; then calc_elapsed printf " elapsed time = %s${ELAPSED}" fi } PKGS="git curl jq tar unzip fzf wget xclip" for pkg in $PKGS do plat_install "$pkg" done if [ "${use_homebrew}" ]; then brew_install clipboard else platform_install "wl-clipboard" wl-copy fi have_curl=$(type -p curl) [ "$have_curl" ] || abort "The curl command could not be located." have_jq=$(type -p jq) have_wget=$(type -p wget) if command -v gh >/dev/null 2>&1; then log "Using previously installed gh" else if [ "${use_homebrew}" ]; then # Things are so much easier with Homebrew brew_install gh else OWNER=cli PROJECT=cli API_URL="https://api.github.com/repos/${OWNER}/${PROJECT}/releases/latest" DL_URL= [ "${have_curl}" ] && [ "${have_jq}" ] && { DL_URL=$(curl --silent "${API_URL}" \ | jq --raw-output '.assets | .[]?.browser_download_url' \ | grep "linux_amd64\.tar\.gz$") } [ "${DL_URL}" ] && { [ "${have_wget}" ] && { log "Installing gh ..." TEMP_TGZ="$(mktemp --suffix=.tgz)" wget --quiet -O "${TEMP_TGZ}" "${DL_URL}" >/dev/null 2>&1 chmod 644 "${TEMP_TGZ}" mkdir -p /tmp/ghit$$ tar -C /tmp/ghit$$ -xzf "${TEMP_TGZ}" for ghimbin in /tmp/"ghit$$"/*/bin/gh /tmp/"ghit$$"/bin/gh do [ "${ghimbin}" == "/tmp/ghit$$/*/bin/gh" ] && continue [ -f "${ghimbin}" ] && { ghimdir=$(dirname ${ghimbin}) ghimdir=$(dirname ${ghimdir}) tar -C ${ghimdir} -cf /tmp/ghim-$$.tar bin share tar -C ${HOME}/.local -xf /tmp/ghim-$$.tar [ -f ${HOME}/.local/bin/gh ] && chmod 755 ${HOME}/.local/bin/gh break } done rm -f "${TEMP_TGZ}" rm -f "/tmp/ghim-$$.tar" rm -rf /tmp/ghit$$ [ "$quiet" ] || printf " done" } } fi fi if command -v lazygit >/dev/null 2>&1; then log "Using previously installed lazygit" else if [ "${use_homebrew}" ]; then # Things are so much easier with Homebrew brew_install lazygit else if [[ $architecture =~ "arm" || $architecture =~ "aarch64" ]]; then larch="arm64" else larch="x86_64" fi OWNER=jesseduffield PROJECT=lazygit API_URL="https://api.github.com/repos/${OWNER}/${PROJECT}/releases/latest" DL_URL= [ "${have_curl}" ] && [ "${have_jq}" ] && { DL_URL=$(curl --silent "${API_URL}" \ | jq --raw-output '.assets | .[]?.browser_download_url' \ | grep "Linux_${larch}\.tar\.gz$") } [ "${DL_URL}" ] && { [ "${have_wget}" ] && { log "Installing lazygit ..." TEMP_TGZ="$(mktemp --suffix=.tgz)" wget --quiet -O "${TEMP_TGZ}" "${DL_URL}" >/dev/null 2>&1 chmod 644 "${TEMP_TGZ}" mkdir -p /tmp/lgit$$ tar -C /tmp/lgit$$ -xzf "${TEMP_TGZ}" [ -f /tmp/lgit$$/lazygit ] && { cp /tmp/lgit$$/lazygit ${HOME}/.local/bin/lazygit chmod 755 ${HOME}/.local/bin/lazygit } rm -f "${TEMP_TGZ}" rm -rf /tmp/lgit$$ [ "$quiet" ] || printf " done" } } fi fi if command -v lua-language-server >/dev/null 2>&1; then log "Using previously installed lua-language-server" else if [ "${use_homebrew}" ]; then brew_install lua-language-server else if [ -d ${HOME}/.local/share/lua-language-server ] then log "Existing ~/.local/share/lua-language-server. Skipping installation of lua-language-server" else if [[ $architecture =~ "arm" || $architecture =~ "aarch64" ]]; then larch="arm64" else larch="x64" fi OWNER=LuaLS PROJECT=lua-language-server API_URL="https://api.github.com/repos/${OWNER}/${PROJECT}/releases/latest" DL_URL= [ "${have_curl}" ] && [ "${have_jq}" ] && { DL_URL=$(curl --silent "${API_URL}" \ | jq --raw-output '.assets | .[]?.browser_download_url' \ | grep "linux-${larch}\.tar\.gz$") } [ "${DL_URL}" ] && { [ "${have_wget}" ] && { log "Installing lua-language-server ..." TEMP_TGZ="$(mktemp --suffix=.tgz)" wget --quiet -O "${TEMP_TGZ}" "${DL_URL}" >/dev/null 2>&1 chmod 644 "${TEMP_TGZ}" mkdir -p /tmp/lual$$ tar -C /tmp/lual$$ -xzf "${TEMP_TGZ}" cp -a /tmp/lual$$ ${HOME}/.local/share/lua-language-server chmod 755 ${HOME}/.local/share/lua-language-server/bin/lua-language-server [ -f "${HOME}/.local/bin/lua-language-server" ] || { echo '#!/usr/bin/env bash' > "${HOME}/.local/bin/lua-language-server" echo 'exec "${HOME}/.local/share/lua-language-server/bin/lua-language-server" "$@"' >> "${HOME}/.local/bin/lua-language-server" chmod 755 "${HOME}/.local/bin/lua-language-server" } rm -f "${TEMP_TGZ}" rm -rf /tmp/lual$$ [ "$quiet" ] || printf " done" } } fi fi fi if command -v zoxide >/dev/null 2>&1; then log "Using previously installed zoxide" else log "Installing zoxide ..." ZOXI_URL="https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh" curl -fsSL "${ZOXI_URL}" >/tmp/zoxi-$$.sh [ $? -eq 0 ] || { rm -f /tmp/zoxi-$$.sh curl -kfsSL "${ZOXI_URL}" >/tmp/zoxi-$$.sh } [ -f /tmp/zoxi-$$.sh ] && bash /tmp/zoxi-$$.sh >/dev/null 2>&1 rm -f /tmp/zoxi-$$.sh if [ -f "${HOME}/.bashrc" ]; then grep "eval \"\$(zoxide init" "${HOME}/.bashrc" >/dev/null || { echo 'if command -v zoxide > /dev/null; then' >>"${HOME}/.bashrc" echo ' eval "$(zoxide init bash)"' >>"${HOME}/.bashrc" echo 'fi' >>"${HOME}/.bashrc" } else echo 'if command -v zoxide > /dev/null; then' >"${HOME}/.bashrc" echo ' eval "$(zoxide init bash)"' >>"${HOME}/.bashrc" echo 'fi' >>"${HOME}/.bashrc" fi [ -f "${HOME}/.zshrc" ] && { grep "eval \"\$(zoxide init" "${HOME}/.zshrc" >/dev/null || { echo 'if command -v zoxide > /dev/null; then' >>"${HOME}/.zshrc" echo ' eval "$(zoxide init zsh)"' >>"${HOME}/.zshrc" echo 'fi' >>"${HOME}/.zshrc" } } [ "$quiet" ] || printf " done" fi if command -v rg >/dev/null 2>&1; then log "Using previously installed ripgrep" else plat_install ripgrep fi [ "$quiet" ] || printf "\n" } install_neovim() { log "Installing Neovim ..." OWNER=neovim PROJECT=neovim API_URL="https://api.github.com/repos/${OWNER}/${PROJECT}/releases/latest" DL_URL= if [ "$debug" ]; then START_SECONDS=$(date +%s) if [ "${use_homebrew}" ]; then "$BREW_EXE" link -q libuv "$BREW_EXE" install neovim else [ -d $HOME/.local ] || mkdir -p $HOME/.local [ "${have_curl}" ] && [ "${have_jq}" ] && { DL_URL=$(curl --silent "${API_URL}" \ | jq --raw-output '.assets | .[]?.browser_download_url' \ | grep "linux64\.tar\.gz$") } [ "${DL_URL}" ] && { [ "${have_wget}" ] && { TEMP_TGZ="$(mktemp --suffix=.tgz)" wget --quiet -O "${TEMP_TGZ}" "${DL_URL}" chmod 644 "${TEMP_TGZ}" mkdir -p /tmp/nvim$$ tar -C /tmp/nvim$$ -xzf "${TEMP_TGZ}" if [ -f /tmp/nvim$$/nvim-linux64/bin/nvim ]; then tar -C /tmp/nvim$$/nvim-linux64 -cf /tmp/nvim-$$.tar . tar -C ${HOME}/.local -xf /tmp/nvim-$$.tar chmod 755 ${HOME}/.local/bin/nvim else for nvimbin in /tmp/"nvim$$"/*/bin/nvim /tmp/"nvim$$"/bin/nvim do [ "${nvimbin}" == "/tmp/nvim$$/*/bin/nvim" ] && continue [ -f "${nvimbin}" ] && { nvimdir=$(dirname ${nvimbin}) nvimdir=$(dirname ${nvimdir}) tar -C ${nvimdir} -cf /tmp/nvim-$$.tar . tar -C ${HOME}/.local -xf /tmp/nvim-$$.tar chmod 755 ${HOME}/.local/bin/nvim break } done fi rm -f "${TEMP_TGZ}" rm -f /tmp/nvim-$$.tar rm -rf /tmp/nvim$$ } } fi else if [ "${use_homebrew}" ]; then "$BREW_EXE" link -q libuv >/dev/null 2>&1 "$BREW_EXE" install -q neovim >/dev/null 2>&1 else [ -d $HOME/.local ] || mkdir -p $HOME/.local [ "${have_curl}" ] && [ "${have_jq}" ] && { DL_URL=$(curl --silent "${API_URL}" \ | jq --raw-output '.assets | .[]?.browser_download_url' \ | grep "linux64\.tar\.gz$") } [ "${DL_URL}" ] && { [ "${have_wget}" ] && { TEMP_TGZ="$(mktemp --suffix=.tgz)" wget --quiet -O "${TEMP_TGZ}" "${DL_URL}" >/dev/null 2>&1 chmod 644 "${TEMP_TGZ}" mkdir -p /tmp/nvim$$ tar -C /tmp/nvim$$ -xzf "${TEMP_TGZ}" if [ -f /tmp/nvim$$/nvim-linux64/bin/nvim ]; then tar -C /tmp/nvim$$/nvim-linux64 -cf /tmp/nvim-$$.tar . tar -C ${HOME}/.local -xf /tmp/nvim-$$.tar chmod 755 ${HOME}/.local/bin/nvim else for nvimbin in /tmp/"nvim$$"/*/bin/nvim /tmp/"nvim$$"/bin/nvim; do [ "${nvimbin}" == "/tmp/nvim$$/*/bin/nvim" ] && continue [ -f "${nvimbin}" ] && { nvimdir=$(dirname ${nvimbin}) nvimdir=$(dirname ${nvimdir}) tar -C ${nvimdir} -cf /tmp/nvim-$$.tar . tar -C ${HOME}/.local -xf /tmp/nvim-$$.tar chmod 755 ${HOME}/.local/bin/nvim break } done fi rm -f "${TEMP_TGZ}" rm -f /tmp/nvim-$$.tar rm -rf /tmp/nvim$$ } } fi fi [ "$quiet" ] || printf " done" if [ "$debug" ]; then calc_elapsed printf "\nInstall Neovim elapsed time = %s${ELAPSED}\n" fi } install_neovim_head() { [ "${use_homebrew}" ] && "$BREW_EXE" link -q libuv >/dev/null 2>&1 log "Building and installing nightly Neovim ..." if [ "$debug" ]; then START_SECONDS=$(date +%s) if [ "${use_homebrew}" ]; then "$BREW_EXE" install --HEAD neovim else [ -d /tmp/neovim$$ ] && rm -rf /tmp/neovim$$ git clone https://github.com/neovim/neovim.git /tmp/neovim$$ cd /tmp/neovim$$ rm -f ${HOME}/.local/bin/nvim rm -rf ${HOME}/.local/share/nvim make CMAKE_BUILD_TYPE=Release \ CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=${HOME}/.local" make install cd rm -rf /tmp/neovim$$ fi else if [ "${use_homebrew}" ]; then "$BREW_EXE" install -q --HEAD neovim >/dev/null 2>&1 else [ -d /tmp/neovim$$ ] && rm -rf /tmp/neovim$$ git clone https://github.com/neovim/neovim.git /tmp/neovim$$ >/dev/null 2>&1 cd /tmp/neovim$$ rm -f ${HOME}/.local/bin/nvim rm -rf ${HOME}/.local/share/nvim make CMAKE_BUILD_TYPE=Release \ CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX=${HOME}/.local" >/dev/null 2>&1 make install >/dev/null 2>&1 cd rm -rf /tmp/neovim$$ fi fi if [ "$debug" ]; then calc_elapsed printf "\nInstall Neovim elapsed time = %s${ELAPSED}\n" fi [ "$quiet" ] || printf " done" } check_python() { brew_path=$(command -v brew) [ "${brew_path}" ] || { [ "${BREW_EXE}" == "brew" ] || { [ "${BREW_EXE}" ] && brew_path="${BREW_EXE}" } } [ "${brew_path}" ] || { [ "$HOMEBREW_HOME" == "Unknown" ] || { [ "$HOMEBREW_HOME" ] && brew_path="${HOMEBREW_HOME}/bin/brew" } [ "${brew_path}" ] || { if [ -x /home/linuxbrew/.linuxbrew/bin/brew ]; then HOMEBREW_HOME="/home/linuxbrew/.linuxbrew" brew_path="${HOMEBREW_HOME}/bin/brew" else if [ -x /usr/local/bin/brew ]; then HOMEBREW_HOME="/usr/local" brew_path="${HOMEBREW_HOME}/bin/brew" else if [ -x /opt/homebrew/bin/brew ]; then HOMEBREW_HOME="/opt/homebrew" brew_path="${HOMEBREW_HOME}/bin/brew" fi fi fi } } brew_dir=$(dirname "$brew_path") if [ -x ${brew_dir}/python3 ]; then PYTHON="${brew_dir}/python3" else PYTHON=$(command -v python3) fi } check_ruby() { brew_path=$(command -v brew) brew_dir=$(dirname "$brew_path") if [ -x "$brew_dir"/ruby ]; then RUBY="${brew_dir}/ruby" else RUBY=$(command -v ruby) fi if [ -x "$brew_dir"/gem ]; then GEM="${brew_dir}/gem" else GEM=$(command -v gem) fi } # Brew doesn't create a python symlink so we do so here link_python() { python3_path=$(command -v python3) [ "$python3_path" ] && { python_dir=$(dirname "$python3_path") if [ -w "$python_dir" ]; then rm -f "$python_dir"/python ln -s "$python_dir"/python3 "$python_dir"/python fi } } install_extra() { [ "$quiet" ] || printf "\nInstalling extra language servers and tools" for pkg in luarocks julia php composer do plat_install ${pkg} done if command -v lemonade >/dev/null 2>&1; then log "Using previously installed lemonade" else [ "${darwin}" ] || { if [ -x ${HOME}/.local/bin/lemonade ] then log "Existing ~/.local/bin/lemonade. Skipping installation of lemonade." else [[ $architecture =~ "arm" || $architecture =~ "aarch64" ]] || { OWNER=lemonade-command PROJECT=lemonade API_URL="https://api.github.com/repos/${OWNER}/${PROJECT}/releases/latest" DL_URL= [ "${have_curl}" ] && [ "${have_jq}" ] && { DL_URL=$(curl --silent "${API_URL}" \ | jq --raw-output '.assets | .[]?.browser_download_url' \ | grep "linux_amd64\.tar\.gz$") } [ "${DL_URL}" ] && { [ "${have_wget}" ] && { log "Installing lemonade ..." TEMP_TGZ="$(mktemp --suffix=.tgz)" wget --quiet -O "${TEMP_TGZ}" "${DL_URL}" >/dev/null 2>&1 chmod 644 "${TEMP_TGZ}" mkdir -p /tmp/lmnd$$ tar -C /tmp/lmnd$$ -xzf "${TEMP_TGZ}" [ -f /tmp/lmnd$$/lemonade ] && { cp /tmp/lmnd$$/lemonade ${HOME}/.local/bin/lemonade chmod 755 ${HOME}/.local/bin/lemonade } rm -f "${TEMP_TGZ}" rm -rf /tmp/lmnd$$ [ "$quiet" ] || printf " done" } } } fi } fi have_check=$(type -p luacheck) [ "${have_check}" ] || { have_rocks=$(type -p luarocks) [ "${have_rocks}" ] && { luarocks --local install luacheck > /dev/null 2>&1 } } printf "\nAdding luarocks bin to PATH in shell initialization file(s)" if [ -f "${HOME}/.bashrc" ]; then grep "luarocks/bin" "${HOME}/.bashrc" >/dev/null || { echo '# Luarocks bin path' >>"${HOME}/.bashrc" echo '[ -d ${HOME}/.luarocks/bin ] && {' >>"${HOME}/.bashrc" echo ' export PATH="${HOME}/.luarocks/bin${PATH:+:${PATH}}"' >>"${HOME}/.bashrc" echo '}' >>"${HOME}/.bashrc" } else echo '# Luarocks bin path' >"${HOME}/.bashrc" echo '[ -d ${HOME}/.luarocks/bin ] && {' >>"${HOME}/.bashrc" echo ' export PATH="${HOME}/.luarocks/bin${PATH:+:${PATH}}"' >>"${HOME}/.bashrc" echo '}' >>"${HOME}/.bashrc" fi [ -f "${HOME}/.zshrc" ] && { grep "luarocks/bin" "${HOME}/.zshrc" >/dev/null || { echo '# Luarocks bin path' >>"${HOME}/.zshrc" echo '[ -d ${HOME}/.luarocks/bin ] && {' >>"${HOME}/.zshrc" echo ' export PATH="${HOME}/.luarocks/bin${PATH:+:${PATH}}"' >>"${HOME}/.zshrc" echo '}' >>"${HOME}/.zshrc" } } } nvm_default_install_dir() { [ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm" } nvm_install_dir() { if [ -n "$NVM_DIR" ]; then printf %s "${NVM_DIR}" else nvm_default_install_dir fi } install_tools() { # Check for n node version manager have_n=$(type -p n) [ "${have_n}" ] && { n list 2>&1 | grep node > /dev/null || have_n= } [ "${have_n}" ] && { printf "\nIt appears the 'n' node version manager is installed" printf "\nLazyman uses the 'nvm' node version manager" printf "\nResolve any node version mismatch post-initialization\n" } dir_nvm=$(nvm_install_dir) if [ -d "${dir_nvm}/.git" ]; then export NVM_DIR="${dir_nvm}" else if [ -d "${HOME}/.config/nvm/.git" ]; then if [ -d "${HOME}/.nvm/.git" ]; then export NVM_DIR="${HOME}/.nvm" else export NVM_DIR="${HOME}/.config/nvm" fi else export NVM_DIR="${HOME}/.nvm" fi fi HERE=$(pwd) if [ -d "${NVM_DIR}" ]; then log "Verifying latest version of nvm ..." cd "$NVM_DIR" git fetch --tags origin > /dev/null 2>&1 git checkout \ `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)` \ > /dev/null 2>&1 [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" cd "${HERE}" [ "$quiet" ] || printf " done" else log "Installing nvm node version manager ..." git clone https://github.com/nvm-sh/nvm.git "$NVM_DIR" > /dev/null 2>&1 cd "$NVM_DIR" git checkout \ `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)` \ > /dev/null 2>&1 if [ -x install.sh ]; then ./install.sh > /dev/null 2>&1 else [ -f install.sh ] && { chmod 755 install.sh ./install.sh > /dev/null 2>&1 } fi cd "${HERE}" [ "$quiet" ] || printf " done" fi log "Verifying latest version of node with nvm ..." [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" nvm install node --reinstall-packages-from=node > /dev/null 2>&1 nvm install node > /dev/null 2>&1 [ "$quiet" ] || printf " done" log "Verifying latest version of npm with nvm ..." nvm install-latest-npm > /dev/null 2>&1 [ "$quiet" ] || printf " done" [ "$quiet" ] || printf "\nInstalling language servers and tools" plat_install ccls [ "${use_homebrew}" ] && { "$BREW_EXE" link --overwrite --quiet ccls >/dev/null 2>&1 } if command -v "cargo" >/dev/null 2>&1; then log "Using previously installed cargo" else log "Installing cargo ..." [ "$debug" ] && START_SECONDS=$(date +%s) if [ "${use_homebrew}" ]; then "$BREW_EXE" install --quiet "rust" >/dev/null 2>&1 [ $? -eq 0 ] || "$BREW_EXE" link --overwrite --quiet "rust" >/dev/null 2>&1 else RUST_URL="https://sh.rustup.rs" curl -fsSL "${RUST_URL}" >/tmp/rust-$$.sh [ $? -eq 0 ] || { rm -f /tmp/rust-$$.sh curl -kfsSL "${RUST_URL}" >/tmp/rust-$$.sh [ -f /tmp/rust-$$.sh ] && { cat /tmp/rust-$$.sh | sed -e "s/--show-error/--insecure --show-error/" >/tmp/ins$$ cp /tmp/ins$$ /tmp/rust-$$.sh rm -f /tmp/ins$$ } } [ -f /tmp/rust-$$.sh ] && sh /tmp/rust-$$.sh -y >/dev/null 2>&1 rm -f /tmp/rust-$$.sh fi if [ "$debug" ]; then calc_elapsed printf " elapsed time = %s${ELAPSED}" fi fi if ! command -v "cargo" >/dev/null 2>&1; then [ -x "${HOME}"/.cargo/bin/cargo ] && { export PATH="$HOME/.cargo/bin:$PATH" } fi [ "$quiet" ] || printf "\nInstalling npm and treesitter dependencies" # First try to install tree-sitter-cli with cargo then npm if command -v tree-sitter >/dev/null 2>&1; then log "Using previously installed tree-sitter cli" else if command -v "cargo" >/dev/null 2>&1; then log "Installing tree-sitter cli with cargo ..." cargo install tree-sitter-cli >/dev/null 2>&1 [ "$quiet" ] || printf " done" fi fi if ! command -v tldr >/dev/null 2>&1; then if [ "${use_homebrew}" ]; then brew_install tealdeer else if [[ $architecture =~ "arm" || $architecture =~ "aarch64" ]]; then larch="arm-musleabi" else larch="x86_64-musl" fi OWNER=dbrgn PROJECT=tealdeer API_URL="https://api.github.com/repos/${OWNER}/${PROJECT}/releases/latest" DL_URL= [ "${have_curl}" ] && [ "${have_jq}" ] && { DL_URL=$(curl --silent "${API_URL}" \ | jq --raw-output '.assets | .[]?.browser_download_url' \ | grep "linux-${larch}$") } [ "${DL_URL}" ] && { [ "${have_wget}" ] && { log "Installing tealdeer ..." TEMP_TGZ="$(mktemp --suffix=.bin)" wget --quiet -O "${TEMP_TGZ}" "${DL_URL}" >/dev/null 2>&1 [ -d ${HOME}/.local/bin ] || mkdir -p ${HOME}/.local/bin cp "${TEMP_TGZ}" ${HOME}/.local/bin/tldr [ -f ${HOME}/.local/bin/tldr ] && { chmod 755 ${HOME}/.local/bin/tldr ${HOME}/.local/bin/tldr --update > /dev/null 2>&1 } rm -f "${TEMP_TGZ}" [ "$quiet" ] || printf " done" } } fi fi if command -v ascii-image-converter >/dev/null 2>&1; then log "Using previously installed ascii-image-converter" else if [ "${use_homebrew}" ]; then log "Installing ascii-image-converter ..." "$BREW_EXE" install --quiet \ TheZoraiz/ascii-image-converter/ascii-image-converter >/dev/null 2>&1 [ "$quiet" ] || printf " done" else OWNER=TheZoraiz PROJECT=ascii-image-converter API_URL="https://api.github.com/repos/${OWNER}/${PROJECT}/releases/latest" DL_URL= [ "${have_curl}" ] && [ "${have_jq}" ] && { DL_URL=$(curl --silent "${API_URL}" \ | jq --raw-output '.assets | .[]?.browser_download_url' \ | grep "Linux_amd64") } [ "${DL_URL}" ] && { [ "${have_wget}" ] && { log "Installing ascii-image-converter ..." TEMP_TGZ="$(mktemp --suffix=.bin)" wget --quiet -O "${TEMP_TGZ}" "${DL_URL}" >/dev/null 2>&1 chmod 644 "${TEMP_TGZ}" mkdir -p /tmp/ascc$$ [ -d ${HOME}/.local/bin ] || mkdir -p ${HOME}/.local/bin tar -C /tmp/ascc$$ -xzf "${TEMP_TGZ}" for asccbin in /tmp/"ascc$$"/*/ascii-image-converter /tmp/"ascc$$"/ascii-image-converter do [ "${asccbin}" == "/tmp/ascc$$/*/ascii-image-converter" ] && continue [ -f "${asccbin}" ] && { cp "${asccbin}" ${HOME}/.local/bin/ascii-image-converter [ -f ${HOME}/.local/bin/ascii-image-converter ] && { chmod 755 ${HOME}/.local/bin/ascii-image-converter break } } done rm -f "${TEMP_TGZ}" rm -rf /tmp/ascc$$ [ "$quiet" ] || printf " done" } } fi fi have_npm=$(type -p npm) [ "$have_npm" ] && { if ! command -v tree-sitter >/dev/null 2>&1; then log "Installing tree-sitter command line npm package ..." npm i -g tree-sitter-cli >/dev/null 2>&1 [ "$quiet" ] || printf " done" fi log "Installing Neovim npm package ..." npm i -g neovim >/dev/null 2>&1 [ "$quiet" ] || printf " done" log "Installing fd-find package ..." npm i -g fd-find >/dev/null 2>&1 [ "$quiet" ] || printf " done" if command -v cspell >/dev/null 2>&1; then log "Using previously installed cspell" else log "Installing cspell npm package ..." npm i -g cspell >/dev/null 2>&1 [ "$quiet" ] || printf " done" fi if command -v tsserver >/dev/null 2>&1; then log "Using previously installed typescript package" else log "Installing typescript npm package ..." npm i -g typescript >/dev/null 2>&1 [ "$quiet" ] || printf " done" fi if command -v eslint_d >/dev/null 2>&1; then log "Using previously installed eslint_d" else log "Installing eslint_d npm package ..." npm i -g eslint_d >/dev/null 2>&1 [ "$quiet" ] || printf " done" fi log "Installing the icon font for Visual Studio Code ..." npm i -g @vscode/codicons >/dev/null 2>&1 [ "$quiet" ] || printf " done" } if command -v tree-sitter >/dev/null 2>&1; then tree-sitter init-config >/dev/null 2>&1 fi for pkg in bat lsd figlet luarocks lolcat xsel do plat_install "${pkg}" done if ! command -v lsd >/dev/null 2>&1; then if command -v "cargo" >/dev/null 2>&1; then log "Installing lsd with cargo ..." cargo install lsd >/dev/null 2>&1 [ "$quiet" ] || printf " done" fi fi [ "$quiet" ] || printf "\nInstalling Python dependencies" check_python [ "$PYTHON" ] || { # Could not find Python if [ "${use_homebrew}" ]; then log 'Installing Python with Homebrew ...' "$BREW_EXE" install --quiet python >/dev/null 2>&1 [ $? -eq 0 ] || "$BREW_EXE" link --overwrite --quiet python >/dev/null 2>&1 else log 'Installing Python ...' platform_install python3 fi check_python [ "$quiet" ] || printf " done" } link_python [ "$PYTHON" ] && { PIPARGS="--user --no-cache-dir --upgrade --force-reinstall" log 'Upgrading pip, setuptools, wheel, doq, and pynvim ...' "$PYTHON" -m pip install ${PIPARGS} pip >/dev/null 2>&1 "$PYTHON" -m pip install ${PIPARGS} setuptools >/dev/null 2>&1 "$PYTHON" -m pip install ${PIPARGS} wheel >/dev/null 2>&1 "$PYTHON" -m pip install ${PIPARGS} pynvim doq >/dev/null 2>&1 [ "$quiet" ] || printf " done" log 'Installing black, beautysh, and ruff formatters/linters ...' "$PYTHON" -m pip install ${PIPARGS} beautysh >/dev/null 2>&1 "$PYTHON" -m pip install ${PIPARGS} black >/dev/null 2>&1 "$PYTHON" -m pip install ${PIPARGS} ruff >/dev/null 2>&1 [ "$quiet" ] || printf " done" [ "${native}" ] && [ "${debian}" ] && platform_install python3-venv [ "$quiet" ] || printf "\n\tInstalling neovim-remote (nvr) ..." if [ "${use_homebrew}" ]; then "$BREW_EXE" install -q neovim-remote >/dev/null 2>&1 else ${PYTHON} -m pip install ${PIPARGS} neovim-remote >/dev/null 2>&1 fi [ "$quiet" ] || printf " done" log 'Installing langchain, llama-cpp-python, and pygments ...' "$PYTHON" -m pip install ${PIPARGS} pygments >/dev/null 2>&1 "$PYTHON" -m pip install --user --no-cache-dir --force-reinstall \ langchain==0.0.177 llama-cpp-python==0.1.48 > /dev/null 2>&1 [ "$quiet" ] || printf " done" if command -v "flake8" >/dev/null 2>&1; then log "Using previously installed flake8" else log "Installing flake8 ..." ${PYTHON} -m pip install ${PIPARGS} flake8 >/dev/null 2>&1 fi [ "$quiet" ] || printf " done" if command -v "rich" >/dev/null 2>&1; then log "Using previously installed rich-cli" else log "Installing rich-cli ..." if [ "${use_homebrew}" ]; then "$BREW_EXE" install --quiet "rich-cli" >/dev/null 2>&1 [ $? -eq 0 ] || "$BREW_EXE" link --overwrite --quiet "rich-cli" >/dev/null 2>&1 else ${PYTHON} -m pip install ${PIPARGS} rich-cli >/dev/null 2>&1 fi fi [ "$quiet" ] || printf " done" if command -v "trash" >/dev/null 2>&1; then log "Using previously installed trash-cli" else log "Installing trash-cli ..." ${PYTHON} -m pip install ${PIPARGS} trash-cli >/dev/null 2>&1 fi [ "$quiet" ] || printf " done" if command -v "codespell" >/dev/null 2>&1; then log "Using previously installed codespell" else log "Installing codespell ..." ${PYTHON} -m pip install ${PIPARGS} codespell >/dev/null 2>&1 fi [ "$quiet" ] || printf " done" if command -v "misspell" >/dev/null 2>&1; then log "Using previously installed misspell" else log "Installing misspell ..." MISS_URL="https://git.io/misspell" curl -fsSL "$MISS_URL" >/tmp/miss-$$.sh [ $? -eq 0 ] || { rm -f /tmp/miss-$$.sh curl -kfsSL "$MISS_URL" >/tmp/miss-$$.sh } [ -f /tmp/miss-$$.sh ] && { chmod 755 /tmp/miss-$$.sh /tmp/miss-$$.sh -b ${HOME}/.local/bin >/dev/null 2>&1 rm -f /tmp/miss-$$.sh } fi [ "$quiet" ] || printf " done" } [ "$quiet" ] || printf "\nInstalling Ruby dependencies" check_ruby [ "$RUBY" ] || { # Could not find Ruby if [ "${use_homebrew}" ]; then log 'Installing Ruby with Homebrew ...' "$BREW_EXE" install --quiet ruby >/dev/null 2>&1 [ $? -eq 0 ] || "$BREW_EXE" link --overwrite --quiet ruby >/dev/null 2>&1 else log 'Installing Ruby ...' platform_install ruby fi check_ruby [ "$quiet" ] || printf " done" } [ "${native}" ] && { [ "${debian}" ] && platform_install ruby-dev [ "${redhat}" ] || [ "${suse}" ] || [ "${void}" ] && { platform_install ruby-devel } } [ "$GEM" ] && { log "Installing Ruby neovim gem ..." ${GEM} install neovim --user-install >/dev/null 2>&1 [ "$quiet" ] || printf " done" } if command -v deno >/dev/null 2>&1; then log "Using previously installed deno" else log "Installing deno ..." export DENO_INSTALL="${HOME}/.local" curl -fsSL https://deno.land/x/install/install.sh | sh > /dev/null 2>&1 [ "$quiet" ] || printf " done" fi if command -v tectonic >/dev/null 2>&1; then log "Using previously installed tectonic" else log "Installing tectonic ..." curl --proto '=https' --tlsv1.2 -fsSL \ https://drop-sh.fullyjustified.net |sh > /dev/null 2>&1 [ -f tectonic ] && { chmod +x tectonic [ -d ${HOME}/.local/bin ] || mkdir -p ${HOME}/.local/bin mv tectonic ${HOME}/.local/bin } [ "$quiet" ] || printf " done" fi GHUC="https://raw.githubusercontent.com" JETB_URL="${GHUC}/JetBrains/JetBrainsMono/master/install_manual.sh" [ "$quiet" ] || printf "\n\tInstalling JetBrains Mono font ... " curl -fsSL "$JETB_URL" >/tmp/jetb-$$.sh [ $? -eq 0 ] || { rm -f /tmp/jetb-$$.sh curl -kfsSL "$JETB_URL" >/tmp/jetb-$$.sh } [ -f /tmp/jetb-$$.sh ] && { chmod 755 /tmp/jetb-$$.sh /bin/bash -c "/tmp/jetb-$$.sh" >/dev/null 2>&1 rm -f /tmp/jetb-$$.sh } [ "$quiet" ] || printf "done\n" } main() { check_prerequisites get_platform [ "$proceed" ] || { [ "${alpine}" ] || [ "${arch}" ] || [ "${debian}" ] \ || [ "${redhat}" ] || [ "${suse}" ] || [ "${void}" ] && { prompt= if [ "${native}" ]; then printf "\n\n${PKGMGR} will be used to install dependencies and tools." printf "\nThis requires 'sudo' (root) privilege.\n" have_brew=$(type -p brew) [ "${have_brew}" ] && { prompt=1 printf "\nAn existing Homebrew installation has been detected.\n" printf "\nEnter 'h' to use Homebrew, 'n' or <Enter> to use ${PKGMGR}" } else prompt=1 printf "\n\nHomebrew will be used to install dependencies and tools.\n" printf "\nEnter 'h' or <Enter> to use Homebrew, 'n' to use ${PKGMGR}" fi if [ "${prompt}" ]; then printf "\nEnter 'q' to exit the Neovim installer\n" while true; do read -r -p "Do you wish to use ${PKGMGR} or Homebrew ? (h/n/q) " yn case $yn in [Nn]*) printf "\nUsing ${PKGMGR} to install dependencies and tools\n" native=1 break ;; [Hh]*) printf "\nUsing Homebrew to install dependencies and tools\n" native= break ;; [Qq]*) printf "\nExiting Neovim installer without installing dependencies or tools\n" exit 1 ;; '') if [ "${native}" ]; then printf "\nUsing ${PKGMGR} to install dependencies and tools\n" else printf "\nUsing Homebrew to install dependencies and tools\n" fi break ;; *) printf "\nPlease answer 'h' or 'n'.\n" ;; esac done fi } } if [ "${darwin}" ]; then # Always use Homebrew on macOS use_homebrew=1 else # All other platforms, use Homebrew only when instructed [ "${native}" ] || use_homebrew=1 fi [ "${use_homebrew}" ] && install_homebrew install_neovim_dependencies if command -v nvim >/dev/null 2>&1; then if [ "$nvim_head" ]; then printf "\nInstalling nightly build of Neovim" install_neovim_head else # Check if installed nvim is v0.9.0 or greater ver_head=$(nvim --version | head -1 | awk '{ print 2ドル }') nvim_ver=$(echo ${ver_head} | awk -F '-' '{ print 1ドル }' | sed -e "s/^v//") if [ "${nvim_ver}" ]; then compare_versions "${nvim_ver}" "0.9.0" >/dev/null 2>&1 [ $? -eq 2 ] && { printf "\nCurrently installed Neovim is less than version 0.9" printf "\nInstalling/upgrading Neovim" install_neovim } else # Don't know, install anyway printf "\nInstalling/upgrading Neovim" install_neovim fi fi else if [ "$nvim_head" ]; then install_neovim_head else install_neovim fi fi install_tools [ "${alltools}" ] && install_extra } APT= DNF= nvim_head= quiet= debug= darwin= alpine= arch= debian= redhat= suse= void= have_apk=$(type -p apk) have_apt=$(type -p apt) have_aptget=$(type -p apt-get) have_dnf=$(type -p dnf) have_pac=$(type -p pacman) have_xbps=$(type -p xbps-install) have_yum=$(type -p yum) have_zyp=$(type -p zypper) alltools= native=1 proceed= architecture=$(uname -m) while getopts "adhnqy" flag; do case $flag in a) alltools=1 ;; d) debug=1 ;; n) nvim_head=1 ;; h) native= PKGMGR="Homebrew" ;; q) quiet=1 ;; y) proceed=1 ;; *) ;; esac done currlimit=$(ulimit -n) hardlimit=$(ulimit -Hn) [ "$hardlimit" == "unlimited" ] && hardlimit=9999 if [ "$hardlimit" -gt 4096 ]; then ulimit -n 4096 else ulimit -n "$hardlimit" fi install_bash= [ "$debug" ] && MAIN_START_SECONDS=$(date +%s) main [ "$debug" ] && { MAIN_FINISH_SECONDS=$(date +%s) MAIN_ELAPSECS=$((MAIN_FINISH_SECONDS - MAIN_START_SECONDS)) MAIN_ELAPSED=$(eval "echo $(date -ud "@$MAIN_ELAPSECS" +'$((%s/3600/24)) days %H hr %M min %S sec')") printf "\nTotal elapsed time = %s${MAIN_ELAPSED}\n" } ulimit -n "$currlimit"