how to search backwards for consecutive lines

10 Aufrufe
Direkt zur ersten ungelesenen Nachricht

Christian Brabandt

ungelesen,
24.04.2013, 05:54:1424.04.13
an 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

ungelesen,
24.04.2013, 06:19:5624.04.13
an 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

ungelesen,
24.04.2013, 08:04:0624.04.13
an 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

Allen antworten
Antwort an Autor
Weiterleiten
0 neue Nachrichten