From 4d4e715cb1a331a1075a5d449bf8328b1c4386e9 Mon Sep 17 00:00:00 2001 From: mitchell Date: Sat, 27 Jul 2024 13:55:08 -0400 Subject: [PATCH 01/17] Switch from leap to flash.nvim and add biome to ALE config --- .config/fish/functions/define_aliases.fish | 1 + .config/fish/functions/ssh_agent_startup.fish | 2 +- .config/nvim/config.vim | 25 +++++++++-------- .config/nvim/init.lua | 27 +++++++++++++++---- sync | 2 +- 5 files changed, 37 insertions(+), 20 deletions(-) diff --git a/.config/fish/functions/define_aliases.fish b/.config/fish/functions/define_aliases.fish index 51955bc..48dad9f 100644 --- a/.config/fish/functions/define_aliases.fish +++ b/.config/fish/functions/define_aliases.fish @@ -14,6 +14,7 @@ function define_aliases -a uname -d 'Defines aliases for commonly used commands' alias bb 'bun --bun' alias pn pnpm alias nv 'neovide --fork; and clear' + alias hx helix switch "$uname" case Linux diff --git a/.config/fish/functions/ssh_agent_startup.fish b/.config/fish/functions/ssh_agent_startup.fish index f95df36..9d4f8e9 100644 --- a/.config/fish/functions/ssh_agent_startup.fish +++ b/.config/fish/functions/ssh_agent_startup.fish @@ -1,5 +1,5 @@ function ssh_agent_startup -d 'Start ssh agent and set env vars' - if test -z "$SSH_AUTH_SOCK"; and test -z "$SSH_AGENT_PID" + if test -z "$SSH_AUTH_SOCK"; and test -z "$SSH_AGENT_PID"; and test -z "$SSH_CLIENT" eval (ssh-agent -c) >/dev/null 2>&1 end end diff --git a/.config/nvim/config.vim b/.config/nvim/config.vim index 27654e4..995e891 100644 --- a/.config/nvim/config.vim +++ b/.config/nvim/config.vim @@ -23,7 +23,6 @@ set termguicolors inoremap jj -let mapleader = ',' nnoremap f ALEFix nnoremap a ALEToggle nnoremap nn Neotree toggle show git_status @@ -61,10 +60,10 @@ let g:ale_completion_enabled = 0 let g:pencil#map#suspend_af = 'K' let g:ale_linters = { - \ 'javascript': ['eslint', 'stylelint'], - \ 'typescript': ['eslint', 'stylelint'], - \ 'javascriptreact': ['eslint', 'stylelint'], - \ 'typescriptreact': ['eslint', 'stylelint'], + \ 'javascript': ['eslint', 'stylelint', 'biome'], + \ 'typescript': ['eslint', 'stylelint', 'biome'], + \ 'javascriptreact': ['eslint', 'stylelint', 'biome'], + \ 'typescriptreact': ['eslint', 'stylelint', 'biome'], \ 'go': ['golint', 'go vet'], \ 'vue': ['eslint', 'stylelint'], \ 'make': ['checkmake'], @@ -86,17 +85,17 @@ let g:ale_linters = { let g:ale_fixers = { \ 'go': ['goimports', 'remove_trailing_lines', 'trim_whitespace'], \ 'graphql': ['prettier'], - \ 'javascript': ['prettier'], - \ 'typescript': ['prettier'], - \ 'javascriptreact': ['prettier'], - \ 'typescriptreact': ['prettier'], + \ 'javascript': ['prettier', 'biome'], + \ 'typescript': ['prettier', 'biome'], + \ 'javascriptreact': ['prettier', 'biome'], + \ 'typescriptreact': ['prettier', 'biome'], \ 'vue': ['prettier'], \ 'css': ['prettier'], - \ 'yaml': ['prettier'], - \ 'json': ['prettier'], + \ 'yaml': ['prettier', 'biome'], + \ 'json': ['prettier', 'biome'], \ 'dart': ['dartfmt'], - \ 'html': ['prettier'], - \ 'markdown': ['prettier'], + \ 'html': ['prettier', 'biome'], + \ 'markdown': ['prettier', 'biome'], \ 'make': ['remove_trailing_lines', 'trim_whitespace'], \ 'elixir': ['mix_format'], \ 'terraform': ['terraform'], diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index 3e2a293..dde1334 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -17,7 +17,7 @@ plug("nvim-tree/nvim-web-devicons") plug("ms-jpq/coq_nvim", { ["branch"] = "coq" }) plug("ms-jpq/coq.artifacts", { ["branch"] = "artifacts" }) plug("folke/noice.nvim") -plug("ggandor/leap.nvim") +plug("folke/flash.nvim") plug("folke/zen-mode.nvim") plug("folke/twilight.nvim") plug("neovim/nvim-lspconfig") @@ -67,13 +67,15 @@ require("lualine").setup({ require("zen-mode").setup({ window = { - backdrop = 1, + backdrop = 0.95, + }, + plugins = { + twilight = { enabled = false }, -- enable to start Twilight when zen mode opens }, }) require("symbols-outline").setup({ autofold_depth = 2, }) -require("leap").create_default_mappings() require("notify").setup({ background_colour = "#000000", @@ -111,6 +113,7 @@ require("nvim-treesitter.configs").setup({ "lua", "vim", "regex", + "bash", "fish", "typescript", "javascript", @@ -119,6 +122,8 @@ require("nvim-treesitter.configs").setup({ "elixir", "vue", "groovy", + "hcl", + "terraform", }, -- Automatically install missing parsers when entering buffer @@ -149,9 +154,21 @@ require("nvim-treesitter.configs").setup({ }, }) +-- Map Leader +vim.g.mapleader = "," + +-- Flash config +local flash = require("flash") +flash.setup() +vim.keymap.set({ "n", "x", "o" }, "s", flash.jump, { desc = "Flash" }) +vim.keymap.set({ "n", "x", "o" }, "S", flash.treesitter, { desc = "Flash Treesitter" }) +vim.keymap.set("o", "r", flash.remote, { desc = "Remote Flash" }) +vim.keymap.set({ "o", "x" }, "R", flash.treesitter_search, { desc = "Treesitter Search" }) +vim.keymap.set("c", "", flash.toggle, { desc = "Toggle Flash Search" }) + -- LSP Mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions -local opts = { noremap = true, silent = true } +local opts = { silent = true } vim.keymap.set("n", "d", vim.diagnostic.open_float, opts) vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts) vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts) @@ -165,7 +182,7 @@ local on_attach = function(client, bufnr) -- Mappings. -- See `:help vim.lsp.*` for documentation on any of the below functions - local bufopts = { noremap = true, silent = true, buffer = bufnr } + local bufopts = { silent = true, buffer = bufnr } vim.keymap.set("n", "h", vim.lsp.buf.hover, bufopts) vim.keymap.set("n", "", vim.lsp.buf.signature_help, bufopts) vim.keymap.set("n", "wa", vim.lsp.buf.add_workspace_folder, bufopts) diff --git a/sync b/sync index d49ba8a..d6315eb 100755 --- a/sync +++ b/sync @@ -92,7 +92,7 @@ end function install_nvim_plugins command -q nvim and nvim +PlugUpgrade +PlugUpdate +UpdateRemotePlugins +qa - and nvim +COQdeps +q +bnext + and nvim +COQdeps +bnext +bdelete end function sync_git_config From b55aab8a89e9686877c8c767a97bdb092fc2340f Mon Sep 17 00:00:00 2001 From: mitchell Date: Mon, 14 Apr 2025 01:24:25 -0400 Subject: [PATCH 02/17] Migrate Neovim to lazy.nvim and update dotfiles - Neovim: - Migrate from vim-plug to lazy.nvim. - Refactor config (`init.lua`, `config.vim`). - Replace Coq with blink.cmp, add CodeCompanion. - Fish: - Add aliases (`cl`, `ai`), env vars (`ANDROID_HOME`, `PYENV`). - Update keybindings and conditional tool initialization (starship, zoxide, fzf, pyenv). - Refine ASDF/Homebrew setup. - Git: Add aliases (`rs`, `rss`, `ap`). - Other: Update SKHD bindings and WezTerm path/settings. --- .config/fish/config.fish | 3 - .config/fish/functions/define_aliases.fish | 2 + .../functions/define_global_variables.fish | 9 +- .../functions/fish_user_key_bindings.fish | 18 +- .config/fish/functions/import_sources.fish | 25 +- .config/nvim/autoload/plug.vim | 2863 ----------------- .config/nvim/config.vim | 80 +- .config/nvim/init.lua | 481 ++- .gitconfig | 4 +- .skhdrc | 6 +- .wezterm.lua | 11 +- 11 files changed, 436 insertions(+), 3066 deletions(-) delete mode 100644 .config/nvim/autoload/plug.vim diff --git a/.config/fish/config.fish b/.config/fish/config.fish index 91582eb..59984c7 100644 --- a/.config/fish/config.fish +++ b/.config/fish/config.fish @@ -11,9 +11,6 @@ function configure_fish import_sources $uname define_aliases $uname ssh_agent_startup - starship init fish | source - zoxide init fish | source - fzf --fish | source end configure_fish diff --git a/.config/fish/functions/define_aliases.fish b/.config/fish/functions/define_aliases.fish index 48dad9f..3478f70 100644 --- a/.config/fish/functions/define_aliases.fish +++ b/.config/fish/functions/define_aliases.fish @@ -1,5 +1,6 @@ function define_aliases -a uname -d 'Defines aliases for commonly used commands' alias q exit + alias cl clear alias rcp 'rsync -aP' alias vg vagrant alias tf terraform @@ -15,6 +16,7 @@ function define_aliases -a uname -d 'Defines aliases for commonly used commands' alias pn pnpm alias nv 'neovide --fork; and clear' alias hx helix + alias ai aichat switch "$uname" case Linux diff --git a/.config/fish/functions/define_global_variables.fish b/.config/fish/functions/define_global_variables.fish index 68407ee..98cf61f 100644 --- a/.config/fish/functions/define_global_variables.fish +++ b/.config/fish/functions/define_global_variables.fish @@ -21,7 +21,13 @@ function define_global_variables -d 'Defines all and exclusively globally export set -gx LIBVIRT_DEFAULT_URI 'qemu:///system' - set -gx ANDROID_HOME $HOME/Android/Sdk + if test (uname) = "Darwin" + set -gx ANDROID_HOME $HOME/Library/Android/Sdk + else + set -gx ANDROID_HOME $HOME/Android/Sdk + end + + set -gx PYENV_ROOT $HOME/.pyenv fish_add_path $GOBIN \ $HOME/.local/bin \ @@ -31,6 +37,7 @@ function define_global_variables -d 'Defines all and exclusively globally export $HOME/.cargo/bin \ $HOME/.dotnet/tools \ $BUN_INSTALL/bin \ + $PYENV_ROOT/bin \ $ANDROID_HOME/emulator \ $ANDROID_HOME/platform-tools end diff --git a/.config/fish/functions/fish_user_key_bindings.fish b/.config/fish/functions/fish_user_key_bindings.fish index 2e8c3e2..7dbc2b7 100644 --- a/.config/fish/functions/fish_user_key_bindings.fish +++ b/.config/fish/functions/fish_user_key_bindings.fish @@ -1,12 +1,12 @@ function fish_user_key_bindings bind --mode insert jj "if commandline -P; commandline -f cancel; else; set fish_bind_mode default; commandline -f backward-char repaint-mode; end" - bind --mode insert ,a 'ssh_add; commandline -f repaint' - bind --mode insert ,p 'nvim +"Telescope git_files"; commandline -f repaint' - bind --mode insert ,f 'nvim +"Telescope find_files"; commandline -f repaint' - bind --mode insert ,n 'nvim .; commandline -f repaint' - bind --mode insert ,s 'sysz; commandline -f repaint' - bind --mode insert ,z 'zi; commandline -f repaint' - bind --mode insert ,t 'fzf-file-widget' - bind --mode insert ,r 'fzf-history-widget' - bind --mode insert ,c 'fzf-cd-widget' + bind --mode insert comma,a 'ssh_add; commandline -f repaint' + bind --mode insert comma,p 'nvim +"Telescope git_files"; commandline -f repaint' + bind --mode insert comma,f 'nvim +"Telescope find_files"; commandline -f repaint' + bind --mode insert comma,n 'nvim .; commandline -f repaint' + bind --mode insert comma,s 'sysz; commandline -f repaint' + bind --mode insert comma,z 'zi; commandline -f repaint' + bind --mode insert comma,t 'fzf-file-widget' + bind --mode insert comma,r 'fzf-history-widget' + bind --mode insert comma,c 'fzf-cd-widget' end diff --git a/.config/fish/functions/import_sources.fish b/.config/fish/functions/import_sources.fish index bdc95ac..a6b62bf 100644 --- a/.config/fish/functions/import_sources.fish +++ b/.config/fish/functions/import_sources.fish @@ -1,10 +1,27 @@ function import_sources -a uname -d 'Loads any additional fish files needed at init.' test -f ~/.asdf/plugins/dotnet-core/set-dotnet-home.fish; and source ~/.asdf/plugins/dotnet-core/set-dotnet-home.fish - test -e ~/.asdf/asdf.fish - and source ~/.asdf/asdf.fish - and mkdir -p ~/.config/fish/completions - and ln -sf ~/.asdf/completions/asdf.fish ~/.config/fish/completions + # ASDF configuration code + if test -z $ASDF_DATA_DIR + set _asdf_shims "$HOME/.asdf/shims" + else + set _asdf_shims "$ASDF_DATA_DIR/shims" + end + + # Do not use fish_add_path (added in Fish 3.2) because it + # potentially changes the order of items in PATH + if not contains $_asdf_shims $PATH + set -gx --prepend PATH $_asdf_shims + end + set --erase _asdf_shims + + test -e /opt/homebrew/bin/brew + and /opt/homebrew/bin/brew shellenv | source - + + command -q starship; and starship init fish | source + command -q zoxide; and zoxide init fish | source + command -q fzf; and fzf --fish | source + command -q pyenv; and pyenv init - | source # The next line updates PATH for the Google Cloud SDK. # if test -f '/Users/m/Documents/google-cloud-sdk/path.fish.inc'; source '/Users/m/Documents/google-cloud-sdk/path.fish.inc'; end diff --git a/.config/nvim/autoload/plug.vim b/.config/nvim/autoload/plug.vim deleted file mode 100644 index 5c910ca..0000000 --- a/.config/nvim/autoload/plug.vim +++ /dev/null @@ -1,2863 +0,0 @@ -" vim-plug: Vim plugin manager -" ============================ -" -" 1. Download plug.vim and put it in 'autoload' directory -" -" # Vim -" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ -" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim -" -" # Neovim -" sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \ -" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' -" -" 2. Add a vim-plug section to your ~/.vimrc (or ~/.config/nvim/init.vim for Neovim) -" -" call plug#begin() -" -" " List your plugins here -" Plug 'tpope/vim-sensible' -" -" call plug#end() -" -" 3. Reload the file or restart Vim, then you can, -" -" :PlugInstall to install plugins -" :PlugUpdate to update plugins -" :PlugDiff to review the changes from the last update -" :PlugClean to remove plugins no longer in the list -" -" For more information, see https://github.com/junegunn/vim-plug -" -" -" Copyright (c) 2024 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 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') - if has('nvim-0.5.0') - call s:source(s:rtp(plug), 'ftdetect/**/*.lua', 'after/ftdetect/**/*.lua') - endif - 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') - if has('nvim-0.5.0') - call s:source(s:rtp(a:spec), 'plugin/**/*.lua', 'after/plugin/**/*.lua') - endif -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') - if has('nvim-0.5.0') " see neovim#14686 - call s:source(rtp, dir.'/**/*.lua') - endif - 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,plugAbort - syn match plugNumber /[0-9]\+[0-9.]*/ contained - syn match plugBracket /[[\]]/ contained - syn match plugX /x/ contained - syn match plugAbort /\~/ 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 plugAbort Ignore - 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', '-tabnew') -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(0) - 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 - elseif exists('s:jobs') && !empty(s:jobs) - call s:job_abort(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) - if has('nvim') - " Reset &rtp to invalidate Neovim cache of loaded Lua modules - " See https://github.com/junegunn/vim-plug/pull/1157#issuecomment-1809226110 - let &rtp = &rtp - endif - 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) - let error = 0 - 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) - let error = v:shell_error - endif - return [output, error] -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(deepcopy(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 - let out = '' - let error = 0 - if has_key(spec, 'commit') - call s:log4(name, 'Checking out '.spec.commit) - let [out, error] = 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) - let error = v:shell_error - endif - if !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) - let error = v:shell_error - endif - let msg = s:format_message(v:shell_error ? 'x': '-', name, out) - if 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:mark_aborted(name, message) - let attrs = { 'running': 0, 'error': 1, 'abort': 1, 'lines': [a:message] } - let s:jobs[a:name] = extend(get(s:jobs, a:name, {}), attrs) -endfunction - -function! s:job_abort(cancel) - 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 - if a:cancel - call s:mark_aborted(name, 'Aborted') - endif - endfor - - if a:cancel - for todo in values(s:update.todo) - let todo.abort = 1 - endfor - else - let s:jobs = {} - endif -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:bullet_for(job, ...) - if a:job.running - return a:job.new ? '+' : '*' - endif - if get(a:job, 'abort', 0) - return '~' - endif - return a:job.error ? 'x' : get(a:000, 0, '-') -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 result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) - if len(result) - call s:log(s:bullet_for(self), self.name, result) - endif - 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(0) - 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, spec, queue, opts) - let job = { 'name': a:name, 'spec': a:spec, 'running': 1, 'error': 0, 'lines': [''], - \ 'new': get(a:opts, 'new', 0), 'queue': copy(a:queue) } - let Item = remove(job.queue, 0) - let argv = type(Item) == s:TYPE.funcref ? call(Item, [a:spec]) : Item - let s:jobs[a:name] = job - - if s:nvim - if has_key(a:opts, 'dir') - let job.cwd = a:opts.dir - endif - 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(argv), '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') ? [argv, a:opts.dir] : [argv])) - let job.error = v:shell_error != 0 - let job.running = 0 - endif -endfunction - -function! s:reap(name) - let job = remove(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 more = len(get(job, 'queue', [])) - let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) - if len(result) - call s:log(s:bullet_for(job), a:name, result) - endif - - if !job.error && more - let job.spec.queue = job.queue - let s:update.todo[a:name] = job.spec - else - let s:update.bar .= s:bullet_for(job, '=') - call s:bar() - endif -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:checkout_command(spec) - let a:spec.branch = s:git_origin_branch(a:spec) - return ['git', 'checkout', '-q', a:spec.branch, '--'] -endfunction - -function! s:merge_command(spec) - let a:spec.branch = s:git_origin_branch(a:spec) - return ['git', 'merge', '--ff-only', 'origin/'.a:spec.branch] -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) - if get(spec, 'abort', 0) - call s:mark_aborted(name, 'Skipped') - call s:reap(name) - continue - endif - - let queue = get(spec, 'queue', []) - let new = empty(globpath(spec.dir, '.git', 1)) - - if empty(queue) - call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') - redraw - endif - - let has_tag = has_key(spec, 'tag') - if len(queue) - call s:spawn(name, spec, queue, { 'dir': spec.dir }) - elseif !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 - let queue = [cmd, split('git remote set-head origin -a')] - if !has_tag && !has_key(spec, 'commit') - call extend(queue, [function('s:checkout_command'), function('s:merge_command')]) - endif - call s:spawn(name, spec, queue, { '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, spec, [extend(cmd, [spec.uri, s:trim(spec.dir)]), function('s:checkout_command'), function('s:merge_command')], { '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 - let pwsh = s:is_powershell(&shell) - let cd = s:is_win && !pwsh ? 'cd /d' : 'cd' - let sep = pwsh ? ';' : '&&' - return printf('%s %s %s %s', cd, plug#shellescape(a:dir, {'script': script, 'shell': &shell}), sep, 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 || len(ahead_behind) != 2 - let err = "Failed to compare with the origin. The default branch might have changed.\nPlugClean required." - else - let [ahead, behind] = ahead_behind - if ahead && 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) - elseif ahead - 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) || get(spec, 'frozen', 0) - 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 !s:is_preview_window_open() - execute get(g:, 'plug_pwindow', 'vertical rightbelow new') - 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, '\\\@ +" Terminal escape +tnoremap + +" Search for visually selected text +vnoremap // y/\V=escape(@",'/\') + +" ALE (Linting/Fixing) nnoremap f ALEFix nnoremap a ALEToggle + +" File Navigation nnoremap nn Neotree toggle show git_status nnoremap np Neotree float reveal_force_cwd nnoremap t Telescope @@ -32,33 +62,43 @@ nnoremap p Telescope git_files nnoremap Telescope find_files nnoremap s Telescope treesitter nnoremap ga Telescope grep_string + +" LSP Integration nnoremap gg Telescope lsp_definitions nnoremap gr Telescope lsp_references nnoremap gi Telescope lsp_implementations nnoremap gd Telescope lsp_type_definitions + +" UI Toggles nnoremap o SymbolsOutline nnoremap z ZenMode nnoremap l Twilight -nnoremap c COQnow + +" Buffer Management nnoremap j BufferLinePick nnoremap J BufferLinePickClose -tnoremap - -" Allows you to use // in order to search for the visually selected text -vnoremap // y/\V=escape(@",'/\') - -colorscheme kanagawa +" Code Companion +nnoremap c CodeCompanionChat +" ----------------------------------------------------------------------------- +" Neovide GUI Settings +" ----------------------------------------------------------------------------- let g:neovide_scale_factor = 0.75 let g:neovide_transparency = 0.7 let g:neovide_cursor_vfx_mode = 'sonicboom' +" ----------------------------------------------------------------------------- +" Plugin Configurations +" ----------------------------------------------------------------------------- +" ALE (Linting) let g:ale_linters_explicit = 1 let g:ale_completion_enabled = 0 +" Pencil let g:pencil#map#suspend_af = 'K' +" ALE Linters Configuration let g:ale_linters = { \ 'javascript': ['eslint', 'stylelint', 'biome'], \ 'typescript': ['eslint', 'stylelint', 'biome'], @@ -81,7 +121,7 @@ let g:ale_linters = { \ 'python': ['pylint'], \ } - +" ALE Fixers Configuration let g:ale_fixers = { \ 'go': ['goimports', 'remove_trailing_lines', 'trim_whitespace'], \ 'graphql': ['prettier'], @@ -104,12 +144,18 @@ let g:ale_fixers = { \ 'lua': ['stylua'], \ } +" ----------------------------------------------------------------------------- +" Autocommands +" ----------------------------------------------------------------------------- +" Fish filetype settings augroup ft_fish au! autocmd FileType fish set tabstop=4 augroup END +" Terminal settings augroup term au! autocmd TermOpen * set nonumber augroup END + diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index dde1334..6d191dc 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -1,173 +1,326 @@ -local plug = vim.fn["plug#"] -vim.call("plug#begin") +-- Bootstrap lazy.nvim +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end +vim.opt.rtp:prepend(lazypath) -plug("w0rp/ale") -plug("tpope/vim-eunuch") -plug("tpope/vim-surround") -plug("edkolev/tmuxline.vim") -plug("airblade/vim-gitgutter") -plug("reedes/vim-pencil", { ["on"] = { "HardPencil", "SoftPencil" } }) -plug("tpope/vim-fugitive", { ["on"] = { "G", "Git" }, ["for"] = "gitcommit" }) +-- Set leader key before lazy setup +vim.g.mapleader = "," -plug("MunifTanjim/nui.nvim") -plug("rcarriga/nvim-notify") -plug("nvim-lua/plenary.nvim") -plug("nvim-tree/nvim-web-devicons") +-- Plugin specifications +require("lazy").setup({ + install = { colorscheme = { "kanagawa" } }, + spec = { + -- UI and appearance + { + "rebelot/kanagawa.nvim", + lazy = false, + priority = 1000, + opts = { + transparent = not vim.g.neovide, + }, + init = function() + vim.cmd([[colorscheme kanagawa]]) + end, + }, + { + "akinsho/bufferline.nvim", + version = "*", + dependencies = { "nvim-tree/nvim-web-devicons" }, + opts = { + options = { + separator_style = "slope", + offsets = { + { + filetype = "neo-tree", + text = "explorer", + highlight = "Directory", + separator = true, + }, + }, + }, + }, + }, + { + "nvim-lualine/lualine.nvim", + dependencies = { "nvim-tree/nvim-web-devicons" }, + opts = { + extensions = { + "neo-tree", + "symbols-outline", + }, + }, + }, + { + "rcarriga/nvim-notify", + opts = { + background_colour = "#000000", + }, + }, + { + "folke/noice.nvim", + event = "VeryLazy", + dependencies = { "MunifTanjim/nui.nvim", "rcarriga/nvim-notify" }, + opts = { + lsp = { + override = { + ["vim.lsp.util.convert_input_to_markdown_lines"] = true, + ["vim.lsp.util.stylize_markdown"] = true, + ["cmp.entry.get_documentation"] = true, + }, + }, + presets = { + bottom_search = true, + command_palette = true, + long_message_to_split = true, + }, + views = { + notify = { + replace = true, + merge = true, + }, + }, + }, + }, + "edkolev/tmuxline.vim", -plug("ms-jpq/coq_nvim", { ["branch"] = "coq" }) -plug("ms-jpq/coq.artifacts", { ["branch"] = "artifacts" }) -plug("folke/noice.nvim") -plug("folke/flash.nvim") -plug("folke/zen-mode.nvim") -plug("folke/twilight.nvim") -plug("neovim/nvim-lspconfig") -plug("rebelot/kanagawa.nvim") -plug("akinsho/bufferline.nvim") -plug("nvim-lualine/lualine.nvim") -plug("nvim-neo-tree/neo-tree.nvim") -plug("pmizio/typescript-tools.nvim") -plug("simrat39/symbols-outline.nvim") -plug("nvim-telescope/telescope.nvim") -plug("nvim-telescope/telescope-fzf-native.nvim", { ["do"] = "make" }) -plug("nvim-treesitter/nvim-treesitter", { ["do"] = ":TSUpdate" }) -plug("nvim-treesitter/nvim-treesitter-context") + -- Editor enhancements + "w0rp/ale", + "tpope/vim-eunuch", + "tpope/vim-surround", + -- { "airblade/vim-gitgutter", lazy = false }, + { "echasnovski/mini.diff", version = false, opts = {} }, + { + "reedes/vim-pencil", + cmd = { "HardPencil", "SoftPencil" }, + }, + { + "tpope/vim-fugitive", + cmd = { "G", "Git" }, + ft = "gitcommit", + }, + { + "folke/zen-mode.nvim", + opts = { + window = { + backdrop = 0.95, + }, + plugins = { + twilight = { enabled = false }, + }, + }, + }, + { "folke/twilight.nvim", opts = {} }, -vim.call("plug#end") + -- Completion and LSP + { + "saghen/blink.cmp", + dependencies = { "rafamadriz/friendly-snippets" }, + version = "1.*", + ---@module 'blink.cmp' + ---@type blink.cmp.Config + opts = {}, + opts_extend = { "sources.default" }, + }, + { + "neovim/nvim-lspconfig", + dependencies = { "saghen/blink.cmp" }, + }, + { + "pmizio/typescript-tools.nvim", + dependencies = { "nvim-lua/plenary.nvim", "neovim/nvim-lspconfig" }, + }, -vim.opt.guifont = "JetBrainsMono Nerd Font:h13" + -- Navigation and search + { + "nvim-neo-tree/neo-tree.nvim", + branch = "v3.x", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-tree/nvim-web-devicons", + "MunifTanjim/nui.nvim", + }, + lazy = false, -- neo-tree will lazily load itself + ---@module "neo-tree" + ---@type neotree.Config? + opts = {}, + }, + { + "nvim-telescope/telescope.nvim", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-tree/nvim-web-devicons", + }, + opts = {}, + }, + { + "nvim-telescope/telescope-fzf-native.nvim", + build = "make", + dependencies = { + "nvim-telescope/telescope.nvim", + }, + config = function() + require("telescope").load_extension("fzf") + end, + }, + { + "folke/flash.nvim", + event = "VeryLazy", + opts = {}, + keys = { + { + "s", + mode = { "n", "x", "o" }, + function() + require("flash").jump() + end, + desc = "Flash", + }, + { + "S", + mode = { "n", "x", "o" }, + function() + require("flash").treesitter() + end, + desc = "Flash Treesitter", + }, + { + "r", + mode = "o", + function() + require("flash").remote() + end, + desc = "Remote Flash", + }, + { + "R", + mode = { "o", "x" }, + function() + require("flash").treesitter_search() + end, + desc = "Treesitter Search", + }, + { + "", + mode = { "c" }, + function() + require("flash").toggle() + end, + desc = "Toggle Flash Search", + }, + }, + }, -vim.g.coq_settings = { auto_start = true } + -- Treesitter + { + "nvim-treesitter/nvim-treesitter", + build = ":TSUpdate", + opts = { + ensure_installed = { + "c", + "cpp", + "lua", + "vim", + "regex", + "bash", + "fish", + "typescript", + "javascript", + "tsx", + "go", + "elixir", + "vue", + "groovy", + "java", + "objc", + "swift", + "hcl", + "terraform", + "yaml", + "json", + }, + auto_install = false, + highlight = { + enable = true, + additional_vim_regex_highlighting = false, + }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = "gnn", + node_incremental = "grn", + scope_incremental = "grc", + node_decremental = "grm", + }, + }, + indent = { + enable = true, + }, + }, + config = function(plugin, opts) + require("nvim-treesitter.configs").setup(opts) + end, + }, -require("neo-tree").setup() - -require("kanagawa").setup({ - transparent = not vim.g.neovide, -}) - -require("bufferline").setup({ - options = { - separator_style = "slope", - offsets = { - { - filetype = "neo-tree", - text = "explorer", - highlight = "Directory", - separator = true, -- use a "true" to enable the default, or set your own character + -- CodeCompanion + { + "olimorris/codecompanion.nvim", + dependencies = { "nvim-lua/plenary.nvim", "nvim-treesitter/nvim-treesitter", "echasnovski/mini.diff" }, + opts = { + display = { diff = { provider = "mini_diff" }, chat = { show_settings = true } }, + strategies = { + chat = { adapter = "gemini_deep" }, + inline = { adapter = "gemini" }, + cmd = { adapter = "gemini" }, + }, + adapters = { + anthropic = function() + return require("codecompanion.adapters").extend("anthropic", { + schema = { + model = { default = "claude-3-7-sonnet-20250219" }, + extended_thinking = { default = false }, + }, + }) + end, + gemini_deep = function() + return require("codecompanion.adapters").extend("gemini", { + schema = { + model = { default = "gemini-2.5-pro-preview-03-25" }, + }, + }) + end, + ollama = function() + return require("codecompanion.adapters").extend("ollama", { + env = { + url = "http://scimitar.lan:11434", + }, + schema = { + model = { default = "deepseek-r1:7b" }, + num_ctx = { default = 8192 }, + }, + }) + end, + }, }, }, }, }) -require("lualine").setup({ - extensions = { - "neo-tree", - "symbols-outline", - }, -}) +-- General settings +vim.opt.guifont = "JetBrainsMono Nerd Font:h13" -require("zen-mode").setup({ - window = { - backdrop = 0.95, - }, - plugins = { - twilight = { enabled = false }, -- enable to start Twilight when zen mode opens - }, -}) -require("symbols-outline").setup({ - autofold_depth = 2, -}) - -require("notify").setup({ - background_colour = "#000000", -}) - -require("telescope").setup() -require("telescope").load_extension("fzf") - -require("noice").setup({ - lsp = { - -- override markdown rendering so that **cmp** and other plugins use **Treesitter** - override = { - ["vim.lsp.util.convert_input_to_markdown_lines"] = true, - ["vim.lsp.util.stylize_markdown"] = true, - ["cmp.entry.get_documentation"] = true, - }, - }, - presets = { - bottom_search = true, -- use a classic bottom cmdline for search - command_palette = true, -- position the cmdline and popupmenu together - long_message_to_split = true, -- long messages will be sent to a split - }, - views = { - notify = { - replace = true, - merge = true, - }, - }, -}) - -require("nvim-treesitter.configs").setup({ - -- A list of parser names, or "all" (the four listed parsers should always be installed) - ensure_installed = { - "c", - "lua", - "vim", - "regex", - "bash", - "fish", - "typescript", - "javascript", - "tsx", - "go", - "elixir", - "vue", - "groovy", - "hcl", - "terraform", - }, - - -- Automatically install missing parsers when entering buffer - -- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally - auto_install = false, - - highlight = { - enable = true, - -- Setting this to true will run `:h syntax` and tree-sitter at the same time. - -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation). - -- Using this option may slow down your editor, and you may see some duplicate highlights. - -- Instead of true it can also be a list of languages - additional_vim_regex_highlighting = false, - }, - - incremental_selection = { - enable = true, - keymaps = { - init_selection = "gnn", -- set to `false` to disable one of the mappings - node_incremental = "grn", - scope_incremental = "grc", - node_decremental = "grm", - }, - }, - - indent = { - enable = true, - }, -}) - --- Map Leader -vim.g.mapleader = "," - --- Flash config -local flash = require("flash") -flash.setup() -vim.keymap.set({ "n", "x", "o" }, "s", flash.jump, { desc = "Flash" }) -vim.keymap.set({ "n", "x", "o" }, "S", flash.treesitter, { desc = "Flash Treesitter" }) -vim.keymap.set("o", "r", flash.remote, { desc = "Remote Flash" }) -vim.keymap.set({ "o", "x" }, "R", flash.treesitter_search, { desc = "Treesitter Search" }) -vim.keymap.set("c", "", flash.toggle, { desc = "Toggle Flash Search" }) - --- LSP Mappings. --- See `:help vim.diagnostic.*` for documentation on any of the below functions +-- LSP Mappings local opts = { silent = true } vim.keymap.set("n", "d", vim.diagnostic.open_float, opts) vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts) @@ -197,8 +350,9 @@ local on_attach = function(client, bufnr) end, bufopts) end +-- LSP Setup local lspconfig = require("lspconfig") -local coq = require("coq") +local capabilities = require("blink.cmp").get_lsp_capabilities() local lsp_flags = { -- This is the default in Nvim 0.7+ @@ -208,9 +362,10 @@ local lsp_flags = { -- Unused for now local vue_plugin_location = vim.fn.expand("$HOME/.bun/install/global/node_modules/@vue/language-server") -require("typescript-tools").setup(coq.lsp_ensure_capabilities({ +require("typescript-tools").setup({ on_attach = on_attach, flags = lsp_flags, + capabilities = capabilities, filetypes = { "typescript", "javascript", @@ -223,14 +378,16 @@ require("typescript-tools").setup(coq.lsp_ensure_capabilities({ "@vue/typescript-plugin", }, }, -})) +}) local servers = { "volar", "elixirls", "gopls", "pylsp" } for _, lsp in ipairs(servers) do - lspconfig[lsp].setup(coq.lsp_ensure_capabilities({ + lspconfig[lsp].setup({ on_attach = on_attach, flags = lsp_flags, - })) + capabilities = capabilities, + }) end +-- Source config.vim vim.cmd("source ~/.config/nvim/config.vim") diff --git a/.gitconfig b/.gitconfig index 918a2ee..828ede0 100644 --- a/.gitconfig +++ b/.gitconfig @@ -1,6 +1,7 @@ [alias] co = checkout - sco = restore --staged + rs = restore + rss = restore --staged br = branch cm = commit st = status @@ -21,6 +22,7 @@ merff = merge --ff-only fa = fetch --all pa = push --all + ap = add --patch [core] editor = nvim diff --git a/.skhdrc b/.skhdrc index 1efa0ad..205d204 100755 --- a/.skhdrc +++ b/.skhdrc @@ -1,5 +1,5 @@ # open terminal -cmd - return : /usr/local/bin/wezterm-gui start +cmd - return : /Applications/WezTerm.app/Contents/MacOS/wezterm-gui # open web browser shift + cmd - return : /Applications/Firefox.app/Contents/MacOS/firefox @@ -50,8 +50,8 @@ cmd + alt - w : yabai -m space --destroy # fast focus desktop cmd + alt - x : yabai -m space --focus recent -cmd + alt - z : yabai -m space --focus prev -cmd + alt - c : yabai -m space --focus next +cmd - 0x21 : yabai -m space --focus prev +cmd - 0x1E : yabai -m space --focus next cmd + alt - 1 : yabai -m space --focus 1 cmd + alt - 2 : yabai -m space --focus 2 cmd + alt - 3 : yabai -m space --focus 3 diff --git a/.wezterm.lua b/.wezterm.lua index 629a45e..ef50a48 100644 --- a/.wezterm.lua +++ b/.wezterm.lua @@ -6,6 +6,12 @@ local is_darwin = function() return wezterm.target_triple:find("darwin") ~= nil end +if is_darwin() then + config.default_prog = { "/opt/homebrew/bin/fish", "-l" } +end + +config.window_decorations = "RESIZE" + config.force_reverse_video_cursor = true config.colors = { foreground = "#dcd7ba", @@ -26,10 +32,9 @@ config.colors = { indexed = { [16] = "#ffa066", [17] = "#ff5d62" }, } -config.window_background_opacity = 0.7 -config.window_decorations = "RESIZE" +config.window_background_opacity = is_darwin() and 0.85 or 0.7 -config.font_size = is_darwin() and 13 or 11 +config.font_size = is_darwin() and 14 or 11 config.tab_bar_at_bottom = true config.hide_tab_bar_if_only_one_tab = true From 44697ec5bfaf48f4131b0da5e7dd0f6009b9d987 Mon Sep 17 00:00:00 2001 From: mitchell Date: Mon, 14 Apr 2025 06:58:16 -0400 Subject: [PATCH 03/17] Refactor vimscript into lua --- .config/fish/functions/aisearch.fish | 4 + .config/nvim/config.vim | 161 --------------------- .config/nvim/init.lua | 202 +++++++++++++++++++++++---- 3 files changed, 179 insertions(+), 188 deletions(-) create mode 100644 .config/fish/functions/aisearch.fish delete mode 100644 .config/nvim/config.vim diff --git a/.config/fish/functions/aisearch.fish b/.config/fish/functions/aisearch.fish new file mode 100644 index 0000000..9b47022 --- /dev/null +++ b/.config/fish/functions/aisearch.fish @@ -0,0 +1,4 @@ +function aisearch --wraps aichat + set -lx AICHAT_PATCH_GEMINI_CHAT_COMPLETIONS '{".*":{"body":{"tools":[{"google_search":{}}]}}}' + aichat -r search -s $argv +end diff --git a/.config/nvim/config.vim b/.config/nvim/config.vim deleted file mode 100644 index aa2f903..0000000 --- a/.config/nvim/config.vim +++ /dev/null @@ -1,161 +0,0 @@ -" ============================================================================= -" Neovim Configuration File -" ============================================================================= - -" ----------------------------------------------------------------------------- -" UI Settings -" ----------------------------------------------------------------------------- -set colorcolumn=100 -set cursorline -set showmatch -set number -set noshowmode -set background=dark -set nowrap -set cmdheight=2 -set shortmess+=c -set termguicolors - -" Folding settings -set foldmethod=expr -set foldexpr=nvim_treesitter#foldexpr() -set nofoldenable " Disable folding at startup. - -" ----------------------------------------------------------------------------- -" Editor Behavior -" ----------------------------------------------------------------------------- -set mouse=a -set mousemodel=extend -set tabstop=2 -set shiftwidth=0 -set expandtab -set textwidth=100 - -" ----------------------------------------------------------------------------- -" Search Settings -" ----------------------------------------------------------------------------- -set hlsearch -set ignorecase -set smartcase - -" ----------------------------------------------------------------------------- -" Key Mappings -" ----------------------------------------------------------------------------- -" Quick escape from insert mode -inoremap jj - -" Terminal escape -tnoremap - -" Search for visually selected text -vnoremap // y/\V=escape(@",'/\') - -" ALE (Linting/Fixing) -nnoremap f ALEFix -nnoremap a ALEToggle - -" File Navigation -nnoremap nn Neotree toggle show git_status -nnoremap np Neotree float reveal_force_cwd -nnoremap t Telescope -nnoremap p Telescope git_files -nnoremap Telescope find_files -nnoremap s Telescope treesitter -nnoremap ga Telescope grep_string - -" LSP Integration -nnoremap gg Telescope lsp_definitions -nnoremap gr Telescope lsp_references -nnoremap gi Telescope lsp_implementations -nnoremap gd Telescope lsp_type_definitions - -" UI Toggles -nnoremap o SymbolsOutline -nnoremap z ZenMode -nnoremap l Twilight - -" Buffer Management -nnoremap j BufferLinePick -nnoremap J BufferLinePickClose - -" Code Companion -nnoremap c CodeCompanionChat - -" ----------------------------------------------------------------------------- -" Neovide GUI Settings -" ----------------------------------------------------------------------------- -let g:neovide_scale_factor = 0.75 -let g:neovide_transparency = 0.7 -let g:neovide_cursor_vfx_mode = 'sonicboom' - -" ----------------------------------------------------------------------------- -" Plugin Configurations -" ----------------------------------------------------------------------------- -" ALE (Linting) -let g:ale_linters_explicit = 1 -let g:ale_completion_enabled = 0 - -" Pencil -let g:pencil#map#suspend_af = 'K' - -" ALE Linters Configuration -let g:ale_linters = { - \ 'javascript': ['eslint', 'stylelint', 'biome'], - \ 'typescript': ['eslint', 'stylelint', 'biome'], - \ 'javascriptreact': ['eslint', 'stylelint', 'biome'], - \ 'typescriptreact': ['eslint', 'stylelint', 'biome'], - \ 'go': ['golint', 'go vet'], - \ 'vue': ['eslint', 'stylelint'], - \ 'make': ['checkmake'], - \ 'proto': ['protoc-gen-lint'], - \ 'dockerfile': ['hadolint'], - \ 'dart': ['dartanalyzer'], - \ 'fish': ['fish'], - \ 'vim': ['vint'], - \ 'elixir': ['credo'], - \ 'cs': ['OmniSharp'], - \ 'terraform': ['tflint'], - \ 'ruby': ['rubocop'], - \ 'css': ['stylelint'], - \ 'sh': ['shellcheck'], - \ 'python': ['pylint'], - \ } - -" ALE Fixers Configuration -let g:ale_fixers = { - \ 'go': ['goimports', 'remove_trailing_lines', 'trim_whitespace'], - \ 'graphql': ['prettier'], - \ 'javascript': ['prettier', 'biome'], - \ 'typescript': ['prettier', 'biome'], - \ 'javascriptreact': ['prettier', 'biome'], - \ 'typescriptreact': ['prettier', 'biome'], - \ 'vue': ['prettier'], - \ 'css': ['prettier'], - \ 'yaml': ['prettier', 'biome'], - \ 'json': ['prettier', 'biome'], - \ 'dart': ['dartfmt'], - \ 'html': ['prettier', 'biome'], - \ 'markdown': ['prettier', 'biome'], - \ 'make': ['remove_trailing_lines', 'trim_whitespace'], - \ 'elixir': ['mix_format'], - \ 'terraform': ['terraform'], - \ 'ruby': ['rubocop'], - \ 'python': ['black'], - \ 'lua': ['stylua'], - \ } - -" ----------------------------------------------------------------------------- -" Autocommands -" ----------------------------------------------------------------------------- -" Fish filetype settings -augroup ft_fish - au! - autocmd FileType fish set tabstop=4 -augroup END - -" Terminal settings -augroup term - au! - autocmd TermOpen * set nonumber -augroup END - diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index 6d191dc..cf81c9c 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -36,6 +36,7 @@ require("lazy").setup({ }, { "akinsho/bufferline.nvim", + event = "VeryLazy", version = "*", dependencies = { "nvim-tree/nvim-web-devicons" }, opts = { @@ -51,6 +52,10 @@ require("lazy").setup({ }, }, }, + keys = { + { "j", "BufferLinePick", desc = "BufferLinePick", silent = true }, + { "J", "BufferLinePickClose", desc = "BufferLinePickClose", silent = true }, + }, }, { "nvim-lualine/lualine.nvim", @@ -96,7 +101,62 @@ require("lazy").setup({ "edkolev/tmuxline.vim", -- Editor enhancements - "w0rp/ale", + { + "w0rp/ale", + event = "VeryLazy", + keys = { + { "f", "ALEFix", desc = "ALE Fix", silent = true }, + { "a", "ALEToggle", desc = "ALE Toggle", silent = true }, + }, + config = function() + vim.g.ale_linters_explicit = 1 + vim.g.ale_completion_enabled = 0 -- Using blink.cmp for completion + + vim.g.ale_linters = { + javascript = { "eslint", "stylelint", "biome" }, + typescript = { "eslint", "stylelint", "biome" }, + javascriptreact = { "eslint", "stylelint", "biome" }, + typescriptreact = { "eslint", "stylelint", "biome" }, + go = { "golint", "go vet" }, + vue = { "eslint", "stylelint" }, + make = { "checkmake" }, + proto = { "protoc-gen-lint" }, + dockerfile = { "hadolint" }, + dart = { "dartanalyzer" }, + fish = { "fish" }, + vim = { "vint" }, + elixir = { "credo" }, + cs = { "OmniSharp" }, + terraform = { "tflint" }, + ruby = { "rubocop" }, + css = { "stylelint" }, + sh = { "shellcheck" }, + python = { "pylint" }, + } + + vim.g.ale_fixers = { + go = { "goimports", "remove_trailing_lines", "trim_whitespace" }, + graphql = { "prettier" }, + javascript = { "prettier", "biome" }, + typescript = { "prettier", "biome" }, + javascriptreact = { "prettier", "biome" }, + typescriptreact = { "prettier", "biome" }, + vue = { "prettier" }, + css = { "prettier" }, + yaml = { "prettier", "biome" }, + json = { "prettier", "biome" }, + dart = { "dartfmt" }, + html = { "prettier", "biome" }, + markdown = { "prettier", "biome" }, + make = { "remove_trailing_lines", "trim_whitespace" }, + elixir = { "mix_format" }, + terraform = { "terraform" }, + ruby = { "rubocop" }, + python = { "black" }, + lua = { "stylua" }, + } + end, + }, "tpope/vim-eunuch", "tpope/vim-surround", -- { "airblade/vim-gitgutter", lazy = false }, @@ -104,6 +164,9 @@ require("lazy").setup({ { "reedes/vim-pencil", cmd = { "HardPencil", "SoftPencil" }, + config = function() + vim.g["pencil#map#suspend_af"] = "K" -- Use bracket notation for '#' + end, }, { "tpope/vim-fugitive", @@ -120,8 +183,17 @@ require("lazy").setup({ twilight = { enabled = false }, }, }, + keys = { + { "z", "ZenMode", desc = "Zen Mode", silent = true }, + }, + }, + { + "folke/twilight.nvim", + opts = {}, + keys = { + { "l", "Twilight", desc = "Twilight", silent = true }, + }, }, - { "folke/twilight.nvim", opts = {} }, -- Completion and LSP { @@ -155,6 +227,20 @@ require("lazy").setup({ ---@module "neo-tree" ---@type neotree.Config? opts = {}, + keys = { + { + "nn", + "Neotree toggle git_status", + desc = "Neo-tree Toggle Git Status", + silent = true, + }, + { + "np", + "Neotree float reveal_force_cwd", + desc = "Neo-tree Float Reveal CWD", + silent = true, + }, + }, }, { "nvim-telescope/telescope.nvim", @@ -163,6 +249,24 @@ require("lazy").setup({ "nvim-tree/nvim-web-devicons", }, opts = {}, + keys = { + { "t", "Telescope", desc = "Telescope", silent = true }, + { "p", "Telescope git_files", desc = "Telescope Git Files", silent = true }, + { "", "Telescope find_files", desc = "Telescope Find Files", silent = true }, + -- Note: 's' is used by flash.nvim, this mapping shadows the default 's' jump. + -- You might want to change this leader mapping if you use flash jump often. + { "s", "Telescope treesitter", desc = "Telescope Treesitter", silent = true }, + { "ga", "Telescope grep_string", desc = "Telescope Grep String", silent = true }, + { "gg", "Telescope lsp_definitions", desc = "LSP Definitions", silent = true }, + { "gr", "Telescope lsp_references", desc = "LSP References", silent = true }, + { "gi", "Telescope lsp_implementations", desc = "LSP Implementations", silent = true }, + { + "gd", + "Telescope lsp_type_definitions", + desc = "LSP Type Definitions", + silent = true, + }, + }, }, { "nvim-telescope/telescope-fzf-native.nvim", @@ -281,18 +385,10 @@ require("lazy").setup({ display = { diff = { provider = "mini_diff" }, chat = { show_settings = true } }, strategies = { chat = { adapter = "gemini_deep" }, - inline = { adapter = "gemini" }, - cmd = { adapter = "gemini" }, + inline = { adapter = "gemini_deep" }, + cmd = { adapter = "gemini_deep" }, }, adapters = { - anthropic = function() - return require("codecompanion.adapters").extend("anthropic", { - schema = { - model = { default = "claude-3-7-sonnet-20250219" }, - extended_thinking = { default = false }, - }, - }) - end, gemini_deep = function() return require("codecompanion.adapters").extend("gemini", { schema = { @@ -313,12 +409,77 @@ require("lazy").setup({ end, }, }, + keys = { + { "c", "CodeCompanionChat", desc = "CodeCompanion Chat", silent = true }, + }, }, }, }) -- General settings vim.opt.guifont = "JetBrainsMono Nerd Font:h13" +vim.opt.colorcolumn = "100" +vim.opt.cursorline = true +vim.opt.showmatch = true +vim.opt.number = true +vim.opt.showmode = false +vim.o.background = "dark" +vim.opt.wrap = false +vim.opt.cmdheight = 1 +vim.opt.shortmess:append("c") +vim.o.termguicolors = true +vim.opt.foldenable = false +vim.opt.mouse = "a" +vim.opt.mousemodel = "extend" +vim.opt.tabstop = 2 +vim.opt.shiftwidth = 0 +vim.opt.expandtab = true +vim.opt.textwidth = 100 +vim.opt.hlsearch = true +vim.opt.ignorecase = true +vim.opt.smartcase = true + +-- Key Mappings +local map = vim.keymap.set +local map_opts_silent = { noremap = true, silent = true } + +-- General Mappings +map("i", "jj", "", { noremap = true, silent = true, desc = "Escape Insert Mode" }) +map("t", "", "", { noremap = true, silent = true, desc = "Escape Terminal Mode" }) +map("v", "//", function() + local sel = vim.fn.getreg('"') + local pattern = vim.fn.escape(sel, "/\\") + vim.fn.setreg("/", "\\V" .. pattern) + vim.cmd("normal! gN") + vim.opt.hlsearch = true +end, { noremap = true, silent = true, desc = "Search for Visual Selection" }) + +-- Neovide GUI Settings +if vim.g.neovide then + vim.g.neovide_scale_factor = 0.75 + vim.g.neovide_transparency = 0.7 + vim.g.neovide_cursor_vfx_mode = "sonicboom" +end + +-- Autocommands +local augroup = vim.api.nvim_create_augroup +local autocmd = vim.api.nvim_create_autocmd + +-- Fish filetype settings +augroup("FishSettings", { clear = true }) +autocmd("FileType", { + pattern = "fish", + command = "setlocal tabstop=4", + group = "FishSettings", +}) + +-- Terminal settings +augroup("TerminalSettings", { clear = true }) +autocmd("TermOpen", { + pattern = "*", + command = "setlocal nonumber norelativenumber", + group = "TerminalSettings", +}) -- LSP Mappings local opts = { silent = true } @@ -330,11 +491,8 @@ vim.keymap.set("n", "q", vim.diagnostic.setloclist, opts) -- Use an on_attach function to only map the following keys -- after the language server attaches to the current buffer local on_attach = function(client, bufnr) - -- Enable completion triggered by vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") - -- Mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions local bufopts = { silent = true, buffer = bufnr } vim.keymap.set("n", "h", vim.lsp.buf.hover, bufopts) vim.keymap.set("n", "", vim.lsp.buf.signature_help, bufopts) @@ -354,10 +512,7 @@ end local lspconfig = require("lspconfig") local capabilities = require("blink.cmp").get_lsp_capabilities() -local lsp_flags = { - -- This is the default in Nvim 0.7+ - debounce_text_changes = 150, -} +local lsp_flags = { debounce_text_changes = 150 } -- Unused for now local vue_plugin_location = vim.fn.expand("$HOME/.bun/install/global/node_modules/@vue/language-server") @@ -373,11 +528,7 @@ require("typescript-tools").setup({ "typescriptreact", "vue", }, - settings = { - tsserver_plugins = { - "@vue/typescript-plugin", - }, - }, + settings = { tsserver_plugins = { "@vue/typescript-plugin" } }, }) local servers = { "volar", "elixirls", "gopls", "pylsp" } @@ -388,6 +539,3 @@ for _, lsp in ipairs(servers) do capabilities = capabilities, }) end - --- Source config.vim -vim.cmd("source ~/.config/nvim/config.vim") From 38d5c4a29c9ecd2b8b3f3e4faf8f49b59eab9c9d Mon Sep 17 00:00:00 2001 From: mitchell Date: Mon, 14 Apr 2025 08:25:32 -0400 Subject: [PATCH 04/17] AI model changes --- .config/fish/functions/aisearch.fish | 2 +- .config/fish/functions/define_aliases.fish | 1 + .config/nvim/init.lua | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.config/fish/functions/aisearch.fish b/.config/fish/functions/aisearch.fish index 9b47022..8feb966 100644 --- a/.config/fish/functions/aisearch.fish +++ b/.config/fish/functions/aisearch.fish @@ -1,4 +1,4 @@ function aisearch --wraps aichat set -lx AICHAT_PATCH_GEMINI_CHAT_COMPLETIONS '{".*":{"body":{"tools":[{"google_search":{}}]}}}' - aichat -r search -s $argv + aichat -r search $argv end diff --git a/.config/fish/functions/define_aliases.fish b/.config/fish/functions/define_aliases.fish index 3478f70..fad917a 100644 --- a/.config/fish/functions/define_aliases.fish +++ b/.config/fish/functions/define_aliases.fish @@ -17,6 +17,7 @@ function define_aliases -a uname -d 'Defines aliases for commonly used commands' alias nv 'neovide --fork; and clear' alias hx helix alias ai aichat + alias ais aisearch switch "$uname" case Linux diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index cf81c9c..74b3785 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -389,6 +389,20 @@ require("lazy").setup({ cmd = { adapter = "gemini_deep" }, }, adapters = { + anthro = function() + return require("codecompanion.adapters").extend("anthropic", { + schema = { + model = { default = "claude-3-5-haiku-20241022" }, + }, + }) + end, + anthro_deep = function() + return require("codecompanion.adapters").extend("anthropic", { + schema = { + model = { default = "claude-3-7-sonnet-20250219" }, + }, + }) + end, gemini_deep = function() return require("codecompanion.adapters").extend("gemini", { schema = { From 33da7ca122889c83c4c5fda12cb1f2537bebe025 Mon Sep 17 00:00:00 2001 From: mitchell Date: Fri, 18 Apr 2025 03:33:32 -0400 Subject: [PATCH 05/17] Add kp alias, improve Neovim keybinds, modify aisearch function --- .config/fish/functions/aisearch.fish | 2 +- .config/fish/functions/define_aliases.fish | 1 + .config/nvim/init.lua | 39 +++++++++++++++++----- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/.config/fish/functions/aisearch.fish b/.config/fish/functions/aisearch.fish index 8feb966..9b47022 100644 --- a/.config/fish/functions/aisearch.fish +++ b/.config/fish/functions/aisearch.fish @@ -1,4 +1,4 @@ function aisearch --wraps aichat set -lx AICHAT_PATCH_GEMINI_CHAT_COMPLETIONS '{".*":{"body":{"tools":[{"google_search":{}}]}}}' - aichat -r search $argv + aichat -r search -s $argv end diff --git a/.config/fish/functions/define_aliases.fish b/.config/fish/functions/define_aliases.fish index fad917a..09d30c0 100644 --- a/.config/fish/functions/define_aliases.fish +++ b/.config/fish/functions/define_aliases.fish @@ -12,6 +12,7 @@ function define_aliases -a uname -d 'Defines aliases for commonly used commands' alias age-d 'age --decrypt --identity ~/.secrets/id_ed25519' alias age-e 'age --armor --recipient (cat ~/.secrets/id_ed25519.pub)' alias age-k 'age --decrypt --identity ~/.secrets/id_ed25519 ~/.secrets/age_keys.age' + alias kp 'keepassxc-cli show -k ~/.secrets/mjfs_keepass_key_file ~/.passwords/mjfs.kdbx' alias bb 'bun --bun' alias pn pnpm alias nv 'neovide --fork; and clear' diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index 74b3785..2bf13f2 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -160,7 +160,22 @@ require("lazy").setup({ "tpope/vim-eunuch", "tpope/vim-surround", -- { "airblade/vim-gitgutter", lazy = false }, - { "echasnovski/mini.diff", version = false, opts = {} }, + { + "echasnovski/mini.diff", + version = false, + lazy = false, + opts = {}, + keys = { + { + "i", + function() + require("mini.diff").toggle_overlay() + end, + desc = "Mini.diff overlay", + silent = true, + }, + }, + }, { "reedes/vim-pencil", cmd = { "HardPencil", "SoftPencil" }, @@ -256,7 +271,8 @@ require("lazy").setup({ -- Note: 's' is used by flash.nvim, this mapping shadows the default 's' jump. -- You might want to change this leader mapping if you use flash jump often. { "s", "Telescope treesitter", desc = "Telescope Treesitter", silent = true }, - { "ga", "Telescope grep_string", desc = "Telescope Grep String", silent = true }, + { "gs", "Telescope grep_string", desc = "Telescope Grep String", silent = true }, + { "gl", "Telescope live_grep", desc = "Telescope Grep String", silent = true }, { "gg", "Telescope lsp_definitions", desc = "LSP Definitions", silent = true }, { "gr", "Telescope lsp_references", desc = "LSP References", silent = true }, { "gi", "Telescope lsp_implementations", desc = "LSP Implementations", silent = true }, @@ -372,6 +388,11 @@ require("lazy").setup({ enable = true, }, }, + init = function() + vim.opt.foldmethod = "expr" + vim.opt.foldexpr = "nvim_treesitter#foldexpr()" + vim.opt.foldenable = false + end, config = function(plugin, opts) require("nvim-treesitter.configs").setup(opts) end, @@ -384,9 +405,9 @@ require("lazy").setup({ opts = { display = { diff = { provider = "mini_diff" }, chat = { show_settings = true } }, strategies = { - chat = { adapter = "gemini_deep" }, - inline = { adapter = "gemini_deep" }, - cmd = { adapter = "gemini_deep" }, + chat = { adapter = "anthro_deep" }, + inline = { adapter = "anthro" }, + cmd = { adapter = "anthro" }, }, adapters = { anthro = function() @@ -437,11 +458,11 @@ vim.opt.cursorline = true vim.opt.showmatch = true vim.opt.number = true vim.opt.showmode = false -vim.o.background = "dark" +vim.opt.background = "dark" vim.opt.wrap = false vim.opt.cmdheight = 1 vim.opt.shortmess:append("c") -vim.o.termguicolors = true +vim.opt.termguicolors = true vim.opt.foldenable = false vim.opt.mouse = "a" vim.opt.mousemodel = "extend" @@ -461,11 +482,11 @@ local map_opts_silent = { noremap = true, silent = true } map("i", "jj", "", { noremap = true, silent = true, desc = "Escape Insert Mode" }) map("t", "", "", { noremap = true, silent = true, desc = "Escape Terminal Mode" }) map("v", "//", function() + vim.cmd("normal! y") local sel = vim.fn.getreg('"') local pattern = vim.fn.escape(sel, "/\\") vim.fn.setreg("/", "\\V" .. pattern) - vim.cmd("normal! gN") - vim.opt.hlsearch = true + vim.cmd("normal! n") end, { noremap = true, silent = true, desc = "Search for Visual Selection" }) -- Neovide GUI Settings From e511802ea3020fae31bd01dd7f9eb06afa78cf9b Mon Sep 17 00:00:00 2001 From: mitchell Date: Thu, 8 May 2025 15:12:45 -0400 Subject: [PATCH 06/17] Update fish aliases & keybinds, update git config, update Neovim config Neovim: - Replace typescript-tools with ts_ls - Add Markview - Modify Neo-tree keybinds - Modify CodeCompanion models - Add Svelte linting/fixing --- .config/fish/functions/define_aliases.fish | 1 + .../functions/fish_user_key_bindings.fish | 2 +- .config/nvim/init.lua | 74 ++++++++++++++----- .gitconfig | 3 +- README.md | 1 - 5 files changed, 58 insertions(+), 23 deletions(-) diff --git a/.config/fish/functions/define_aliases.fish b/.config/fish/functions/define_aliases.fish index 09d30c0..5a453c3 100644 --- a/.config/fish/functions/define_aliases.fish +++ b/.config/fish/functions/define_aliases.fish @@ -1,6 +1,7 @@ function define_aliases -a uname -d 'Defines aliases for commonly used commands' alias q exit alias cl clear + alias ls lsd alias rcp 'rsync -aP' alias vg vagrant alias tf terraform diff --git a/.config/fish/functions/fish_user_key_bindings.fish b/.config/fish/functions/fish_user_key_bindings.fish index 7dbc2b7..b53f369 100644 --- a/.config/fish/functions/fish_user_key_bindings.fish +++ b/.config/fish/functions/fish_user_key_bindings.fish @@ -1,5 +1,4 @@ function fish_user_key_bindings - bind --mode insert jj "if commandline -P; commandline -f cancel; else; set fish_bind_mode default; commandline -f backward-char repaint-mode; end" bind --mode insert comma,a 'ssh_add; commandline -f repaint' bind --mode insert comma,p 'nvim +"Telescope git_files"; commandline -f repaint' bind --mode insert comma,f 'nvim +"Telescope find_files"; commandline -f repaint' @@ -9,4 +8,5 @@ function fish_user_key_bindings bind --mode insert comma,t 'fzf-file-widget' bind --mode insert comma,r 'fzf-history-widget' bind --mode insert comma,c 'fzf-cd-widget' + bind --mode insert comma,l 'clear; commandline -f repaint' end diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index 2bf13f2..01a3a47 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -23,6 +23,7 @@ require("lazy").setup({ install = { colorscheme = { "kanagawa" } }, spec = { -- UI and appearance + "edkolev/tmuxline.vim", { "rebelot/kanagawa.nvim", lazy = false, @@ -98,7 +99,18 @@ require("lazy").setup({ }, }, }, - "edkolev/tmuxline.vim", + { + "OXY2DEV/markview.nvim", + lazy = false, + dependencies = { "saghen/blink.cmp" }, + opts = { + preview = { + icon_provider = "devicons", + filetypes = { "markdown", "codecompanion" }, + ignore_buftypes = {}, + }, + }, + }, -- Editor enhancements { @@ -117,8 +129,9 @@ require("lazy").setup({ typescript = { "eslint", "stylelint", "biome" }, javascriptreact = { "eslint", "stylelint", "biome" }, typescriptreact = { "eslint", "stylelint", "biome" }, + svelte = { "eslint" }, go = { "golint", "go vet" }, - vue = { "eslint", "stylelint" }, + vue = { "eslint", "stylelint", "biome" }, make = { "checkmake" }, proto = { "protoc-gen-lint" }, dockerfile = { "hadolint" }, @@ -129,7 +142,7 @@ require("lazy").setup({ cs = { "OmniSharp" }, terraform = { "tflint" }, ruby = { "rubocop" }, - css = { "stylelint" }, + css = { "stylelint", "biome" }, sh = { "shellcheck" }, python = { "pylint" }, } @@ -141,8 +154,9 @@ require("lazy").setup({ typescript = { "prettier", "biome" }, javascriptreact = { "prettier", "biome" }, typescriptreact = { "prettier", "biome" }, - vue = { "prettier" }, - css = { "prettier" }, + svelte = { "prettier" }, + vue = { "prettier", "biome" }, + css = { "prettier", "biome" }, yaml = { "prettier", "biome" }, json = { "prettier", "biome" }, dart = { "dartfmt" }, @@ -245,14 +259,14 @@ require("lazy").setup({ keys = { { "nn", - "Neotree toggle git_status", - desc = "Neo-tree Toggle Git Status", + "Neotree toggle reveal_force_cwd", + desc = "Neo-tree Toggle Sidebar", silent = true, }, { - "np", + "nf", "Neotree float reveal_force_cwd", - desc = "Neo-tree Float Reveal CWD", + desc = "Neo-tree Float", silent = true, }, }, @@ -369,6 +383,8 @@ require("lazy").setup({ "terraform", "yaml", "json", + "markdown", + "markdown_inline", }, auto_install = false, highlight = { @@ -405,9 +421,9 @@ require("lazy").setup({ opts = { display = { diff = { provider = "mini_diff" }, chat = { show_settings = true } }, strategies = { - chat = { adapter = "anthro_deep" }, - inline = { adapter = "anthro" }, - cmd = { adapter = "anthro" }, + chat = { adapter = "gemini_deep" }, + inline = { adapter = "gemini" }, + cmd = { adapter = "gemini" }, }, adapters = { anthro = function() @@ -424,10 +440,17 @@ require("lazy").setup({ }, }) end, + gemini = function() + return require("codecompanion.adapters").extend("gemini", { + schema = { + model = { default = "gemini-2.5-flash-preview-04-17" }, + }, + }) + end, gemini_deep = function() return require("codecompanion.adapters").extend("gemini", { schema = { - model = { default = "gemini-2.5-pro-preview-03-25" }, + model = { default = "gemini-2.5-pro-preview-05-06" }, }, }) end, @@ -550,27 +573,40 @@ local capabilities = require("blink.cmp").get_lsp_capabilities() local lsp_flags = { debounce_text_changes = 150 } -- Unused for now -local vue_plugin_location = vim.fn.expand("$HOME/.bun/install/global/node_modules/@vue/language-server") +local vue_plugin_location = vim.fn.expand("$HOME/.bun/install/global/node_modules/@vue/typescript-plugin") -require("typescript-tools").setup({ +vim.lsp.config("ts_ls", { on_attach = on_attach, flags = lsp_flags, capabilities = capabilities, filetypes = { - "typescript", "javascript", + "typescript", "javascriptreact", "typescriptreact", "vue", }, - settings = { tsserver_plugins = { "@vue/typescript-plugin" } }, + init_options = { + plugins = { + { + name = "@vue/typescript-plugin", + location = vue_plugin_location, + languages = { "javascript", "typescript", "vue" }, + }, + }, + }, }) -local servers = { "volar", "elixirls", "gopls", "pylsp" } +vim.lsp.enable("ts_ls") + +require("lspconfig").volar.setup({}) + +local servers = { "elixirls", "gopls", "pylsp", "svelte" } for _, lsp in ipairs(servers) do - lspconfig[lsp].setup({ + vim.lsp.config(lsp, { on_attach = on_attach, flags = lsp_flags, capabilities = capabilities, }) + vim.lsp.enable(lsp) end diff --git a/.gitconfig b/.gitconfig index 828ede0..7cc587f 100644 --- a/.gitconfig +++ b/.gitconfig @@ -1,5 +1,5 @@ [alias] - co = checkout + sw = switch rs = restore rss = restore --staged br = branch @@ -21,7 +21,6 @@ puff = pull --ff-only merff = merge --ff-only fa = fetch --all - pa = push --all ap = add --patch [core] diff --git a/README.md b/README.md index 9072eae..e7413f5 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ This repo contains my preferred configurations for: - tmux - git - Wez's terminal -- Jetbrains vim plugin - keepassxc - bspwm (Linux) - sxhkd (Linux) From 3179a5b48dcfe3fa3b90048291108e32313d8a3d Mon Sep 17 00:00:00 2001 From: mitchell Date: Sun, 11 May 2025 04:20:59 -0400 Subject: [PATCH 07/17] Cleanup init.nvim and tweak ai models, aa alias to .gitconfig --- .config/nvim/init.lua | 31 +++++++++++++++---------------- .gitconfig | 1 + 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index 01a3a47..f3c979b 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -238,10 +238,6 @@ require("lazy").setup({ "neovim/nvim-lspconfig", dependencies = { "saghen/blink.cmp" }, }, - { - "pmizio/typescript-tools.nvim", - dependencies = { "nvim-lua/plenary.nvim", "neovim/nvim-lspconfig" }, - }, -- Navigation and search { @@ -422,14 +418,15 @@ require("lazy").setup({ display = { diff = { provider = "mini_diff" }, chat = { show_settings = true } }, strategies = { chat = { adapter = "gemini_deep" }, - inline = { adapter = "gemini" }, - cmd = { adapter = "gemini" }, + inline = { adapter = "openai" }, + cmd = { adapter = "openai_mini" }, }, adapters = { anthro = function() return require("codecompanion.adapters").extend("anthropic", { schema = { - model = { default = "claude-3-5-haiku-20241022" }, + model = { default = "claude-3-7-sonnet-20250219" }, + extended_thinking = { default = false }, }, }) end, @@ -454,14 +451,18 @@ require("lazy").setup({ }, }) end, - ollama = function() - return require("codecompanion.adapters").extend("ollama", { - env = { - url = "http://scimitar.lan:11434", - }, + openai_mini = function() + return require("codecompanion.adapters").extend("openai", { schema = { - model = { default = "deepseek-r1:7b" }, - num_ctx = { default = 8192 }, + model = { default = "gpt-4.1-mini" }, + }, + }) + end, + openai_deep = function() + return require("codecompanion.adapters").extend("openai", { + schema = { + model = { default = "o4-mini-2025-04-16" }, + reasoning_effort = { default = "high" }, }, }) end, @@ -486,7 +487,6 @@ vim.opt.wrap = false vim.opt.cmdheight = 1 vim.opt.shortmess:append("c") vim.opt.termguicolors = true -vim.opt.foldenable = false vim.opt.mouse = "a" vim.opt.mousemodel = "extend" vim.opt.tabstop = 2 @@ -572,7 +572,6 @@ local capabilities = require("blink.cmp").get_lsp_capabilities() local lsp_flags = { debounce_text_changes = 150 } --- Unused for now local vue_plugin_location = vim.fn.expand("$HOME/.bun/install/global/node_modules/@vue/typescript-plugin") vim.lsp.config("ts_ls", { diff --git a/.gitconfig b/.gitconfig index 7cc587f..8f34b78 100644 --- a/.gitconfig +++ b/.gitconfig @@ -22,6 +22,7 @@ merff = merge --ff-only fa = fetch --all ap = add --patch + aa = add --all [core] editor = nvim From 1517f56c867926d307628a673b6d26d8410880da Mon Sep 17 00:00:00 2001 From: mitchell Date: Sun, 11 May 2025 18:49:32 -0400 Subject: [PATCH 08/17] Breakup Neovim config into Lua modules --- .config/nvim/init.lua | 594 +------------------- .config/nvim/lua/core/autocmds.lua | 20 + .config/nvim/lua/core/keymaps.lua | 22 + .config/nvim/lua/core/options.lua | 28 + .config/nvim/lua/plugins/editor.lua | 105 ++++ .config/nvim/lua/plugins/lsp_completion.lua | 70 +++ .config/nvim/lua/plugins/navigation.lua | 111 ++++ .config/nvim/lua/plugins/tools.lua | 69 +++ .config/nvim/lua/plugins/treesitter.lua | 60 ++ .config/nvim/lua/plugins/ui.lua | 90 +++ install_utils | 77 +++ 11 files changed, 662 insertions(+), 584 deletions(-) create mode 100644 .config/nvim/lua/core/autocmds.lua create mode 100644 .config/nvim/lua/core/keymaps.lua create mode 100644 .config/nvim/lua/core/options.lua create mode 100644 .config/nvim/lua/plugins/editor.lua create mode 100644 .config/nvim/lua/plugins/lsp_completion.lua create mode 100644 .config/nvim/lua/plugins/navigation.lua create mode 100644 .config/nvim/lua/plugins/tools.lua create mode 100644 .config/nvim/lua/plugins/treesitter.lua create mode 100644 .config/nvim/lua/plugins/ui.lua create mode 100755 install_utils diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index f3c979b..d79b5ad 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -22,590 +22,16 @@ vim.g.mapleader = "," require("lazy").setup({ install = { colorscheme = { "kanagawa" } }, spec = { - -- UI and appearance - "edkolev/tmuxline.vim", - { - "rebelot/kanagawa.nvim", - lazy = false, - priority = 1000, - opts = { - transparent = not vim.g.neovide, - }, - init = function() - vim.cmd([[colorscheme kanagawa]]) - end, - }, - { - "akinsho/bufferline.nvim", - event = "VeryLazy", - version = "*", - dependencies = { "nvim-tree/nvim-web-devicons" }, - opts = { - options = { - separator_style = "slope", - offsets = { - { - filetype = "neo-tree", - text = "explorer", - highlight = "Directory", - separator = true, - }, - }, - }, - }, - keys = { - { "j", "BufferLinePick", desc = "BufferLinePick", silent = true }, - { "J", "BufferLinePickClose", desc = "BufferLinePickClose", silent = true }, - }, - }, - { - "nvim-lualine/lualine.nvim", - dependencies = { "nvim-tree/nvim-web-devicons" }, - opts = { - extensions = { - "neo-tree", - "symbols-outline", - }, - }, - }, - { - "rcarriga/nvim-notify", - opts = { - background_colour = "#000000", - }, - }, - { - "folke/noice.nvim", - event = "VeryLazy", - dependencies = { "MunifTanjim/nui.nvim", "rcarriga/nvim-notify" }, - opts = { - lsp = { - override = { - ["vim.lsp.util.convert_input_to_markdown_lines"] = true, - ["vim.lsp.util.stylize_markdown"] = true, - ["cmp.entry.get_documentation"] = true, - }, - }, - presets = { - bottom_search = true, - command_palette = true, - long_message_to_split = true, - }, - views = { - notify = { - replace = true, - merge = true, - }, - }, - }, - }, - { - "OXY2DEV/markview.nvim", - lazy = false, - dependencies = { "saghen/blink.cmp" }, - opts = { - preview = { - icon_provider = "devicons", - filetypes = { "markdown", "codecompanion" }, - ignore_buftypes = {}, - }, - }, - }, - - -- Editor enhancements - { - "w0rp/ale", - event = "VeryLazy", - keys = { - { "f", "ALEFix", desc = "ALE Fix", silent = true }, - { "a", "ALEToggle", desc = "ALE Toggle", silent = true }, - }, - config = function() - vim.g.ale_linters_explicit = 1 - vim.g.ale_completion_enabled = 0 -- Using blink.cmp for completion - - vim.g.ale_linters = { - javascript = { "eslint", "stylelint", "biome" }, - typescript = { "eslint", "stylelint", "biome" }, - javascriptreact = { "eslint", "stylelint", "biome" }, - typescriptreact = { "eslint", "stylelint", "biome" }, - svelte = { "eslint" }, - go = { "golint", "go vet" }, - vue = { "eslint", "stylelint", "biome" }, - make = { "checkmake" }, - proto = { "protoc-gen-lint" }, - dockerfile = { "hadolint" }, - dart = { "dartanalyzer" }, - fish = { "fish" }, - vim = { "vint" }, - elixir = { "credo" }, - cs = { "OmniSharp" }, - terraform = { "tflint" }, - ruby = { "rubocop" }, - css = { "stylelint", "biome" }, - sh = { "shellcheck" }, - python = { "pylint" }, - } - - vim.g.ale_fixers = { - go = { "goimports", "remove_trailing_lines", "trim_whitespace" }, - graphql = { "prettier" }, - javascript = { "prettier", "biome" }, - typescript = { "prettier", "biome" }, - javascriptreact = { "prettier", "biome" }, - typescriptreact = { "prettier", "biome" }, - svelte = { "prettier" }, - vue = { "prettier", "biome" }, - css = { "prettier", "biome" }, - yaml = { "prettier", "biome" }, - json = { "prettier", "biome" }, - dart = { "dartfmt" }, - html = { "prettier", "biome" }, - markdown = { "prettier", "biome" }, - make = { "remove_trailing_lines", "trim_whitespace" }, - elixir = { "mix_format" }, - terraform = { "terraform" }, - ruby = { "rubocop" }, - python = { "black" }, - lua = { "stylua" }, - } - end, - }, - "tpope/vim-eunuch", - "tpope/vim-surround", - -- { "airblade/vim-gitgutter", lazy = false }, - { - "echasnovski/mini.diff", - version = false, - lazy = false, - opts = {}, - keys = { - { - "i", - function() - require("mini.diff").toggle_overlay() - end, - desc = "Mini.diff overlay", - silent = true, - }, - }, - }, - { - "reedes/vim-pencil", - cmd = { "HardPencil", "SoftPencil" }, - config = function() - vim.g["pencil#map#suspend_af"] = "K" -- Use bracket notation for '#' - end, - }, - { - "tpope/vim-fugitive", - cmd = { "G", "Git" }, - ft = "gitcommit", - }, - { - "folke/zen-mode.nvim", - opts = { - window = { - backdrop = 0.95, - }, - plugins = { - twilight = { enabled = false }, - }, - }, - keys = { - { "z", "ZenMode", desc = "Zen Mode", silent = true }, - }, - }, - { - "folke/twilight.nvim", - opts = {}, - keys = { - { "l", "Twilight", desc = "Twilight", silent = true }, - }, - }, - - -- Completion and LSP - { - "saghen/blink.cmp", - dependencies = { "rafamadriz/friendly-snippets" }, - version = "1.*", - ---@module 'blink.cmp' - ---@type blink.cmp.Config - opts = {}, - opts_extend = { "sources.default" }, - }, - { - "neovim/nvim-lspconfig", - dependencies = { "saghen/blink.cmp" }, - }, - - -- Navigation and search - { - "nvim-neo-tree/neo-tree.nvim", - branch = "v3.x", - dependencies = { - "nvim-lua/plenary.nvim", - "nvim-tree/nvim-web-devicons", - "MunifTanjim/nui.nvim", - }, - lazy = false, -- neo-tree will lazily load itself - ---@module "neo-tree" - ---@type neotree.Config? - opts = {}, - keys = { - { - "nn", - "Neotree toggle reveal_force_cwd", - desc = "Neo-tree Toggle Sidebar", - silent = true, - }, - { - "nf", - "Neotree float reveal_force_cwd", - desc = "Neo-tree Float", - silent = true, - }, - }, - }, - { - "nvim-telescope/telescope.nvim", - dependencies = { - "nvim-lua/plenary.nvim", - "nvim-tree/nvim-web-devicons", - }, - opts = {}, - keys = { - { "t", "Telescope", desc = "Telescope", silent = true }, - { "p", "Telescope git_files", desc = "Telescope Git Files", silent = true }, - { "", "Telescope find_files", desc = "Telescope Find Files", silent = true }, - -- Note: 's' is used by flash.nvim, this mapping shadows the default 's' jump. - -- You might want to change this leader mapping if you use flash jump often. - { "s", "Telescope treesitter", desc = "Telescope Treesitter", silent = true }, - { "gs", "Telescope grep_string", desc = "Telescope Grep String", silent = true }, - { "gl", "Telescope live_grep", desc = "Telescope Grep String", silent = true }, - { "gg", "Telescope lsp_definitions", desc = "LSP Definitions", silent = true }, - { "gr", "Telescope lsp_references", desc = "LSP References", silent = true }, - { "gi", "Telescope lsp_implementations", desc = "LSP Implementations", silent = true }, - { - "gd", - "Telescope lsp_type_definitions", - desc = "LSP Type Definitions", - silent = true, - }, - }, - }, - { - "nvim-telescope/telescope-fzf-native.nvim", - build = "make", - dependencies = { - "nvim-telescope/telescope.nvim", - }, - config = function() - require("telescope").load_extension("fzf") - end, - }, - { - "folke/flash.nvim", - event = "VeryLazy", - opts = {}, - keys = { - { - "s", - mode = { "n", "x", "o" }, - function() - require("flash").jump() - end, - desc = "Flash", - }, - { - "S", - mode = { "n", "x", "o" }, - function() - require("flash").treesitter() - end, - desc = "Flash Treesitter", - }, - { - "r", - mode = "o", - function() - require("flash").remote() - end, - desc = "Remote Flash", - }, - { - "R", - mode = { "o", "x" }, - function() - require("flash").treesitter_search() - end, - desc = "Treesitter Search", - }, - { - "", - mode = { "c" }, - function() - require("flash").toggle() - end, - desc = "Toggle Flash Search", - }, - }, - }, - - -- Treesitter - { - "nvim-treesitter/nvim-treesitter", - build = ":TSUpdate", - opts = { - ensure_installed = { - "c", - "cpp", - "lua", - "vim", - "regex", - "bash", - "fish", - "typescript", - "javascript", - "tsx", - "go", - "elixir", - "vue", - "groovy", - "java", - "objc", - "swift", - "hcl", - "terraform", - "yaml", - "json", - "markdown", - "markdown_inline", - }, - auto_install = false, - highlight = { - enable = true, - additional_vim_regex_highlighting = false, - }, - incremental_selection = { - enable = true, - keymaps = { - init_selection = "gnn", - node_incremental = "grn", - scope_incremental = "grc", - node_decremental = "grm", - }, - }, - indent = { - enable = true, - }, - }, - init = function() - vim.opt.foldmethod = "expr" - vim.opt.foldexpr = "nvim_treesitter#foldexpr()" - vim.opt.foldenable = false - end, - config = function(plugin, opts) - require("nvim-treesitter.configs").setup(opts) - end, - }, - - -- CodeCompanion - { - "olimorris/codecompanion.nvim", - dependencies = { "nvim-lua/plenary.nvim", "nvim-treesitter/nvim-treesitter", "echasnovski/mini.diff" }, - opts = { - display = { diff = { provider = "mini_diff" }, chat = { show_settings = true } }, - strategies = { - chat = { adapter = "gemini_deep" }, - inline = { adapter = "openai" }, - cmd = { adapter = "openai_mini" }, - }, - adapters = { - anthro = function() - return require("codecompanion.adapters").extend("anthropic", { - schema = { - model = { default = "claude-3-7-sonnet-20250219" }, - extended_thinking = { default = false }, - }, - }) - end, - anthro_deep = function() - return require("codecompanion.adapters").extend("anthropic", { - schema = { - model = { default = "claude-3-7-sonnet-20250219" }, - }, - }) - end, - gemini = function() - return require("codecompanion.adapters").extend("gemini", { - schema = { - model = { default = "gemini-2.5-flash-preview-04-17" }, - }, - }) - end, - gemini_deep = function() - return require("codecompanion.adapters").extend("gemini", { - schema = { - model = { default = "gemini-2.5-pro-preview-05-06" }, - }, - }) - end, - openai_mini = function() - return require("codecompanion.adapters").extend("openai", { - schema = { - model = { default = "gpt-4.1-mini" }, - }, - }) - end, - openai_deep = function() - return require("codecompanion.adapters").extend("openai", { - schema = { - model = { default = "o4-mini-2025-04-16" }, - reasoning_effort = { default = "high" }, - }, - }) - end, - }, - }, - keys = { - { "c", "CodeCompanionChat", desc = "CodeCompanion Chat", silent = true }, - }, - }, + { import = "plugins.ui" }, + { import = "plugins.editor" }, + { import = "plugins.lsp_completion" }, + { import = "plugins.navigation" }, + { import = "plugins.treesitter" }, + { import = "plugins.tools" }, }, }) --- General settings -vim.opt.guifont = "JetBrainsMono Nerd Font:h13" -vim.opt.colorcolumn = "100" -vim.opt.cursorline = true -vim.opt.showmatch = true -vim.opt.number = true -vim.opt.showmode = false -vim.opt.background = "dark" -vim.opt.wrap = false -vim.opt.cmdheight = 1 -vim.opt.shortmess:append("c") -vim.opt.termguicolors = true -vim.opt.mouse = "a" -vim.opt.mousemodel = "extend" -vim.opt.tabstop = 2 -vim.opt.shiftwidth = 0 -vim.opt.expandtab = true -vim.opt.textwidth = 100 -vim.opt.hlsearch = true -vim.opt.ignorecase = true -vim.opt.smartcase = true - --- Key Mappings -local map = vim.keymap.set -local map_opts_silent = { noremap = true, silent = true } - --- General Mappings -map("i", "jj", "", { noremap = true, silent = true, desc = "Escape Insert Mode" }) -map("t", "", "", { noremap = true, silent = true, desc = "Escape Terminal Mode" }) -map("v", "//", function() - vim.cmd("normal! y") - local sel = vim.fn.getreg('"') - local pattern = vim.fn.escape(sel, "/\\") - vim.fn.setreg("/", "\\V" .. pattern) - vim.cmd("normal! n") -end, { noremap = true, silent = true, desc = "Search for Visual Selection" }) - --- Neovide GUI Settings -if vim.g.neovide then - vim.g.neovide_scale_factor = 0.75 - vim.g.neovide_transparency = 0.7 - vim.g.neovide_cursor_vfx_mode = "sonicboom" -end - --- Autocommands -local augroup = vim.api.nvim_create_augroup -local autocmd = vim.api.nvim_create_autocmd - --- Fish filetype settings -augroup("FishSettings", { clear = true }) -autocmd("FileType", { - pattern = "fish", - command = "setlocal tabstop=4", - group = "FishSettings", -}) - --- Terminal settings -augroup("TerminalSettings", { clear = true }) -autocmd("TermOpen", { - pattern = "*", - command = "setlocal nonumber norelativenumber", - group = "TerminalSettings", -}) - --- LSP Mappings -local opts = { silent = true } -vim.keymap.set("n", "d", vim.diagnostic.open_float, opts) -vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts) -vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts) -vim.keymap.set("n", "q", vim.diagnostic.setloclist, opts) - --- Use an on_attach function to only map the following keys --- after the language server attaches to the current buffer -local on_attach = function(client, bufnr) - vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") - - local bufopts = { silent = true, buffer = bufnr } - vim.keymap.set("n", "h", vim.lsp.buf.hover, bufopts) - vim.keymap.set("n", "", vim.lsp.buf.signature_help, bufopts) - vim.keymap.set("n", "wa", vim.lsp.buf.add_workspace_folder, bufopts) - vim.keymap.set("n", "wr", vim.lsp.buf.remove_workspace_folder, bufopts) - vim.keymap.set("n", "wl", function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end, bufopts) - vim.keymap.set("n", "m", vim.lsp.buf.code_action, bufopts) - vim.keymap.set("n", "r", vim.lsp.buf.rename, bufopts) - vim.keymap.set("n", "F", function() - vim.lsp.buf.format({ async = true }) - end, bufopts) -end - --- LSP Setup -local lspconfig = require("lspconfig") -local capabilities = require("blink.cmp").get_lsp_capabilities() - -local lsp_flags = { debounce_text_changes = 150 } - -local vue_plugin_location = vim.fn.expand("$HOME/.bun/install/global/node_modules/@vue/typescript-plugin") - -vim.lsp.config("ts_ls", { - on_attach = on_attach, - flags = lsp_flags, - capabilities = capabilities, - filetypes = { - "javascript", - "typescript", - "javascriptreact", - "typescriptreact", - "vue", - }, - init_options = { - plugins = { - { - name = "@vue/typescript-plugin", - location = vue_plugin_location, - languages = { "javascript", "typescript", "vue" }, - }, - }, - }, -}) - -vim.lsp.enable("ts_ls") - -require("lspconfig").volar.setup({}) - -local servers = { "elixirls", "gopls", "pylsp", "svelte" } -for _, lsp in ipairs(servers) do - vim.lsp.config(lsp, { - on_attach = on_attach, - flags = lsp_flags, - capabilities = capabilities, - }) - vim.lsp.enable(lsp) -end +-- Load core configurations +require("core.options") +require("core.keymaps") +require("core.autocmds") diff --git a/.config/nvim/lua/core/autocmds.lua b/.config/nvim/lua/core/autocmds.lua new file mode 100644 index 0000000..8f406ca --- /dev/null +++ b/.config/nvim/lua/core/autocmds.lua @@ -0,0 +1,20 @@ +-- lua/core/autocmds.lua + +local augroup = vim.api.nvim_create_augroup +local autocmd = vim.api.nvim_create_autocmd + +-- Fish filetype settings +augroup("FishSettings", { clear = true }) +autocmd("FileType", { + pattern = "fish", + command = "setlocal tabstop=4", + group = "FishSettings", +}) + +-- Terminal settings +augroup("TerminalSettings", { clear = true }) +autocmd("TermOpen", { + pattern = "*", + command = "setlocal nonumber norelativenumber", + group = "TerminalSettings", +}) diff --git a/.config/nvim/lua/core/keymaps.lua b/.config/nvim/lua/core/keymaps.lua new file mode 100644 index 0000000..49d40c1 --- /dev/null +++ b/.config/nvim/lua/core/keymaps.lua @@ -0,0 +1,22 @@ +-- lua/core/keymaps.lua + +local map = vim.keymap.set +local map_opts_silent = { noremap = true, silent = true } + +-- General Mappings +map("i", "jj", "", { noremap = true, silent = true, desc = "Escape Insert Mode" }) +map("t", "", "", { noremap = true, silent = true, desc = "Escape Terminal Mode" }) +map("v", "//", function() + vim.cmd("normal! y") + local sel = vim.fn.getreg('"') + local pattern = vim.fn.escape(sel, "/\\") + vim.fn.setreg("/", "\\V" .. pattern) + vim.cmd("normal! n") +end, { noremap = true, silent = true, desc = "Search for Visual Selection" }) + +-- LSP Diagnostic Mappings +local diag_opts = { silent = true } +vim.keymap.set("n", "d", vim.diagnostic.open_float, diag_opts) +vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, diag_opts) +vim.keymap.set("n", "]d", vim.diagnostic.goto_next, diag_opts) +vim.keymap.set("n", "q", vim.diagnostic.setloclist, diag_opts) diff --git a/.config/nvim/lua/core/options.lua b/.config/nvim/lua/core/options.lua new file mode 100644 index 0000000..0a38a76 --- /dev/null +++ b/.config/nvim/lua/core/options.lua @@ -0,0 +1,28 @@ +-- lua/core/options.lua + +vim.opt.guifont = "JetBrainsMono Nerd Font:h13" +vim.opt.colorcolumn = "100" +vim.opt.cursorline = true +vim.opt.showmatch = true +vim.opt.number = true +vim.opt.showmode = false +vim.opt.background = "dark" +vim.opt.wrap = false +vim.opt.cmdheight = 1 +vim.opt.shortmess:append("c") +vim.opt.termguicolors = true +vim.opt.mouse = "a" +vim.opt.mousemodel = "extend" +vim.opt.tabstop = 2 +vim.opt.shiftwidth = 0 +vim.opt.expandtab = true +vim.opt.textwidth = 100 +vim.opt.hlsearch = true +vim.opt.ignorecase = true +vim.opt.smartcase = true + +if vim.g.neovide then + vim.g.neovide_scale_factor = 0.75 + vim.g.neovide_transparency = 0.7 + vim.g.neovide_cursor_vfx_mode = "sonicboom" +end diff --git a/.config/nvim/lua/plugins/editor.lua b/.config/nvim/lua/plugins/editor.lua new file mode 100644 index 0000000..9610b99 --- /dev/null +++ b/.config/nvim/lua/plugins/editor.lua @@ -0,0 +1,105 @@ +-- lua/plugins/editor.lua + +return { + "tpope/vim-fugitive", + "tpope/vim-eunuch", + "tpope/vim-surround", + { + "w0rp/ale", + event = "VeryLazy", + keys = { + { "f", "ALEFix", desc = "ALE Fix", silent = true }, + { "a", "ALEToggle", desc = "ALE Toggle", silent = true }, + }, + config = function() + vim.g.ale_linters_explicit = 1 + vim.g.ale_completion_enabled = 0 -- Using blink.cmp for completion + + vim.g.ale_linters = { + javascript = { "eslint", "stylelint", "biome" }, + typescript = { "eslint", "stylelint", "biome" }, + javascriptreact = { "eslint", "stylelint", "biome" }, + typescriptreact = { "eslint", "stylelint", "biome" }, + svelte = { "eslint" }, + go = { "golint", "go vet" }, + vue = { "eslint", "stylelint", "biome" }, + make = { "checkmake" }, + proto = { "protoc-gen-lint" }, + dockerfile = { "hadolint" }, + dart = { "dartanalyzer" }, + fish = { "fish" }, + vim = { "vint" }, + elixir = { "credo" }, + cs = { "OmniSharp" }, + terraform = { "tflint" }, + ruby = { "rubocop" }, + css = { "stylelint", "biome" }, + sh = { "shellcheck" }, + python = { "pylint" }, + } + + vim.g.ale_fixers = { + go = { "goimports", "remove_trailing_lines", "trim_whitespace" }, + graphql = { "prettier" }, + javascript = { "prettier", "biome" }, + typescript = { "prettier", "biome" }, + javascriptreact = { "prettier", "biome" }, + typescriptreact = { "prettier", "biome" }, + svelte = { "prettier" }, + vue = { "prettier", "biome" }, + css = { "prettier", "biome" }, + yaml = { "prettier", "biome" }, + json = { "prettier", "biome" }, + dart = { "dartfmt" }, + html = { "prettier", "biome" }, + markdown = { "prettier", "biome" }, + make = { "remove_trailing_lines", "trim_whitespace" }, + elixir = { "mix_format" }, + terraform = { "terraform" }, + ruby = { "rubocop" }, + python = { "black" }, + lua = { "stylua" }, + } + end, + }, + { + "echasnovski/mini.diff", + version = false, + lazy = false, + opts = {}, + keys = { + { + "i", + function() + require("mini.diff").toggle_overlay() + end, + desc = "Mini.diff overlay", + silent = true, + }, + }, + }, + { + "reedes/vim-pencil", + cmd = { "HardPencil", "SoftPencil" }, + config = function() + vim.g["pencil#map#suspend_af"] = "K" + end, + }, + { + "folke/zen-mode.nvim", + opts = { + window = { backdrop = 0.95 }, + plugins = { twilight = { enabled = false } }, + }, + keys = { + { "z", "ZenMode", desc = "Zen Mode", silent = true }, + }, + }, + { + "folke/twilight.nvim", + opts = {}, + keys = { + { "l", "Twilight", desc = "Twilight", silent = true }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/lsp_completion.lua b/.config/nvim/lua/plugins/lsp_completion.lua new file mode 100644 index 0000000..58e9f5e --- /dev/null +++ b/.config/nvim/lua/plugins/lsp_completion.lua @@ -0,0 +1,70 @@ +-- lua/plugins/lsp_completion.lua + +return { + { + "saghen/blink.cmp", + dependencies = { "rafamadriz/friendly-snippets" }, + version = "1.*", + opts = {}, + opts_extend = { "sources.default" }, + }, + { + "neovim/nvim-lspconfig", + dependencies = { "saghen/blink.cmp" }, + config = function() + local on_attach = function(client, bufnr) + vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") + local bufopts = { silent = true, buffer = bufnr } + vim.keymap.set("n", "h", vim.lsp.buf.hover, bufopts) + vim.keymap.set("n", "", vim.lsp.buf.signature_help, bufopts) + vim.keymap.set("n", "wa", vim.lsp.buf.add_workspace_folder, bufopts) + vim.keymap.set("n", "wr", vim.lsp.buf.remove_workspace_folder, bufopts) + vim.keymap.set("n", "wl", function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, bufopts) + vim.keymap.set("n", "m", vim.lsp.buf.code_action, bufopts) + vim.keymap.set("n", "r", vim.lsp.buf.rename, bufopts) + vim.keymap.set("n", "F", function() + vim.lsp.buf.format({ async = true }) + end, bufopts) + end + + local capabilities = require("blink.cmp").get_lsp_capabilities() + local lsp_flags = { debounce_text_changes = 150 } + local vue_plugin_location = vim.fn.expand("$HOME/.bun/install/global/node_modules/@vue/typescript-plugin") + + vim.lsp.config("ts_ls", { + on_attach = on_attach, + capabilities = capabilities, + flags = lsp_flags, + filetypes = { "javascript", "typescript", "javascriptreact", "typescriptreact", "vue" }, + init_options = { + plugins = { + { + name = "@vue/typescript-plugin", + location = vue_plugin_location, + languages = { "javascript", "typescript", "vue" }, + }, + }, + }, + }) + + vim.lsp.enable("ts_ls") + + require("lspconfig").volar.setup({ + on_attach = on_attach, + capabilities = capabilities, + }) + + local servers = { "elixirls", "gopls", "pylsp", "svelte" } + for _, server_name in ipairs(servers) do + vim.lsp.config(server_name, { + on_attach = on_attach, + capabilities = capabilities, + flags = lsp_flags, + }) + vim.lsp.enable(server_name) + end + end, + }, +} diff --git a/.config/nvim/lua/plugins/navigation.lua b/.config/nvim/lua/plugins/navigation.lua new file mode 100644 index 0000000..89b00cf --- /dev/null +++ b/.config/nvim/lua/plugins/navigation.lua @@ -0,0 +1,111 @@ +-- lua/plugins/navigation.lua + +return { + { + "nvim-neo-tree/neo-tree.nvim", + branch = "v3.x", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-tree/nvim-web-devicons", + "MunifTanjim/nui.nvim", + }, + lazy = false, + opts = {}, + keys = { + { + "nn", + "Neotree toggle reveal_force_cwd", + desc = "Neo-tree Toggle Sidebar", + silent = true, + }, + { + "nf", + "Neotree float reveal_force_cwd", + desc = "Neo-tree Float", + silent = true, + }, + }, + }, + { + "nvim-telescope/telescope.nvim", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-tree/nvim-web-devicons", + }, + opts = {}, + keys = { + { "t", "Telescope", desc = "Telescope", silent = true }, + { "p", "Telescope git_files", desc = "Telescope Git Files", silent = true }, + { "", "Telescope find_files", desc = "Telescope Find Files", silent = true }, + { "s", "Telescope treesitter", desc = "Telescope Treesitter", silent = true }, + { "gs", "Telescope grep_string", desc = "Telescope Grep String", silent = true }, + { "gl", "Telescope live_grep", desc = "Telescope Grep String", silent = true }, + { "gg", "Telescope lsp_definitions", desc = "LSP Definitions", silent = true }, + { "gr", "Telescope lsp_references", desc = "LSP References", silent = true }, + { "gi", "Telescope lsp_implementations", desc = "LSP Implementations", silent = true }, + { + "gd", + "Telescope lsp_type_definitions", + desc = "LSP Type Definitions", + silent = true, + }, + }, + }, + { + "nvim-telescope/telescope-fzf-native.nvim", + build = "make", + dependencies = { + "nvim-telescope/telescope.nvim", + }, + config = function() + require("telescope").load_extension("fzf") + end, + }, + { + "folke/flash.nvim", + event = "VeryLazy", + opts = {}, + keys = { + { + "s", + mode = { "n", "x", "o" }, + function() + require("flash").jump() + end, + desc = "Flash", + }, + { + "S", + mode = { "n", "x", "o" }, + function() + require("flash").treesitter() + end, + desc = "Flash Treesitter", + }, + { + "r", + mode = "o", + function() + require("flash").remote() + end, + desc = "Remote Flash", + }, + { + "R", + mode = { "o", "x" }, + function() + require("flash").treesitter_search() + end, + desc = "Treesitter Search", + }, + { + "", + mode = { "c" }, + function() + require("flash").toggle() + end, + desc = "Toggle Flash Search", + }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/tools.lua b/.config/nvim/lua/plugins/tools.lua new file mode 100644 index 0000000..9cab4ad --- /dev/null +++ b/.config/nvim/lua/plugins/tools.lua @@ -0,0 +1,69 @@ +-- lua/plugins/tools.lua + +return { + { + "olimorris/codecompanion.nvim", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-treesitter/nvim-treesitter", + "echasnovski/mini.diff", + }, + opts = { + display = { diff = { provider = "mini_diff" }, chat = { show_settings = true } }, + strategies = { + chat = { adapter = "gemini_deep" }, + inline = { adapter = "openai" }, + cmd = { adapter = "openai_mini" }, + }, + adapters = { + anthro = function() + return require("codecompanion.adapters").extend("anthropic", { + schema = { + model = { default = "claude-3-7-sonnet-20250219" }, + extended_thinking = { default = false }, + }, + }) + end, + anthro_deep = function() + return require("codecompanion.adapters").extend("anthropic", { + schema = { + model = { default = "claude-3-7-sonnet-20250219" }, + }, + }) + end, + gemini = function() + return require("codecompanion.adapters").extend("gemini", { + schema = { + model = { default = "gemini-2.5-flash-preview-04-17" }, + }, + }) + end, + gemini_deep = function() + return require("codecompanion.adapters").extend("gemini", { + schema = { + model = { default = "gemini-2.5-pro-preview-05-06" }, + }, + }) + end, + openai_mini = function() + return require("codecompanion.adapters").extend("openai", { + schema = { + model = { default = "gpt-4.1-mini" }, + }, + }) + end, + openai_deep = function() + return require("codecompanion.adapters").extend("openai", { + schema = { + model = { default = "o4-mini-2025-04-16" }, + reasoning_effort = { default = "high" }, + }, + }) + end, + }, + }, + keys = { + { "c", "CodeCompanionChat", desc = "CodeCompanion Chat", silent = true }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/treesitter.lua b/.config/nvim/lua/plugins/treesitter.lua new file mode 100644 index 0000000..6e1246d --- /dev/null +++ b/.config/nvim/lua/plugins/treesitter.lua @@ -0,0 +1,60 @@ +-- lua/plugins/treesitter.lua + +return { + { + "nvim-treesitter/nvim-treesitter", + build = ":TSUpdate", + opts = { + ensure_installed = { + "c", + "cpp", + "lua", + "vim", + "regex", + "bash", + "fish", + "typescript", + "javascript", + "tsx", + "go", + "elixir", + "vue", + "groovy", + "java", + "objc", + "swift", + "hcl", + "terraform", + "yaml", + "json", + "markdown", + "markdown_inline", + }, + auto_install = false, + highlight = { + enable = true, + additional_vim_regex_highlighting = false, + }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = "gnn", + node_incremental = "grn", + scope_incremental = "grc", + node_decremental = "grm", + }, + }, + indent = { + enable = true, + }, + }, + init = function() + vim.opt.foldmethod = "expr" + vim.opt.foldexpr = "nvim_treesitter#foldexpr()" + vim.opt.foldenable = false + end, + config = function(plugin, opts) + require("nvim-treesitter.configs").setup(opts) + end, + }, +} diff --git a/.config/nvim/lua/plugins/ui.lua b/.config/nvim/lua/plugins/ui.lua new file mode 100644 index 0000000..b344cc0 --- /dev/null +++ b/.config/nvim/lua/plugins/ui.lua @@ -0,0 +1,90 @@ +-- lua/plugins/ui.lua + +return { + "edkolev/tmuxline.vim", + { + "rebelot/kanagawa.nvim", + lazy = false, + priority = 1000, + opts = { transparent = not vim.g.neovide }, + init = function() + vim.cmd([[colorscheme kanagawa]]) + end, + }, + { + "akinsho/bufferline.nvim", + event = "VeryLazy", + version = "*", + dependencies = { "nvim-tree/nvim-web-devicons" }, + opts = { + options = { + separator_style = "slope", + offsets = { + { + filetype = "neo-tree", + text = "explorer", + highlight = "Directory", + separator = true, + }, + }, + }, + }, + keys = { + { "j", "BufferLinePick", desc = "BufferLinePick", silent = true }, + { "J", "BufferLinePickClose", desc = "BufferLinePickClose", silent = true }, + }, + }, + { + "nvim-lualine/lualine.nvim", + dependencies = { "nvim-tree/nvim-web-devicons" }, + opts = { + extensions = { + "neo-tree", + "symbols-outline", + }, + }, + }, + { + "rcarriga/nvim-notify", + opts = { + background_colour = "#000000", + }, + }, + { + "folke/noice.nvim", + event = "VeryLazy", + dependencies = { "MunifTanjim/nui.nvim", "rcarriga/nvim-notify" }, + opts = { + lsp = { + override = { + ["vim.lsp.util.convert_input_to_markdown_lines"] = true, + ["vim.lsp.util.stylize_markdown"] = true, + ["cmp.entry.get_documentation"] = true, + }, + }, + presets = { + bottom_search = true, + command_palette = true, + long_message_to_split = true, + }, + views = { + notify = { + replace = true, + merge = true, + }, + }, + }, + }, + { + "OXY2DEV/markview.nvim", + lazy = false, + dependencies = { "saghen/blink.cmp" }, + opts = { + preview = { + icon_provider = "devicons", + filetypes = { "markdown", "codecompanion" }, + ignore_buftypes = {}, + }, + }, + }, +} diff --git a/install_utils b/install_utils new file mode 100755 index 0000000..83a46e7 --- /dev/null +++ b/install_utils @@ -0,0 +1,77 @@ +#!/usr/bin/env fish + +test -e /etc/os-release; and source /etc/os-release + +set -l uname (uname) + +if test $uname = Darwin + set -l distro mac +else + set -l distro $ID +end + +set -l base_pkgs \ + fish \ + git \ + neovim \ + tmux \ + rsync \ + curl \ + fzf \ + mosh \ + lsd \ + ripgrep \ + bat + +set -l mac_pkgs \ + $base_pkgs \ + fd \ + yazi \ + git-delta \ + starship + +set -l arch_pkgs \ + $base_pkgs \ + fd \ + yazi \ + git-delta \ + starship + +set -l debian_pkgs \ + $base_pkgs \ + fd-find + +switch $distro + case mac + log 'Installing packages with Homebrew' + brew install $mac_pkgs + case arch + log 'Installing Pikaur' + + install_pkgs --needed base-devel + or return $status + + set -l cwd (pwd) + and set -l tmp_dir (mktemp --directory) + or return $status + + git clone https://aur.archlinux.org/pikaur.git $tmp_dir + and cd $tmp_dir + and makepkg --clean --install --rmdeps --syncdeps --noconfirm + and cd $cwd + or return $status + + log 'Installing packages with Pikaur ' + + pikaur --sync --refresh --sysupgrade --noconfirm + and pikaur --sync --noconfirm $arch_pkgs + case debian + log 'Installing packages with APT' + sudo apt-get --quiet --yes update + and sudo apt-get --quiet --yes upgrade + and sudo apt-get --quiet --yes install $debian_pkgs +end + +function log -a message + echo \n"--- $message ---"\n +end From 73c5b0b7d7f08fd8c7ef68603f629f61ba4a6c10 Mon Sep 17 00:00:00 2001 From: mitchell Date: Mon, 19 May 2025 15:57:08 -0400 Subject: [PATCH 09/17] Add AI helper functions, update plugins, and codecompanion updates --- .config/fish/functions/adr.fish | 9 ++++ .config/fish/functions/aikeys.fish | 10 +++++ .config/nvim/lazy-lock.json | 30 +++++++++++++ .config/nvim/lua/plugins/editor.lua | 2 +- .config/nvim/lua/plugins/navigation.lua | 2 +- .config/nvim/lua/plugins/tools.lua | 58 ++++++++++++------------- .config/nvim/lua/plugins/treesitter.lua | 1 + .gitconfig | 12 ++--- 8 files changed, 87 insertions(+), 37 deletions(-) create mode 100644 .config/fish/functions/adr.fish create mode 100644 .config/fish/functions/aikeys.fish create mode 100644 .config/nvim/lazy-lock.json diff --git a/.config/fish/functions/adr.fish b/.config/fish/functions/adr.fish new file mode 100644 index 0000000..4b8762a --- /dev/null +++ b/.config/fish/functions/adr.fish @@ -0,0 +1,9 @@ +function adr --wraps aider + aider \ + --model gemini \ + --editor-model gpt-4.1-mini \ + --weak-model gpt-4.1-mini \ + --dark-mode \ + --completion-menu-bg-color '#1f1f28' \ + --vim $argv +end diff --git a/.config/fish/functions/aikeys.fish b/.config/fish/functions/aikeys.fish new file mode 100644 index 0000000..daf5843 --- /dev/null +++ b/.config/fish/functions/aikeys.fish @@ -0,0 +1,10 @@ +function aikeys -d 'Set AI API keys' -a service + switch $service + case gemini + echo "set -lx GEMINI_API_KEY (kp Keys/google-aistudio-key -a Password)" + case openai + echo "set -lx OPENAI_API_KEY (kp Keys/openai-general -a Password)" + case anthro + echo "set -lx ANTHROPIC_API_KEY (kp Keys/google-aistudio-key -a Password)" + end +end diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json new file mode 100644 index 0000000..438dbe5 --- /dev/null +++ b/.config/nvim/lazy-lock.json @@ -0,0 +1,30 @@ +{ + "ale": { "branch": "master", "commit": "5098dfd27edf2b38e5af284f6f440d24cf806b53" }, + "blink.cmp": { "branch": "main", "commit": "022521a8910a5543b0251b21c9e1a1e989745796" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, + "codecompanion.nvim": { "branch": "main", "commit": "0beb9183954ae1afa2e1f5a91812706764d1a743" }, + "flash.nvim": { "branch": "main", "commit": "3c942666f115e2811e959eabbdd361a025db8b63" }, + "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, + "kanagawa.nvim": { "branch": "master", "commit": "4de88d695634a8776c687af8e7436cfa074aa0c0" }, + "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, + "lualine.nvim": { "branch": "master", "commit": "15884cee63a8c205334ab13ab1c891cd4d27101a" }, + "markview.nvim": { "branch": "main", "commit": "23f8bda5a172287c3423a3ffe7640efefa52a48b" }, + "mini.diff": { "branch": "main", "commit": "ec8a5ae365c5d15920721ea42b1351dbc9e61f2d" }, + "neo-tree.nvim": { "branch": "v3.x", "commit": "f481de16a0eb59c985abac8985e3f2e2f75b4875" }, + "noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" }, + "nui.nvim": { "branch": "main", "commit": "f535005e6ad1016383f24e39559833759453564e" }, + "nvim-lspconfig": { "branch": "master", "commit": "ac1dfbe3b60e5e23a2cff90e3bd6a3bc88031a57" }, + "nvim-notify": { "branch": "master", "commit": "b5825cf9ee881dd8e43309c93374ed5b87b7a896" }, + "nvim-treesitter": { "branch": "master", "commit": "066fd6505377e3fd4aa219e61ce94c2b8bdb0b79" }, + "nvim-web-devicons": { "branch": "master", "commit": "1fb58cca9aebbc4fd32b086cb413548ce132c127" }, + "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" }, + "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" }, + "telescope.nvim": { "branch": "master", "commit": "b4da76be54691e854d3e0e02c36b0245f945c2c7" }, + "tmuxline.vim": { "branch": "master", "commit": "4119c553923212cc67f4e135e6f946dc3ec0a4d6" }, + "twilight.nvim": { "branch": "main", "commit": "1584c0b0a979b71fd86b18d302ba84e9aba85b1b" }, + "vim-eunuch": { "branch": "master", "commit": "e86bb794a1c10a2edac130feb0ea590a00d03f1e" }, + "vim-fugitive": { "branch": "master", "commit": "4a745ea72fa93bb15dd077109afbb3d1809383f2" }, + "vim-pencil": { "branch": "master", "commit": "6d70438a8886eaf933c38a7a43a61adb0a7815ed" }, + "vim-surround": { "branch": "master", "commit": "3d188ed2113431cf8dac77be61b842acb64433d9" }, + "zen-mode.nvim": { "branch": "main", "commit": "863f150ca321b3dd8aa1a2b69b5f411a220e144f" } +} diff --git a/.config/nvim/lua/plugins/editor.lua b/.config/nvim/lua/plugins/editor.lua index 9610b99..367542e 100644 --- a/.config/nvim/lua/plugins/editor.lua +++ b/.config/nvim/lua/plugins/editor.lua @@ -88,7 +88,7 @@ return { { "folke/zen-mode.nvim", opts = { - window = { backdrop = 0.95 }, + window = { backdrop = 0.95, options = { number = false } }, plugins = { twilight = { enabled = false } }, }, keys = { diff --git a/.config/nvim/lua/plugins/navigation.lua b/.config/nvim/lua/plugins/navigation.lua index 89b00cf..dc0bda1 100644 --- a/.config/nvim/lua/plugins/navigation.lua +++ b/.config/nvim/lua/plugins/navigation.lua @@ -14,7 +14,7 @@ return { keys = { { "nn", - "Neotree toggle reveal_force_cwd", + "Neotree left reveal_force_cwd", desc = "Neo-tree Toggle Sidebar", silent = true, }, diff --git a/.config/nvim/lua/plugins/tools.lua b/.config/nvim/lua/plugins/tools.lua index 9cab4ad..88a5dce 100644 --- a/.config/nvim/lua/plugins/tools.lua +++ b/.config/nvim/lua/plugins/tools.lua @@ -9,50 +9,34 @@ return { "echasnovski/mini.diff", }, opts = { - display = { diff = { provider = "mini_diff" }, chat = { show_settings = true } }, + display = { + diff = { provider = "mini_diff" }, + chat = { + show_settings = false, + window = { position = "right", opts = { number = false } }, + }, + }, strategies = { - chat = { adapter = "gemini_deep" }, - inline = { adapter = "openai" }, + chat = { adapter = "gemini" }, + inline = { adapter = "openai_mini" }, cmd = { adapter = "openai_mini" }, }, adapters = { - anthro = function() + anthropic = function() return require("codecompanion.adapters").extend("anthropic", { schema = { - model = { default = "claude-3-7-sonnet-20250219" }, - extended_thinking = { default = false }, - }, - }) - end, - anthro_deep = function() - return require("codecompanion.adapters").extend("anthropic", { - schema = { - model = { default = "claude-3-7-sonnet-20250219" }, + max_tokens = { default = 20000 }, }, }) end, gemini = function() - return require("codecompanion.adapters").extend("gemini", { - schema = { - model = { default = "gemini-2.5-flash-preview-04-17" }, - }, - }) - end, - gemini_deep = function() return require("codecompanion.adapters").extend("gemini", { schema = { model = { default = "gemini-2.5-pro-preview-05-06" }, }, }) end, - openai_mini = function() - return require("codecompanion.adapters").extend("openai", { - schema = { - model = { default = "gpt-4.1-mini" }, - }, - }) - end, - openai_deep = function() + openai = function() return require("codecompanion.adapters").extend("openai", { schema = { model = { default = "o4-mini-2025-04-16" }, @@ -60,10 +44,26 @@ return { }, }) end, + openai_mini = function() + return require("codecompanion.adapters").extend("openai", { + schema = { + model = { default = "gpt-4.1-mini" }, + temperature = { default = 0 }, + }, + }) + end, }, }, keys = { - { "c", "CodeCompanionChat", desc = "CodeCompanion Chat", silent = true }, + { "cc", "CodeCompanionChat", desc = "CodeCompanion Chat", silent = true }, + { + "cf", + "CodeCompanionChat openai_mini", + desc = "CodeCompanion Chat (Fast)", + silent = true, + }, + { "ca", "CodeCompanionActions", desc = "CodeCompanion Actions", silent = true }, + { "ci", ":CodeCompanion", mode = { "n", "v" }, desc = "CodeCompanion Inline" }, }, }, } diff --git a/.config/nvim/lua/plugins/treesitter.lua b/.config/nvim/lua/plugins/treesitter.lua index 6e1246d..777d171 100644 --- a/.config/nvim/lua/plugins/treesitter.lua +++ b/.config/nvim/lua/plugins/treesitter.lua @@ -16,6 +16,7 @@ return { "typescript", "javascript", "tsx", + "svelte", "go", "elixir", "vue", diff --git a/.gitconfig b/.gitconfig index 8f34b78..332cf4c 100644 --- a/.gitconfig +++ b/.gitconfig @@ -44,10 +44,10 @@ diffFilter = delta --color-only [delta] - features = side-by-side line-numbers decorations - whitespace-error-style = 22 reverse + navigate = true + dark = true + side-by-side = true + line-numbers = true -[delta "decorations"] - commit-decoration-style = bold yellow box ul - file-style = bold yellow ul - file-decoration-style = none +[merge] + conflictstyle = zdiff3 From 184dad82e08cb5531f562748408f8c4ba090e251 Mon Sep 17 00:00:00 2001 From: mitchell Date: Mon, 19 May 2025 19:48:40 -0400 Subject: [PATCH 10/17] Improve AI configuration and key management - Remove unnecessary model options from `adr` function. - Update Anthropics key path in `aikeys` function. - Refactor CodeCompanion adapters to use specific Gemini models with different reasoning efforts. - Add gitignore for .aider* files. --- .config/fish/functions/adr.fish | 2 -- .config/fish/functions/aikeys.fish | 2 +- .config/nvim/lua/plugins/tools.lua | 33 +++++++++++++++++++----------- .gitignore | 1 + 4 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 .gitignore diff --git a/.config/fish/functions/adr.fish b/.config/fish/functions/adr.fish index 4b8762a..15d577a 100644 --- a/.config/fish/functions/adr.fish +++ b/.config/fish/functions/adr.fish @@ -1,8 +1,6 @@ function adr --wraps aider aider \ --model gemini \ - --editor-model gpt-4.1-mini \ - --weak-model gpt-4.1-mini \ --dark-mode \ --completion-menu-bg-color '#1f1f28' \ --vim $argv diff --git a/.config/fish/functions/aikeys.fish b/.config/fish/functions/aikeys.fish index daf5843..bd36b01 100644 --- a/.config/fish/functions/aikeys.fish +++ b/.config/fish/functions/aikeys.fish @@ -5,6 +5,6 @@ function aikeys -d 'Set AI API keys' -a service case openai echo "set -lx OPENAI_API_KEY (kp Keys/openai-general -a Password)" case anthro - echo "set -lx ANTHROPIC_API_KEY (kp Keys/google-aistudio-key -a Password)" + echo "set -lx ANTHROPIC_API_KEY (kp Keys/anthropic-bespin-nvim -a Password)" end end diff --git a/.config/nvim/lua/plugins/tools.lua b/.config/nvim/lua/plugins/tools.lua index 88a5dce..0a87ff4 100644 --- a/.config/nvim/lua/plugins/tools.lua +++ b/.config/nvim/lua/plugins/tools.lua @@ -17,14 +17,15 @@ return { }, }, strategies = { - chat = { adapter = "gemini" }, - inline = { adapter = "openai_mini" }, - cmd = { adapter = "openai_mini" }, + chat = { adapter = "gemini_high" }, + inline = { adapter = "gemini_none" }, + cmd = { adapter = "gemini_none" }, }, adapters = { anthropic = function() return require("codecompanion.adapters").extend("anthropic", { schema = { + model = { default = "claude-3-7-sonnet-20250219" }, max_tokens = { default = 20000 }, }, }) @@ -36,6 +37,22 @@ return { }, }) end, + gemini_none = function() + return require("codecompanion.adapters").extend("gemini", { + schema = { + model = { default = "gemini-2.5-flash-preview-04-17" }, + reasoning_effort = { default = "none" }, + }, + }) + end, + gemini_high = function() + return require("codecompanion.adapters").extend("gemini", { + schema = { + model = { default = "gemini-2.5-flash-preview-04-17" }, + reasoning_effort = { default = "high" }, + }, + }) + end, openai = function() return require("codecompanion.adapters").extend("openai", { schema = { @@ -44,21 +61,13 @@ return { }, }) end, - openai_mini = function() - return require("codecompanion.adapters").extend("openai", { - schema = { - model = { default = "gpt-4.1-mini" }, - temperature = { default = 0 }, - }, - }) - end, }, }, keys = { { "cc", "CodeCompanionChat", desc = "CodeCompanion Chat", silent = true }, { "cf", - "CodeCompanionChat openai_mini", + "CodeCompanionChat gemini_none", desc = "CodeCompanion Chat (Fast)", silent = true, }, diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b0ac3ed --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.aider* From f8d58198c04fd096a89cd56150233b44d1f057fc Mon Sep 17 00:00:00 2001 From: mitchell Date: Wed, 21 May 2025 19:38:17 -0400 Subject: [PATCH 11/17] feat: add ollama and gemini_pro adapters --- .config/nvim/lua/plugins/tools.lua | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/.config/nvim/lua/plugins/tools.lua b/.config/nvim/lua/plugins/tools.lua index 0a87ff4..00628b3 100644 --- a/.config/nvim/lua/plugins/tools.lua +++ b/.config/nvim/lua/plugins/tools.lua @@ -22,39 +22,42 @@ return { cmd = { adapter = "gemini_none" }, }, adapters = { - anthropic = function() - return require("codecompanion.adapters").extend("anthropic", { - schema = { - model = { default = "claude-3-7-sonnet-20250219" }, - max_tokens = { default = 20000 }, - }, + ollama = function() + return require("codecompanion.adapters").extend("ollama", { + name = "ollama", + env = { url = "http://192.168.1.165:11434" }, + parameters = { sync = true }, + schema = { num_ctx = { default = 8192 } }, }) end, - gemini = function() + gemini_pro = function() return require("codecompanion.adapters").extend("gemini", { - schema = { - model = { default = "gemini-2.5-pro-preview-05-06" }, - }, + name = "gemini_pro", + schema = { model = { default = "gemini-2.5-pro-preview-05-06" } }, }) end, gemini_none = function() return require("codecompanion.adapters").extend("gemini", { + name = "gemini_none", schema = { - model = { default = "gemini-2.5-flash-preview-04-17" }, + model = { default = "gemini-2.5-flash-preview-05-20" }, reasoning_effort = { default = "none" }, + temperature = { default = 0 }, }, }) end, gemini_high = function() return require("codecompanion.adapters").extend("gemini", { + name = "gemini_high", schema = { - model = { default = "gemini-2.5-flash-preview-04-17" }, + model = { default = "gemini-2.5-flash-preview-05-20" }, reasoning_effort = { default = "high" }, }, }) end, - openai = function() + openai_high = function() return require("codecompanion.adapters").extend("openai", { + name = "openai_high", schema = { model = { default = "o4-mini-2025-04-16" }, reasoning_effort = { default = "high" }, From ef8b5dc97f62af32d1ed32c905851ab02a05e9b2 Mon Sep 17 00:00:00 2001 From: "mitchell (aider)" Date: Wed, 21 May 2025 20:43:06 -0400 Subject: [PATCH 12/17] refactor: Use helper function to create adapters --- .config/nvim/lua/plugins/tools.lua | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/.config/nvim/lua/plugins/tools.lua b/.config/nvim/lua/plugins/tools.lua index 00628b3..f329cb6 100644 --- a/.config/nvim/lua/plugins/tools.lua +++ b/.config/nvim/lua/plugins/tools.lua @@ -1,5 +1,14 @@ -- lua/plugins/tools.lua +local function create_adapter(adapter_type, name, opts) + return require("codecompanion.adapters").extend(adapter_type, { + name = name, + schema = opts.schema or {}, + env = opts.env or {}, + parameters = opts.parameters or {}, + }) +end + return { { "olimorris/codecompanion.nvim", @@ -23,22 +32,19 @@ return { }, adapters = { ollama = function() - return require("codecompanion.adapters").extend("ollama", { - name = "ollama", + return create_adapter("ollama", "ollama", { env = { url = "http://192.168.1.165:11434" }, parameters = { sync = true }, schema = { num_ctx = { default = 8192 } }, }) end, gemini_pro = function() - return require("codecompanion.adapters").extend("gemini", { - name = "gemini_pro", + return create_adapter("gemini", "gemini_pro", { schema = { model = { default = "gemini-2.5-pro-preview-05-06" } }, }) end, gemini_none = function() - return require("codecompanion.adapters").extend("gemini", { - name = "gemini_none", + return create_adapter("gemini", "gemini_none", { schema = { model = { default = "gemini-2.5-flash-preview-05-20" }, reasoning_effort = { default = "none" }, @@ -47,8 +53,7 @@ return { }) end, gemini_high = function() - return require("codecompanion.adapters").extend("gemini", { - name = "gemini_high", + return create_adapter("gemini", "gemini_high", { schema = { model = { default = "gemini-2.5-flash-preview-05-20" }, reasoning_effort = { default = "high" }, @@ -56,8 +61,7 @@ return { }) end, openai_high = function() - return require("codecompanion.adapters").extend("openai", { - name = "openai_high", + return create_adapter("openai", "openai_high", { schema = { model = { default = "o4-mini-2025-04-16" }, reasoning_effort = { default = "high" }, From bac32bec1980a46ad5d101ab6088206385239103 Mon Sep 17 00:00:00 2001 From: mitchell Date: Wed, 21 May 2025 20:55:55 -0400 Subject: [PATCH 13/17] refactor: improve adapter creation function readability --- .config/nvim/lua/plugins/tools.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.config/nvim/lua/plugins/tools.lua b/.config/nvim/lua/plugins/tools.lua index f329cb6..fa7cb45 100644 --- a/.config/nvim/lua/plugins/tools.lua +++ b/.config/nvim/lua/plugins/tools.lua @@ -1,12 +1,12 @@ -- lua/plugins/tools.lua local function create_adapter(adapter_type, name, opts) - return require("codecompanion.adapters").extend(adapter_type, { - name = name, - schema = opts.schema or {}, - env = opts.env or {}, - parameters = opts.parameters or {}, - }) + return require("codecompanion.adapters").extend(adapter_type, { + name = name, + schema = opts.schema or {}, + env = opts.env or {}, + parameters = opts.parameters or {}, + }) end return { From 256a64d8cf1829042785b9207d3d64f14cae4bab Mon Sep 17 00:00:00 2001 From: "mitchell (aider)" Date: Wed, 21 May 2025 21:05:15 -0400 Subject: [PATCH 14/17] feat: remove redundant `name` field from adapter configs --- .config/nvim/lua/plugins/tools.lua | 83 ++++++++++++++++-------------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/.config/nvim/lua/plugins/tools.lua b/.config/nvim/lua/plugins/tools.lua index fa7cb45..72c8b60 100644 --- a/.config/nvim/lua/plugins/tools.lua +++ b/.config/nvim/lua/plugins/tools.lua @@ -9,6 +9,49 @@ local function create_adapter(adapter_type, name, opts) }) end +local adapter_configs = { + ollama = { + type = "ollama", + env = { url = "http://192.168.1.165:11434" }, + parameters = { sync = true }, + schema = { num_ctx = { default = 8192 } }, + }, + gemini_pro = { + type = "gemini", + schema = { model = { default = "gemini-2.5-pro-preview-05-06" } }, + }, + gemini_none = { + type = "gemini", + schema = { + model = { default = "gemini-2.5-flash-preview-05-20" }, + reasoning_effort = { default = "none" }, + temperature = { default = 0 }, + }, + }, + gemini_high = { + type = "gemini", + schema = { + model = { default = "gemini-2.5-flash-preview-05-20" }, + reasoning_effort = { default = "high" }, + }, + }, + openai_high = { + type = "openai", + schema = { + model = { default = "o4-mini-2025-04-16" }, + reasoning_effort = { default = "high" }, + }, + }, +} + +-- Dynamically generate adapter functions +local adapters = {} +for name, config in pairs(adapter_configs) do + adapters[name] = function() + return create_adapter(config.type, name, config) + end +end + return { { "olimorris/codecompanion.nvim", @@ -30,45 +73,7 @@ return { inline = { adapter = "gemini_none" }, cmd = { adapter = "gemini_none" }, }, - adapters = { - ollama = function() - return create_adapter("ollama", "ollama", { - env = { url = "http://192.168.1.165:11434" }, - parameters = { sync = true }, - schema = { num_ctx = { default = 8192 } }, - }) - end, - gemini_pro = function() - return create_adapter("gemini", "gemini_pro", { - schema = { model = { default = "gemini-2.5-pro-preview-05-06" } }, - }) - end, - gemini_none = function() - return create_adapter("gemini", "gemini_none", { - schema = { - model = { default = "gemini-2.5-flash-preview-05-20" }, - reasoning_effort = { default = "none" }, - temperature = { default = 0 }, - }, - }) - end, - gemini_high = function() - return create_adapter("gemini", "gemini_high", { - schema = { - model = { default = "gemini-2.5-flash-preview-05-20" }, - reasoning_effort = { default = "high" }, - }, - }) - end, - openai_high = function() - return create_adapter("openai", "openai_high", { - schema = { - model = { default = "o4-mini-2025-04-16" }, - reasoning_effort = { default = "high" }, - }, - }) - end, - }, + adapters = adapters, }, keys = { { "cc", "CodeCompanionChat", desc = "CodeCompanion Chat", silent = true }, From 0df65efe7c5190f7070f01e503ab4bce4123f35c Mon Sep 17 00:00:00 2001 From: mitchell Date: Thu, 29 May 2025 17:27:27 -0400 Subject: [PATCH 15/17] chore: Update adr alias and codecompanion configuration --- .config/fish/functions/adr.fish | 7 ------- .config/fish/functions/define_aliases.fish | 1 + .config/nvim/lazy-lock.json | 16 ++++++++-------- .config/nvim/lua/plugins/tools.lua | 2 +- 4 files changed, 10 insertions(+), 16 deletions(-) delete mode 100644 .config/fish/functions/adr.fish diff --git a/.config/fish/functions/adr.fish b/.config/fish/functions/adr.fish deleted file mode 100644 index 15d577a..0000000 --- a/.config/fish/functions/adr.fish +++ /dev/null @@ -1,7 +0,0 @@ -function adr --wraps aider - aider \ - --model gemini \ - --dark-mode \ - --completion-menu-bg-color '#1f1f28' \ - --vim $argv -end diff --git a/.config/fish/functions/define_aliases.fish b/.config/fish/functions/define_aliases.fish index 5a453c3..3d46c76 100644 --- a/.config/fish/functions/define_aliases.fish +++ b/.config/fish/functions/define_aliases.fish @@ -20,6 +20,7 @@ function define_aliases -a uname -d 'Defines aliases for commonly used commands' alias hx helix alias ai aichat alias ais aisearch + alias adr aider switch "$uname" case Linux diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json index 438dbe5..359a0c3 100644 --- a/.config/nvim/lazy-lock.json +++ b/.config/nvim/lazy-lock.json @@ -1,21 +1,21 @@ { - "ale": { "branch": "master", "commit": "5098dfd27edf2b38e5af284f6f440d24cf806b53" }, + "ale": { "branch": "master", "commit": "80ff84db84ba172bfcdee5e2748924bb2249134b" }, "blink.cmp": { "branch": "main", "commit": "022521a8910a5543b0251b21c9e1a1e989745796" }, "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, - "codecompanion.nvim": { "branch": "main", "commit": "0beb9183954ae1afa2e1f5a91812706764d1a743" }, + "codecompanion.nvim": { "branch": "main", "commit": "a5a8701bf8814ff0ba9bf5f76b3a3deedf3e5f28" }, "flash.nvim": { "branch": "main", "commit": "3c942666f115e2811e959eabbdd361a025db8b63" }, "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, - "kanagawa.nvim": { "branch": "master", "commit": "4de88d695634a8776c687af8e7436cfa074aa0c0" }, + "kanagawa.nvim": { "branch": "master", "commit": "debe91547d7fb1eef34ce26a5106f277fbfdd109" }, "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, - "lualine.nvim": { "branch": "master", "commit": "15884cee63a8c205334ab13ab1c891cd4d27101a" }, - "markview.nvim": { "branch": "main", "commit": "23f8bda5a172287c3423a3ffe7640efefa52a48b" }, - "mini.diff": { "branch": "main", "commit": "ec8a5ae365c5d15920721ea42b1351dbc9e61f2d" }, + "lualine.nvim": { "branch": "master", "commit": "0c6cca9f2c63dadeb9225c45bc92bb95a151d4af" }, + "markview.nvim": { "branch": "main", "commit": "68c9603b6f88fd962444f8579024418fe5e170f1" }, + "mini.diff": { "branch": "main", "commit": "f7bcd3cb4561f7d3a02ae9afafeda899c82f7108" }, "neo-tree.nvim": { "branch": "v3.x", "commit": "f481de16a0eb59c985abac8985e3f2e2f75b4875" }, "noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" }, "nui.nvim": { "branch": "main", "commit": "f535005e6ad1016383f24e39559833759453564e" }, - "nvim-lspconfig": { "branch": "master", "commit": "ac1dfbe3b60e5e23a2cff90e3bd6a3bc88031a57" }, + "nvim-lspconfig": { "branch": "master", "commit": "3ea99227e316c5028f57a4d86a1a7fd01dd876d0" }, "nvim-notify": { "branch": "master", "commit": "b5825cf9ee881dd8e43309c93374ed5b87b7a896" }, - "nvim-treesitter": { "branch": "master", "commit": "066fd6505377e3fd4aa219e61ce94c2b8bdb0b79" }, + "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, "nvim-web-devicons": { "branch": "master", "commit": "1fb58cca9aebbc4fd32b086cb413548ce132c127" }, "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" }, diff --git a/.config/nvim/lua/plugins/tools.lua b/.config/nvim/lua/plugins/tools.lua index 72c8b60..f1097a3 100644 --- a/.config/nvim/lua/plugins/tools.lua +++ b/.config/nvim/lua/plugins/tools.lua @@ -14,7 +14,7 @@ local adapter_configs = { type = "ollama", env = { url = "http://192.168.1.165:11434" }, parameters = { sync = true }, - schema = { num_ctx = { default = 8192 } }, + schema = { num_ctx = { default = 40960 } }, }, gemini_pro = { type = "gemini", From 44780e9a9edbb169dbfaaf4b49b07bed43659e4f Mon Sep 17 00:00:00 2001 From: mitchell Date: Sun, 10 Aug 2025 17:15:23 -0400 Subject: [PATCH 16/17] chore: One binding for nvim and update deps --- .config/fish/functions/aikeys.fish | 2 ++ .config/fish/functions/fish_user_key_bindings.fish | 4 +--- .config/nvim/lazy-lock.json | 14 +++++++------- .config/nvim/lua/core/keymaps.lua | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.config/fish/functions/aikeys.fish b/.config/fish/functions/aikeys.fish index bd36b01..b547aa3 100644 --- a/.config/fish/functions/aikeys.fish +++ b/.config/fish/functions/aikeys.fish @@ -6,5 +6,7 @@ function aikeys -d 'Set AI API keys' -a service echo "set -lx OPENAI_API_KEY (kp Keys/openai-general -a Password)" case anthro echo "set -lx ANTHROPIC_API_KEY (kp Keys/anthropic-bespin-nvim -a Password)" + case work + echo "set -lx OPENAI_API_KEY (kp Keys/openai-mystro -a Password)" end end diff --git a/.config/fish/functions/fish_user_key_bindings.fish b/.config/fish/functions/fish_user_key_bindings.fish index b53f369..e586aa0 100644 --- a/.config/fish/functions/fish_user_key_bindings.fish +++ b/.config/fish/functions/fish_user_key_bindings.fish @@ -1,8 +1,6 @@ function fish_user_key_bindings bind --mode insert comma,a 'ssh_add; commandline -f repaint' - bind --mode insert comma,p 'nvim +"Telescope git_files"; commandline -f repaint' - bind --mode insert comma,f 'nvim +"Telescope find_files"; commandline -f repaint' - bind --mode insert comma,n 'nvim .; commandline -f repaint' + bind --mode insert .,comma 'nvim; commandline -f repaint' bind --mode insert comma,s 'sysz; commandline -f repaint' bind --mode insert comma,z 'zi; commandline -f repaint' bind --mode insert comma,t 'fzf-file-widget' diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json index 359a0c3..343f790 100644 --- a/.config/nvim/lazy-lock.json +++ b/.config/nvim/lazy-lock.json @@ -1,19 +1,19 @@ { "ale": { "branch": "master", "commit": "80ff84db84ba172bfcdee5e2748924bb2249134b" }, - "blink.cmp": { "branch": "main", "commit": "022521a8910a5543b0251b21c9e1a1e989745796" }, + "blink.cmp": { "branch": "main", "commit": "729d023bb9870a55e1b309a12d5c503fb800a7e8" }, "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, - "codecompanion.nvim": { "branch": "main", "commit": "a5a8701bf8814ff0ba9bf5f76b3a3deedf3e5f28" }, + "codecompanion.nvim": { "branch": "main", "commit": "fa31ecd06ffae66b19ecb143ea39f62bc5ba6679" }, "flash.nvim": { "branch": "main", "commit": "3c942666f115e2811e959eabbdd361a025db8b63" }, "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, "kanagawa.nvim": { "branch": "master", "commit": "debe91547d7fb1eef34ce26a5106f277fbfdd109" }, "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, - "lualine.nvim": { "branch": "master", "commit": "0c6cca9f2c63dadeb9225c45bc92bb95a151d4af" }, - "markview.nvim": { "branch": "main", "commit": "68c9603b6f88fd962444f8579024418fe5e170f1" }, - "mini.diff": { "branch": "main", "commit": "f7bcd3cb4561f7d3a02ae9afafeda899c82f7108" }, + "lualine.nvim": { "branch": "master", "commit": "a94fc68960665e54408fe37dcf573193c4ce82c9" }, + "markview.nvim": { "branch": "main", "commit": "02810964cc288065c2919ea7a8d41e72f17ccd8a" }, + "mini.diff": { "branch": "main", "commit": "9bccf260cdb9308223f47a29fb4cb91c817a9349" }, "neo-tree.nvim": { "branch": "v3.x", "commit": "f481de16a0eb59c985abac8985e3f2e2f75b4875" }, "noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" }, - "nui.nvim": { "branch": "main", "commit": "f535005e6ad1016383f24e39559833759453564e" }, - "nvim-lspconfig": { "branch": "master", "commit": "3ea99227e316c5028f57a4d86a1a7fd01dd876d0" }, + "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, + "nvim-lspconfig": { "branch": "master", "commit": "99d3a0f26bfe402f45257c1398287aef252cbe2d" }, "nvim-notify": { "branch": "master", "commit": "b5825cf9ee881dd8e43309c93374ed5b87b7a896" }, "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, "nvim-web-devicons": { "branch": "master", "commit": "1fb58cca9aebbc4fd32b086cb413548ce132c127" }, diff --git a/.config/nvim/lua/core/keymaps.lua b/.config/nvim/lua/core/keymaps.lua index 49d40c1..fc5fa1c 100644 --- a/.config/nvim/lua/core/keymaps.lua +++ b/.config/nvim/lua/core/keymaps.lua @@ -16,7 +16,7 @@ end, { noremap = true, silent = true, desc = "Search for Visual Selection" }) -- LSP Diagnostic Mappings local diag_opts = { silent = true } -vim.keymap.set("n", "d", vim.diagnostic.open_float, diag_opts) -vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, diag_opts) -vim.keymap.set("n", "]d", vim.diagnostic.goto_next, diag_opts) -vim.keymap.set("n", "q", vim.diagnostic.setloclist, diag_opts) +map("n", "d", vim.diagnostic.open_float, diag_opts) +map("n", "[d", vim.diagnostic.goto_prev, diag_opts) +map("n", "]d", vim.diagnostic.goto_next, diag_opts) +map("n", "q", vim.diagnostic.setloclist, diag_opts) From b2510c45b9a7f17a1717d3f2c69a6096eb20870e Mon Sep 17 00:00:00 2001 From: mitchell Date: Sat, 20 Jul 2024 00:48:33 -0400 Subject: [PATCH 17/17] m-cloud changes --- .config/fish/config.fish | 4 ---- .config/fish/functions/import_sources.fish | 17 ++++------------- .config/nvim/lua/plugins/treesitter.lua | 1 - .gitconfig | 13 ------------- 4 files changed, 4 insertions(+), 31 deletions(-) diff --git a/.config/fish/config.fish b/.config/fish/config.fish index 59984c7..e347acd 100644 --- a/.config/fish/config.fish +++ b/.config/fish/config.fish @@ -2,15 +2,11 @@ function configure_fish # Determine OS set uname (uname) - # Set umask - umask 077 - # Begin profile init # (These functions are defined in the functions/ directory.) define_global_variables import_sources $uname define_aliases $uname - ssh_agent_startup end configure_fish diff --git a/.config/fish/functions/import_sources.fish b/.config/fish/functions/import_sources.fish index a6b62bf..12d57a8 100644 --- a/.config/fish/functions/import_sources.fish +++ b/.config/fish/functions/import_sources.fish @@ -1,19 +1,10 @@ function import_sources -a uname -d 'Loads any additional fish files needed at init.' test -f ~/.asdf/plugins/dotnet-core/set-dotnet-home.fish; and source ~/.asdf/plugins/dotnet-core/set-dotnet-home.fish - # ASDF configuration code - if test -z $ASDF_DATA_DIR - set _asdf_shims "$HOME/.asdf/shims" - else - set _asdf_shims "$ASDF_DATA_DIR/shims" - end - - # Do not use fish_add_path (added in Fish 3.2) because it - # potentially changes the order of items in PATH - if not contains $_asdf_shims $PATH - set -gx --prepend PATH $_asdf_shims - end - set --erase _asdf_shims + test -e ~/.asdf/asdf.fish + and source ~/.asdf/asdf.fish + and mkdir -p ~/.config/fish/completions + and ln -sf ~/.asdf/completions/asdf.fish ~/.config/fish/completions test -e /opt/homebrew/bin/brew and /opt/homebrew/bin/brew shellenv | source - diff --git a/.config/nvim/lua/plugins/treesitter.lua b/.config/nvim/lua/plugins/treesitter.lua index 777d171..d540d8c 100644 --- a/.config/nvim/lua/plugins/treesitter.lua +++ b/.config/nvim/lua/plugins/treesitter.lua @@ -23,7 +23,6 @@ return { "groovy", "java", "objc", - "swift", "hcl", "terraform", "yaml", diff --git a/.gitconfig b/.gitconfig index 332cf4c..6182c29 100644 --- a/.gitconfig +++ b/.gitconfig @@ -26,7 +26,6 @@ [core] editor = nvim - pager = delta [color] ui = auto @@ -39,15 +38,3 @@ [pull] rebase = true - -[interactive] - diffFilter = delta --color-only - -[delta] - navigate = true - dark = true - side-by-side = true - line-numbers = true - -[merge] - conflictstyle = zdiff3