Как сделать поиск и заменить его в VIM? - PullRequest
50 голосов
/ 25 января 2011

Я использую плагин Ack в Vim, который помогает мне быстро искать строки в моем проекте.Однако иногда я хочу заменить все или некоторые вхождения найденных строк.Вы можете выполнить какой-либо глобальный поиск и заменить, используя арглист Vim, подобный этому ( source ):

:args app/views/*/*
:argdo %s/, :expire.*)/)/ge | update

Но вместо использования args я бы предпочел выполнить поискчерез Ack, а затем выполнить замену во всех найденных файлах.Есть ли способ сделать это похожим на команду argdo?

Ответы [ 5 ]

93 голосов
/ 05 января 2012

Я решил использовать ack и Perl для решения этой проблемы вне Vim, чтобы я мог использовать более мощные регулярные выражения Perl вместо подмножества GNU.Вы можете сопоставить это с ключевым ударом в вашем vimrc.

ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'

Объяснение

ack

ack - это потрясающий инструмент командной строки, которыйсмесь 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/.

34 голосов
/ 24 августа 2016

Теперь у Vim есть новая команда cdo, которая будет запускать данную команду для каждой строки списка быстрых исправлений.

Таким образом, вы можете использовать

:Ack pattern
:cdo s/pattern/newpattern/g
16 голосов
/ 25 января 2011

Я не верю, что есть встроенный способ сделать это, но его легко сделать.

Что вам нужно сделать, это создать команду, которая вызывает пользовательскую функцию.Затем функция должна использовать функцию getqflist(), чтобы получить все записи в списке быстрых исправлений, и exe, чтобы выполнить грязную работу.Будьте осторожны, что вы передаете в качестве аргумента!

" Define a command to make it easier to use
command! -nargs=+ QFDo call QFDo(<q-args>)

" Function that does the work
function! QFDo(command)
    " Create a dictionary so that we can
    " get the list of buffers rather than the
    " list of lines in buffers (easy way
    " to get unique entries)
    let buffer_numbers = {}
    " For each entry, use the buffer number as 
    " a dictionary key (won't get repeats)
    for fixlist_entry in getqflist()
        let buffer_numbers[fixlist_entry['bufnr']] = 1
    endfor
    " Make it into a list as it seems cleaner
    let buffer_number_list = keys(buffer_numbers)

    " For each buffer
    for num in buffer_number_list
        " Select the buffer
        exe 'buffer' num
        " Run the command that's passed as an argument
        exe a:command
        " Save if necessary
        update
    endfor
endfunction
10 голосов
/ 31 марта 2013

Вы можете использовать ack таким образом

:args `ack -l User app/`
:argdo %s/, :expire.*)/)/ge | update

Или использовать ag

:args `ag -l User app/`
:argdo %s/, :expire.*)/)/gec | w
9 голосов
/ 25 апреля 2012

Я использую MacVim (активируется с помощью mvim в оболочке). Я передаю результаты от ack до mvim:

mvim -f $(ack -l $@)

Затем в MacVim я ищу / заменяю, используя bufdo:

:bufdo %s/SEARCH/REPLACE/gce | update

Пропустить опцию c, если подтверждение не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...