Вообще говоря, я хотел бы иметь возможность открывать все файлы в данном наборе каталогов (и их подкаталогах), где имя файла соответствует заданному регулярному выражению.
Например
/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+
любые другие расширения, которые позволят мне более легко перемещаться по моей файловой системе.
Ответы:
Попробуй это:
Это позволит вам ввести аргументы для того, как Dired должен перечислять файлы По умолчанию это говорит
-al
в подсказке. ДобавьтеR
к этому, заканчивая с-alR
. Тип RET.Выберите / введите каталог, а затем нажмите RET.
Это рекурсивно откроет все каталоги из того, который вы выбрали, и ниже.
Отсюда введите,
% m
чтобы отметить все файлы, соответствующие определенному шаблону имени файла. Я также часто затем печатаю tи затем kубиваю (скрываю) все файлы, которые меня не интересуют. Введите tснова, чтобы отметить все файлы.Что касается фактического открытия файлов, я не думаю, что есть стандартный способ сделать это, но вы можете легко определить новую команду, чтобы сделать это (поместите это в свой
.emacs
файл):Скорее всего, кто-то уже включил это в какой-то хороший пакет улучшений Dired, но интересно делать это и самим;)
Наслаждайтесь!
источник
Вы можете сделать это легко с помощью 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 в том, что вы можете интерактивно выбирать файлы.
источник
M-a
помощьюhelm-projectile-find-file
и нажать RET один раз, чтобы открыть их все, используя метод, который я перечислил.Вот две возможности (альтернативы):
В Dired вы можете включить все подкаталоги, содержащие файлы, с которыми вы хотите работать, либо с помощью
ls
переключателей, которые включают,-R
либо с помощьюi
включения определенных подкаталогов. Если вы используете библиотеку Dired +, то вы можете использовать* .
(привязано кdiredp-mark/unmark-extension
, чтобы отметить все перечисленные файлы с заданным расширением (например,.h
). Затем вы можете использоватьF
(привязано кdired-do-find-marked-files
), чтобы открыть все отмеченные файлы.С библиотекой Dired + вы можете работать со всеми отмеченными файлами и всеми отмеченными файлами в отмеченных подкаталогах, определенных рекурсивно, IOW, подкаталогах подкаталогов, их подкаталогах и т. Д.
Для любого помеченного каталога, если в этом каталоге нет файлов (т. Е. Помечены в списке Dired для этого подкаталога), действие выполняется для всех его файлов.
Существует множество команд для работы с такими файлами по-разному (открытие, поиск и т. Д.). Но файлы, по которым нужно действовать, определяются только так; нет также возможности, скажем, ввести шаблон глобуса или регулярное выражение для фильтрации набора.
Однако, если вы используете библиотеку Icicles вместе с Dired +, то вы можете использовать
M-+ C-F
, т. Е. (КоторыйM-+ C-S-f
связан сicicle-visit-marked-file-of-content-recursive
), для открытия любого или всех только что описанных файлов (т. Е. Отмеченных или в отмеченных подкаталогах, определенных рекурсивно).Вы можете использовать регулярные выражения на лету для фильтрации имен файлов (и / или содержимого файла). Например, Вы можете, как вы спрашиваете, открыть все файлы , которые имеют расширение
.c
,.cc
и.h
в отмеченных подкаталогах (с выраженными подкаталогами быть обработаны таким же образом, рекурсивно).источник
eshell обрабатывает
**/*
расширение глобуса в стиле zsh , поэтому один из подходов - запустить eshell в правильном каталоге и запуститьfor f in **/*cc **/*h { find-file $f}
Кроме того, функция
find-file
поддерживает символы подстановки при вызове из elisp. Вот полезный фрагмент из документации для этогоfind-file
:Я не мог понять, как заставить это работать с глобализацией в стиле 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 } }
Или это проще?