Как эффективно «сделать» с Vim - PullRequest
18 голосов
/ 08 апреля 2009

То, что я пытаюсь сделать, кажется очень простым, но я ничего не могу найти по этому поводу. Я работаю над проектом, построенным как обычно:

project
|-- bin
|-- inc
`-- src

Я бы хотел создать свой проект, используя команду make, включенную в Vim. Но каждый раз мне приходится указывать :make -C ../. Я бы предпочел, если в текущем каталоге нет файла Makefile, перейдите в родительский каталог. Я уже делаю это с

set tags+=./tags;/

по моему .vimrc.

Кроме того, по умолчанию уродлив. Есть ли варианты добавить цвет для создания и разрешить прямой доступ к ошибкам (как в Emacs).

Спасибо

Ответы [ 6 ]

15 голосов
/ 08 апреля 2009

Небольшая модификация того, что сказал Адам :

 :set makeprg=[[\ -f\ Makefile\ ]]\ &&\ make\ \\\|\\\|\ make\ -C\ ..  

Unescaped, это

 [[ -f Makefile ]] && make || make -C ..

что означает стиль псевдокода

 if file-exists(Makefile) 
 then make
 else make -C ..

Это только один каталог. Если вы хотите более общее решение, которое пойдет столько каталогов, сколько необходимо, вы должны будете иметь возможность искать каталоги предков, пока не найдете Makefile, и я не уверен, как это сделать просто из командной строки Но написание скрипта (на любом языке, который вы предпочитаете), а затем вызов его из вашего makeprg не должно быть трудным.

7 голосов
/ 09 апреля 2009

Решение рампона - это первый шаг, но он рассчитывается по нагрузке vim. Когда я загружаю сеанс с несколькими вкладками, путь от одной вкладки к другой может быть несовместимым.

Вот мое решение (+ дополнительно с tabnew).

fun! SetMkfile()
  let filemk = "Makefile"
  let pathmk = "./"
  let depth = 1
  while depth < 4
    if filereadable(pathmk . filemk)
      return pathmk
    endif
    let depth += 1
    let pathmk = "../" . pathmk
  endwhile
  return "."
endf

command! -nargs=* Make tabnew | let $mkpath = SetMkfile() | make <args> -C $mkpath | cwindow 10
3 голосов
/ 09 апреля 2009

Безусловно, самое простое решение - это иметь Makefile в каталоге src, что позволяет создавать множество проектов независимо от редактора / IDE. Вы по-прежнему можете иметь Makefile верхнего уровня, который вызывает make -C src, с правилами сборки в src, расположенными в src, к которому они относятся.

3 голосов
/ 08 апреля 2009

Чтобы ответить на второй вопрос, вы можете перемещаться по ошибкам с помощью функции quickfix в VIM. Quickfix сохраняет ошибки в буфере и позволяет вам перемещаться вперед / назад по ним.

Возможно, вам придется определить regexp ошибки, чтобы VIM мог идентифицировать их по выходным данным Make, но я, кажется, помню, что он работает достаточно хорошо из коробки (мне пришлось изменить, как это работает для Java Муравей строит - здесь явно не применимо)

2 голосов
/ 18 октября 2011

Другой подход можно использовать, если у вас есть один make-файл в корневом каталоге проекта:

project
|-- bin
|-- inc
|-- src
| Makefile

Если путь к вашему проекту указан в переменной типа b:projectDir, можно использовать "автокоманду" для перехода в этот каталог перед началом выполнения :make или :lmake:

augroup changeMakeDir
    au!
    autocmd QuickfixCmdPre *make
                \ if exists("b:projectDir") &&
                                    \ b:projectDir != expand("%:p:h") |
                    \ exe 'cd ' . b:projectDir |
                \ endif
augroup END

Плагин Projectroot можно использовать для установки b:projectDir; он также предоставляет команды для изменения текущего каталога на корневой каталог проекта:

augroup changeMakeDir
    au!
    autocmd QuickfixCmdPre make ProjectRootCD
augroup END
1 голос
/ 08 апреля 2009

set makecmd = "make -C .." в вашем .vimrc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...