Vim просматривает все существующие буферы - PullRequest
35 голосов
/ 16 марта 2010

При работе с одним файлом я привык:

/blah
do some work
n
do some work
n
do some work

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

Ответы [ 8 ]

47 голосов
/ 16 марта 2010

Используйте команду bufdo.

:bufdo command

:bufdo command примерно эквивалентно итерации по каждому буферу и выполнению команды. Например, допустим, вы хотите найти и заменить все буферы:

:bufdo! %s/FIND/REPLACE/g

Или, скажем, мы хотим удалить все строки текста, которые соответствуют регулярному выражению "SQL" из всех буферов:

:bufdo! g/SQL/del

Или, может быть, мы хотим установить кодировку файла UTF-8 для всех буферов:

:bufdo! set fenc=utf-8

Вышеприведенное можно экстраполировать для Windows (:windo), вкладок (:tabdo) и аргументов (:argdo). См. Помощь: bufdo для получения дополнительной информации.

30 голосов
/ 04 июня 2015

Мы можем сделать это, используя vimgrep и выполняя поиск по списку аргументов. Но сначала давайте заполним наш список аргументов всеми нашими буферами:

:bufdo :args ## %

Теперь мы можем искать в нашем списке аргументов

:vimgrep /blah/ ##

Где % == the current filepath и ## == the arglist.

Я рекомендую смотреть эти vimcasts, если вы хотите узнать больше: Заполнить арглист , Поиск нескольких файлов с помощью vimgrep

10 голосов
/ 16 марта 2010

У меня есть следующие сопоставления (вдохновленные 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 вернет вас. Вы также можете добавить в список аргументов с помощью: argadd или создать новый список аргументов с помощью

: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

Список аргументов хорошо работает и с макросами (см .: help 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

Ммммммммм VIM - это хорошо! ТАК СЕКСУАЛЬНО! :)

2 голосов
/ 18 октября 2013

Вот ваше Евангелие: https://github.com/jeetsukumaran/vim-buffersaurus

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

1 голос
/ 16 марта 2010

Я не верю, что возможно расширить функциональность 'n' между файлами и буферами. Вы можете использовать

:grep blah *

А потом сделай

:cn

Чтобы перейти к следующей строке с бла на нем. Это будет переключаться между файлами, но это не так аккуратно. Гораздо труднее набирать двоеточие все время, и оно приведет вас только к строке, а не к слову.

Что я обычно делаю, это либо открываю файлы, которые я ищу, во вкладках, а затем использую 'n' и 'gt', чтобы перейти к следующей вкладке, когда достигну конца файла, или перечислю файлы в команде когда я закончу редактировать, я могу перейти к следующему файлу с помощью:: wn.

Надеюсь, это поможет!

0 голосов
/ 22 мая 2018

Другой подход:

:call setqflist([])           " clear quickfix list
:silent bufdo grepadd! foo %  " edit foo in command-line history window
:cw                           " view search results

или сопоставлено:

cmap bbb call setqflist([]) \| silent bufdo grepadd!  %<C-F>$hha
0 голосов
/ 27 февраля 2018

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

:b + <any part of file in buffer> + tab

Для примера. У меня есть это в моем буфере

77 "/var/www/html/TopMenuAlertAlert.vue" строка 65
78 "/var/www/html/MainSidebar.vue" строка 29
79 "/var/www/html/FullScreenSearch.vue" строка 26
80 "/var/www/html/Menu.vue" строка 93
81 "/var/www/html/layouts/RightSidebar.vue" строка 195

Поскольку я хочу перейти на другой буфер, я, вероятно, помню некоторые подробности о файле, такие как 'Alert'

Так что я просто иду

:b Alert + tab

Если данный файл не тот, который мне нужен, я просто продолжаю нажимать клавишу Tab.

Vim продолжит предоставлять следующий файл рядом с ним.

Как только вы получили это. Нажмите Enter.

0 голосов
/ 16 марта 2010

Я бы открыл все буферы в новой вкладке, используя следующие две команды:

:tab sp
:bufdo sp

Затем выполните поиск по каждому файлу один за другим и закройте его окно, когда закончите (используйте :q или :close). Используйте CTRL + W _ , чтобы развернуть каждое окно во время работы в нем. Когда вы закончите и закроете последнее окно, страница вкладки закроется, и вы вернетесь назад, где бы вы ни находились, прежде чем решили выполнить поиск.

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