2009-04-08 20 views
18

Quello che sto cercando di fare sembra una cosa molto semplice, ma non riesco a trovare nulla a riguardo. Sto lavorando su un progetto costruito come al solito:Come "creare" in modo efficiente con Vim

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

Vorrei fare il mio progetto utilizzando il comando make incluso in Vim. Ma ogni volta devo specificare :make -C ../. Preferirei che, se non ci fosse il file Makefile nella directory corrente, andare nella directory superiore. Lo faccio già con

set tags+=./tags;/ 

nel mio .vimrc.

Inoltre, la marca è di default brutta. Ci sono opzioni per aggiungere colore da realizzare e consentire un accesso diretto agli errori (come in Emacs).

Grazie

risposta

7

La soluzione di rampion è un primo passo, ma calcolata su carico vim. Quando carico una sessione con più schede, il percorso può essere incoerente da una scheda all'altra.

Qui la mia soluzione (+ extra con 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

set makecmd = "make -C .." nel vostro .vimrc

+0

Preferirei che, se non ci fosse il file Makefile nella directory corrente, andare nella directory superiore. Se il Makefile esiste, usalo. –

+0

non è così facile. imposta il tuo makecmd come script per testare quella condizione ... non è poi così difficile :) –

+0

Questo è esattamente quello che sto chiedendo. Non so come testare se un file esiste o meno nel vimrc –

3

Per rispondere alla tua seconda domanda, è possibile navigare attraverso gli errori utilizzando la funzionalità quickfix in VIM. Quickfix memorizza gli errori in un buffer e ti permette di navigare avanti/indietro attraverso di essi.

Potrebbe essere necessario definire l'errore regexp per consentire a VIM di identificarli dall'output di Make, ma mi sembra di ricordare che funziona piuttosto bene (ho dovuto modificare il modo in cui funziona per Java Ant costruisce - ovviamente non si applica qui)

15

leggera modifica di what Adam said:

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

escape, questo è

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

che significa, pseud o codice stile

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

Questo va solo una directory su. Se desideri una soluzione più generale che andrà a quante più directory se necessario, dovrai essere in grado di cercare le directory degli antenati fino a quando non viene trovato un Makefile e non sono sicuro di come farlo semplicemente dal riga di comando. Ma scrivere un copione (in qualunque lingua tu preferisca) e poi chiamarlo dal tuo makeprg non dovrebbe essere difficile.

+15

Si può usare una clausola 'let' per evitare una fuga così estesa:': let & makeprg = '[[-f Makefile]] && make || fai -C .. ''. –

+2

'[[a]] && b || c' non è esattamente lo stesso di 'if a then b else c'. Se 'a' è vero e' b' ritorna con un codice di uscita diverso da zero, allora verrà eseguito anche 'c'. –

+0

reiner-torenbeek: buon punto. Che ne dite di '[[a]] && (b ; true) || C'. – rampion

3

Di gran lunga la soluzione più semplice è quella di avere un Makefile nella directory src, che è il modo in cui molti, molti progetti sono istituiti a prescindere editore/IDE. Puoi comunque avere un Makefile di livello superiore che chiama make -C src, con le regole per la creazione in src situate in src a cui appartengono.

+0

Non so perché i progetti non optino per un Makefile di primo livello quando possibile. –

2

Un altro approccio può essere utilizzato se si dispone di un singolo makefile nella directory principale del progetto:

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

Con il percorso del progetto in variabili come b:projectDir è possibile utilizzare un "autocomando" per passare a quella directory prima avviare l'esecuzione :make o :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 può essere usato per impostare b:projectDir; fornisce anche i comandi per modificare la directory corrente nella directory radice del progetto:

augroup changeMakeDir 
    au! 
    autocmd QuickfixCmdPre make ProjectRootCD 
augroup END 
Problemi correlati