how to search backwards for consecutive lines

10 views
Skip to first unread message

Christian Brabandt

unread,
Apr 24, 2013, 5:54:14 AM4/24/13
to v...@vim.org
(resent, because the original message seems to got lost)

Hi,
suppose you have the following file:

,----
| 1
| 2foo
| 3foo
| 4foo
| 5foo
| 6
| 7
| 8
`----

If the cursor is on line 1, I can jump to the end of the "foo" block by
using:
/^\(foo\n\)\+/e

Is there a similar way when searching backwards (e.g. the cursor is on
line 8 and I want to jump to beginning of line 2)?
?^\(foo\n\)\+ unfortunately jumps to the beginning of line 5. Can I make
Vim somehow behave consistent to the forwarding search?


regards,
Christian

LCD 47

unread,
Apr 24, 2013, 6:19:56 AM4/24/13
to v...@vim.org
This seems to work for your particular example, but I'm not sure it
is what you're looking for:

?^\(\nfoo\)\+?+

/lcd

John Little

unread,
Apr 24, 2013, 8:04:06 AM4/24/13
to vim...@googlegroups.com, v...@vim.org
On Wednesday, April 24, 2013 9:54:14 PM UTC+12, Christian Brabandt wrote:
> ... somehow behave consistent to the forwarding search?

Search *patterns* match from a point then implicitly forward, even if the search is backward. So ?^\(foo\n\)\+ matches on line 5, the pattern doesn't cross lines backwards.

You can chain searches together with ; though. To search backwards for a line beginning with foo, then backwards for a line not beginning with foo, then forward one line:

?^foo?;?^\(foo\)\@!?+

That doesn't work if the foos start on line 1, the + offset won't wrap around the file end or beginning, (this appears to me to be undocumented). If that's a problem,

?^foo?;?^\(foo\)\@!?;/^foo

will work ('ws' being on). Unfortunately, back references don't reach across the ;, so if your "foo" was long, you might want to use a variable:

:let p = "foo"
:exe '?^' . p . '?;?^\(' . p . '\)\@!?;/^' . p

HTH, John Little

Reply all
Reply to author
Forward
0 new messages