Рекурсивно відкривати файли, що відповідають regexp у позначених каталогах


9

Взагалі кажучи, я хотів би мати можливість відкривати всі файли в заданому наборі каталогів (і їхніх підкаталогів), де ім'я файлу відповідає заданому регулярному вираженню.

Наприклад

  /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

Я зазначив каталоги hst, incі lib, і тепер я хочу відвідати всі файли з розширеннями .c, .ccі в .hрамках цих трьох каталогів і їх підкаталогів.

Ще було б краще, якби я побачив усе, що відкриваю, перш ніж відкрити. Якщо введений буфер було оновлено, щоб показати мені всі файли, які відповідають моєму пошуку, і всі ці були виділені, я можу зробити перевірку, щоб переконатися, що мій пошук повернув те, що я очікував.

Я відкритий для пропозицій , щоб зробити це ж саме , використовуючи helmабо dired+або будь-які інші розширення , які дозволять мені здійснювати навігацію по файловій системі легше.


Чи відповіли Матіас або Дрю на вашу честь? Або ви шукали щось інше?
Малабарба

Відповіді:


14

Спробуйте це:

C-u C-x d

Це дозволить вам ввести аргументи того, як Dired повинен перераховувати файли. За замовчуванням це говорить -alпід запитом. Додайте Rдо цього, закінчуючи -alR. Тип RET.

Виберіть / введіть каталог і натисніть RET.

Це буде рекурсивно відкривати всі каталоги з вибраного та нижче.

Звідси введіть, % mщоб позначити всі файли, що відповідають певному шаблону імен файлів. Я також часто потім набираю, tа потім kвбиваю (приховую) всі файли, які мене не цікавлять. Введіть tще раз, щоб позначити всі файли.

Що стосується насправді відкриття файлів, я не думаю, що існує стандартний спосіб зробити це, але ви можете легко визначити нову команду для цього (помістіть її у свій .emacsфайл):

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

Швидше за все, хтось уже включив це в якийсь приємний пакет додатків Dired, але це цікаво зробити і самі;)

Насолоджуйтесь!


7

Це можна легко зробити за допомогою файлу helm-снаряда-пошуку . Оскільки снаряд відслідковує всі файли відносним шляхом, його можна легко звузити до будь-чого. Давайте скористаємось вашим прикладом. У вашому випадку, ви хочете відкривати файли hst, incі lib. Ви можете отримати всі файли, що належать до цього каталогу, двома способами:

  • У вікні Helm від helm-projectile-find-fileвведіть кожен каталог та позначені файли, звужені до цієї директорії. Наприклад, спочатку я вводжу ^hst/(що звужується до всіх файлів, що містяться hst/на початку кожного кандидата). Позначте всі файлиM-a , зробіть щось подібне для файлів у двох інших каталогах.

  • Або, ви можете витягти файли у всіх каталогах , використовуючи цей шаблон : ^hst/\|^inc\|^lib. Хелм зрештою приймає регулярний вираз. Регекс \|означає or. Зробіть це, якщо ви хочете вибрати все за один раз.

За допомогою будь-якого з них ви позначите всі файли, які ви хочете відкрити. Потім просто натисніть, RETщоб відкрити їх усі.

Зауважте, що якщо у цих каталогах багато файлів, вам потрібно збільшити їх helm-candidate-number-limit. Інакше, коли кількість кандидатів досягне межі, більше кандидатів не відображається, і ви не можете вибрати невидимих ​​кандидатів. Установіть його на більший номер або встановіть, nilякщо ви не бажаєте цього обмеження.

Хороша річ із Helm в тому, що ви можете інтерактивно вибирати файли.


Я думаю, що він хоче відкрити їх усі одночасно, а не вибрати одного з них.
Малабарба

1
@Malabarba Ви можете вибрати декілька файлів за M-aдопомогою helm-projectile-find-fileта натиснути RET один раз, щоб відкрити їх усі методом, який я перерахував.
Ту До

Звичайно! Вибачте, пропустив це речення. Я відредагував, щоб зробити це трохи більш очевидним для таких ідіотів, як я. Не соромтесь відкатати, якщо вам не подобається, або якщо я щось зробив не так.
Малабарба

@Malabarba Дякую Зараз це вже зрозуміліше.
Ту До

4

Ось дві можливості (альтернативи):

  1. У Dired ви можете включити всі підкаталоги, що містять файли, над якими ви хочете діяти, або за допомогою lsперемикачів, які включають, -Rабо за допомогою iвключення конкретних підкаталогів. Якщо ви використовуєте бібліотеку Dired +, тоді ви можете використовувати * .(прив’язаний до diredp-mark/unmark-extension, щоб позначити всі перелічені файли, що мають задане розширення (наприклад, .h). Потім можна використовувати F(прив'язане dired-do-find-marked-files), щоб відкрити всі позначені файли.

  2. За допомогою бібліотеки Dired + ви можете діяти з усіма позначеними файлами та всіма позначеними файлами у позначених підкаталогах, визначених рекурсивно, IOW, підкаталогами підкаталогів, їх підкаталогами тощо.

    Для будь-якого позначеного каталогу, якщо в цьому каталозі не позначені жодні файли (тобто позначені в списку Dired для цього підкаталогу), дія виконується на всіх його файлах.

    Існує досить велика кількість команд для дії на такі файли різними способами (відкриття, пошук тощо). Але файли, на які потрібно діяти, визначаються лише таким чином; також не існує можливості, скажімо, ввести глобульний візерунок або повторне вираження для фільтрації набору.

    Однак, якщо ви використовуєте бібліотеку Бурульки разом з Dired + , то ви можете використовувати M-+ C-F, наприклад, M-+ C-S-f(який пов'язаний з icicle-visit-marked-file-of-content-recursive), щоб відкрити будь-який або всі файли описаних (тобто ті , які позначені або маркованих підкаталоги, визначається рекурсивно).

    Ви можете використовувати регулярні вирази на ходу для фільтрування назв файлів (та / або вмісту файлу). Наприклад, Ви можете, як ви запитуєте, відкрити всі файли , які мають розширення .c, .ccі .hв зазначених підкаталогах (з вираженими підкаталогами бути оброблені таким же чином, рекурсивно).


3

eshell обробляє глобальне **/*розширення у стилі zsh , тож один із підходів - запустити eshell у правильний каталог та запуститиfor f in **/*cc **/*h { find-file $f}

Крім того, функція find-fileпідтримує підстановку під час виклику з elisp. Ось корисний фрагмент із документації на це 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.

Я не міг зрозуміти, як змусити це працювати з глобусом у стилі zsh, але це може бути хорошим варіантом.

Якщо всі ці файли знаходяться в одному проекті, керованому джерелом, снаряд може бути іншим і кращим підходом.

PS. Якщо ви переходите до програми eshell, я б запропонував прив’язати eshell-toggle-cdдо ключа, щоб ви могли легко вставити запит eshell у каталог буфера, який ви редагуєте.


Я не думаю, що find-fileце діятиме рекурсивно, що є основною особливістю, яку я шукаю. Відкриття оболонки та введення команди здається занадто великою роботою, тому що (я здогадуюсь) моя команда повинна бути чимось на кшталт for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }Або це простіше, ніж це?
nispio
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.