Suggestion: Highlight the search pattern in :g/.../# or :g/.../p

61 views
Skip to first unread message

Axel Bender

unread,
Mar 21, 2013, 5:51:50 AM3/21/13
to vim...@googlegroups.com
How about implementing a hightlighting of the pattern searched for in :g/.../ expressions? At times the resulting list is quite long and it is difficult to identify the pattern. Highlighting it would be of great benefit (at least for me...).

Christian Brabandt

unread,
Mar 21, 2013, 6:02:38 AM3/21/13
to vim...@googlegroups.com
Hi Axel!

On Do, 21 M�r 2013, Axel Bender wrote:

> How about implementing a hightlighting of the pattern searched for in :g/.../ expressions? At times the resulting list is quite long and it is difficult to identify the pattern. Highlighting it would be of great benefit (at least for me...).

Are you possibly looking for :set hls

regards,
Christian
--
Erfahrungen - das sind die vernarbten Wunden unserer Dummheit.
-- John Osborne

Ingo Karkat

unread,
Mar 21, 2013, 6:15:01 AM3/21/13
to vim...@googlegroups.com
On 21-Mar-13 11:02:38 +0100, Christian Brabandt wrote:

> On Do, 21 M�r 2013, Axel Bender wrote:
>
>> How about implementing a hightlighting of the pattern searched for in
>> :g/.../ expressions? At times the resulting list is quite long and it
>> is difficult to identify the pattern. Highlighting it would be of
>> great benefit (at least for me...).
>
> Are you possibly looking for :set hls

The default [cmd] for :g is :print; I think he wishes to have the pattern
highlighted in the :print output (which is plain text). Variants of :print and
:number that use the buffer's syntax highlighting (and 'hls') would indeed be nice.

-- regards, ingo

Jürgen Krämer

unread,
Mar 21, 2013, 6:50:53 AM3/21/13
to vim...@googlegroups.com

Hi,
the last time somebody asked this question I wrote this little function

function! PrintWithHighlighting()
let line = getline('.')
let ms = match(line, @/)
let me = matchend(line, @/)

if ms != -1
echohl none
echo strpart(line, 0, ms)
echohl Search
echon strpart(line, ms, me - ms)
echohl none
echon strpart(line, me, strlen(line))
else
echo line
endif
endfunction

command! P call PrintWithHighlighting()

You can use it like this

:g/you pattern/P

I have never tested it much and I think I did not get any feedback if
it behaved as wanted.

In the same thread somebody else replied with suggesting a script that
probably can be found on vim.org and might be tested more.
Alas, I cannot find the original thread at the moment.

Regards,
J�rgen

--
Sometimes I think the surest sign that intelligent life exists elsewhere
in the universe is that none of it has tried to contact us. (Calvin)

Jürgen Krämer

unread,
Mar 21, 2013, 6:56:00 AM3/21/13
to vim...@googlegroups.com

Hi again,
it misses at least one feature: it only highlights the first match on a
line.

> In the same thread somebody else replied with suggesting a script that
> probably can be found on vim.org and might be tested more.
> Alas, I cannot find the original thread at the moment.

Found it: http://vim.wikia.com/wiki/VimTip1141

Barry Arthur

unread,
Mar 21, 2013, 7:38:18 AM3/21/13
to vim...@googlegroups.com
On Thursday, March 21, 2013 5:51:50 PM UTC+8, Axel Bender wrote:
> How about implementing a hightlighting of the pattern searched for in :g/.../ expressions? At times the resulting list is quite long and it is difficult to identify the pattern. Highlighting it would be of great benefit (at least for me...).

function! PrintWithHighlighting()


let line = getline('.')
let ms = match(line, @/)
let me = matchend(line, @/)

while ms != -1
echohl none
echon strpart(line, 0, ms)


echohl Search
echon strpart(line, ms, me - ms)
echohl none

let line = strpart(line, me)


let ms = match(line, @/)
let me = matchend(line, @/)

endwhile
echon line . "\n"

Gary Johnson

unread,
Mar 21, 2013, 11:18:28 AM3/21/13
to vim...@googlegroups.com
On 2013-03-21, J�rgen Kr�mer wrote:
> Hi again,
>
> J�rgen Kr�mer wrote:

> > In the same thread somebody else replied with suggesting a script that
> > probably can be found on vim.org and might be tested more.
> > Alas, I cannot find the original thread at the moment.
>
> Found it: http://vim.wikia.com/wiki/VimTip1141

I've been using that one for years, probably since it appeared in
2006. It works great.

:g/pattern/PP

Regards,
Gary

Axel Bender

unread,
Mar 21, 2013, 2:12:51 PM3/21/13
to vim...@googlegroups.com
Thanks all!

Based on your input my final version (taking into account vim's number setting):

command! -nargs=? P :call PrintHighlighted(<q-args>)

function! PrintHighlighted(arg)
echo ""

if a:arg == "#" || &number
let l:lnum = line(".")

echohl LineNr
echon " " . repeat(" ", len(line("$")) - strlen(l:lnum)) . l:lnum . " "
echohl NONE
endif

let l:line = getline(".")
let l:pos = 0

while 1
let l:ms = match(l:line, @/, l:pos)

if l:ms == -1
echon strpart(l:line, l:pos)
return
endif

echon strpart(l:line, l:pos, l:ms - l:pos)

let l:me = matchend(l:line, @/, l:pos)

echohl MarkerBlue
echon strpart(l:line, l:ms, l:me - l:ms)
echohl NONE

if l:pos == l:me
echon strpart(l:line, l:me)
return
endif

let l:pos = l:me
endwhile
endfunction

Barry Arthur

unread,
Mar 21, 2013, 5:53:35 PM3/21/13
to vim...@googlegroups.com
The final version I added to SearchParty:

function! PrintWithHighlighting() range
  let lnum = a:firstline
  let lnum_len = len(line('$'))
  for line in getline(a:firstline, a:lastline)
    echohl LineNr
    echon printf("%*s ", lnum_len, lnum)
    echohl none
    let lnum += 1

    let ms = match(line, @/)
    let me = matchend(line, @/)
    while ms != -1
      echohl none
      echon strpart(line, 0, ms)
      echohl Search
      echon strpart(line, ms, me - ms)
      echohl none
      let line = strpart(line, me)
      let ms = match(line, @/)
      let me = matchend(line, @/)
    endwhile
    echon line . "\n"
  endfor
endfunction

command! -range P <line1>,<line2>call PrintWithHighlighting()




--
--
You received this message from the "vim_dev" 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 a topic in the Google Groups "vim_dev" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/vim_dev/V2vGo2CcHqU/unsubscribe?hl=en.
To unsubscribe from this group and all its topics, send an email to vim_dev+u...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



Choi, Jin-yong

unread,
Mar 21, 2013, 10:36:10 PM3/21/13
to vim...@googlegroups.com

How about using ‘:grep’ when searching through the entire file?

 

 

function! Grep(pattern)

    exe 'grep ' . a:pattern

    let @/ = substitute(a:pattern, '/\(.*\)/.*$', '\1', '')

    copen

endfunction

command! -nargs=+   Grep    call Grep(<q-args>) | set hls

 

cnoreabbrev   grep    Grep<Space>//<Space>%<C-Left><C-Left><Right><C-r>=Eatchar('\s')<CR>

 

(for Eatchar(), :helpgrep Eatchar )

 

 

I prefer Quickfix list more than ‘:print’ output. Just personal preference :)

You received this message because you are subscribed to the Google Groups "vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+u...@googlegroups.com.

Christian Brabandt

unread,
Mar 22, 2013, 3:03:16 AM3/22/13
to vim...@googlegroups.com
Hi Barry!
I think, you might be getting problems, if your pattern match is
zero-width, e.g. searching for :g/^/P might not work correctly.

regards,
Christian
--

Barry Arthur

unread,
Mar 22, 2013, 3:22:31 AM3/22/13
to vim_dev
Ooops! Good catch. I think this fixes it:

diff --git a/plugin/SearchParty.vim b/plugin/SearchParty.vim
index 373ffd3..2b194f7 100644
--- a/plugin/SearchParty.vim
+++ b/plugin/SearchParty.vim
@@ -282,7 +282,7 @@ function! PrintWithHighlighting() range
 
     let ms = match(line, @/)
     let me = matchend(line, @/)
-    while ms != -1
+    while ms != -1 && ms != me
       echohl none
       echon strpart(line, 0, ms)
       echohl Search
On 22 March 2013 15:03, Christian Brabandt <cbl...@256bit.org> wrote:
Hi Barry!

Choi, Jin-yong

unread,
Mar 22, 2013, 4:08:41 AM3/22/13
to vim...@googlegroups.com
On March 21, 2013 6:52 PM, Axel Bender wrote:

> How about implementing a highlighting of the pattern searched for in
:g/.../
> expressions? At times the resulting list is quite long and it is difficult
to
> identify the pattern. Highlighting it would be of great benefit (at least
for
> me...).


First of all, I apologize for violating the "mailing rule."
I think my previous e-mail is somehow strange-looking unlike others'. But I
didn't recognize the problem. Sorry for the confusion.


I want to suggest to use ':grep' for searching the text and highlighting
them.
Maybe ':grep' is not in your interest. But it could make something more
convenient cause we can get the result in Quickfix list.

Here is the code. Tested only on Windows platform and vim version is
currently 7.3.875.

function! Grep(pattern)
exe 'grep ' . a:pattern
let @/ = substitute(a:pattern, '/\(.*\)/.*$', '\1', '')
copen
endfunction
command! -nargs=+ Grep call Grep(<q-args>) | set hls

cnoreabbrev grep
Grep<Space>//<Space>%<C-Left><C-Left><Right><C-r>=Eatchar('\s')<CR>


for Eatchar(), :helpgrep Eatchar


Reply all
Reply to author
Forward
0 new messages