Всем привет, обсудим работу со многими файлами. В Вим можно открыть много файлов, например, так:
vim file1 file2 file3
или так:
vim *.tex
При этом Вим откроет все файлы, но виден будет только один: первый. Остальные доступны через список файлов, которому и посвящена эта заметка. Для краткости будем именовать список файлов арглист.
Есть более удобные способы открыть много файлов: вкладки и окна. Чтобы файлы открылись во вкладках, укажите ключ -p. Есть ограничение по числу файлов, остальные откроются по-старому, списком.
Если указать ключ -o или -O, файлы откроются в окнах. Экран будет поделен на области, горизонтально или вертикально, в каждой свой файл. Это удобно, если надо видеть сразу два-три-четыре файла. Например, результаты расчета или входные параметры.
В классическом vi было два файла, текущий и другой. К текущему можно обратиться как %, к другому как # . Например, это удобно для вызова внешних команд, компиляторов или еще чего-то:
:!latex %
или :!ifort % #
Это и сейчас доступно.
Арглист может быть полезен и сегодня — для пакетных операций. Их удобнее делать при помощи Perl или еще каких-то средств (если вы Перла не знаете), но можно и в Виме. Например, заменить глобально что-то на что-то или посчитать число слов.
Есть много команд для работы с арглистом, перечислим самые полезные.
:args — просмотр арглиста, текущий файл выделен. Можно указать новый арглист, который заместит предыдущий: открытые файлы будут закрыты, новые открыты, первый доступен для редактирования. Как обычно, несохраненные изменения помешают, но это можно обойти восклицательным знаком.
:argedit — добавит файл к арглисту и перейдет к нему. Если он уже есть, то он станет доступен для редактирования.
:argadd — тоже добавит файл к арглисту, но переходить к нему не будет.
:argdelete — удалит из арглиста файлы, удовлетворяющие шаблону. Не регулярному выражению, а файловому шаблону. Например, *.bak. Знак процента означает текущий файл. Можно указать диапазон, например, .,$argdelete удалит от текущего до конца списка. Текущий файл не закрывается.
:argument — открывает указанный по номеру файл (номер либо перед, либо после команды), можно задать опции вроде кодировки, как при обычном открытии файла.
:next — переход к следующему файлу в арглисте, можно указать номер перед командой чтобы прыгнуть.
:Next или :previous — переход к предыдущему, можно с номером.
:rewind или :first — переход к первому файлу.
:last — переход к последнему файлу.
:wnext, :wNext, :wprevious — те же переходы, но с сохранением текущего файла.
Файловые шаблоны раскрываются и сортируются. Так что vim *.tex это нормально. Но сейчас все-таки лучше vim -p *.tex
<C-G> дает кое-какую информацию о текущем открытом файле и об их количестве.
И последнее. Команда argdo позволяет выполнить команду во всех файлах. Это очень мощное средство, которому я посвящу отдельный материал и о котором упоминал выше. Пример из справки Вим:
:args *.[ch]
:argdo %s/\<my_foo\>/My_Foo/ge | update
Первая команда открывает в арглист все файлы *.c и *.h; вторая делает во всех файлах глобальную замену и сохраняет файл, если он изменился (update). Палка | служит для объединения команд, это не конвейер: просто сначала одна, потом другая. Модификатор e замалчивает ошибку, которая возникает если искомое не нашлось. Без него на первом таком файле процесс остановится.