4

Background

With jumping packages like Ace and Avy, you can start a function, provide a query char, and then jump to somewhere based on further input. (Lately I've preferred Avy, but that's irrelevant here.)

I have had both bound to C-' C-; (with other jumping functions bound to the home row) so that I can just hold control and fire off the sequence. It's very distracting though to have to lift my finger off control to input a 'plain' character for read-char to read.

Question

How can I strip all modifier keys off a read-char-returned key code?

Sean Allred
  • 6,861
  • 16
  • 85
  • 1
    For a-z you can likely just do: `(string (+ (read-char) 96))` You'll need to do some more sanity checking for anything you use though, also you'll need to handle `C-g` which you can likely with `with-local-quit`. – Jordon Biondo May 11 '15 at 21:06

1 Answers1

4

I think you want event-basic-type. E.g. (event-basic-type ?\C-;) returns ?;.

If you want to only stop the control modifier but keep the other modifiers (e.g. the shift modifier), then you can try something like:

(require 'cl-lib)
(defun my-strip-control (event)
  (event-convert-list
   (append (cl-set-difference (event-modifiers event)
                              '(control click))
           (list (event-basic-type event)))))
Stefan
  • 26,154
  • 3
  • 46
  • 84
  • This is good enough for my use case (and actually answers my question more strictly than I meant it) so I'll still accept if the following can't be done: is it possible to keep 'Shift' as a modifier key? That is, to convert `\C-L -> L`? – Sean Allred May 11 '15 at 21:44
  • In Elisp, `?\C-l` and `?\C-L` are one and the same. – Stefan May 11 '15 at 22:05
  • Is that really true? Because I have `C-s` bound to `isearch` and `C-S` (i.e. `C-S-s`) bound to `helm-swoop`. – Sean Allred May 12 '15 at 00:10
  • 1
    Details matter: `?\C-l` and `?\C-L` are one and the same, but `?\C-L` and `?\C-\S-l` are different. – Stefan May 12 '15 at 00:42