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
, inc
dan lib
, dan sekarang saya ingin mengunjungi semua file dengan ekstensi .c
, .cc
dan .h
dalam 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 helm
atau dired+
atau ekstensi lain yang akan membiarkan saya menavigasi sistem file saya lebih mudah.
Jawaban:
Coba ini:
Ini memungkinkan Anda memasukkan argumen tentang bagaimana Dired harus membuat daftar file. Secara default dikatakan
-al
di prompt. TambahkanR
itu, 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
% m
untuk 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
.emacs
file Anda ):Kemungkinan besar seseorang telah memasukkan ini dalam beberapa paket perangkat tambahan Dired yang bagus, tetapi menyenangkan juga melakukannya sendiri;)
Nikmati!
sumber
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
, danlib
. 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 berisihst/
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\|
artinyaor
. 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
RET
untuk 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 kenil
jika Anda tidak menginginkan batas ini.Hal baiknya dengan Helm adalah Anda dapat memilih file secara interaktif.
sumber
M-a
menggunakanhelm-projectile-find-file
dan tekan RET sekali untuk membukanya semua menggunakan metode yang saya cantumkan.Berikut adalah dua kemungkinan (alternatif):
Di Dired, Anda dapat menyertakan semua subdir yang berisi file yang ingin Anda tindak lanjuti, baik dengan menggunakan
ls
sakelar yang menyertakan-R
atau dengan menggunakani
untuk memasukkan subdir tertentu. Jika Anda menggunakan library Dired + maka Anda dapat menggunakan* .
(terikat untukdiredp-mark/unmark-extension
, untuk menandai semua file yang terdaftar yang memiliki ekstensi yang diberikan (seperti.h
). Kemudian Anda dapat menggunakanF
(terikat kedired-do-find-marked-files
) untuk membuka semua file yang ditandai.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 keicicle-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
,.cc
dan.h
dalam subdirs ditandai (dengan subdirs ditandai sedang ditangani dengan cara yang sama, rekursif).sumber
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-file
mendukung wildcard ketika dipanggil dari elisp. Berikut cuplikan bermanfaat dari dokumentasi untuk itufind-file
: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-cd
untuk mengikat kunci sehingga Anda dapat dengan mudah memunculkan prompt eshell di direktori buffer yang sedang Anda edit.sumber
find-file
akan 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 sepertifor d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }
atau lebih sederhana dari itu?