Часто я знаю имя файла, но не помню или не считаю его громоздким, чтобы указать именно каталог. Я хотел бы иметь возможность найти файл файл x/y/*/some_file.txt, где * разрешил бы поиск в рекурсивных каталогах вместо текущего.
Как найти файл в каталогах рекурсивно
Ответ 1
Как описано здесь:
M-x find-name-dired
После того, как вы предоставите каталог и шаблон, соответствующие файлы будут отображаться в буфере Dired. Вы можете перемещаться по списку файлов (C-n
, C-p
и т.д.) И открывать файлы по своему желанию (Ret
).
Ответ 2
ido-find-file
делает это: когда введенное имя файла не совпадает
ничего в текущем каталоге, он использует что-то вроде locate
для соответствия
что вы написали против всех файлов в вашей системе.
Настройка - это только одна строка:
(ido-mode)
После этого C-x C-f вызовет ido-find-file
.
Кроме того, я обычно добавляю:
(setq ido-enable-flex-matching t)
потому что мне это нравится, но с ним вы получите locate
больше результатов,
то есть foo
также будет соответствовать froo
.
Ответ 3
Я давно искал эту функцию, и теперь я доволен тем, что нашел: я использую helm-projectile
.
Projectile
- библиотека взаимодействия проекта. Проекты - это каталоги VCS или каталоги, содержащие файл .projectile. Он основан на поиске GNU (но также предлагает реализацию emacs lisp)
https://github.com/bbatsov/projectile
(вы можете установить его с помощью packages.el
). Вы можете использовать его в одиночку: вызов projectile-find-file
(или projectile-mode
и C-c p f). Он использует ido
для завершения по умолчанию, но в этом случае я предпочитаю интерфейс helm-projectile
.
Мои коллеги все время говорили мне использовать Sublime Text из-за этой функции. К счастью, я нашел снаряд:)
Ответ 4
В случае файлов в каталоге проекта я использовал Fiplr, который использует библиотеку нечеткого поиска тем же автором.
https://github.com/d11wtq/fiplr
Это доступно в MELPA.
Другое решение, которое я не пробовал, https://github.com/technomancy/find-file-in-project
Ответ 5
Вот решение, которое дает вам избирательность по искаженным файлам и подкаталогам. Для его использования вам нужны Dired + и < сильные > Сосульки.
Команда, используемая только в Dired, является icicle-visit-marked-file-of-content-recursive
(или версией -other-window
). Он привязан к M-+ C-F
(для другого окна используйте M-+ C-O
- и да, это прописные буквы F
и O
).
Что он делает:
-
Он предоставляет в качестве кандидатов для завершения все файлы, помеченные в текущем Dired каталоге, pslus - все из тех, которые находятся в любых помеченных подкаталогах с буферами Dired и т.д. рекурсивно.
-
Вы можете посетить любое количество таких кандидатов, которые соответствуют вашему вводу минибуфера, включая все из них. Вы можете посетить некоторые из них, которые соответствуют шаблону ввода минибуфера, а затем изменить шаблон для сопоставления и посетить другие - все в том же вызове команды.
-
" Соответствие" ваш вход может означать один или оба:
- Соответствие файла name
- Соответствие файла
Таким образом, ваш вход может быть двухчастным (разделяется ударом
C-M-j
: частью имени файла и частью содержимого файла. Узкий выбор путем сопоставления имен файлов и более узкий, путем сопоставления текста в этих файлах Этот поиск выполняется быстро - он преуспевает, как только он находит одно совпадение в файле.Вы можете пропустить любую часть: сопоставить только имена файлов (быстро) или только содержимое файла (медленнее, естественно).
-
Вы можете комбинировать шаблоны ввода - прогрессивное завершение. Намного проще добавлять дополнительные шаблоны для совпадения, инкрементально и интерактивно, чем пытаться создать одно регулярное выражение, которое сделает именно то, что вы хотите.
-
Каждый шаблон ввода (каждая часть шаблона из двух частей) может быть регулярным выражением. Также доступно нечеткое сопоставление.
-
Вы также можете просто вставлять поддиректории в свой Dired buffer, вместо того, чтобы иметь их как отдельные Dired-буферы. Любые файлы и поддиры, помеченные в буфере Dired, обрабатываются одинаково.
Если вы не хотите спускаться в поддиры, которые отмечены, вы можете использовать нерекурсивную версию команды
icicle-visit-marked-file-of-content
, привязанную кC-F
(C-O
для другого окна).
Если вы также используете Закладка +, вы можете пометить буфера Dired или набор буферов Dired. Закладка фиксирует, какие файлы и подкаталоги отмечены, какие подкаталоги вставлены и какие файлы и подкаталоги опущены. Переход к такой закладке восстанавливает все эти вещи. Это дает вам возможность сделать снимок проекта, который вы можете выполнить с помощью M-+ C-F
и т.д.
Ответ 6
Множество опций, перечисленных ниже, я использую следующую команду:
find-file-in-current-directory
Вы можете поместить его в свои .emacs следующим образом:
;; Find file in current directory:
(global-set-key (kbd "C-M-,") 'find-file-in-current-directory)
Интерфейс очень хорошо знаком тем, кто использует инструменты fsf (https://github.com/junegunn/fzf)
Ответ 7
Icicles команда icicle-locate
(или icicle-locate-file
, если у вас нет программы locate
для вашей ОС) для этого. Найдите файл в любом месте в данном каталоге (включая ~HOME
или корневой каталог).
Вы можете сопоставлять любые части абсолютного имени файла (т.е. путь и имя файла). Вы можете использовать несколько видов соответствия, включая регулярное выражение, подстроку и нечеткое соответствие.
Ответ 8
edit. Я нашел гораздо лучше с projectile
, см. мой другой ответ.
Существует find-recursive.el: http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt
Загрузите его, поместите в свой путь загрузки и потребуйте его в своем .emacs: (он недоступен через ELPA или el-get)
(require 'find-recursive)
теперь, когда вы вызываете M-x find-recursive, он будет запрашивать имя файла для поиска рекурсивно, базового каталога, тогда вам нужно выбрать один файл из списка результатов. К сожалению, он не интегрирован в ido, но мне он нравится, иногда это полезно.