Tuesday, May 8, 2012

Re: Highlighting block of text

On 8 May 2012, at 23:08, Richard wrote:

> Well, I spoke too soon. What I wanted was to highlight
> multiple block with different colors *at the same time*
> Seems that match only works on a single pattern at a time.
>
> Richard

You could try generating a random name for each block? or base it off the line/column pairs?

Regards, Andy


>
> On May 8, 3:01 pm, richard emberson <richard.ember...@gmail.com>
> wrote:
>> 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

--
Andrew Long
andrew dot long at mac dot com





--
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

No comments: