Monday, January 26, 2015

Re: How to temporarily change Cursor color and change back

On Friday, January 23, 2015 at 3:00:49 PM UTC-5, Christian Brabandt
wrote:
>On Fr, 23 Jan 2015, Paul wrote:
>>Christian Brabandt:
>>>On Do, 04 Mär 2010, pansz wrote:
>>>> Script can use highlight command to change color, however, if a
>>>> script meant to change one color temporarily, it has no
>>>> knowledge about the previous setting.
>>>>
>>>> 1. the :hi Cursor is defined by my color scheme. 2. now in some
>>>> case a script change the cursor color to indicate a special
>>>> mode. 3. when the mode ends, the script want to change the
>>>> Cursor back but it has no knowledge about what is the highlight
>>>> of Cursor defined by user's color scheme.
>>> […]
>>>> Any work around? Thanks for all.
>>>
>>> Try the attached script. I was written quick and dirty fr a
>>> similar issue on this list. It already queries the font attribute,
>>> though this only works with a patched vim, currently.
>>
>> Christian Brabandt kindly donated a function "Hi" to save the
>> highlighting for a group (included at the very bottom).
>>
>> :hi CursorLine
>> CursorLine xxx term=underline cterm=underline guifg=white guibg=#002000
>>
>> I have groups for which not all keys are defined. They are saved
>> with a value of -1, which seems to be interpretted as an error:
>>
>> :echo Hi("CursorLine")
>> hi CursorLine term=underline ctermbg=-1 ctermfg=-1 guibg=#002000 cterm=underline guifg=white
>>
>> :exe Hi("CursorLine")
>> E421: Color name or number not recognized: ctermbg=-1 ctermfg=-1 guibg=#002000 cterm=underline guifg=white
>>
>> I've delved into vim code in years past, and I have an idea of how
>> long it will take. Unfortunately, I won't be doing that any time
>> soon. Is there a quick way to get around the problem? My vim version
>> info is:

Christian replied:
>>
>> let out='hi ' . a:1
>> for item in items(s:attr)
>> "if item[1] >=0
>> let out .= printf(" %s=%s", item[0], item[1])
>> "endif
>> endfor
>
> Try uncommenting the above if statement.

It works awesomely, Christian. Thanks! Code below, for posterity
(future usenet archivers in years to come). Unfortunately, I cannot
upload, so the wrap-around below will turn the code into a dog's
breakfast.
_____________________________________
fun! <sid>HiList()
redir => a | sil hi | redir end

let a=substitute(a, '\n\s\+', ' ', 'g')
let b=split(a,'\n')
call map(b, 'split(v:val, ''\s\+'')[0]')
if exists("g:items")
unlet g:items
endif
let g:items=[]
for val in b
call add(g:items, <sid>Hi(val))
endfor
endfun

fun! Hi(...)
let s:attr = {}
let s:attr1 = {'bold' : 0, 'italic': 0, 'reverse': 0, 'inverse': 0, 'underline': 0, 'undercurl': 0 , 'standout':0}
let s:query = ['fg', 'bg', 'sp', 'bold', 'italic', 'reverse', 'underline', 'undercurl', 'standout', 'font']

for key in s:query
for mode in ['term', 'cterm', 'gui']
if !empty(synIDattr(synIDtrans(hlID(a:1)), key, mode))
if key =~ 'fg\|bg' || (key=='sp' && mode=='gui')
let s:attr[mode . key]=synIDattr(synIDtrans(hlID(a:1)), key, mode)
elseif key=='font' && mode=='gui'
let s:attr[key]=synIDattr(synIDtrans(hlID(a:1)), key, mode)
else
let s:attr1[mode . key] = synIDattr(synIDtrans(hlID(a:1)), key, mode)
endif
endif
endfor
endfor

if has("gui_running")
let cmode='gui'
else
let cmode='cterm'
endif

for mode in ['term', 'cterm', 'gui']
if get(s:attr1, mode . 'italic') ||
\ get(s:attr1, mode . 'bold') ||
\ get(s:attr1, mode . 'reverse') ||
\ get(s:attr1, mode . 'underline') ||
\ get(s:attr1, mode . 'standout') ||
\ get(s:attr1, mode . 'undercurl')

let s:attr[mode] = get(s:attr1, mode . 'italic', '') ? 'italic,' : ''
let s:attr[mode] .= get(s:attr1, mode . 'bold', '') ? 'bold,' : ''
let s:attr[mode] .= get(s:attr1, mode . 'reverse', '') ? 'reverse,' : ''
let s:attr[mode] .= get(s:attr1, mode . 'underline', '') ? 'underline,' : ''
let s:attr[mode] .= get(s:attr1, mode . 'standout', '') ? 'standout,' : ''
let s:attr[mode] .= get(s:attr1, mode . 'undercurl', '') ? 'undercurl' : ''
endif
endfor

let out='hi ' . a:1
for item in items(s:attr)
if item[1] >=0
let out .= printf(" %s=%s", item[0], item[1])
endif
endfor
let out=substitute(out, ',\(\s\|$\)', ' ' , 'g')
if len(split(out, '\s\+')) == 2
let out=substitute(out, '^hi', '& clear', '')
endif
" echo out

return out
endfun

fun! <sid>SortLines()
" %s/^hi //ge
" %s/\s\+xxx//ge
"sort
let lines=getline(1,'$')
let i=1
for line in lines
let word=split(line, '\s\+')
let sort=[ word[0] ] + sort(word[1:])
call setline(i, join(sort))
let i+=1
endfor
endfun

"com! -nargs=1 -complete=highlight HI :call <sid>Hi(<q-args>)
"com! HIList :call <sid>HiList()
"com! CleanUp :call <sid>SortLines()

--
--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

---
You received this message because you are subscribed to the Google Groups "vim_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments: