Bagaimana cara menemukan teks di banyak buffer terbuka?

36

Katakanlah saya memiliki 10 buffer terbuka, dan saya ingin menemukan semua kejadian blahdi semua 10 buffer. Bagaimana saya melakukan ini?

nixeagle
sumber

Jawaban:

31

Menempel perintah Emacs bawaan, Anda dapat menggunakan multi-occuratau multi-occur-in-matching-buffers( M-x multi-occur- TAB RET). multi-occurmemberi Anda kontrol yang baik dengan meminta setiap buffer untuk digunakan, tetapi itu membosankan. multi-occur-in-matching-buffersmemungkinkan Anda memasukkan regexp untuk mencocokkan nama file (hanya mencari dalam buffer yang mengunjungi file); masukkan .sebagai regexp file untuk mencari di semua buffer yang mengunjungi file.

Ada juga fungsi untuk pencarian tambahan di seluruh daftar buffer atau file, tetapi mereka membosankan seperti multi-occurkarena mereka membutuhkan daftar buffer atau file satu per satu.

Untuk mencari di semua file dalam direktori, atau file yang cocok dengan pola tertentu, apakah itu terbuka atau tidak, Anda dapat menggunakan grep. Ada varian rgrepdan grep-finduntuk mencari subdirektori secara rekursif.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
5
+1 untuk menyebutkan itu .adalah ekspresi reguler untuk mencocokkan semua file.
user2699
12

Selain apa yang orang lain sebutkan - di sini ada dua sumber daya lain untuk ini.

  1. M-x multi-isearch-buffersatau M-x multi-isearch-buffers-regexp(vanilla Emacs) - Pencarian bertahap di beberapa buffer.

  2. Jika Anda menggunakan Icicles maka Anda dapat menggunakan icicle-search(atau icicle-occur, atau sejumlah icicle-searchspesialisasi lainnya ) untuk mencari di beberapa file atau buffer.

(Selain mencari dan mengganti buffer sewenang-wenang , tentu saja ada perintah yang melakukan itu di beberapa file . Yang lain telah disebutkan grep, misalnya. Dan tentu saja ada Adi Dired. Tapi Anda tidak bertanya tentang mencari file.)

Drew
sumber
10

Ini dapat dilakukan dengan helm melalui perintah helm-multi-occur. Anda dapat menginstal helm dari melpa dan kemudian memanggil perintah sebagai berikut:

M-x helm-multi-occur RET M-a RET

Ini akan terbuka helm-multi-occurdan kemudian pilih semua buffer. Alih-alih menggunakan M-auntuk menandai semua buffer, Anda dapat memilih buffer yang diminati satu per satu. Navigasi naik dan turun daftar dengan C-ndan C-pdan tandai buffer dengan C-SPC. Setelah semua buffer ditandai, tekan RETuntuk menerima buffer yang ditandai dan mulai mencari.

Jika Anda menambahkan berikut ini ke file init Anda:

(require 'helm-regexp)
(eval-after-load "helm-regexp"
  '(setq helm-source-moccur
    (helm-make-source "Moccur" 'helm-source-multi-occur :follow 1)))

;; (source: http://stackoverflow.com/q/14726601)
(defun my-helm-multi-occur-buffers ()
  "multi-occur in all buffers backed by files."
  (interactive)
  (helm-multi-occur
   (delq nil
     (mapcar (lambda (b)
           (when (buffer-file-name b) (buffer-name b)))
         (buffer-list)))))

Anda kemudian dapat mengikat perintah my-helm-multi-occur-buffersuntuk melakukan multi- kejadian di semua buffer yang didukung oleh file.

nispio
sumber
3
Anda mungkin juga ingin melihat helm-swooppaket dalam MELPA. Ini menyediakan fungsi ini dan memungkinkan pengeditan cepat hasil juga.
Vamsi
9

swiper-alldari paket swiper menyediakan alat untuk melakukan ini. Itu bahkan tambahan, sehingga diperbarui saat Anda mengetik.

masukkan deskripsi gambar di sini

Wilfred Hughes
sumber
ini bagus! nice find
abourget
6

Anda dapat menggunakan ibuffermode untuk menandai buffer yang ingin Anda cari. Panggil ibuffer-do-isearch(terikat M-s a C-ssecara default) untuk mencari teks, atau ibuffer-do-isearch-regexpjika Anda perlu mencari ekspresi reguler.

Jika Anda tidak terbiasa ibuffer, jalankan dan lihat menu Mark untuk melihat semua cara Anda dapat memilih satu set buffer yang akan digunakan.

glukas
sumber
1

Berikut adalah cara lain dengan helm: M-x helm-mini M-a C-s blah. Setelah memohon helm-mini, M-aakan menandai semua buffer pembukaan kemudian C-s blahakan melakukan multi terjadi pada buffer ditandai.

xuchunyang
sumber
0

Juga, solusi menggunakan mode helm adalah dengan helm-swoop.

Menggunakan

M-x helm-swoop RET

kemudian, untuk mencari di semua buffer terbuka, ketik

M-i

lalu, cukup ketik blahuntuk mencarinya di semua buffer. Pada jendela yang berbeda akan ditampilkan semua kejadian.

Atau, Anda bisa mengetik

M-x helm-multi-swoop

kemudian, tandai semua buffer yang ingin Anda cari dengan M-SPCatau C-SPC, tekan RETdan cari blah.

Lucas Moreira
sumber