Additional modifier keys in emacs?

customization, emacs, key-bindings

Solution

I dug around in the code and came up with this. It binds `s j` to `my-dired-next-dirline`, but right after you've done that, just `j` is enough to do it again. Any other key resets the temporary binding.

Note that the function `set-temporary-overlay-map` was added in Emacs 24.2, which at the time of this writing hasn't been released yet, so you'll need to build Emacs from git.

(defun my-dired-next-dirline ()
  (interactive)
  (dired-next-dirline 1)
  (set-temporary-overlay-map
   (let ((map (make-sparse-keymap)))
     (define-key map [?j] 'my-dired-next-dirline)
     map)
   nil))

(eval-after-load "dired"
  '(progn
     (let ((prefix-map (make-sparse-keymap)))
       (define-key prefix-map "j" 'my-dired-next-dirline)  
       (define-key dired-mode-map "s" prefix-map))))

Problem

I have been modifying my Emacs setup quite alot recently but I reached a problem which is starting to annoy me. I would like to be able to introduce additional modifier like keys. What I am trying to do, to make things clearer, is when I am in dired-mode (which doesn't accept textual input so normal letters can be rebound) I would like it so that when I hold down the letter `s` and press `j` or `l` the cursor moves to the next and previous directory line respectively. Effectively making the `s` key act like a modifier. I have looked into making the `s` apply a modifier such as `super` or `hyper` but those are all used for global things. Is this possible? if not then that's a shame. Edit: There seems to be some confusion with what I'm after. If I define a normal key sequence such as `(define-key map (kbd "s j") 'dired-next-dirline)` Then I have to keep pressing the `s` key every time before I press `j` to move to the next directory line. This is not what I am looking for (not to sound angry :P) I want `s` to act like a modifier where I can keep the `s` key held down and keep tapping `j` to move down the lines. I hope I have made this more clear. Thanks.

Original source