Я ищу лучший способ выполнить поиск и замену (с подтверждением) во всех файлах проекта в Vim. Под «файлами проекта» я подразумеваю файлы в текущем каталоге, некоторые из которых необязательно открывать.
Один из способов сделать это - просто открыть все файлы в текущем каталоге:
:args ./**
а затем выполните поиск и замените все открытые файлы:
:argdo %s/Search/Replace/gce
Однако, когда я это делаю, использование памяти Vim подскакивает с пары десятков МБ до более 2 ГБ, что для меня не работает.
У меня также установлен плагин EasyGrep , но он почти никогда не работает - либо не находит все вхождения, либо просто зависает, пока я не нажму CtrlC. Пока что мой предпочтительный способ выполнить эту задачу - это ack-grep для поискового запроса, с помощью окна быстрого исправления открыть любой файл, который содержит термин и не был открыт раньше, и, наконец :bufdo %s/Search/Replace/gce
.
Я ищу либо хороший рабочий плагин, который можно использовать для этого, либо, альтернативно, команду / последовательность команд, которая была бы проще, чем та, которую я использую сейчас.
Ответы:
Greplace мне подходит .
Также на гитхабе есть готовая версия для патогенов .
источник
:Gsearch
и:Gbuffersearch
существуют, но когда набираю,:Greplace
получаюNot an editor command: Greplace
.:Gsearch [<grep-option(s)>] [[<pattern>] [<filename(s)>]]
так что вы можете выполнить рекурсивный поиск, используя, например::Gsearch -r pattern dir/
Другой важный вариант - просто не использовать vim:
или, если у вас есть способ создать список файлов, возможно, что-то вроде этого:
и так далее!
источник
sed
регулярные выражения, которые, по сути, являются базовыми регулярными выражениями POSIX.2, но не совсем (это находится на странице руководства) - они позволяют\n
сопоставлять символы новой строки и некоторые другие подобные вещи. Поэтому они почти такие же, какgrep
регулярные выражения.find . -type f | LANG=C xargs sed -i '' 's/SEARCH/REPLACE/g'
РЕДАКТИРОВАТЬ: используйте
cfdo
команду вместо,cdo
чтобы значительно уменьшить количество команд, которые будут выполняться для этого (потому чтоcdo
запускает команды для каждого элемента, аcfdo
выполняет команды для каждого файла)Благодаря недавно добавленной
cdo
команде , теперь вы можете сделать это двумя простыми командами, используя любойgrep
установленный вами инструмент. Никаких дополнительных плагинов не требуется !:(
cdo
выполняет данную команду для каждого термина в списке быстрых исправлений, которыйgrep
заполняет ваша команда.)(Удалите знак
c
в конце второй команды, если вы хотите заменить каждый поисковый запрос без подтверждения каждый раз)источник
:cdo update
чтобы сохранить изменения во всех файлах.c
в конце второй команды (просто используйтеg
), чтобы онаupdate
я должен был:cdo %s/<search term>/<replace term>/g | update
Я решил использовать ack и Perl для решения этой проблемы, чтобы воспользоваться преимуществами более мощных полных регулярных выражений Perl, а не подмножества GNU.
объяснение
извед
извед удивительный инструмент командной строки , которая представляет собой смесь
grep
,find
и полные Perl регулярные выражения (не только GNU субпопуляции). Он написан на чистом Perl, он быстрый, имеет подсветку синтаксиса, работает в Windows и более удобен для программистов, чем традиционные инструменты командной строки. Установите его в Ubuntu с помощьюsudo apt-get install ack-grep
.xargs
Xargs - это старый инструмент командной строки unix. Он считывает элементы из стандартного ввода и выполняет указанную команду, за которой следуют элементы, считанные для стандартного ввода. Таким образом, в основном список файлов, сгенерированных ack, добавляется в конец
perl -pi -E 's/pattern/replacemnt/g'
команды.perl -pi
Perl - это язык программирования. Параметр -p заставляет Perl создавать цикл вокруг вашей программы, который перебирает аргументы имени файла. Параметр -i заставляет Perl редактировать файл на месте. Вы можете изменить это для создания резервных копий. Параметр -E заставляет Perl выполнять одну строку кода, указанную как программу. В нашем случае программа представляет собой замену регулярного выражения Perl. Для получения дополнительной информации о параметрах командной строки Perl
perldoc perlrun
. Для получения дополнительной информации о Perl см. Http://www.perl.org/ .источник
может сделать это:
Объяснение:
:noautocmd vim /Search/ **/*
⇒ поиск (vim
это сокращение отvimgrep
) шаблона во всех файлах во всех подкаталогах cwd без запуска autocmds (:noautocmd
) для повышения скорости.:set hidden
⇒ разрешить модифицированные буферы, не отображаемые в окне (может быть в вашем vimrc):cfirst
⇒ перейти к первому результату поискаqa
⇒ начать запись макроса в регистр a:%s//Replace/gce
⇒ заменить все вхождения последнего поискового шаблона (еще/Search/
в то время) наReplace
:g
флаг)c
флаг)e
флаг):cnf
⇒ перейти к следующему файлу в списке, созданномvim
командойq
⇒ остановить запись макроса1000@a
⇒ воспроизвести макрос, сохраненный в регистре, 1000 раз:wa
⇒ сохранить все измененные буферы* РЕДАКТИРОВАТЬ * Vim 8 способ:
Начиная с Vim 8 есть способ сделать это лучше, поскольку он
:cfdo
выполняет итерацию по всем файлам в списке быстрых исправлений:источник
vim
меня во многом завоевали, я думаю, что буду придерживаться PowerGrep с этим.Populate
:args
из команды оболочкиВозможно (в некоторых операционных системах 1 )) предоставить файлы для
:args
помощью команды оболочки.Например, если у вас установлен ack 2 ,
попросит ack вернуть список файлов, содержащих «шаблон», и поместить их в список аргументов.
Или с помощью простого grep, я думаю, это будет:
Затем вы можете просто использовать,
:argdo
как описано в OP:Заполняем
:args
из списка QuickFixТакже ознакомьтесь с ответом nelstrom на связанный вопрос, описывающий простую пользовательскую команду, которая заполняет список arglist из текущего списка quickfix. Это отлично работает со многими командами и плагинами, вывод которых попадает в список quickfix (
:vimgrep
,:Ack
3 ,:Ggrep
4 ).Последовательность выполнения широкого поиска по проекту может быть выполнена с помощью:
где
:Qargs
- вызов пользовательской команды, заполняющей список аргументов из списка быстрых исправлений.Вы также найдете ссылки в последующем обсуждении на простые плагины, которые сокращают этот рабочий процесс до 2 или 3 команд.
связи
источник
Еще один вариант в 2016 году, плагин far.vim :
источник
Если вы не против введения внешней зависимости, я приготовил плагин ctrlsf.vim (зависит от ack или ag ) для выполнения этой работы.
Он может форматировать и отображать результаты поиска из ack / ag, а также синхронизировать изменения в буфере результатов с фактическими файлами на диске.
Возможно, следующая демонстрация объяснит больше
источник
Шаг 1 заполняет список быстрых исправлений нужными элементами. В этом случае он распространяется с поисковыми запросами, которые вы хотите изменить через
grep
.cfdo
выполняет следующую команду для каждого файла в списке быстрых исправлений. Введите:help cfdo
подробности.s/<search term>/<replace term>/g
заменяет каждый термин./g
означает заменять каждое вхождение в файле.| update
сохраняет файл после каждой замены.Я собрал все это вместе, основываясь на этом ответе и его комментариях, но чувствовал, что он заслуживает своего собственного ответа, поскольку все в одном месте.
источник
2. :cfdo %s/<search term>/<replace term>/g | update
без символа заменяется%
только первое вхождение шаблона.%s
работает и на обычном vim.По сути, я хотел заменить в одной команде и, что более важно, в самом vim
Основываясь на ответе @Jefromi, я создал сочетание клавиш, которое я установил в моем файле .vimrc следующим образом
теперь из vim, по штриху лидера + r я загружаю команду в vim, которую я редактирую, как показано ниже,
Следовательно, я выполняю замену с помощью одной команды и, что более важно, в самом vim
источник