diff --git a/dotfiles/.vim/plugged/zoxide.vim/.gitrepo b/dotfiles/.vim/plugged/zoxide.vim/.gitrepo new file mode 100644 index 00000000..417cbef8 --- /dev/null +++ b/dotfiles/.vim/plugged/zoxide.vim/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme +; +[subrepo] + remote = https://github.com/nanotee/zoxide.vim.git + branch = master + commit = 7add42b0474b07c206c94d1693997e52d25c5fec + parent = e30fca43b3587faa4c8e4aa9fa124a351855e75c + method = merge + cmdver = 0.4.3 diff --git a/dotfiles/.vim/plugged/zoxide.vim/LICENSE b/dotfiles/.vim/plugged/zoxide.vim/LICENSE new file mode 100644 index 00000000..85f7de03 --- /dev/null +++ b/dotfiles/.vim/plugged/zoxide.vim/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Timothée Sterle + +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. diff --git a/dotfiles/.vim/plugged/zoxide.vim/README.md b/dotfiles/.vim/plugged/zoxide.vim/README.md new file mode 100644 index 00000000..d9d1a6bc --- /dev/null +++ b/dotfiles/.vim/plugged/zoxide.vim/README.md @@ -0,0 +1,45 @@ +# zoxide.vim + +A small (Neo)Vim wrapper for [zoxide](https://github.com/ajeetdsouza/zoxide) + +## Requirements + +- A recent version of Vim or Neovim +- The [zoxide](https://github.com/ajeetdsouza/zoxide) utility +- (optional) The [fzf](https://github.com/junegunn/fzf) utility along with the [fzf.vim](https://github.com/junegunn/fzf/blob/master/plugin/fzf.vim) script + +## Installation + +Install using your favorite plugin manager: + +- [vim-plug](https://github.com/junegunn/vim-plug) + ```vim + Plug 'nanotee/zoxide.vim' + ``` +- [packer.nvim](https://github.com/wbthomason/packer.nvim) + ```lua + use 'nanotee/zoxide.vim' + ``` +- [dein.vim](https://github.com/Shougo/dein.vim) + ```vim + call dein#add('nanotee/zoxide.vim') + ``` +- [vim-packager](https://github.com/kristijanhusak/vim-packager) + ```vim + call packager#add('nanotee/zoxide.vim') + ``` + +## Usage + +The plugin defines commands that wrap the functionality of zoxide: + +- `:Z {query}`: cd to the highest ranked directory matching your query. If `{query}` is omitted, cd to the home directory +- `:Lz {query}`: same as `:Z`, but local to the current window +- `:Tz {query}`: same as `:Z`, but local to the current tab +- `:Zi {query}`: cd to one of your highest ranking directories using fzf +- `:Lzi {query}`: same as `:Zi`, but local to the current window +- `:Tzi {query}`: same as `:Zi`, but local to the current tab + +## Configuration + +See [zoxide-vim-configuration](doc/zoxide-vim.txt#L27) diff --git a/dotfiles/.vim/plugged/zoxide.vim/autoload/zoxide.vim b/dotfiles/.vim/plugged/zoxide.vim/autoload/zoxide.vim new file mode 100644 index 00000000..02633979 --- /dev/null +++ b/dotfiles/.vim/plugged/zoxide.vim/autoload/zoxide.vim @@ -0,0 +1,74 @@ +function! s:build_cmd(cmd, query) abort + return join([get(g:, 'zoxide_executable', 'zoxide')] + map(a:cmd + a:query, 'shellescape(v:val)'), ' ') +endfunction + +function! zoxide#exec(cmd, query) abort + let result = systemlist(s:build_cmd(a:cmd, a:query)) + if v:shell_error + echohl ErrorMsg | echo join(result, "\n") | echohl None + endif + return result +endfunction + +function! s:change_directory(cd_command, directory) abort + try + exe a:cd_command a:directory + catch + echohl ErrorMsg | echomsg v:exception | echohl None + return + endtry + + pwd + + if get(g:, 'zoxide_update_score', 1) && get(g:, 'zoxide_hook', 'none') !=# 'pwd' + call zoxide#exec(['add'], [getcwd()]) + endif +endfunction + +function! zoxide#z(cd_command, ...) abort + let query = empty(a:000) ? [$HOME] : a:000 + + if len(query) == 1 && (query[0] ==# '-' || isdirectory(query[0])) + call s:change_directory(a:cd_command, query[0]) + return + endif + let result = zoxide#exec(['query', '--exclude', getcwd()], query)[0] + if !v:shell_error | call s:change_directory(a:cd_command, result) | endif +endfunction + +function! zoxide#handle_select_result(cd_command, result) abort + if empty(a:result) | return | endif + let directory = substitute(a:result, '^\s*\d*\s*', '', '') + call s:change_directory(a:cd_command, directory) +endfunction + +if has('nvim') && get(g:, 'zoxide_use_select', 0) + function! zoxide#zi(cd_command, bang, ...) abort + call luaeval('require("zoxide-vim").select(_A[1], _A[2])', [ + \ zoxide#exec(['query', '--list', '--score'], a:000), + \ a:cd_command, + \ ]) + endfunction +else + let s:default_fzf_options = [ + \ '--prompt=Zoxide> ', + \ '--no-sort', + \ '--keep-right', + \ '--info=inline', + \ '--layout=reverse', + \ '--select-1', + \ ] + if has('unix') + let s:default_fzf_options += ['--preview=\command -p ls -p {2..}', '--preview-window=down'] + endif + + function! zoxide#zi(cd_command, bang, ...) abort + if !exists('g:loaded_fzf') | echoerr 'The fzf.vim plugin must be installed' | return | endif + + call fzf#run(fzf#wrap('zoxide', { + \ 'source': s:build_cmd(['query', '--list', '--score'], a:000), + \ 'sink': funcref('zoxide#handle_select_result', [a:cd_command]), + \ 'options': get(g:, 'zoxide_fzf_options', s:default_fzf_options), + \ }, a:bang)) + endfunction +endif diff --git a/dotfiles/.vim/plugged/zoxide.vim/doc/zoxide-vim.txt b/dotfiles/.vim/plugged/zoxide.vim/doc/zoxide-vim.txt new file mode 100644 index 00000000..7ab5c10c --- /dev/null +++ b/dotfiles/.vim/plugged/zoxide.vim/doc/zoxide-vim.txt @@ -0,0 +1,91 @@ +*zoxide-vim.txt* A small (Neo)Vim wrapper for zoxide + +=============================================================================== +USAGE *zoxide-vim* *zoxide-vim-usage* + + *:Z* +:Z {query} cd to the highest ranked directory matching your query. + If {query} is omitted, cd to the home directory. + + *:Lz* +:Lz {query} same as :Z but local to the current window. + + *:Tz* +:Tz {query} same as :Z but local to the current tab. + + *:Zi* +:Zi {query} cd to one of your highest ranking directories using + fzf. + + *:Lzi* +:Lzi {query} same as :Zi, but local to the current window. + + *:Tzi* +:Tzi {query} same as :Zi, but local to the current tab. + +=============================================================================== +CONFIGURATION *zoxide-vim-configuration* + + *g:zoxide_executable* +g:zoxide_executable + The name or path of the zoxide executable. + + Default value: `'zoxide'` + + *g:zoxide_prefix* +g:zoxide_prefix + The prefix to use for commands. Example: > + + let g:zoxide_prefix = 'jump' +< + Generates the following commands: + + :Jump + :Ljump + :Tjump + :Jumpi + :Ljumpi + :Tjumpi + + Default value: `'z'` + + *g:zoxide_update_score* +g:zoxide_update_score + Decides whether the zoxide database should be updated + when you execute a :Z-style command. + + Default value: `1` + + *g:zoxide_hook* +g:zoxide_hook + Automatically increment a directory's score on certain + events. Available hooks: + - `'none'`: never automatically add directories to + zoxide. + - `'pwd'`: sets up an autocommand that listens to the + |DirChanged| event. Note: on Neovim < `0.6.0`, + 'autochdir' can cause the event to be triggered very + often. + + Default value: `'none'` + + *g:zoxide_use_select* +g:zoxide_use_select + Use |vim.ui.select()| for :Zi-style commands (Neovim + `0.6.0+` only) + + Default value: `0` + + *g:zoxide_fzf_options* +g:zoxide_fzf_options + Options to pass to fzf during interactive selection. + Use this configration if you want to use the same + options as `$_ZO_FZF_OPTS`: > + + if exists('$_ZO_FZF_OPTS') + let g:zoxide_fzf_options = $_ZO_FZF_OPTS + endif +< + Accepts a string or an array of strings. + +vim:tw=78:ts=8:noet:ft=help:norl: diff --git a/dotfiles/.vim/plugged/zoxide.vim/lua/zoxide-vim.lua b/dotfiles/.vim/plugged/zoxide.vim/lua/zoxide-vim.lua new file mode 100644 index 00000000..c494d805 --- /dev/null +++ b/dotfiles/.vim/plugged/zoxide.vim/lua/zoxide-vim.lua @@ -0,0 +1,9 @@ +local M = {} + +function M.select(items, cd_command) + vim.ui.select(items, {prompt = 'Zoxide> '}, function(item) + vim.fn["zoxide#handle_select_result"](cd_command, item) + end) +end + +return M diff --git a/dotfiles/.vim/plugged/zoxide.vim/plugin/zoxide.vim b/dotfiles/.vim/plugged/zoxide.vim/plugin/zoxide.vim new file mode 100644 index 00000000..a451fb57 --- /dev/null +++ b/dotfiles/.vim/plugged/zoxide.vim/plugin/zoxide.vim @@ -0,0 +1,41 @@ +if exists('g:loaded_zoxide') + finish +endif +let g:loaded_zoxide = 1 + +let s:save_cpo = &cpo +set cpo&vim + +let s:z_cmd = substitute(get(g:, 'zoxide_prefix', 'z'), '\A', '', 'g') +let s:z_cmd_cap = toupper(s:z_cmd[0]) .. strcharpart(s:z_cmd, 1) + +" Z +" Lz +" Tz +execute 'command! -nargs=* -complete=dir ' .. s:z_cmd_cap .. ' call zoxide#z("cd", )' +execute 'command! -nargs=* -complete=dir L' .. s:z_cmd .. ' call zoxide#z("lcd", )' +execute 'command! -nargs=* -complete=dir T' .. s:z_cmd .. ' call zoxide#z("tcd", )' + +" Zi +" Lzi +" Tzi +execute 'command! -nargs=* -bang ' .. s:z_cmd_cap .. 'i call zoxide#zi("cd", 0, )' +execute 'command! -nargs=* -bang L' .. s:z_cmd .. 'i call zoxide#zi("lcd", 0, )' +execute 'command! -nargs=* -bang T' .. s:z_cmd .. 'i call zoxide#zi("tcd", 0, )' + +if get(g:, 'zoxide_hook', 'none') ==# 'pwd' + if has('nvim') + augroup zoxide_cd + autocmd! + autocmd DirChanged window,tab,tabpage,global if !v:event['changed_window'] | call zoxide#exec(['add'], [v:event['cwd']]) | endif + augroup END + else + augroup zoxide_cd + autocmd! + autocmd DirChanged window,tabpage,global call zoxide#exec(['add'], [expand('')]) + augroup END + endif +endif + +let &cpo = s:save_cpo +unlet s:save_cpo