Buka file secara rekursif yang cocok dengan regexp di direktori yang ditandai

9

Secara umum, saya ingin dapat membuka semua file dalam satu set direktori tertentu (dan subdirektori mereka) di mana nama file cocok dengan regexp yang diberikan.

Sebagai contoh

  /home/nispio/project:
  total used in directory 1612 available 1000000000
  drwxrwxr-x 13 nispio group    4096 Sep 19 14:06 .
  drwxrwxr-x  7 nispio group    4096 Sep 22 16:41 ..
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 cfg
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 hlp
* drwxrwxr-x  2 nispio group    4096 Sep 23 16:52 hst
* drwxrwxr-x  2 nispio group    4096 Sep 29 14:52 inc
* drwxrwxr-x  2 nispio group    4096 Oct  1 12:53 lib
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 mcr
  drwxrwxr-x  2 nispio group    4096 Sep 24 10:50 pyl
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 snr
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 unix

Saya telah menandai direktori hst, incdan lib, dan sekarang saya ingin mengunjungi semua file dengan ekstensi .c, .ccdan .hdalam tiga direktori dan subdirektori mereka.

Akan lebih baik jika saya bisa melihat semua yang saya buka sebelum saya membukanya. Jika buffer dired telah diperbarui untuk menunjukkan kepada saya semua file yang cocok dengan pencarian saya, dan semua itu disorot, saya bisa melakukan pemeriksaan kewarasan untuk memastikan bahwa pencarian saya mengembalikan apa yang saya harapkan.

Saya terbuka untuk saran untuk melakukan hal yang sama menggunakan helmatau dired+atau ekstensi lain yang akan membiarkan saya menavigasi sistem file saya lebih mudah.

nispio
sumber
Apakah Mathias atau Drew menjawab pertanyaan Anda? Atau apakah Anda mencari sesuatu yang berbeda?
Malabarba

Jawaban:

14

Coba ini:

C-u C-x d

Ini memungkinkan Anda memasukkan argumen tentang bagaimana Dired harus membuat daftar file. Secara default dikatakan -aldi prompt. Tambahkan Ritu, diakhiri dengan -alR. Jenis RET.

Pilih / ketik direktori lalu tekan RET.

Ini akan secara rekursif membuka semua direktori dari yang Anda pilih, dan di bawah ini.

Dari sini, ketik % muntuk menandai semua file yang cocok dengan pola nama file tertentu. Saya juga sering mengetik tdan kemudian kmembunuh (menyembunyikan) semua file yang saya tidak tertarik. Ketik tlagi untuk menandai semua file.

Sejauh sebenarnya membuka file, saya tidak berpikir ada cara standar untuk melakukannya, tetapi Anda dapat dengan mudah mendefinisikan perintah baru untuk melakukannya (letakkan di .emacsfile Anda ):

(defun dired-find-marked-files ()
 (interactive)
 (dolist (f (dired-get-marked-files)) 
  (find-file f)))

Kemungkinan besar seseorang telah memasukkan ini dalam beberapa paket perangkat tambahan Dired yang bagus, tetapi menyenangkan juga melakukannya sendiri;)

Nikmati!

Mathias Dahl
sumber
7

Anda dapat melakukan ini dengan mudah dengan helm-projectile-find-file . Karena Proyile melacak setiap file dengan jalur relatifnya, Anda dapat dengan mudah mempersempitnya menjadi apa saja. Mari kita gunakan contoh Anda. Dalam kasus Anda, Anda ingin membuka file di hst, inc, dan lib. Anda dapat mengambil semua file milik direktori ini dengan dua cara:

  • Di Helm prompt helm-projectile-find-file, masukkan setiap direktori dan file yang ditandai menyempit ke direktori itu. Misalnya, pertama saya masukkan ^hst/(yang menyempit ke semua file yang berisi hst/di awal setiap kandidat). Tandai semua file denganM-a , lakukan sesuatu yang mirip untuk file di dua direktori lainnya.

  • Atau, Anda dapat mengambil file dalam semua direktori menggunakan pola ini : ^hst/\|^inc\|^lib. Helm menerima regex setelah semua. Regex \|artinya or. Lakukan ini jika Anda ingin memilih semuanya sekaligus.

Dengan salah satu dari ini, Anda akan menandai semua file yang ingin Anda buka. Kemudian cukup tekan RETuntuk membuka semuanya.

Harap dicatat bahwa jika Anda memiliki banyak file di direktori tersebut, Anda perlu menambah helm-candidate-number-limit. Jika tidak, begitu jumlah kandidat mencapai batas, tidak ada lagi kandidat yang ditampilkan dan Anda tidak dapat memilih kandidat yang tidak terlihat. Setel ke angka yang lebih tinggi atau setel ke niljika Anda tidak menginginkan batas ini.

Hal baiknya dengan Helm adalah Anda dapat memilih file secara interaktif.

Tu Do
sumber
Saya pikir dia ingin membuka semuanya secara bersamaan, bukan memilih salah satu dari mereka.
Malabarba
1
@ Malabarba Anda dapat memilih banyak file dengan M-amenggunakan helm-projectile-find-filedan tekan RET sekali untuk membukanya semua menggunakan metode yang saya cantumkan.
Tu Do
Tentu saja! Maaf, melewatkan kalimat itu. Saya diedit untuk membuatnya lebih jelas bagi para idiot seperti saya. Jangan ragu untuk mengembalikan jika Anda tidak suka atau jika saya melakukan sesuatu yang salah.
Malabarba
@Malabarba Terima kasih. Lebih jelas sekarang.
Tu Do
4

Berikut adalah dua kemungkinan (alternatif):

  1. Di Dired, Anda dapat menyertakan semua subdir yang berisi file yang ingin Anda tindak lanjuti, baik dengan menggunakan lssakelar yang menyertakan -Ratau dengan menggunakan iuntuk memasukkan subdir tertentu. Jika Anda menggunakan library Dired + maka Anda dapat menggunakan * .(terikat untuk diredp-mark/unmark-extension, untuk menandai semua file yang terdaftar yang memiliki ekstensi yang diberikan (seperti .h). Kemudian Anda dapat menggunakan F(terikat ke dired-do-find-marked-files) untuk membuka semua file yang ditandai.

  2. Dengan Pustaka Dired + Anda dapat bertindak pada semua file yang ditandai dan semua file yang ditandai dalam subdirektori yang ditandai, didefinisikan secara rekursif, IOW, subdirektori subdir, subdirirnya, dll.

    Untuk direktori apa pun yang ditandai, jika tidak ada file yang ditandai dalam direktori itu (yaitu, ditandai dalam daftar Dired untuk subdir itu) maka tindakan ada di semua file-nya.

    Ada cukup banyak perintah untuk bertindak pada file tersebut dengan cara yang berbeda (membuka, mencari, dll.). Tetapi file yang akan ditindaklanjuti ditentukan hanya dengan cara itu; tidak ada juga kemungkinan, katakanlah, memasuki pola gumpalan atau regexp untuk memfilter set.

    Namun, jika Anda menggunakan pustaka Icicles bersama-sama dengan Dired + maka Anda dapat menggunakan M-+ C-F, yaitu, M-+ C-S-f(yang terikat ke icicle-visit-marked-file-of-content-recursive), untuk membuka salah satu atau semua file yang baru saja dijelaskan (yaitu, yang ditandai atau dalam subdir yang ditandai, didefinisikan secara rekursif).

    Anda dapat menggunakan regexps, on the fly, untuk memfilter nama file (dan / atau konten file). Sebagai contoh, Anda dapat, sebagai permintaan Anda, buka semua file yang memiliki ekstensi .c, .ccdan .hdalam subdirs ditandai (dengan subdirs ditandai sedang ditangani dengan cara yang sama, rekursif).

Drew
sumber
3

eshell menangani **/*ekspansi glob gaya zsh , jadi satu pendekatan adalah menjalankan eshell di direktori yang benar dan dijalankanfor f in **/*cc **/*h { find-file $f}

Atau, fungsi ini find-filemendukung wildcard ketika dipanggil dari elisp. Berikut cuplikan bermanfaat dari dokumentasi untuk itu find-file:

(find-file FILENAME &optional WILDCARDS)
Interactively, or if WILDCARDS is non-nil in a call from Lisp, expand wildcards (if any) and visit multiple files.

Saya tidak tahu bagaimana cara agar bisa bekerja dengan globsh bergaya zsh, tapi mungkin itu pilihan yang bagus.

Jika semua file-file ini dalam proyek sumber tunggal yang dikendalikan, proyektil mungkin pendekatan yang berbeda dan lebih baik.

PS. Jika Anda menggunakan eshell, saya sarankan eshell-toggle-cduntuk mengikat kunci sehingga Anda dapat dengan mudah memunculkan prompt eshell di direktori buffer yang sedang Anda edit.

Shapr
sumber
Saya tidak berpikir itu find-fileakan beroperasi secara rekursif, yang merupakan fitur utama yang saya cari. Membuka cangkang dan mengetik perintah sepertinya terlalu banyak bekerja, karena (saya tebak) perintah saya harus seperti for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }atau lebih sederhana dari itu?
nispio