Tim,
I finally got to the point in my project where I could tryout
your code. In one sense your code was similar to some of
my attempts at using the match/highlight capability but
I 1) did not order the column/line correctly and, more
importantly, 2) I did not have a trailing '.' in the
match patterns.
If one is willing to create highlight groups on the fly,
then one can programatically highlight arbitrary
blocks of code ... W5!
function! XXX(name, c1, c2, l1, l2)
exec "highlight! " . a:name . " ctermbg=green guibg=green"
exec "sil! match " . a:name. ' /\%>' .a:c1. 'c\%<' .a:c2. 'c\%>'
.a:l1. 'l\%<' .a:l2. 'l./'
endfunction
map <Leader>h :call XXX("Foo33",8,21,5,14)<CR>
Thanks.
Richard Emberson
ps: 5W == Which Was What We Wanted
On 05/06/2012 05:12 PM, Tim Chase wrote:
> On 05/06/12 16:14, Richard wrote:
>> I'd like to highlight an arbitrary block of text even when
>> normal syntax-base highlighting is in effect.
>> Now, one can highlight a block of height 1 using matching:
>> :hi Green ctermbg=Green
>> :match Green /\%10l\%30c.*\%40c\%10l/
>> :match none
>> But what I'd like to do is for a block with height
>> greater than 1; something like what can be done
>> with Cntl-V visual block selection but without using
>> visual selection.
>> I've search the net without finding a solution.
>> Is it possible?
>
> I'm not sure if this does what you want, but I threw it together in
> the hopes that it was close. Just visually highlight the range
> (linewise, characterwise, or blockwise) that you want to highlight
> and press<f4>. Adjust the "Error" at the bottom for whatever
> highlighting group you want (in the case of your example, "Green")
>
> -tim
>
> function! Hi(scheme)
> let l:mode=visualmode()
> let [_, lnum1, col1, _]=getpos("'<")
> let [_, lnum2, col2, _]=getpos("'>")
> if l:mode == 'v'
> if lnum1==lnum2
> let range='\%'.lnum1.'l\%>'.(col1-1).'c.*\%<'.(col2+1).'c'
> else
> let range=join([
> \'\%'.lnum1.'l\%>'.(col1-1).'c.*',
> \'.*\%'.lnum2.'l\%<'.(col2+1).'c',
> \'\%>'.lnum1.'l\%<'.lnum2.'l',
> \], '\|')
> endif
> else
> let left=min([col1, col2])
> let right=max([col1, col2])
> let top=min([lnum1, lnum2])
> let bottom=max([lnum1, lnum2])
> if l:mode == 'V'
> let range=
> \'\%>'.(top-1).'l'.
> \'\%<'.(bottom+1).'l'.
> \'.'
> else " visual block
> let range=
> \'\%>'.(left-1).'c'.
> \'\%<'.(right+1).'c'.
> \'\%>'.(top-1).'l'.
> \'\%<'.(bottom+1).'l'.
> \'.'
> endif
> endif
> exec printf('sil! match %s /%s/', a:scheme, range)
> endfunction
> vnoremap<f4> :<c-u>call Hi("Error")<cr>
> nnoremap<f4> :match NONE<cr>
>
--
Quis custodiet ipsos custodes
--
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
Tuesday, May 8, 2012
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment