Subject: bug#9751: 23.3; Alternative Keyboard Feature/Bug

From: Juri Linkov <[email-masked]>
Date: Thu, 20 Oct 2011 09:29:54 +0300

> I guess we can use function-key-map instead, tho.

And `function-key-map' really works even for characters
with no modifiers (for the value `nil' below):

  (let ((modifiers '(nil (control) (meta) (control meta)))
        (map '((?ς . ?w) (?ε . ?e) (?ρ . ?r) (?τ . ?t) (?υ . ?y)
               (?θ . ?u) (?ι . ?i) (?ο . ?o) (?π . ?p) (?α . ?a)
               (?σ . ?s) (?δ . ?d) (?φ . ?f) (?γ . ?g) (?η . ?h)
               (?ξ . ?j) (?κ . ?k) (?λ . ?l) (?ζ . ?z) (?χ . ?x)
               (?ψ . ?c) (?ω . ?v) (?β . ?b) (?ν . ?n) (?μ . ?m) (?\; . ?q))))
    (dolist (pair map)
      (dolist (mod modifiers)
        (define-key local-function-key-map
          (vector (append mod (list (car pair))))
          (vector (append mod (list (cdr pair))))))))

So `C-χ β' runs `switch-to-buffer' whereas self-inserting characters
are inserted as is, without translation.

However, there is another problem.  Single-key bindings don't work in modes
where they are bound to other commands, like `v' (`dired-view-file') in Dired,
or `d' (`Info-directory') in Info.

I see no better way than to translate single keys in such modes individually:

  (let ((map '((?ς . ?w) (?ε . ?e) (?ρ . ?r) (?τ . ?t) (?υ . ?y)
               (?θ . ?u) (?ι . ?i) (?ο . ?o) (?π . ?p) (?α . ?a)
               (?σ . ?s) (?δ . ?d) (?φ . ?f) (?γ . ?g) (?η . ?h)
               (?ξ . ?j) (?κ . ?k) (?λ . ?l) (?ζ . ?z) (?χ . ?x)
               (?ψ . ?c) (?ω . ?v) (?β . ?b) (?ν . ?n) (?μ . ?m) (?\; . ?q))))
    (dolist (pair map)
      (define-key dired-mode-map (vector (car pair)) (vector (cdr pair)))
      (define-key Info-mode-map  (vector (car pair)) (vector (cdr pair)))
      ;; and many other similar modes ...
      ))

And then some single keys work, some don't.  For example, typing a key
that translates to `x' in Dired writes in the echo area:

  Keyboard macro terminated by a command ringing the bell