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

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

Привет, коллеги. Открыть файл из Вим нетрудно, но есть любопытные моменты. Вот говоришь ты Виму "Открой файл диссерт.тех" и думаешь, что всё, а ведь это не всё. Где этот файл? Если в текущем каталоге, то какой каталог текущий? И как его поменять? А если не в текущем, то где тогда? А если я сам не помню, где там этот файл лежал: в ../src/ocean/pelagic точно, но дальше? А если кое-что лежит в длинном пути, который неохота каждый раз прописывать? А если в тексте стоит \include 'chapter1.tex', то нельзя ли прямо вот туда и скакнуть? Оглавление рубрики Начнем с текущего каталога. Каталог, из которого вы запустили Вим — текущий. Его можно узнать командой :pwd, причем не только в UNIX-подобных системах, где такая команда тоже есть, а повсюду. Сменить позволяет команда :cd (или :chdir). Без параметров она либо покажет текущий каталог (на не-юниксах), либо сделает текущим домашний каталог. Если файл не сохранен и восклицательный знак не добавлен, команда не сработает. Важно: может повлиять на ф

Привет, коллеги. Открыть файл из Вим нетрудно, но есть любопытные моменты. Вот говоришь ты Виму "Открой файл диссерт.тех" и думаешь, что всё, а ведь это не всё. Где этот файл? Если в текущем каталоге, то какой каталог текущий? И как его поменять? А если не в текущем, то где тогда? А если я сам не помню, где там этот файл лежал: в ../src/ocean/pelagic точно, но дальше? А если кое-что лежит в длинном пути, который неохота каждый раз прописывать? А если в тексте стоит \include 'chapter1.tex', то нельзя ли прямо вот туда и скакнуть?

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

Начнем с текущего каталога. Каталог, из которого вы запустили Вим — текущий. Его можно узнать командой :pwd, причем не только в UNIX-подобных системах, где такая команда тоже есть, а повсюду. Сменить позволяет команда :cd (или :chdir). Без параметров она либо покажет текущий каталог (на не-юниксах), либо сделает текущим домашний каталог. Если файл не сохранен и восклицательный знак не добавлен, команда не сработает. Важно: может повлиять на файлы в списке открытых файлов!

Если путь не абсолютный, то каталог будет искаться в числе перечисленных в переменной cdpath (она аналогичная path, о которой ниже). В частности, в нынешнем текущем каталоге.

Можно перейти в каталог открытого файла: cd %:h

Или в предыдущий текущий: cd -

Команда lcd меняет каталог только для текущего окна.

Теперь поиск. Если мы открываем файл любой командой (а это обычно :e или :tabnew), то либо указываем полный путь, либо путь относительно текущего каталога. Это естественно и удобно, но не всегда: иногда хотелось бы, чтобы Вим поискал файл за нас.

Ищите, и найдете. Только хорошо бы, чтобы кто-нибудь поискал за нас, не так ли?
Ищите, и найдете. Только хорошо бы, чтобы кто-нибудь поискал за нас, не так ли?

Это, конечно, возможно. Есть команды :find и :tabfind, которые ищут файл в каталогах, перечисленных в переменной path, о которой чуть далее. Обе команды могут принимать параметры вида ++enc, восклицательный знак с обычным действием, и номер перед командой :find, предписывающий брать указанный по счету файл: второй найденный, третий и т.п.

Номер перед командой :tabfind указывает, после какой вкладки поместить новую. Можно указать номер 0, означающий "перед первой", а еще + и -, которые означают "на одну после текущей" и "перед текущей", а также $ (последней) или точку (поведение по умолчанию: после текущей).

Есть еще вариант :sfind, это аналог :split с поиском файла.

Все эти команды ищут файл, если указан относительный путь. Если путь однозначен, ерундой не занимаются))

Про переменную path. В ней перечислены каталоги: через запятую. Пути могут быть как абсолютными, так и относительными. Запятые в пути возможны (зачем они вам???), но надо экранировать двойным слешем: \\, Аналогично пробелы (это случается, но лучше тоже избегать), только там слешей надо почему-то три: home/My\\\ files

Символ \ тоже можно, но двойной. В Windows можно использовать юниксовый разделитель /, Вим разберется.

Точка соответствует каталогу, в котором находится текущий файл. Ее лучше добавлять, чтобы искать относительно каталога, в котором вы работаете, даже если он не является текущим. Текущий каталог обозначается пустой строкой между двух запятых: ,,

Поэтому .,, это минимум: наче Вим вообще ничего не найдет. По умолчанию в UNIX задано .,/usr/include,, То есть поиск ведется относительно данного файла (точка), в указанном каталоге и в текущем каталоге (пустая строка между двух запятых).В Windows не будет каталога /usr/include.

Переменные окружения подставляются: $NETCDF_INC какой-нибудь вполне можно, или $VIMRUNTIME С $PATH могут быть проблемы, там другой разделитель.

Разумно использовать команды :set+= и :set-= Так, :set path+= добавит текущий каталог (с запятой), а :set path-=my_papers/submitted удалит указанный.

Прыжок на файл под курсором. Есть команды gf, gF, которые ищут и открывают файл, имя которого под курсором. Вторая еще и переходит на строку, номер которой указан после имени файла (может быть отделен символами, которые не относятся к имени файла, в том числе и пробелом). Например, dissert.tex @42 Это удобно для исправления ошибок/замечаний в статье, например, или в книге (когда много файлов).

Помните, что для исправления ошибок в программном коде есть специальные средства.

Вариант <C-W><C-F> открывает файл в отдельном окне. А <C-W>gf открывает в отдельной вкладке. Есть и еще варианты, которые все перечислять не будем.

Если файла нет, будет выдано сообщение об этом. Можно использовать команду :e <cfile> и ее можно привязать к gf, если вам часто нужно именно такое поведение:

:map gf :e <cfile><CR>

Переменная suffixadd содержит, через запятую, расширения, которые можно добавлять. Так, если у вас написано \include{chapter1}, то задайте :set suffixadd=.tex и все будет работать.

Можно задать includeexpr, которое позволяет преобразовать еще как-то имя файла, если он не найден, и попробовать снова. Это полезно, например, если у вас пути указаны через \, а не через /, и надо заменить. Но это уже экспертные трюки.

Удачи, коллеги

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