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 -
1That just means
c++-mode
isn't loaded yet. Try wrapping it withwith-eval-after-load
:(with-eval-after-load "cc-mode" (define-key c++-mode-map [f5] #'compile))
. That way it won't run until aftercc-mode
loads andc++-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 usingadd-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 usualmake -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 ()
(interactive)
(defvar foo)
(setq foo (concat "gcc " (buffer-name) " && ./a.out" ))
(shell-command foo))
-
5