При контакте с единственным файлом я привык к:
/blah
do some work
n
do some work
n
do some work
Предположим теперь, что я хочу искать некоторый шаблон по всем буферам, загруженным в Vim, сделать некоторую работу над ними и идти дальше. Какие команды я использую для этого потока операций?
У меня есть следующие сопоставления (вдохновленные 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 ПРИЯТНО! ТАК СЕКСУАЛЬНО! :)
Я не верю, что можно расширить функцию "n" только на файлы или буферы. Вы можете использовать
:grep blah *
, а затем сделать
:cn
, чтобы перейти к следующей строке с надписью blah. Это будет переключаться между файлами, но это не так аккуратно. Постоянно набирать двоеточие труднее, и это приведет вас только к строке, а не к слову.
Обычно я либо открываю файлы, которые я хочу найти, на вкладках, а затем использую 'n' и 'gt', чтобы перейти к следующей вкладке, когда я дойду до конца файла, либо перечисляю файлы в команде строку, чтобы я мог перейти к следующему файлу с помощью ': wn', когда я закончу его редактировать.
Надеюсь, это поможет!
Используйте команду bufdo
.
:bufdo command
:bufdo command
примерно эквивалентно итерации по каждому буферу и выполнению команды. Например, допустим, вы хотите выполнить поиск и замену во всех буферах:
:bufdo! %s/FIND/REPLACE/g
Или, допустим, мы хотим удалить все строки текста, которые соответствуют regex "SQL" из всех буферов:
:bufdo! g/SQL/del
Или, может быть, мы хотим установить кодировку файла в UTF-8 для всех буферов:
:bufdo! set fenc=utf-8
Вышесказанное можно экстраполировать на Windows (:windo
), Tabs (:tabdo
) и arguments (:argdo
). Дополнительную информацию см. в справке по :bufdo.
Я бы открыл все буферы на новой вкладке, используя следующие две команды:
:tab sp
:bufdo sp
Затем просматривайте каждый файл один за другим и закрывайте его окно, когда все готово (используйте : q
или : close
). Используйте CTRL + W _ , чтобы развернуть каждое окно во время работы в нем. Когда вы закончите и закроете последнее окно, вкладка закроется, и вы вернетесь туда, где вы были до того, как решили выполнить поиск.