5 changed files with 1811 additions and 0 deletions
@ -0,0 +1,49 @@
@@ -0,0 +1,49 @@
|
||||
# Improved AnsiEsc.vim |
||||
|
||||
This is a [Vim script №302: AnsiEsc.vim](http://www.vim.org/scripts/script.php?script_id=302) |
||||
updated to [latest author's version](http://www.drchip.org/astronaut/vim/index.html#ANSIESC) |
||||
with several fixes/improvements. |
||||
|
||||
Download .zip/.vmb from http://www.vim.org/scripts/script.php?script_id=4979 |
||||
|
||||
## Changes |
||||
|
||||
* updated to latest author's version: **13e** (Dec 06, 2012) |
||||
* add support for simple ANSI sequences like "bold" (without defining color) |
||||
* add support for 16-color 'light' escape sequences (by Andy Berdan, merged from https://github.com/berdandy/AnsiEsc.vim) |
||||
* disable `\swp` and `\rwp` maps if `g:no_plugin_maps` or `g:no_cecutil_maps` exists |
||||
* disable DrChip/AnsiEsc menu if `g:no_drchip_menu` or `g:no_ansiesc_menu` exists |
||||
* add support for simple ANSI sequences like disable bold/italic/etc. |
||||
|
||||
## Original README |
||||
|
||||
This is a mirror of http://www.vim.org/scripts/script.php?script_id=302 |
||||
|
||||
Files with ANSI escape sequences look good when dumped onto a terminal that accepts them, but have been a distracting clutter when edited via vim. The AnsiEsc.vim file, when sourced, will conceal Ansi escape sequences but will cause subsequent text to be colored as the escape sequence specifies when used with Vince Negri's conceal patch. AnsiEsc.vim v3 or later uses the conceal patch to accomplish this. |
||||
|
||||
Without that conceal patch, the best that can be done is to suppress Ansi escape sequences with "Ignore" highlighting. AnsiEsc.vim v2 does that. |
||||
|
||||
### VIM Developer's Corner: |
||||
|
||||
Vince Negri's "conceal" patch to vim6.3 and vim7.0 allows one to suppress strings within a line; ie. in-line folding! This feature is ideal for Ansi escape sequence handling. Starting with AnsiEsc's version 3 the <AnsiEsc.vim> script makes use of that new capability to display Ansi-sequence containing files. The Ansi escape sequences themselves are concealed (except for the line where the cursor is), but they have their desired colorizing effect. Note that you must have Vim7.0 with the +conceal option for the latest <AnsiEsc.vim> (v8) to work. Apply Vince Negri's patch to the Vim 7.0 source code and compile Vim for "huge" features. Once you've done that, simply source the <AnsiEsc.vim> file in when you want to see Ansi-escape sequenced text in Vim. |
||||
|
||||
### Typical Compiling Directions: |
||||
|
||||
To use the AnsiEsc v2, just source it in when you wish to; your vim version needs +syntax, which is fairly common. |
||||
|
||||
To use the conceal-mode AnsiEsc (those with versions >= 3), you'll need to have a Vim that has been patched with Vince Negri's concealownsyntax patch; the version will show both +syntax and +conceal. |
||||
|
||||
Typical compiling directions: |
||||
|
||||
* cd ..wherever../vim70/ |
||||
* browse http://sites.google.com/site/vincenegri/ for the conceal/ownsyntax patch |
||||
* patch -p0 < conceal-ownsyntax.diff |
||||
* make distclean |
||||
* configure --with-features=huge |
||||
* make |
||||
* make install |
||||
|
||||
|
||||
(also see: vimtip#1308) |
||||
(alpha/beta version available at http://mysite.verizon.net/astronaut/vim/index.html#ANSIESC) |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
" AnsiEscPlugin.vim |
||||
" Author: Charles E. Campbell |
||||
" Date: Apr 07, 2010 |
||||
" Version: 13e |
||||
" --------------------------------------------------------------------- |
||||
" Load Once: {{{1 |
||||
if &cp || exists("g:loaded_AnsiEscPlugin") |
||||
finish |
||||
endif |
||||
let g:loaded_AnsiEscPlugin = "v13e" |
||||
let s:keepcpo = &cpo |
||||
set cpo&vim |
||||
|
||||
" --------------------------------------------------------------------- |
||||
" Public Interface: {{{1 |
||||
com! -bang -nargs=0 AnsiEsc :call AnsiEsc#AnsiEsc(<bang>0) |
||||
|
||||
" DrChip Menu Support: {{{2 |
||||
if !exists('g:no_drchip_menu') && !exists('g:no_ansiesc_menu') |
||||
if has("gui_running") && has("menu") && &go =~ 'm' |
||||
if !exists("g:DrChipTopLvlMenu") |
||||
let g:DrChipTopLvlMenu= "DrChip." |
||||
endif |
||||
exe 'menu '.g:DrChipTopLvlMenu.'AnsiEsc.Start<tab>:AnsiEsc :AnsiEsc<cr>' |
||||
endif |
||||
endif |
||||
|
||||
" --------------------------------------------------------------------- |
||||
" Restore: {{{1 |
||||
let &cpo= s:keepcpo |
||||
unlet s:keepcpo |
||||
" vim: ts=4 fdm=marker |
@ -0,0 +1,538 @@
@@ -0,0 +1,538 @@
|
||||
" cecutil.vim : save/restore window position |
||||
" save/restore mark position |
||||
" save/restore selected user maps |
||||
" Author: Charles E. Campbell |
||||
" Version: 18i ASTRO-ONLY |
||||
" Date: Oct 21, 2013 |
||||
" |
||||
" 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 = "v18i" |
||||
let s:keepcpo = &cpo |
||||
set cpo&vim |
||||
"DechoRemOn |
||||
|
||||
" ======================= |
||||
" Public Interface: {{{1 |
||||
" ======================= |
||||
|
||||
" --------------------------------------------------------------------- |
||||
" Map Interface: {{{2 |
||||
if !exists('g:no_plugin_maps') && !exists('g:no_cecutil_maps') |
||||
if !hasmapto('<Plug>SaveWinPosn') |
||||
map <unique> <Leader>swp <Plug>SaveWinPosn |
||||
endif |
||||
if !hasmapto('<Plug>RestoreWinPosn') |
||||
map <unique> <Leader>rwp <Plug>RestoreWinPosn |
||||
endif |
||||
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 |
Loading…
Reference in new issue