Emacs поиск и открытие нескольких файлов и поиск по всем буферам - PullRequest
8 голосов
/ 26 сентября 2010

Я сейчас нахожусь в начале процесса переключения форвардов Emacs. Однако у меня две основные проблемы.

  1. Как мне рекурсивно искать несколько файлов по определенному пути? Я предполагаю, что должен использовать find / grep / dired, но я не уверен. Например, я хотел бы найти все *.scala файлы по пути C:/src/xxx. Когда эти файлы найдены, я также хотел бы открыть их все в буфере сразу. Единственный способ, которым я в настоящее время знаком, - это C-x C-f .

  2. Когда все эти файлы находятся в буфере, как мне тогда выполнять поиск по всем буферам и получать какой-то список результатов и / или, возможно, иметь возможность переходить от результата к результату? Говоря, я хотел бы найти все места с текстом case Int =>.

Ответы [ 5 ]

9 голосов
/ 26 сентября 2010

Я согласен с ответом phimuemue, но я также укажу M-x rgrep, который запустит необходимый find / grep, чтобы представить все совпадения без фактического открытия файлов. После выбора соответствия открывается соответствующий файл с этим номером строки. В некоторых ситуациях это может быть предпочтительнее открытия всех этих файлов.

См. Также:

3 голосов
/ 26 сентября 2010

Для части A вы можете посмотреть здесь .

Для части B вы можете взглянуть на multi-occur-in-matching-buffers, который позволяет вам указать, какие буферы вы хотите использовать (например, все буферы .*.scala для просмотра во всех файлах scala) и что искать (например, case Int => ). Это дает вам список всех случаев.

1 голос
/ 21 августа 2011

* Для вопроса A ***

В Сосульки , Cx Cf по умолчанию a мульти-команда .Это означает, что при заполнении набора имен файлов:

  • Вы можете действовать (например, посещать) нескольких кандидатов выборочно (например, C-RET , C-mouse-2 ).

  • Вы можете работать с всеми файлами, чьи имена соответствуют вашему текущему вводу - например, посещать их все.

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

Например, Cx Cf с префиксом arg соответствует абсолютным именам файлов.И M-x icicle-locate-file делает то же самое для всех файлов в данном каталоге.

(Вы всегда можете использовать многокомандную команду как обычную команду: Cx Cf действует нормально, если вы используете RET или mouse-2 . Если вы не используете дополнительные привязки клавиш для работы с несколькими файлами, вы никогда не почувствуете разницу.)

См. http://www.emacswiki.org/emacs/Icicles_-_File-Name_Input


* Для вопроса B ***

Что вы хотите - Сосульки поиск.

  • Команда icicle-search-file ищет все файлы указанного вами набора.
  • Команда icicle-search-buffer ищет все буферы указанного набора.
  • Команда icicle-searchвыполняет оба действия: файлы с отрицательным префиксом arg, буферы с неотрицательным префиксом arg.

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

После определения контекстов поиска вы вводите некоторый текст в минибуфер, и он сужает контексты поиска кандидатов до тех, которые соответствуют вашему тексту.Вы можете нажать M-SPC , чтобы объединить несколько таких шаблонов.

Затем вы можете перейти к выбранным поисковым хитам: C-RET или C-mouse-2 для посещения или цикл / посещение с использованием C-down .Вы даже можете сортировать подходящих кандидатов различными способами, легко сравнивать их или изменять порядок циклов.

См. http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview

1 голос
/ 27 сентября 2010

Вы пытаетесь найти все вхождения "case Int =>" в файлах * .scala в C: / src

Самый простой способ (при условии установки Emacs по умолчанию) - использовать M-x rgrep. Он попросит вас указать строку поиска, тип файла и каталог (в таком порядке, а приглашения будут помечены, чтобы не было путаницы). Просто введите case Int =>, *.scala и C:/src/xxx.

То, что вы должны увидеть, - это новый буфер со списком вхождений "case Int =>" во всех файлах .scala в этом каталоге. Если вы щелкнете по вхождению, Emacs откроет этот файл и перейдет к строке, в которой он содержится.

Как примечание, если вы пытаетесь выполнить поиск и замену по нескольким файлам, вы можете сделать это, используя опции dired. Вы можете найти информацию об этой опции здесь .

0 голосов
/ 27 сентября 2010

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

Мой любимый способ сделать это - использовать M-x igrep-find , потому что мне нравится интерфейс igrep лучше, чем grep-find.

в Emacs.

Вы можете найти библиотеку igrep в emacswiki: igrep.el

И использование будет

M-x igrep-find case Int => RET

, который будет заполнять буфер всеми совпадениями, а затем (как в случае возникновения, поиска grep, компиляции и т. Д.) Можно использовать Cx ` или Mx next-error циклически проходить матчи.

...