26

I recently found that there is a command in Vim called compiler. You can call it with any common compiler (for example, :compiler gcc, :compiler php, etc.), but it doesn't seem to have any immediate effect.

I searched on the manpages but didn't find anything useful about what it actually does, nor does the Vim Wiki. Does anyone know what that command actually does?

Martín Fixman
  • 9,055
  • 9
  • 38
  • 46

4 Answers4

19

It sets options for that compiler, such as the program to use for :make and the format of error messages so vim can jump you to error locations. Look in $VIMRUNTIME/compiler/ for the different .vim files that can be sourced.

:help write-compiler-plugin

A compiler plugin sets options for use with a specific compiler. The user can load it with the :compiler command. The main use is to set the 'errorformat' and 'makeprg' options.

See also :help errorformat and :help makeprg.

Here's the GCC compiler file on my machine, for example:

/usr/share/vim/vim72/compiler/gcc.vim

" Vim compiler file
" Compiler:         GNU C Compiler
" Maintainer:       Nikolai Weibull <now@bitwi.se>
" Latest Revision:  2006-12-20

if exists("current_compiler")
  finish
endif
let current_compiler = "gcc"

let s:cpo_save = &cpo
set cpo-=C

CompilerSet errorformat=
      \%*[^\"]\"%f\"%*\\D%l:\ %m,
      \\"%f\"%*\\D%l:\ %m,
      \%-G%f:%l:\ %trror:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once,
      \%-G%f:%l:\ %trror:\ for\ each\ function\ it\ appears\ in.),
      \%f:%l:\ %m,
      \\"%f\"\\,\ line\ %l%*\\D%c%*[^\ ]\ %m,
      \%D%*\\a[%*\\d]:\ Entering\ directory\ `%f',
      \%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f',
      \%D%*\\a:\ Entering\ directory\ `%f',
      \%X%*\\a:\ Leaving\ directory\ `%f',
      \%DMaking\ %*\\a\ in\ %f

if exists('g:compiler_gcc_ignore_unmatched_lines')
  CompilerSet errorformat+=%-G%.%#
endif

let &cpo = s:cpo_save
unlet s:cpo_save
John Kugelman
  • 349,597
  • 67
  • 533
  • 578
  • 1
    I wrote a simple c program ran `:compiler gcc` and `:make %`, I get `make: Nothing to be done for \`dummy.c'.` – balki Jan 22 '13 at 20:16
  • 1
    This doesn't seem to set `makeprg`. I don't understand what is the use of this file? – balki Jan 23 '13 at 19:24
  • 1
    You need an existing Makefile for default operation mode of `:make` - but you can set up vim to work with without a Makefile - see my answer below. – Pierz Nov 22 '14 at 09:29
10

Vim typically has a number of common compiler configurations installed, as mentioned, so it will automatically choose the appropriate one. To actually use the compiler configuration you need to use the Vim :make function, as also mentioned, but the default mode of operation expects a Makefile to exist.

If you're just trying to do a quick compile on the current file/buffer (without an existing Makefile) then if you have GNU make installed you can just compile it like this (as explained here):

:make %:r

And it will compile the file and provide vim with the errors/warnings so you can navigate each one using the quickfix (:help quickfix) list - :cn Next error, :cp Previous error, :cw New window listing errors.

If you don't have GNU make installed you can set this variable - either immediately in the current session like this:

:se makeprg=gcc\ -o\ %<\ %

Or put it in your ~/.vimrc file:

set makeprg=gcc\ -o\ %<\ %

Then you can type:

:make

And it will compile the file and provide you with the quickfix list of errors/warnings in Vim.

EDIT: If you also want to run the compiled executable from within vim you can do ('!' executes, '%:r' is the filename without its suffix):

 :!./%:r
Pierz
  • 7,064
  • 52
  • 59
1
:help compiler

It sets the options for the selected compiler for the current buffer.

Nick Bastin
  • 30,415
  • 7
  • 59
  • 78
0

If you edit a java file, you can do :compiler javac and then, :make % to compile the current file...

max
  • 11