Предположим, я запускаю vim из корневой папки большого проекта и хочу скомпилировать конкретный пример (например, я буду использовать zephyr RTOS ).Эта корневая папка находится в /home/<user>/zephyr/
Допустим, я запускаю vim samples/basic/blinky/src/main.c
.Теперь, если я хочу скомпилировать его, я бы перешел с другого терминала на samples/basic/blinky/build/
и запустил make
Если я хочу собрать его, не выходя из vim, я мог бы запустить :make -C samples/basic/blinky/build/
Я хотел бы автоматизировать этот процесс, нажав любую клавишу, скажем, f5.
Так что, если у меня есть, например, два вертикальных разбиения, v1 и v2.
В v1 у меня естьsamples/basic/blinky/src/main.c
и в v2 у меня есть samples/drivers/rtc/src/main.c
.
Нажатие f5 из v1 приведет к запуску эквивалента :make -C samples/basic/blinky/build/
, а из v2 приведет к запуску эквивалента :make -C samples/drivers/rtc/build/
Общий шаблон - папка сборки находится в ../build/
от текущей директории с файлом.
Я не хочу "постоянно" использовать :cd
или :lcd
для смены рабочей директории., даже для текущего split / window, потому что:
- Мой файл тегов ctags находится в корневой папке, поэтому я хочу иметь возможность перейти к любой функции, которую
samples/basic/blinky/src/main.c
использует, но не обязательноопределено в том же файле. - Если я хочу открыть новый файл, я хочу получить к нему доступ, используя его путь из корневой папки, а не текущий путь к файлу
Мой текущийРешение состоит в том, чтобы в моем ~/.vimrc
была функция, которая временно изменяет рабочий каталог на текущую папку, эквивалентную файлу сборки, чтобы я мог запустить :make
, а затем снова изменяет рабочий каталог на корневую папку.
Это выглядит так:
nnoremap <F5> :call MakeTst()<CR>
function! MakeTst(...)
:cd %:p:h
:cd ../build/
:make
:cd /home/<user>/zephyr/
endfunction
Хотя это работает, недостатком является то, что корневая папка жестко закодирована внутри ~/.vimrc
.
Как мне добитьсятот же результат без жесткого кодирования пути к корневой папке?