Рекурсивно открывать файлы, соответствующие регулярному выражению в отмеченных каталогах

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рамках этих трех каталогов и их подкаталогов.

Было бы еще лучше, если бы я мог видеть все, что я открываю, прежде чем открыть его. Если буфера Dired был обновлен, чтобы показать мне все файлы, которые соответствуют моему поиску, и все они были выделены, я мог бы сделать проверку работоспособности, чтобы убедиться, что мой поиск вернул то, что я ожидал.

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

nispio
источник
Матиас или Дрю ответили на ваш квест? Или вы искали что-то другое?
Малабарба

Ответы:

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-projectile-find-file . Поскольку Projectile отслеживает все файлы по их относительному пути, вы можете легко сузить до чего угодно. Давайте использовать ваш пример. В вашем случае, вы хотите открывать файлы hst, incи lib. Вы можете получить все файлы, принадлежащие этому каталогу, двумя способами:

  • В приглашении Helm helm-projectile-find-fileвведите каждый каталог и помеченные файлы, суженные к этому каталогу. Например, сначала я ввожу ^hst/(который сужается до всех файлов, которые содержатся hst/в начале каждого кандидата). Отметьте все файлы с помощьюM-a , сделайте что-то подобное для файлов в двух других каталогах.

  • Или, вы можете извлечь файлы во всех каталогах , используя этот шаблон : ^hst/\|^inc\|^lib. В конце концов, Helm принимает регулярные выражения. Регулярное выражение \|означает 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 для этого подкаталога), действие выполняется для всех его файлов.

    Существует множество команд для работы с такими файлами по-разному (открытие, поиск и т. Д.). Но файлы, по которым нужно действовать, определяются только так; нет также возможности, скажем, ввести шаблон глобуса или регулярное выражение для фильтрации набора.

    Однако, если вы используете библиотеку Icicles вместе с 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 в каталоге редактируемого буфера.

shapr
источник
Я не думаю, что это find-fileбудет работать рекурсивно, и это главная особенность, которую я ищу. Открытие оболочки и ввод команды кажется слишком большой работой, потому что (я полагаю) моя команда должна быть чем-то вроде for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }Или это проще?
Nispio