Emacs копирует совпадающие строки - PullRequest
15 голосов
/ 18 февраля 2010

Как в Emacs легко скопировать все строки, соответствующие определенному регулярному выражению? Желательно выделять совпадающие строки, когда я печатаю.

occur добирается до полусмерти, копируя их в буфер, но добавляет множество дополнительных вещей.

Ответы [ 5 ]

28 голосов
/ 04 сентября 2013

Начиная с Emacs 24, occur действительно предоставляет простое решение:

C-u М-с o .*pattern.* RET

Когда вы используете C-u в качестве аргумента префикса, соответствующая часть каждой строки вставляется в буфер *Occur* без всех обычных украшений.

Обратите внимание, что поскольку используется только та часть строки, которая соответствует регулярному выражению (в отличие от обычного случая), вам необходим начальный и конечный .*, чтобы обеспечить захват всей строки.

Детали того, как occur обрабатывает аргументы, немного хитры, поэтому внимательно прочитайте Ch f occur RET , если вы хотите узнать больше .

12 голосов
/ 18 февраля 2010

Как насчет этого:

(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)))
9 голосов
/ 18 февраля 2010

Вы можете использовать keep-lines, чтобы получить то, что вы хотите, скопировать их, а затем отменить.Наоборот, есть также flush-lines, чтобы избавиться от ненужных линий.

2 голосов
/ 23 августа 2015

Вы можете установить пакет all. Затем M-x all позволяет редактировать все строки в буфере, соответствующие регулярному выражению. Вместо редактирования вы можете просто скопировать их.

2 голосов
/ 18 февраля 2010

Я давно этим пользуюсь:

    (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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...