branch: elpa/xah-fly-keys commit 450d32139d4451acfc9dcb64c7db109ec1ca0564 Author: Xah Lee <x...@xahlee.org> Commit: Xah Lee <x...@xahlee.org>
major rewrite the keyboard layout code. before, to define a new layout, you have to create a alist of key mappings, e.g. '("azerty" . ("=" . "$") ("-" . "ù") ("a" . "q") ("b" . "n") ("c" . "i") ("d" . "h") ... ) ) now, you just draw a text diagram. (puthash "azerty" " ~ ! @ # $ % ^ & * ( ) { } ² & é \" ' ( - è _ ç à ) = a z e r t y u i o p ^ $ * q s d f g h j k l m ù w x c v b n , ; : ! A Z E R T Y U I O P ? + | Q S D F G H J K L M Ù W X C V B N ? . / § " xah-fly-layout-diagrams) new and removed layouts: adnw (German) azerty azerty-be bepo (French) colemak -colemak-dhm -colemak-dhm-angle -colemak-dhk +colemak-dh dvorak +engrammer koy (German) +halmak +minimak neo2 (German) norman programer-dvorak pt-nativo (Brazil) +qfmlwy -carpalx-qfmlwy -carpalx-qgmlwb -carpalx-qgmlwy qwerty qwerty-abnt (Brazil) qwerty-no (Norwegian) qwertz +qwpr workman removed: xah-fly-layouts new function or variables: xah-fly-layout-diagrams xah-fly-create-key-conv-table xah-fly--convert-kbd-str → xah-fly--convert-key --- xah-fly-keys.el | 1187 ++++++++++++++++++------------------------------------- 1 file changed, 393 insertions(+), 794 deletions(-) diff --git a/xah-fly-keys.el b/xah-fly-keys.el index 207c3255af..4d6ab02d2a 100644 --- a/xah-fly-keys.el +++ b/xah-fly-keys.el @@ -4,7 +4,7 @@ ;; Author: Xah Lee ( http://xahlee.info/ ) ;; Maintainer: Xah Lee <x...@xahlee.org> -;; Version: 24.24.20240422075003 +;; Version: 25.0.20240422075003 ;; Created: 2013-09-10 ;; Package-Requires: ((emacs "27")) ;; Keywords: convenience, vi, vim, ergoemacs, keybinding @@ -112,31 +112,31 @@ ;; (xah-fly-keys 1) ;; ;; possible layout values: -;; adnw + +;; adnw (German) ;; azerty ;; azerty-be -;; beopy -;; bepo -;; carpalx-qfmlwy -;; carpalx-qgmlwb -;; carpalx-qgmlwy +;; bepo (French) ;; colemak -;; colemak-dhm -;; colemak-dhm-angle -;; colemak-dhk +;; colemak-dh ;; dvorak -;; koy -;; neo2 +;; engrammer +;; koy (German) +;; halmak +;; minimak +;; neo2 (German) ;; norman ;; programer-dvorak -;; pt-nativo +;; pt-nativo (Brazil) +;; qfmlwy ;; qwerty -;; qwerty-abnt -;; qwerty-no (qwerty Norwegian) +;; qwerty-abnt (Brazil) +;; qwerty-no (Norwegian) ;; qwertz +;; qwpr ;; workman -;; -;; supported layouts are stored in the variable xah-fly-layouts + +;; supported layouts are stored in the variable xah-fly-layout-diagrams ;;; Code: @@ -2874,795 +2874,392 @@ Version: 2017-01-29" ;; layout lookup tables for key conversion -(defvar xah-fly-layouts nil "A alist. -Key is layout name, string type. -Value is a alist, each element is of the form (\"e\" . \"d\"). -First char is Dvorak, second is corresponding char of the destination layout. -When a char is not in this alist, they are assumed to be the same. ") - -(push '("azerty" . (("." . "e") - ("," . "z") - ("'" . "a") - (";" . "w") - ("/" . "^") - ("[" . ")") - ("]" . "=") - ("=" . "$") - ("-" . "ù") - ("a" . "q") - ("b" . "n") - ("c" . "i") - ("d" . "h") - ("e" . "d") - ("f" . "y") - ("g" . "u") - ("h" . "j") - ("i" . "g") - ("j" . "c") - ("k" . "v") - ("l" . "p") - ("m" . ",") - ("n" . "l") - ("o" . "s") - ("p" . "r") - ("q" . "x") - ("r" . "o") - ("s" . "m") - ("t" . "k") - ("u" . "f") - ("v" . ":") - ("w" . ";") - ("x" . "b") - ("y" . "t") - ("z" . "!") - ("1" . "&") - ("2" . "é") - ("3" . "\"") - ("4" . "'") - ("5" . "(") - ("6" . "-") - ("7" . "è") - ("8" . "_") - ("9" . "ç") - ("0" . "à") - ("\\" . "*") - ("`" . "²"))) xah-fly-layouts) - -(push '("azerty-be" . (("." . "e") - ("," . "z") - ("'" . "a") - (";" . "w") - ("/" . "^") - ("[" . ")") - ("]" . "-") - ("=" . "$") - ("-" . "ù") - ("a" . "q") - ("b" . "n") - ("c" . "i") - ("d" . "h") - ("e" . "d") - ("f" . "y") - ("g" . "u") - ("h" . "j") - ("i" . "g") - ("j" . "c") - ("k" . "v") - ("l" . "p") - ("m" . ",") - ("n" . "l") - ("o" . "s") - ("p" . "r") - ("q" . "x") - ("r" . "o") - ("s" . "m") - ("t" . "k") - ("u" . "f") - ("v" . ":") - ("w" . ";") - ("x" . "b") - ("y" . "t") - ("z" . "=") - ("1" . "&") - ("2" . "é") - ("3" . "\"") - ("4" . "'") - ("5" . "(") - ("6" . "§") - ("7" . "è") - ("8" . "!") - ("9" . "ç") - ("0" . "à") - ("\\" . "µ") - ("`" . "²"))) xah-fly-layouts) - -(push '("colemak" . (("'" . "q") - ("," . "w") - ("." . "f") - ("y" . "g") - ("f" . "j") - ("g" . "l") - ("c" . "u") - ("r" . "y") - ("l" . ";") - ("o" . "r") - ("e" . "s") - ("u" . "t") - ("i" . "d") - ("d" . "h") - ("h" . "n") - ("t" . "e") - ("n" . "i") - ("s" . "o") - (";" . "z") - ("q" . "x") - ("j" . "c") - ("k" . "v") - ("x" . "b") - ("b" . "k") - ("w" . ",") - ("v" . ".") - ("z" . "/"))) xah-fly-layouts) - -(push '("colemak-dhm" . (("'" . "q") - ("," . "w") - ("." . "f") - (";" . "z") - ("b" . "k") - ("c" . "u") - ("d" . "m") - ("e" . "s") - ("f" . "j") - ("g" . "l") - ("h" . "n") - ("i" . "g") - ("j" . "c") - ("k" . "d") - ("l" . ";") - ("m" . "h") - ("n" . "i") - ("o" . "r") - ("q" . "x") - ("r" . "y") - ("s" . "o") - ("t" . "e") - ("u" . "t") - ("v" . ".") - ("w" . ",") - ("x" . "v") - ("y" . "b") - ("z" . "/"))) xah-fly-layouts) - -(push '("colemak-dhm-angle" . (("'" . "q") - ("," . "w") - ("." . "f") - (";" . "x") - ("b" . "k") - ("c" . "u") - ("d" . "m") - ("e" . "s") - ("f" . "j") - ("g" . "l") - ("h" . "n") - ("i" . "g") - ("j" . "d") - ("k" . "v") - ("l" . ";") - ("m" . "h") - ("n" . "i") - ("o" . "r") - ("q" . "c") - ("r" . "y") - ("s" . "o") - ("t" . "e") - ("u" . "t") - ("v" . ".") - ("w" . ",") - ("x" . "\\") - ("y" . "b") - ("z" . "/"))) xah-fly-layouts) - -(push '("colemak-dhk" . (("'" . "q") - ("," . "w") - ("." . "f") - (";" . "z") - ("b" . "m") - ("c" . "u") - ("d" . "k") - ("e" . "s") - ("f" . "j") - ("g" . "l") - ("h" . "n") - ("i" . "g") - ("j" . "c") - ("k" . "d") - ("l" . ";") - ("m" . "h") - ("n" . "i") - ("o" . "r") - ("q" . "x") - ("r" . "y") - ("s" . "o") - ("t" . "e") - ("u" . "t") - ("v" . ".") - ("w" . ",") - ("x" . "v") - ("y" . "b") - ("z" . "/"))) xah-fly-layouts) - -(push '("dvorak" . nil) xah-fly-layouts) - -(push '("optimot" . (("-" . "^") - ("'" . "à") - ("," . "j") - ("." . "o") - (";" . "k") - ("/" . "x") - ("[" . "#") - ("]" . "@") - ("=" . "ç") - ("a" . "a") - ("b" . "g") - ("c" . "l") - ("d" . "p") - ("e" . "e") - ("f" . "f") - ("g" . "d") - ("h" . "t") - ("i" . ",") - ("j" . "è") - ("k" . ".") - ("l" . "q") - ("m" . "c") - ("n" . "r") - ("o" . "i") - ("p" . "é") - ("q" . "y") - ("r" . "'") - ("s" . "n") - ("t" . "s") - ("u" . "u") - ("v" . "h") - ("w" . "m") - ("x" . "w") - ("y" . "b") - ("z" . "v") - ("1" . "«") - ("2" . "»") - ("3" . "\"") - ("4" . "-") - ("5" . "+") - ("6" . "*") - ("7" . "/") - ("8" . "=") - ("9" . "(") - ("0" . ")") - ("\\" . "ç") - ("`" . "$"))) xah-fly-layouts) - -(push '("programer-dvorak" . (("`" . "$") - ("1" . "&") - ("2" . "[") - ("3" . "{") - ("4" . "}") - ("5" . "(") - ("6" . "=") - ("7" . "*") - ("8" . ")") - ("9" . "+") - ("0" . "]") - ("[" . "!") - ("]" . "#") - ("!" . "%") - ("@" . "7") - ("#" . "5") - ("$" . "3") - ("%" . "1") - ("^" . "9") - ("&" . "0") - ("*" . "2") - ("(" . "4") - (")" . "6") - ("{" . "8") - ("}" . "`") - ("'" . ";") - ("\"" . ":") - (";" . "'") - (":" . "\"") - ("=" . "@") - ("+" . "^"))) xah-fly-layouts) - -(push '("qwerty" . (("." . "e") - ("," . "w") - ("'" . "q") - (";" . "z") - ("/" . "[") - ("[" . "-") - ("]" . "=") - ("=" . "]") - ("-" . "'") - ("a" . "a") - ("b" . "n") - ("c" . "i") - ("d" . "h") - ("e" . "d") - ("f" . "y") - ("g" . "u") - ("h" . "j") - ("i" . "g") - ("j" . "c") - ("k" . "v") - ("l" . "p") - ("n" . "l") - ("o" . "s") - ("p" . "r") - ("q" . "x") - ("r" . "o") - ("s" . ";") - ("t" . "k") - ("u" . "f") - ("v" . ".") - ("w" . ",") - ("x" . "b") - ("y" . "t") - ("z" . "/"))) xah-fly-layouts) - -;; QWERTY Norwegian -(push '("qwerty-no" . (("." . "e") - ("," . "w") - ("'" . "q") - (";" . "z") - ("/" . "å") - ("[" . "+") - ("]" . "´") - ("=" . "¨") - ("-" . "æ") - ("b" . "n") - ("c" . "i") - ("d" . "h") - ("e" . "d") - ("f" . "y") - ("g" . "u") - ("h" . "j") - ("i" . "g") - ("j" . "c") - ("k" . "v") - ("l" . "p") - ("n" . "l") - ("o" . "s") - ("p" . "r") - ("q" . "x") - ("r" . "o") - ("s" . "ø") - ("t" . "k") - ("u" . "f") - ("v" . ".") - ("w" . ",") - ("x" . "b") - ("y" . "t") - ("z" . "-"))) xah-fly-layouts) - -(push '("qwerty-abnt" . (("." . "e") - ("," . "w") - ("'" . "q") - (";" . "z") - ("/" . "'") - ("[" . "-") - ("]" . "=") - ("=" . "[") - ("-" . "~") - ("b" . "n") - ("c" . "i") - ("d" . "h") - ("e" . "d") - ("f" . "y") - ("g" . "u") - ("h" . "j") - ("i" . "g") - ("j" . "c") - ("k" . "v") - ("l" . "p") - ("n" . "l") - ("o" . "s") - ("p" . "r") - ("q" . "x") - ("r" . "o") - ("s" . "ç") - ("t" . "k") - ("u" . "f") - ("v" . ".") - ("w" . ",") - ("x" . "b") - ("y" . "t") - ("z" . ";"))) xah-fly-layouts) - -(push '("qwertz" . (("." . "e") - ("," . "w") - ("'" . "q") - (";" . "y") - ("/" . "ü") - ("[" . "ß") - ("]" . "´") - ("=" . "+") - ("-" . "ä") - ("b" . "n") - ("c" . "i") - ("d" . "h") - ("e" . "d") - ("f" . "z") - ("g" . "u") - ("h" . "j") - ("i" . "g") - ("j" . "c") - ("k" . "v") - ("l" . "p") - ("n" . "l") - ("o" . "s") - ("p" . "r") - ("q" . "x") - ("r" . "o") - ("s" . "ö") - ("t" . "k") - ("u" . "f") - ("v" . ".") - ("w" . ",") - ("x" . "b") - ("y" . "t") - ("z" . "-"))) xah-fly-layouts) - -(push '("workman" . (("[" . "-") - ("]" . "=") - ("'" . "q") - ("," . "d") - ("." . "r") - ("p" . "w") - ("y" . "b") - ("f" . "j") - ("g" . "f") - ("c" . "u") - ("r" . "p") - ("l" . ";") - ("/" . "[") - ("=" . "]") - ("o" . "s") - ("e" . "h") - ("u" . "t") - ("i" . "g") - ("d" . "y") - ("h" . "n") - ("t" . "e") - ("n" . "o") - ("s" . "i") - ("-" . "'") - (";" . "z") - ("q" . "x") - ("j" . "m") - ("k" . "c") - ("x" . "v") - ("b" . "k") - ("m" . "l") - ("w" . ",") - ("v" . ".") - ("z" . "/"))) xah-fly-layouts) - -(push '("norman" . (("'" . "q") - ("," . "w") - ("." . "d") - ("p" . "f") - ("y" . "k") - ("f" . "j") - ("g" . "u") - ("c" . "r") - ("r" . "l") - ("l" . ";") - ("o" . "s") - ("u" . "t") - ("i" . "g") - ("d" . "y") - ("h" . "n") - ("t" . "i") - ("n" . "o") - ("s" . "h") - (";" . "z") - ("q" . "x") - ("j" . "c") - ("k" . "v") - ("x" . "b") - ("b" . "p") - ("w" . ",") - ("v" . ".") - ("z" . "/"))) xah-fly-layouts) - -(push '("neo2" . (("'" . "x") - ("," . "v") - ("." . "l") - ("p" . "c") - ("y" . "w") - ("f" . "k") - ("g" . "h") - ("c" . "g") - ("r" . "f") - ("l" . "q") - ("a" . "u") - ("o" . "i") - ("e" . "a") - ("u" . "e") - ("i" . "o") - ("d" . "s") - ("h" . "n") - ("t" . "r") - ("n" . "t") - ("s" . "d") - (";" . "ü") - ("q" . "ö") - ("j" . "ä") - ("k" . "p") - ("x" . "z") - ("w" . ",") - ("v" . ".") - ("z" . "j") - ("/" . "ß") - ("[" . "-") - ("-" . "y"))) xah-fly-layouts) - -(push '("koy" . (("'" . "k") - ("," . ".") - ("." . "o") - ("p" . ",") - ("f" . "v") - ("r" . "l") - ("l" . "ß") - ("a" . "h") - ("o" . "a") - ("u" . "i") - ("i" . "u") - ("h" . "t") - ("t" . "r") - (";" . "x") - ("j" . "ä") - ("k" . "ü") - ("x" . "ö") - ("m" . "p") - ("v" . "m") - ("z" . "j"))) xah-fly-layouts) - -(push '("adnw" . (("'" . "k") - ("," . "u") - ("." . "ü") - ("p" . ".") - ("y" . "ä") - ("f" . "v") - ("r" . "l") - ("l" . "j") - ("/" . "f") - ("a" . "h") - ("o" . "i") - ("u" . "a") - ("i" . "o") - ("h" . "t") - ("t" . "r") - ("-" . "ß") - (";" . "x") - ("q" . "y") - ("j" . "ö") - ("k" . ",") - ("x" . "q") - ("m" . "p") - ("v" . "m"))) xah-fly-layouts) - -(push '("pt-nativo" . ((";" . "«") - ("/" . "~") - ("[" . "º") - ("]" . "<") - ("=" . "-") - ("-" . "´") - ("a" . "i") - ("b" . "q") - ("c" . "t") - ("d" . "m") - ("e" . "a") - ("f" . "w") - ("g" . "l") - ("h" . "d") - ("i" . "u") - ("k" . "b") - ("l" . "p") - ("m" . "v") - ("n" . "r") - ("o" . "e") - ("p" . "h") - ("q" . "ç") - ("r" . "c") - ("s" . "n") - ("t" . "s") - ("u" . "o") - ("v" . "f") - ("w" . "g") - ("x" . "k") - ("y" . "x"))) xah-fly-layouts) - -(push '("carpalx-qgmlwy" . (("." . "m") - ("," . "g") - ("'" . "q") - (";" . "z") - ("/" . "[") - ("[" . "-") - ("]" . "=") - ("=" . "]") - ("-" . "'") - ("a" . "d") - ("b" . "k") - ("c" . "u") - ("d" . "i") - ("e" . "t") - ("f" . "y") - ("g" . "f") - ("h" . "a") - ("i" . "r") - ("j" . "c") - ("k" . "v") - ("l" . ";") - ("m" . "p") - ("n" . "o") - ("o" . "s") - ("p" . "l") - ("q" . "x") - ("r" . "b") - ("s" . "h") - ("t" . "e") - ("u" . "n") - ("v" . ".") - ("w" . ",") - ("x" . "j") - ("y" . "w") - ("z" . "/"))) xah-fly-layouts) - -(push '("carpalx-qgmlwb" . (("." . "m") - ("," . "g") - ("'" . "q") - (";" . "z") - ("/" . "[") - ("[" . "-") - ("]" . "=") - ("=" . "]") - ("-" . "'") - ("a" . "d") - ("b" . "k") - ("c" . "u") - ("d" . "i") - ("e" . "t") - ("f" . "b") - ("g" . "y") - ("h" . "a") - ("i" . "r") - ("j" . "c") - ("k" . "f") - ("l" . ";") - ("m" . "p") - ("n" . "o") - ("o" . "s") - ("p" . "l") - ("q" . "x") - ("r" . "v") - ("s" . "h") - ("t" . "e") - ("u" . "n") - ("v" . ".") - ("w" . ",") - ("x" . "j") - ("y" . "w") - ("z" . "/"))) xah-fly-layouts) - -(push '("carpalx-qfmlwy" . (("." . "m") - ("," . "f") - ("'" . "q") - (";" . "z") - ("/" . "[") - ("[" . "-") - ("]" . "=") - ("=" . "]") - ("-" . "'") - ("a" . "d") - ("b" . "p") - ("c" . "o") - ("d" . "i") - ("e" . "t") - ("f" . "y") - ("g" . "u") - ("h" . "a") - ("i" . "r") - ("j" . "g") - ("k" . "c") - ("l" . "j") - ("m" . "k") - ("n" . "h") - ("o" . "s") - ("p" . "l") - ("q" . "v") - ("r" . "b") - ("s" . ";") - ("t" . "e") - ("u" . "n") - ("v" . ".") - ("w" . ",") - ("y" . "w") - ("z" . "/"))) xah-fly-layouts) - -(push '("bepo" . (("'" . "b") - ("," . "é") - ("." . "p") - ("p" . "o") - ("y" . "è") - ("f" . "^") - ("g" . "v") - ("c" . "d") - ("r" . "l") - ("l" . "j") - ("o" . "u") - ("e" . "i") - ("u" . "e") - ("i" . ",") - ("d" . "c") - ("h" . "t") - ("t" . "s") - ("n" . "r") - ("s" . "n") - (":" . "à") - ("q" . "y") - ("j" . "x") - ("k" . ".") - ("x" . "k") - ("b" . "’") - ("m" . "q") - ("w" . "g") - ("v" . "h") - ("z" . "f") - ("3" . "»") - ("4" . "(") - ("5" . ")") - ("6" . "@") - ("7" . "+") - ("8" . "-") - ("9" . "/"))) xah-fly-layouts) +(defvar xah-fly-layout-diagrams (make-hash-table :test 'equal) + "A hashtable. +Key is string, of keyboard layout name. +Value is a string, of text-art (aka ASCII-art) form of the layout. +The text-art string, each key (sequence of chars) is separated by whitespace. +The string is split by white space, and each item is considered a key. +The key is usually a single char, can be unicode, but may also be alt ctrl tab shift return and other. +It is used to generate key conversion table of a key from layout to layout. +") + +(progn + + (puthash "adnw" " +~ ! @ # $ % ^ & * ( ) { } +` 1 2 3 4 5 6 7 8 9 0 [ ] + +k u ü . ä v g c l j f = \\ +h i e a o d t r n s ß +x y ö , q b p w m z + +K U Ü > Ä V G C L J F + | +H I E A O D T R N S ẞ +X Y Ö < Q B P W M Z +" xah-fly-layout-diagrams) + + (puthash "azerty" + " +~ ! @ # $ % ^ & * ( ) { } +² & é \" ' ( - è _ ç à ) = + +a z e r t y u i o p ^ $ * +q s d f g h j k l m ù +w x c v b n , ; : ! + +A Z E R T Y U I O P ? + | +Q S D F G H J K L M Ù +W X C V B N ? . / § +" xah-fly-layout-diagrams) + + (puthash "azerty-be" + " +~ ! @ # $ % ^ & * ( ) { } +² & é \" ' ( § è ! ç à ) - + +a z e r t y u i o p ^ $ µ +q s d f g h j k l m ù +w x c v b n , ; : = + +A Z E R T Y U I O P ^ $ Μ +Q S D F G H J K L M Ù +W X C V B N ? . / + +" xah-fly-layout-diagrams) + + (puthash "bepo" " +$ \" « » ( ) @ + - / * = % +# 1 2 3 4 5 6 7 8 9 0 ° ` + +b é p o è ^ v d l j z w \\ +a u i e , c t s r n m +à y x . k ' q g h f + +B É P O È ! V D L J Z W | +A U I E ; C T S R N M +À Y X : K ? Q G H F +" xah-fly-layout-diagrams) + + (puthash "colemak" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +q w f p g j l u y ; [ ] \\ +a r s t d h n e i o ' +z x c v b k m , . / + +Q W F P G J L U Y : { } | +A R S T D H N E I O \" +Z X C V B K M < > ? +" xah-fly-layout-diagrams) + + (puthash "colemak-dh" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +q w f p b j l u y ; [ ] \\ +a r s t g m n e i o ' +z x c d v k h , . / + +Q W F P B J L U Y : { } | +A R S T G M N E I O \" +Z X C D V K H < > ? +" xah-fly-layout-diagrams) + + (puthash "dvorak" " +~ ! @ # $ % ^ & * ( ) { } +` 1 2 3 4 5 6 7 8 9 0 [ ] + +' , . p y f g c r l / = \\ +a o e u i d h t n s - +; q j k x b m w v z + +\" < > P Y F G C R L ? + | +A O E U I D H T N S _ +: Q J K X B M W V Z +" xah-fly-layout-diagrams) + + (puthash "engrammer" " +~ ! @ # $ % ^ & * ( ) { } +` 1 2 3 4 5 6 7 8 9 0 [ ] + +b y o u ' ; l d w v z = \\ +c i e a , . h t s n q +g x j k - / r m f p + +B Y O U \" : L D W V Z + | +C I E A < > H T S N Q +G X J K _ ? R M F P +" xah-fly-layout-diagrams) + + (puthash "koy" " +^ ! @ # $ % ^ & * ( ) _ ~ +˘ 1 2 3 4 5 6 7 8 9 0 - ` + +k . o , y v g c l ß / = \\ +h a e i u d t r n s f +x q ä ü ö b p w m j + +K > O < Y V G C L ẞ ? + | +H A E I U D T R N S F +X Q Ä Ü Ö B P W M J +" xah-fly-layout-diagrams) + + (puthash "halmak" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +w l r b z ; q u d j [ ] \\ +s h n t , . a e o i ' +f m v c / g p x k y + +W L R B Z : Q U D J { } | +S H N T < > A E O I \" +F M V C ? G P X K Y +" xah-fly-layout-diagrams) + + (puthash "minimak" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +q w d r k y u i o p [ ] \\ +a s t f g h j e l ; ' +z x c v b n m , . / + +Q W D R K Y U I O P { } | +A S T F G H J E L : \" +Z X C V B N M < > ? +" xah-fly-layout-diagrams) + + ;; todo. need fix + (puthash "neo2" " +^ ! @ # $ % ^ & * ( ) { } +` 1 2 3 4 5 6 7 8 9 0 - ] + +x v l c w k h g f q ß = \\ +u i a e o s n r t d y +ü ö ä p z b m , . j + +X V L C W K H G F Q ? + | +U I A E O S N R T D Y +Ü Ö Ä P Z B M , . J +" xah-fly-layout-diagrams) + + (puthash "norman" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +q w d f k j u r l ; [ ] \\ +a s e t g y n i o h ' +z x c v b p m , . / + +Q W D F K J U R L : { } | +A S E T G Y N I O H \" +Z X C V B P M < > ? +" xah-fly-layout-diagrams) + + (puthash "programer-dvorak" " +~ % 7 5 3 1 9 0 2 4 6 8 ` +$ & [ { } ( = * ) + ] ! # + +; , . p y f g c r l / @ \\ +a o e u i d h t n s - +' q j k x b m w v z + +: < > P Y F G C R L ? ^ | +A O E U I D H T N S _ +\" Q J K X B M W V Z +" xah-fly-layout-diagrams) + + (puthash "pt-nativo" " +* ! \" # $ % & / ( ) = ª > ++ 1 2 3 4 5 6 7 8 9 0 º < + +' , . h x w l t c p ~ - \\ +i e a o u m d s r n ´ +« ç j b k q v g f z + +? ; : H X W L T C P ^ _ | +I E A O U M D S R N ` +Y Ç J B K Q V G F Z +" xah-fly-layout-diagrams) + + (puthash "qfmlwy" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +q f m l w y u o b j [ ] \\ +d s t n r i a e h ; ' +z v g c x p k , . / + +Q F M L W Y U O B J { } | +D S T N R I A E H : \" +Z V G C X P K < > ? +" xah-fly-layout-diagrams) + + (puthash "qwerty" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +q 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 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 < > ? +" xah-fly-layout-diagrams) + + (puthash "qwerty-abnt" " +\" ! @ # $ % ^ & * ( ) _ + + ' 1 2 3 4 5 6 7 8 9 0 - = + +q 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 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 < > : +" xah-fly-layout-diagrams) + + (puthash "qwerty-no" " +§ ! \" # ¤ % & / ( ) = ? ` +| 1 2 3 4 5 6 7 8 9 0 + \\ + +q 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 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 < > _ +" xah-fly-layout-diagrams) + + (puthash "qwertz" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +q w e r t z u i o p [ ] \\ +a s d f g h j k l ; ' +y x c v b n m , . / + +Q W E R T Z U I O P { } | +A S D F G H J K L : \" +Y X C V B N M < > ? +" xah-fly-layout-diagrams) + + (puthash "qwpr" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +q w p r f y u k l ; [ ] \\ +a s d t g h n i o e ' +z x c v b j m , . / + +Q W P R F Y U K L : { } | +A S D T G H N I O E \" +Z X C V B J M < > ? +" xah-fly-layout-diagrams) + + (puthash "workman" " +~ ! @ # $ % ^ & * ( ) _ + +` 1 2 3 4 5 6 7 8 9 0 - = + +q d r w b j f u p ; [ ] \\ +a s h t g y n e o i ' +z x m c v k l , . / + +Q D R W B J F U P : { } | +A S H T G Y N E O I \" +Z X M C V K L < > ? +" xah-fly-layout-diagrams)) + +(defun xah-fly-create-key-conv-table (Layout1 Layout2) + "Takes two text diagrams Layout1 Layout2, return a hashtable. +For remapping key from layout1 to layout2. + +example: + +Layout1 is a string. e.g. + +a b c d +e f shift + +Layout2 is a string. e.g. + +a o e i +m n ctrl + +return a hashtable, e.g. + +b → o +c → e +d → i +e → m +f → n +shift → ctrl + +If the keys in layouts are the same, it's not in the table. + +Version 2024-04-19" + (let (xkeys1 xkeys2 (xtable (make-hash-table :test 'equal))) + (setq xkeys1 (split-string Layout1 "[ \n]+")) + (setq xkeys2 (split-string Layout2 "[ \n]+")) + (when (not (eq (length xkeys1) (length xkeys2))) + (error "layout %s and %s lengths not same." (length Layout1) (length Layout2))) + (seq-mapn + (lambda (x y) + (if (string-equal x y) + nil + (puthash x y xtable))) + xkeys1 xkeys2) + xtable + )) + +;; (xah-fly-create-key-conv-table +;; (gethash "qwerty" xah-fly-layout-diagrams) +;; (gethash "dvorak" xah-fly-layout-diagrams)) (defvar xah-fly-key-current-layout nil "The current keyboard layout. -Value is a key in `xah-fly-layouts'. +Value is a key in `xah-fly-layout-diagrams'. Do not set this variable manually. Use `xah-fly-keys-set-layout' to set it. -If the value is nil, it is automatically set to \"qwerty\". +Default to qwerty. Version: 2022-10-22") (if xah-fly-key-current-layout nil (setq xah-fly-key-current-layout "qwerty")) (defvar xah-fly--key-convert-table nil "A alist that's the conversion table from dvorak to current layout. -Value structure is one of the key's value of `xah-fly-layouts'. -Value is programtically set from value of `xah-fly-key-current-layout'. -Do not manually set this variable. -Version: 2019-02-12 2022-10-22" ) - -(setq xah-fly--key-convert-table - (cdr (assoc xah-fly-key-current-layout xah-fly-layouts))) - -(defun xah-fly--convert-kbd-str (Charstr) - "Return the corresponding char Charstr according to `xah-fly--key-convert-table'. -Charstr must be a string that is the valid argument to `kbd'. -Version: 2022-10-25" +Value is a hashtable. +Version: 2019-02-12 2024-04-22" ) + +(setq + xah-fly--key-convert-table + (xah-fly-create-key-conv-table + (gethash "dvorak" xah-fly-layout-diagrams) + (gethash xah-fly-key-current-layout xah-fly-layout-diagrams))) + +(defun xah-fly--convert-key (Keystr) + "Return the corresponding Keystr according to `xah-fly--key-convert-table'. +Keystr must be a string that is the valid argument to `kbd'. +Keystr may be a single key, or key sequence separated by whitespaces. +Version: 2022-10-25 2024-04-22" (interactive) (mapconcat 'identity (mapcar (lambda (x) - (let ((xresult (assoc x xah-fly--key-convert-table))) - (if xresult (cdr xresult) x))) - (split-string Charstr " +")) + (let ((xnew (gethash x xah-fly--key-convert-table))) + (if xnew xnew x))) + (split-string Keystr " +")) " ")) (defun xah-fly--define-keys (KeymapName KeyCmdAlist &optional Direct-p) "Map `define-key' over a alist KeyCmdAlist, with key layout remap. -The key is remapped from Dvorak to the current keyboard layout by `xah-fly--convert-kbd-str'. +The key is remapped from Dvorak to the current keyboard layout by `xah-fly--convert-key'. If Direct-p is t, do not remap key to current keyboard layout. Example usage: (xah-fly--define-keys @@ -3676,7 +3273,7 @@ Version: 2020-04-18 2022-10-25 2023-08-21" (lambda (x) (define-key KeymapName - (kbd (if Direct-p (car x) (xah-fly--convert-kbd-str (car x)))) + (kbd (if Direct-p (car x) (xah-fly--convert-key (car x)))) (cdr x))) KeyCmdAlist)) @@ -3730,8 +3327,7 @@ Keep in mind that this acts like a normal global minor mode map, so other minor (defun xah-fly-define-keys () "Define the keys for xah-fly-keys. -Used by `xah-fly-keys-set-layout' for changing layout. -Version: 2022-10-31" +Version: 2022-10-31 2024-04-22" (interactive) (let () @@ -4419,8 +4015,8 @@ Version: 2022-10-31" (defun xah-fly-keys-set-layout (Layout) "Set a keyboard layout. -Argument must be one of the key name in `xah-fly-layouts' -Version: 2021-05-19 2022-09-11 2022-10-22 2022-10-31" +Argument must be one of the key name in `xah-fly-layout-diagrams' +Version: 2021-05-19 2022-10-31 2024-04-22" (interactive "sType a layout: ") (let ((xnewlout (cond @@ -4429,10 +4025,13 @@ Version: 2021-05-19 2022-09-11 2022-10-22 2022-10-31" (t (user-error "Layout %s must be a string." Layout)))) (xoldlout xah-fly-key-current-layout)) (setq xah-fly-key-current-layout xnewlout) - (setq xah-fly--key-convert-table - (cdr (assoc xah-fly-key-current-layout xah-fly-layouts))) + (setq + xah-fly--key-convert-table + (xah-fly-create-key-conv-table + (gethash "dvorak" xah-fly-layout-diagrams) + (gethash xah-fly-key-current-layout xah-fly-layout-diagrams))) (when (and (featurep 'xah-fly-keys) - (not (string-equal xoldlout xnewlout))) + (not (equal xoldlout xnewlout))) (xah-fly-define-keys)))) (defun xah-fly-space-key ()