Old vim config, new is found in main dotfiles
https://git.jonathanh.co.uk/jab2870/Dotfiles/src/branch/master/nvim/.config/nvim
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
536 lines
19 KiB
536 lines
19 KiB
" cecutil.vim : save/restore window position |
|
" save/restore mark position |
|
" save/restore selected user maps |
|
" Author: Charles E. Campbell |
|
" Version: 18h ASTRO-ONLY |
|
" Date: Oct 16, 2012 |
|
" |
|
" Saving Restoring Destroying Marks: {{{1 |
|
" call SaveMark(markname) let savemark= SaveMark(markname) |
|
" call RestoreMark(markname) call RestoreMark(savemark) |
|
" call DestroyMark(markname) |
|
" commands: SM RM DM |
|
" |
|
" Saving Restoring Destroying Window Position: {{{1 |
|
" call SaveWinPosn() let winposn= SaveWinPosn() |
|
" call RestoreWinPosn() call RestoreWinPosn(winposn) |
|
" \swp : save current window/buffer's position |
|
" \rwp : restore current window/buffer's previous position |
|
" commands: SWP RWP |
|
" |
|
" Saving And Restoring User Maps: {{{1 |
|
" call SaveUserMaps(mapmode,maplead,mapchx,suffix) |
|
" call RestoreUserMaps(suffix) |
|
" |
|
" GetLatestVimScripts: 1066 1 :AutoInstall: cecutil.vim |
|
" |
|
" You believe that God is one. You do well. The demons also {{{1 |
|
" believe, and shudder. But do you want to know, vain man, that |
|
" faith apart from works is dead? (James 2:19,20 WEB) |
|
"redraw!|call inputsave()|call input("Press <cr> to continue")|call inputrestore() |
|
|
|
" --------------------------------------------------------------------- |
|
" Load Once: {{{1 |
|
if &cp || exists("g:loaded_cecutil") |
|
finish |
|
endif |
|
let g:loaded_cecutil = "v18h" |
|
let s:keepcpo = &cpo |
|
set cpo&vim |
|
"DechoRemOn |
|
|
|
" ======================= |
|
" Public Interface: {{{1 |
|
" ======================= |
|
|
|
" --------------------------------------------------------------------- |
|
" Map Interface: {{{2 |
|
if !hasmapto('<Plug>SaveWinPosn') |
|
map <unique> <Leader>swp <Plug>SaveWinPosn |
|
endif |
|
if !hasmapto('<Plug>RestoreWinPosn') |
|
map <unique> <Leader>rwp <Plug>RestoreWinPosn |
|
endif |
|
nmap <silent> <Plug>SaveWinPosn :call SaveWinPosn()<CR> |
|
nmap <silent> <Plug>RestoreWinPosn :call RestoreWinPosn()<CR> |
|
|
|
" --------------------------------------------------------------------- |
|
" Command Interface: {{{2 |
|
com! -bar -nargs=0 SWP call SaveWinPosn() |
|
com! -bar -nargs=? RWP call RestoreWinPosn(<args>) |
|
com! -bar -nargs=1 SM call SaveMark(<q-args>) |
|
com! -bar -nargs=1 RM call RestoreMark(<q-args>) |
|
com! -bar -nargs=1 DM call DestroyMark(<q-args>) |
|
|
|
com! -bar -nargs=1 WLR call s:WinLineRestore(<q-args>) |
|
|
|
if v:version < 630 |
|
let s:modifier= "sil! " |
|
else |
|
let s:modifier= "sil! keepj " |
|
endif |
|
|
|
" =============== |
|
" Functions: {{{1 |
|
" =============== |
|
|
|
" --------------------------------------------------------------------- |
|
" SaveWinPosn: {{{2 |
|
" let winposn= SaveWinPosn() will save window position in winposn variable |
|
" call SaveWinPosn() will save window position in b:cecutil_winposn{b:cecutil_iwinposn} |
|
" let winposn= SaveWinPosn(0) will *only* save window position in winposn variable (no stacking done) |
|
fun! SaveWinPosn(...) |
|
" echomsg "Decho: SaveWinPosn() a:0=".a:0 |
|
if line("$") == 1 && getline(1) == "" |
|
" echomsg "Decho: SaveWinPosn : empty buffer" |
|
return "" |
|
endif |
|
let so_keep = &l:so |
|
let siso_keep = &siso |
|
let ss_keep = &l:ss |
|
setlocal so=0 siso=0 ss=0 |
|
|
|
let swline = line(".") " save-window line in file |
|
let swcol = col(".") " save-window column in file |
|
if swcol >= col("$") |
|
let swcol= swcol + virtcol(".") - virtcol("$") " adjust for virtual edit (cursor past end-of-line) |
|
endif |
|
let swwline = winline() - 1 " save-window window line |
|
let swwcol = virtcol(".") - wincol() " save-window window column |
|
let savedposn = "" |
|
" echomsg "Decho: sw[".swline.",".swcol."] sww[".swwline.",".swwcol."]" |
|
let savedposn = "call GoWinbufnr(".winbufnr(0).")" |
|
let savedposn = savedposn."|".s:modifier.swline |
|
let savedposn = savedposn."|".s:modifier."norm! 0z\<cr>" |
|
if swwline > 0 |
|
let savedposn= savedposn.":".s:modifier."call s:WinLineRestore(".(swwline+1).")\<cr>" |
|
endif |
|
if swwcol > 0 |
|
let savedposn= savedposn.":".s:modifier."norm! 0".swwcol."zl\<cr>" |
|
endif |
|
let savedposn = savedposn.":".s:modifier."call cursor(".swline.",".swcol.")\<cr>" |
|
|
|
" save window position in |
|
" b:cecutil_winposn_{iwinposn} (stack) |
|
" only when SaveWinPosn() is used |
|
if a:0 == 0 |
|
if !exists("b:cecutil_iwinposn") |
|
let b:cecutil_iwinposn= 1 |
|
else |
|
let b:cecutil_iwinposn= b:cecutil_iwinposn + 1 |
|
endif |
|
" echomsg "Decho: saving posn to SWP stack" |
|
let b:cecutil_winposn{b:cecutil_iwinposn}= savedposn |
|
endif |
|
|
|
let &l:so = so_keep |
|
let &siso = siso_keep |
|
let &l:ss = ss_keep |
|
|
|
" if exists("b:cecutil_iwinposn") " Decho |
|
" echomsg "Decho: b:cecutil_winpos{".b:cecutil_iwinposn."}[".b:cecutil_winposn{b:cecutil_iwinposn}."]" |
|
" else " Decho |
|
" echomsg "Decho: b:cecutil_iwinposn doesn't exist" |
|
" endif " Decho |
|
" echomsg "Decho: SaveWinPosn [".savedposn."]" |
|
return savedposn |
|
endfun |
|
|
|
" --------------------------------------------------------------------- |
|
" RestoreWinPosn: {{{2 |
|
" call RestoreWinPosn() |
|
" call RestoreWinPosn(winposn) |
|
fun! RestoreWinPosn(...) |
|
" echomsg "Decho: RestoreWinPosn() a:0=".a:0 |
|
" echomsg "Decho: getline(1)<".getline(1).">" |
|
" echomsg "Decho: line(.)=".line(".") |
|
if line("$") == 1 && getline(1) == "" |
|
" echomsg "Decho: RestoreWinPosn : empty buffer" |
|
return "" |
|
endif |
|
let so_keep = &l:so |
|
let siso_keep = &l:siso |
|
let ss_keep = &l:ss |
|
setlocal so=0 siso=0 ss=0 |
|
|
|
if a:0 == 0 || a:1 == "" |
|
" use saved window position in b:cecutil_winposn{b:cecutil_iwinposn} if it exists |
|
if exists("b:cecutil_iwinposn") && exists("b:cecutil_winposn{b:cecutil_iwinposn}") |
|
" echomsg "Decho: using stack b:cecutil_winposn{".b:cecutil_iwinposn."}<".b:cecutil_winposn{b:cecutil_iwinposn}.">" |
|
try |
|
exe s:modifier.b:cecutil_winposn{b:cecutil_iwinposn} |
|
catch /^Vim\%((\a\+)\)\=:E749/ |
|
" ignore empty buffer error messages |
|
endtry |
|
" normally drop top-of-stack by one |
|
" but while new top-of-stack doesn't exist |
|
" drop top-of-stack index by one again |
|
if b:cecutil_iwinposn >= 1 |
|
unlet b:cecutil_winposn{b:cecutil_iwinposn} |
|
let b:cecutil_iwinposn= b:cecutil_iwinposn - 1 |
|
while b:cecutil_iwinposn >= 1 && !exists("b:cecutil_winposn{b:cecutil_iwinposn}") |
|
let b:cecutil_iwinposn= b:cecutil_iwinposn - 1 |
|
endwhile |
|
if b:cecutil_iwinposn < 1 |
|
unlet b:cecutil_iwinposn |
|
endif |
|
endif |
|
else |
|
echohl WarningMsg |
|
echomsg "***warning*** need to SaveWinPosn first!" |
|
echohl None |
|
endif |
|
|
|
else " handle input argument |
|
" echomsg "Decho: using input a:1<".a:1.">" |
|
" use window position passed to this function |
|
exe a:1 |
|
" remove a:1 pattern from b:cecutil_winposn{b:cecutil_iwinposn} stack |
|
if exists("b:cecutil_iwinposn") |
|
let jwinposn= b:cecutil_iwinposn |
|
while jwinposn >= 1 " search for a:1 in iwinposn..1 |
|
if exists("b:cecutil_winposn{jwinposn}") " if it exists |
|
if a:1 == b:cecutil_winposn{jwinposn} " and the pattern matches |
|
unlet b:cecutil_winposn{jwinposn} " unlet it |
|
if jwinposn == b:cecutil_iwinposn " if at top-of-stack |
|
let b:cecutil_iwinposn= b:cecutil_iwinposn - 1 " drop stacktop by one |
|
endif |
|
endif |
|
endif |
|
let jwinposn= jwinposn - 1 |
|
endwhile |
|
endif |
|
endif |
|
|
|
" Seems to be something odd: vertical motions after RWP |
|
" cause jump to first column. The following fixes that. |
|
" Note: was using wincol()>1, but with signs, a cursor |
|
" at column 1 yields wincol()==3. Beeping ensued. |
|
let vekeep= &ve |
|
set ve=all |
|
if virtcol('.') > 1 |
|
exe s:modifier."norm! hl" |
|
elseif virtcol(".") < virtcol("$") |
|
exe s:modifier."norm! lh" |
|
endif |
|
let &ve= vekeep |
|
|
|
let &l:so = so_keep |
|
let &l:siso = siso_keep |
|
let &l:ss = ss_keep |
|
|
|
" echomsg "Decho: RestoreWinPosn" |
|
endfun |
|
|
|
" --------------------------------------------------------------------- |
|
" s:WinLineRestore: {{{2 |
|
fun! s:WinLineRestore(swwline) |
|
" echomsg "Decho: s:WinLineRestore(swwline=".a:swwline.")" |
|
while winline() < a:swwline |
|
let curwinline= winline() |
|
exe s:modifier."norm! \<c-y>" |
|
if curwinline == winline() |
|
break |
|
endif |
|
endwhile |
|
" echomsg "Decho: s:WinLineRestore" |
|
endfun |
|
|
|
" --------------------------------------------------------------------- |
|
" GoWinbufnr: go to window holding given buffer (by number) {{{2 |
|
" Prefers current window; if its buffer number doesn't match, |
|
" then will try from topleft to bottom right |
|
fun! GoWinbufnr(bufnum) |
|
" call Dfunc("GoWinbufnr(".a:bufnum.")") |
|
if winbufnr(0) == a:bufnum |
|
" call Dret("GoWinbufnr : winbufnr(0)==a:bufnum") |
|
return |
|
endif |
|
winc t |
|
let first=1 |
|
while winbufnr(0) != a:bufnum && (first || winnr() != 1) |
|
winc w |
|
let first= 0 |
|
endwhile |
|
" call Dret("GoWinbufnr") |
|
endfun |
|
|
|
" --------------------------------------------------------------------- |
|
" SaveMark: sets up a string saving a mark position. {{{2 |
|
" For example, SaveMark("a") |
|
" Also sets up a global variable, g:savemark_{markname} |
|
fun! SaveMark(markname) |
|
" call Dfunc("SaveMark(markname<".a:markname.">)") |
|
let markname= a:markname |
|
if strpart(markname,0,1) !~ '\a' |
|
let markname= strpart(markname,1,1) |
|
endif |
|
" call Decho("markname=".markname) |
|
|
|
let lzkeep = &lz |
|
set lz |
|
|
|
if 1 <= line("'".markname) && line("'".markname) <= line("$") |
|
let winposn = SaveWinPosn(0) |
|
exe s:modifier."norm! `".markname |
|
let savemark = SaveWinPosn(0) |
|
let g:savemark_{markname} = savemark |
|
let savemark = markname.savemark |
|
call RestoreWinPosn(winposn) |
|
else |
|
let g:savemark_{markname} = "" |
|
let savemark = "" |
|
endif |
|
|
|
let &lz= lzkeep |
|
|
|
" call Dret("SaveMark : savemark<".savemark.">") |
|
return savemark |
|
endfun |
|
|
|
" --------------------------------------------------------------------- |
|
" RestoreMark: {{{2 |
|
" call RestoreMark("a") -or- call RestoreMark(savemark) |
|
fun! RestoreMark(markname) |
|
" call Dfunc("RestoreMark(markname<".a:markname.">)") |
|
|
|
if strlen(a:markname) <= 0 |
|
" call Dret("RestoreMark : no such mark") |
|
return |
|
endif |
|
let markname= strpart(a:markname,0,1) |
|
if markname !~ '\a' |
|
" handles 'a -> a styles |
|
let markname= strpart(a:markname,1,1) |
|
endif |
|
" call Decho("markname=".markname." strlen(a:markname)=".strlen(a:markname)) |
|
|
|
let lzkeep = &lz |
|
set lz |
|
let winposn = SaveWinPosn(0) |
|
|
|
if strlen(a:markname) <= 2 |
|
if exists("g:savemark_{markname}") && strlen(g:savemark_{markname}) != 0 |
|
" use global variable g:savemark_{markname} |
|
" call Decho("use savemark list") |
|
call RestoreWinPosn(g:savemark_{markname}) |
|
exe "norm! m".markname |
|
endif |
|
else |
|
" markname is a savemark command (string) |
|
" call Decho("use savemark command") |
|
let markcmd= strpart(a:markname,1) |
|
call RestoreWinPosn(markcmd) |
|
exe "norm! m".markname |
|
endif |
|
|
|
call RestoreWinPosn(winposn) |
|
let &lz = lzkeep |
|
|
|
" call Dret("RestoreMark") |
|
endfun |
|
|
|
" --------------------------------------------------------------------- |
|
" DestroyMark: {{{2 |
|
" call DestroyMark("a") -- destroys mark |
|
fun! DestroyMark(markname) |
|
" call Dfunc("DestroyMark(markname<".a:markname.">)") |
|
|
|
" save options and set to standard values |
|
let reportkeep= &report |
|
let lzkeep = &lz |
|
set lz report=10000 |
|
|
|
let markname= strpart(a:markname,0,1) |
|
if markname !~ '\a' |
|
" handles 'a -> a styles |
|
let markname= strpart(a:markname,1,1) |
|
endif |
|
" call Decho("markname=".markname) |
|
|
|
let curmod = &mod |
|
let winposn = SaveWinPosn(0) |
|
1 |
|
let lineone = getline(".") |
|
exe "k".markname |
|
d |
|
put! =lineone |
|
let &mod = curmod |
|
call RestoreWinPosn(winposn) |
|
|
|
" restore options to user settings |
|
let &report = reportkeep |
|
let &lz = lzkeep |
|
|
|
" call Dret("DestroyMark") |
|
endfun |
|
|
|
" --------------------------------------------------------------------- |
|
" QArgSplitter: to avoid \ processing by <f-args>, <q-args> is needed. {{{2 |
|
" However, <q-args> doesn't split at all, so this one returns a list |
|
" with splits at all whitespace (only!), plus a leading length-of-list. |
|
" The resulting list: qarglist[0] corresponds to a:0 |
|
" qarglist[i] corresponds to a:{i} |
|
fun! QArgSplitter(qarg) |
|
" call Dfunc("QArgSplitter(qarg<".a:qarg.">)") |
|
let qarglist = split(a:qarg) |
|
let qarglistlen = len(qarglist) |
|
let qarglist = insert(qarglist,qarglistlen) |
|
" call Dret("QArgSplitter ".string(qarglist)) |
|
return qarglist |
|
endfun |
|
|
|
" --------------------------------------------------------------------- |
|
" ListWinPosn: {{{2 |
|
"fun! ListWinPosn() " Decho |
|
" if !exists("b:cecutil_iwinposn") || b:cecutil_iwinposn == 0 " Decho |
|
" call Decho("nothing on SWP stack") " Decho |
|
" else " Decho |
|
" let jwinposn= b:cecutil_iwinposn " Decho |
|
" while jwinposn >= 1 " Decho |
|
" if exists("b:cecutil_winposn{jwinposn}") " Decho |
|
" call Decho("winposn{".jwinposn."}<".b:cecutil_winposn{jwinposn}.">") " Decho |
|
" else " Decho |
|
" call Decho("winposn{".jwinposn."} -- doesn't exist") " Decho |
|
" endif " Decho |
|
" let jwinposn= jwinposn - 1 " Decho |
|
" endwhile " Decho |
|
" endif " Decho |
|
"endfun " Decho |
|
"com! -nargs=0 LWP call ListWinPosn() " Decho |
|
|
|
" --------------------------------------------------------------------- |
|
" SaveUserMaps: this function sets up a script-variable (s:restoremap) {{{2 |
|
" which can be used to restore user maps later with |
|
" call RestoreUserMaps() |
|
" |
|
" mapmode - see :help maparg for details (n v o i c l "") |
|
" ex. "n" = Normal |
|
" The letters "b" and "u" are optional prefixes; |
|
" The "u" means that the map will also be unmapped |
|
" The "b" means that the map has a <buffer> qualifier |
|
" ex. "un" = Normal + unmapping |
|
" ex. "bn" = Normal + <buffer> |
|
" ex. "bun" = Normal + <buffer> + unmapping |
|
" ex. "ubn" = Normal + <buffer> + unmapping |
|
" maplead - see mapchx |
|
" mapchx - "<something>" handled as a single map item. |
|
" ex. "<left>" |
|
" - "string" a string of single letters which are actually |
|
" multiple two-letter maps (using the maplead: |
|
" maplead . each_character_in_string) |
|
" ex. maplead="\" and mapchx="abc" saves user mappings for |
|
" \a, \b, and \c |
|
" Of course, if maplead is "", then for mapchx="abc", |
|
" mappings for a, b, and c are saved. |
|
" - :something handled as a single map item, w/o the ":" |
|
" ex. mapchx= ":abc" will save a mapping for "abc" |
|
" suffix - a string unique to your plugin |
|
" ex. suffix= "DrawIt" |
|
fun! SaveUserMaps(mapmode,maplead,mapchx,suffix) |
|
" call Dfunc("SaveUserMaps(mapmode<".a:mapmode."> maplead<".a:maplead."> mapchx<".a:mapchx."> suffix<".a:suffix.">)") |
|
|
|
if !exists("s:restoremap_{a:suffix}") |
|
" initialize restoremap_suffix to null string |
|
let s:restoremap_{a:suffix}= "" |
|
endif |
|
|
|
" set up dounmap: if 1, then save and unmap (a:mapmode leads with a "u") |
|
" if 0, save only |
|
let mapmode = a:mapmode |
|
let dounmap = 0 |
|
let dobuffer = "" |
|
while mapmode =~ '^[bu]' |
|
if mapmode =~ '^u' |
|
let dounmap = 1 |
|
let mapmode = strpart(a:mapmode,1) |
|
elseif mapmode =~ '^b' |
|
let dobuffer = "<buffer> " |
|
let mapmode = strpart(a:mapmode,1) |
|
endif |
|
endwhile |
|
" call Decho("dounmap=".dounmap." dobuffer<".dobuffer.">") |
|
|
|
" save single map :...something... |
|
if strpart(a:mapchx,0,1) == ':' |
|
" call Decho("save single map :...something...") |
|
let amap= strpart(a:mapchx,1) |
|
if amap == "|" || amap == "\<c-v>" |
|
let amap= "\<c-v>".amap |
|
endif |
|
let amap = a:maplead.amap |
|
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|:sil! ".mapmode."unmap ".dobuffer.amap |
|
if maparg(amap,mapmode) != "" |
|
let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge') |
|
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|:".mapmode."map ".dobuffer.amap." ".maprhs |
|
endif |
|
if dounmap |
|
exe "sil! ".mapmode."unmap ".dobuffer.amap |
|
endif |
|
|
|
" save single map <something> |
|
elseif strpart(a:mapchx,0,1) == '<' |
|
" call Decho("save single map <something>") |
|
let amap = a:mapchx |
|
if amap == "|" || amap == "\<c-v>" |
|
let amap= "\<c-v>".amap |
|
" call Decho("amap[[".amap."]]") |
|
endif |
|
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|sil! ".mapmode."unmap ".dobuffer.amap |
|
if maparg(a:mapchx,mapmode) != "" |
|
let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge') |
|
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|".mapmode."map ".dobuffer.amap." ".maprhs |
|
endif |
|
if dounmap |
|
exe "sil! ".mapmode."unmap ".dobuffer.amap |
|
endif |
|
|
|
" save multiple maps |
|
else |
|
" call Decho("save multiple maps") |
|
let i= 1 |
|
while i <= strlen(a:mapchx) |
|
let amap= a:maplead.strpart(a:mapchx,i-1,1) |
|
if amap == "|" || amap == "\<c-v>" |
|
let amap= "\<c-v>".amap |
|
endif |
|
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|sil! ".mapmode."unmap ".dobuffer.amap |
|
if maparg(amap,mapmode) != "" |
|
let maprhs = substitute(maparg(amap,mapmode),'|','<bar>','ge') |
|
let s:restoremap_{a:suffix} = s:restoremap_{a:suffix}."|".mapmode."map ".dobuffer.amap." ".maprhs |
|
endif |
|
if dounmap |
|
exe "sil! ".mapmode."unmap ".dobuffer.amap |
|
endif |
|
let i= i + 1 |
|
endwhile |
|
endif |
|
" call Dret("SaveUserMaps : restoremap_".a:suffix.": ".s:restoremap_{a:suffix}) |
|
endfun |
|
|
|
" --------------------------------------------------------------------- |
|
" RestoreUserMaps: {{{2 |
|
" Used to restore user maps saved by SaveUserMaps() |
|
fun! RestoreUserMaps(suffix) |
|
" call Dfunc("RestoreUserMaps(suffix<".a:suffix.">)") |
|
if exists("s:restoremap_{a:suffix}") |
|
let s:restoremap_{a:suffix}= substitute(s:restoremap_{a:suffix},'|\s*$','','e') |
|
if s:restoremap_{a:suffix} != "" |
|
" call Decho("exe ".s:restoremap_{a:suffix}) |
|
exe "sil! ".s:restoremap_{a:suffix} |
|
endif |
|
unlet s:restoremap_{a:suffix} |
|
endif |
|
" call Dret("RestoreUserMaps") |
|
endfun |
|
|
|
" ============== |
|
" Restore: {{{1 |
|
" ============== |
|
let &cpo= s:keepcpo |
|
unlet s:keepcpo |
|
|
|
" ================ |
|
" Modelines: {{{1 |
|
" ================ |
|
" vim: ts=4 fdm=marker
|
|
|