When in javascript mode trying to use C-c C-m i
get an error saying "C-c RET
is undefined?"
What makes Emacs believe I am pressing RET
?
How can i properly make this keybinding work?
When in javascript mode trying to use C-c C-m i
get an error saying "C-c RET
is undefined?"
What makes Emacs believe I am pressing RET
?
How can i properly make this keybinding work?
Emacs "thinks" that C-m
is RET
because "Control M" is the ASCII control character "carriage return". Even though this reason is "historical" Emacs can run in a terminal and so it needs to support the way terminals still work now.
Try opening a terminal window, typing "ls
", and pressing C-m
. You will see that it is interpreted as "return", even though you are not in Emacs.
See Control character on Wikipedia for details about control characters.
To distinguish C-m
from RET
in a GUI Emacs, one could change C-i
to C-m
in @nispio's answer:
(define-key input-decode-map [?\C-m] [C-m])
;; now we can do this:
(defun my-command ()
(interactive)
(message "C-m is not the same as RET any more!"))
(global-set-key (kbd "<C-m>") #'my-command)
See also
How to distinguish C-i from TAB?, which is very closely related.
How to bind C-i as different from TAB? and this answer in particular.
C-m
as a prefix map for multiple-cursors.
Commented
Dec 9, 2017 at 18:55
I have no idea why, but the accepted answer did not work for me. Maybe it is because of how I declare my key bindings.
I use bind-keys
like this...
(bind-keys :map my-mode-map ...)
to bind keys, then I activate my-mode so that my key declarations always have precedence. Using my own mode is new, but I always used bind-keys
.
In bind-keys I include the following:
([return] . newline) ;; needed to distinguish from C-m
Looking at key declaration help, I do not believe that assigning [return]
to newline
changes the function of the return key, but declaring [return]
causes the Return
key to become different than Control-M
, allowing me to declare [C-m]
later in the same bind-keys command and the two declaratoins are unique.
I use the same technique to separate [tab]
from [C-i]
, first binding [tab]
, then binding [C-i]
in the same bind-keys
statement.