2010-04-14 31 views
21

Có cách nào để tìm kiếm tất cả các bộ đệm mở cho một mẫu cụ thể không?emacs: tương tác tìm kiếm bộ đệm mở

C-s tương tác tìm kiếm bộ đệm hiện tại. Tương tự, có điều gì đó tìm kiếm tất cả các bộ đệm mở không?

Tôi biết tôi có thể sử dụng "xảy ra", nhưng "Xảy ra" mang đến bộ đệm mới và thay đổi/gây rối với tổ chức bộ đệm.

Trả lời

16

Tôi đã khắc phục TODO:

;; I know that string is in my Emacs somewhere! 
(require 'cl) 
(defcustom search-all-buffers-ignored-files (list (rx-to-string '(and bos (or ".bash_history" "TAGS") eos))) 
    "Files to ignore when searching buffers via \\[search-all-buffers]." 
    :type 'editable-list) 

(require 'grep) 
(defun search-all-buffers (regexp prefix) 
    "Searches file-visiting buffers for occurence of REGEXP. With 
prefix > 1 (i.e., if you type C-u \\[search-all-buffers]), 
searches all buffers." 
    (interactive (list (grep-read-regexp) 
        current-prefix-arg)) 
    (message "Regexp is %s; prefix is %s" regexp prefix) 
    (multi-occur 
    (if (member prefix '(4 (4))) 
     (buffer-list) 
    (remove-if 
     (lambda (b) (some (lambda (rx) (string-match rx (file-name-nondirectory (buffer-file-name b)))) search-all-buffers-ignored-files)) 
     (remove-if-not 'buffer-file-name (buffer-list)))) 

    regexp)) 

(global-set-key [f7] 'search-all-buffers) 
+0

Thx sử dụng nó ngay bây giờ – iobelix

+0

Nên có một '(yêu cầu 'cl)' trước khi điều này? Tôi không biết tại sao, nhưng điều đó đã sửa lỗi tôi nhận được. NB: Tôi là một noob lisp. – cammil

+0

cammil: Tôi nghĩ bạn đúng; "remove-if" và "remove-if-not" nằm trong thư viện "cl". – offby1

1

Mặc dù đây không phải chính xác những gì bạn đang yêu cầu, tôi tìm kiếm nhiều tệp bằng grep (M-X grep) và grep-find (M-X grep-find).

11

ibuffer có thể giúp bạn. Hãy xem bài viết this. Tôi tưởng tượng rằng điều này có thể thú vị nhất đối với bạn:

'O' - ibuffer-do-xảy ra - Làm xảy ra trên bộ đệm đã chọn. Điều này thực hiện tìm kiếm regex trên tất cả các vùng đệm đã chọn và hiển thị kết quả trong một cửa sổ xảy ra. Nó là không thể tin được hữu ích khi duyệt qua mã. Nó trở nên thực sự tuyệt vời khi bạn kết hợp nó với sức mạnh 'bộ lọc' của ibuffer (sắp tới). Ví dụ: Do C-x C-b, đánh dấu tất cả các tập tin bằng cách sử dụng (nói) Chế độ chính Perl, xảy ra để tìm hiểu tất cả các vị trí mà một hàm nhất định được đề cập trong các tệp này. Điều hướng đến điểm theo ý muốn thông qua cửa sổ Occur.

'M-s a C-s' - ibuffer-do-isearch - Thực hiện tìm kiếm gia tăng trong bộ đệm được đánh dấu. Điều này thật tuyệt vời đến nỗi bạn phải thử ngay lập tức. Chọn hai hoặc nhiều bộ đệm, nhấn phím nóng, tìm kiếm điều gì đó xảy ra trong tất cả các bộ đệm này. Hai tính năng một mình là đủ để làm cho tôi một fan hâm mộ suốt đời của IBuffer. Đi làm ngay đi!

+4

Bạn không cần ibuffer cho điều đó - menu đệm "chuẩn" hoạt động theo cùng một cách: đánh dấu một số bộ đệm và làm M-s C-s (hoặc M-x Buffer-menu-isearch-đệm). Nó sẽ được tốt đẹp nếu chức năng này đã được tổng quát để người ta không phải đánh dấu bộ đệm. Nó sẽ dễ thực hiện - có tồn tại một hàm multi-isearch-buffer, một cái chỉ cần cung cấp một danh sách các bộ đệm mở làm đối số của nó. –

+0

ý tưởng của offby1 là gần nhất với quy trình làm việc của tôi. thx – iobelix

+0

Cảm ơn bạn, Bozhidar B. & Leo A. Tôi đã muốn có một cách để tìm kiếm và cũng chỉ thay thế trong bộ đệm mở. Tôi không có ý kiến ​​rằng * Danh sách đệm * hỗ trợ bất cứ điều gì nhưng danh sách, truy cập và giết chết: giám sát rất lớn của tôi. –

1

Loại này làm những gì bạn muốn, trong đó khi bạn đã đến cuối kết quả phù hợp cho chuỗi/regexp bạn đang tìm kiếm, lệnh tìm kiếm tiếp theo sẽ bắt đầu trong bộ đệm mới.

(setq isearch-wrap-function 'isearch-bury-buffer-instead-of-wrap) 
(defun isearch-bury-buffer-instead-of-wrap() 
    "bury current buffer, try to search in next buffer" 
    (bury-buffer)) 

Nó không chuyển sang một bộ đệm khác nhau khi tìm kiếm thất bại, và khi bạn "sao lưu" kết quả tìm kiếm bằng cách nhấn < xóa lùi >, bạn sẽ không bật trở lại vào bộ đệm trước đã tìm kiếm .

7

Lấy một đầu mối từ bình luận của Leo để Bozhidar:

(defun my-isearch-buffers() 
    "isearch multiple buffers." 
    (interactive) 
    (multi-isearch-buffers 
    (delq nil (mapcar (lambda (buf) 
         (set-buffer buf) 
         (and (not (equal major-mode 'dired-mode)) 
          (not (string-match "^[ *]" (buffer-name buf))) 
          buf)) 
        (buffer-list))))) 

Bạn có thể phải tinh chỉnh các điều kiện bên trong and để lọc bất cứ loại khác bộ đệm bạn muốn bỏ qua.

+0

Cảm ơn bạn; điều này thật tuyệt vời. – Grumdrig

30

Đã cài đặt sẵn multi-occur-in-matching-buffers. Tôi sử dụng một phiên bản sửa đổi này (vì tôi luôn luôn muốn tìm kiếm tất cả các bộ đệm, và xác định một mẫu tên đệm mỗi lần là gây phiền nhiễu).

(defun my-multi-occur-in-matching-buffers (regexp &optional allbufs) 
    "Show lines matching REGEXP in all file-visiting buffers. 

Given a prefix argument, search in ALL buffers." 
    (interactive (occur-read-primary-args)) 
    (multi-occur-in-matching-buffers "." regexp allbufs)) 

(global-set-key (kbd "M-s /") 'my-multi-occur-in-matching-buffers) 

Để đảo ngược hành vi của các đối số tiền tố để các hành vi mặc định là để tìm kiếm tất cả đệm, thay đổi cuộc gọi đến:

(multi-occur-in-matching-buffers "." regexp (not allbufs)) 

(và, tất nhiên, cập nhật docstring phù hợp .)

+3

Rất đẹp. Người ta có thể dành một lượng thời gian vô hạn và tùy chỉnh emacs ... – Bogatyr

+0

Khi tôi sử dụng nó, nó chỉ nói "bộ đệm tìm kiếm 1" ngay cả khi tôi có 20 bộ đệm mở trong emacs. Tại sao lại thế? – johnbakers

+0

@johnbakers: Rất có thể là do 'nhiều lần xuất hiện trong bộ đệm phù hợp 'chỉ tìm kiếm bộ đệm truy cập tệp theo mặc định. Nếu bạn vượt qua một đối số tiền tố (đối số 'allbufs' tùy chọn) thì nó sẽ tìm kiếm tất cả các bộ đệm (khớp với tên bộ đệm chứ không phải tên tệp), nhưng tôi không vượt qua được đối số đó trong hàm của tôi, vì vậy các đối số tiền tố bị bỏ qua. Tôi đã sửa lỗi đó ngay bây giờ. Thay đổi '(multi-happen-in-matching-buffer". * "Regexp allbufs)' thành '(multi-occurrence-in-matching-buffer". * "Regexp (không phải allbufs))' nếu bạn muốn đảo ngược hành vi. – phils

1

Trong Icicles, Cc ' là lệnh 01., có thể tìm kiếm nhiều bộ đệm.

C-u C-c ' tìm kiếm bộ bộ đệm bạn chọn. Bạn có thể chọn bằng cách tự động lọc tên đệm bằng đầu vào minibuffer của mình, sau đó nhấn C-! để tìm kiếm tất cả các bộ đệm có tên phù hợp. Tương tự, C-99 C-c ' chỉ tìm kiếm các bộ đệm đang truy cập các tệp.

Giống như occurgrep, icicle-occur tìm kiếm từng dòng. Nói chung, thay vì sử dụng các dòng như ngữ cảnh tìm kiếm, bạn có thể sử dụng bất kỳ phần đệm nào cả. C-c ` (backquote thay vì báo giá) là lệnh icicle-search. Với một tiền tố không âm arg nó tìm kiếm một bộ đệm mà bạn chọn.

Điều đầu tiên bạn làm là cung cấp cho nó regexp xác định ngữ cảnh tìm kiếm. Ví dụ: nếu bạn cho nó .* thì nó hoạt động như icicle-occur: mỗi ngữ cảnh tìm kiếm là một dòng. Nếu bạn cung cấp cho nó một regexp chỉ khớp với các định nghĩa hàm thì đó là các ngữ cảnh tìm kiếm, v.v.

http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview

+0

Có thể là nó chỉ dành cho tôi, nhưng 'icicle-happen' được gọi với' C-c ''trong các emacs của tôi. – Adobe

+0

Phải - Tôi đã sửa lỗi đánh máy. Cám ơn. – Drew

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