From 139dcd3498a6411a9c6125821a4145b588e14afd Mon Sep 17 00:00:00 2001 From: c0dev0id Date: Thu, 18 Jan 2024 21:23:17 +0100 Subject: [PATCH] Update 2024-01-18 21:23 OpenBSD/amd64-x13 --- .vim/bundle/vim-cool/LICENSE | 22 + .vim/bundle/vim-cool/README.md | 64 + .vim/bundle/vim-cool/plugin/cool.vim | 136 ++ .vim/bundle/vim-fzf/LICENSE | 21 + .vim/bundle/vim-fzf/README.md | 443 +++++ .vim/bundle/vim-fzf/autoload/fzf/vim.vim | 1718 +++++++++++++++++ .../vim-fzf/autoload/fzf/vim/complete.vim | 164 ++ .../vim-fzf/autoload/fzf/vim/listproc.vim | 38 + .vim/bundle/vim-fzf/bin/preview.rb | 3 + .vim/bundle/vim-fzf/bin/preview.sh | 86 + .vim/bundle/vim-fzf/bin/tagpreview.sh | 73 + .vim/bundle/vim-fzf/bin/tags.pl | 15 + .vim/bundle/vim-fzf/doc/fzf-vim.txt | 515 +++++ .vim/bundle/vim-fzf/doc/tags | 63 + .vim/bundle/vim-fzf/plugin/fzf.vim | 163 ++ .vim/bundle/vim-lucius/README.md | 43 + .vim/bundle/vim-lucius/colors/lucius.vim | 805 ++++++++ .vim/vimrc | 574 +++--- 18 files changed, 4701 insertions(+), 245 deletions(-) create mode 100644 .vim/bundle/vim-cool/LICENSE create mode 100644 .vim/bundle/vim-cool/README.md create mode 100644 .vim/bundle/vim-cool/plugin/cool.vim create mode 100644 .vim/bundle/vim-fzf/LICENSE create mode 100644 .vim/bundle/vim-fzf/README.md create mode 100755 .vim/bundle/vim-fzf/autoload/fzf/vim.vim create mode 100644 .vim/bundle/vim-fzf/autoload/fzf/vim/complete.vim create mode 100644 .vim/bundle/vim-fzf/autoload/fzf/vim/listproc.vim create mode 100755 .vim/bundle/vim-fzf/bin/preview.rb create mode 100755 .vim/bundle/vim-fzf/bin/preview.sh create mode 100755 .vim/bundle/vim-fzf/bin/tagpreview.sh create mode 100755 .vim/bundle/vim-fzf/bin/tags.pl create mode 100644 .vim/bundle/vim-fzf/doc/fzf-vim.txt create mode 100644 .vim/bundle/vim-fzf/doc/tags create mode 100644 .vim/bundle/vim-fzf/plugin/fzf.vim create mode 100644 .vim/bundle/vim-lucius/README.md create mode 100644 .vim/bundle/vim-lucius/colors/lucius.vim diff --git a/.vim/bundle/vim-cool/LICENSE b/.vim/bundle/vim-cool/LICENSE new file mode 100644 index 0000000..0d48cca --- /dev/null +++ b/.vim/bundle/vim-cool/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2016 Romain Lafourcade + +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/.vim/bundle/vim-cool/README.md b/.vim/bundle/vim-cool/README.md new file mode 100644 index 0000000..8d6ef04 --- /dev/null +++ b/.vim/bundle/vim-cool/README.md @@ -0,0 +1,64 @@ +# vim-cool + +Vim-cool disables search highlighting when you are done searching and re-enables it when you search again. That's it. No more `:noh`, no more `/sytdstdrsid`, and no more dodgy `` mappings. + +Vim-cool is cool. + +Vim-cool is *experimental*. + +![cool](https://user-images.githubusercontent.com/344335/226825463-4ff5e352-ac2e-4f4d-94c7-a8109da7b6db.gif) + +## Requirements + +Vim-cool is intended to be used with Vim, **and only Vim**, 7.4.2008 or later. It may or may not work in other editors but they are not and will not be officially supported. + +## Installation + +Follow your favorite plugin/runtimepath manager's instructions. + +If you choose manual installation, just put `plugin/cool.vim` where it belongs: + + $HOME/.vim/plugin/cool.vim on Unix-like systems + $HOME\vimfiles\plugin\cool.vim on Windows + +In Vim 8.0 and above, see `:help package`. + +## Setup + +The whole assumption behind Vim-cool is that the user enabled search highlighting but they don't want the highlighting to linger on when they are done searching. This implies that the user has the following line in their `vimrc`: + + set hlsearch + +That's it. Nothing else to do. + +## Experimental features + +* Show number of matches in the command-line: + + let g:cool_total_matches = 1 + + ![demo](https://user-images.githubusercontent.com/344335/226825418-12931cf3-5f89-4375-89be-c98a57e177df.png) + +* Do something when we are doing `nnnNNnn`, do something else or do nothing when we are not: + + set statusline+=%{get(g:,'cool_is_searching',0)?'Yep':''} + +## Background + +I wrote the first iteration of vim-cool in about twenty minutes, mostly to test a few ideas I had after a short discussion about `'hlsearch'` and `:nohlsearch` on #vim. + +Because it relied almost exclusively on mappings, that first iteration was way too brittle to be of any use and actually messed with a bunch of my own mappings. + +Then came [@purpleP](https://github.com/purpleP) and [the game-changing approach](https://github.com/romainl/vim-cool/issues/9) he put together with the help of [@chrisbra](https://github.com/chrisbra), [@justinmk](https://github.com/justinmk), [@jamessan](https://github.com/jamessan), and [@ZyX-I](https://github.com/ZyX-I). + +The current version, essentially a weaponized version of @purpleP's code, doesn't rely on mappings anymore and thus should be devoid of nasty side-effects. + +Many thanks to [@bounceme](https://github.com/bounceme) for his help. + +## What they say about vim-cool + +- **puremourning**, in #vim: + + > vim-cool is by far my favourite plugin + > + > it's just so... cool. diff --git a/.vim/bundle/vim-cool/plugin/cool.vim b/.vim/bundle/vim-cool/plugin/cool.vim new file mode 100644 index 0000000..1c40b45 --- /dev/null +++ b/.vim/bundle/vim-cool/plugin/cool.vim @@ -0,0 +1,136 @@ +" vim-cool - Disable hlsearch when you are done searching. +" Maintainer: romainl +" Version: 0.0.2 +" License: MIT License +" Location: plugin/cool.vim +" Website: https://github.com/romainl/vim-cool + +if exists("g:loaded_cool") || v:version < 704 || &compatible + finish +endif +let g:loaded_cool = 1 + +let s:save_cpo = &cpo +set cpo&vim + +augroup Cool + autocmd! +augroup END + +if exists('##OptionSet') + if !exists('*execute') + autocmd Cool OptionSet highlight let saveh = &highlight + endif + " toggle coolness when hlsearch is toggled + autocmd Cool OptionSet hlsearch call PlayItCool(v:option_old, v:option_new) +endif + +function! s:StartHL() + if !v:hlsearch || mode() isnot 'n' + return + endif + let g:cool_is_searching = 1 + let [pos, rpos] = [winsaveview(), getpos('.')] + silent! exe "keepjumps go".(line2byte('.')+col('.')-(v:searchforward ? 2 : 0)) + try + silent keepjumps norm! n + if getpos('.') != rpos + throw 0 + endif + catch /^\%(0$\|Vim\%(\w\|:Interrupt$\)\@!\)/ + call StopHL() + return + finally + call winrestview(pos) + endtry + if !get(g:,'cool_total_matches') || !exists('*reltimestr') + return + endif + exe "silent! norm! :let g:cool_char=nr2char(screenchar(screenrow(),1))\" + let cool_char = remove(g:,'cool_char') + if cool_char !~ '[/?]' + return + endif + let [f, ws, now, noOf] = [0, &wrapscan, reltime(), [0,0]] + set nowrapscan + try + while f < 2 + if reltimestr(reltime(now))[:-6] =~ '[1-9]' + " time >= 100ms + return + endif + let noOf[v:searchforward ? f : !f] += 1 + try + silent exe "keepjumps norm! ".(f ? 'n' : 'N') + catch /^Vim[^)]\+):E38[45]\D/ + call setpos('.',rpos) + let f += 1 + endtry + endwhile + finally + call winrestview(pos) + let &wrapscan = ws + endtry + redraw|echo cool_char.@/ 'match' noOf[0] 'of' noOf[0] + noOf[1] - 1 +endfunction + +function! s:StopHL() + if !v:hlsearch || mode() isnot 'n' + return + else + let g:cool_is_searching = 0 + silent call feedkeys("\(StopHL)", 'm') + endif +endfunction + +if !exists('*execute') + let s:saveh = &highlight + " toggle highlighting, a workaround for :nohlsearch in autocmds + function! s:AuNohlsearch() + noautocmd set highlight+=l:- + autocmd Cool Insertleave * + \ noautocmd let &highlight = s:saveh | autocmd! Cool InsertLeave * + return '' + endfunction +endif + +function! s:PlayItCool(old, new) + if a:old == 0 && a:new == 1 + " nohls --> hls + " set up coolness + noremap (StopHL) :nohlsearch + if !exists('*execute') + noremap! (StopHL) AuNohlsearch() + + " If no "execute()", ":tnoremap" isn't probably implemented too. + else + noremap! (StopHL) execute('nohlsearch')[-1] + if exists(':tnoremap') + tnoremap (StopHL) execute('nohlsearch')[-1] + endif + endif + + autocmd Cool CursorMoved * call StartHL() + autocmd Cool InsertEnter * call StopHL() + elseif a:old == 1 && a:new == 0 + " hls --> nohls + " tear down coolness + nunmap (StopHL) + unmap! (StopHL) + if exists(':tunmap') + tunmap (StopHL) + endif + + autocmd! Cool CursorMoved + autocmd! Cool InsertEnter + else + " nohls --> nohls + " do nothing + return + endif +endfunction + +" play it cool +call PlayItCool(0, &hlsearch) + +let &cpo = s:save_cpo diff --git a/.vim/bundle/vim-fzf/LICENSE b/.vim/bundle/vim-fzf/LICENSE new file mode 100644 index 0000000..8087dea --- /dev/null +++ b/.vim/bundle/vim-fzf/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Junegunn Choi + +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/.vim/bundle/vim-fzf/README.md b/.vim/bundle/vim-fzf/README.md new file mode 100644 index 0000000..6fc2d18 --- /dev/null +++ b/.vim/bundle/vim-fzf/README.md @@ -0,0 +1,443 @@ +fzf :heart: vim +=============== + +Things you can do with [fzf][fzf] and Vim. + +Rationale +--------- + +[fzf][fzf] itself is not a Vim plugin, and the official repository only +provides the [basic wrapper function][run] for Vim. It's up to the users to +write their own Vim commands with it. However, I've learned that many users of +fzf are not familiar with Vimscript and are looking for the "default" +implementation of the features they can find in the alternative Vim plugins. + +Why you should use fzf on Vim +----------------------------- + +Because you can and you love fzf. + +fzf runs asynchronously and can be orders of magnitude faster than similar Vim +plugins. However, the benefit may not be noticeable if the size of the input +is small, which is the case for many of the commands provided here. +Nevertheless I wrote them anyway since it's really easy to implement custom +selector with fzf. + +Installation +------------ + +fzf.vim depends on the basic Vim plugin of [the main fzf +repository][fzf-main], which means you need to **set up both "fzf" and +"fzf.vim" on Vim**. To learn more about fzf/Vim integration, see +[README-VIM][README-VIM]. + +[fzf-main]: https://github.com/junegunn/fzf +[README-VIM]: https://github.com/junegunn/fzf/blob/master/README-VIM.md + +### Using [vim-plug](https://github.com/junegunn/vim-plug) + +```vim +Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +Plug 'junegunn/fzf.vim' +``` + +`fzf#install()` makes sure that you have the latest binary, but it's optional, +so you can omit it if you use a plugin manager that doesn't support hooks. + +### Dependencies + +- [fzf][fzf-main] 0.41.1 or above +- For syntax-highlighted preview, install [bat](https://github.com/sharkdp/bat) +- If [delta](https://github.com/dandavison/delta) is available, `GF?`, + `Commits` and `BCommits` will use it to format `git diff` output. +- `Ag` requires [The Silver Searcher (ag)][ag] +- `Rg` requires [ripgrep (rg)][rg] +- `Tags` and `Helptags` require Perl + +Commands +-------- + +| Command | List | +| --- | --- | +| `:Files [PATH]` | Files (runs `$FZF_DEFAULT_COMMAND` if defined) | +| `:GFiles [OPTS]` | Git files (`git ls-files`) | +| `:GFiles?` | Git files (`git status`) | +| `:Buffers` | Open buffers | +| `:Colors` | Color schemes | +| `:Ag [PATTERN]` | [ag][ag] search result (`ALT-A` to select all, `ALT-D` to deselect all) | +| `:Rg [PATTERN]` | [rg][rg] search result (`ALT-A` to select all, `ALT-D` to deselect all) | +| `:RG [PATTERN]` | [rg][rg] search result; relaunch ripgrep on every keystroke | +| `:Lines [QUERY]` | Lines in loaded buffers | +| `:BLines [QUERY]` | Lines in the current buffer | +| `:Tags [QUERY]` | Tags in the project (`ctags -R`) | +| `:BTags [QUERY]` | Tags in the current buffer | +| `:Changes` | Changelist across all open buffers | +| `:Marks` | Marks | +| `:Jumps` | Jumps | +| `:Windows` | Windows | +| `:Locate PATTERN` | `locate` command output | +| `:History` | `v:oldfiles` and open buffers | +| `:History:` | Command history | +| `:History/` | Search history | +| `:Snippets` | Snippets ([UltiSnips][us]) | +| `:Commits [LOG_OPTS]` | Git commits (requires [fugitive.vim][f]) | +| `:BCommits [LOG_OPTS]` | Git commits for the current buffer; visual-select lines to track changes in the range | +| `:Commands` | Commands | +| `:Maps` | Normal mode mappings | +| `:Helptags` | Help tags [1](#helptags) | +| `:Filetypes` | File types + +- Most commands support `CTRL-T` / `CTRL-X` / `CTRL-V` key + bindings to open in a new tab, a new split, or in a new vertical split +- Bang-versions of the commands (e.g. `Ag!`) will open fzf in fullscreen +- You can set `g:fzf_vim.command_prefix` to give the same prefix to the commands + - e.g. `let g:fzf_vim.command_prefix = 'Fzf'` and you have `FzfFiles`, etc. + +(1: `Helptags` will shadow the command of the same name +from [pathogen][pat]. But its functionality is still available via `call +pathogen#helptags()`. [↩](#a1)) + +[pat]: https://github.com/tpope/vim-pathogen +[f]: https://github.com/tpope/vim-fugitive + +Customization +------------- + +### Configuration options of the base plugin + +Every command in fzf.vim internally calls `fzf#wrap` function of the main +repository which supports a set of global option variables. So please read +through [README-VIM][README-VIM] to learn more about them. + +### Configuration options for fzf.vim + +All configuration values for this plugin are stored in `g:fzf_vim` dictionary, +so **make sure to initialize it before assigning any configuration values to +it**. + +```vim +" Initialize configuration dictionary +let g:fzf_vim = {} +``` + +#### Preview window + +Some commands will show the preview window on the right. You can customize the +behavior with `g:fzf_vim.preview_window`. Here are some examples: + +```vim +" This is the default option: +" - Preview window on the right with 50% width +" - CTRL-/ will toggle preview window. +" - Note that this array is passed as arguments to fzf#vim#with_preview function. +" - To learn more about preview window options, see `--preview-window` section of `man fzf`. +let g:fzf_vim.preview_window = ['right,50%', 'ctrl-/'] + +" Preview window is hidden by default. You can toggle it with ctrl-/. +" It will show on the right with 50% width, but if the width is smaller +" than 70 columns, it will show above the candidate list +let g:fzf_vim.preview_window = ['hidden,right,50%,<70(up,40%)', 'ctrl-/'] + +" Empty value to disable preview window altogether +let g:fzf_vim.preview_window = [] + +" fzf.vim needs bash to display the preview window. +" On Windows, fzf.vim will first see if bash is in $PATH, then if +" Git bash (C:\Program Files\Git\bin\bash.exe) is available. +" If you want it to use a different bash, set this variable. +" let g:fzf_vim = {} +" let g:fzf_vim.preview_bash = 'C:\Git\bin\bash.exe' +``` + +#### Command-level options + +```vim +" [Buffers] Jump to the existing window if possible +let g:fzf_vim.buffers_jump = 1 + +" [[B]Commits] Customize the options used by 'git log': +let g:fzf_vim.commits_log_options = '--graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr"' + +" [Tags] Command to generate tags file +let g:fzf_vim.tags_command = 'ctags -R' + +" [Commands] --expect expression for directly executing the command +let g:fzf_vim.commands_expect = 'alt-enter,ctrl-x' +``` + +#### List type to handle multiple selections + +The following commands will fill the quickfix list when multiple entries are +selected. + +* `Ag` +* `Rg` / `RG` +* `Lines` / `BLines` +* `Tags` / `BTags` + +By setting `g:fzf_vim.listproc`, you can make them use location list instead. + +```vim +" Default: Use quickfix list +let g:fzf_vim.listproc = { list -> fzf#vim#listproc#quickfix(list) } + +" Use location list instead of quickfix list +let g:fzf_vim.listproc = { list -> fzf#vim#listproc#location(list) } +``` + +You can customize the list type per command by defining variables named +`g:fzf_vim.listproc_{command_name_in_lowercase}`. + +```vim +" Command-wise customization +let g:fzf_vim.listproc_ag = { list -> fzf#vim#listproc#quickfix(list) } +let g:fzf_vim.listproc_rg = { list -> fzf#vim#listproc#location(list) } +``` + +You can further customize the behavior by providing a custom function to +process the list instead of using the predefined `fzf#vim#listproc#quickfix` +or `fzf#vim#listproc#location`. + +```vim +" A customized version of fzf#vim#listproc#quickfix. +" The last two lines are commented out not to move to the first entry. +function! g:fzf_vim.listproc(list) + call setqflist(a:list) + copen + wincmd p + " cfirst + " normal! zvzz +endfunction +``` + +### Advanced customization + +#### Vim functions + +Each command in fzf.vim is backed by a Vim function. You can override +a command or define a variation of it by calling its corresponding function. + +| Command | Vim function | +| --- | --- | +| `Files` | `fzf#vim#files(dir, [spec dict], [fullscreen bool])` | +| `GFiles` | `fzf#vim#gitfiles(git_options, [spec dict], [fullscreen bool])` | +| `GFiles?` | `fzf#vim#gitfiles('?', [spec dict], [fullscreen bool])` | +| `Buffers` | `fzf#vim#buffers([query string], [bufnrs list], [spec dict], [fullscreen bool])` | +| `Colors` | `fzf#vim#colors([spec dict], [fullscreen bool])` | +| `Rg` | `fzf#vim#grep(command, [spec dict], [fullscreen bool])` | +| `RG` | `fzf#vim#grep2(command_prefix, query, [spec dict], [fullscreen bool])` | +| ... | ... | + +(We can see that the last two optional arguments of each function are +identical. They are directly passed to `fzf#wrap` function. If you haven't +read [README-VIM][README-VIM] already, please read it before proceeding.) + +#### Example: Customizing `Files` command + +This is the default definition of `Files` command: + +```vim +command! -bang -nargs=? -complete=dir Files call fzf#vim#files(, 0) +``` + +Let's say you want to a variation of it called `ProjectFiles` that only +searches inside `~/projects` directory. Then you can do it like this: + +```vim +command! -bang ProjectFiles call fzf#vim#files('~/projects', 0) +``` + +Or, if you want to override the command with different fzf options, just pass +a custom spec to the function. + +```vim +command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, {'options': ['--layout=reverse', '--info=inline']}, 0) +``` + +Want a preview window? + +```vim +command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, {'options': ['--layout=reverse', '--info=inline', '--preview', 'cat {}']}, 0) +``` + +It kind of works, but you probably want a nicer previewer program than `cat`. +fzf.vim ships [a versatile preview script](bin/preview.sh) you can readily +use. It internally executes [bat](https://github.com/sharkdp/bat) for syntax +highlighting, so make sure to install it. + +```vim +command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, {'options': ['--layout=reverse', '--info=inline', '--preview', '~/.vim/plugged/fzf.vim/bin/preview.sh {}']}, 0) +``` + +However, it's not ideal to hard-code the path to the script which can be +different in different circumstances. So in order to make it easier to set up +the previewer, fzf.vim provides `fzf#vim#with_preview` helper function. +Similarly to `fzf#wrap`, it takes a spec dictionary and returns a copy of it +with additional preview options. + +```vim +command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, fzf#vim#with_preview({'options': ['--layout=reverse', '--info=inline']}), 0) +``` + +You can just omit the spec argument if you only want the previewer. + +```vim +command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, fzf#vim#with_preview(), 0) +``` + +#### Example: `git grep` wrapper + +The following example implements `GGrep` command that works similarly to +predefined `Ag` or `Rg` using `fzf#vim#grep`. + +- We set the base directory to git root by setting `dir` attribute in spec + dictionary. +- [The preview script](bin/preview.sh) supports `grep` format + (`FILE_PATH:LINE_NO:...`), so we can just wrap the spec with + `fzf#vim#with_preview` as before to enable previewer. + +```vim +command! -bang -nargs=* GGrep + \ call fzf#vim#grep( + \ 'git grep --line-number -- '.fzf#shellescape(), + \ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), 0) +``` + +Mappings +-------- + +| Mapping | Description | +| --- | --- | +| `(fzf-maps-n)` | Normal mode mappings | +| `(fzf-maps-i)` | Insert mode mappings | +| `(fzf-maps-x)` | Visual mode mappings | +| `(fzf-maps-o)` | Operator-pending mappings | +| `(fzf-complete-word)` | `cat /usr/share/dict/words` | +| `(fzf-complete-path)` | Path completion using `find` (file + dir) | +| `(fzf-complete-file)` | File completion using `find` | +| `(fzf-complete-line)` | Line completion (all open buffers) | +| `(fzf-complete-buffer-line)` | Line completion (current buffer only) | + +```vim +" Mapping selecting mappings +nmap (fzf-maps-n) +xmap (fzf-maps-x) +omap (fzf-maps-o) + +" Insert mode completion +imap (fzf-complete-word) +imap (fzf-complete-path) +imap (fzf-complete-line) +``` + +Completion functions +-------------------- + +| Function | Description | +| --- | --- | +| `fzf#vim#complete#path(command, [spec])` | Path completion | +| `fzf#vim#complete#word([spec])` | Word completion | +| `fzf#vim#complete#line([spec])` | Line completion (all open buffers) | +| `fzf#vim#complete#buffer_line([spec])` | Line completion (current buffer only) | + +```vim +" Path completion with custom source command +inoremap fzf#vim#complete#path('fd') +inoremap fzf#vim#complete#path('rg --files') + +" Word completion with custom spec with popup layout option +inoremap fzf#vim#complete#word({'window': { 'width': 0.2, 'height': 0.9, 'xoffset': 1 }}) +``` + +Custom completion +----------------- + +`fzf#vim#complete` is a helper function for creating custom fuzzy completion +using fzf. If the first parameter is a command string or a Vim list, it will +be used as the source. + +```vim +" Replace the default dictionary completion with fzf-based fuzzy completion +inoremap fzf#vim#complete('cat /usr/share/dict/words') +``` + +For advanced uses, you can pass an options dictionary to the function. The set +of options is pretty much identical to that for `fzf#run` only with the +following exceptions: + +- `reducer` (funcref) + - Reducer transforms the output lines of fzf into a single string value +- `prefix` (string or funcref; default: `\k*$`) + - Regular expression pattern to extract the completion prefix + - Or a function to extract completion prefix +- Both `source` and `options` can be given as funcrefs that take the + completion prefix as the argument and return the final value +- `sink` or `sink*` are ignored + +```vim +" Global line completion (not just open buffers. ripgrep required.) +inoremap fzf#vim#complete(fzf#wrap({ + \ 'prefix': '^.*$', + \ 'source': 'rg -n ^ --color always', + \ 'options': '--ansi --delimiter : --nth 3..', + \ 'reducer': { lines -> join(split(lines[0], ':\zs')[2:], '') }})) +``` + +### Reducer example + +```vim +function! s:make_sentence(lines) + return substitute(join(a:lines), '^.', '\=toupper(submatch(0))', '').'.' +endfunction + +inoremap fzf#vim#complete({ + \ 'source': 'cat /usr/share/dict/words', + \ 'reducer': function('make_sentence'), + \ 'options': '--multi --reverse --margin 15%,0', + \ 'left': 20}) +``` + +Status line of terminal buffer +------------------------------ + +When fzf starts in a terminal buffer (see [fzf/README-VIM.md][termbuf]), you +may want to customize the statusline of the containing buffer. + +[termbuf]: https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzf-inside-terminal-buffer + +### Hide statusline + +```vim +autocmd! FileType fzf set laststatus=0 noshowmode noruler + \| autocmd BufLeave set laststatus=2 showmode ruler +``` + +### Custom statusline + +```vim +function! s:fzf_statusline() + " Override statusline as you like + highlight fzf1 ctermfg=161 ctermbg=251 + highlight fzf2 ctermfg=23 ctermbg=251 + highlight fzf3 ctermfg=237 ctermbg=251 + setlocal statusline=%#fzf1#\ >\ %#fzf2#fz%#fzf3#f +endfunction + +autocmd! User FzfStatusLine call fzf_statusline() +``` + +License +------- + +MIT + +[fzf]: https://github.com/junegunn/fzf +[run]: https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzfrun +[ag]: https://github.com/ggreer/the_silver_searcher +[rg]: https://github.com/BurntSushi/ripgrep +[us]: https://github.com/SirVer/ultisnips diff --git a/.vim/bundle/vim-fzf/autoload/fzf/vim.vim b/.vim/bundle/vim-fzf/autoload/fzf/vim.vim new file mode 100755 index 0000000..61f70a0 --- /dev/null +++ b/.vim/bundle/vim-fzf/autoload/fzf/vim.vim @@ -0,0 +1,1718 @@ +" Copyright (c) 2023 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. + +let s:cpo_save = &cpo +set cpo&vim + +" ------------------------------------------------------------------ +" Common +" ------------------------------------------------------------------ + +function! s:conf(name, default) + let conf = get(g:, 'fzf_vim', {}) + return get(conf, a:name, get(g:, 'fzf_' . a:name, a:default)) +endfunction + +let s:winpath = {} +function! s:winpath(path) + if has_key(s:winpath, a:path) + return s:winpath[a:path] + endif + + let winpath = split(system('for %A in ("'.a:path.'") do @echo %~sA'), "\n")[0] + let s:winpath[a:path] = winpath + + return winpath +endfunction + +let s:warned = 0 +function! s:bash() + if exists('s:bash') + return s:bash + endif + + let custom_bash = s:conf('preview_bash', '') + let git_bash = 'C:\Program Files\Git\bin\bash.exe' + let candidates = filter(s:is_win ? [custom_bash, 'bash', git_bash] : [custom_bash, 'bash'], 'len(v:val)') + + let found = filter(map(copy(candidates), 'exepath(v:val)'), 'len(v:val)') + if empty(found) + if !s:warned + call s:warn(printf('Preview window not supported (%s not found)', join(candidates, ', '))) + let s:warned = 1 + endif + let s:bash = '' + return s:bash + endif + + let s:bash = found[0] + + " Make 8.3 filename via cmd.exe + if s:is_win + let s:bash = s:winpath(s:bash) + endif + + return s:bash +endfunction + +function! s:escape_for_bash(path) + if !s:is_win + return fzf#shellescape(a:path) + endif + + if !exists('s:is_linux_like_bash') + call system(s:bash . ' -c "ls /mnt/[A-Za-z]"') + let s:is_linux_like_bash = v:shell_error == 0 + endif + + let path = substitute(a:path, '\', '/', 'g') + if s:is_linux_like_bash + let path = substitute(path, '^\([A-Z]\):', '/mnt/\L\1', '') + endif + + return escape(path, ' ') +endfunction + +let s:min_version = '0.23.0' +let s:is_win = has('win32') || has('win64') +let s:is_wsl_bash = s:is_win && (exepath('bash') =~? 'Windows[/\\]system32[/\\]bash.exe$') +let s:layout_keys = ['window', 'up', 'down', 'left', 'right'] +let s:bin_dir = expand(':p:h:h:h').'/bin/' +let s:bin = { +\ 'preview': s:bin_dir.'preview.sh', +\ 'tags': s:bin_dir.'tags.pl' } +let s:TYPE = {'bool': type(0), 'dict': type({}), 'funcref': type(function('call')), 'string': type(''), 'list': type([])} + +let s:wide = 120 +let s:checked = 0 + +function! s:check_requirements() + if s:checked + return + endif + + if !exists('*fzf#run') + throw "fzf#run function not found. You also need Vim plugin from the main fzf repository (i.e. junegunn/fzf *and* junegunn/fzf.vim)" + endif + if !exists('*fzf#exec') + throw "fzf#exec function not found. You need to upgrade Vim plugin from the main fzf repository ('junegunn/fzf')" + endif + let s:checked = !empty(fzf#exec(s:min_version)) +endfunction + +function! s:extend_opts(dict, eopts, prepend) + if empty(a:eopts) + return + endif + if has_key(a:dict, 'options') + if type(a:dict.options) == s:TYPE.list && type(a:eopts) == s:TYPE.list + if a:prepend + let a:dict.options = extend(copy(a:eopts), a:dict.options) + else + call extend(a:dict.options, a:eopts) + endif + else + let all_opts = a:prepend ? [a:eopts, a:dict.options] : [a:dict.options, a:eopts] + let a:dict.options = join(map(all_opts, 'type(v:val) == s:TYPE.list ? join(map(copy(v:val), "fzf#shellescape(v:val)")) : v:val')) + endif + else + let a:dict.options = a:eopts + endif +endfunction + +function! s:merge_opts(dict, eopts) + return s:extend_opts(a:dict, a:eopts, 0) +endfunction + +function! s:prepend_opts(dict, eopts) + return s:extend_opts(a:dict, a:eopts, 1) +endfunction + +" [spec to wrap], [preview window expression], [toggle-preview keys...] +function! fzf#vim#with_preview(...) + " Default spec + let spec = {} + let window = '' + + let args = copy(a:000) + + " Spec to wrap + if len(args) && type(args[0]) == s:TYPE.dict + let spec = copy(args[0]) + call remove(args, 0) + endif + + if !executable(s:bash()) + return spec + endif + + " Placeholder expression (TODO/TBD: undocumented) + let placeholder = get(spec, 'placeholder', '{}') + + " g:fzf_preview_window + if empty(args) + let preview_args = s:conf('preview_window', ['', 'ctrl-/']) + if empty(preview_args) + let args = ['hidden'] + else + " For backward-compatiblity + let args = type(preview_args) == type('') ? [preview_args] : copy(preview_args) + endif + endif + + if len(args) && type(args[0]) == s:TYPE.string + if len(args[0]) && args[0] !~# '^\(up\|down\|left\|right\|hidden\)' + throw 'invalid preview window: '.args[0] + endif + let window = args[0] + call remove(args, 0) + endif + + let preview = [] + if len(window) + let preview += ['--preview-window', window] + endif + if s:is_win + if empty($MSWINHOME) + let $MSWINHOME = $HOME + endif + if s:is_wsl_bash && $WSLENV !~# '[:]\?MSWINHOME\(\/[^:]*\)\?\(:\|$\)' + let $WSLENV = 'MSWINHOME/u:'.$WSLENV + endif + endif + let preview_cmd = s:bash() . ' ' . s:escape_for_bash(s:bin.preview) + if len(placeholder) + let preview += ['--preview', preview_cmd.' '.placeholder] + end + if &ambiwidth ==# 'double' + let preview += ['--no-unicode'] + end + + if len(args) + call extend(preview, ['--bind', join(map(args, 'v:val.":toggle-preview"'), ',')]) + endif + call s:merge_opts(spec, preview) + return spec +endfunction + +function! s:remove_layout(opts) + for key in s:layout_keys + if has_key(a:opts, key) + call remove(a:opts, key) + endif + endfor + return a:opts +endfunction + +function! s:reverse_list(opts) + let tokens = map(split($FZF_DEFAULT_OPTS, '[^a-z-]'), 'substitute(v:val, "^--", "", "")') + if index(tokens, 'reverse') < 0 + return extend(['--layout=reverse-list'], a:opts) + endif + return a:opts +endfunction + +function! s:wrap(name, opts, bang) + " fzf#wrap does not append --expect if sink or sink* is found + let opts = copy(a:opts) + let options = '' + if has_key(opts, 'options') + let options = type(opts.options) == s:TYPE.list ? join(opts.options) : opts.options + endif + if options !~ '--expect' && has_key(opts, 'sink*') + let Sink = remove(opts, 'sink*') + let wrapped = fzf#wrap(a:name, opts, a:bang) + let wrapped['sink*'] = Sink + else + let wrapped = fzf#wrap(a:name, opts, a:bang) + endif + return wrapped +endfunction + +function! s:strip(str) + return substitute(a:str, '^\s*\|\s*$', '', 'g') +endfunction + +function! s:rstrip(str) + return substitute(a:str, '\s*$', '', 'g') +endfunction + +function! s:chomp(str) + return substitute(a:str, '\n*$', '', 'g') +endfunction + +function! s:escape(path) + let path = fnameescape(a:path) + return s:is_win ? escape(path, '$') : path +endfunction + +if v:version >= 704 + function! s:function(name) + return function(a:name) + endfunction +else + function! s:function(name) + " By Ingo Karkat + return function(substitute(a:name, '^s:', matchstr(expand(''), '\d\+_\zefunction$'), '')) + endfunction +endif + +function! s:get_color(attr, ...) + let gui = has('termguicolors') && &termguicolors + let fam = gui ? 'gui' : 'cterm' + let pat = gui ? '^#[a-f0-9]\+' : '^[0-9]\+$' + for group in a:000 + let code = synIDattr(synIDtrans(hlID(group)), a:attr, fam) + if code =~? pat + return code + endif + endfor + return '' +endfunction + +let s:ansi = {'black': 30, 'red': 31, 'green': 32, 'yellow': 33, 'blue': 34, 'magenta': 35, 'cyan': 36} + +function! s:csi(color, fg) + let prefix = a:fg ? '38;' : '48;' + if a:color[0] == '#' + return prefix.'2;'.join(map([a:color[1:2], a:color[3:4], a:color[5:6]], 'str2nr(v:val, 16)'), ';') + endif + return prefix.'5;'.a:color +endfunction + +function! s:ansi(str, group, default, ...) + let fg = s:get_color('fg', a:group) + let bg = s:get_color('bg', a:group) + let color = (empty(fg) ? s:ansi[a:default] : s:csi(fg, 1)) . + \ (empty(bg) ? '' : ';'.s:csi(bg, 0)) + return printf("\x1b[%s%sm%s\x1b[m", color, a:0 ? ';1' : '', a:str) +endfunction + +for s:color_name in keys(s:ansi) + execute "function! s:".s:color_name."(str, ...)\n" + \ " return s:ansi(a:str, get(a:, 1, ''), '".s:color_name."')\n" + \ "endfunction" +endfor + +function! s:buflisted() + return filter(range(1, bufnr('$')), 'buflisted(v:val) && getbufvar(v:val, "&filetype") != "qf"') +endfunction + +function! s:fzf(name, opts, extra) + call s:check_requirements() + + let [extra, bang] = [{}, 0] + if len(a:extra) <= 1 + let first = get(a:extra, 0, 0) + if type(first) == s:TYPE.dict + let extra = first + else + let bang = first + endif + elseif len(a:extra) == 2 + let [extra, bang] = a:extra + else + throw 'invalid number of arguments' + endif + + let extra = copy(extra) + let eopts = has_key(extra, 'options') ? remove(extra, 'options') : '' + let merged = extend(copy(a:opts), extra) + call s:merge_opts(merged, eopts) + return fzf#run(s:wrap(a:name, merged, bang)) +endfunction + +let s:default_action = { + \ 'ctrl-t': 'tab split', + \ 'ctrl-x': 'split', + \ 'ctrl-v': 'vsplit' } + +function! s:execute_silent(cmd) + silent keepjumps keepalt execute a:cmd +endfunction + +" [key, [filename, [stay_on_edit: 0]]] +function! s:action_for(key, ...) + let Cmd = get(get(g:, 'fzf_action', s:default_action), a:key, '') + let cmd = type(Cmd) == s:TYPE.string ? Cmd : '' + + " See If the command is the default action that opens the selected file in + " the current window. i.e. :edit + let edit = stridx('edit', cmd) == 0 " empty, e, ed, .. + + " If no extra argument is given, we just execute the command and ignore + " errors. e.g. E471: Argument required: tab drop + if !a:0 + if !edit + normal! m' + silent! call s:execute_silent(cmd) + endif + else + " For the default edit action, we don't execute the action if the + " selected file is already opened in the current window, or we are + " instructed to stay on the current buffer. + let stay = edit && (a:0 > 1 && a:2 || fnamemodify(a:1, ':p') ==# expand('%:p')) + if !stay + normal! m' + call s:execute_silent((len(cmd) ? cmd : 'edit').' '.s:escape(a:1)) + endif + endif +endfunction + +function! s:open(target) + if fnamemodify(a:target, ':p') ==# expand('%:p') + return + endif + execute 'edit' s:escape(a:target) +endfunction + +function! s:align_lists(lists) + let maxes = {} + for list in a:lists + let i = 0 + while i < len(list) + let maxes[i] = max([get(maxes, i, 0), len(list[i])]) + let i += 1 + endwhile + endfor + for list in a:lists + call map(list, "printf('%-'.maxes[v:key].'s', v:val)") + endfor + return a:lists +endfunction + +function! s:warn(message) + echohl WarningMsg + echom a:message + echohl None + return 0 +endfunction + +function! s:fill_quickfix(name, list) + if len(a:list) > 1 + let Handler = s:conf('listproc_'.a:name, s:conf('listproc', function('fzf#vim#listproc#quickfix'))) + call call(Handler, [a:list], {}) + return 1 + endif + return 0 +endfunction + +function! fzf#vim#_uniq(list) + let visited = {} + let ret = [] + for l in a:list + if !empty(l) && !has_key(visited, l) + call add(ret, l) + let visited[l] = 1 + endif + endfor + return ret +endfunction + +" ------------------------------------------------------------------ +" Files +" ------------------------------------------------------------------ +function! s:shortpath() + let short = fnamemodify(getcwd(), ':~:.') + if !has('win32unix') + let short = pathshorten(short) + endif + let slash = (s:is_win && !&shellslash) ? '\' : '/' + return empty(short) ? '~'.slash : short . (short =~ escape(slash, '\').'$' ? '' : slash) +endfunction + +function! fzf#vim#files(dir, ...) + let args = {} + if !empty(a:dir) + if !isdirectory(expand(a:dir)) + return s:warn('Invalid directory') + endif + let slash = (s:is_win && !&shellslash) ? '\\' : '/' + let dir = substitute(a:dir, '[/\\]*$', slash, '') + let args.dir = dir + else + let dir = s:shortpath() + endif + + let args.options = ['-m', '--prompt', strwidth(dir) < &columns / 2 - 20 ? dir : '> '] + call s:merge_opts(args, s:conf('files_options', [])) + return s:fzf('files', args, a:000) +endfunction + +" ------------------------------------------------------------------ +" Lines +" ------------------------------------------------------------------ +function! s:line_handler(lines) + if len(a:lines) < 2 + return + endif + + let qfl = [] + for line in a:lines[1:] + let chunks = split(line, "\t", 1) + call add(qfl, {'bufnr': str2nr(chunks[0]), 'lnum': str2nr(chunks[2]), 'text': join(chunks[3:], "\t")}) + endfor + + call s:action_for(a:lines[0]) + if !s:fill_quickfix('lines', qfl) + let chunks = split(a:lines[1], '\t') + execute 'buffer' chunks[0] + execute chunks[2] + endif + normal! ^zvzz +endfunction + +function! fzf#vim#_lines(all) + let cur = [] + let rest = [] + let buf = bufnr('') + let longest_name = 0 + let display_bufnames = &columns > s:wide + if display_bufnames + let bufnames = {} + for b in s:buflisted() + let bufnames[b] = pathshorten(fnamemodify(bufname(b), ":~:.")) + let longest_name = max([longest_name, len(bufnames[b])]) + endfor + endif + let len_bufnames = min([15, longest_name]) + for b in s:buflisted() + let lines = getbufline(b, 1, "$") + if empty(lines) + let path = fnamemodify(bufname(b), ':p') + let lines = filereadable(path) ? readfile(path) : [] + endif + if display_bufnames + let bufname = bufnames[b] + if len(bufname) > len_bufnames + 1 + let bufname = '…' . bufname[-len_bufnames+1:] + endif + let bufname = printf(s:green("%".len_bufnames."s", "Directory"), bufname) + else + let bufname = '' + endif + let linefmt = s:blue("%2d\t", "TabLine")."%s".s:yellow("\t%4d ", "LineNr")."\t%s" + call extend(b == buf ? cur : rest, + \ filter( + \ map(lines, + \ '(!a:all && empty(v:val)) ? "" : printf(linefmt, b, bufname, v:key + 1, v:val)'), + \ 'a:all || !empty(v:val)')) + endfor + return [display_bufnames, extend(cur, rest)] +endfunction + +function! fzf#vim#lines(...) + let [display_bufnames, lines] = fzf#vim#_lines(1) + let nth = display_bufnames ? 3 : 2 + let [query, args] = (a:0 && type(a:1) == type('')) ? + \ [a:1, a:000[1:]] : ['', a:000] + return s:fzf('lines', { + \ 'source': lines, + \ 'sink*': s:function('s:line_handler'), + \ 'options': s:reverse_list(['--tiebreak=index', '--prompt', 'Lines> ', '--ansi', '--extended', '--nth='.nth.'..', '--tabstop=1', '--query', query, '--multi']) + \}, args) +endfunction + +" ------------------------------------------------------------------ +" BLines +" ------------------------------------------------------------------ +function! s:buffer_line_handler(lines) + if len(a:lines) < 2 + return + endif + let qfl = [] + for line in a:lines[1:] + let chunks = split(line, "\t", 1) + let ln = chunks[0] + let ltxt = join(chunks[1:], "\t") + call add(qfl, {'filename': expand('%'), 'lnum': str2nr(ln), 'text': ltxt}) + endfor + call s:action_for(a:lines[0]) + if !s:fill_quickfix('blines', qfl) + execute split(a:lines[1], '\t')[0] + endif + normal! ^zvzz +endfunction + +function! s:buffer_lines(query) + let linefmt = s:yellow(" %4d ", "LineNr")."\t%s" + let fmtexpr = 'printf(linefmt, v:key + 1, v:val)' + let lines = getline(1, '$') + if empty(a:query) + return map(lines, fmtexpr) + end + return filter(map(lines, 'v:val =~ a:query ? '.fmtexpr.' : ""'), 'len(v:val)') +endfunction + +function! fzf#vim#buffer_lines(...) + let [query, args] = (a:0 && type(a:1) == type('')) ? + \ [a:1, a:000[1:]] : ['', a:000] + return s:fzf('blines', { + \ 'source': s:buffer_lines(query), + \ 'sink*': s:function('s:buffer_line_handler'), + \ 'options': s:reverse_list(['+m', '--tiebreak=index', '--multi', '--prompt', 'BLines> ', '--ansi', '--extended', '--nth=2..', '--tabstop=1']) + \}, args) +endfunction + +" ------------------------------------------------------------------ +" Colors +" ------------------------------------------------------------------ +function! fzf#vim#colors(...) + let colors = split(globpath(&rtp, "colors/*.vim"), "\n") + if has('packages') + let colors += split(globpath(&packpath, "pack/*/opt/*/colors/*.vim"), "\n") + endif + return s:fzf('colors', { + \ 'source': fzf#vim#_uniq(map(colors, "substitute(fnamemodify(v:val, ':t'), '\\..\\{-}$', '', '')")), + \ 'sink': 'colo', + \ 'options': '+m --prompt="Colors> "' + \}, a:000) +endfunction + +" ------------------------------------------------------------------ +" Locate +" ------------------------------------------------------------------ +function! fzf#vim#locate(query, ...) + return s:fzf('locate', { + \ 'source': 'locate '.a:query, + \ 'options': '-m --prompt "Locate> "' + \}, a:000) +endfunction + +" ------------------------------------------------------------------ +" History[:/] +" ------------------------------------------------------------------ +function! fzf#vim#_recent_files() + return fzf#vim#_uniq(map( + \ filter([expand('%')], 'len(v:val)') + \ + filter(map(fzf#vim#_buflisted_sorted(), 'bufname(v:val)'), 'len(v:val)') + \ + filter(copy(v:oldfiles), "filereadable(fnamemodify(v:val, ':p'))"), + \ 'fnamemodify(v:val, ":~:.")')) +endfunction + +function! s:history_source(type) + let max = histnr(a:type) + if max <= 0 + return ['No entries'] + endif + let fmt = s:yellow(' %'.len(string(max)).'d ', 'Number') + let list = filter(map(range(1, max), 'histget(a:type, - v:val)'), '!empty(v:val)') + return extend([' :: Press '.s:magenta('CTRL-E', 'Special').' to edit'], + \ map(list, 'printf(fmt, len(list) - v:key)." ".v:val')) +endfunction + +nnoremap (-fzf-vim-do) :execute g:__fzf_command +nnoremap (-fzf-/) / +nnoremap (-fzf-:) : + +function! s:history_sink(type, lines) + if len(a:lines) < 2 + return + endif + + let prefix = "\(-fzf-".a:type.')' + let key = a:lines[0] + let item = matchstr(a:lines[1], ' *[0-9]\+ *\zs.*') + if key == 'ctrl-e' + call histadd(a:type, item) + redraw + call feedkeys(a:type."\", 'n') + else + if a:type == ':' + call histadd(a:type, item) + endif + let g:__fzf_command = "normal ".prefix.item."\" + call feedkeys("\(-fzf-vim-do)") + endif +endfunction + +function! s:cmd_history_sink(lines) + call s:history_sink(':', a:lines) +endfunction + +function! fzf#vim#command_history(...) + return s:fzf('history-command', { + \ 'source': s:history_source(':'), + \ 'sink*': s:function('s:cmd_history_sink'), + \ 'options': '+m --ansi --prompt="Hist:> " --header-lines=1 --expect=ctrl-e --tiebreak=index'}, a:000) +endfunction + +function! s:search_history_sink(lines) + call s:history_sink('/', a:lines) +endfunction + +function! fzf#vim#search_history(...) + return s:fzf('history-search', { + \ 'source': s:history_source('/'), + \ 'sink*': s:function('s:search_history_sink'), + \ 'options': '+m --ansi --prompt="Hist/> " --header-lines=1 --expect=ctrl-e --tiebreak=index'}, a:000) +endfunction + +function! fzf#vim#history(...) + return s:fzf('history-files', { + \ 'source': fzf#vim#_recent_files(), + \ 'options': ['-m', '--header-lines', !empty(expand('%')), '--prompt', 'Hist> '] + \}, a:000) +endfunction + +" ------------------------------------------------------------------ +" GFiles[?] +" ------------------------------------------------------------------ + +function! s:get_git_root(dir) + let dir = len(a:dir) ? a:dir : substitute(split(expand('%:p:h'), '[/\\]\.git\([/\\]\|$\)')[0], '^fugitive://', '', '') + let root = systemlist('git -C ' . fzf#shellescape(dir) . ' rev-parse --show-toplevel')[0] + return v:shell_error ? '' : (len(a:dir) ? fnamemodify(a:dir, ':p') : root) +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(system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! fzf#vim#gitfiles(args, ...) + let dir = get(get(a:, 1, {}), 'dir', '') + let root = s:get_git_root(dir) + if empty(root) + return s:warn('Not in git repo') + endif + let prefix = 'git -C ' . fzf#shellescape(root) . ' ' + if a:args != '?' + let source = prefix . 'ls-files -z ' . a:args + if s:git_version_requirement(2, 31) + let source .= ' --deduplicate' + endif + return s:fzf('gfiles', { + \ 'source': source, + \ 'dir': root, + \ 'options': '-m --read0 --prompt "GitFiles> "' + \}, a:000) + endif + + " Here be dragons! + " We're trying to access the common sink function that fzf#wrap injects to + " the options dictionary. + let bar = s:is_win ? '^|' : '|' + let diff_prefix = 'git -C ' . s:escape_for_bash(root) . ' ' + let preview = printf( + \ s:bash() . ' -c "if [[ {1} =~ M ]]; then %s; else %s {-1}; fi"', + \ executable('delta') + \ ? diff_prefix . 'diff -- {-1} ' . bar . ' delta --width $FZF_PREVIEW_COLUMNS --file-style=omit ' . bar . ' sed 1d' + \ : diff_prefix . 'diff --color=always -- {-1} ' . bar . ' sed 1,4d', + \ s:escape_for_bash(s:bin.preview)) + let wrapped = fzf#wrap({ + \ 'source': prefix . '-c color.status=always status --short --untracked-files=all', + \ 'dir': root, + \ 'options': ['--ansi', '--multi', '--nth', '2..,..', '--tiebreak=index', '--prompt', 'GitFiles?> ', '--preview', preview] + \}) + call s:remove_layout(wrapped) + let wrapped.common_sink = remove(wrapped, 'sink*') + function! wrapped.newsink(lines) + let lines = extend(a:lines[0:0], map(a:lines[1:], 'substitute(v:val[3:], ".* -> ", "", "")')) + return self.common_sink(lines) + endfunction + let wrapped['sink*'] = remove(wrapped, 'newsink') + return s:fzf('gfiles-diff', wrapped, a:000) +endfunction + +" ------------------------------------------------------------------ +" Buffers +" ------------------------------------------------------------------ +function! s:find_open_window(b) + let [tcur, tcnt] = [tabpagenr() - 1, tabpagenr('$')] + for toff in range(0, tabpagenr('$') - 1) + let t = (tcur + toff) % tcnt + 1 + let buffers = tabpagebuflist(t) + for w in range(1, len(buffers)) + let b = buffers[w - 1] + if b == a:b + return [t, w] + endif + endfor + endfor + return [0, 0] +endfunction + +function! s:jump(t, w) + execute a:t.'tabnext' + execute a:w.'wincmd w' +endfunction + +function! s:bufopen(lines) + if len(a:lines) < 2 + return + endif + let b = matchstr(a:lines[1], '\[\zs[0-9]*\ze\]') + if empty(a:lines[0]) && s:conf('buffers_jump', 0) + let [t, w] = s:find_open_window(b) + if t + call s:jump(t, w) + return + endif + endif + call s:action_for(a:lines[0]) + execute 'buffer' b +endfunction + +function! fzf#vim#_format_buffer(b) + let name = bufname(a:b) + let line = exists('*getbufinfo') ? getbufinfo(a:b)[0]['lnum'] : 0 + let fullname = empty(name) ? '' : fnamemodify(name, ":p:~:.") + let dispname = empty(name) ? '[No Name]' : name + let flag = a:b == bufnr('') ? s:blue('%', 'Conditional') : + \ (a:b == bufnr('#') ? s:magenta('#', 'Special') : ' ') + let modified = getbufvar(a:b, '&modified') ? s:red(' [+]', 'Exception') : '' + let readonly = getbufvar(a:b, '&modifiable') ? '' : s:green(' [RO]', 'Constant') + let extra = join(filter([modified, readonly], '!empty(v:val)'), '') + let target = empty(name) ? '' : (line == 0 ? fullname : fullname.':'.line) + return s:rstrip(printf("%s\t%d\t[%s] %s\t%s\t%s", target, line, s:yellow(a:b, 'Number'), flag, dispname, extra)) +endfunction + +function! s:sort_buffers(...) + let [b1, b2] = map(copy(a:000), 'get(g:fzf#vim#buffers, v:val, v:val)') + " Using minus between a float and a number in a sort function causes an error + return b1 < b2 ? 1 : -1 +endfunction + +function! fzf#vim#_buflisted_sorted() + return sort(s:buflisted(), 's:sort_buffers') +endfunction + +" [query (string)], [bufnrs (list)], [spec (dict)], [fullscreen (bool)] +function! fzf#vim#buffers(...) + let [query, args] = (a:0 && type(a:1) == type('')) ? + \ [a:1, a:000[1:]] : ['', a:000] + if len(args) && type(args[0]) == s:TYPE.list + let [buffers; args] = args + else + let buffers = s:buflisted() + endif + let sorted = sort(buffers, 's:sort_buffers') + let header_lines = '--header-lines=' . (bufnr('') == get(sorted, 0, 0) ? 1 : 0) + let tabstop = len(max(sorted)) >= 4 ? 9 : 8 + return s:fzf('buffers', { + \ 'source': map(sorted, 'fzf#vim#_format_buffer(v:val)'), + \ 'sink*': s:function('s:bufopen'), + \ 'options': ['+m', '-x', '--tiebreak=index', header_lines, '--ansi', '-d', '\t', '--with-nth', '3..', '-n', '2,1..2', '--prompt', 'Buf> ', '--query', query, '--preview-window', '+{2}-/2', '--tabstop', tabstop] + \}, args) +endfunction + +" ------------------------------------------------------------------ +" Ag / Rg +" ------------------------------------------------------------------ +function! s:ag_to_qf(line) + let parts = matchlist(a:line, '\(.\{-}\)\s*:\s*\(\d\+\)\%(\s*:\s*\(\d\+\)\)\?\%(\s*:\(.*\)\)\?') + let dict = {'filename': &acd ? fnamemodify(parts[1], ':p') : parts[1], 'lnum': parts[2], 'text': parts[4]} + if len(parts[3]) + let dict.col = parts[3] + endif + return dict +endfunction + +function! s:ag_handler(name, lines) + if len(a:lines) < 2 + return + endif + + let list = map(filter(a:lines[1:], 'len(v:val)'), 's:ag_to_qf(v:val)') + if empty(list) + return + endif + + call s:action_for(a:lines[0], list[0].filename, len(list) > 1) + if s:fill_quickfix(a:name, list) + return + endif + + " Single item selected + let first = list[0] + try + execute first.lnum + if has_key(first, 'col') + call cursor(0, first.col) + endif + normal! zvzz + catch + endtry +endfunction + +" query, [ag options], [spec (dict)], [fullscreen (bool)] +function! fzf#vim#ag(query, ...) + if type(a:query) != s:TYPE.string + return s:warn('Invalid query argument') + endif + let query = empty(a:query) ? '^(?=.)' : a:query + let args = copy(a:000) + let ag_opts = len(args) > 1 && type(args[0]) == s:TYPE.string ? remove(args, 0) : '' + let command = ag_opts . ' -- ' . fzf#shellescape(query) + return call('fzf#vim#ag_raw', insert(args, command, 0)) +endfunction + +" ag command suffix, [spec (dict)], [fullscreen (bool)] +function! fzf#vim#ag_raw(command_suffix, ...) + if !executable('ag') + return s:warn('ag is not found') + endif + return call('fzf#vim#grep', extend(['ag --nogroup --column --color '.a:command_suffix, 1], a:000)) +endfunction + +" command (string), [spec (dict)], [fullscreen (bool)] +function! fzf#vim#grep(grep_command, ...) + let args = copy(a:000) + let words = [] + for word in split(a:grep_command) + if word !~# '^[a-z]' + break + endif + call add(words, word) + endfor + let words = empty(words) ? ['grep'] : words + let name = join(words, '-') + let capname = join(map(words, 'toupper(v:val[0]).v:val[1:]'), '') + let opts = { + \ 'options': ['--ansi', '--prompt', capname.'> ', + \ '--multi', '--bind', 'alt-a:select-all,alt-d:deselect-all', + \ '--delimiter', ':', '--preview-window', '+{2}-/2'] + \} + if len(args) && type(args[0]) == s:TYPE.bool + call remove(args, 0) + endif + + function! opts.sink(lines) closure + return s:ag_handler(get(opts, 'name', name), a:lines) + endfunction + let opts['sink*'] = remove(opts, 'sink') + try + let prev_default_command = $FZF_DEFAULT_COMMAND + let $FZF_DEFAULT_COMMAND = a:grep_command + return s:fzf(name, opts, args) + finally + let $FZF_DEFAULT_COMMAND = prev_default_command + endtry +endfunction + + +" command_prefix (string), initial_query (string), [spec (dict)], [fullscreen (bool)] +function! fzf#vim#grep2(command_prefix, query, ...) + let args = copy(a:000) + let words = [] + for word in split(a:command_prefix) + if word !~# '^[a-z]' + break + endif + call add(words, word) + endfor + let words = empty(words) ? ['grep'] : words + let name = join(words, '-') + let opts = { + \ 'source': ':', + \ 'options': ['--ansi', '--prompt', toupper(name).'> ', '--query', a:query, + \ '--disabled', + \ '--bind', 'start:reload:'.a:command_prefix.' '.fzf#shellescape(a:query), + \ '--bind', 'change:reload:'.a:command_prefix.' {q} || :', + \ '--multi', '--bind', 'alt-a:select-all,alt-d:deselect-all', + \ '--delimiter', ':', '--preview-window', '+{2}-/2'] + \} + if len(args) && type(args[0]) == s:TYPE.bool + call remove(args, 0) + endif + function! opts.sink(lines) closure + return s:ag_handler(name, a:lines) + endfunction + let opts['sink*'] = remove(opts, 'sink') + return s:fzf(name, opts, args) +endfunction + +" ------------------------------------------------------------------ +" BTags +" ------------------------------------------------------------------ +function! s:btags_source(tag_cmds) + if !filereadable(expand('%')) + throw 'Save the file first' + endif + + for cmd in a:tag_cmds + let lines = split(system(cmd), "\n") + if !v:shell_error && len(lines) + break + endif + endfor + if v:shell_error + throw get(lines, 0, 'Failed to extract tags') + elseif empty(lines) + throw 'No tags found' + endif + return map(s:align_lists(map(lines, 'split(v:val, "\t")')), 'join(v:val, "\t")') +endfunction + +function! s:btags_sink(lines) + if len(a:lines) < 2 + return + endif + call s:action_for(a:lines[0]) + let qfl = [] + for line in a:lines[1:] + call s:execute_silent(split(line, "\t")[2]) + call add(qfl, {'filename': expand('%'), 'lnum': line('.'), 'text': getline('.')}) + endfor + + if len(qfl) > 1 + " Go back to the original position + normal! g`' + " Because 'listproc' will use 'cfirst' to go to the first item in the list + call s:fill_quickfix('btags', qfl) + else + normal! zvzz + endif +endfunction + +" query, [tag commands], [spec (dict)], [fullscreen (bool)] +function! fzf#vim#buffer_tags(query, ...) + let args = copy(a:000) + let escaped = fzf#shellescape(expand('%')) + let null = s:is_win ? 'nul' : '/dev/null' + let sort = has('unix') && !has('win32unix') && executable('sort') ? '| sort -s -k 5' : '' + let tag_cmds = (len(args) > 1 && type(args[0]) != type({})) ? remove(args, 0) : [ + \ printf('ctags -f - --sort=yes --excmd=number --language-force=%s %s 2> %s %s', get({ 'cpp': 'c++' }, &filetype, &filetype), escaped, null, sort), + \ printf('ctags -f - --sort=yes --excmd=number %s 2> %s %s', escaped, null, sort)] + if type(tag_cmds) != type([]) + let tag_cmds = [tag_cmds] + endif + try + return s:fzf('btags', { + \ 'source': s:btags_source(tag_cmds), + \ 'sink*': s:function('s:btags_sink'), + \ 'options': s:reverse_list(['-m', '-d', '\t', '--with-nth', '1,4..', '-n', '1', '--prompt', 'BTags> ', '--query', a:query, '--preview-window', '+{3}-/2'])}, args) + catch + return s:warn(v:exception) + endtry +endfunction + +" ------------------------------------------------------------------ +" Tags +" ------------------------------------------------------------------ +function! s:tags_sink(lines) + if len(a:lines) < 2 + return + endif + + " Remember the current position + let buf = bufnr() + let view = winsaveview() + + let qfl = [] + let [key; list] = a:lines + + try + let [magic, &magic, wrapscan, &wrapscan, acd, &acd] = [&magic, 0, &wrapscan, 1, &acd, 0] + for line in list + try + let parts = split(line, '\t\zs') + let excmd = matchstr(join(parts[2:-2], '')[:-2], '^.\{-}\ze;\?"\t') + let base = fnamemodify(parts[-1], ':h') + let relpath = parts[1][:-2] + let abspath = relpath =~ (s:is_win ? '^[A-Z]:\' : '^/') ? relpath : join([base, relpath], '/') + + if len(list) == 1 + call s:action_for(key, expand(abspath, 1)) + else + call s:open(expand(abspath, 1)) + endif + call s:execute_silent(excmd) + call add(qfl, {'filename': expand('%'), 'lnum': line('.'), 'text': getline('.')}) + catch /^Vim:Interrupt$/ + break + catch + call s:warn(v:exception) + endtry + endfor + finally + let [&magic, &wrapscan, &acd] = [magic, wrapscan, acd] + endtry + + if len(qfl) > 1 + " Go back to the original position. Because 'listproc' will use 'cfirst' + " to go to the first item in the list. + call s:execute_silent('b '.buf) + call winrestview(view) + + " However, if a non-default action is triggered, we need to open the first + " entry using the action, to be as backward compatible as possible. + call s:action_for(key, qfl[0].filename, 1) + + call s:fill_quickfix('tags', qfl) + else + normal! ^zvzz + endif +endfunction + +function! fzf#vim#tags(query, ...) + if !executable('perl') + return s:warn('Tags command requires perl') + endif + if empty(tagfiles()) + call inputsave() + echohl WarningMsg + let gen = input('tags not found. Generate? (y/N) ') + echohl None + call inputrestore() + redraw + if gen =~? '^y' + call s:warn('Preparing tags') + call system(s:conf('tags_command', 'ctags -R'.(s:is_win ? ' --output-format=e-ctags' : ''))) + if empty(tagfiles()) + return s:warn('Failed to create tags') + endif + else + return s:warn('No tags found') + endif + endif + + let tagfiles = tagfiles() + let v2_limit = 1024 * 1024 * 200 + for tagfile in tagfiles + let v2_limit -= getfsize(tagfile) + if v2_limit < 0 + break + endif + endfor + let opts = v2_limit < 0 ? ['--algo=v1'] : [] + + return s:fzf('tags', { + \ 'source': 'perl '.fzf#shellescape(s:bin.tags).' '.join(map(tagfiles, 'fzf#shellescape(fnamemodify(v:val, ":p"))')), + \ 'sink*': s:function('s:tags_sink'), + \ 'options': extend(opts, ['--nth', '1..2', '-m', '-d', '\t', '--tiebreak=begin', '--prompt', 'Tags> ', '--query', a:query])}, a:000) +endfunction + +" ------------------------------------------------------------------ +" Snippets (UltiSnips) +" ------------------------------------------------------------------ +function! s:inject_snippet(line) + let snip = split(a:line, "\t")[0] + execute 'normal! a'.s:strip(snip)."\=UltiSnips#ExpandSnippet()\" +endfunction + +function! fzf#vim#snippets(...) + if !exists(':UltiSnipsEdit') + return s:warn('UltiSnips not found') + endif + let list = UltiSnips#SnippetsInCurrentScope() + if empty(list) + return s:warn('No snippets available here') + endif + let aligned = sort(s:align_lists(items(list))) + let colored = map(aligned, 's:yellow(v:val[0])."\t".v:val[1]') + return s:fzf('snippets', { + \ 'source': colored, + \ 'options': '--ansi --tiebreak=index +m -n 1,.. -d "\t"', + \ 'sink': s:function('s:inject_snippet')}, a:000) +endfunction + +" ------------------------------------------------------------------ +" Commands +" ------------------------------------------------------------------ +let s:nbs = nr2char(0xa0) + +function! s:format_cmd(line) + return substitute(a:line, '\C \([A-Z]\S*\) ', + \ '\=s:nbs.s:yellow(submatch(1), "Function").s:nbs', '') +endfunction + +function! s:command_sink(lines) + if len(a:lines) < 2 + return + endif + let cmd = matchstr(a:lines[1], s:nbs.'\zs\S*\ze'.s:nbs) + if empty(a:lines[0]) + call feedkeys(':'.cmd.(a:lines[1][0] == '!' ? '' : ' '), 'n') + else + call feedkeys(':'.cmd."\", 'n') + endif +endfunction + +let s:fmt_excmd = ' '.s:blue('%-38s', 'Statement').'%s' + +function! s:format_excmd(ex) + let match = matchlist(a:ex, '^|:\(\S\+\)|\s*\S*\(.*\)') + return printf(s:fmt_excmd, s:nbs.match[1].s:nbs, s:strip(match[2])) +endfunction + +function! s:excmds() + let help = globpath($VIMRUNTIME, 'doc/index.txt') + if empty(help) + return [] + endif + + let commands = [] + let command = '' + for line in readfile(help) + if line =~ '^|:[^|]' + if !empty(command) + call add(commands, s:format_excmd(command)) + endif + let command = line + elseif line =~ '^\s\+\S' && !empty(command) + let command .= substitute(line, '^\s*', ' ', '') + elseif !empty(commands) && line =~ '^\s*$' + break + endif + endfor + if !empty(command) + call add(commands, s:format_excmd(command)) + endif + return commands +endfunction + +function! fzf#vim#commands(...) + redir => cout + silent command + redir END + let list = split(cout, "\n") + return s:fzf('commands', { + \ 'source': extend(extend(list[0:0], map(list[1:], 's:format_cmd(v:val)')), s:excmds()), + \ 'sink*': s:function('s:command_sink'), + \ 'options': '--ansi --expect '.s:conf('commands_expect', 'ctrl-x'). + \ ' --tiebreak=index --header-lines 1 -x --prompt "Commands> " -n2,3,2..3 -d'.s:nbs}, a:000) +endfunction + +" ------------------------------------------------------------------ +" Changes +" ------------------------------------------------------------------ + +function! s:format_change(bufnr, offset, item) + return printf("%3d %s %4d %3d %s", a:bufnr, s:yellow(printf('%6s', a:offset)), a:item.lnum, a:item.col, getbufline(a:bufnr, a:item.lnum)[0]) +endfunction + +function! s:changes_sink(lines) + if len(a:lines) < 2 + return + endif + + call s:action_for(a:lines[0]) + let [b, o, l, c] = split(a:lines[1])[0:3] + + if o == '-' + execute 'buffer' b + call cursor(l, c) + elseif o[0] == '+' + execute 'normal!' o[1:].'g,' + else + execute 'normal!' o.'g;' + endif +endfunction + +function! s:format_change_offset(current, index, cursor) + if !a:current + return '-' + endif + + let offset = a:index - a:cursor + 1 + if offset < 0 + return '+'.-offset + endif + return offset +endfunction + +function! fzf#vim#changes(...) + let all_changes = ["buf offset line col text"] + let cursor = 0 + for bufnr in fzf#vim#_buflisted_sorted() + let [changes, position_or_length] = getchangelist(bufnr) + let current = bufnr() == bufnr + if current + let cursor = len(changes) - position_or_length + endif + let all_changes += map(reverse(changes), { idx, val -> s:format_change(bufnr, s:format_change_offset(current, idx, cursor), val) }) + endfor + + return s:fzf('changes', { + \ 'source': all_changes, + \ 'sink*': s:function('s:changes_sink'), + \ 'options': printf('+m -x --ansi --tiebreak=index --header-lines=1 --cycle --scroll-off 999 --sync --bind start:pos:%d --prompt "Changes> "', cursor)}, a:000) +endfunction + +" ------------------------------------------------------------------ +" Marks +" ------------------------------------------------------------------ +function! s:format_mark(line) + return substitute(a:line, '\S', '\=s:yellow(submatch(0), "Number")', '') +endfunction + +function! s:mark_sink(lines) + if len(a:lines) < 2 + return + endif + call s:action_for(a:lines[0]) + execute 'normal! `'.matchstr(a:lines[1], '\S').'zz' +endfunction + +function! fzf#vim#marks(...) + redir => cout + silent marks + redir END + let list = split(cout, "\n") + return s:fzf('marks', { + \ 'source': extend(list[0:0], map(list[1:], 's:format_mark(v:val)')), + \ 'sink*': s:function('s:mark_sink'), + \ 'options': '+m -x --ansi --tiebreak=index --header-lines 1 --tiebreak=begin --prompt "Marks> "'}, a:000) +endfunction + +" ------------------------------------------------------------------ +" Jumps +" ------------------------------------------------------------------ +function! s:jump_format(line) + return substitute(a:line, '[0-9]\+', '\=s:yellow(submatch(0), "Number")', '') +endfunction + +function! s:jump_sink(lines) + if len(a:lines) < 2 + return + endif + call s:action_for(a:lines[0]) + let idx = index(s:jumplist, a:lines[1]) + if idx == -1 + return + endif + let current = match(s:jumplist, '\v^\s*\>') + let delta = idx - current + if delta < 0 + execute 'normal! ' . -delta . "\" + else + execute 'normal! ' . delta . "\" + endif +endfunction + +function! fzf#vim#jumps(...) + redir => cout + silent jumps + redir END + let s:jumplist = split(cout, '\n') + let current = -match(s:jumplist, '\v^\s*\>') + return s:fzf('jumps', { + \ 'source' : extend(s:jumplist[0:0], map(s:jumplist[1:], 's:jump_format(v:val)')), + \ 'sink*' : s:function('s:jump_sink'), + \ 'options' : '+m -x --ansi --tiebreak=index --cycle --scroll-off 999 --sync --bind start:pos:'.current.' --tac --header-lines 1 --tiebreak=begin --prompt "Jumps> "', + \ }, a:000) +endfunction + +" ------------------------------------------------------------------ +" Help tags +" ------------------------------------------------------------------ +function! s:helptag_sink(line) + let [tag, file, path] = split(a:line, "\t")[0:2] + let rtp = fnamemodify(path, ':p:h:h') + if stridx(&rtp, rtp) < 0 + execute 'set rtp+='.s:escape(rtp) + endif + execute 'help' tag +endfunction + +function! fzf#vim#helptags(...) + if !executable('perl') + return s:warn('Helptags command requires perl') + endif + let sorted = sort(split(globpath(&runtimepath, 'doc/tags', 1), '\n')) + let tags = exists('*uniq') ? uniq(sorted) : fzf#vim#_uniq(sorted) + + if exists('s:helptags_script') + silent! call delete(s:helptags_script) + endif + let s:helptags_script = tempname() + + call writefile(['for my $filename (@ARGV) { open(my $file,q(<),$filename) or die; while (<$file>) { /(.*?)\t(.*?)\t(.*)/; push @lines, sprintf(qq('.s:green('%-40s', 'Label').'\t%s\t%s\t%s\n), $1, $2, $filename, $3); } close($file) or die; } print for sort @lines;'], s:helptags_script) + return s:fzf('helptags', { + \ 'source': 'perl '.fzf#shellescape(s:helptags_script).' '.join(map(tags, 'fzf#shellescape(v:val)')), + \ 'sink': s:function('s:helptag_sink'), + \ 'options': ['--ansi', '+m', '--tiebreak=begin', '--with-nth', '..3']}, a:000) +endfunction + +" ------------------------------------------------------------------ +" File types +" ------------------------------------------------------------------ +function! fzf#vim#filetypes(...) + return s:fzf('filetypes', { + \ 'source': fzf#vim#_uniq(sort(map(split(globpath(&rtp, 'syntax/*.vim'), '\n'), + \ 'fnamemodify(v:val, ":t:r")'))), + \ 'sink': 'setf', + \ 'options': '+m --prompt="File types> "' + \}, a:000) +endfunction + +" ------------------------------------------------------------------ +" Windows +" ------------------------------------------------------------------ +function! s:format_win(tab, win, buf) + let modified = getbufvar(a:buf, '&modified') + let name = bufname(a:buf) + let name = empty(name) ? s:nbs.s:nbs.'[No Name]' : ' '.s:nbs.name + let active = tabpagewinnr(a:tab) == a:win + return (active? s:blue('>', 'Operator') : ' ') . name . s:nbs . (modified? s:red(' [+]', 'Exception') : '') +endfunction + +function! s:windows_sink(line) + let list = matchlist(a:line, '^ *\([0-9]\+\) *\([0-9]\+\)') + call s:jump(list[1], list[2]) +endfunction + +function! fzf#vim#windows(...) + let lines = [] + for t in range(1, tabpagenr('$')) + let buffers = tabpagebuflist(t) + for w in range(1, len(buffers)) + call add(lines, + \ printf('%s %s %s', + \ s:yellow(printf('%3d', t), 'Number'), + \ s:cyan(printf('%3d', w), 'String'), + \ s:format_win(t, w, buffers[w-1]))) + endfor + endfor + return s:fzf('windows', { + \ 'source': extend(['Tab Win Name'], lines), + \ 'sink': s:function('s:windows_sink'), + \ 'options': '+m --ansi --tiebreak=begin --header-lines=1 -d'.s:nbs}, a:000) +endfunction + +" ------------------------------------------------------------------ +" Commits / BCommits +" ------------------------------------------------------------------ +function! s:yank_to_register(data) + let @" = a:data + silent! let @* = a:data + silent! let @+ = a:data +endfunction + +function! s:commits_sink(lines) + if len(a:lines) < 2 + return + endif + + let pat = '[0-9a-f]\{7,40}' + + if a:lines[0] == 'ctrl-y' + let hashes = join(filter(map(a:lines[1:], 'matchstr(v:val, pat)'), 'len(v:val)')) + return s:yank_to_register(hashes) + end + + let diff = a:lines[0] == 'ctrl-d' + let Cmd = get(get(g:, 'fzf_action', s:default_action), a:lines[0], '') + let cmd = type(Cmd) == s:TYPE.string ? Cmd : '' + + let buf = bufnr('') + for idx in range(1, len(a:lines) - 1) + let sha = matchstr(a:lines[idx], pat) + if !empty(sha) + if diff + if idx > 1 + execute 'tab sb' buf + endif + execute 'Gdiff' sha + else + " Since fugitive buffers are unlisted, we can't keep using 'e' + let c = empty(cmd) ? (idx == 1 ? 'edit' : 'tab split') : cmd + execute c FugitiveFind(sha) + endif + endif + endfor +endfunction + +function! s:commits(range, buffer_local, args) + let s:git_root = s:get_git_root('') + if empty(s:git_root) + return s:warn('Not in git repository') + endif + + let prefix = 'git -C ' . fzf#shellescape(s:git_root) . ' ' + let source = prefix . 'log '.s:conf('commits_log_options', '--color=always '.fzf#shellescape('--format=%C(auto)%h%d %s %C(green)%cr')) + let current = expand('%:p') + let managed = 0 + if !empty(current) + call system(prefix . 'show '.fzf#shellescape(current).' 2> '.(s:is_win ? 'nul' : '/dev/null')) + let managed = !v:shell_error + endif + + let args = copy(a:args) + let log_opts = len(args) && type(args[0]) == type('') ? remove(args, 0) : '' + + if len(a:range) || a:buffer_local + if !managed + return s:warn('The current buffer is not in the working tree') + endif + let source .= len(a:range) + \ ? join([printf(' -L %d,%d:%s --no-patch', a:range[0], a:range[1], fzf#shellescape(current)), log_opts]) + \ : join([' --follow', log_opts, fzf#shellescape(current)]) + let command = 'BCommits' + else + let source .= join([' --graph', log_opts]) + let command = 'Commits' + endif + + let expect_keys = join(keys(get(g:, 'fzf_action', s:default_action)), ',') + let options = { + \ 'source': source, + \ 'sink*': s:function('s:commits_sink'), + \ 'options': s:reverse_list(['--ansi', '--multi', '--tiebreak=index', + \ '--inline-info', '--prompt', command.'> ', '--bind=ctrl-s:toggle-sort', + \ '--header', ':: Press '.s:magenta('CTRL-S', 'Special').' to toggle sort, '.s:magenta('CTRL-Y', 'Special').' to yank commit hashes', + \ '--expect=ctrl-y,'.expect_keys]) + \ } + + if a:buffer_local + let options.options[-2] .= ', '.s:magenta('CTRL-D', 'Special').' to diff' + let options.options[-1] .= ',ctrl-d' + endif + + if !s:is_win && &columns > s:wide + let suffix = executable('delta') ? '| delta --width $FZF_PREVIEW_COLUMNS' : '' + let orderfile = tempname() + call writefile([current[len(s:git_root)+1:]], orderfile) + call extend(options.options, + \ ['--preview', 'echo {} | grep -o "[a-f0-9]\{7,\}" | head -1 | xargs ' . prefix . 'show -O'.fzf#shellescape(orderfile).' --format=format: --color=always ' . suffix]) + endif + + return s:fzf(a:buffer_local ? 'bcommits' : 'commits', options, args) +endfunction + +" Heuristically determine if the user specified a range +function! s:given_range(line1, line2) + " 1. From visual mode + " :'<,'>Commits + " 2. From command-line + " :10,20Commits + if a:line1 == line("'<") && a:line2 == line("'>") || + \ (a:line1 != 1 || a:line2 != line('$')) + return [a:line1, a:line2] + endif + + return [] +endfunction + +" [git-log-args], [spec (dict)], [fullscreen (bool)] +function! fzf#vim#commits(...) range + if exists('b:fzf_winview') + call winrestview(b:fzf_winview) + unlet b:fzf_winview + endif + return s:commits(s:given_range(a:firstline, a:lastline), 0, a:000) +endfunction + +" [git-log-args], [spec (dict)], [fullscreen (bool)] +function! fzf#vim#buffer_commits(...) range + if exists('b:fzf_winview') + call winrestview(b:fzf_winview) + unlet b:fzf_winview + endif + return s:commits(s:given_range(a:firstline, a:lastline), 1, a:000) +endfunction + +" ------------------------------------------------------------------ +" fzf#vim#maps(mode, opts[with count and op]) +" ------------------------------------------------------------------ +function! s:align_pairs(list) + let maxlen = 0 + let pairs = [] + for elem in a:list + let match = matchlist(elem, '^\(\S*\)\s*\(.*\)$') + let [_, k, v] = match[0:2] + let maxlen = max([maxlen, len(k)]) + call add(pairs, [k, substitute(v, '^\*\?[@ ]\?', '', '')]) + endfor + let maxlen = min([maxlen, 35]) + return map(pairs, "printf('%-'.maxlen.'s', v:val[0]).' '.v:val[1]") +endfunction + +function! s:highlight_keys(str) + return substitute( + \ substitute(a:str, '<[^ >]\+>', s:yellow('\0', 'Special'), 'g'), + \ '', s:blue('', 'SpecialKey'), 'g') +endfunction + +function! s:key_sink(line) + let key = matchstr(a:line, '^\S*') + redraw + call feedkeys(s:map_gv.s:map_cnt.s:map_reg, 'n') + call feedkeys(s:map_op. + \ substitute(key, '<[^ >]\+>', '\=eval("\"\\".submatch(0)."\"")', 'g')) +endfunction + +function! fzf#vim#maps(mode, ...) + let s:map_gv = a:mode == 'x' ? 'gv' : '' + let s:map_cnt = v:count == 0 ? '' : v:count + let s:map_reg = empty(v:register) ? '' : ('"'.v:register) + let s:map_op = a:mode == 'o' ? v:operator : '' + + redir => cout + silent execute 'verbose' a:mode.'map' + redir END + let list = [] + let curr = '' + for line in split(cout, "\n") + if line =~ "^\t" + let src = "\t".substitute(matchstr(line, '/\zs[^/\\]*\ze$'), ' [^ ]* ', ':', '') + call add(list, printf('%s %s', curr, s:green(src, 'Comment'))) + let curr = '' + else + if !empty(curr) + call add(list, curr) + endif + let curr = line[3:] + endif + endfor + if !empty(curr) + call add(list, curr) + endif + let aligned = s:align_pairs(list) + let sorted = sort(aligned) + let colored = map(sorted, 's:highlight_keys(v:val)') + let pcolor = a:mode == 'x' ? 9 : a:mode == 'o' ? 10 : 12 + return s:fzf('maps', { + \ 'source': colored, + \ 'sink': s:function('s:key_sink'), + \ 'options': '--prompt "Maps ('.a:mode.')> " --ansi --no-hscroll --nth 1,.. --color prompt:'.pcolor}, a:000) +endfunction + +" ---------------------------------------------------------------------------- +" fzf#vim#complete - completion helper +" ---------------------------------------------------------------------------- +inoremap (-fzf-complete-trigger) :call complete_trigger() + +function! s:pluck(dict, key, default) + return has_key(a:dict, a:key) ? remove(a:dict, a:key) : a:default +endfunction + +function! s:complete_trigger() + let opts = copy(s:opts) + call s:prepend_opts(opts, ['+m', '-q', s:query]) + let opts['sink*'] = s:function('s:complete_insert') + let s:reducer = s:pluck(opts, 'reducer', s:function('s:first_line')) + call fzf#run(opts) +endfunction + +" The default reducer +function! s:first_line(lines) + return a:lines[0] +endfunction + +function! s:complete_insert(lines) + if empty(a:lines) + return + endif + + let chars = strchars(s:query) + if chars == 0 | let del = '' + elseif chars == 1 | let del = '"_x' + else | let del = (chars - 1).'"_dvh' + endif + + let data = call(s:reducer, [a:lines]) + let ve = &ve + set ve= + execute 'normal!' ((s:eol || empty(chars)) ? '' : 'h').del.(s:eol ? 'a': 'i').data + let &ve = ve + if mode() =~ 't' + call feedkeys('a', 'n') + elseif has('nvim') + execute "normal! \la" + else + call feedkeys("\(-fzf-complete-finish)") + endif +endfunction + +nnoremap (-fzf-complete-finish) a +inoremap (-fzf-complete-finish) l + +function! s:eval(dict, key, arg) + if has_key(a:dict, a:key) && type(a:dict[a:key]) == s:TYPE.funcref + let ret = copy(a:dict) + let ret[a:key] = call(a:dict[a:key], [a:arg]) + return ret + endif + return a:dict +endfunction + +function! fzf#vim#complete(...) + if a:0 == 0 + let s:opts = fzf#wrap() + elseif type(a:1) == s:TYPE.dict + let s:opts = copy(a:1) + elseif type(a:1) == s:TYPE.string + let s:opts = extend({'source': a:1}, get(a:000, 1, fzf#wrap())) + else + echoerr 'Invalid argument: '.string(a:000) + return '' + endif + for s in ['sink', 'sink*'] + if has_key(s:opts, s) + call remove(s:opts, s) + endif + endfor + + let eol = col('$') + let ve = &ve + set ve=all + let s:eol = col('.') == eol + let &ve = ve + + let Prefix = s:pluck(s:opts, 'prefix', '\k*$') + if col('.') == 1 + let s:query = '' + else + let full_prefix = getline('.')[0 : col('.')-2] + if type(Prefix) == s:TYPE.funcref + let s:query = call(Prefix, [full_prefix]) + else + let s:query = matchstr(full_prefix, Prefix) + endif + endif + let s:opts = s:eval(s:opts, 'source', s:query) + let s:opts = s:eval(s:opts, 'options', s:query) + let s:opts = s:eval(s:opts, 'extra_options', s:query) + if has_key(s:opts, 'extra_options') + call s:merge_opts(s:opts, remove(s:opts, 'extra_options')) + endif + if has_key(s:opts, 'options') + if type(s:opts.options) == s:TYPE.list + call add(s:opts.options, '--no-expect') + else + let s:opts.options .= ' --no-expect' + endif + endif + + call feedkeys("\(-fzf-complete-trigger)") + return '' +endfunction + +" ------------------------------------------------------------------ +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/.vim/bundle/vim-fzf/autoload/fzf/vim/complete.vim b/.vim/bundle/vim-fzf/autoload/fzf/vim/complete.vim new file mode 100644 index 0000000..0f60b97 --- /dev/null +++ b/.vim/bundle/vim-fzf/autoload/fzf/vim/complete.vim @@ -0,0 +1,164 @@ +" Copyright (c) 2015 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. + +let s:cpo_save = &cpo +set cpo&vim +let s:is_win = has('win32') || has('win64') + +function! s:extend(base, extra) + let base = copy(a:base) + if has_key(a:extra, 'options') + let extra = copy(a:extra) + let extra.extra_options = remove(extra, 'options') + return extend(base, extra) + endif + return extend(base, a:extra) +endfunction + +if v:version >= 704 + function! s:function(name) + return function(a:name) + endfunction +else + function! s:function(name) + " By Ingo Karkat + return function(substitute(a:name, '^s:', matchstr(expand(''), '\d\+_\zefunction$'), '')) + endfunction +endif + +function! fzf#vim#complete#word(...) + let sources = empty(&dictionary) ? ['/usr/share/dict/words'] : split(&dictionary, ',') + return fzf#vim#complete(s:extend({ + \ 'source': 'cat ' . join(map(sources, 'fzf#shellescape(v:val)'))}, + \ get(a:000, 0, fzf#wrap()))) +endfunction + +" ---------------------------------------------------------------------------- +" (fzf-complete-path) +" (fzf-complete-file) +" (fzf-complete-file-ag) +" ---------------------------------------------------------------------------- +function! s:file_split_prefix(prefix) + let expanded = expand(a:prefix) + let slash = (s:is_win && !&shellslash) ? '\\' : '/' + return isdirectory(expanded) ? + \ [expanded, + \ substitute(a:prefix, '[/\\]*$', slash, ''), + \ ''] : + \ [fnamemodify(expanded, ':h'), + \ substitute(fnamemodify(a:prefix, ':h'), '[/\\]*$', slash, ''), + \ fnamemodify(expanded, ':t')] +endfunction + +function! s:file_source(prefix) + let [dir, head, tail] = s:file_split_prefix(a:prefix) + return printf( + \ "cd %s && ".s:file_cmd." | sed %s", + \ fzf#shellescape(dir), fzf#shellescape('s:^:'.(empty(a:prefix) || a:prefix == tail ? '' : head).':')) +endfunction + +function! s:file_options(prefix) + let [_, head, tail] = s:file_split_prefix(a:prefix) + return ['--prompt', head, '--query', tail] +endfunction + +function! s:fname_prefix(str) + let isf = &isfname + let white = [] + let black = [] + if isf =~ ',,,' + call add(white, ',') + let isf = substitute(isf, ',,,', ',', 'g') + endif + if isf =~ ',^,,' + call add(black, ',') + let isf = substitute(isf, ',^,,', ',', 'g') + endif + + for token in split(isf, ',') + let target = white + if token[0] == '^' + let target = black + let token = token[1:] + endif + + let ends = matchlist(token, '\(.\+\)-\(.\+\)') + if empty(ends) + call add(target, token) + else + let ends = map(ends[1:2], "len(v:val) == 1 ? char2nr(v:val) : str2nr(v:val)") + for i in range(ends[0], ends[1]) + call add(target, nr2char(i)) + endfor + endif + endfor + + let prefix = a:str + for offset in range(1, len(a:str)) + let char = a:str[len(a:str) - offset] + if (char =~ '\w' || index(white, char) >= 0) && index(black, char) < 0 + continue + endif + let prefix = strpart(a:str, len(a:str) - offset + 1) + break + endfor + + return prefix +endfunction + +function! fzf#vim#complete#path(command, ...) + let s:file_cmd = a:command + return fzf#vim#complete(s:extend({ + \ 'prefix': s:function('s:fname_prefix'), + \ 'source': s:function('s:file_source'), + \ 'options': s:function('s:file_options')}, get(a:000, 0, fzf#wrap()))) +endfunction + +" ---------------------------------------------------------------------------- +" (fzf-complete-line) +" (fzf-complete-buffer-line) +" ---------------------------------------------------------------------------- +function! s:reduce_line(lines) + return join(split(a:lines[0], '\t\zs')[3:], '') +endfunction + + +function! fzf#vim#complete#line(...) + let [display_bufnames, lines] = fzf#vim#_lines(0) + let nth = display_bufnames ? 4 : 3 + return fzf#vim#complete(s:extend({ + \ 'prefix': '^.*$', + \ 'source': lines, + \ 'options': '--tiebreak=index --ansi --nth '.nth.'.. --tabstop=1', + \ 'reducer': s:function('s:reduce_line')}, get(a:000, 0, fzf#wrap()))) +endfunction + +function! fzf#vim#complete#buffer_line(...) + return fzf#vim#complete(s:extend({ + \ 'prefix': '^.*$', + \ 'source': fzf#vim#_uniq(getline(1, '$'))}, get(a:000, 0, fzf#wrap()))) +endfunction + +let &cpo = s:cpo_save +unlet s:cpo_save + diff --git a/.vim/bundle/vim-fzf/autoload/fzf/vim/listproc.vim b/.vim/bundle/vim-fzf/autoload/fzf/vim/listproc.vim new file mode 100644 index 0000000..7a1342c --- /dev/null +++ b/.vim/bundle/vim-fzf/autoload/fzf/vim/listproc.vim @@ -0,0 +1,38 @@ +" Copyright (c) 2023 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. + +function! fzf#vim#listproc#quickfix(list) + call setqflist(a:list) + copen + wincmd p + cfirst + normal! zvzz +endfunction + +function! fzf#vim#listproc#location(list) + call setloclist(0, a:list) + lopen + wincmd p + lfirst + normal! zvzz +endfunction diff --git a/.vim/bundle/vim-fzf/bin/preview.rb b/.vim/bundle/vim-fzf/bin/preview.rb new file mode 100755 index 0000000..4532421 --- /dev/null +++ b/.vim/bundle/vim-fzf/bin/preview.rb @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby + +puts 'preview.rb is deprecated. Use preview.sh instead.' diff --git a/.vim/bundle/vim-fzf/bin/preview.sh b/.vim/bundle/vim-fzf/bin/preview.sh new file mode 100755 index 0000000..87be30c --- /dev/null +++ b/.vim/bundle/vim-fzf/bin/preview.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +REVERSE="\x1b[7m" +RESET="\x1b[m" + +if [[ $# -lt 1 ]]; then + echo "usage: $0 [--tag] FILENAME[:LINENO][:IGNORED]" + exit 1 +fi + +if [[ $1 = --tag ]]; then + shift + "$(dirname "${BASH_SOURCE[0]}")/tagpreview.sh" "$@" + exit $? +fi + +# Ignore if an empty path is given +[[ -z $1 ]] && exit + +IFS=':' read -r -a INPUT <<< "$1" +FILE=${INPUT[0]} +CENTER=${INPUT[1]} + +if [[ "$1" =~ ^[A-Za-z]:\\ ]]; then + FILE=$FILE:${INPUT[1]} + CENTER=${INPUT[2]} +fi + +if [[ -n "$CENTER" && ! "$CENTER" =~ ^[0-9] ]]; then + exit 1 +fi +CENTER=${CENTER/[^0-9]*/} + +# MS Win support +if [[ "$FILE" =~ '\' ]]; then + if [ -z "$MSWINHOME" ]; then + MSWINHOME="$HOMEDRIVE$HOMEPATH" + fi + if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null ; then + MSWINHOME="${MSWINHOME//\\/\\\\}" + FILE="${FILE/#\~\\/$MSWINHOME\\}" + FILE=$(wslpath -u "$FILE") + elif [ -n "$MSWINHOME" ]; then + FILE="${FILE/#\~\\/$MSWINHOME\\}" + fi +fi + +FILE="${FILE/#\~\//$HOME/}" +if [ ! -r "$FILE" ]; then + echo "File not found ${FILE}" + exit 1 +fi + +if [ -z "$CENTER" ]; then + CENTER=0 +fi + +# Sometimes bat is installed as batcat. +if command -v batcat > /dev/null; then + BATNAME="batcat" +elif command -v bat > /dev/null; then + BATNAME="bat" +fi + +if [ -z "$FZF_PREVIEW_COMMAND" ] && [ "${BATNAME:+x}" ]; then + ${BATNAME} --style="${BAT_STYLE:-numbers}" --color=always --pager=never \ + --highlight-line=$CENTER -- "$FILE" + exit $? +fi + +FILE_LENGTH=${#FILE} +MIME=$(file --dereference --mime -- "$FILE") +if [[ "${MIME:FILE_LENGTH}" =~ binary ]]; then + echo "$MIME" + exit 0 +fi + +DEFAULT_COMMAND="highlight -O ansi -l {} || coderay {} || rougify {} || cat {}" +CMD=${FZF_PREVIEW_COMMAND:-$DEFAULT_COMMAND} +CMD=${CMD//{\}/$(printf %q "$FILE")} + +eval "$CMD" 2> /dev/null | awk "{ \ + if (NR == $CENTER) \ + { gsub(/\x1b[[0-9;]*m/, \"&$REVERSE\"); printf(\"$REVERSE%s\n$RESET\", \$0); } \ + else printf(\"$RESET%s\n\", \$0); \ + }" diff --git a/.vim/bundle/vim-fzf/bin/tagpreview.sh b/.vim/bundle/vim-fzf/bin/tagpreview.sh new file mode 100755 index 0000000..e00bc2c --- /dev/null +++ b/.vim/bundle/vim-fzf/bin/tagpreview.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash + +REVERSE="\x1b[7m" +RESET="\x1b[m" + +if [ -z "$1" ]; then + echo "usage: $0 FILENAME:TAGFILE:EXCMD" + exit 1 +fi + +IFS=':' read -r FILE TAGFILE EXCMD <<< "$*" + +# Complete file paths which are relative to the given tag file +if [ "${FILE:0:1}" != "/" ]; then + FILE="$(dirname "${TAGFILE}")/${FILE}" +fi + +if [ ! -r "$FILE" ]; then + echo "File not found ${FILE}" + exit 1 +fi + +# If users aren't using vim, they are probably using neovim +if command -v vim > /dev/null; then + VIMNAME="vim" +elif command -v nvim > /dev/null; then + VIMNAME="nvim" +else + echo "Cannot preview tag: vim or nvim unavailable" + exit 1 +fi + +CENTER="$("${VIMNAME}" -R -i NONE -u NONE -e -m -s "${FILE}" \ + -c "set nomagic" \ + -c "${EXCMD}" \ + -c 'let l=line(".") | new | put =l | print | qa!')" || exit + +START_LINE="$(( CENTER - FZF_PREVIEW_LINES / 2 ))" +if (( START_LINE <= 0 )); then + START_LINE=1 +fi +END_LINE="$(( START_LINE + FZF_PREVIEW_LINES - 1 ))" + +# Sometimes bat is installed as batcat. +if command -v batcat > /dev/null; then + BATNAME="batcat" +elif command -v bat > /dev/null; then + BATNAME="bat" +fi + +if [ -z "$FZF_PREVIEW_COMMAND" ] && [ "${BATNAME:+x}" ]; then + ${BATNAME} --style="${BAT_STYLE:-numbers}" \ + --color=always \ + --pager=never \ + --wrap=never \ + --terminal-width="${FZF_PREVIEW_COLUMNS}" \ + --line-range="${START_LINE}:${END_LINE}" \ + --highlight-line="${CENTER}" \ + "$FILE" + exit $? +fi + +DEFAULT_COMMAND="highlight -O ansi -l {} || coderay {} || rougify {} || cat {}" +CMD=${FZF_PREVIEW_COMMAND:-$DEFAULT_COMMAND} +CMD=${CMD//{\}/$(printf %q "$FILE")} + +eval "$CMD" 2> /dev/null | awk "{ \ + if (NR >= $START_LINE && NR <= $END_LINE) { \ + if (NR == $CENTER) \ + { gsub(/\x1b[[0-9;]*m/, \"&$REVERSE\"); printf(\"$REVERSE%s\n$RESET\", \$0); } \ + else printf(\"$RESET%s\n\", \$0); \ + } \ + }" diff --git a/.vim/bundle/vim-fzf/bin/tags.pl b/.vim/bundle/vim-fzf/bin/tags.pl new file mode 100755 index 0000000..4208c16 --- /dev/null +++ b/.vim/bundle/vim-fzf/bin/tags.pl @@ -0,0 +1,15 @@ +#!/usr/bin/env perl + +use strict; + +foreach my $file (@ARGV) { + open my $lines, $file; + while (<$lines>) { + unless (/^\!/) { + s/^[^\t]*/sprintf("%-24s", $&)/e; + s/$/\t$file/; + print; + } + } + close $lines; +} diff --git a/.vim/bundle/vim-fzf/doc/fzf-vim.txt b/.vim/bundle/vim-fzf/doc/fzf-vim.txt new file mode 100644 index 0000000..d2179d2 --- /dev/null +++ b/.vim/bundle/vim-fzf/doc/fzf-vim.txt @@ -0,0 +1,515 @@ +fzf-vim.txt fzf-vim Last change: October 14 2023 +FZF-VIM - TABLE OF CONTENTS *fzf-vim* *fzf-vim-toc* +============================================================================== + + fzf :heart: vim |fzf-vim-fzfheart-vim| + Rationale |fzf-vim-rationale| + Why you should use fzf on Vim |fzf-vim-why-you-should-use-fzf-on-vim| + Installation |fzf-vim-installation| + Using vim-plug |fzf-vim-using-vim-plug| + Dependencies |fzf-vim-dependencies| + Commands |fzf-vim-commands| + Customization |fzf-vim-customization| + Configuration options of the base plugin |fzf-vim-configuration-options-of-the-base-plugin| + Configuration options for fzf.vim |fzf-vim-configuration-options-for-fzf-vim| + Preview window |fzf-vim-preview-window| + Command-level options |fzf-vim-command-level-options| + List type to handle multiple selections |fzf-vim-list-type-to-handle-multiple-selections| + Advanced customization |fzf-vim-advanced-customization| + Vim functions |fzf-vim-vim-functions| + Example: Customizing Files command |fzf-vim-example-customizing-files-command| + Example: git grep wrapper |fzf-vim-example-git-grep-wrapper| + Mappings |fzf-vim-mappings| + Completion functions |fzf-vim-completion-functions| + Custom completion |fzf-vim-custom-completion| + Reducer example |fzf-vim-reducer-example| + Status line of terminal buffer |fzf-vim-status-line-of-terminal-buffer| + Hide statusline |fzf-vim-hide-statusline| + Custom statusline |fzf-vim-custom-statusline| + License |fzf-vim-license| + +FZF :HEART: VIM *fzf-vim-fzfheart-vim* +============================================================================== + +Things you can do with {fzf}{1} and Vim. + + {1} https://github.com/junegunn/fzf + + +RATIONALE *fzf-vim-rationale* +============================================================================== + +{fzf}{1} itself is not a Vim plugin, and the official repository only provides +the {basic wrapper function}{2} for Vim. It's up to the users to write their +own Vim commands with it. However, I've learned that many users of fzf are not +familiar with Vimscript and are looking for the "default" implementation of +the features they can find in the alternative Vim plugins. + + {1} https://github.com/junegunn/fzf + {2} https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzfrun + + +WHY YOU SHOULD USE FZF ON VIM *fzf-vim-why-you-should-use-fzf-on-vim* +============================================================================== + +Because you can and you love fzf. + +fzf runs asynchronously and can be orders of magnitude faster than similar Vim +plugins. However, the benefit may not be noticeable if the size of the input +is small, which is the case for many of the commands provided here. +Nevertheless I wrote them anyway since it's really easy to implement custom +selector with fzf. + + +INSTALLATION *fzf-vim-installation* +============================================================================== + +fzf.vim depends on the basic Vim plugin of {the main fzf repository}{1}, which +means you need to set up both "fzf" and "fzf.vim" on Vim. To learn more about +fzf/Vim integration, see {README-VIM}{3}. + + {1} https://github.com/junegunn/fzf + {3} https://github.com/junegunn/fzf/blob/master/README-VIM.md + + +< Using vim-plug >____________________________________________________________~ + *fzf-vim-using-vim-plug* +> + Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } + Plug 'junegunn/fzf.vim' +< +`fzf#install()` makes sure that you have the latest binary, but it's optional, +so you can omit it if you use a plugin manager that doesn't support hooks. + + +< Dependencies >______________________________________________________________~ + *fzf-vim-dependencies* + + - {fzf}{1} 0.41.1 or above + - For syntax-highlighted preview, install {bat}{4} + - If {delta}{5} is available, `GF?`, `Commits` and `BCommits` will use it to + format `git diff` output. + - `Ag` requires {The Silver Searcher (ag)}{6} + - `Rg` requires {ripgrep (rg)}{7} + - `Tags` and `Helptags` require Perl + + {1} https://github.com/junegunn/fzf + {4} https://github.com/sharkdp/bat + {5} https://github.com/dandavison/delta + {6} https://github.com/ggreer/the_silver_searcher + {7} https://github.com/BurntSushi/ripgrep + + +COMMANDS *fzf-vim-commands* +============================================================================== + + *:Files* *:GFiles* *:Buffers* *:Colors* *:Ag* *:Rg* *:RG* *:Lines* *:BLines* *:Tags* *:BTags* + *:Changes* *:Marks* *:Jumps* *:Windows* *:Locate* *:History* *:Snippets* *:Commits* *:BCommits* + *:Commands* *:Maps* *:Helptags* *:Filetypes* + + -----------------------+-------------------------------------------------------------------------------------- + Command | List ~ + -----------------------+-------------------------------------------------------------------------------------- + `:Files [PATH]` | Files (runs `$FZF_DEFAULT_COMMAND` if defined) + `:GFiles [OPTS]` | Git files ( `git ls-files` ) + `:GFiles?` | Git files ( `git status` ) + `:Buffers` | Open buffers + `:Colors` | Color schemes + `:Ag [PATTERN]` | {ag}{6} search result ( `ALT-A` to select all, `ALT-D` to deselect all) + `:Rg [PATTERN]` | {rg}{7} search result ( `ALT-A` to select all, `ALT-D` to deselect all) + `:RG [PATTERN]` | {rg}{7} search result; relaunch ripgrep on every keystroke + `:Lines [QUERY]` | Lines in loaded buffers + `:BLines [QUERY]` | Lines in the current buffer + `:Tags [QUERY]` | Tags in the project ( `ctags -R` ) + `:BTags [QUERY]` | Tags in the current buffer + `:Changes` | Changelist across all open buffers + `:Marks` | Marks + `:Jumps` | Jumps + `:Windows` | Windows + `:Locate PATTERN` | `locate` command output + `:History` | `v:oldfiles` and open buffers + `:History:` | Command history + `:History/` | Search history + `:Snippets` | Snippets ({UltiSnips}{8}) + `:Commits [LOG_OPTS]` | Git commits (requires {fugitive.vim}{9}) + `:BCommits [LOG_OPTS]` | Git commits for the current buffer; visual-select lines to track changes in the range + `:Commands` | Commands + `:Maps` | Normal mode mappings + `:Helptags` | Help tags [1] + `:Filetypes` | File types + -----------------------+-------------------------------------------------------------------------------------- + + *g:fzf_vim.command_prefix* + + - Most commands support CTRL-T / CTRL-X / CTRL-V key bindings to open in a new + tab, a new split, or in a new vertical split + - Bang-versions of the commands (e.g. `Ag!`) will open fzf in fullscreen + - You can set `g:fzf_vim.command_prefix` to give the same prefix to the commands + - e.g. `let g:fzf_vim.command_prefix = 'Fzf'` and you have `FzfFiles`, etc. + +(1: `Helptags` will shadow the command of the same name from {pathogen}{10}. +But its functionality is still available via `call pathogen#helptags()`. [↩]) + + {6} https://github.com/ggreer/the_silver_searcher + {7} https://github.com/BurntSushi/ripgrep + {7} https://github.com/BurntSushi/ripgrep + {8} https://github.com/SirVer/ultisnips + {9} https://github.com/tpope/vim-fugitive + {10} https://github.com/tpope/vim-pathogen + + +CUSTOMIZATION *fzf-vim-customization* +============================================================================== + + +< Configuration options of the base plugin >__________________________________~ + *fzf-vim-configuration-options-of-the-base-plugin* + +Every command in fzf.vim internally calls `fzf#wrap` function of the main +repository which supports a set of global option variables. So please read +through {README-VIM}{3} to learn more about them. + + {3} https://github.com/junegunn/fzf/blob/master/README-VIM.md + + +< Configuration options for fzf.vim >_________________________________________~ + *fzf-vim-configuration-options-for-fzf-vim* + + *g:fzf_vim* + +All configuration values for this plugin are stored in `g:fzf_vim` dictionary, +so make sure to initialize it before assigning any configuration values to it. +> + " Initialize configuration dictionary + let g:fzf_vim = {} +< + +Preview window~ + *fzf-vim-preview-window* + + *g:fzf_vim.preview_window* + +Some commands will show the preview window on the right. You can customize the +behavior with `g:fzf_vim.preview_window`. Here are some examples: + + *g:fzf_vim.preview_bash* +> + " This is the default option: + " - Preview window on the right with 50% width + " - CTRL-/ will toggle preview window. + " - Note that this array is passed as arguments to fzf#vim#with_preview function. + " - To learn more about preview window options, see `--preview-window` section of `man fzf`. + let g:fzf_vim.preview_window = ['right,50%', 'ctrl-/'] + + " Preview window is hidden by default. You can toggle it with ctrl-/. + " It will show on the right with 50% width, but if the width is smaller + " than 70 columns, it will show above the candidate list + let g:fzf_vim.preview_window = ['hidden,right,50%,<70(up,40%)', 'ctrl-/'] + + " Empty value to disable preview window altogether + let g:fzf_vim.preview_window = [] + + " fzf.vim needs bash to display the preview window. + " On Windows, fzf.vim will first see if bash is in $PATH, then if + " Git bash (C:\Program Files\Git\bin\bash.exe) is available. + " If you want it to use a different bash, set this variable. + " let g:fzf_vim = {} + " let g:fzf_vim.preview_bash = 'C:\Git\bin\bash.exe' +< + +Command-level options~ + *fzf-vim-command-level-options* + +*g:fzf_vim.commands_expect* *g:fzf_vim.tags_command* *g:fzf_vim.commits_log_options* + *g:fzf_vim.buffers_jump* +> + " [Buffers] Jump to the existing window if possible + let g:fzf_vim.buffers_jump = 1 + + " [[B]Commits] Customize the options used by 'git log': + let g:fzf_vim.commits_log_options = '--graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr"' + + " [Tags] Command to generate tags file + let g:fzf_vim.tags_command = 'ctags -R' + + " [Commands] --expect expression for directly executing the command + let g:fzf_vim.commands_expect = 'alt-enter,ctrl-x' +< + +List type to handle multiple selections~ + *fzf-vim-list-type-to-handle-multiple-selections* + +The following commands will fill the quickfix list when multiple entries are +selected. + + - `Ag` + - `Rg` / `RG` + - `Lines` / `BLines` + - `Tags` / `BTags` + + *g:fzf_vim.listproc* + +By setting `g:fzf_vim.listproc`, you can make them use location list instead. +> + " Default: Use quickfix list + let g:fzf_vim.listproc = { list -> fzf#vim#listproc#quickfix(list) } + + " Use location list instead of quickfix list + let g:fzf_vim.listproc = { list -> fzf#vim#listproc#location(list) } +< +You can customize the list type per command by defining variables named +`g:fzf_vim.listproc_{command_name_in_lowercase}`. + + *g:fzf_vim.listproc_rg* *g:fzf_vim.listproc_ag* +> + " Command-wise customization + let g:fzf_vim.listproc_ag = { list -> fzf#vim#listproc#quickfix(list) } + let g:fzf_vim.listproc_rg = { list -> fzf#vim#listproc#location(list) } +< +You can further customize the behavior by providing a custom function to +process the list instead of using the predefined `fzf#vim#listproc#quickfix` +or `fzf#vim#listproc#location`. +> + " A customized version of fzf#vim#listproc#quickfix. + " The last two lines are commented out not to move to the first entry. + function! g:fzf_vim.listproc(list) + call setqflist(a:list) + copen + wincmd p + " cfirst + " normal! zvzz + endfunction +< + +< Advanced customization >____________________________________________________~ + *fzf-vim-advanced-customization* + + +Vim functions~ + *fzf-vim-vim-functions* + +Each command in fzf.vim is backed by a Vim function. You can override a +command or define a variation of it by calling its corresponding function. + + ----------+--------------------------------------------------------------------------------- + Command | Vim function ~ + ----------+--------------------------------------------------------------------------------- + `Files` | `fzf#vim#files(dir, [spec dict], [fullscreen bool])` + `GFiles` | `fzf#vim#gitfiles(git_options, [spec dict], [fullscreen bool])` + `GFiles?` | `fzf#vim#gitfiles('?', [spec dict], [fullscreen bool])` + `Buffers` | `fzf#vim#buffers([query string], [bufnrs list], [spec dict], [fullscreen bool])` + `Colors` | `fzf#vim#colors([spec dict], [fullscreen bool])` + `Rg` | `fzf#vim#grep(command, [spec dict], [fullscreen bool])` + `RG` | `fzf#vim#grep2(command_prefix, query, [spec dict], [fullscreen bool])` + ... | ... + ----------+--------------------------------------------------------------------------------- + +(We can see that the last two optional arguments of each function are +identical. They are directly passed to `fzf#wrap` function. If you haven't +read {README-VIM}{3} already, please read it before proceeding.) + + {3} https://github.com/junegunn/fzf/blob/master/README-VIM.md + + +Example: Customizing Files command~ + *fzf-vim-example-customizing-files-command* + +This is the default definition of `Files` command: +> + command! -bang -nargs=? -complete=dir Files call fzf#vim#files(, 0) +< +Let's say you want to a variation of it called `ProjectFiles` that only +searches inside `~/projects` directory. Then you can do it like this: +> + command! -bang ProjectFiles call fzf#vim#files('~/projects', 0) +< +Or, if you want to override the command with different fzf options, just pass +a custom spec to the function. +> + command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, {'options': ['--layout=reverse', '--info=inline']}, 0) +< +Want a preview window? +> + command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, {'options': ['--layout=reverse', '--info=inline', '--preview', 'cat {}']}, 0) +< +It kind of works, but you probably want a nicer previewer program than `cat`. +fzf.vim ships {a versatile preview script}{11} you can readily use. It +internally executes {bat}{4} for syntax highlighting, so make sure to install +it. +> + command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, {'options': ['--layout=reverse', '--info=inline', '--preview', '~/.vim/plugged/fzf.vim/bin/preview.sh {}']}, 0) +< +However, it's not ideal to hard-code the path to the script which can be +different in different circumstances. So in order to make it easier to set up +the previewer, fzf.vim provides `fzf#vim#with_preview` helper function. +Similarly to `fzf#wrap`, it takes a spec dictionary and returns a copy of it +with additional preview options. +> + command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, fzf#vim#with_preview({'options': ['--layout=reverse', '--info=inline']}), 0) +< +You can just omit the spec argument if you only want the previewer. +> + command! -bang -nargs=? -complete=dir Files + \ call fzf#vim#files(, fzf#vim#with_preview(), 0) +< + {11} bin/preview.sh + {4} https://github.com/sharkdp/bat + + +Example: git grep wrapper~ + *fzf-vim-example-git-grep-wrapper* + +The following example implements `GGrep` command that works similarly to +predefined `Ag` or `Rg` using `fzf#vim#grep`. + + *:LINE* + + - We set the base directory to git root by setting `dir` attribute in spec + dictionary. + - {The preview script}{11} supports `grep` format (`FILE_PATH:LINE_NO:...`), so + we can just wrap the spec with `fzf#vim#with_preview` as before to enable + previewer. +> + command! -bang -nargs=* GGrep + \ call fzf#vim#grep( + \ 'git grep --line-number -- '.fzf#shellescape(), + \ fzf#vim#with_preview({'dir': systemlist('git rev-parse --show-toplevel')[0]}), 0) +< + {11} bin/preview.sh + + +MAPPINGS *fzf-vim-mappings* +============================================================================== + + ---------------------------------+------------------------------------------ + Mapping | Description ~ + ---------------------------------+------------------------------------------ + (fzf-maps-n) | Normal mode mappings + (fzf-maps-i) | Insert mode mappings + (fzf-maps-x) | Visual mode mappings + (fzf-maps-o) | Operator-pending mappings + (fzf-complete-word) | `cat /usr/share/dict/words` + (fzf-complete-path) | Path completion using `find` (file + dir) + (fzf-complete-file) | File completion using `find` + (fzf-complete-line) | Line completion (all open buffers) + (fzf-complete-buffer-line) | Line completion (current buffer only) + ---------------------------------+------------------------------------------ +> + " Mapping selecting mappings + nmap (fzf-maps-n) + xmap (fzf-maps-x) + omap (fzf-maps-o) + + " Insert mode completion + imap (fzf-complete-word) + imap (fzf-complete-path) + imap (fzf-complete-line) +< + +COMPLETION FUNCTIONS *fzf-vim-completion-functions* +============================================================================== + + -----------------------------------------+-------------------------------------- + Function | Description ~ + -----------------------------------------+-------------------------------------- + `fzf#vim#complete#path(command, [spec])` | Path completion + `fzf#vim#complete#word([spec])` | Word completion + `fzf#vim#complete#line([spec])` | Line completion (all open buffers) + `fzf#vim#complete#buffer_line([spec])` | Line completion (current buffer only) + -----------------------------------------+-------------------------------------- +> + " Path completion with custom source command + inoremap fzf#vim#complete#path('fd') + inoremap fzf#vim#complete#path('rg --files') + + " Word completion with custom spec with popup layout option + inoremap fzf#vim#complete#word({'window': { 'width': 0.2, 'height': 0.9, 'xoffset': 1 }}) +< + +CUSTOM COMPLETION *fzf-vim-custom-completion* +============================================================================== + +`fzf#vim#complete` is a helper function for creating custom fuzzy completion +using fzf. If the first parameter is a command string or a Vim list, it will +be used as the source. +> + " Replace the default dictionary completion with fzf-based fuzzy completion + inoremap fzf#vim#complete('cat /usr/share/dict/words') +< +For advanced uses, you can pass an options dictionary to the function. The set +of options is pretty much identical to that for `fzf#run` only with the +following exceptions: + + - `reducer` (funcref) + - Reducer transforms the output lines of fzf into a single string value + - `prefix` (string or funcref; default: `\k*$`) + - Regular expression pattern to extract the completion prefix + - Or a function to extract completion prefix + - Both `source` and `options` can be given as funcrefs that take the completion + prefix as the argument and return the final value + - `sink` or `sink*` are ignored +> + " Global line completion (not just open buffers. ripgrep required.) + inoremap fzf#vim#complete(fzf#wrap({ + \ 'prefix': '^.*$', + \ 'source': 'rg -n ^ --color always', + \ 'options': '--ansi --delimiter : --nth 3..', + \ 'reducer': { lines -> join(split(lines[0], ':\zs')[2:], '') }})) +< + +< Reducer example >___________________________________________________________~ + *fzf-vim-reducer-example* +> + function! s:make_sentence(lines) + return substitute(join(a:lines), '^.', '\=toupper(submatch(0))', '').'.' + endfunction + + inoremap fzf#vim#complete({ + \ 'source': 'cat /usr/share/dict/words', + \ 'reducer': function('make_sentence'), + \ 'options': '--multi --reverse --margin 15%,0', + \ 'left': 20}) +< + +STATUS LINE OF TERMINAL BUFFER *fzf-vim-status-line-of-terminal-buffer* +============================================================================== + +When fzf starts in a terminal buffer (see {fzf/README-VIM.md}{12}), you may +want to customize the statusline of the containing buffer. + +{12} https://github.com/junegunn/fzf/blob/master/README-VIM.md#fzf-inside-terminal-buffer + + +< Hide statusline >___________________________________________________________~ + *fzf-vim-hide-statusline* +> + autocmd! FileType fzf set laststatus=0 noshowmode noruler + \| autocmd BufLeave set laststatus=2 showmode ruler +< + +< Custom statusline >_________________________________________________________~ + *fzf-vim-custom-statusline* +> + function! s:fzf_statusline() + " Override statusline as you like + highlight fzf1 ctermfg=161 ctermbg=251 + highlight fzf2 ctermfg=23 ctermbg=251 + highlight fzf3 ctermfg=237 ctermbg=251 + setlocal statusline=%#fzf1#\ >\ %#fzf2#fz%#fzf3#f + endfunction + + autocmd! User FzfStatusLine call fzf_statusline() +< + +LICENSE *fzf-vim-license* +============================================================================== + +MIT + + +============================================================================== +vim:tw=78:sw=2:ts=2:ft=help:norl:nowrap: diff --git a/.vim/bundle/vim-fzf/doc/tags b/.vim/bundle/vim-fzf/doc/tags new file mode 100644 index 0000000..46174be --- /dev/null +++ b/.vim/bundle/vim-fzf/doc/tags @@ -0,0 +1,63 @@ +:Ag fzf-vim.txt /*:Ag* +:BCommits fzf-vim.txt /*:BCommits* +:BLines fzf-vim.txt /*:BLines* +:BTags fzf-vim.txt /*:BTags* +:Buffers fzf-vim.txt /*:Buffers* +:Changes fzf-vim.txt /*:Changes* +:Colors fzf-vim.txt /*:Colors* +:Commands fzf-vim.txt /*:Commands* +:Commits fzf-vim.txt /*:Commits* +:Files fzf-vim.txt /*:Files* +:Filetypes fzf-vim.txt /*:Filetypes* +:GFiles fzf-vim.txt /*:GFiles* +:Helptags fzf-vim.txt /*:Helptags* +:History fzf-vim.txt /*:History* +:Jumps fzf-vim.txt /*:Jumps* +:LINE fzf-vim.txt /*:LINE* +:Lines fzf-vim.txt /*:Lines* +:Locate fzf-vim.txt /*:Locate* +:Maps fzf-vim.txt /*:Maps* +:Marks fzf-vim.txt /*:Marks* +:RG fzf-vim.txt /*:RG* +:Rg fzf-vim.txt /*:Rg* +:Snippets fzf-vim.txt /*:Snippets* +:Tags fzf-vim.txt /*:Tags* +:Windows fzf-vim.txt /*:Windows* +fzf-vim fzf-vim.txt /*fzf-vim* +fzf-vim-advanced-customization fzf-vim.txt /*fzf-vim-advanced-customization* +fzf-vim-command-level-options fzf-vim.txt /*fzf-vim-command-level-options* +fzf-vim-commands fzf-vim.txt /*fzf-vim-commands* +fzf-vim-completion-functions fzf-vim.txt /*fzf-vim-completion-functions* +fzf-vim-configuration-options-for-fzf-vim fzf-vim.txt /*fzf-vim-configuration-options-for-fzf-vim* +fzf-vim-configuration-options-of-the-base-plugin fzf-vim.txt /*fzf-vim-configuration-options-of-the-base-plugin* +fzf-vim-custom-completion fzf-vim.txt /*fzf-vim-custom-completion* +fzf-vim-custom-statusline fzf-vim.txt /*fzf-vim-custom-statusline* +fzf-vim-customization fzf-vim.txt /*fzf-vim-customization* +fzf-vim-dependencies fzf-vim.txt /*fzf-vim-dependencies* +fzf-vim-example-customizing-files-command fzf-vim.txt /*fzf-vim-example-customizing-files-command* +fzf-vim-example-git-grep-wrapper fzf-vim.txt /*fzf-vim-example-git-grep-wrapper* +fzf-vim-fzfheart-vim fzf-vim.txt /*fzf-vim-fzfheart-vim* +fzf-vim-hide-statusline fzf-vim.txt /*fzf-vim-hide-statusline* +fzf-vim-installation fzf-vim.txt /*fzf-vim-installation* +fzf-vim-license fzf-vim.txt /*fzf-vim-license* +fzf-vim-list-type-to-handle-multiple-selections fzf-vim.txt /*fzf-vim-list-type-to-handle-multiple-selections* +fzf-vim-mappings fzf-vim.txt /*fzf-vim-mappings* +fzf-vim-preview-window fzf-vim.txt /*fzf-vim-preview-window* +fzf-vim-rationale fzf-vim.txt /*fzf-vim-rationale* +fzf-vim-reducer-example fzf-vim.txt /*fzf-vim-reducer-example* +fzf-vim-status-line-of-terminal-buffer fzf-vim.txt /*fzf-vim-status-line-of-terminal-buffer* +fzf-vim-toc fzf-vim.txt /*fzf-vim-toc* +fzf-vim-using-vim-plug fzf-vim.txt /*fzf-vim-using-vim-plug* +fzf-vim-vim-functions fzf-vim.txt /*fzf-vim-vim-functions* +fzf-vim-why-you-should-use-fzf-on-vim fzf-vim.txt /*fzf-vim-why-you-should-use-fzf-on-vim* +g:fzf_vim fzf-vim.txt /*g:fzf_vim* +g:fzf_vim.buffers_jump fzf-vim.txt /*g:fzf_vim.buffers_jump* +g:fzf_vim.command_prefix fzf-vim.txt /*g:fzf_vim.command_prefix* +g:fzf_vim.commands_expect fzf-vim.txt /*g:fzf_vim.commands_expect* +g:fzf_vim.commits_log_options fzf-vim.txt /*g:fzf_vim.commits_log_options* +g:fzf_vim.listproc fzf-vim.txt /*g:fzf_vim.listproc* +g:fzf_vim.listproc_ag fzf-vim.txt /*g:fzf_vim.listproc_ag* +g:fzf_vim.listproc_rg fzf-vim.txt /*g:fzf_vim.listproc_rg* +g:fzf_vim.preview_bash fzf-vim.txt /*g:fzf_vim.preview_bash* +g:fzf_vim.preview_window fzf-vim.txt /*g:fzf_vim.preview_window* +g:fzf_vim.tags_command fzf-vim.txt /*g:fzf_vim.tags_command* diff --git a/.vim/bundle/vim-fzf/plugin/fzf.vim b/.vim/bundle/vim-fzf/plugin/fzf.vim new file mode 100644 index 0000000..622fb83 --- /dev/null +++ b/.vim/bundle/vim-fzf/plugin/fzf.vim @@ -0,0 +1,163 @@ +" Copyright (c) 2015 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_fzf_vim') + finish +endif +let g:loaded_fzf_vim = 1 + +let s:cpo_save = &cpo +set cpo&vim +let s:is_win = has('win32') || has('win64') + +function! s:conf(name, default) + let conf = get(g:, 'fzf_vim', {}) + let val = get(conf, a:name, get(g:, 'fzf_' . a:name, a:default)) + return val +endfunction + +function! s:defs(commands) + let prefix = s:conf('command_prefix', '') + if prefix =~# '^[^A-Z]' + echoerr 'g:fzf_command_prefix must start with an uppercase letter' + return + endif + for command in a:commands + let name = ':'.prefix.matchstr(command, '\C[A-Z]\S\+') + if 2 != exists(name) + execute substitute(command, '\ze\C[A-Z]', prefix, '') + endif + endfor +endfunction + +call s:defs([ +\'command! -bang -nargs=? -complete=dir Files call fzf#vim#files(, fzf#vim#with_preview(), 0)', +\'command! -bang -nargs=? GitFiles call fzf#vim#gitfiles(, fzf#vim#with_preview( == "?" ? { "placeholder": "" } : {}), 0)', +\'command! -bang -nargs=? GFiles call fzf#vim#gitfiles(, fzf#vim#with_preview( == "?" ? { "placeholder": "" } : {}), 0)', +\'command! -bar -bang -nargs=? -complete=buffer Buffers call fzf#vim#buffers(, fzf#vim#with_preview({ "placeholder": "{1}" }), 0)', +\'command! -bang -nargs=* Lines call fzf#vim#lines(, 0)', +\'command! -bang -nargs=* BLines call fzf#vim#buffer_lines(, 0)', +\'command! -bar -bang Colors call fzf#vim#colors(0)', +\'command! -bang -nargs=+ -complete=dir Locate call fzf#vim#locate(, fzf#vim#with_preview(), 0)', +\'command! -bang -nargs=* Ag call fzf#vim#ag(, fzf#vim#with_preview(), 0)', +\'command! -bang -nargs=* Rg call fzf#vim#grep("rg --column --line-number --no-heading --color=always --smart-case -- ".fzf#shellescape(), fzf#vim#with_preview(), 0)', +\'command! -bang -nargs=* RG call fzf#vim#grep2("rg --column --line-number --no-heading --color=always --smart-case -- ", , fzf#vim#with_preview(), 0)', +\'command! -bang -nargs=* Tags call fzf#vim#tags(, fzf#vim#with_preview({ "placeholder": "--tag {2}:{-1}:{3..}" }), 0)', +\'command! -bang -nargs=* BTags call fzf#vim#buffer_tags(, fzf#vim#with_preview({ "placeholder": "{2}:{3..}" }), 0)', +\'command! -bar -bang Snippets call fzf#vim#snippets(0)', +\'command! -bar -bang Commands call fzf#vim#commands(0)', +\'command! -bar -bang Jumps call fzf#vim#jumps(0)', +\'command! -bar -bang Marks call fzf#vim#marks(0)', +\'command! -bar -bang Changes call fzf#vim#changes(0)', +\'command! -bar -bang Helptags call fzf#vim#helptags(fzf#vim#with_preview({ "placeholder": "--tag {2}:{3}:{4}" }), 0)', +\'command! -bar -bang Windows call fzf#vim#windows(fzf#vim#with_preview({ "placeholder": "{2}" }), 0)', +\'command! -bar -bang -nargs=* -range=% -complete=file Commits let b:fzf_winview = winsaveview() | ,call fzf#vim#commits(, fzf#vim#with_preview({ "placeholder": "" }), 0)', +\'command! -bar -bang -nargs=* -range=% BCommits let b:fzf_winview = winsaveview() | ,call fzf#vim#buffer_commits(, fzf#vim#with_preview({ "placeholder": "" }), 0)', +\'command! -bar -bang Maps call fzf#vim#maps("n", 0)', +\'command! -bar -bang Filetypes call fzf#vim#filetypes(0)', +\'command! -bang -nargs=* History call s:history(, fzf#vim#with_preview(), 0)']) + +function! s:history(arg, extra, bang) + let bang = a:bang || a:arg[len(a:arg)-1] == '!' + if a:arg[0] == ':' + call fzf#vim#command_history(bang) + elseif a:arg[0] == '/' + call fzf#vim#search_history(bang) + else + call fzf#vim#history(a:extra, bang) + endif +endfunction + +function! fzf#complete(...) + return call('fzf#vim#complete', a:000) +endfunction + +if (has('nvim') || has('terminal') && has('patch-8.0.995')) && (s:conf('statusline', 1) || s:conf('nvim_statusline', 1)) + function! s:fzf_restore_colors() + if exists('#User#FzfStatusLine') + doautocmd User FzfStatusLine + else + if $TERM !~ "256color" + highlight default fzf1 ctermfg=1 ctermbg=8 guifg=#E12672 guibg=#565656 + highlight default fzf2 ctermfg=2 ctermbg=8 guifg=#BCDDBD guibg=#565656 + highlight default fzf3 ctermfg=7 ctermbg=8 guifg=#D9D9D9 guibg=#565656 + else + highlight default fzf1 ctermfg=161 ctermbg=238 guifg=#E12672 guibg=#565656 + highlight default fzf2 ctermfg=151 ctermbg=238 guifg=#BCDDBD guibg=#565656 + highlight default fzf3 ctermfg=252 ctermbg=238 guifg=#D9D9D9 guibg=#565656 + endif + setlocal statusline=%#fzf1#\ >\ %#fzf2#fz%#fzf3#f + endif + endfunction + + function! s:fzf_vim_term() + if get(w:, 'airline_active', 0) + let w:airline_disabled = 1 + autocmd BufWinLeave let w:airline_disabled = 0 + endif + autocmd WinEnter,ColorScheme call s:fzf_restore_colors() + + setlocal nospell + call s:fzf_restore_colors() + endfunction + + augroup _fzf_statusline + autocmd! + autocmd FileType fzf call s:fzf_vim_term() + augroup END +endif + +if !exists('g:fzf#vim#buffers') + let g:fzf#vim#buffers = {} +endif + +augroup fzf_buffers + autocmd! + if exists('*reltimefloat') + autocmd BufWinEnter,WinEnter * let g:fzf#vim#buffers[bufnr('')] = reltimefloat(reltime()) + else + autocmd BufWinEnter,WinEnter * let g:fzf#vim#buffers[bufnr('')] = localtime() + endif + autocmd BufDelete * silent! call remove(g:fzf#vim#buffers, expand('')) +augroup END + +inoremap (fzf-complete-word) fzf#vim#complete#word() +if s:is_win + inoremap (fzf-complete-path) fzf#vim#complete#path('dir /s/b') + inoremap (fzf-complete-file) fzf#vim#complete#path('dir /s/b/a:-d') +else + inoremap (fzf-complete-path) fzf#vim#complete#path("find . -path '*/\.*' -prune -o -print \| sed '1d;s:^..::'") + inoremap (fzf-complete-file) fzf#vim#complete#path("find . -path '*/\.*' -prune -o -type f -print -o -type l -print \| sed 's:^..::'") +endif +inoremap (fzf-complete-file-ag) fzf#vim#complete#path('ag -l -g ""') +inoremap (fzf-complete-line) fzf#vim#complete#line() +inoremap (fzf-complete-buffer-line) fzf#vim#complete#buffer_line() + +nnoremap (fzf-maps-n) :call fzf#vim#maps('n', 0) +inoremap (fzf-maps-i) :call fzf#vim#maps('i', 0) +xnoremap (fzf-maps-x) :call fzf#vim#maps('x', 0) +onoremap (fzf-maps-o) :call fzf#vim#maps('o', 0) + +let &cpo = s:cpo_save +unlet s:cpo_save + diff --git a/.vim/bundle/vim-lucius/README.md b/.vim/bundle/vim-lucius/README.md new file mode 100644 index 0000000..2e04875 --- /dev/null +++ b/.vim/bundle/vim-lucius/README.md @@ -0,0 +1,43 @@ +vim-lucius +========== + +This repository has the Lucius color scheme for Vim. It is already organized +under a "colors" directory, so you can clone the repo into your own vimfiles +(or under bundle, if you use Pathogen). + +The color scheme is available for other applications, as well. They can be +found here: + +https://github.com/jonathanfilip/lucius + +Some sample screenshots of the different configurations: + +### Dark +![LuciusDark](http://i.imgur.com/LsZbF.png "LuciusDark (default)") + +### Dark High Contrast +![LuciusDarkHighContrast](http://i.imgur.com/e70i9.png "LuciusDarkHighContrast") + +### Dark Low Contrast +![LuciusDarkLowContrast](http://i.imgur.com/Hmw8s.png "LuciusDarkLowContrast") + +### Black +![LuciusBlack](http://i.imgur.com/iD4ri.png "LuciusBlack") + +### Black High Contrast +![LuciusBlackHighContrast](http://i.imgur.com/lHvTJ.png "LuciusBlackHighContrast") + +### Black Low Contrast +![LuciusBlackLowContrast](http://i.imgur.com/oZLkg.png "LuciusBlackLowContrast") + +### Light +![LuciusLight](http://i.imgur.com/soYD8.png "LuciusLight (light default)") + +### Light Low Contrast +![LuciusLightLowContrast](http://i.imgur.com/95I86.png "LuciusLightLowContrast") + +### White +![LuciusWhite](http://i.imgur.com/wDzkz.png "LuciusWhite") + +### White Low Contrast +![LuciusWhiteLowContrast](http://i.imgur.com/jlUf4.png "LuciusWhiteLowContrast") diff --git a/.vim/bundle/vim-lucius/colors/lucius.vim b/.vim/bundle/vim-lucius/colors/lucius.vim new file mode 100644 index 0000000..350d7db --- /dev/null +++ b/.vim/bundle/vim-lucius/colors/lucius.vim @@ -0,0 +1,805 @@ +" ============================================================================ +" Name: Lucius vim color scheme +" Author: Jonathan Filip +" Version: 8.1.7 +" ---------------------------------------------------------------------------- +" +" Light and dark color scheme for GUI and 256 color terminal. +" +" There are several options available to customize the color scheme to your +" own tastes. This is particularly useful when you have to work in different +" environments at different times (home, work, day, night, etc). +" +" The GUI and 256 color terminal versions of this color scheme are identical. +" +" You can set up the color scheme by manually setting the options you want or +" by choosing one of the presets defined. These presets are loaded after you +" first source the color scheme file and are all commands that start with +" 'Lucius'. +" +" I have also started to create color schemes for different applications. I +" have been using them for PuTTY, iTerm2, and Visual Studio, but will keep +" adding more as I go along. You can find the files for these on Github: +" +" https://github.com/jonathanfilip/lucius +" +" You can also clone the following repository if you use Pathogen or something +" similar. It holds the vim color scheme in a 'colors' directory: +" +" https://github.com/jonathanfilip/vim-lucius +" +" +" +" Presets: +" +" There are several presets available that will set all the options for you. +" There are screenshots of each preset below: +" +" * LuciusDark (dark default): http://i.imgur.com/LsZbF.png +" * LuciusDarkHighContrast: http://i.imgur.com/e70i9.png +" * LuciusDarkLowContrast: http://i.imgur.com/Hmw8s.png +" * LuciusBlack: http://i.imgur.com/iD4ri.png +" * LuciusBlackHighContrast: http://i.imgur.com/lHvTJ.png +" * LuciusBlackLowContrast: http://i.imgur.com/oZLkg.png +" +" * LuciusLight (light default): http://i.imgur.com/soYD8.png +" * LuciusLightLowContrast: http://i.imgur.com/95I86.png +" * LuciusWhite: http://i.imgur.com/wDzkz.png +" * LuciusWhiteLowContrast: http://i.imgur.com/jlUf4.png +" +" To use the presets, you just need to set the color scheme first. In your +" vimrc, you can just do this: +" +" colorscheme lucius +" LuciusBlack +" +" You can still just set the background variable and then set the color +" scheme. This will default to LuciusDark for 'dark' and LuciusLight for +" 'light'. +" +" +" Options: +" +" The presets available cover most of the options. You can, however, customize +" things by setting the following variables yourself: +" +" g:lucius_style (default: 'dark') +" +" Set this option to either 'light' or 'dark' for your desired color scheme. +" It has the same effect as setting the background. +" +" g:lucius_contrast (default: 'normal') +" +" This option determines the contrast to use for text/ui elements. It can be +" set to 'low', 'normal', or 'high'. At this time there is no 'high' for the +" light scheme. +" +" g:lucius_contrast_bg (default: 'normal') +" +" Setting this option makes the background a higher contrast. Current settings +" are 'normal' and 'high'. +" +" g:lucius_use_bold (default: 1) +" +" Setting this will cause the color scheme to use bold fonts for some items. +" +" g:lucius_use_underline (default: 1) +" +" Setting this will cause the color scheme to use underlined fonts for some +" items. +" +" g:lucius_no_term_bg (default: 0) +" +" Setting this will cause the color scheme to not set a background color in +" the terminal (useful for transparency or terminals with different background +" colors). +" +" License: +" +" Copyright (c) 2015 Jonathan Filip +" +" 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. +" +" ============================================================================ + + + +" ============================================================================ +" Options: +" ============================================================================ + +unlet! g:colors_name +hi clear +if exists("syntax_on") + syntax reset +endif + +if exists("g:lucius_style") + let s:style = g:lucius_style +else + let s:style = &background +endif + +if exists("g:lucius_contrast") + let s:contrast = g:lucius_contrast +else + let s:contrast = "normal" +endif + +if exists("g:lucius_contrast_bg") + let s:contrast_bg = g:lucius_contrast_bg +else + let s:contrast_bg = "normal" +endif + +if exists("g:lucius_use_bold") + let s:use_bold = g:lucius_use_bold +else + let s:use_bold = 1 +endif + +if exists("g:lucius_use_underline") + let s:use_underline = g:lucius_use_underline +else + let s:use_underline = 1 +endif + +if exists("g:lucius_no_term_bg") + let s:no_term_bg = g:lucius_no_term_bg +else + let s:no_term_bg = 0 +endif + + +" ============================================================================ +" Color Map: +" ============================================================================ + +let s:color_map = { + \ 'bg': 'bg', 'fg': 'fg', 'NONE': 'NONE', + \ '#000000': '16', '#00005f': '17', '#000087': '18', '#0000af': '19', + \ '#0000d7': '20', '#0000ff': '21', '#005f00': '22', '#005f5f': '23', + \ '#005f87': '24', '#005faf': '25', '#005fd7': '26', '#005fff': '27', + \ '#008700': '28', '#00875f': '29', '#008787': '30', '#0087af': '31', + \ '#0087d7': '32', '#0087ff': '33', '#00af00': '34', '#00af5f': '35', + \ '#00af87': '36', '#00afaf': '37', '#00afd7': '38', '#00afff': '39', + \ '#00d700': '40', '#00d75f': '41', '#00d787': '42', '#00d7af': '43', + \ '#00d7d7': '44', '#00d7ff': '45', '#00ff00': '46', '#00ff5f': '47', + \ '#00ff87': '48', '#00ffaf': '49', '#00ffd7': '50', '#00ffff': '51', + \ '#5f0000': '52', '#5f005f': '53', '#5f0087': '54', '#5f00af': '55', + \ '#5f00d7': '56', '#5f00ff': '57', '#5f5f00': '58', '#5f5f5f': '59', + \ '#5f5f87': '60', '#5f5faf': '61', '#5f5fd7': '62', '#5f5fff': '63', + \ '#5f8700': '64', '#5f875f': '65', '#5f8787': '66', '#5f87af': '67', + \ '#5f87d7': '68', '#5f87ff': '69', '#5faf00': '70', '#5faf5f': '71', + \ '#5faf87': '72', '#5fafaf': '73', '#5fafd7': '74', '#5fafff': '75', + \ '#5fd700': '76', '#5fd75f': '77', '#5fd787': '78', '#5fd7af': '79', + \ '#5fd7d7': '80', '#5fd7ff': '81', '#5fff00': '82', '#5fff5f': '83', + \ '#5fff87': '84', '#5fffaf': '85', '#5fffd7': '86', '#5fffff': '87', + \ '#870000': '88', '#87005f': '89', '#870087': '90', '#8700af': '91', + \ '#8700d7': '92', '#8700ff': '93', '#875f00': '94', '#875f5f': '95', + \ '#875f87': '96', '#875faf': '97', '#875fd7': '98', '#875fff': '99', + \ '#878700': '100', '#87875f': '101', '#878787': '102', '#8787af': '103', + \ '#8787d7': '104', '#8787ff': '105', '#87af00': '106', '#87af5f': '107', + \ '#87af87': '108', '#87afaf': '109', '#87afd7': '110', '#87afff': '111', + \ '#87d700': '112', '#87d75f': '113', '#87d787': '114', '#87d7af': '115', + \ '#87d7d7': '116', '#87d7ff': '117', '#87ff00': '118', '#87ff5f': '119', + \ '#87ff87': '120', '#87ffaf': '121', '#87ffd7': '122', '#87ffff': '123', + \ '#af0000': '124', '#af005f': '125', '#af0087': '126', '#af00af': '127', + \ '#af00d7': '128', '#af00ff': '129', '#af5f00': '130', '#af5f5f': '131', + \ '#af5f87': '132', '#af5faf': '133', '#af5fd7': '134', '#af5fff': '135', + \ '#af8700': '136', '#af875f': '137', '#af8787': '138', '#af87af': '139', + \ '#af87d7': '140', '#af87ff': '141', '#afaf00': '142', '#afaf5f': '143', + \ '#afaf87': '144', '#afafaf': '145', '#afafd7': '146', '#afafff': '147', + \ '#afd700': '148', '#afd75f': '149', '#afd787': '150', '#afd7af': '151', + \ '#afd7d7': '152', '#afd7ff': '153', '#afff00': '154', '#afff5f': '155', + \ '#afff87': '156', '#afffaf': '157', '#afffd7': '158', '#afffff': '159', + \ '#d70000': '160', '#d7005f': '161', '#d70087': '162', '#d700af': '163', + \ '#d700d7': '164', '#d700ff': '165', '#d75f00': '166', '#d75f5f': '167', + \ '#d75f87': '168', '#d75faf': '169', '#d75fd7': '170', '#d75fff': '171', + \ '#d78700': '172', '#d7875f': '173', '#d78787': '174', '#d787af': '175', + \ '#d787d7': '176', '#d787ff': '177', '#d7af00': '178', '#d7af5f': '179', + \ '#d7af87': '180', '#d7afaf': '181', '#d7afd7': '182', '#d7afff': '183', + \ '#d7d700': '184', '#d7d75f': '185', '#d7d787': '186', '#d7d7af': '187', + \ '#d7d7d7': '188', '#d7d7ff': '189', '#d7ff00': '190', '#d7ff5f': '191', + \ '#d7ff87': '192', '#d7ffaf': '193', '#d7ffd7': '194', '#d7ffff': '195', + \ '#ff0000': '196', '#ff005f': '197', '#ff0087': '198', '#ff00af': '199', + \ '#ff00d7': '200', '#ff00ff': '201', '#ff5f00': '202', '#ff5f5f': '203', + \ '#ff5f87': '204', '#ff5faf': '205', '#ff5fd7': '206', '#ff5fff': '207', + \ '#ff8700': '208', '#ff875f': '209', '#ff8787': '210', '#ff87af': '211', + \ '#ff87d7': '212', '#ff87ff': '213', '#ffaf00': '214', '#ffaf5f': '215', + \ '#ffaf87': '216', '#ffafaf': '217', '#ffafd7': '218', '#ffafff': '219', + \ '#ffd700': '220', '#ffd75f': '221', '#ffd787': '222', '#ffd7af': '223', + \ '#ffd7d7': '224', '#ffd7ff': '225', '#ffff00': '226', '#ffff5f': '227', + \ '#ffff87': '228', '#ffffaf': '229', '#ffffd7': '230', '#ffffff': '231', + \ '#080808': '232', '#121212': '233', '#1c1c1c': '234', '#262626': '235', + \ '#303030': '236', '#3a3a3a': '237', '#444444': '238', '#4e4e4e': '239', + \ '#585858': '240', '#626262': '241', '#6c6c6c': '242', '#767676': '243', + \ '#808080': '244', '#8a8a8a': '245', '#949494': '246', '#9e9e9e': '247', + \ '#a8a8a8': '248', '#b2b2b2': '249', '#bcbcbc': '250', '#c6c6c6': '251', + \ '#d0d0d0': '252', '#dadada': '253', '#e4e4e4': '254', '#eeeeee': '255', + \ } + + +" ============================================================================ +" Functions: +" ============================================================================ + +function! s:AddCterm(name) + exec "let l:gfg = synIDattr(synIDtrans(hlID('" . a:name . + \ "')), 'fg', 'gui')" + exec "let l:gbg = synIDattr(synIDtrans(hlID('" . a:name . + \ "')), 'bg', 'gui')" + let l:gfg = l:gfg == "" ? "NONE" : l:gfg + let l:gbg = l:gbg == "" ? "NONE" : l:gbg + exec "hi " . a:name . " ctermfg=" . s:color_map[l:gfg] . + \ " ctermbg=" . s:color_map[l:gbg] +endfunction + +function! s:AddSpCterm(name) + exec "let l:gsp = synIDattr(synIDtrans(hlID('" . a:name . + \ "')), 'sp', 'gui')" + let l:gsp = l:gsp == "" ? "NONE" : l:gsp + exec "hi " . a:name . " ctermfg=" . s:color_map[l:gsp] +endfunction + + +" ============================================================================ +" Text Groups: +" ============================================================================ + +let s:normal_items = [ + \ "ColorColumn", "Comment", "Conceal", "Constant", "Cursor", "CursorColumn", + \ "CursorIM", "CursorLine", "CursorLineNr", "DiffAdd", "DiffChange", + \ "DiffDelete", "Directory", "Error", "ErrorMsg", "Identifier", + \ "IncSearch", "LineNr", "MatchParen", "ModeMsg", "MoreMsg", + \ "NonText", "Pmenu", "PmenuSbar", "PmenuSel", + \ "PmenuThumb", "PreProc", "Question", "Search", "SignColumn", + \ "Special", "SpecialKey", "Statement", "StatusLineNC", "TabLine", + \ "TabLineFill", "Todo", "Type", "VertSplit", "Visual", + \ "WarningMsg", "WildMenu", + \ ] + +let s:bold_items = [ + \ "DiffText", "FoldColumn", "Folded", "StatusLine", "TabLineSel", + \ "Title", "CursorLineNr", + \ ] + +let s:underline_items = [ + \ "Underlined", "VisualNOS" + \ ] + +let s:undercurl_items = [ + \ "SpellBad", "SpellCap", "SpellLocal", "SpellRare" + \ ] + + +" ============================================================================ +" Color Definitions: +" ============================================================================ + +" ---------------------------------------------------------------------------- +" 'Normal' Colors: +" ---------------------------------------------------------------------------- + +hi clear Normal +hi Normal gui=none cterm=none term=none + +if s:style == "light" + if s:contrast == "high" + hi Normal guifg=#000000 + elseif s:contrast == "low" + hi Normal guifg=#626262 + else + hi Normal guifg=#444444 + endif +else + if s:contrast == "high" + hi Normal guifg=#eeeeee + elseif s:contrast == "low" + hi Normal guifg=#bcbcbc + else + hi Normal guifg=#d7d7d7 + endif +endif + +if s:style == "light" + if s:contrast_bg == "high" + hi Normal guibg=#ffffff + else + hi Normal guibg=#eeeeee + endif +else + if s:contrast_bg == "high" + hi Normal guibg=#121212 + else + hi Normal guibg=#303030 + endif +endif + +call s:AddCterm("Normal") + + +" ---------------------------------------------------------------------------- +" Extra setup +" ---------------------------------------------------------------------------- + +exec "set background=" . s:style + +" Clear default settings +for s:item in s:normal_items + s:bold_items + s:underline_items + s:undercurl_items + exec "hi " . s:item . " guifg=NONE guibg=NONE gui=none" + \ . " ctermfg=NONE ctermbg=NONE cterm=none term=none" +endfor + +let g:colors_name="lucius" + + +" ---------------------------------------------------------------------------- +" Text Markup: +" ---------------------------------------------------------------------------- + +if s:style == "light" + hi NonText guifg=#afafd7 + hi SpecialKey guifg=#afd7af + if s:contrast == "low" + hi Comment guifg=#9e9e9e + hi Conceal guifg=#9e9e9e + hi Constant guifg=#d78700 + hi Directory guifg=#00af87 + hi Identifier guifg=#00af00 + hi PreProc guifg=#00afaf + hi Special guifg=#af00af + hi Statement guifg=#0087d7 + hi Title guifg=#0087d7 + hi Type guifg=#0087af + else + hi Comment guifg=#808080 + hi Conceal guifg=#808080 + hi Constant guifg=#af5f00 + hi Directory guifg=#00875f + hi Identifier guifg=#008700 + hi PreProc guifg=#008787 + hi Special guifg=#870087 + hi Statement guifg=#005faf + hi Title guifg=#005faf + hi Type guifg=#005f87 + endif +else + hi NonText guifg=#5f5f87 + hi SpecialKey guifg=#5f875f + if s:contrast == "low" + hi Comment guifg=#6c6c6c + hi Conceal guifg=#6c6c6c + hi Constant guifg=#afaf87 + hi Directory guifg=#87af87 + hi Identifier guifg=#87af5f + hi PreProc guifg=#5faf87 + hi Special guifg=#af87af + hi Statement guifg=#5fafd7 + hi Title guifg=#00afd7 + hi Type guifg=#5fafaf + elseif s:contrast == "high" + hi Comment guifg=#8a8a8a + hi Conceal guifg=#8a8a8a + hi Constant guifg=#ffffd7 + hi Directory guifg=#d7ffd7 + hi Identifier guifg=#d7ffaf + hi PreProc guifg=#afffd7 + hi Special guifg=#ffd7ff + hi Statement guifg=#afffff + hi Title guifg=#87d7ff + hi Type guifg=#afffff + else + hi Comment guifg=#808080 + hi Conceal guifg=#808080 + hi Constant guifg=#d7d7af + hi Directory guifg=#afd7af + hi Identifier guifg=#afd787 + hi PreProc guifg=#87d7af + hi Special guifg=#d7afd7 + hi Statement guifg=#87d7ff + hi Title guifg=#5fafd7 + hi Type guifg=#87d7d7 + endif +endif + + +" ---------------------------------------------------------------------------- +" Highlighting: +" ---------------------------------------------------------------------------- + +hi Cursor guifg=bg +hi CursorColumn guifg=NONE +hi CursorIM guifg=bg +hi CursorLine guifg=NONE +hi Visual guifg=NONE +hi VisualNOS guifg=fg guibg=NONE +if s:style == "light" + hi CursorColumn guibg=#dadada + hi CursorLine guibg=#dadada + hi IncSearch guifg=fg guibg=#5fd7d7 + hi MatchParen guifg=NONE guibg=#5fd7d7 + hi Search guifg=fg guibg=#ffaf00 + hi Visual guibg=#afd7ff + if s:contrast == "low" + hi Cursor guibg=#87afd7 + hi CursorIM guibg=#87afd7 + hi Error guifg=#d70000 guibg=#ffd7d7 + hi Todo guifg=#af8700 guibg=#ffffaf + else + hi Cursor guibg=#5f87af + hi CursorIM guibg=#5f87af + hi Error guifg=#af0000 guibg=#d7afaf + hi Todo guifg=#875f00 guibg=#ffffaf + endif +else + hi CursorColumn guibg=#444444 + hi CursorLine guibg=#444444 + hi IncSearch guifg=bg + hi MatchParen guifg=fg guibg=#87af00 + hi Search guifg=bg + hi Visual guibg=#005f87 + if s:contrast == "low" + hi Cursor guibg=#5f87af + hi CursorIM guibg=#5f87af + hi Error guifg=#d75f5f guibg=#870000 + hi IncSearch guibg=#00afaf + hi Search guibg=#d78700 + hi Todo guifg=#afaf00 guibg=#5f5f00 + elseif s:contrast == "high" + hi Cursor guibg=#afd7ff + hi CursorIM guibg=#afd7ff + hi Error guifg=#ffafaf guibg=#af0000 + hi IncSearch guibg=#87ffff + hi Search guibg=#ffaf5f + hi Todo guifg=#ffff87 guibg=#87875f + else + hi Cursor guibg=#87afd7 + hi CursorIM guibg=#87afd7 + hi Error guifg=#ff8787 guibg=#870000 + hi IncSearch guibg=#5fd7d7 + hi Search guibg=#d78700 + hi Todo guifg=#d7d75f guibg=#5f5f00 + endif +endif + + +" ---------------------------------------------------------------------------- +" Messages: +" ---------------------------------------------------------------------------- + +hi Question guifg=fg +if s:style == "light" + if s:contrast == "low" + hi ErrorMsg guifg=#d70000 + hi ModeMsg guifg=#0087ff + hi MoreMsg guifg=#0087ff + hi WarningMsg guifg=#d78700 + else + hi ErrorMsg guifg=#af0000 + hi ModeMsg guifg=#005faf + hi MoreMsg guifg=#005faf + hi WarningMsg guifg=#af5f00 + endif +else + if s:contrast == "low" + hi ErrorMsg guifg=#d75f5f + hi ModeMsg guifg=#87afaf + hi MoreMsg guifg=#87afaf + hi WarningMsg guifg=#af875f + elseif s:contrast == "high" + hi ErrorMsg guifg=#ff8787 + hi ModeMsg guifg=#afffff + hi MoreMsg guifg=#afffff + hi WarningMsg guifg=#ffaf87 + else + hi ErrorMsg guifg=#ff5f5f + hi ModeMsg guifg=#afd7d7 + hi MoreMsg guifg=#afd7d7 + hi WarningMsg guifg=#d7875f + endif +endif + + +" ---------------------------------------------------------------------------- +" UI: +" ---------------------------------------------------------------------------- + +hi ColorColumn guifg=NONE +hi Pmenu guifg=bg +hi PmenuSel guifg=fg +hi PmenuThumb guifg=fg +hi StatusLine guifg=bg +hi TabLine guifg=bg +hi TabLineSel guifg=fg +hi WildMenu guifg=fg +if s:style == "light" + hi ColorColumn guibg=#e4e4e4 + hi CursorLineNr guifg=#626262 guibg=#dadada + hi FoldColumn guibg=#bcbcbc + hi Folded guibg=#bcbcbc + hi LineNr guifg=#9e9e9e guibg=#dadada + hi PmenuSel guibg=#afd7ff + hi SignColumn guibg=#d0d0d0 + hi StatusLineNC guifg=#dadada + hi TabLineFill guifg=#dadada + hi VertSplit guifg=#e4e4e4 + hi WildMenu guibg=#afd7ff + if s:contrast == "low" + hi FoldColumn guifg=#808080 + hi Folded guifg=#808080 + hi Pmenu guibg=#9e9e9e + hi PmenuSbar guifg=#9e9e9e guibg=#626262 + hi PmenuThumb guibg=#9e9e9e + hi SignColumn guifg=#808080 + hi StatusLine guibg=#9e9e9e + hi StatusLineNC guibg=#9e9e9e + hi TabLine guibg=#9e9e9e + hi TabLineFill guibg=#9e9e9e + hi TabLineSel guibg=#afd7ff + hi VertSplit guibg=#9e9e9e + else + hi FoldColumn guifg=#626262 + hi Folded guifg=#626262 + hi Pmenu guibg=#808080 + hi PmenuSbar guifg=#808080 guibg=#444444 + hi PmenuThumb guibg=#9e9e9e + hi SignColumn guifg=#626262 + hi StatusLine guibg=#808080 + hi StatusLineNC guibg=#808080 + hi TabLine guibg=#808080 + hi TabLineFill guibg=#808080 + hi TabLineSel guibg=#afd7ff + hi VertSplit guibg=#808080 + endif +else + hi ColorColumn guibg=#3a3a3a + hi CursorLineNr guifg=#9e9e9e guibg=#444444 + hi FoldColumn guibg=#4e4e4e + hi Folded guibg=#4e4e4e + hi LineNr guifg=#626262 guibg=#444444 + hi PmenuSel guibg=#005f87 + hi SignColumn guibg=#4e4e4e + hi StatusLineNC guifg=#4e4e4e + hi TabLineFill guifg=#4e4e4e + hi VertSplit guifg=#626262 + hi WildMenu guibg=#005f87 + if s:contrast == "low" + hi FoldColumn guifg=#a8a8a8 + hi Folded guifg=#a8a8a8 + hi Pmenu guibg=#8a8a8a + hi PmenuSbar guifg=#8a8a8a guibg=#bcbcbc + hi PmenuThumb guibg=#585858 + hi SignColumn guifg=#8a8a8a + hi StatusLine guibg=#8a8a8a + hi StatusLineNC guibg=#8a8a8a + hi TabLine guibg=#8a8a8a + hi TabLineFill guibg=#8a8a8a + hi TabLineSel guibg=#005f87 + hi VertSplit guibg=#8a8a8a + elseif s:contrast == "high" + hi FoldColumn guifg=#c6c6c6 + hi Folded guifg=#c6c6c6 + hi Pmenu guibg=#bcbcbc + hi PmenuSbar guifg=#bcbcbc guibg=#dadada + hi PmenuThumb guibg=#8a8a8a + hi SignColumn guifg=#bcbcbc + hi StatusLine guibg=#bcbcbc + hi StatusLineNC guibg=#bcbcbc + hi TabLine guibg=#bcbcbc + hi TabLineFill guibg=#bcbcbc + hi TabLineSel guibg=#0087af + hi VertSplit guibg=#bcbcbc + else + hi FoldColumn guifg=#bcbcbc + hi Folded guifg=#bcbcbc + hi Pmenu guibg=#b2b2b2 + hi PmenuSbar guifg=#b2b2b2 guibg=#d0d0d0 + hi PmenuThumb guibg=#808080 + hi SignColumn guifg=#b2b2b2 + hi StatusLine guibg=#b2b2b2 + hi StatusLineNC guibg=#b2b2b2 + hi TabLine guibg=#b2b2b2 + hi TabLineFill guibg=#b2b2b2 + hi TabLineSel guibg=#005f87 + hi VertSplit guibg=#b2b2b2 + endif +endif + + +" ---------------------------------------------------------------------------- +" Diff: +" ---------------------------------------------------------------------------- + +hi DiffAdd guifg=fg +hi DiffChange guifg=fg +hi DiffDelete guifg=fg + +if s:style == "light" + hi DiffAdd guibg=#afd7af + hi DiffChange guibg=#d7d7af + hi DiffDelete guibg=#d7afaf + hi DiffText guibg=#d7d7af + if s:contrast == "low" + hi DiffText guifg=#ff8700 + else + hi DiffText guifg=#d75f00 + endif +else + hi DiffAdd guibg=#5f875f + hi DiffChange guibg=#87875f + hi DiffDelete guibg=#875f5f + hi DiffText guibg=#87875f + if s:contrast == "low" + hi DiffText guifg=#d7d75f + else + hi DiffText guifg=#ffff87 + endif +endif + + +" ---------------------------------------------------------------------------- +" Spelling: +" ---------------------------------------------------------------------------- + +if s:style == "light" + hi SpellBad guisp=#d70000 + hi SpellCap guisp=#00afd7 + hi SpellLocal guisp=#d7af00 + hi SpellRare guisp=#5faf00 +else + hi SpellBad guisp=#ff5f5f + hi SpellCap guisp=#5fafd7 + hi SpellLocal guisp=#d7af5f + hi SpellRare guisp=#5faf5f +endif + + +" ---------------------------------------------------------------------------- +" Miscellaneous: +" ---------------------------------------------------------------------------- + +hi Ignore guifg=bg +hi Underlined guifg=fg + + +" ============================================================================ +" Text Emphasis: +" ============================================================================ + +if s:use_bold == 1 + for s:item in s:bold_items + exec "hi " . s:item . " gui=bold cterm=bold term=none" + endfor +endif + +if s:use_underline == 1 + for s:item in s:underline_items + exec "hi " . s:item . " gui=underline cterm=underline term=none" + endfor + for s:item in s:undercurl_items + exec "hi " . s:item . " cterm=underline" + endfor +endif + +for s:item in s:undercurl_items + exec "hi " . s:item . " gui=undercurl term=none" +endfor + + +" ============================================================================ +" Cterm Colors: +" ============================================================================ + +for s:item in s:normal_items + s:bold_items + s:underline_items + call s:AddCterm(s:item) +endfor + +for s:item in s:undercurl_items + call s:AddSpCterm(s:item) +endfor + +if s:no_term_bg == 1 + hi Normal ctermbg=NONE +endif + + +" ============================================================================ +" Alternative Bold Definitions: +" ============================================================================ + +let s:alternative_bold_items = ["Identifier", "PreProc", "Statement", + \ "Special", "Constant", "Type"] + +for s:item in s:alternative_bold_items + exec "let s:temp_gui_fg = synIDattr(synIDtrans(hlID('" . s:item . + \ "')), 'fg', 'gui')" + exec "let s:temp_cterm_fg = synIDattr(synIDtrans(hlID('" . s:item . + \ "')), 'fg', 'cterm')" + exec "hi B" . s:item . " guifg=" . s:temp_gui_fg . " ctermfg=" . + \ s:temp_cterm_fg . " gui=bold cterm=bold term=none" +endfor + + +" ============================================================================ +" Plugin Specific Colors: +" ============================================================================ + +" Tagbar: +hi link TagbarAccessPublic Constant +hi link TagbarAccessProtected Type +hi link TagbarAccessPrivate PreProc + +" Vimwiki: +hi link VimwikiHeader1 BIdentifier +hi link VimwikiHeader2 BPreProc +hi link VimwikiHeader3 BStatement +hi link VimwikiHeader4 BSpecial +hi link VimwikiHeader5 BConstant +hi link VimwikiHeader6 BType + +" CoC: +hi link CocErrorSign ErrorMsg +hi link CocErrorFloat Pmenu +hi link CocWarningSign WarningMsg +hi link CocWarningFloat Pmenu +hi link CocInfoSign MoreMsg +hi link CocInfoFloat Pmenu +hi link CocHintFloat Directory +hi link CocHintFloat Pmenu + +" ============================================================================ +" Preset Commands: +" ============================================================================ + +function! SetLucius(style, contrast, contrast_bg) + let g:lucius_style = a:style + let g:lucius_contrast = a:contrast + let g:lucius_contrast_bg = a:contrast_bg +endfunction + +command! LuciusLight call SetLucius("light", "normal", "normal") + \ | colorscheme lucius +command! LuciusLightLowContrast call SetLucius("light", "low", "normal") + \ | colorscheme lucius +command! LuciusLightHighContrast call SetLucius("light", "high", "normal") + \ | colorscheme lucius + +command! LuciusWhite call SetLucius("light", "normal", "high") + \ | colorscheme lucius +command! LuciusWhiteLowContrast call SetLucius("light", "low", "high") + \ | colorscheme lucius +command! LuciusWhiteHighContrast call SetLucius("light", "high", "high") + \ | colorscheme lucius + +command! LuciusDark call SetLucius("dark", "normal", "normal") + \ | colorscheme lucius +command! LuciusDarkLowContrast call SetLucius("dark", "low", "normal") + \ | colorscheme lucius +command! LuciusDarkHighContrast call SetLucius("dark", "high", "normal") + \ | colorscheme lucius + +command! LuciusBlack call SetLucius("dark", "normal", "high") + \ | colorscheme lucius +command! LuciusBlackLowContrast call SetLucius("dark", "low", "high") + \ | colorscheme lucius +command! LuciusBlackHighContrast call SetLucius("dark", "high", "high") + \ | colorscheme lucius + +" vim: tw=78 diff --git a/.vim/vimrc b/.vim/vimrc index fbbda6a..4842484 100644 --- a/.vim/vimrc +++ b/.vim/vimrc @@ -1,42 +1,29 @@ +" load plugins execute pathogen#infect() Helptags set nocompatible -set autochdir -set shm+=I -set path+=.,** -set mouse=v -set laststatus=2 + +" mouse support +set mouse= + +" real backspace, please set backspace=indent,eol,start -set nonumber +" don't complain about $( ) +let g:is_posix=1 + +" colors +set background=dark +colorscheme lucius + set cursorline set scrolloff=3 set spelllang=de,en - -syntax off -filetype on - -set spelllang=de,en -let mapleader = "," - -" * and # are only highlighting -" n searches in the direction of * or # -" nnoremap * *`` -" nnoremap # #`` -" nnoremap n - -" SMOOTH SCROLLING -set t_TI=[4?h -set t_TE=[4?l - -" INDENTATION -set noautoindent -set nosmartindent -set nocindent - -" DIFF -set formatoptions=crolj +" +syntax on +filetype plugin on +set omnifunc=syntaxcomplete#Complete " SEARCH set hlsearch @@ -59,16 +46,38 @@ set list set listchars=tab:>_,trail:> set fillchars=vert:\|,eob:\ -set showcmd -set clipboard=unnamedplus +set wildmenu +set wildmode=longest:full,full -" C specific highlighting -let c_space_errors=1 -let c_gnu=1 -let c_comment_strings=1 -let c_curly_error=1 -"set makeprg=cc\ -o\ %:r\ % -set autowrite +function! s:build_quickfix_list(lines) + call setqflist(map(copy(a:lines), '{ "filename": v:val, "lnum": 1 }')) + copen + cc +endfunction + +" let g:fzf_history_dir = '~/.local/vim/fzf-history' +let g:fzf_layout = { 'down': '40%' } +nnoremap :FZF -i -e --layout=reverse + +let g:fzf_action = { + \ 'ctrl-t': 'tab split', + \ 'ctrl-x': 'split', + \ 'ctrl-v': 'vsplit' } + +function! CleverTab() + if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$' + return "\" + else + return "\" + endif +endfunction +inoremap =CleverTab() + +" HIGHLIGHT SPECIAL WORDS +match ErrorMsg '\(TODO:\|FIXME\|XXX\|workaround\|WTF\|: error:.*\|\s\+$\| \+\ze\t\)' + +" DIFF +set formatoptions=crolj " TEMPORARY FILES set undofile @@ -77,214 +86,8 @@ set backup set backupcopy=yes set backupdir=~/.local/vim/backup// set directory=~/.local/vim/swapfiles// -set updatetime=2000 -set updatecount=100 silent execute '!mkdir -p ~/.local/vim/backup ~/.local/vim/undo ~/.local/vim/swapfiles' -" TAB LINE -set tabline=%!Tabline() -function! Tabline() abort - let l:line = '' - for l:i in range(1, tabpagenr('$')) - if l:i == tabpagenr() - let l:line .= '%#TabLineSel#' - else - let l:line .= '%#TabLine#' - endif - let l:label = fnamemodify( - \ bufname(tabpagebuflist(l:i)[tabpagewinnr(l:i) - 1]), ':t' ) - let l:line .= ' ' . l:label . ' ' - endfor - let l:line .= '%#TabLineFill#' - return l:line -endfunction - -" CREATE DIRECTORIES -silent execute 'cs add ~/.dev/cscope.out' -set csprg=cscope\ -C -set cst -set cspc=9 - -" LOOK N FEEL -set t_Co=256 -set t_ut= -set background=dark -let g:is_posix=1 - -colorscheme goodwolf - - -" HIGHLIGHT SPECIAL WORDS -match ErrorMsg '\(TODO:\|FIXME\|XXX\|workaround\|WTF\|: error:.*\|\s\+$\| \+\ze\t\)' - -" MY THEME -hi ColorColumn ctermbg=234 ctermfg=249 cterm=NONE -hi CursorLine ctermbg=NONE ctermfg=NONE cterm=NONE -hi CursorLineNr ctermbg=NONE ctermfg=NONE cterm=NONE -hi LineNr ctermbg=NONE ctermfg=240 cterm=NONE -hi Comment ctermbg=NONE ctermfg=240 cterm=NONE -hi Constant ctermbg=NONE ctermfg=251 cterm=italic -hi Directory ctermbg=NONE ctermfg=NONE cterm=NONE -hi Error ctermbg=NONE ctermfg=NONE cterm=NONE -hi ErrorMsg ctermbg=NONE ctermfg=196 cterm=NONE -hi Folded ctermbg=NONE ctermfg=246 cterm=inverse -hi Identifier ctermbg=NONE ctermfg=NONE cterm=NONE -hi Identifier ctermbg=NONE ctermfg=NONE cterm=NONE -hi Ignore ctermbg=NONE ctermfg=NONE cterm=NONE -hi IncSearch ctermbg=NONE ctermfg=251 cterm=inverse -hi MatchParen ctermbg=NONE ctermfg=202 cterm=bold -hi NonText ctermbg=NONE ctermfg=NONE cterm=NONE -hi Normal ctermbg=NONE ctermfg=NONE cterm=NONE -hi Pmenu ctermbg=NONE ctermfg=251 cterm=inverse -hi PmenuSel ctermbg=NONE ctermfg=251 cterm=bold -hi PreProc ctermbg=NONE ctermfg=251 cterm=NONE -hi Search ctermbg=NONE ctermfg=251 cterm=inverse -hi SignColumn ctermbg=NONE ctermfg=NONE cterm=NONE -hi Special ctermbg=NONE ctermfg=NONE cterm=NONE -hi SpecialComment ctermbg=NONE ctermfg=NONE cterm=NONE -hi SpecialKey ctermbg=NONE ctermfg=239 cterm=NONE -hi Statement ctermbg=NONE ctermfg=251 cterm=NONE -hi Statement ctermbg=NONE ctermfg=NONE cterm=NONE -hi String ctermbg=NONE ctermfg=251 cterm=NONE -hi TODO ctermbg=NONE ctermfg=246 cterm=italic -hi TabLine ctermbg=NONE ctermfg=240 cterm=NONE -hi TabLineFill ctermbg=NONE ctermfg=240 cterm=NONE -hi TabLineSel ctermbg=NONE ctermfg=249 cterm=NONE -hi Title ctermbg=NONE ctermfg=246 cterm=bold -hi Type ctermbg=NONE ctermfg=NONE cterm=NONE -hi Underlined ctermbg=NONE ctermfg=251 cterm=underline -hi VisualNOS ctermbg=NONE ctermfg=246 cterm=NONE -hi WarningMsg ctermbg=NONE ctermfg=NONE cterm=NONE -hi Wildmenu ctermbg=NONE ctermfg=NONE cterm=NONE - -" VIMDIFF COLORS -hi DiffAdd ctermbg=22 ctermfg=NONE cterm=NONE -hi DiffDelete ctermbg=234 ctermfg=NONE cterm=NONE -hi DiffChange ctermbg=234 ctermfg=NONE cterm=NONE -hi DiffText ctermbg=NONE ctermfg=NONE cterm=NONE - -" SPLIT AND FOLD COLORS -hi VertSplit ctermbg=NONE ctermfg=246 cterm=NONE -hi FoldColumn ctermbg=NONE ctermfg=251 cterm=NONE -hi Folded ctermbg=233 ctermfg=251 cterm=NONE - -" SPELL COLOR -hi SpellBad ctermbg=52 ctermfg=NONE -hi SpellCap ctermbg=22 ctermfg=NONE cterm=NONE -hi SpellRare ctermbg=130 ctermfg=NONE - -" C+PgUp/PgDown -nnoremap gn :next -nnoremap gp :prev - -" NAVIGATE ON VISUAL LINES (SOFT WRAP) -imap gj -imap gk -nmap gj -nmap gk - -" USE ARROW / VIM KEYS INSIDE OMNIBOX -inoremap j pumvisible() ? '' : 'j' -inoremap k pumvisible() ? '' : 'k' -inoremap pumvisible() ? '' : '' -inoremap pumvisible() ? '' : '' - -" NETRW -let g:netrw_banner = 0 -let g:netrw_browse_split = 3 -let g:netrw_liststyle = 3 -let g:netrw_ctags = "ectags" -let g:netrw_silent = 1 -let g:netrw_sftp_cmd = "sftp -q" -let g:netrw_scp_cmd = "scp -q" - -" STATUSLINE, AIRLINE/POWERLINE IS FOR NOOBS -set statusline=%#VisualNOS# -set statusline+=%F\ %{&filetype} -set statusline+=%= -set statusline+=%m%r%h%w%q -set statusline+=\ %{&fileformat}/%{&fileencoding?&fileencoding:&encoding} -set statusline+=\ dec:%b\ hex:%B -" set statusline+=\ count:%{(mode()=='V')?wordcount().visual_words:wordcount().words}w -" set statusline+=/%{(mode()=='V')?wordcount().visual_chars:wordcount().chars}c -set statusline+=\ line:%l\ col:%c -set statusline+=\ %p%% -set statusline+=\ - -" ITALIC FIX -set t_ZH= -set t_ZR= - -set wildmode=full - -" OPEN FILE -" nnoremap :Texplore -nnoremap :Files -inoremap :Files - -" TAGS FILE -set tags="~/.dev/tags" -nnoremap gt :cs find 1 =expand("") -nnoremap gs :cs find 4 =expand("") -nnoremap gb -nnoremap gh :FSHere - -nnoremap oo :browse oldfiles -nnoremap XX :qall! - -" PLUGIN: TAGBAR -nmap :TagbarToggle -let g:tagbar_ctags_bin = "ectags" - -" PLUGIN: EASY ALIGN -xmap ga (EasyAlign) -nmap ga (EasyAlign) - -" Compile Stuff -nnoremap mm :call MyMake() -nnoremap mr :!clear && %:p:r -function MyMake() - :silent !clear - if filereadable("Makefile") - :w! | !make - else - :w! | !cc -Wall -g -O0 -o %:p:r -lsndio %:p - endif -endfunction - -" CUSTOM: NO CLUTTER PASTE MODE -nnoremap :call TogglePaste() -let g:paste=0 -function! TogglePaste() - if (g:paste == 0) - :set paste nolist nonumber | - \ echo "-- PASTE --" - let g:paste=1 -else - :set nopaste list number | - \ echo "-- NOPASTE --" - let g:paste=0 -endif -endfunction - -" CUSTOM: COPY ACROSS VIM INSTANCES -vnoremap vy :call VisualYank() -nnoremap vp :call VisualPaste() -let s:temp_file_path = $HOME . '/.cache/vim-snap' -function! VisualYank() - call writefile(getline(getpos("'<")[1], - \ getpos("'>")[1]), s:temp_file_path) -endfunction -function! VisualPaste() - let file_msg = readfile(s:temp_file_path) - call append(line("."), file_msg) -endfunction - -" CUSTOM: HTMLENCODE WITHOUT PRE -function! BlogEncode() - :%s/>/\>/g | %s//g | %s/<\/pre>/<\/pre>/g -endfunction - augroup mystuff au! au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g'\"" | endif @@ -292,3 +95,284 @@ augroup mystuff au BufRead,BufNewFile Makefile,/usr/src/*.c,/usr/src/*.h,*.gmk setl sw=8 sts=8 noet au BufWritePost vimrc so ~/.vim/vimrc augroup end + +" set autochdir +" set shm+=I +" set path+=.,** +" set mouse=v +" set laststatus=2 +" set backspace=indent,eol,start +" +" set nonumber +" set cursorline +" set scrolloff=3 +" set spelllang=de,en +" +" syntax off +" filetype on +" +" set spelllang=de,en +" let mapleader = "," +" +" " * and # are only highlighting +" " n searches in the direction of * or # +" " nnoremap * *`` +" " nnoremap # #`` +" " nnoremap n +" +" " SMOOTH SCROLLING +" set t_TI=[4?h +" set t_TE=[4?l +" +" " INDENTATION +" set noautoindent +" set nosmartindent +" set nocindent +" +" " DIFF +" set formatoptions=crolj +" +" " SEARCH +" set hlsearch +" set ignorecase +" set smartcase +" +" " SPACES (TABS) +" set tabstop=8 +" set shiftwidth=4 +" let &softtabstop=&shiftwidth +" +" set expandtab +" set smarttab +" +" set textwidth=72 +" " set colorcolumn=72 +" set formatprg=par\ -w72q +" +" set list +" set listchars=tab:>_,trail:> +" set fillchars=vert:\|,eob:\ +" +" set showcmd +" set clipboard=unnamedplus +" +" " C specific highlighting +" let c_space_errors=1 +" let c_gnu=1 +" let c_comment_strings=1 +" let c_curly_error=1 +" "set makeprg=cc\ -o\ %:r\ % +" set autowrite +" +" " TEMPORARY FILES +" set undofile +" set undodir=~/.local/vim/undo// +" set backup +" set backupcopy=yes +" set backupdir=~/.local/vim/backup// +" set directory=~/.local/vim/swapfiles// +" set updatetime=2000 +" set updatecount=100 +" silent execute '!mkdir -p ~/.local/vim/backup ~/.local/vim/undo ~/.local/vim/swapfiles' +" +" " TAB LINE +" set tabline=%!Tabline() +" function! Tabline() abort +" let l:line = '' +" for l:i in range(1, tabpagenr('$')) +" if l:i == tabpagenr() +" let l:line .= '%#TabLineSel#' +" else +" let l:line .= '%#TabLine#' +" endif +" let l:label = fnamemodify( +" \ bufname(tabpagebuflist(l:i)[tabpagewinnr(l:i) - 1]), ':t' ) +" let l:line .= ' ' . l:label . ' ' +" endfor +" let l:line .= '%#TabLineFill#' +" return l:line +" endfunction +" +" " CREATE DIRECTORIES +" silent execute 'cs add ~/.dev/cscope.out' +" set csprg=cscope\ -C +" set cst +" set cspc=9 +" +" " LOOK N FEEL +" set t_Co=256 +" set t_ut= +" let g:is_posix=1 +" +" set background=dark +" colorscheme lucius +" +" +" +" " " MY THEME +" " hi ColorColumn ctermbg=234 ctermfg=249 cterm=NONE +" " hi CursorLine ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi CursorLineNr ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi LineNr ctermbg=NONE ctermfg=240 cterm=NONE +" " hi Comment ctermbg=NONE ctermfg=240 cterm=NONE +" " hi Constant ctermbg=NONE ctermfg=251 cterm=italic +" " hi Directory ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi Error ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi ErrorMsg ctermbg=NONE ctermfg=196 cterm=NONE +" " hi Folded ctermbg=NONE ctermfg=246 cterm=inverse +" " hi Identifier ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi Identifier ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi Ignore ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi IncSearch ctermbg=NONE ctermfg=251 cterm=inverse +" " hi MatchParen ctermbg=NONE ctermfg=202 cterm=bold +" " hi NonText ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi Normal ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi Pmenu ctermbg=NONE ctermfg=251 cterm=inverse +" " hi PmenuSel ctermbg=NONE ctermfg=251 cterm=bold +" " hi PreProc ctermbg=NONE ctermfg=251 cterm=NONE +" " hi Search ctermbg=NONE ctermfg=251 cterm=inverse +" " hi SignColumn ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi Special ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi SpecialComment ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi SpecialKey ctermbg=NONE ctermfg=239 cterm=NONE +" " hi Statement ctermbg=NONE ctermfg=251 cterm=NONE +" " hi Statement ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi String ctermbg=NONE ctermfg=251 cterm=NONE +" " hi TODO ctermbg=NONE ctermfg=246 cterm=italic +" " hi TabLine ctermbg=NONE ctermfg=240 cterm=NONE +" " hi TabLineFill ctermbg=NONE ctermfg=240 cterm=NONE +" " hi TabLineSel ctermbg=NONE ctermfg=249 cterm=NONE +" " hi Title ctermbg=NONE ctermfg=246 cterm=bold +" " hi Type ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi Underlined ctermbg=NONE ctermfg=251 cterm=underline +" " hi VisualNOS ctermbg=NONE ctermfg=246 cterm=NONE +" " hi WarningMsg ctermbg=NONE ctermfg=NONE cterm=NONE +" " hi Wildmenu ctermbg=NONE ctermfg=NONE cterm=NONE +" +" " VIMDIFF COLORS +" hi DiffAdd ctermbg=22 ctermfg=NONE cterm=NONE +" hi DiffDelete ctermbg=234 ctermfg=NONE cterm=NONE +" hi DiffChange ctermbg=234 ctermfg=NONE cterm=NONE +" hi DiffText ctermbg=NONE ctermfg=NONE cterm=NONE +" +" " SPLIT AND FOLD COLORS +" hi VertSplit ctermbg=NONE ctermfg=246 cterm=NONE +" hi FoldColumn ctermbg=NONE ctermfg=251 cterm=NONE +" hi Folded ctermbg=233 ctermfg=251 cterm=NONE +" +" " SPELL COLOR +" hi SpellBad ctermbg=52 ctermfg=NONE +" hi SpellCap ctermbg=22 ctermfg=NONE cterm=NONE +" hi SpellRare ctermbg=130 ctermfg=NONE +" +" " C+PgUp/PgDown +" nnoremap gn :next +" nnoremap gp :prev +" +" " NAVIGATE ON VISUAL LINES (SOFT WRAP) +" imap gj +" imap gk +" nmap gj +" nmap gk +" +" " USE ARROW / VIM KEYS INSIDE OMNIBOX +" inoremap j pumvisible() ? '' : 'j' +" inoremap k pumvisible() ? '' : 'k' +" inoremap pumvisible() ? '' : '' +" inoremap pumvisible() ? '' : '' +" +" " NETRW +" let g:netrw_banner = 0 +" let g:netrw_browse_split = 3 +" let g:netrw_liststyle = 3 +" let g:netrw_ctags = "ectags" +" let g:netrw_silent = 1 +" let g:netrw_sftp_cmd = "sftp -q" +" let g:netrw_scp_cmd = "scp -q" +" +" " " STATUSLINE, AIRLINE/POWERLINE IS FOR NOOBS +" " set statusline=%#VisualNOS# +" " set statusline+=%F\ %{&filetype} +" " set statusline+=%= +" " set statusline+=%m%r%h%w%q +" " set statusline+=\ %{&fileformat}/%{&fileencoding?&fileencoding:&encoding} +" " set statusline+=\ dec:%b\ hex:%B +" " " set statusline+=\ count:%{(mode()=='V')?wordcount().visual_words:wordcount().words}w +" " " set statusline+=/%{(mode()=='V')?wordcount().visual_chars:wordcount().chars}c +" " set statusline+=\ line:%l\ col:%c +" " set statusline+=\ %p%% +" " set statusline+=\ +" " +" " " ITALIC FIX +" " set t_ZH= +" " set t_ZR= +" +" +" " OPEN FILE +" " nnoremap :Texplore +" nnoremap :Files +" inoremap :Files +" +" " TAGS FILE +" set tags="~/.dev/tags" +" nnoremap gt :cs find 1 =expand("") +" nnoremap gs :cs find 4 =expand("") +" nnoremap gb +" nnoremap gh :FSHere +" +" nnoremap oo :browse oldfiles +" nnoremap XX :qall! +" +" " PLUGIN: TAGBAR +" nmap :TagbarToggle +" let g:tagbar_ctags_bin = "ectags" +" +" " PLUGIN: EASY ALIGN +" xmap ga (EasyAlign) +" nmap ga (EasyAlign) +" +" " Compile Stuff +" nnoremap mm :call MyMake() +" nnoremap mr :!clear && %:p:r +" function MyMake() +" :silent !clear +" if filereadable("Makefile") +" :w! | !make +" else +" :w! | !cc -Wall -g -O0 -o %:p:r -lsndio %:p +" endif +" endfunction +" +" " CUSTOM: NO CLUTTER PASTE MODE +" nnoremap :call TogglePaste() +" let g:paste=0 +" function! TogglePaste() +" if (g:paste == 0) +" :set paste nolist nonumber | +" \ echo "-- PASTE --" +" let g:paste=1 +" else +" :set nopaste list number | +" \ echo "-- NOPASTE --" +" let g:paste=0 +" endif +" endfunction +" +" " CUSTOM: COPY ACROSS VIM INSTANCES +" vnoremap vy :call VisualYank() +" nnoremap vp :call VisualPaste() +" let s:temp_file_path = $HOME . '/.cache/vim-snap' +" function! VisualYank() +" call writefile(getline(getpos("'<")[1], +" \ getpos("'>")[1]), s:temp_file_path) +" endfunction +" function! VisualPaste() +" let file_msg = readfile(s:temp_file_path) +" call append(line("."), file_msg) +" endfunction +" +" " CUSTOM: HTMLENCODE WITHOUT PRE +" function! BlogEncode() +" :%s/>/\>/g | %s//g | %s/<\/pre>/<\/pre>/g +" endfunction +