vim - Capture Line numbers of lines matching a search -
example:
search:
/lastword\s*\n\zs\(\s*\n\)\{6}\ze\s*startword
this search searches 6 empty lines between line ending "lastword" , line starting "startword"
i catch linenumbers of empty lines matching search.
is there way in vim?
you can use :g
, :number
(or :#
short) print out lines line numbers.
:g/lastword\s*\n\zs\(\s*\n\)\{6}\ze\s*startword/#
to capture content have use :redir
redirect output somewhere else. in case below redirect unamed register (@"
)
:redir @"|execute 'g/pattern/#'|redir end
note: must use :execute
:g
otherwise redir end
executed on each matching line :g
command.
now going print via :#
starting line not want (we want empty lines between foo
, bar
). can use range :#
command accomplish this.
:redir @"|execute 'g/foo\_.*bar/+,/bar/-#'|redir end
the range +,/bar/-
translate start next line (+
) , search bar
(/bar/
) subtract 1 line (-
). can simplify know number of empty lines should 6.
:redir @"|execute 'g/foo\_.*bar/+#6'|redir end
we can take further putting content new buffer , remove lines.
:redir @"|exe 'g/pattern/+#6'|redir end|new|pu|%s/\d\+\zs.*//|%le|g/^$/d
there lot going on here, idea capture output, open new buffer, paste content, , clean output.
alternative
alternatively awk might make bit easier. run following on current vim buffer:
:%!awk '/lastword\s*$/,/^\s*startword/ { if($0 ~ /^\s*$/) { print nr} }'
for more see:
:h :g :h :redir :h :exe :h :range :h :new :h :pu :h /\zs :h :le :h :d
Comments
Post a Comment