Как эффективно "делать" с Vim

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

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

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

set tags+=./tags;/

в моем .vimrc.

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

Спасибо

Ответ 1

Решение rampion является первым шагом, но вычисляется на основе 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

Ответ 2

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

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

Unescaped, это

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Другой подход может быть использован, если у вас есть один 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

Ответ 6

установите makecmd = "make -C.." в ваш .vimrc