Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Список файлов

Всем привет, обсудим работу со многими файлами. В Вим можно открыть много файлов, например, так:

vim file1 file2 file3

или так:

vim *.tex

При этом Вим откроет все файлы, но виден будет только один: первый. Остальные доступны через список файлов, которому и посвящена эта заметка. Для краткости будем именовать список файлов арглист.

Оглавление рубрики

Есть более удобные способы открыть много файлов: вкладки и окна. Чтобы файлы открылись во вкладках, укажите ключ -p. Есть ограничение по числу файлов, остальные откроются по-старому, списком.

Если указать ключ -o или -O, файлы откроются в окнах. Экран будет поделен на области, горизонтально или вертикально, в каждой свой файл. Это удобно, если надо видеть сразу два-три-четыре файла. Например, результаты расчета или входные параметры.

В классическом vi было два файла, текущий и другой. К текущему можно обратиться как %, к другому как # . Например, это удобно для вызова внешних команд, компиляторов или еще чего-то:

:!latex %
или :!ifort % #

Это и сейчас доступно.

Арглист может быть полезен и сегодня — для пакетных операций. Их удобнее делать при помощи Perl или еще каких-то средств (если вы Перла не знаете), но можно и в Виме. Например, заменить глобально что-то на что-то или посчитать число слов.

Вывод команды :args после того, как я открыл всё, что лежит в /usr/lib Ограничения по числу файлов если и есть, то очень большие.
Вывод команды :args после того, как я открыл всё, что лежит в /usr/lib Ограничения по числу файлов если и есть, то очень большие.

Есть много команд для работы с арглистом, перечислим самые полезные.

: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 замалчивает ошибку, которая возникает если искомое не нашлось. Без него на первом таком файле процесс остановится.

Путеводитель по каналу