2010-02-18 38 views
12

Trong Emacs làm thế nào tôi có thể dễ dàng sao chép tất cả các dòng khớp với một regex cụ thể? Tốt hơn là làm nổi bật các dòng phù hợp khi tôi nhập.Emacs sao chép các dòng phù hợp

occur được chia sẻ ở đó bằng cách đối phó chúng thành bộ đệm nhưng sẽ bổ sung thêm nhiều nội dung bổ sung.

Trả lời

11

Làm thế nào về điều này:

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

Bạn làm điều này nhanh đến mức nào? Nó cũng là một giải pháp hoàn toàn khác với giải pháp tôi mong đợi. Tôi đã giả sử nó sẽ sử dụng chế độ xảy ra. Cảm ơn. – Singletoned

+0

Um ... đó là một loại điều phổ biến để làm. Có thực sự chỉ có 3 điều xảy ra ở đây. 1) tạo bộ đệm, 2) tìm kiếm bộ đệm hiện tại, 3) chèn kết quả tìm kiếm vào bộ đệm mới ... –

2

Tôi đã sử dụng này hạnh phúc trong một thời gian dài:

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

Bạn có thể sử dụng keep-lines để có được những gì bạn muốn, sao chép chúng, và sau đó lùi lại . Ngược lại, cũng có flush-lines để loại bỏ các dòng bạn không muốn.

21

Tính đến Emacs 24, occur nào trên thực tế cung cấp một giải pháp đơn giản:

CủMso.*pattern.*RET

Khi bạn sử dụng Củ ngày của riêng mình như đối số tiền tố, phần khớp của mỗi dòng được chèn vào bộ đệm *Occur*, mà không có tất cả các trang nghiêm bình thường. Lưu ý rằng vì chỉ có một phần của dòng phù hợp với regexp được sử dụng (không giống như bình thường xảy ra), bạn cần hàng đầu và theo sau .* để đảm bảo rằng bạn chụp toàn bộ dòng.

Các chi tiết về cách occur xử lý đối số là một chút khó khăn, vì vậy đọc C-hfoccurRET cẩn thận nếu bạn muốn biết thêm.

+0

Làm việc như một sự quyến rũ! Đây sẽ là câu trả lời được chấp nhận ngay bây giờ. :) –

2

Bạn có thể cài đặt gói all. Sau đó, M-x all cho phép bạn chỉnh sửa tất cả các dòng trong bộ đệm phù hợp với một regexp. Thay vì chỉnh sửa, bạn cũng có thể sao chép chúng.

Các vấn đề liên quan