diff options
Diffstat (limited to 'files/vim')
| -rw-r--r-- | files/vim/autoload/Juliana.vim | 56 | ||||
| -rw-r--r-- | files/vim/colors/lil_pablo.vim | 81 | ||||
| -rwxr-xr-x | files/vim/pack/downloads/create_opt.sh | 38 | ||||
| -rw-r--r-- | files/vim/patches/qname_edit.diff | 178 | ||||
| -rw-r--r-- | files/vim/patches/vim_fugitive_tab_expand.diff | 17 | ||||
| -rw-r--r-- | files/vim/plugin/Hello.vim | 122 | ||||
| -rw-r--r-- | files/vim/plugin/qname.1.2.vim | 298 | ||||
| -rw-r--r-- | files/vim/vimrc | 294 |
8 files changed, 1084 insertions, 0 deletions
diff --git a/files/vim/autoload/Juliana.vim b/files/vim/autoload/Juliana.vim new file mode 100644 index 0000000..4dd86db --- /dev/null +++ b/files/vim/autoload/Juliana.vim @@ -0,0 +1,56 @@ +" https://github.com/neitanod/vim-clevertab + +function! Juliana#Init() + let g:Juliana#has_selection = 0 + augroup JulianaPersistAu + autocmd ModeChanged [V\x16]*:i let g:Juliana#has_selection = 1 + autocmd InsertLeave * let g:Juliana#has_selection = 0 + augroup END +endfunction + +function! Juliana#CompleteTab(type) + if a:type == "START" + let g:Juliana#stop=0 + return "" + endif + + if !g:Juliana#stop + " Vanilla <Tab> if we are at the front of a line. + if a:type == "TAB" && col(".") >= col("$") && !pumvisible() + let g:Juliana#stop=1 + return "\<Tab>" + elseif a:type == "ALIGN" && !pumvisible() " Align if !pumvisible(). + let g:Juliana#stop=1 + if g:Juliana#has_selection + return "\<ESC>gv=i" + else + return "\<ESC>\<C-v>=i" + endif + elseif a:type == "NEXT" " If pumvisible(), goto the next result. + let g:Juliana#stop=1 + return "\<C-n>" + endif + endif + + return "" +endfunction + +function! Juliana#CompleteSTab(type) + if a:type == "PREV" + if pumvisible() " If pumvisible(), goto the previous result. + return "\<C-p>" + else + return "\<Tab>" " <S-Tab> = <Tab> + endif + endif +endfunction + +function! Juliana#CompleteNTab(type) + if a:type == "FOLD" + if foldlevel(line(".")) " Toggle fold if on fold. + return "za" + else + return "\<Tab>" + endif + endif +endfunction diff --git a/files/vim/colors/lil_pablo.vim b/files/vim/colors/lil_pablo.vim new file mode 100644 index 0000000..1ab6d2a --- /dev/null +++ b/files/vim/colors/lil_pablo.vim @@ -0,0 +1,81 @@ +" Name: lil_pablo +" Author: Ron Aaron <ron@ronware.org> +" Maintainer: Original maintainerRon Aaron <ron@ronware.org> +" Website: https://github.com/vim/colorschemes +" License: Same as Vim +" Last Change: 2025 Aug 5 + +set background=dark + +hi clear +let g:colors_name = 'lil_pablo' + +" :%s/cterm\(bg\|fg\)=\([0-9]*\|NONE\|fg\)\ /cterm\1=\2\ gui\1=##\2##\ /g + +hi Normal ctermfg=15 guifg=#ffffff ctermbg=0 guibg=#000000 cterm=NONE +hi Comment ctermfg=8 guifg=#808080 ctermbg=NONE guibg=NONE cterm=NONE +hi Constant ctermfg=9 guifg=#d78700 ctermbg=NONE guibg=NONE cterm=NONE +hi Identifier ctermfg=6 guifg=#ffaf00 ctermbg=NONE guibg=NONE cterm=NONE +hi Statement ctermfg=3 guifg=#ffd75f ctermbg=NONE guibg=NONE cterm=bold +hi PreProc ctermfg=12 guifg=#00875f ctermbg=NONE guibg=NONE cterm=NONE +hi Type ctermfg=6 guifg=#ffaf00 ctermbg=NONE guibg=NONE cterm=NONE +hi Special ctermfg=14 guifg=#ffd700 ctermbg=NONE guibg=NONE cterm=NONE +hi Underlined ctermfg=2 guifg=#af5f00 ctermbg=NONE guibg=NONE cterm=underline +hi Ignore ctermfg=0 guifg=#000000 ctermbg=0 guibg=#000000 cterm=NONE +hi Error ctermfg=15 guifg=#ffffff ctermbg=9 guibg=#d78700 cterm=NONE +hi Todo ctermfg=0 guifg=#000000 ctermbg=3 guibg=#ffd75f cterm=NONE +hi Conceal ctermfg=8 guifg=#808080 ctermbg=NONE guibg=NONE cterm=NONE +hi Cursor ctermfg=0 guifg=#000000 ctermbg=15 guibg=#ffffff cterm=NONE +hi lCursor ctermfg=0 guifg=#000000 ctermbg=15 guibg=#ffffff cterm=NONE +hi CursorIM ctermfg=NONE guifg=NONE ctermbg=fg guibg=#eeeeee cterm=NONE +hi Title ctermfg=13 guifg=#ff8787 ctermbg=NONE guibg=NONE cterm=bold +hi Directory ctermfg=2 guifg=#af5f00 ctermbg=NONE guibg=NONE cterm=NONE +hi Search ctermfg=0 guifg=#000000 ctermbg=3 guibg=#ffd75f cterm=NONE +hi IncSearch ctermfg=15 guifg=#ffffff ctermbg=NONE guibg=NONE cterm=reverse +hi NonText ctermfg=12 guifg=#00875f ctermbg=NONE guibg=NONE cterm=bold +hi EndOfBuffer ctermfg=12 guifg=#00875f ctermbg=NONE guibg=NONE cterm=bold +hi ErrorMsg ctermfg=15 guifg=#ffffff ctermbg=1 guibg=#d75f00 cterm=NONE +hi WarningMsg ctermfg=9 guifg=#d78700 ctermbg=NONE guibg=NONE cterm=NONE +hi SignColumn ctermfg=14 guifg=#ffd700 ctermbg=0 guibg=#000000 cterm=NONE +hi ColorColumn ctermfg=15 guifg=#ffffff ctermbg=8 guibg=#808080 cterm=NONE +hi FoldColumn ctermfg=NONE guifg=NONE ctermbg=NONE guibg=NONE cterm=NONE +hi Folded ctermfg=12 guifg=#00875f ctermbg=NONE guibg=NONE cterm=NONE +hi CursorColumn ctermfg=NONE guifg=NONE ctermbg=NONE guibg=NONE cterm=underline +hi CursorLine ctermfg=NONE guifg=NONE ctermbg=NONE guibg=NONE cterm=underline +hi CursorLineNr ctermfg=11 guifg=#ffff5f ctermbg=NONE guibg=NONE cterm=underline +hi Visual ctermfg=4 guifg=#005f5f ctermbg=7 guibg=#eeeeee cterm=NONE +hi VisualNOS ctermfg=NONE guifg=NONE ctermbg=0 guibg=#000000 cterm=underline +hi LineNr ctermfg=8 guifg=#808080 ctermbg=NONE guibg=NONE cterm=NONE +hi! link LineNrAbove LineNr +hi! link LineNrBelow LineNr +hi MatchParen ctermfg=NONE guifg=NONE ctermbg=6 guibg=#ffaf00 cterm=NONE +hi ModeMsg ctermfg=NONE guifg=NONE ctermbg=NONE guibg=NONE cterm=bold +hi MoreMsg ctermfg=12 guifg=#00875f ctermbg=NONE guibg=NONE cterm=bold +hi Question ctermfg=10 guifg=#af8700 ctermbg=NONE guibg=NONE cterm=bold +hi SpecialKey ctermfg=14 guifg=#ffd700 ctermbg=NONE guibg=NONE cterm=NONE +hi WildMenu ctermfg=0 guifg=#000000 ctermbg=11 guibg=#ffff5f cterm=NONE +hi QuickFixLine ctermfg=0 guifg=#000000 ctermbg=6 guibg=#ffaf00 cterm=NONE +hi SpellBad ctermfg=9 guifg=#d78700 ctermbg=NONE guibg=NONE cterm=underline +hi SpellCap ctermfg=12 guifg=#00875f ctermbg=NONE guibg=NONE cterm=underline +hi SpellLocal ctermfg=13 guifg=#ff8787 ctermbg=NONE guibg=NONE cterm=underline +hi SpellRare ctermfg=11 guifg=#ffff5f ctermbg=NONE guibg=NONE cterm=underline +hi StatusLine ctermfg=11 guifg=#ffff5f ctermbg=4 guibg=#005f5f cterm=NONE +hi StatusLineNC ctermfg=0 guifg=#000000 ctermbg=15 guibg=#ffffff cterm=NONE +hi VertSplit ctermfg=15 guifg=#ffffff ctermbg=15 guibg=#ffffff cterm=NONE +hi TabLine ctermfg=15 guifg=#ffffff ctermbg=8 guibg=#808080 cterm=NONE +hi TabLineFill ctermfg=NONE guifg=NONE ctermbg=0 guibg=#000000 cterm=reverse +hi TabLineSel ctermfg=15 guifg=#ffffff ctermbg=0 guibg=#000000 cterm=bold +hi ToolbarLine ctermfg=NONE guifg=NONE ctermbg=0 guibg=#000000 cterm=NONE +hi ToolbarButton ctermfg=0 guifg=#000000 ctermbg=7 guibg=#eeeeee cterm=bold +hi PmenuMatch ctermfg=fg guifg=#eeeeee ctermbg=8 guibg=#808080 cterm=bold +hi PmenuMatchSel ctermfg=0 guifg=#000000 ctermbg=7 guibg=#eeeeee cterm=bold +hi Pmenu ctermfg=fg guifg=#eeeeee ctermbg=8 guibg=#808080 cterm=NONE +hi PmenuSbar ctermfg=NONE guifg=NONE ctermbg=NONE guibg=NONE cterm=NONE +hi PmenuSel ctermfg=0 guifg=#000000 ctermbg=7 guibg=#eeeeee cterm=NONE +hi PmenuThumb ctermfg=NONE guifg=NONE ctermbg=15 guibg=#ffffff cterm=NONE +hi DiffAdd ctermfg=15 guifg=#ffffff ctermbg=2 guibg=#af5f00 cterm=NONE +hi DiffChange ctermfg=15 guifg=#ffffff ctermbg=12 guibg=#00875f cterm=NONE +hi DiffText ctermfg=0 guifg=#000000 ctermbg=7 guibg=#eeeeee cterm=NONE +hi DiffDelete ctermfg=15 guifg=#ffffff ctermbg=13 guibg=#ff8787 cterm=NONE + +" vim: et ts=8 sw=2 sts=2 diff --git a/files/vim/pack/downloads/create_opt.sh b/files/vim/pack/downloads/create_opt.sh new file mode 100755 index 0000000..0029440 --- /dev/null +++ b/files/vim/pack/downloads/create_opt.sh @@ -0,0 +1,38 @@ +#! /usr/bin/env sh + +if [ ! -d "./opt" ]; then + echo "'opt' dir not found, create it here and re-run $0" + exit 1 +fi + +git clone --depth=1 https://github.com/tpope/vim-fugitive.git opt/vim-fugitive +cd opt/vim-fugitive +rm .git/hooks/* +git apply ../../../../patches/vim_fugitive_tab_expand.diff +cd ../.. + +git clone --depth=1 https://github.com/itchyny/vim-gitbranch.git opt/vim-gitbranch +cd opt/vim-gitbranch +rm .git/hooks/* +cd ../.. + +git clone --depth=1 https://github.com/matcatc/vim-asciidoc-folding.git opt/vim-asciidoc-folding +cd opt/vim-asciidoc-folding +rm .git/hooks/* +cd ../.. + +git clone --depth=1 https://github.com/chrisbra/Colorizer.git opt/Colorizer +cd opt/Colorizer +rm .git/hooks/* +cd ../.. + +#git clone --depth=1 https://github.com/yegappan/lsp.git opt/lsp +#cd opt/lsp +#rm .git/hooks/* +#cd ../.. + +vim -u NONE -c "helptags opt/vim-fugitive/doc" -c q +vim -u NONE -c "helptags opt/vim-gitbranch/doc" -c q +vim -u NONE -c "helptags opt/vim-asciidoc-folding/doc" -c q +vim -u NONE -c "helptags opt/Colorizer/doc" -c q +#vim -u NONE -c "helptags opt/lsp/doc" -c q diff --git a/files/vim/patches/qname_edit.diff b/files/vim/patches/qname_edit.diff new file mode 100644 index 0000000..4ca65ff --- /dev/null +++ b/files/vim/patches/qname_edit.diff @@ -0,0 +1,178 @@ +Post- dos2unix, Tabify, and Trim. +--- a/qname.1.2.vim 2025-08-03 20:12:24.629096223 -0400 ++++ b/qname.1.2.vim 2025-08-13 22:10:15.352953531 -0400 +@@ -7,7 +7,25 @@ + " License: Vim License + " ============================================================================= + ++" https://www.vim.org/scripts/script.php?script_id=2317 ++" + " Change Log ++" EDIT: ++" 2025-06-24: ++" Remove redraw on update ++" Don't wrap around in the list ++" ls! -> ls ++" <Tab> -> <C-j/k> ++" Take out built-in hotkey ++" 2025-08-05: ++" Use path relative to current dir ++" Match against file path ++" 2025-08-13: ++" Sort buffers by most recently used ++" Add bind to "flatten" the list ++" Replace fmatch() with built-in matchfuzzy() (speedup) ++" Fix logic to not include buffers with modifiable off ++" + " 1.2 2013-01-03 + " ADD: <Tab> and <S-Tab> moves selection like <Up> and <Down> + " ADD: Use <silent> mapping to keep cmdline clear +@@ -30,12 +48,6 @@ + finish + endif + +-if !exists("g:qname_hotkey") || g:qname_hotkey == "" +- let g:qname_hotkey = "<F3>" +-endif +-exe "nmap" g:qname_hotkey ":cal QNameInit(1)<cr>:~" +-let s:qname_hotkey = eval('"\'.g:qname_hotkey.'"') +- + if exists("g:qname_loaded") && g:qname_loaded + finish + endif +@@ -70,16 +82,19 @@ + call s:swb(str2nr(matchstr(s:s[_sel], '<\zs\d\+\ze>'))) + endif + call QNameInit(0) +- elseif _key ==# "\<Up>" || _key ==# "\<S-Tab>" ++ elseif _key ==# "\<Up>" || _key ==# "\<C-k>" + call s:colPrinter.vert(-1) +- elseif _key ==# "\<Down>" || _key ==# "\<Tab>" ++ elseif _key ==# "\<Down>" || _key ==# "\<C-j>" + call s:colPrinter.vert(1) + elseif _key ==# "\<Left>" + call s:colPrinter.horz(-1) + elseif _key ==# "\<Right>" + call s:colPrinter.horz(1) +- elseif _key ==# s:qname_hotkey +- call QNameInit(0) ++ elseif _key ==# "\<C-f>" ++ let s:flat = 1 - s:flat ++ let prev_sel = s:colPrinter.sel ++ call s:build() ++ let s:colPrinter.sel = prev_sel + else + call s:build() + endif +@@ -88,7 +103,6 @@ + cal QNameInit(0) + finally + " clean up screen after dismissing search window +- redraw! + call inputrestore() + endtry + endfunc +@@ -99,6 +113,7 @@ + let s:cmdh = &cmdheight + if a:start != -1 + let s:inp = "" ++ let s:flat = 0 + endif + call s:baselist() + call s:build() +@@ -112,16 +127,27 @@ + function! s:build() + let s:s = [] + let s:n = [] ++ let s:sp = [] ++ let s:np = [] + let s:blen = 0 + let _cmp = tolower(tr(s:inp, '\', '/')) + for _line in s:ls +- let _name = matchstr(_line, '^.\{-}\ze \+<') +- if s:fmatch(tolower(_name), _cmp) ++ " Match everthing before |<xx>| Match everthing after space. ++ let _match = matchlist(_line, '^.\{-}\ze \+<.*> \+\(.*\)') ++ let _name = _match[0] ++ let _path = _match[1] ++ if strlen(_cmp) == 0 || s:fmatch(tolower(_name), _cmp) + cal add(s:s, _line) + cal add(s:n, _name) ++ elseif s:fmatch(tolower(_path), _cmp) ++ cal add(s:sp, _line) ++ cal add(s:np, _name) + endif + endfor +- if len(s:n) > s:colPrinter.trow ++ " Put filename matches before path matches. ++ let s:n = s:n + s:np ++ let s:s = s:s + s:sp ++ if !s:flat && len(s:n) > s:colPrinter.trow + cal s:colPrinter.put(s:n) + else + cal s:colPrinter.put(s:s) +@@ -137,37 +163,28 @@ + endfunc + + function! s:fmatch(src,pat) +- let _si = strlen(a:src)-1 +- let _pi = strlen(a:pat)-1 +- while _si>=0 && _pi>=0 +- if a:src[_si] == a:pat[_pi] +- let _pi -= 1 +- endif +- let _si -= 1 +- endwhile +- return _pi < 0 ++ return len(matchfuzzy([a:src], a:pat)) > 0 + endfunc + + function! s:baselist() + let s:ls = [] +- redir => l:bufs | silent ls! | redir END ++ redir => l:bufs | silent ls t | redir END + for _line in split(l:bufs, "\n") +- if _line[3]!='u' || _line[6]!='-' ++ if _line[6] != '-' + let _bno = matchstr(_line, '^ *\zs\d*')+0 + let _fname = substitute(expand("#"._bno.":p"), '\', '/', 'g') + if _fname == "" + let _fname = "|".matchstr(_line, '"\[\zs[^\]]*')."|" + endif + let _name = fnamemodify(_fname,":t") +- cal add(s:ls, _name." <"._bno."> ".fnamemodify(_fname,":h")) ++ cal add(s:ls, _name." <"._bno."> ".fnamemodify(_fname,":.")) + endif + endfor + let _align = max(map(copy(s:ls),'stridx(v:val,">")')) + call map(s:ls, 'substitute(v:val, " <", repeat(" ",_align-stridx(v:val,">"))." <", "")') +- cal sort(s:ls, 1) + endfunc + +-let s:colPrinter = {"trow": 4} ++let s:colPrinter = {"trow": 5} + function! s:colPrinter.put(its) dict + let _cols = [] + let _trow = self.trow +@@ -224,11 +241,7 @@ + function! s:colPrinter.vert(mv) dict + let _t = self.sel + a:mv + let _len = self.len +- if _t < 0 && _len > 0 +- let self.sel = _len-1 +- elseif _t >= _len +- let self.sel = 0 +- else ++ if _t >= 0 && _t < _len + let self.sel = _t + endif + endfunc +@@ -244,7 +257,7 @@ + let _t = _sel/_trow + let _cpos = self.cpos + let _lcol = self.lcol +- let _tcol = &columns ++ let _tcol = s:flat ? 1 : &columns + if _cpos[_lcol]+_tcol < _cpos[_t+1] + let _rcol = _t + let _pos = _cpos[_t+1]-_tcol-2 diff --git a/files/vim/patches/vim_fugitive_tab_expand.diff b/files/vim/patches/vim_fugitive_tab_expand.diff new file mode 100644 index 0000000..aa7b0ef --- /dev/null +++ b/files/vim/patches/vim_fugitive_tab_expand.diff @@ -0,0 +1,17 @@ +diff --git a/autoload/fugitive.vim b/autoload/fugitive.vim +index 7f2f602..fa178c4 100644 +--- a/autoload/fugitive.vim ++++ b/autoload/fugitive.vim +@@ -2696,10 +2696,10 @@ function! s:MapStatus() abort + call s:Map('n', 'C', ":echoerr 'fugitive: C has been removed in favor of cc'<CR>", '<silent><unique>') + call s:Map('n', 'a', ":echoerr 'fugitive: a has been removed in favor of s'<CR>", '<silent><unique>') + call s:Map('n', 'i', ":<C-U>execute <SID>NextExpandedHunk(v:count1)<CR>", '<silent>') +- call s:Map('n', "=", ":<C-U>execute <SID>StageInline('toggle',line('.'),v:count)<CR>", '<silent>') ++ call s:Map('n', "<Tab>", ":<C-U>execute <SID>StageInline('toggle',line('.'),v:count)<CR>", '<silent>') + call s:Map('n', "<", ":<C-U>execute <SID>StageInline('hide', line('.'),v:count)<CR>", '<silent>') + call s:Map('n', ">", ":<C-U>execute <SID>StageInline('show', line('.'),v:count)<CR>", '<silent>') +- call s:Map('x', "=", ":<C-U>execute <SID>StageInline('toggle',line(\"'<\"),line(\"'>\")-line(\"'<\")+1)<CR>", '<silent>') ++ call s:Map('x', "<Tab>", ":<C-U>execute <SID>StageInline('toggle',line(\"'<\"),line(\"'>\")-line(\"'<\")+1)<CR>", '<silent>') + call s:Map('x', "<", ":<C-U>execute <SID>StageInline('hide', line(\"'<\"),line(\"'>\")-line(\"'<\")+1)<CR>", '<silent>') + call s:Map('x', ">", ":<C-U>execute <SID>StageInline('show', line(\"'<\"),line(\"'>\")-line(\"'<\")+1)<CR>", '<silent>') + call s:Map('n', 'D', ":echoerr 'fugitive: D has been removed in favor of dd'<CR>", '<silent><unique>') diff --git a/files/vim/plugin/Hello.vim b/files/vim/plugin/Hello.vim new file mode 100644 index 0000000..224200e --- /dev/null +++ b/files/vim/plugin/Hello.vim @@ -0,0 +1,122 @@ +" https://github.com/arp242/startscreen.vim/blob/master/plugin/startscreen.vim + +scriptencoding utf-8 +if exists('g:Hello_Loaded') | finish | endif +let g:Hello_Loaded = 1 +let s:save_cpo = &cpo +set cpo&vim + +fun! Hello#start() + " Don't run if: + " - there are commandline arguments; + " - the buffer isn't empty (e.g. cmd | vi -); + " - we're not invoked as vim or gvim; + " - we're starting in insert mode. + if argc() || line2byte('$') != -1 || v:progname !~? '^[-gmnq]\=vim\=x\=\%[\.exe]$' || &insertmode + return + endif + + " Start a new buffer... + enew + + " ...set it's name... + keepalt file [Hello] + + " ...and set some options for it. + setlocal + \ bufhidden=wipe + \ buftype=nofile + \ nobuflisted + \ nocursorcolumn + \ nocursorline + \ nolist + \ nonumber + \ noswapfile + \ norelativenumber + + " Now we can just write to the buffer whatever you want. + + let pole = [' .', ' (` `)', ' `\./`', ' __|`|__', '/ |_| \', '|_______|', '\_______/', ' | |', ' | |', ' | |', ' `.| |.`', ' /| |\', ' / | | \', ' | |', ' .`| |`.', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |', ' | |'] + for i in reverse(range(0, len(pole) - 1)) + call append('0', ' '.pole[i]) + endfor + :1 + redraw! + + "call writefile([output], '/proc/self/fd/0', 'b') + + " No modifications to this buffer. + setlocal nomodifiable nomodified + + " When we go to insert mode start a new buffer, and start insert. + nnoremap <buffer><silent> e :enew<CR> + nnoremap <buffer><silent> i :enew <bar> startinsert<CR> + nnoremap <buffer><silent> p :enew<CR>p +endfun + +augroup Hello + autocmd! + autocmd VimEnter * call Hello#start() +augroup end + +let &cpo = s:save_cpo +unlet s:save_cpo +" +" +" +" +" +" +" +" +" Sketch +" +" +" +" +" +" +" +" +" +" +" +" https://www.asciiart.eu/buildings-and-places/fences +" . +" (` `) +" `\./` +" __|`|__ +" / |_| \ +" |_______| +" \_______/ +" | | +" | | +" | | +" `.| |.` +" /| |\ +" / | | \ +" | | +" .`| |`. +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" | | +" +" +" +" +" +" +" diff --git a/files/vim/plugin/qname.1.2.vim b/files/vim/plugin/qname.1.2.vim new file mode 100644 index 0000000..73b7dec --- /dev/null +++ b/files/vim/plugin/qname.1.2.vim @@ -0,0 +1,298 @@ +" ============================================================================= +" QuickName: The most convenient way navigating opened buffers, +" incremental search by name +" Last Change: 2013-01-03 +" Maintainer: Pal Nart <palnart@gmail.com> +" Version: 1.2 +" License: Vim License +" ============================================================================= + +" https://www.vim.org/scripts/script.php?script_id=2317 +" +" Change Log +" EDIT: +" 2025-06-24: +" Remove redraw on update +" Don't wrap around in the list +" ls! -> ls +" <Tab> -> <C-j/k> +" Take out built-in hotkey +" 2025-08-05: +" Use path relative to current dir +" Match against file path +" 2025-08-13: +" Sort buffers by most recently used +" Add bind to "flatten" the list +" Replace fmatch() with built-in matchfuzzy() (speedup) +" Fix logic to not include buffers with modifiable off +" +" 1.2 2013-01-03 +" ADD: <Tab> and <S-Tab> moves selection like <Up> and <Down> +" ADD: Use <silent> mapping to keep cmdline clear +" FIX: Catch interrupt (<C-C> or <Esc> keypress) and restore cmd line +" FIX: Use case-sensitive string comparisons to afford immunity from value +" of 'ignorecase' +" FIX: Do not clobber contents of @y register +" +" 1.1 2009-07-19 +" ADD: Key Shift+Enter open buffer in a new horizontally split window. Thanks +" to contribution by Salman Halim +" ADD: Key Ctrl+U reset input line and show all buffers +" FIX: If a buffer is already associated with a window, navigate to that +" window instead of opening in current window +" +" 1.0 2008-07-30 +" Initial upload + +if v:version < 700 + finish +endif + +if exists("g:qname_loaded") && g:qname_loaded + finish +endif +let g:qname_loaded = 1 + +function! QNameRun() + try + call s:colPrinter.print() + echo "\rMatch" len(s:n)."/".len(s:ls) "names:" s:inp + call inputsave() + let _key = getchar() + if !type(_key) + let _key = nr2char(_key) + endif + + " use case-sensitive equality operator, otherwise <BS> looks like + " <S-Tab> if 'ignorecase' is set + if _key ==# "\<BS>" + let s:inp = s:inp[:-2] + elseif _key ==# "\<C-U>" + let s:inp = "" + elseif strlen(_key) == 1 && char2nr(_key) > 31 + let s:inp = s:inp._key + endif + + if _key ==# "\<ESC>" || _key ==# "\<CR>" || _key ==# "\<S-CR>" + let _sel = s:colPrinter.sel + if _key != "\<ESC>" && _sel < len(s:n) && _sel >= 0 + if _key ==# "\<S-CR>" + :split + endif + call s:swb(str2nr(matchstr(s:s[_sel], '<\zs\d\+\ze>'))) + endif + call QNameInit(0) + elseif _key ==# "\<Up>" || _key ==# "\<C-k>" + call s:colPrinter.vert(-1) + elseif _key ==# "\<Down>" || _key ==# "\<C-j>" + call s:colPrinter.vert(1) + elseif _key ==# "\<Left>" + call s:colPrinter.horz(-1) + elseif _key ==# "\<Right>" + call s:colPrinter.horz(1) + elseif _key ==# "\<C-f>" + let s:flat = 1 - s:flat + let prev_sel = s:colPrinter.sel + call s:build() + let s:colPrinter.sel = prev_sel + else + call s:build() + endif + catch /^Vim:.*$/ + " restore cmdheight if search is interrupted + cal QNameInit(0) + finally + " clean up screen after dismissing search window + call inputrestore() + endtry +endfunc + +function! QNameInit(start) + if a:start + cmap <silent> ~ cal QNameRun()<CR>:~ + let s:cmdh = &cmdheight + if a:start != -1 + let s:inp = "" + let s:flat = 0 + endif + call s:baselist() + call s:build() + exe "set cmdheight=".(s:colPrinter.trow+1) + else + cmap <silent> ~ exe "cunmap \x7E"<CR> + exe "set cmdheight=".s:cmdh + endif +endfunc + +function! s:build() + let s:s = [] + let s:n = [] + let s:sp = [] + let s:np = [] + let s:blen = 0 + let _cmp = tolower(tr(s:inp, '\', '/')) + for _line in s:ls + " Match everthing before |<xx>| Match everthing after space. + let _match = matchlist(_line, '^.\{-}\ze \+<.*> \+\(.*\)') + let _name = _match[0] + let _path = _match[1] + if strlen(_cmp) == 0 || s:fmatch(tolower(_name), _cmp) + cal add(s:s, _line) + cal add(s:n, _name) + elseif s:fmatch(tolower(_path), _cmp) + cal add(s:sp, _line) + cal add(s:np, _name) + endif + endfor + " Put filename matches before path matches. + let s:n = s:n + s:np + let s:s = s:s + s:sp + if !s:flat && len(s:n) > s:colPrinter.trow + cal s:colPrinter.put(s:n) + else + cal s:colPrinter.put(s:s) + endif +endfunc + +function! s:swb(bno) + if bufwinnr(a:bno) == -1 + exe "hid b" a:bno + else + exe bufwinnr(a:bno) . "winc w" + endif +endfunc + +function! s:fmatch(src,pat) + return len(matchfuzzy([a:src], a:pat)) > 0 +endfunc + +function! s:baselist() + let s:ls = [] + redir => l:bufs | silent ls t | redir END + for _line in split(l:bufs, "\n") + if _line[6] != '-' + let _bno = matchstr(_line, '^ *\zs\d*')+0 + let _fname = substitute(expand("#"._bno.":p"), '\', '/', 'g') + if _fname == "" + let _fname = "|".matchstr(_line, '"\[\zs[^\]]*')."|" + endif + let _name = fnamemodify(_fname,":t") + cal add(s:ls, _name." <"._bno."> ".fnamemodify(_fname,":.")) + endif + endfor + let _align = max(map(copy(s:ls),'stridx(v:val,">")')) + call map(s:ls, 'substitute(v:val, " <", repeat(" ",_align-stridx(v:val,">"))." <", "")') +endfunc + +let s:colPrinter = {"trow": 5} +function! s:colPrinter.put(its) dict + let _cols = [] + let _trow = self.trow + + let _its = copy(a:its) + let _len = len(_its) + let _i = 0 + while _i < _len + if _i+_trow <= _len + cal add(_cols, remove(_its,0,_trow-1)) + else + cal add(_cols, _its) + endif + let _i += _trow + endwhile + + let _cpos = [0] + let _cw = [] + let _t = 0 + for _li in _cols + let _w = max(map(copy(_li),'strlen(v:val)'))+4 + let _t += _w + cal add(_cpos,_t) + cal add(_cw,_w) + endfor + + let _rows = [] + for _i in range(_trow) + let _row = [] + for _j in range(len(_cols)) + if _j*_trow+_i < _len + cal add(_row,_cols[_j][_i]) + endif + endfor + cal add(_rows, _row) + endfor + + let self.cols = _cols + let self.cw = _cw + let self.rows = _rows + let self.cpos = _cpos + let self.len = _len + let self.lcol = 0 + let self.sel = 0 +endfunc + +function! s:colPrinter.horz(mv) dict + let _t = self.sel + a:mv*self.trow + if _t >= 0 && _t < self.len + let self.sel = _t + endif +endfunc + +function! s:colPrinter.vert(mv) dict + let _t = self.sel + a:mv + let _len = self.len + if _t >= 0 && _t < _len + let self.sel = _t + endif +endfunc + +function! s:colPrinter.print() dict + let _len = self.len + let _trow = self.trow + if !_len + echo " [...NO MATCH...]" repeat("\n",_trow) + return + endif + let _sel = self.sel + let _t = _sel/_trow + let _cpos = self.cpos + let _lcol = self.lcol + let _tcol = s:flat ? 1 : &columns + if _cpos[_lcol]+_tcol < _cpos[_t+1] + let _rcol = _t + let _pos = _cpos[_t+1]-_tcol-2 + while _cpos[_lcol] < _pos + let _lcol += 1 + endwhile + let _lcol -= _lcol > _t + else + if _t < _lcol + let _lcol = _t + endif + let _rcol = len(_cpos)-1 + let _pos = _cpos[_lcol]+_tcol+2 + while _cpos[_rcol] > _pos + let _rcol -= 1 + endwhile + let _rcol -= _rcol > _lcol + endif + let _cw = self.cw + let _pos = _cpos[_lcol]+_tcol + let self.lcol = _lcol + for _i in range(_trow) + let _row = self.rows[_i] + for _j in range(_lcol,_rcol) + if _j*_trow+_i < _len + let _txt = " " . _row[_j] + let _txt .= repeat(" ", _cw[_j] - strlen(_txt)) + let _txt = _txt[:_pos-_cpos[_j]-2] + if _j*_trow + _i == _sel + echoh Search|echon _txt|echoh None + else + echon _txt + endif + endif + endfor + echon "\n" + endfor +endfunc diff --git a/files/vim/vimrc b/files/vim/vimrc new file mode 100644 index 0000000..41e30fb --- /dev/null +++ b/files/vim/vimrc @@ -0,0 +1,294 @@ +" @TODO: Map 'd' to delete no yank + +" Basic settings. +set nocompatible +set number +" showmode too often puts the cursor on the bottom line, this can make +" kitty's cursor_trail way too jumpy. +set noshowmode +"set signcolumn=yes +set updatetime=250 +set scrolloff=5 +"set lazyredraw +" Don't ask to save changes when switching buffers. +set hidden +" Use the last buffer instead of the right-most when opening from quickfix. +set switchbuf=uselast +" Show match count. +set shortmess-=S +" Old split defaults (I think). +set splitright +set splitbelow +" Stop buffers from jumping when opening buffer selection. +set splitkeep=screen + +set termguicolors +colo lil_pablo + +" Syntax and indent from filetype. +filetype plugin indent on +syntax on +" Search farther and longer to correctly highlight. +"au BufEnter * :syntax sync minlines=10 +set redrawtime=3000 +set maxmempattern=5000 + +" Highlight unwanted whitespace. +au BufEnter * match Error /\s\+$/ +au InsertEnter * match Error /\s\+\%#\@<!$/ +au InsertLeave * match Error /\s\+$/ + +" Check for SHIFT_JIS. +set fileencodings=ucs-bom,utf-8,sjis,default,latin1 + +" 4 spaces autoindent. +set tabstop=4 +set shiftwidth=4 +set expandtab +set autoindent + +" C syntax preference. +let g:c_syntax_for_h=1 +let g:c_no_curly_error=1 +let g:c_function_pointers=1 +set cinoptions=:0,=4,l1,g2,h2,(4,u4,+4,m1,j1,J1 +set cindent + +" Set different format for mail and text files. +set nowrap nolinebreak nolist formatoptions=l textwidth=0 +au FileType mail,text setlocal wrap formatoptions=l textwidth=0 + +" Ex tab complete that makes sense to me. +set wildmode=longest,list,full +set wildmenu + +" Set titlebar. +set title +au BufEnter * let &titlestring=expand("%:t") + +" https://github.com/csdvrx/CuteVim/blob/main/.vimrc + +" Allow distinguishing <C-i> from <Tab> in bindings. +" If using vim rather than neovim, this will disable the ability +" to map <C-h/j/k/l>. Apparently due to vim's lack of "CSI u" +" support, according to some issue reports. +" https://github.com/vim/vim/issues/10244 +"let &t_TI = "\<Esc>[>4;2m" +"let &t_TE = "\<Esc>[>4;m" +" Treat shift + backspace as normal backspace. +"noremap <S-BS> <BS> + +" System clipboard on linux. +set clipboard=unnamedplus + +" Session options. +set ssop=curdir,skiprtp,blank,buffers,folds,winsize,terminal +set vop-=curdir + +" Move ~/.viminfo. +set viminfo+=n~/.vim/viminfo + +" Session auto save. +" https://vim.fandom.com/wiki/Go_away_and_come_back +function! SaveSession() + if v:this_session != "" + echo "Saving." + exe "mksession! " . v:this_session + else + echo "No Session." + endif +endfunction +au VimLeave * :call SaveSession() + +if isdirectory(expand("~/c")) + " Swap file directory. + let swap_dir = expand("~/c/sessions/swaps//") + if !isdirectory(swap_dir) + call mkdir(swap_dir, "p", 0755) + endif + let &directory=swap_dir + + if has("persistent_undo") + let undo_dir = expand("~/c/sessions/undo//") + if !isdirectory(undo_dir) + call mkdir(undo_dir, "p", 0755) + endif + let &undodir=undo_dir + set undofile + endif + + " Staggered backups. + let backup_dir = "/mnt/store/backup/vim" + if !isdirectory(backup_dir) + let backup_dir = expand("~/c/sessions/backup//") + if !isdirectory(backup_dir) + call mkdir(backup_dir, "p", 0755) + endif + endif + let &backupdir=backup_dir + set backup +endif + +set autocomplete +set complete=.^5,w^5,b^5,u^5 +set completeopt=popup + +" Plugins. +let g:fugitive_no_maps = 1 +set diffopt+=vertical +packadd vim-fugitive +packadd vim-gitbranch +packadd vim-asciidoc-folding +packadd Colorizer +"if !empty($NIX_SHELL) +"packadd lsp +"call LspAddServer([#{ +"\ name: 'clangd', +"\ filetype: ['c', 'cpp'], +"\ path: 'clangd', +"\ args: ['--background-index'] +"\}]) +"endif + +" Custom statusline. +function! StatuslineGit() + let l:branchname = gitbranch#name() + return strlen(l:branchname) > 0 ? " ".l:branchname." " : " " +endfunction + +function! Statusline() abort + let focused = g:statusline_winid == win_getid(winnr()) + let status = focused ? "%#StatusLine#" : "%#StatusLineNC#" + let status .= "%{StatuslineGit()}" + let status .= " %{expand('%:~:.')}" " Explicitly expand to relative file, %f was flaky. + let status .= " vim@%{hostname()}" + let status .= "%=" + let status .= " %y" + let status .= " %{&fileencoding}" + let status .= "[%{&fileformat}]" + let status .= "%3p%%" + let status .= " %3l:%-3c" + return status +endfunction +set laststatus=2 " Always show statusline. +set statusline=%!Statusline() + +" Make shift + nav keys no-ops. +nnoremap <S-h> <nop> +nnoremap <S-j> <nop> +nnoremap <S-k> <nop> +nnoremap <S-l> <nop> +" Normal mode tab no-op. +nmap <Tab> <nop> +" ctrl + c no-op. +nnoremap <C-c> <nop> +" Disable F1 for help. +nmap <F1> <nop> +" Disable q: for histroy. +nmap q: <nop> +" Simplify split movement. +nnoremap <silent> <C-h> :wincmd h<CR> +nnoremap <silent> <C-j> :wincmd j<CR> +nnoremap <silent> <C-k> :wincmd k<CR> +nnoremap <silent> <C-l> :wincmd l<CR> +" Make ctrl + "." and "," map to previous buffer. +nmap <C-,> <C-^> +nmap <C-.> <C-^> +" Personally intuitive pop-up menu binds. +inoremap <expr> <CR> pumvisible() ? "<C-y><CR>" : "<CR>" +inoremap <expr> <Up> pumvisible() ? "<C-p>" : "<Up>" +inoremap <expr> <Down> pumvisible() ? "<C-n>" : "<Down>" +" Ctags +nnoremap <C-d> <C-]> +" Toggle colorcolumn. +nmap <silent> C :exe "set colorcolumn=" . (&colorcolumn == "" ? "101" : "")<CR> +" Toggle css color highlighting. +noremap <silent> # :ColorToggle<CR> +" Buffer select. +nmap <silent> \ :call QNameInit(1)<CR>:~ +" Git summary. +nmap <silent> Y :vertical G<CR> + +" Relative :e, :vs, and :s. +fun OpenBasedOnRelativeArgument(A, CMD) + " https://stackoverflow.com/a/14348204 + let arg = a:A + if arg != "" + let arg = (arg[0] == "/" ? arg : resolve(fnamemodify(expand("%:h")."/".arg, ":p"))) + endif + if a:CMD == "EDIT" + exe "edit" arg + elseif a:CMD == "VERTICAL_SPLIT" + exe "vsplit" arg + elseif a:CMD == "SPLIT" + exe "split" arg + endif +endfun +command -nargs=* -complete=customlist,RelativeFileComplete E :call OpenBasedOnRelativeArgument("<args>", "EDIT") +command -nargs=* -complete=customlist,RelativeFileComplete VS :call OpenBasedOnRelativeArgument("<args>", "VERTICAL_SPLIT") +command -nargs=* -complete=customlist,RelativeFileComplete S :call OpenBasedOnRelativeArgument("<args>", "SPLIT") +fun RelativeFileComplete(A,L,P) + let argpath = fnamemodify(a:A, ":h") + if argpath[0] == "~" || argpath[0] == "/" + let curpath = "" + else + let curpath = expand("%:h")."/" + endif + let argfile = fnamemodify(a:A, ":t") + let files = globpath(curpath.argpath, argfile."*", 0, 1) + for i in range(0, len(files) - 1) + if isdirectory(files[i]) + let files[i] = files[i]."/" + endif + if len(curpath) > 0 + let files[i] = substitute(files[i], curpath, "", "") + let files[i] = substitute(files[i], "^./", "", "") + endif + endfor + return files +endfun +" https://stackoverflow.com/a/20564623 +cnoreabbrev <expr> e getcmdtype() == ":" && getcmdline() == "e" ? "E" : "e" +cnoreabbrev <expr> vs getcmdtype() == ":" && getcmdline() == "vs" ? "VS" : "vs" +cnoreabbrev <expr> s getcmdtype() == ":" && getcmdline() == "s" ? "S" : "s" + +" :no -> :nohlsearch instead of :noremap. +cnoreabbrev <expr> no getcmdtype() == ":" && getcmdline() == "no" ? "nohlsearch" : "no" + +call Juliana#Init() " Custom insert mode tab behavior inherited from Emacs. +inoremap <silent> <Tab> <C-R>=Juliana#CompleteTab("START")<CR> + \<C-R>=Juliana#CompleteTab("TAB")<CR> + \<C-R>=Juliana#CompleteTab("ALIGN")<CR> + \<C-R>=Juliana#CompleteTab("NEXT")<CR> +inoremap <silent> <S-Tab> <C-R>=Juliana#CompleteSTab("PREV")<CR> +nnoremap <silent> <expr> <Tab> Juliana#CompleteNTab("FOLD") + +command Tabify set noexpandtab | %retab! | set expandtab +command Untabify set expandtab | %retab! + +command Hex :%!xxd +command Unhex :%!xxd -r + +" https://stackoverflow.com/a/27721306 +"command -nargs=+ Ggr execute 'Ggrep! -q' <q-args> +command -nargs=+ Ggr execute "silent Ggrep!" <q-args> | botright cwindow | redraw! +" I had this mapped to <C-i> for the longest time. Sadly with OG vim +" (not neovim) the fix for mapping <Tab> and <C-i> seperately doesn't work. +" Changing this bind as the only concession to be compatible with vim +" seems well worth it. +nnoremap <C-o> :Ggr + +"" https://stackoverflow.com/a/37040415 +function! SyntaxGroup() + let l:s = synID(line("."), col("."), 1) + echo synIDattr(l:s, "name") . " -> " . synIDattr(synIDtrans(l:s), "name") +endfun +command Syn :call SyntaxGroup() + +" https://vi.stackexchange.com/a/456 +function! TrimWhitespace() + let l:save = winsaveview() + keeppatterns %s/\s\+$//e + call winrestview(l:save) +endfun +command Trim :call TrimWhitespace() |