【问题标题】:Emacs copy matching linesEmacs 复制匹配行
【发布时间】:2011-01-18 09:26:51
【问题描述】:

在 Emacs 中,如何轻松复制与特定正则表达式匹配的所有行?最好在我输入时突出显示匹配的行。

occur 将它们复制到缓冲区中,但它增加了很多额外的东西。

【问题讨论】:

    标签: emacs


    【解决方案1】:

    这个怎么样:

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

    【讨论】:

    • 你怎么做的这么快?这也是我所期待的完全不同的解决方案。我假设它会使用发生模式。谢谢。
    • 嗯...这是一种常见的事情。这里真的只有三件事发生。 1)创建一个缓冲区,2)搜索当前缓冲区,3)在新缓冲区中插入搜索结果...
    • 我刚刚用谷歌搜索了这个,发现了我自己 10 多年前的问题。我真的应该把它放在我的.emacs.d
    【解决方案2】:

    我已经愉快地使用了很长时间:

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

    【讨论】:

      【解决方案3】:

      您可以使用keep-lines 获取您想要的内容,复制它们,然后撤消。反之,还有flush-lines可以去掉你不想要的线条。

      【讨论】:

        【解决方案4】:

        从 Emacs 24 开始,occur 实际上提供了一个简单的解决方案:

        C-uM-so .*pattern.* RET

        当您单独使用 C-u 作为前缀参数时,每行的匹配部分被插入到*Occur* 缓冲区中,没有所有正常的修饰。

        请注意,由于仅使用与正则表达式匹配的行的一部分(与正常情况不同),因此您需要前导和尾随 .* 以确保捕获整行。

        occur 如何处理参数的细节有点棘手,如果你愿意,请仔细阅读 Chf occur RET了解更多。

        【讨论】:

        • 像魅力一样工作!这应该是现在公认的答案。 :)
        • 我不同意 - 我认为 occur 应该有一个选项,不需要改变模式来匹配整行 - 它的基本目的是找到匹配的行,应该有办法告诉它不要使用发生模式。
        【解决方案5】:

        您可以安装包all。然后M-x all 允许您编辑缓冲区中与正则表达式匹配的所有行。无需编辑,您也可以复制它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-24
          • 1970-01-01
          • 2012-01-02
          • 1970-01-01
          • 2014-01-09
          • 2011-12-08
          • 1970-01-01
          相关资源
          最近更新 更多