【发布时间】:2011-01-18 09:26:51
【问题描述】:
在 Emacs 中,如何轻松复制与特定正则表达式匹配的所有行?最好在我输入时突出显示匹配的行。
occur 将它们复制到缓冲区中,但它增加了很多额外的东西。
【问题讨论】:
标签: emacs
在 Emacs 中,如何轻松复制与特定正则表达式匹配的所有行?最好在我输入时突出显示匹配的行。
occur 将它们复制到缓冲区中,但它增加了很多额外的东西。
【问题讨论】:
标签: emacs
这个怎么样:
(defun copy-lines-matching-re (re)
"find all lines matching the regexp RE in the current buffer
putting the matching lines in a buffer named *matching*"
(interactive "sRegexp to match: ")
(let ((result-buffer (get-buffer-create "*matching*")))
(with-current-buffer result-buffer
(erase-buffer))
(save-match-data
(save-excursion
(goto-char (point-min))
(while (re-search-forward re nil t)
(princ (buffer-substring-no-properties (line-beginning-position)
(line-beginning-position 2))
result-buffer))))
(pop-to-buffer result-buffer)))
【讨论】:
.emacs.d
我已经愉快地使用了很长时间:
(defun occur-mode-clean-buffer ()
"Removes all commentary from the *Occur* buffer, leaving the
unadorned lines."
(interactive)
(if (get-buffer "*Occur*")
(save-excursion
(set-buffer (get-buffer "*Occur*"))
(fundamental-mode)
(goto-char (point-min))
(toggle-read-only 0)
(set-text-properties (point-min) (point-max) nil)
(if (looking-at (rx bol (one-or-more digit)
(or " lines matching \""
" matches for \"")))
(kill-line 1))
(while (re-search-forward (rx bol
(zero-or-more blank)
(one-or-more digit)
":")
(point-max)
t)
(replace-match "")
(forward-line 1)))
(message "There is no buffer named \"*Occur*\".")))
(define-key occur-mode-map (kbd "C-c C-x") 'occur-mode-clean-buffer)
【讨论】:
您可以使用keep-lines 获取您想要的内容,复制它们,然后撤消。反之,还有flush-lines可以去掉你不想要的线条。
【讨论】:
从 Emacs 24 开始,occur 实际上提供了一个简单的解决方案:
C-uM-so .*pattern.* RET
当您单独使用 C-u 作为前缀参数时,每行的匹配部分被插入到*Occur* 缓冲区中,没有所有正常的修饰。
请注意,由于仅使用与正则表达式匹配的行的一部分(与正常情况不同),因此您需要前导和尾随 .* 以确保捕获整行。
occur 如何处理参数的细节有点棘手,如果你愿意,请仔细阅读 Chf occur RET了解更多。
【讨论】:
occur 应该有一个选项,不需要改变模式来匹配整行 - 它的基本目的是找到匹配的行,应该有办法告诉它不要使用发生模式。
您可以安装包all。然后M-x all 允许您编辑缓冲区中与正则表达式匹配的所有行。无需编辑,您也可以复制它们。
【讨论】: