2009-04-08 13 views
18

To, co próbuję zrobić, wydaje się być bardzo podstawową sprawą, ale nie mogę nic na ten temat znaleźć. Pracuję nad projektem zbudowanym jak zwykle:Jak skutecznie "robić" z Vimem

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

Chciałbym zrobić mój projekt za pomocą polecenia make zawartego w Vimie. Ale za każdym razem muszę podać :make -C ../. Wolałbym, jeśli nie ma pliku Makefile w bieżącym katalogu, przejdź do katalogu nadrzędnego. Zrobiłem to już z

set tags+=./tags;/ 

w moim .vimrc.

Co więcej, marka jest domyślnie brzydka. Czy są opcje, aby dodać kolor i umożliwić bezpośredni dostęp do błędów (jak w Emacs).

Dzięki

Odpowiedz

7

Rozwiązanie problemu jest pierwszym krokiem, ale obliczane na podstawie obciążenia vim. Kiedy ładuję sesję z wieloma kartami, ścieżka może być niespójna z jednej karty na drugą.

Tutaj moje rozwiązanie (+ dodatkowe z 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 
1

zestaw makecmd = "make -C .." w swoim .vimrc

+0

Wolałbym, jeśli nie ma pliku Makefile w bieżącym katalogu, przejdź do katalogu nadrzędnego. Jeśli istnieje plik Makefile, użyj go. –

+0

to nie takie proste. ustaw twój makecmd na skrypt, który testuje ten warunek ... to nie jest takie trudne :) –

+0

Dokładnie o to pytam. Nie wiem, jak przetestować, czy plik istnieje, czy nie w vimrc –

3

Aby odpowiedzieć na drugie pytanie, można poruszać się błędów przy użyciu funkcji w vim quickfix. Quickfix przechowuje błędy w buforze i pozwala nawigować do przodu/do tyłu przez nie.

Być może będziesz musiał zdefiniować wyrażenie regexp, aby umożliwić VIM zidentyfikowanie ich z wyjścia Make, ale wydaje mi się, że to działa całkiem dobrze (musiałem zmodyfikować, jak to działa dla Java Ant buduje - oczywiście nie dotyczy tutaj)

15

nieznacznej modyfikacji what Adam said:

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

Unescaped, to

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

co oznacza, ps o kod styl:

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

Powoduje to tylko jeden katalog w górę. Jeśli chciałbyś bardziej ogólne rozwiązanie, które pójdzie jak najwięcej katalogów w razie potrzeby, będziesz musiał móc przeszukiwać katalogi przodków do momentu znalezienia pliku Makefile i nie jestem pewien jak to zrobić po prostu wiersz poleceń. Ale pisanie skryptu (w dowolnym języku, który preferujesz), a następnie wywoływanie go ze swojego makeprg nie powinno być trudne.

+15

Można użyć klauzuli "let", aby uniknąć tak szerokiego wycieku: ': let & makeprg = '[[-f Makefile]] && make || zrobić -C .. ". –

+2

'[[a]] && b || c' nie jest dokładnie tym samym, co 'if a then b else c'. Jeśli "a" jest prawdziwe i 'b' wraca z niezerowym kodem wyjścia, wówczas również zostanie wykonane' c'. –

+0

reiner-torenbeek: dobry punkt. Co powiesz na "[[a]] && (b ; true) || c'. – rampion

3

Zdecydowanie najprostszym rozwiązaniem jest mieć Makefile w katalogu src, która jest droga, że ​​wiele, wiele projektów są tworzone niezależnie od edytora/IDE. Nadal możesz mieć plik Makefile najwyższego poziomu, który wywołuje make -C src, a zasady budowania w src znajdują się w src tam, gdzie ich miejsce.

+0

Nie wiem, dlaczego projekty nie wybierają pliku Makefile najwyższego poziomu, kiedy tylko jest to możliwe. –

2

Innym rozwiązaniem może być używany, jeśli masz jeden makefile w katalogu głównym projektu:

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

Z ścieżki projektu w zmiennej jak b:projectDir możliwe jest użycie „autokomendę”, aby przejść do tego katalogu przed rozpocząć wykonywanie :make lub :lmake:

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

Projectroot plugin może być używany do ustawiania b:projectDir; zawiera również polecenia zmiany katalogu bieżącego na katalog główny projektu:

augroup changeMakeDir 
    au! 
    autocmd QuickfixCmdPre make ProjectRootCD 
augroup END 
Powiązane problemy