summaryrefslogtreecommitdiff
path: root/files/vim
diff options
context:
space:
mode:
Diffstat (limited to 'files/vim')
-rw-r--r--files/vim/autoload/Juliana.vim56
-rw-r--r--files/vim/colors/lil_pablo.vim81
-rwxr-xr-xfiles/vim/pack/downloads/create_opt.sh38
-rw-r--r--files/vim/patches/qname_edit.diff178
-rw-r--r--files/vim/patches/vim_fugitive_tab_expand.diff17
-rw-r--r--files/vim/plugin/Hello.vim122
-rw-r--r--files/vim/plugin/qname.1.2.vim298
-rw-r--r--files/vim/vimrc294
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()