Werden wir Helden für einen Tag

Home | About | Archive

Advent of emacs #23: How I do many things with C-q in emacs

Posted on Dec 23, 2022 by Chung-hong Chan

On day 2, I talked about command discoverability and the pointlessness of memorizing key combinations. I also talked a bit about global-set-key on day 2 and keymaps on day7. This is an additional point to the topic.

Many default key configurations are transferable. For example, “dired-like” modes have similar key configurations (e.g. “g” for revert-buffer). I usually think along the same line when I assign my keys. I have a motto: For any given mode, find out the most frequently used command (besides cursor movement) and then assign the key combination C-q to that command.

You might ask: why C-q? First, C-q is close to C-w and C-a, both are frequently used key combinations. Second, I actually don’t understand what the command originally mapped to C-q (quoted-insert) does. Okay, I admit that I am lying. I know what quoted-insert does, but I actually don’t use the command.

Okay, okay, I am lying again. I actually read it somewhere that someone binds C-q to ess-eval-region-or-line-and-step. The Mandela Effect kicks in. I thought that I read it somewhere in the Emacs Speaks Statistics Config Share Space and specifically from Kara Woo’s configuration. But I was wrong. Actually, I “cargo-culted” key chords from her configuration (see day 7). Upon some searching on Github, I can only see that Github user mt-christo assigns C-q to ess-eval-region-or-line-and-step. I probably copied it from there.

ess-eval-region-or-line-and-step and eval-in-repl

By ESS’ default, C-RET maps to ess-eval-region-or-line-and-step. And it is similar to RStudio. But C-RET isn’t ideal because it clashes with many things 1. And I really needed to remap it. And C-q is my choice.

I want to take this opportunity to praise the ESS team for coming up with the command ess-eval-region-or-line-and-step. It is an extremely effective command. For a long time, I used ess-eval-region (C-c C-r) and ess-eval-line (C-c C-j). But the step part of the command ess-eval-region-or-line-and-step makes it wunderbar. It jumps to the next line of code automatically! So, I can just repeatedly press C-q when I want to eval a whole page of R code one line at a time.

eval-in-repl by Kazuki Yoshida et al provides the same ess-eval-region-or-line-and-step experience to many different languages. For example, I can have the same experience to eval emacs lisp code in ielm. My key combination, well, of course is also C-q.

(use-package eval-in-repl
  :bind (
		 :map emacs-lisp-mode-map
			  ("C-q" . 'eir-eval-in-ielm)
			  :map lisp-interaction-mode-map
			  ("C-q" . 'eir-eval-in-ielm)
			  :map Info-mode-map
			  ("C-q" . 'eir-eval-in-ielm))
  :config
  (require 'eval-in-repl-ielm)
  :init
  (setq eir-ielm-eval-in-current-buffer t)
  )

One key combination to rule them all

Because my brain has been hardwired to pressing C-q, I add C-q to many modes. For many modes, there are just a few operations; directional operations and maybe one or two additional commands. For those modes, I just leave the directional operations intact and then the most important commands to C-q.

On day 3, you see that I assign C-q to vterm-send-next-key-verbose. On day 22, I assign C-q to toggling the cursor in nov.

For elfeed, I assign C-q to elfeed-update. For deft, deft-filter is assigned to —you guess it— C-q. 2 C-q becomes my second panic button, after the first panic button C-g 3.

A normal emacs installation comes with a few thousand commands. By homogenizing the key combination like this, the complexity of emacs is reduced and hence the cognitive load to use it. Also, it makes the emacs experience truly my own.


  1. In some terminal emulators, C-RET and RET are the same. Therefore for a long time, I didn’t know ess-eval-region-or-line-and-step exists. 

  2. And for the sake of completeness, C-c C-c is to cancel the filter in deft. So I can quickly search and cancel a search by C-q some keywords and then C-c C-c; rather than using sluggish interface. 

  3. BTW, if one doesn’t think C-q makes any sense, it is better put this in the “home row”. Among a,s,d,f, I think it is better to make C-d the “Isildur’s Bane” (if you don’t use delete-char, of course; I don’t actually). 


Powered by Jekyll and profdr theme