Использование Emacs для рекурсивного поиска и замены в текстовых файлах, которые еще не открыты - PullRequest
201 голосов
/ 07 ноября 2008

В качестве продолжения этого вопроса он пытается выяснить, как сделать что-то подобное, что должно быть легко, что особенно мешает мне привыкнуть к использованию Emacs и вместо этого запускать редактор, с которым я уже знаком Я использую пример здесь довольно часто при редактировании нескольких файлов.

В Ultraedit я бы сделал Alt + s, затем p, чтобы отобразить диалоговое окно с параметрами: Найти (включая использование регулярных выражений в нескольких строках), Заменить на, В файлах / типах, Каталог, Соответствие регистру, Соответствие всему слову Только список измененных файлов и поиск в подкаталогах. Обычно я сначала использую мышь, чтобы щелкнуть и перетащить, чтобы выбрать текст, который я хочу заменить.

Используя только сам Emacs (в Windows XP), без вызова какой-либо внешней утилиты, как заменить все foo \ nbar на bar \ nbaz в *.c и *.h файлах в некоторой папке и во всех папках под ней. Может быть, Emacs - не лучший инструмент для этого, но как это легко сделать с помощью минимальной команды?

Ответы [ 13 ]

1 голос
/ 27 января 2014

find-name-dired в порядке, но:

  • Все файлы, которые вы получаете, соответствуют одному и тому же регулярному выражению.
  • find-dired более гибок в этом отношении, но он также предназначен для использования общих правил (даже если они могут быть сколь угодно сложными). И, конечно же, find имеет свой сложный язык.
  • если вы затем хотите воздействовать только на некоторые файлы, имена которых были собраны в буфере find(-name)-dired, вам необходимо либо пометить их, либо удалить / опустить строки тех, с которыми вы не хотите работать.

Альтернативой является использование Dired + команд, которые воздействуют на (a) отмеченные файлы и (b) все отмеченные файлы (или все файлы, если не помечены) в отмеченных подкаталогах ... найдено рекурсивно . Это дает вам как универсальность, так и простой контроль над выбором файла. Все эти команды «здесь и ниже» находятся на префиксной клавише M-+ в режиме Dired.

Например, M-+ Q - это то же самое, что и Q --- query-replace, но целевые файлы - это все файлы, отмеченные в текущем каталоге и во всех отмеченных подкаталогах, down, вниз, вниз ...

Да, альтернативой использованию таких команд здесь и ниже является вставка всех подкаталогов и их подкаталогов рекурсивно, а затем использование команды верхнего уровня, такой как Q. Но часто удобно не вставлять вложенные подкаталоги.

И для этого вам все равно нужен быстрый способ рекурсивно вставить все такие подкаталоги . Здесь также может помочь Dired + . M-+ M-i вставляет все отмеченные подкаталоги и свои собственные отмеченные подкаталоги, рекурсивно. То есть он похож на M-i (который вставляет отмеченные подкаталоги в Dired + ), но он действует рекурсивно на подкаталоги.

(Все такие «здесь и ниже» Команды Dired + находятся в меню Множество > Помечено здесь и ниже .)

Вы также можете выполнять операции Dired для набора файлов Emacs , который представляет собой сохраненный набор имен файлов, расположенных в любом месте. А если вы используете Сосульки , то вы можете открыть буфер Dired только для файлов в наборе файлов или других типов списков сохраненных файлов.

Вы также можете добавить в закладки любой буфер Dired, включая тот, который вы создали с помощью find(-name)-dired. Это дает вам быстрый способ вернуться к такому набору (например, к набору проектов) позже. И если вы используете Bookmark + , тогда добавьте в закладки Dired записи (a) переключатели ls, (b) какие файлы помечены, (c) какие подкаталоги вставляются, и (d) какие (под) каталоги скрыты. Все это восстанавливается, когда вы «прыгаете» на закладку. Закладка + также позволяет создавать закладки для целого дерева буферов Dired - переход к закладке восстанавливает все буферы в дереве.

1 голос
/ 16 ноября 2011

Другой вариант - использовать Поиск сосулек . Это другой вид инкрементального поиска, который использует завершение вашего ввода минибуфера против результатов поиска. При изменении вашего текущего ввода набор совпадающих совпадений обновляется в буфере *Completions*.

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

Когда вы посещаете поисковый удар, вы можете заменить по требованию либо всего попадания, либо только его части, соответствующей текущему входу минибуфера. Замена по требованию означает, что вас не спрашивают о каждом поисковом обращении по очереди; Вы получаете доступ к нужным вам попаданиям напрямую, в любом порядке. Этот подход может быть более эффективным, чем запрос-замена, если у вас есть ограниченное количество замен: вы пропускаете исчерпывающее приглашение y/n.

Поиск по поиску контексты , которые вы определяете - вы не ограничены поиском по всему тексту в целевых файлах (например, вы можете пропустить комментарии или определенные виды программных разделов). Простой пример контекста поиска - это строка, как в grep, но контекстом может быть любой понравившийся вам блок текста, соответствующий шаблону. Обычно вы определяете контексты поиска с помощью регулярных выражений, но вместо этого вы можете использовать функцию. В дополнение к определению вашего собственного, есть предопределенные команды поиска Icicles для различных типов контекстов: блоков текстовых свойств или свойств наложения, вещей в точке и т. Д.

Вы также можете сортировать поиск в различных порядках сортировки для облегчения доступа / навигации.

0 голосов
/ 15 августа 2012

Это не Emacs, но xxdiff поставляется с инструментом под названием xx-rename, который будет делать это для нескольких строк одновременно (например, From To from FROM TO), с интерактивными подсказками, сохранять резервные копии всех измененных файлов создать краткий журнал изменений, внесенных в контексте. Это то, что я обычно использую при больших / глобальных переименованиях.

...