diff --git a/init.sh b/init.sh index 47c4d43..195d869 100755 --- a/init.sh +++ b/init.sh @@ -39,6 +39,7 @@ ln -s $HOME/.dotfiles/nvim/ $HOME/.config/nvim ln -s $HOME/.dotfiles/tmux/ $HOME/.config/tmux ln -s $HOME/.dotfiles/zellij/ $HOME/.config/zellij ln -s $HOME/.dotfiles/mygvm/ $HOME/.config/mygvm +ln -s $HOME/.dotfiles/myzvm/ $HOME/.config/myzvm ln -s $HOME/.config/nvim/init.vim $HOME/.vimrc mv $HOME/.zshrc $HOME/.zshrc.bak && ln -s $HOME/.config/zsh/.zshrc $HOME/.zshrc @@ -56,6 +57,13 @@ sudo ln -s $HOME/.dotfiles/mygvm/mygvm /usr/local/bin/mygvm # Install Go mygvm install go1.22.0 +# Install myzvm +mkdir -p $HOME/.zig/downloads +sudo ln -s $HOME/.dotfiles/myzvm/myzvm /usr/local/bin/myzvm + +# Install Zig +myzvm install nightly + # Install merge-main.sh mkdir -p $HOME/.local/bin sudo ln -s $HOME/.dotfiles/zsh/merge-main.sh $HOME/.local/bin/merge-main.sh diff --git a/mygvm/mygvm b/mygvm/mygvm index 17d0fe5..088511a 100755 --- a/mygvm/mygvm +++ b/mygvm/mygvm @@ -148,11 +148,23 @@ elif [[ $1 == 'uninstall' ]]; then elif [[ $1 == 'install' ]]; then install_version $2 elif [[ $1 == 'use' ]]; then - check_exists $2 - if [[ $exists == true ]]; then - link_version $2 + if [[ $2 == 'local' ]]; then + go_mod_json=$(go mod edit -json) + if [[ $? == 1 ]]; then + echo "unable to find go.mod" + echo "using $(go version)" + exit 1 + else + version_to_use=go$(jq -r .Go <<< $go_mod_json) + fi else - prompt_install $2 + version_to_use=$2 + fi + check_exists $version_to_use + if [[ $exists == true ]]; then + link_version $version_to_use + else + prompt_install $version_to_use fi install_modules elif [[ $1 == 'modules' ]]; then diff --git a/myzvm/myzvm b/myzvm/myzvm new file mode 100755 index 0000000..4b30031 --- /dev/null +++ b/myzvm/myzvm @@ -0,0 +1,194 @@ +#!/bin/bash +list_versions() { + echo "installed versions:" + for i in "$HOME"/.zig/zig0*; do basename "$i"; done + echo "" +} + +install_version() { + check_valid_patch $1 + if [[ $valid != 'true' ]]; then + echo "invalid version $1" + echo "using $(zig version)" + exit 1 + fi + + fname="$HOME/.zig/downloads/zig-$zigos-$zigarch-$1" + tarball_name="$fname.tar.xz" + + url_subdir="download/$1" + if [[ $1 =~ .*dev.* ]]; then + url_subdir="builds" + fi + + if [[ ! -f $fname ]]; then + curl -Lo $tarball_name https://ziglang.org/$url_subdir/zig-$zigos-$zigarch-$1.tar.xz + fi + cd $download_dir + tar -xJf $tarball_name + mv $fname/ ../$1 + check_exists $1 + link_version $1 + + install_modules +} + +link_version() { + if [[ $exists == 'true' ]]; then + ln -sfn $zig_dir/$1 $zig_dir/zig + fi +} + +check_valid_minor() { + if [[ $1 =~ 0\.[0-9]{1,2} ]]; then + valid='true' + fi +} + +check_valid_patch() { + if [[ $1 =~ 0\.[0-9]{1,2}\.[0-9]{1,2}.* ]]; then + valid='true' + fi +} + +check_exists() { + if [[ -d $zig_dir/$1 ]]; then + exists='true' + fi +} + +remove_version() { + check_exists $1 + if [[ $exists == 'true' ]]; then + if [[ $current_link == $1 ]]; then + echo "cannot remove version $1 because it is currently in use" + else + rm -rf $zig_dir/$1 + echo "removed version $1" + fi + else + echo "version $1 not installed" + fi +} + +get_latest_patch_for_minor() { + version=$(curl -s "https://ziglang.org/download/index.json" | grep -o "zig-linux-x86_64-$1.*.tar.xz" | head -n 1 | tr -d '\r\n' | sed 's/zig-linux-x86_64-\(.*\).tar.xz/\1/g') + if [[ $version == '' ]]; then + echo "could not determine latest version for $1." + exit 1 + else + echo "latest $1 patch: $version" + fi +} + +get_latest_patch_for_nightly() { + get_latest_patch_for_minor +} + +prompt_install() { + if [[ "$1" == "" ]]; then + echo "installing nightly build" + valid=true + get_latest_patch_for_nightly + else + echo "$1 not found in $zig_dir" + list_versions + check_valid_patch $1 + version=$1 + fi + + if [[ $valid == 'true' ]]; then + echo "attempt to download and install? [y/n]" + read input + if [[ $input == 'y' ]]; then + install_version $version + fi + else + check_valid_minor $version + if [[ $valid == 'true' ]]; then + get_latest_patch_for_minor $version + check_exists $version + if [[ $exists == 'true' ]]; then + link_version $version + else + prompt_install $version + fi + else + echo "invalid version $version" + echo "using $(zig version)" + exit 1 + fi + fi +} + +install_modules() { + echo "no modules to install for zig" +} +# fname="$HOME/.config/mygvm/modules_to_install" +# echo "attempting to install nvim required binaries and modules at $fname" +# [[ ! -f $fname ]] && echo "no modules file at $fname" && return + +# while IFS= read -r line; do +# if [[ "$line" != "" ]]; then +# echo "running go install $line" +# go install $line +# fi +# done < "$HOME/.config/mygvm/modules_to_install" + +# [[ $(which nvim) ]] && nvim --headless +GoInstallBinaries +q +# echo "" +# } + +zig_dir="$HOME/.zig" +download_dir="$zig_dir/downloads" +mkdir -p "$download_dir" +current_link=$(basename $(readlink $HOME/.zig/zig)) +uname_m=$(uname -m) +zigarch='x86_64' +if [[ $uname_m == 'arm64' || $uname_m == 'aarch64' ]]; then + zigarch='aarch64' +fi +zigos='linux' +if [[ $(uname) == 'Darwin' ]]; then + zigos='darwin' +fi +valid='false' +exists='false' + +version='' + +check_exists $1 +if [[ $1 == '' ]]; then + list_versions +elif [[ $1 == 'list' ]]; then + list_versions +elif [[ $1 == 'remove' ]]; then + remove_version $2 +elif [[ $1 == 'uninstall' ]]; then + remove_version $2 +elif [[ $1 == 'install' ]]; then + install_version $2 +elif [[ $1 == 'use' ]]; then + if [[ $2 == 'nightly' ]]; then + version_to_use= + exists=false + else + version_to_use=$2 + check_exists $version_to_use + fi + if [[ $exists == true ]]; then + link_version $version_to_use + else + prompt_install $version_to_use + fi + install_modules +elif [[ $1 == 'modules' ]]; then + install_modules +elif [[ $exists == 'true' ]]; then + link_version $1 +else + prompt_install $1 +fi + +echo "using $(zig version)" + diff --git a/nvim/lua/lsp.lua b/nvim/lua/lsp.lua index afd3001..1c1441c 100644 --- a/nvim/lua/lsp.lua +++ b/nvim/lua/lsp.lua @@ -99,3 +99,13 @@ require('lspconfig')['lua_ls'].setup { Lua = {} } } +require('lspconfig')['zls'].setup { + on_attach = on_attach, + capabilities = capabilities, + cmd = { '/home/jacob/src/github.com/zigtools/zls/zig-out/bin/zls' }, + settings = { + zls = { + zig_exe_path = '/home/jacob/.zig/zig/zig', + } + } +} diff --git a/nvim/lua/plugins/init.lua b/nvim/lua/plugins/init.lua index e19abf9..ddbb738 100644 --- a/nvim/lua/plugins/init.lua +++ b/nvim/lua/plugins/init.lua @@ -25,6 +25,8 @@ Plug 'nvim-treesitter/nvim-treesitter' Plug('nvim-telescope/telescope-fzf-native.nvim', { ['do'] = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' }) +Plug('nvim-telescope/telescope-live-grep-args.nvim') + Plug 'nvim-telescope/telescope.nvim' Plug 'airblade/vim-gitgutter' @@ -60,6 +62,8 @@ Plug 'jamestthompson3/nvim-remote-containers' Plug 'epwalsh/obsidian.nvim' +Plug 'ziglang/zig.vim' + vim.call('plug#end') require("plugins/airline") diff --git a/nvim/lua/plugins/telescope.lua b/nvim/lua/plugins/telescope.lua index 0ab4ada..124fa46 100644 --- a/nvim/lua/plugins/telescope.lua +++ b/nvim/lua/plugins/telescope.lua @@ -1,6 +1,9 @@ local map = vim.api.nvim_set_keymap +require("telescope").load_extension("live_grep_args") + local tele = require('telescope.builtin') +local tele_ext = require('telescope').extensions local telemap = function(cmd, cb) map('n', cmd, '', { @@ -12,7 +15,7 @@ end telemap('ff', function() tele.find_files({ hidden = true, file_ignore_patterns = {'^.git'} }) end) -telemap('fg', tele.live_grep) +telemap('fg', tele_ext.live_grep_args.live_grep_args) telemap('fb', tele.buffers) diff --git a/zsh/.zshrc b/zsh/.zshrc index a2e0edb..d597dff 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -7,6 +7,9 @@ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" # If you come from bash you might have to change your $PATH. export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:/opt/local/bin:$PATH +# Add the zig path used by myzvm +export PATH=$HOME/.zig/zig:$PATH + ulimit -n 65536 200000 ulimit -f unlimited @@ -39,6 +42,7 @@ alias kci='git commit --allow-empty --message "kick CI" && git push' alias cddf='cd $HOME/.dotfiles' alias nvdf='cddf && nvim $HOME/.dotfiles/README.md' alias cdjb='cd $HOME/src/github.com/jbohanon' +alias cdgh='cd $HOME/src/github.com' alias cdo='cd $HOME/Documents/obsidian/work' alias nvo='cdo && nvim .'