Is it possible to bind the compile and run commands for a c++ code to a single key (for example F5). What i do at the moment is to run M-x compile and then as compile command g++ project.cpp and then i run ./a.out in a shell. Does anyone has a solution for doing these with less typing for c++?


You need to do two things: 1. Bind compile to a key (like f5) 2. Change the command that compile runs.

To do the first add (define-key c++-mode-map [f5] #'compile) to your .emacs. This sets the key only in c++-mode; you can make it a global binding if you want by using global-map instead.

For the second, the compile function just runs whatever is stored in the variable compile-command. Changing this globally would be a pain as you probably want different commands for different projects. File local variables to the rescue. Open the file and run M-x add-file-local-variable. Chose compile-command as the variable and "g++ project.cpp && ./a.out" as the value (don't forget the quotes). This will add a block

// Local Variables:
// compile-command: "g++ test.cpp && ./a.out"
// End:

to the bottom of your file. You can easily add this block yourself if you like.

If your project has multiple files, use add-dir-local-variable instead. Directory local variables are used by all files in that directory.

  • After adding the line to my init.el and reopening emacs i get this error: Symbol's value as variable is void: c++-mode-map.
    – user12021
    Jul 24 '16 at 19:06
  • 1
    That just means c++-mode isn't loaded yet. Try wrapping it with with-eval-after-load: (with-eval-after-load "cc-mode" (define-key c++-mode-map [f5] #'compile)). That way it won't run until after cc-mode loads and c++-mode-map exists.
    – erikstokes
    Jul 24 '16 at 19:45
  • Trying to do this and I cannot add a file local variable. Following your instructions, I get the error message: read-file-local-variable-value: Trailing garbage following expression. I am definitely using add-file-local-variable(not read). Even just pasting in the compile-command at the end of the file doesn't work. I still get prompted to enter a compile-command every time (with the usual make -k as default).
    – n1k31t4
    Jun 18 '18 at 0:30
  • @n1k31t4 I don't recognize that error, but it still works on my machine. Try asking adding more details and asking as a new question.
    – erikstokes
    Jun 18 '18 at 23:24
  • @erikstokes - it was my mistake - using the function interactively, I did not place it within quotes.
    – n1k31t4
    Jun 18 '18 at 23:43

I wonder why you use Emacs, if you don't write Elisp at all. For example, http://www.nathan1hughes.co.uk/programming/why-i-persisted-to-learn-emacs/ suits your question well, on the bottom of the blog:

 ;; Run C programs directly from within emacs
(defun execute-c-program ()
  (defvar foo)
  (setq foo (concat "gcc " (buffer-name) " && ./a.out" ))
  (shell-command foo))
  • 5
    Not sure what the patronizing is for.
    – wasamasa
    Jul 23 '16 at 10:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy