Skip to content

Qwerty consistent hebrew, arabic, phoenician and russian keymaps

Notifications You must be signed in to change notification settings

alejandrogallo/qwerty-everywhere

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Table of Contents

  1. Introduction
    1. Installation
      1. Emacs
      2. Vim
  2. Languages
    1. Arabic
      1. Table
    2. Hebrew
      1. Table
    3. Phoenician
      1. Table
    4. Russian
  3. The code
    1. Vim
    2. Emacs
  4. References

Introduction

This projects aims to make writing Arabic, Hebrew, Phoenician and Russian easier in Emacs and Vim by defining an intuitive keymap for QWERTY users. If you are using another editor or want to contribute a language, you are welcome to contribute.

This is a living document to try to find the most intuitive and easy to learn keymap for the languages found herein.

This document is written in the form of a literate program, which produces the code in a self-contained way in the same document LiteratePrograKnuth1984,Literate.prograRamsey1994.

Installation

You can install all files just by doing

make install

Otherwise you can follow the following instructions to understand the process in each editor.

Emacs

Copy the file you want from the dist folder somewhere in your computer. For instance, if you choose the arabic version of qwerty-everywhere and you copy it into the path ~/.emacs.d/arabic-qwerty-everywhere.el, add the followint into you ~/.emacs.d/init.el file

(load "~/.emacs.d/arabic-qwerty-everywhere.el")

and now you can set this keymap by M-x set-input-method and choosing the arabic-qwerty-everywhere.

Vim

Copy the file you want from the dist folder to ~/.vim/keymaps/ and activate the keymap by doing

:set keymap=arabic-qwerty-everywhere
:set rightleft

in the case that you chose the arabic version. You can go back to your default by doing

:set keymap
:set norightleft

Languages

Arabic

Table

Key Unicode Arabic Name
a 0627 ا ALEF
A 0649 ى ALEF MAKSURA
~a 0622 آ ALEF WITH MADDA ABOVE
'a 0623 أ ALEF with HAMZA ABOVE
'i 0625 إ ALEF with HAMZA BELOW
-a 0671 ٱ ALEF WASLA
b 0628 ب BEH
p 067e پ PEH
t 062a ت TEH
.t 062b ث THEH
j 062c ج JEEM
H 062d ح HAH
x 062e خ KHAH
%h 0686 چ TCHEH
^h 0685 څ HAH WITH THREE DOTS ABOVE
d 062f د DAL
.d 0630 ذ THAL
z 0632 ز ZAIN
r 0631 ر REH
.s 0634 ش SHEEN
s 0633 س SEEN
c 0635 ص SAD
.c 0636 ض DAD
D 0636 ض DAD
Z 0638 ظ ZAH
.T 0638 ظ ZAH
T 0637 ط TAH
g 063a غ GHAIN
e 0639 ع AIN
q 0642 ق QAF
f 0641 ف FEH
k 0643 ك KAF
l 0644 ل LAM
m 0645 م MEEM
n 0646 ن NOON
h 0647 ه HEH
:h 0629 ة TEH MARBUTA
w 0648 و WAW
'w 0624 ؤ WAW with HAMZA ABOVE
y 064a ي YEH
'y 0626 ئ YEH with HAMZA ABOVE
0 0660 ٠ Arabic-Indic digit 0
1 0661 ١ Arabic-Indic digit 1
2 0662 ٢ Arabic-Indic digit 2
3 0663 ٣ Arabic-Indic digit 3
4 0664 ٤ Arabic-Indic digit 4
5 0665 ٥ Arabic-Indic digit 5
6 0666 ٦ Arabic-Indic digit 6
7 0667 ٧ Arabic-Indic digit 7
8 0668 ٨ Arabic-Indic digit 8
9 0669 ٩ Arabic-Indic digit 9
^ 0651 ّ SHADDA
' 0621 ء HAMZA
oo 0652 ْ SUKUN
.a 064e َ FATHA
aN 064b ً FATHATAN
u 064f ُ DAMMA
.u 064f ُ DAMMA
uN 064c ٌ DAMMATAN
i 0650 ِ KASRA
.i 0650 ِ KASRA
iN 064d ٍ KASRATAN
; 061b ؛ Arabic Semicolon
\_ 0640 ـ TATWEEL
, 060c ، Arabic Comma
? 061f ؟ Arabic Question Mark
\_A fdf2 Allah
\_S fdfa SALLALLAHOU ALAYHE WASALLAM

Hebrew

Table

Key Unicode Hebrew Name
a 5d0 א alef
v 5d1 ב bet
.v fb31 bet
b fb31 bet
g 5d2 ג gimel
.g fb32 gimel
j fb32 gimel
d 5d3 ד dalet
.d fb33 dalet with dagesh
h 5d4 ה he
w 5d5 ו vav
z 5d6 ז zayin
H 5d7 ח het
T 5d8 ט tet
y 5d9 י yod
x 5db כ kaf
k fb3b kaf
X 5da ך final kaf
K fb3a final kaf
l 5dc ל lamed
m 5de מ mem
M 5dd ם final mem
n "5e0" נ nun
N 5df ן final nun
c "5e1" ס samekh
.c fb41 samekh + dagesh
e "5e2" ע ayin
f "5e4" פ pe
p fb44 pe + dagesh
F "5e3" ף final pe
P fb43 final fe + dagesh
;t "5e6" צ tsadi
;T "5e5" ץ final tsadi
q "5e7" ק qof
r "5e8" ר resh
s "5e9" ש shin
.s fb2a shin
S fb2b shin
t 5ea ת tav
.t fb4a tav
\_: 5b0 ְ sheva
\_E 5b1 ֱ hataf segol
\_A 5b2 ֲ hataf patah
\_O 5b3 ֳ hataf qamats
i 5b4 ִ hiriq
\_Y 5b5 ֵ tsere
E 5b6 ֶ segol
AA 5b7 ַ patah
AO 5b8 ָ qamats
o 5b9 ֹ holam
u 5bb ֻ qubuts
D 5bc ּ dagesh
]T 5bd ֽ meteg
]Q 5be ־ maqaf
]R 5bf ֿ rafe
]p 5c0 ׀ paseq
]SR 5c1 ׁ shin-dot
]SL 5c2 ׂ sin-dot
]P 5c3 ׃ sof-pasuq
VV 5f0 װ double vav
VY 5f1 ױ vav-yod
YY 5f2 ײ double yod

Phoenician

Table

Key Unicode Phoenician Name
a 010900 𐤀 alf
b 010901 𐤁 bet
v 010901 𐤁 bet
g 010902 𐤂 gaml
d 010903 𐤃 delt
h 010904 𐤄 he
w 010905 𐤅 wau
z 010906 𐤆 zai
H 010907 𐤇 het
T 010908 𐤈 tet
y 010909 𐤉 yod
x 01090a 𐤊 kaf
k 01090a 𐤊 kaf
l 01090b 𐤋 lamd
m 01090c 𐤌 mem
n 01090d 𐤍 nun
c 01090e 𐤎 semk
e 01090f 𐤏 ain
p 010910 𐤐 pe
f 010910 𐤐 pe
;t 010911 𐤑 sade
q 010912 𐤒 qof
r 010913 𐤓 rosh
s 010914 𐤔 shin
.s 010914 𐤔 shin
S 010914 𐤔 shin
t 010915 𐤕 tau
1 010916 𐤖 one
10 010917 𐤗 ten
20 010918 𐤘 twenty
100 010919 𐤙 one hundred
2 01091a 𐤚 two
3 01091b 𐤛 three
: 01091f 𐤟 separator

TODO Russian

The code

We are going to write the table to keymaps converters in emacs lisp, which is a dialect of lisp that runs the emacs editor.

Vim

First of all we write a function to convert a like such as

Z 0638 ظ ZAH

into the vim format for keymaps

Z

This means, we only need the key and the hexadecimal unicode. The function for this is `keymap-line-to-vim`

(defun keymap-line-to-vim (line)
  "Example of a line:
    | Z | 0638 | ظ | ZAH | ⇒ Z  <char-0x0638> \" ظ - ZAH
  "
  (let ((key (first line))
        (code (second line))
        (symbol (third line))
        (name (fourth line)))
    (format "%s <char-0x%s> \" %s - %s"
            key code symbol name)))

For the whole table, we will assume that we are in a temporary buffer and we can insert text into it, then we can write directly the buffer to a file or retrieve the string. This greatly simplifies the code in emacs:

(defun keymap-to-vim (name table)
  (insert (format "let b:keymap_name = \"%s\"\n"
                  name))
  (insert "loadkeymap\n")
  (insert (string-join (mapcar #'keymap-line-to-vim table) "\n")))

Emacs

Since lisp is a homoiconic language we can actually create directly lisp code that will be loaded into emacs. For this we first create key-value pairs for each letters in the keymap-line-to-emacs-quail function and we wrap everything in a progn block to define a quail package.

(defun keymap-line-to-emacs-quail (line)
  `(,(format "%s" (first line))
    ,(string-to-number (format "%s" (second line)) 16)))

(defun keymap-to-emacs-quail (name language table)
  `(progn
    (require 'quail)
    (quail-define-package ,name ,language ,name)
    (quail-define-rules
      ,@(mapcar #'keymap-line-to-emacs-quail table))))

References

Bibliography

[LiteratePrograKnuth1984] Knuth, Literate Programming, The Computer Journal, 27, 97-111 (1984). link. doi.

[Literate.prograRamsey1994] Ramsey, Literate programming simplified, IEEE Software, 11, 97-105 (1994). link. doi.