Terminal Emacs
handicaps your GUI Emacs
, and makes less number of keys available to you
If you are on GUI Emacs
you can get atleast three additional keys. Ctrl-i
, Ctrl-m
and Ctrl-[
.
Experienced users of Emacs
“know” that
Ctrl-i
behaves similar to key labeledTab
Ctrl-m
behaves similar to the key labelledEnter
orReturn
Ctrl-[
behaves similar to the keyEsc
Expert users know that the above “equivalence” in keys exist to make Emacs
function well with modern keyboards on terminals.1
In other words, the overloading of certain Ctrl
keys with their function
brethren is a handicap imposed by terminal Emacs
on GUI Emacs
.
What this means is that you can configure your Emacs
to break the historical umbilical cord, and gift yourself three bonus keys—Ctrl-i
, Ctrl-m
and Ctrl-[
—in GUI Emacs
.
Define bonus keys
Add the following snippet to your early-init.el
, and enjoy three additional keys.
Let me reiterate, put this snippet in your early-init.el
,and NOT the regular init file.
(add-hook 'after-make-frame-functions (defun setup-blah-keys (frame) (with-selected-frame frame (when (display-graphic-p) ; don't remove this condition, if you want ; terminal Emacs to be usable ;; - When you type `Ctrl-i', Emacs see it as `BLAH-i', and NOT as 'Tab' ;; - When you type `Ctrl-m', Emacs see it as `BLAH-m', and NOT as 'Return' ;; - When you type `Ctrl-[', Emacs see it as `BLAH-lsb', and not as 'Esc'. ;; ;; That is, ;; ;; - `Ctrl-i' and 'Tab' keys are different ;; - `Ctrl-m' and 'Return' keys are different ;; - `Ctrl-[' and 'Esc' keys are different ;; ;; The three BLAH keys are the bonus keys. (define-key input-decode-map (kbd "C-i") [BLAH-i]) (define-key input-decode-map (kbd "C-[") [BLAH-lsb]) ; left square bracket (define-key input-decode-map (kbd "C-m") [BLAH-m]) ;; You can replace `BLAH-' above with `C-' or ;; `CONTROL-', it doesnt' matter. ;; ;; BLAH is merely a symbol / name; feel free to change ;; it to whatever you like . ))))
How to bind the bonus keys
Down below, I show you how you may bind the bonus BLAH
keys. The important thing to note is that you need to enclose your new keys within “<>”. These BLAH
keys are no different from any other key on your Emacs
.
(custom-set-variables ;; Default value of `outline-minor-mode-prefix' is "C-c @". ;; @-bindings are cumbersome to type; setup a convenient prefix. '(outline-minor-mode-prefix (kbd "<BLAH-i>")))
;; I use keyboard macros frequently; ;; C-c C-k is too long a prefix for commands that are frequent. So, ;; put the keyboard macro keys on "BLAH-m" (define-key global-map (kbd "<BLAH-m>") 'kmacro-keymap) (define-key kmacro-keymap (kbd "(") 'kmacro-start-macro) (define-key kmacro-keymap (kbd ")") 'kmacro-end-macro) (define-key kmacro-keymap (kbd "C-x") 'kmacro-end-and-call-macro) (put 'kmacro-end-and-call-macro 'repeat-map 'kmacro-keymap)
;; Some keybindings to generate the `super', 'hyper' and `alt' modifiers, ;; when your keyboard has none of these modifiers. (define-key function-key-map (kbd "<BLAH-lsb> h") 'event-apply-hyper-modifier) (define-key function-key-map (kbd "<BLAH-lsb> s") 'event-apply-super-modifier) (define-key function-key-map (kbd "<BLAH-lsb> m") 'event-apply-meta-modifier) (define-key function-key-map (kbd "<BLAH-lsb> a") 'event-apply-alt-modifier) (define-key function-key-map (kbd "<BLAH-lsb> S") 'event-apply-shift-modifier) (define-key function-key-map (kbd "<BLAH-lsb> c") 'event-apply-control-modifier)
Down below you see a screenshot of the BLAH
keys in action.
When you type Ctrl-i
, Emacs sees it as BLAH-i
, and NOT as Tab
When you type Ctrl-m
. Emacs sees its BLAH-m
, and NOT as Return
When you type Ctrl-[
, Emacs sees it as BLAH-lsb
, and not as Esc
Conclusion
With the advent of the package
-manager, there is an explosion of third-party packages. This means more and more command
-s are available to you as a user. At some point in time every Emacs
user feels the need for additional keys on the keyboard. The recipe outlined in this article lays three bonus keys at your disposal.
I am using the BLAH
keys even as I type now, and I am sure that these BLAH
keys will find a permanent place in your early-init.el
file.
I was trying to write a package to wrap this and realized, in Emacs server-client mode, I don’t know if you can bind a key to only one frame. So I’m not sure if it can work in a server-client application..
LikeLike
Thanks for your interest. I have updated the recipe to work when Emacs is run as a daemon.
LikeLike