Vim, просматривающий все существующие буферы
При работе с одним файлом я использую:
/blah
do some work
n
do some work
n
do some work
Предположим теперь, что я хочу найти некоторый шаблон по всем буферам, загруженным в Vim, выполнить некоторую работу над ними и двигаться дальше. Какие команды я использую для этого рабочего потока?
Ответы
Ответ 1
У меня есть следующие сопоставления (вдохновленные Vimperator), которые облегчают переключение предыдущего/следующего буфера.
nmap <C-P> :bp<CR>
nmap <C-N> :bn<CR>
Это хорошо работает с 'n'. Когда вы закончите работу с вашим файлом, просто нажмите CTRL-n, прежде чем снова набрать n, и вы выполните поиск в следующем буфере. Повторите, пока не пройдете все буферы.
Другим способом работы со многими файлами является список аргументов.
Он содержит любые файлы, переданные в качестве параметров при запуске vim (например: vim someFile.txt someOtherFile.py
). Файл в [скобках] - это текущий файл.
:args
[someFile.txt] someOtherFile.py
: n приведет вас к следующему файлу в списке и: N вернет вас. Вы также можете добавить в argslist: argadd или создать новый список args с помощью
:n some.py files.py you.py want.py to.py work.py with.py
or to open all *.py files recursively from some project.
:n ~/MyProjects/TimeMachine/**/*.py
Список args хорошо работает с макросами (см. справку q), если у вас есть аналогичные изменения в ваших файлах. Просто запишите свой макрос в первый файл, закончите с помощью: n, чтобы перейти к следующему файлу, и прекратите запись.
qq/searchForSomethingAndDoStuffOrWhatever:nq
Затем запустите свой макрос через все файлы (6 @q), посмотрите, чтобы все прошло хорошо, и закончите с: wall.
Это зависит от того, что вы хотите сделать. Если у вас просто одно изменение одинаково для многих файлов (и это только те, которые вы загрузили), мне также нравится команда: ba (: tabdo sp). Это очень быстро, и вы можете видеть, что происходит.
И если у вас есть куча буферов, вы можете загружать файлы, которые хотите работать внутри, каждый в окне, и делать регулярное выражение для всех из них.
CTRL-w v :b someFile
:sp anotherFile
...
:windo :%s/foo/bar/g
Я действительно рекомендую FuzzyFinder, это облегчает вашу жизнь при открытии файлов.
http://www.vim.org/scripts/script.php?script_id=1984
MMmMmmmm VIM НРАВИТСЯ! ТАК СЕКСУАЛЬНО!:)
Ответ 2
Используйте команду bufdo
.
:bufdo command
:bufdo command
примерно эквивалентен итерации по каждому буфере и выполнению команды. Например, скажем, вы хотите найти и заменить все буферы:
:bufdo! %s/FIND/REPLACE/g
Или предположим, что мы хотим удалить все строки текста, которые соответствуют регулярному выражению "SQL" из всех буферов:
:bufdo! g/SQL/del
Или, может быть, мы хотим установить кодировку файла в UTF-8 на всех буферах:
:bufdo! set fenc=utf-8
Вышеприведенное может быть экстраполировано для Windows (:windo
), Tabs (:tabdo
) и аргументов (:argdo
). См. Справку по: bufdo для получения дополнительной информации.
Ответ 3
Мы можем сделать это с помощью vimgrep
и поиска в списке argslist. Но сначала позвольте заполнить наш argslist всеми нашими буферами:
:bufdo :args ## %
Теперь мы можем искать в нашем argslist
:vimgrep /blah/ ##
Где % == the current filepath
и ## == the arglist
.
Я рекомендую смотреть эти vimcasts, если вы хотите узнать больше: Заполнить arglist, Поиск нескольких файлов с помощью vimgrep
Ответ 4
Вот ваше Евангелие:
https://github.com/jeetsukumaran/vim-buffersaurus
Этот прекрасный плагин показывает вам все файлы, соответствующие вашему запросу, в отдельном окне, из которого вы можете выбрать. Он поддерживает регулярное выражение.
Ответ 5
Я не верю, что можно расширять 'n' функционально через файлы или буферы. Вы можете использовать
:grep blah *
И затем сделайте
:cn
Чтобы перейти к следующей строке с blah на ней. Это будет переключаться между файлами, но это не так просто. Это более громоздко, чтобы набирать двоеточие все время, и он приведет вас только к линии, а не к слову.
То, что я обычно делаю, это либо открыть файлы, которые я хочу найти в вкладках, а затем использовать "n" и "gt", чтобы перейти к следующей вкладке, когда я дойду до конца файла, или перечислить файлы в команде line, чтобы я мог перейти к следующему файлу с помощью:: wn, когда я закончил его редактирование.
Надеюсь, что это поможет!
Ответ 6
Я бы открыл все буферы на новой вкладке, используя следующие две команды:
:tab sp
:bufdo sp
Затем выполните поиск по каждому файлу один за другим и закройте его окно, когда закончите (используйте :q
или :close
). Используйте CTRL+W _, чтобы максимизировать каждое окно во время работы с ним. Когда вы закончите, и вы закроете последнее окно, закладка закроется, и вы будете отброшены назад, где бы вы ни были, прежде чем решите выполнить поиск.