2009-04-08 16 views
18

Lo que trato de hacer parece algo muy básico, pero no puedo encontrar nada al respecto. Estoy trabajando en un proyecto de construcción como de costumbre:Cómo "hacer" eficientemente con Vim

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

me gustaría hacer mi proyecto mediante el comando make incluido en Vim. Pero cada vez tengo que especificar :make -C ../. Preferiría, si no hay un archivo Makefile en el directorio actual, ir al directorio principal. Ya lo hago con

set tags+=./tags;/ 

en mi .vimrc.

Además, la marca es por defecto fea. ¿Hay opciones para agregar color para hacer y permitir un acceso directo a los errores (como en Emacs).

Gracias

Respuesta

7

La solución de rampion es un primer paso, pero se calcula en la carga de vim. Cuando cargo una sesión de varias pestañas, la ruta puede ser inconsistente de una pestaña a otra.

Aquí mi solución (+ 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

conjunto makecmd = "make -C .." en su .vimrc

+0

Preferiría, si no hay archivo Makefile en el directorio actual, ir al directorio padre. Si Makefile existe, úselo. –

+0

eso no es tan fácil. establece tu makecmd como un script que prueba esa condición ... no es tan difícil de hacer :) –

+0

Eso es exactamente lo que estoy pidiendo. No sé cómo probar si un archivo existe o no en el vimrc –

3

Para responder a su segunda pregunta, se puede navegar a través de los errores utilizando la funcionalidad quickfix en VIM. Quickfix almacena los errores en un búfer y le permite navegar hacia adelante/atrás a través de ellos.

Puede que tenga que definir la expresión regular de error para permitir que VIM identifique esto desde el resultado de Make, pero parece recordar que funciona bastante bien (he tenido que modificar cómo funciona para java hormiga construye - obviamente no se aplican aquí)

15

modificación leve de what Adam said:

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

sin formato de escape, esto es

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

lo que significa, pseud o código de estilo

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

Esto solo sube un directorio. Si desea una solución más general que vaya a tantos directorios como sea necesario, tendrá que poder buscar los directorios de antecesores hasta que se encuentre un archivo Makefile, y no estoy seguro de cómo hacerlo simplemente desde el línea de comando. Pero escribir un guión (en el idioma que prefiera) y luego llamarlo desde su makeprg no debería ser difícil.

+15

Se puede usar una cláusula 'let' para evitar un escape tan extenso:': let & makeprg = '[[-f Makefile]] && make || hacer -C .. ''. –

+2

'[[a]] && b || c' no es exactamente lo mismo que 'if a then b else c'. Si 'a' es verdadero y' b' regresa con un código de salida distinto de cero, entonces 'c' también se ejecutará. –

+0

reiner-torenbeek: buen punto. ¿Qué tal '' [[a]] && (b ; true) || c'. – rampion

3

Con mucho, la solución más fácil es tener un Makefile en el directorio src, que es la forma en que muchos, muchos proyectos se establecen independientemente de editor/IDE. Todavía puede tener un Makefile de nivel superior que llame al make -C src, con las reglas para compilar en src ubicado en src donde pertenecen.

+0

No sé por qué los proyectos no optan por un Makefile de nivel superior siempre que sea posible. –

2

Otro enfoque puede ser utilizado si usted tiene un único archivo make en el directorio raíz del proyecto:

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

Con su ruta del proyecto en la variable como b:projectDir es posible utilizar una "AutoCommand" para cambiar a ese directorio antes comenzar a ejecutar :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 se puede utilizar para establecer b:projectDir; también proporciona los comandos para cambiar el directorio actual al directorio raíz del proyecto:

augroup changeMakeDir 
    au! 
    autocmd QuickfixCmdPre make ProjectRootCD 
augroup END 
Cuestiones relacionadas