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:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Feb 19 2014 10:14:40)
Included patches: 1-182
Compiled by <cygwin-xfree_AT_cygwin.com>
Huge version with GTK2 GUI.  Features included (+) or not (-):
+acl             +dialog_con_gui  +insert_expand   +mouse_sgr       +ruby/dyn   
     +vertsplit
+arabic          +diff            +jumplist        -mouse_sysmouse  +scrollbind 
     +virtualedit
+autocmd         +digraphs        +keymap          +mouse_urxvt     +signs      
     +visual
+balloon_eval    +dnd             +langmap         +mouse_xterm     
+smartindent     +visualextra
+browse          -ebcdic          +libcall         +multi_byte      -sniff      
     +viminfo
++builtin_terms  +emacs_tags      +linebreak       +multi_lang      
+startuptime     +vreplace
+byte_offset     +eval            +lispindent      -mzscheme        +statusline 
     +wildignore
+cindent         +ex_extra        +listcmds        +netbeans_intg   
-sun_workshop    +wildmenu
+clientserver    +extra_search    +localmap        +path_extra      +syntax     
     +windows
+clipboard       +farsi           +lua/dyn         +perl/dyn        +tag_binary 
     +writebackup
+cmdline_compl   +file_in_path    +menu            +persistent_undo 
+tag_old_static  +X11
+cmdline_hist    +find_in_path    +mksession       +postscript      
-tag_any_white   -xfontset
+cmdline_info    +float           +modify_fname    +printer         -tcl        
     +xim
+comments        +folding         +mouse           +profile         +terminfo   
     +xsmp_interact
+conceal         -footer          +mouseshape      +python/dyn      
+termresponse    +xterm_clipboard
+cryptv          +fork()          +mouse_dec       +python3/dyn     
+textobjects     -xterm_save
+cscope          +gettext         -mouse_gpm       +quickfix        +title      
     +xpm
+cursorbind      -hangul_input    -mouse_jsbterm   +reltime         +toolbar    
     
+cursorshape     +iconv           +mouse_netterm   +rightleft       
+user_commands   
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/etc"
 f-b for $VIMRUNTIME: "/usr/share/vim/vim74"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK  -D_REENTRANT 
-I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 
-I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 
-I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 
-I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 
-I/usr/include/libpng15 -I/usr/include/harfbuzz   -I/usr/include/ncursesw  
-ggdb -O2 -pipe -Wimplicit-function-declaration 
-fdebug-prefix-map=/usr/src/ports/vim/vim-7.4.182-1.x86_64/build=/usr/src/debug/vim-7.4.182-1
 
-fdebug-prefix-map=/usr/src/ports/vim/vim-7.4.182-1.x86_64/src/vim74=/usr/src/debug/vim-7.4.182-1
 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1      
Linking: gcc   -L.   -L/usr/local/lib -Wl,--as-needed -o vim.exe   
-lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangocairo-1.0 -lXinerama -lXi -lXrandr 
-lXcursor -lXcomposite -lXdamage -lgdk_pixbuf-2.0 -lpangoft2-1.0 -lgio-2.0 
-lXfixes -lcairo -lpixman-1 -lxcb-shm -lxcb-render -lXrender -lXext -lX11 -lxcb 
-lXau -lXdmcp -lpng15 -lharfbuzz -lpango-1.0 -lm -lfontconfig -lexpat 
-lfreetype -lz -lbz2 -lgmodule-2.0 -lgobject-2.0 -lffi -lglib-2.0 -lintl 
-liconv -lpcre   -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE  -lm -lelf    
-lncursesw -liconv -lintl   -Wl,--enable-auto-import -Wl,--export-all-symbols 
-Wl,--enable-auto-image-base -fstack-protector  
-L/usr/lib/perl5/5.14/x86_64-cygwin-threads/CORE -lperl -ldl -lcrypt       
--------------------------------------------------
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

-- 
-- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to