如何emacs中通过keep-lines实现当前匹配行及下一行筛选

如题,想在emacs中用keep-lines命令实现匹配满足条件行及下一行,尝试了很久都没实现,我知道在知乎上VIM提取/删除匹配行的方法(与Emacs keep-lines比较) - 知乎中用vim的g命令:g//+0, +1 m$ 可以实现,而且我也实验成功了,但在emacs中只是用keep-lines的话这个就比较麻烦了,我搜索了很多资料,目前能够得到的信息是,通过(keep-lines REGEXP &optional RSTART REND INTERACTIVE)可以实现。但在具体实验中有以下问题

  1. (一)REGEXP写起来比较难,在水木社区里搜到的相关帖子是关于emacs的这个regexp,哪位朋友能帮忙解释一下,谢谢!,这里面的正则\(^\([ \t]\)#\+BEGIN_SRC:?\([ \t]+\([^ \t\n]+\)\)?\(.\)\n\([^\000]+? \n\)[ \t]#\+END_SRC.\n?\)\|\(^\([ \t]\)#\+BEGIN_EXAMPLE:?\(?:[ \t]+\ (.\)\)?\n\([^\000]+?\n\)[ \t]#\+END_EXAMPLE.\n?\)太麻烦了,看着都头晕,单独截取后面的([^\000]+?\n)做了若干次实验都不成功
  2. (keep-lines REGEXP &optional RSTART REND INTERACTIVE)这个表达式中的RSTART. REND INTERACTIVE 具体实现起来该怎么写,目前通过M-:执行 (keep-lines REGEXP &optional RSTART REND INTERACTIVE)这一表达式的实验结果只知道RSTART REND是代表变量, REGEXP 好像是要用“”包围起来使用,INTERACTIVE还不知道。其中RSTART REND是表示一段范围,好像是整个buffer中的选择范围
  3. (keep-lines REGEXP &optional RSTART REND INTERACTIVE)这一表达式的使用在本需求中是不是通过M-x直接调用keep-lines后写出匹配的REGEXP后即可以实现,还是要通过M-: (keep-lines REGEXP &optional RSTART REND INTERACTIVE)的执行来实现

如果是我的话,我会:

  • 光标移到 buffer 开头,开始录制键盘宏。
  • set-mark-command
  • 搜索你需要的正则,跳到第一个匹配处。跳到行首。
  • 现在你不需要的部分应该已经在 active region 里了,敲退格删掉它。
  • 移到下下一行开头。
  • 结束录制,回放。

这确实是一种可行的方法,给我提供了另一种思路,多谢!不过关于正则表达式这一块我还是没弄懂,还是希望能够解决一下,因为以后可能有这方面正则表达的需求

今天又试了一下,发现在spacemacs中居然可以直接用vim命令操作,太神奇了,只是速度稍慢。另外在qq群中有群友lb001指教 可以用:grep -A 1 的方式去操作,也很简单。不过目前在我的Windows电脑上这个还有点问题,可能是因为path中的grep设置有问题,目前还没解决。另外问题中说的g//+0 +1 m$方法写得有问题,应该是 g//+0,+1 m$,在0,和+1之间漏了一个逗号,已更正。