Привет, коллеги. Тему модификаторов имен файлов мы уже раскрывали, но стоит посвятить ей отдельный материал. Полезно овладеть этой техникой, чтобы использовать ее на лету.
Итак, что такое модификатор? Специальный символ, преобразующий имя файла. Например, % часто трактуется как имя файла, связанного с текущим буфером. И уместно его модифицировать: взять путь, отцепить путь, привести путь к полному или от домашнего каталога, отцепить расширение, заменить все in на out, вставить .. в середину пути и всё в таком роде.
В качестве тренировочного средства мы будем использовать функцию expand. Она, в частности, раскрывает символ %, превращая его в имя файла, причем именно то, которое было указано при его, файла, открытии в Вим.
Например, пусть мы в каталоге /home/my и запустили Вим командой vim zen/monday.txt
Откроется файл monday.txt в подкаталоге zen. Команда :echo expand('%') выдаст zen/monday.txt
Давайте теперь использовать модификаторы:
:echo expand('%:p') выдаст полный путь: /home/my/zen/monday.txt
:echo expand('%:h') отцепит сам файл, оставив только путь: zen
Вместе мы получим путь к каталогу: :echo expand('%:h') выдаст /home/my/zen
Можно повторять :h, отцепляя каталог за каталогом.
Можно отцепить путь, оставив только файл: %:t выдаст monday.txt
Это "чистое" имя файла можно препарировать далее. Так, :e отцепит и выдаст расширение, отделенное точкой. Например, %:t:e выдаст txt
Если расширений несколько, например, file.txt.tar.gz, модификатор :e отцепит последнее: gz. Но повторные модификаторы снимают больше: %:e:e для такого файла выдаст tar.gz.
Если файл начинается с точки, как .vimrc, то это "расширение" не отцепляется.
А :r, напротив, отцепит расширение и выдаст имя файла без него. Повтор, опять-таки, отцепляет расширения по одному.
Наконец, можно осуществлять замены: :s?txt?tex? заменит первое вхождение txt на tex. Можно заменить и все вхождения, через :gs?my?her?
Последний модификатор :S экранирует специальные символы, чтобы имя файла могло быть использовано для команд. Например, заключит всё в кавычки. Ставьте его последним, чтобы передать файл внешней утилите: скажем, если у вас файл с пробелами, вроде "I love Ola", то % развернется именно в такое имя из трех слов, и передача этого имени команде rm приведет к удалению файлов I, love и Ola. Если они есть. Поэтому НЕ :!rm %, а только :!rm %:S
Как всё это можно использовать? Часто нужно открыть файл из того же каталога, что и текущий. Ну и вперед:
:tabnew %:p:h/another.txt
Или, очень распространенно:
:tabnew %:h
Откроется каталог с файлом и можно выбрать другой файл. Как в лучших домах!
Или надо открыть файл с тем же именем, но другим расширением:
:tabnew %:t:r.xxx
Часто нужно обращаться к командам bash. Это мы уже затронули выше. Тоже удобно:
:!ls %:p:h
Замены - инструмент мощный, нужны не каждый день. Но могут пригодиться. Например, %:p:s?dissert?appendix?
Или можно заменить разделители, если вам нужно, скажем, сохранить по сети на Windows-диск: :p:gs?/?\\?
Слеш удвоен, чтобы это был слеш.
Помимо %, модификаторы также работают с решеткой # (альтернативный файл), # n - буфер номер n, а ещё с символами <cfile> (имя файла в тексте под курсором), <afile> (имя файла при работе автокоманды), <sfile> (имя выполняемого командой source скрипта), <abuf> (для автокоманд это номер буфера).
Если у вас в тексте стоит имя файла, то вы можете на него скакнуть командой gf, но можете использовать это имя более изощренно из командной строки:
:tabnew <cfile>:p:h
откроет каталог с файлом, например.
В автокомандах это вообще порой необходимость, так как вы обрабатываете событие, связанное с файлом, имя которого вам известно через <afile>, и вам может быть надо что-то делать в том же каталоге, где файл, или определить тип файла по его расширению, или взять только имя файла без пути, или получить абсолютный путь, чтобы не путать разные файлы include/file.txt
Но на самом деле даже повседневная работа с Вим и файлами из него весьма удобна с этими модификаторами:
- saveas %:p:h/newname.txt - сохраним файл под новым именем в том же каталоге
- w %:p:r.copy - сохраним копию файла, заменив расширение
- w %:p:h/newname.%:p:t:e - пример посложнее: сохраним копию файла в том же каталоге и с тем же расширением, но новым именем.
Я рекомендую попрактиковаться на тестовых файлах, которые не жалко, и начать с expand (хотя она просто раскрывает символы, а примеры чуть выше она не осилит), потом потренироваться на tabnew - она по крайней мере ничего не удалит и не перезапишет, потом (вообще всегда) избегайте восклицательных знаков, чтобы не перезаписать что-то ценное.
Удачи, коллеги!