On 04/10/12 16:49, Zarko Coklin wrote:
1. dog
2. cat       //<- I want to keep this line and one line above and one line below
3. mouse
4. cow
5. horse
6. dolphin
7. whale
8. cat      //<- I want to keep this line and one line above and one line below
9. sheep
10. bat

I think to do this, it would be easiest to do some sort of decorate/process/undecorate pass such as

  :g/cat/sil! -,+>
  :v/^\s/d
  :%<

which works with your example (where everything is left-justified). Your decoration and deletion-of-undecorated could be any other marker such as

  :%s/.*cat/XXX&
  :v/^XXX/d
  :%s/^XXX

Alternatively, you can do it in one pass:

  :v/cat\|.*\n.*cat\|\%(cat.*\n\)\@<=./d

which basically just enumerated the 3 conditions on which a line can match ("cat" is on the line, there's stuff followed by a newline followed by stuff containing "cat", or you assert that the previous line contains "cat").

The first one scales better to greater numbers of context lines (you can easily adjust the number of lines backwards & forwards, or do the adjustment with searches rather than relative line-number offsets); while for your particular case, the all-in-one might be easier.

I believe the following command does something similar to what I need

:g/192.168.4.2:5120 ->/z#.3

It warms my grey-beard heart to see other people employing the very underutilized :z family of commands. :-)

-tim





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

Reply via email to