Компиляция C-файла из vim "независимым от пути" способом - PullRequest
0 голосов
/ 21 сентября 2018

Предположим, я запускаю 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.

Как мне добитьсятот же результат без жесткого кодирования пути к корневой папке?

1 Ответ

0 голосов
/ 22 сентября 2018

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

:nnoremap <F5> :make -C %:p:h/../build

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

a/b/c/src/file.c
a/b/c/build

Он ломается в случае, подобном этому:

a/b/c/src/include/features.h

Как он будет пытаться встроить:

a/b/c/src/build

ЕстьОбходной путь, хотя.Если ваш build всегда находится на одном уровне src, то вы можете выполнить подстановку текста с помощью модификатора :s:

:nnoremap <F5> :make -C %:p:s!.*\zssrc.*!build!

Этот простой шаблон .*\zssrc.* ищет последний src на вашем пути и заменяет его (и все, что после него) на build.Он ничего не делает, если на пути нет src.

...