165
|
1 ;;; arabic-util.el --- minor mode for editing Arabic.
|
|
2
|
|
3 ;; Copyright (C) 1994 Free Software Foundation, Inc.
|
|
4
|
|
5 ;; Keywords: multilingual, Arabic
|
|
6
|
|
7 ;; This file is part of XEmacs.
|
|
8
|
|
9 ;; XEmacs is free software; you can redistribute it and/or modify it
|
|
10 ;; under the terms of the GNU General Public License as published by
|
|
11 ;; the Free Software Foundation; either version 2, or (at your option)
|
|
12 ;; any later version.
|
|
13
|
|
14 ;; XEmacs is distributed in the hope that it will be useful, but
|
|
15 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
17 ;; General Public License for more details.
|
|
18
|
|
19 ;; You should have received a copy of the GNU General Public License
|
|
20 ;; along with XEmacs; see the file COPYING. If not, write to the
|
|
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
22 ;; Boston, MA 02111-1307, USA.
|
|
23
|
|
24 ;;; Commentary:
|
|
25
|
|
26 ;; Synched up with: Mule 2.3.
|
|
27
|
|
28 ;;; Code:
|
|
29
|
|
30 ;;; 94.6.13 created for Mule Ver.1.1 by Takahashi N. <ntakahas@etl.go.jp>
|
|
31
|
|
32 (require 'visual-mode)
|
|
33
|
167
|
34 (defvar arabic-mode-indicator " 2](3=a:GJ0](B"
|
165
|
35 "String displayed in mode-line.
|
167
|
36 \" Arabic\" for Arabic keyboard input, \" 2](3=a:GJ0](B\".")
|
165
|
37
|
|
38 (make-variable-buffer-local 'arabic-mode-indicator)
|
|
39
|
|
40 ;;;###autoload
|
|
41 (defvar arabic-mode nil
|
|
42 "Non-nil if in arabic-mode.")
|
|
43
|
|
44 (make-variable-buffer-local 'arabic-mode)
|
|
45
|
|
46 (if (not (assq 'arabic-mode minor-mode-alist))
|
|
47 (setq minor-mode-alist
|
|
48 (cons '(arabic-mode arabic-mode-indicator) minor-mode-alist)))
|
|
49
|
|
50 (define-key global-map [(meta \\)] 'arabic-mode)
|
|
51
|
|
52 (defvar arabic-input-arabic-char t
|
|
53 "Non-nil if key input is Arabic. Nil if key input is ASCII.")
|
|
54
|
|
55 (make-variable-buffer-local 'arabic-input-arabic-char)
|
|
56
|
|
57 (defvar arabic-input-keymap 'arabic-keymap-0
|
|
58 "Specify which input table is used for Arabic input. Should be on of:
|
|
59 arabic-keymap-0 (default),
|
|
60 arabic-keymap-1 (Farsi standard), or
|
|
61 arabic-keymap-2 (Microsoft Arabic).")
|
|
62
|
|
63 (defvar arabic-translate-table
|
|
64 (cond
|
|
65 ((eq arabic-input-keymap 'arabic-keymap-0)
|
167
|
66 [?2](3!0](B ?2](3"0](B ?2](3-0](B nil nil nil nil ?' ?2](3#0](B ?2](3$0](B nil nil ?2](3%0](B nil ?2](3&0](B ?2](490](B
|
|
67 ?(2!(B ?(2"(B ?(2#(B ?(2$(B ?(2%(B ?(2&(B ?(2'(B ?(2((B ?(2)(B ?(2*(B ?2](3'0](B ?2](3(0](B ?2](3*0](B nil ?2](3+0](B ?2](3)0](B
|
|
68 nil ?2](4]0](B nil ?2](4g0](B ?2](4A0](B nil nil ?2](4O0](B ?2](4-0](B nil nil ?2](410](B nil nil nil nil
|
|
69 nil nil nil ?2](4=0](B ?2](4E0](B nil nil nil ?2](3h0](B nil ?2](4I0](B nil nil nil nil nil
|
|
70 ?2](4M0](B ?2](380](B ?2](4#0](B ?2](4'0](B ?2](3B0](B nil ?2](4Q0](B ?2](4k0](B ?2](3Z0](B nil ?2](4)0](B ?2](4U0](B ?2](4Y0](B ?2](3T0](B ?2](4[0](B ?2](3<0](B
|
|
71 ?2](4e0](B ?2](4S0](B ?2](3F0](B ?2](450](B ?2](4%0](B nil nil ?2](3^0](B ?2](3D0](B ?2](4_0](B ?2](3H0](B nil ?| nil nil])
|
165
|
72 ((eq arabic-input-keymap 'arabic-keymap-1)
|
167
|
73 [?2](3!0](B ?2](3"0](B nil nil nil nil nil nil ?2](3#0](B ?2](3$0](B nil nil ?2](3%0](B nil ?2](3&0](B nil
|
|
74 ?(2!(B ?(2"(B ?(2#(B ?(2$(B ?(2%(B ?(2&(B ?(2'(B ?(2((B ?(2)(B ?(2*(B ?2](3'0](B ?2](4U0](B ?2](3*0](B nil ?2](3+0](B ?2](3)0](B
|
|
75 nil nil ?2](3h0](B nil nil nil ?2](4e0](B ?2](3.0](B nil nil nil nil nil nil nil nil
|
|
76 nil nil nil nil nil nil ?2](300](B nil nil nil nil ?2](4)0](B nil ?2](4g0](B nil nil
|
|
77 nli ?2](490](B ?2](3H0](B ?2](3D0](B ?2](4_0](B ?2](4S0](B ?2](4#0](B ?2](380](B ?2](4%0](B nil ?2](4Y0](B ?2](4[0](B ?2](3T0](B ?2](3^0](B ?2](3F0](B ?2](410](B
|
|
78 ?2](4-0](B ?2](4A0](B ?2](4Q0](B ?2](450](B ?2](4O0](B ?2](3Z0](B ?2](3B0](B ?2](4=0](B ?2](4E0](B ?2](4M0](B ?2](4I0](B nil nli nil nil ])
|
165
|
79 (t
|
167
|
80 [?2](3!0](B ?2](3"0](B ?\" ?# ?$ ?% ?& ?' ?2](3#0](B ?2](3$0](B ?* ?+ ?2](3^0](B ?- ?2](3H0](B ?2](4I0](B
|
|
81 ?(2!(B ?(2"(B ?(2#(B ?(2$(B ?(2%(B ?(2&(B ?(2'(B ?(2((B ?(2)(B ?(2*(B ?2](3'0](B ?2](4U0](B ?, ?= ?. ?2](3)0](B
|
|
82 ?@ nil ?2](3b0](B ?{ ?[ nil ?] ?2](3c0](B ?2](300](B nil nil ?2](3%0](B ?/ ?` ?2](3.0](B nil
|
|
83 ?2](3(0](B nil nil nil ?2](3d0](B ?' ?} nil nil ?2](340](B ?~ ?2](4)0](B ?\\ ?2](3B0](B ?^ ?_
|
|
84 ?2](3D0](B ?2](490](B ?2](3e0](B ?2](320](B ?2](4_0](B ?2](4'0](B ?2](4#0](B ?2](4Y0](B ?2](380](B ?2](3Z0](B ?2](4%0](B ?2](4[0](B ?2](3T0](B ?2](3<0](B ?2](4]0](B ?2](410](B
|
|
85 ?2](4-0](B ?2](4A0](B ?2](4S0](B ?2](450](B ?2](4Q0](B ?2](4M0](B ?2](3F0](B ?2](4=0](B ?2](3-0](B ?2](4O0](B ?2](4!0](B ?< ?| ?> nil ])))
|
165
|
86
|
|
87 (defvar arabic-mode-map
|
|
88 (let ((map (make-keymap)))
|
|
89 (substitute-key-definition 'self-insert-command
|
|
90 'arabic-self-insert-command
|
|
91 map global-map)
|
|
92
|
|
93 (define-key map [(control c) (control c)] 'arabic-mode)
|
|
94 (define-key map [(control d)] 'arabic-delete-char)
|
|
95 (define-key map [(control k)] 'arabic-kill-line)
|
|
96 (define-key map [(control m)] 'arabic-newline)
|
|
97 (define-key map [(control o)] 'arabic-open-line)
|
|
98 (define-key map [(control w)] 'arabic-kill-region)
|
|
99 (define-key map [(control y)] 'arabic-yank)
|
|
100 (define-key map [delete] 'arabic-backward-delete-char)
|
|
101 (define-key map [(meta d)] 'arabic-delete-word)
|
|
102 (define-key map [(meta y)] 'arabic-yank-pop)
|
|
103 (define-key map [(meta z)] 'arabic-help)
|
|
104 (define-key map [(meta \\)] 'arabic-toggle-input-char)
|
|
105 (define-key map [(meta delete)] 'arabic-backward-kill-word)
|
|
106
|
|
107 (define-key map [(control n)] 'visual-next-line)
|
|
108 (define-key map [(control p)] 'visual-previous-line)
|
|
109 (define-key map [(meta <)] 'visual-beginning-of-buffer)
|
|
110 (define-key map [(meta >)] 'visual-end-of-buffer)
|
|
111 (define-key map [up] 'visual-previous-line)
|
|
112 (define-key map [down] 'visual-next-line)
|
|
113 (define-key map [home] 'visual-beginning-of-buffer)
|
|
114 (define-key map [end] 'visual-end-of-buffer)
|
|
115 (define-key map [left] 'visual-move-to-left-char)
|
|
116 (define-key map [right] 'visual-move-to-right-char)
|
|
117 (define-key map [(meta left)] 'visual-move-to-left-word)
|
|
118 (define-key map [(meta right)] 'visual-move-to-right-word)
|
|
119
|
|
120 (if visual-use-lr-commands
|
|
121 (progn
|
|
122 (define-key map [(control a)] 'visual-left-end-of-line)
|
|
123 (define-key map [(control b)] 'visual-move-to-left-char)
|
|
124 (define-key map [(control e)] 'visual-right-end-of-line)
|
|
125 (define-key map [(control f)] 'visual-move-to-right-char)
|
|
126 (define-key map [(meta b)] 'visual-move-to-left-word)
|
|
127 (define-key map [(meta f)] 'visual-move-to-right-word))
|
|
128 (define-key map [(control a)] 'visual-beginning-of-line)
|
|
129 (define-key map [(control b)] 'visual-backward-char)
|
|
130 (define-key map [(control e)] 'visual-end-of-line)
|
|
131 (define-key map [(control f)] 'visual-forward-char)
|
|
132 (define-key map [(meta b)] 'visual-backward-word)
|
|
133 (define-key map [(meta f)] 'visual-forward-word))
|
|
134
|
|
135 (cond
|
|
136 ((eq arabic-input-keymap 'arabic-keymap-0)
|
|
137 (define-key map [?~] 'arabic-insert-madda)
|
|
138 (define-key map [?'] 'arabic-insert-hamza)
|
|
139 (define-key map [?a] 'arabic-insert-alif)
|
|
140 (define-key map [?_] 'arabic-make-connection)
|
|
141 (define-key map [?|] 'arabic-cut-connection))
|
|
142 ((eq arabic-input-keymap 'arabic-keymap-1)
|
|
143 (define-key map [?~] 'arabic-insert-madda)
|
|
144 (define-key map [?'] 'arabic-insert-hamza)
|
|
145 (define-key map [?a] 'arabic-insert-alif)
|
|
146 (define-key map [?_] 'arabic-make-connection)
|
|
147 (define-key map [?|] 'arabic-cut-connection)
|
|
148 (define-key map [(alt \;)] 'arabic-insert-gaaf)
|
|
149 (define-key map [(alt v)] 'arabic-insert-isolated-hamza))
|
|
150 (t
|
|
151 (define-key map [(alt z)] 'arabic-insert-madda)
|
|
152 (define-key map [(alt x)] 'arabic-insert-hamza)
|
|
153 (define-key map [(alt h)] 'arabic-insert-alif)
|
|
154 (define-key map [(alt _)] 'arabic-make-connection)
|
|
155 (define-key map [(alt |)] 'arabic-cut-connection)))
|
|
156
|
|
157 map)
|
|
158 "minor-mode-keymap for arabic-mode.")
|
|
159
|
|
160 (if (not (assq 'arabic-mode minor-mode-map-alist))
|
|
161 (setq minor-mode-map-alist
|
|
162 (cons (cons 'arabic-mode arabic-mode-map) minor-mode-map-alist)))
|
|
163
|
|
164 (defvar arabic-help-string
|
|
165 (cond
|
|
166 ((eq arabic-input-keymap 'arabic-keymap-0)
|
|
167 "\
|
|
168 Keymap in Arabic-mode
|
|
169
|
|
170 +----------------------------------------------------------------+
|
167
|
171 |! 2](3"0](B |@ |# |$ |% |^ |& |* |( 2](3#0](B |) 2](3$0](B |_ |+ |~ |
|
|
172 |1 (2"(B |2 (2#(B |3 (2$(B |4 (2%(B |5 (2&(B |6 (2'(B |7 (2((B |8 (2)(B |9 (2*(B |0 (2!(B |- |= |` 2](4M0](B|
|
165
|
173 +----------------------------------------------------------------+
|
167
|
174 |Q |W |E |R |T 2](4E0](B|Y |U |I |O |P |
|
|
175 |q 2](4S0](B|w 2](3^0](B |e |r 2](3F0](B |t 2](4%0](B|y 2](4_0](B|u |i |o 2](3<0](B |p 2](4e0](B|
|
165
|
176 +--------------------------------------------------------+
|
167
|
177 |A 2](4]0](B|S 2](4=0](B|D 2](4A0](B|F |G 2](4O0](B|H 2](4-0](B|J |K 2](410](B|L |: 2](3'0](B |\" 2](3-0](B |
|
|
178 |a 2](380](B |s 2](450](B|d 2](3B0](B |f 2](4Q0](B|g 2](4k0](B|h 2](3Z0](B |j 2](4)0](B|k 2](4U0](B|l 2](4Y0](B|; 2](3(0](B |' |
|
165
|
179 +------------------------------------------------------+
|
167
|
180 |Z 2](4I0](B|X 2](3h0](B |C 2](4g0](B|V |B |N |M |< 2](3*0](B |> 2](3+0](B |? 2](3)0](B |
|
|
181 |z 2](3H0](B |x 2](3D0](B |c 2](4'0](B|v |b 2](4#0](B|n 2](4[0](B|m 2](3T0](B |, 2](3%0](B |. 2](3&0](B |/ 2](490](B|
|
165
|
182 +-------------------------------------------------+")
|
|
183
|
|
184 ((eq arabic-input-keymap 'arabic-keymap-1)
|
|
185 "\
|
|
186 Keymap in Arabic-mode +--------------+
|
|
187 | ALT SHIFT|
|
|
188 +-------------------------------------------------+ |ASCII ARABIC|
|
167
|
189 | 2](3"0](B | | | | | | | | 2](3#0](B | 2](3$0](B | +--------------+
|
|
190 |1 (2"(B |2 (2#(B |3 (2$(B |4 (2%(B |5 (2&(B |6 (2'(B |7 (2((B |8 (2)(B |9 (2*(B |0 (2!(B |
|
165
|
191 +-------------------------------------------------------------+
|
|
192 | | | | | | | | | | | | |
|
167
|
193 |q 2](4A0](B|w 2](4=0](B|e 2](4S0](B|r 2](4Q0](B|t 2](4O0](B|y 2](4M0](B|u 2](3Z0](B |i |o 2](410](B|p 2](4-0](B|[ 2](4)0](B|] 2](4g0](B|
|
165
|
194 +-----------------------------------------------------------+
|
167
|
195 | | | | 2](4e0](B| 2](3.0](B | | | | |2](4k0](B 2](3'0](B|
|
|
196 |a 2](490](B|s 2](450](B|d 2](4_0](B|f 2](4#0](B|g 2](380](B |h 2](4%0](B|j 2](4Y0](B|k 2](4[0](B|l 2](3T0](B |; 2](4U0](B|
|
165
|
197 +---------------------------------------------------+
|
167
|
198 | | | |2](3-0](B 2](300](B | 2](3h0](B | | | 2](3*0](B | 2](3+0](B | 2](3)0](B |
|
|
199 |z 2](4I0](B|x 2](4E0](B|c 2](3D0](B |v 2](3B0](B |b 2](3H0](B |n 2](3F0](B |m 2](3^0](B |, 2](3%0](B |. 2](3&0](B |/ |
|
165
|
200 +-------------------------------------------------+")
|
|
201
|
|
202 (t
|
|
203 "\
|
|
204 +-----------------+
|
|
205 |S-ASCII S-Arabic|
|
|
206 | ASCII Arabic | +----+
|
|
207 +-----------------+ || ||
|
|
208 |\\ \\|
|
|
209 +-----------------------------------------------------------+
|
167
|
210 |! 2](3"0](B|@ @|# #|$ $|% %|^ ^|& &|* *|( 2](3#0](B|) 2](3$0](B|_ _|+ +|
|
|
211 |1 (2"(B|2 (2#(B|3 (2$(B|4 (2%(B|5 (2&(B|6 (2'(B|7 (2((B|8 (2)(B|9 (2*(B|0 (2!(B|- -|= =|
|
165
|
212 +-------------------------------------------------------------+
|
167
|
213 |Q |W |E |R |T 2](3d0](B|Y 2](340](B|U '|I |O |P 2](3(0](B|{ <|} >|
|
|
214 | 2](4A0](B| 2](4=0](B| 2](4'0](B| 2](4S0](B| 2](4Q0](B| 2](4O0](B| 2](4M0](B| 2](3Z0](B| 2](410](B| 2](4-0](B|[ 2](4)0](B|] 2](3B0](B|
|
165
|
215 +-------------------------------------------------------------+
|
167
|
216 |A |S |D [|F ]|G 2](3c0](B|H 2](300](B|J |K 2](3%0](B|L /|: 2](3'0](B|\" \" |~2](3,0](B |
|
|
217 | 2](490](B| 2](450](B| 2](4_0](B| 2](4#0](B| 2](4Y0](B| 2](380](B| 2](4%0](B| 2](4[0](B| 2](3T0](B|\; 2](4U0](B|' 2](4E0](B|` 2](3D0](B|
|
165
|
218 +-----------------------------------------------------------+
|
167
|
219 |Z ~|X |C {|V }|B 2](3b0](B|N 2](3.0](B|M `|< ,|> 2](3&0](B|? 2](3)0](B|
|
|
220 | 2](4!0](B| 2](3-0](B| 2](320](B| 2](3F0](B| 2](3e0](B| 2](4]0](B| 2](3<0](B|, 2](3^0](B|. 2](3H0](B|/ 2](4I0](B|
|
165
|
221 +-------------------------------------------------+"))
|
|
222
|
|
223 "Document shown by arabic-help (M-z).")
|
|
224
|
|
225 ;;;###autoload
|
|
226 (defun arabic-mode (&optional arg)
|
|
227 "Toggle arabic-mode. With ARG, turn arabic-mode on iff ARG is positive."
|
|
228 (interactive "P")
|
|
229 (if (null arg)
|
|
230 (if arabic-mode (exit-arabic-mode) (enter-arabic-mode))
|
|
231 (if (> (prefix-numeric-value arg) 0)
|
|
232 (enter-arabic-mode)
|
|
233 (exit-arabic-mode))))
|
|
234
|
|
235 (defun enter-arabic-mode nil
|
|
236 "Enter arabic-mode."
|
|
237 (interactive)
|
|
238 (if (not arabic-mode)
|
|
239 (progn
|
|
240 (setq arabic-mode t
|
|
241 arabic-input-arabic-char t
|
167
|
242 arabic-mode-indicator " 2](3=a:GJ0](B")
|
165
|
243 (redraw-modeline t)
|
|
244 (message "M-z to display arabic keymap.")
|
|
245 (run-hooks 'arabic-mode-hooks))))
|
|
246
|
|
247 (defun exit-arabic-mode nil
|
|
248 "Exit arabic-mode."
|
|
249 (interactive)
|
|
250 (if arabic-mode
|
|
251 (progn
|
|
252 (setq arabic-mode nil)
|
|
253 (redraw-modeline t))))
|
|
254
|
|
255 (defconst *arabic-adding-connection-to-right*
|
167
|
256 '((?2](3.0](B . ?2](3/0](B ) (?2](3/0](B . ?2](3/0](B )
|
|
257 (?2](300](B . ?2](310](B ) (?2](310](B . ?2](310](B )
|
|
258 (?2](320](B . ?2](330](B ) (?2](330](B . ?2](330](B )
|
|
259 (?2](340](B . ?2](350](B ) (?2](350](B . ?2](350](B )
|
|
260 (?2](4!0](B . ?2](4"0](B) (?2](360](B . ?2](370](B ) (?2](370](B . ?2](370](B ) (?2](4"0](B . ?2](4"0](B)
|
|
261 (?2](360](B . ?2](370](B ) (?2](370](B . ?2](370](B )
|
|
262 (?2](380](B . ?2](390](B ) (?2](390](B . ?2](390](B )
|
|
263 (?2](4#0](B . ?2](4$0](B) (?2](3:0](B . ?2](3;0](B ) (?2](3;0](B . ?2](3;0](B ) (?2](4$0](B . ?2](4$0](B)
|
|
264 (?2](3<0](B . ?2](3=0](B ) (?2](3=0](B . ?2](3=0](B )
|
|
265 (?2](4%0](B . ?2](4&0](B) (?2](3>0](B . ?2](3?0](B ) (?2](3?0](B . ?2](3?0](B ) (?2](4&0](B . ?2](4&0](B)
|
|
266 (?2](4'0](B . ?2](4(0](B) (?2](3@0](B . ?2](3A0](B ) (?2](3A0](B . ?2](3A0](B ) (?2](4(0](B . ?2](4(0](B)
|
|
267 (?2](4)0](B . ?2](4,0](B) (?2](4*0](B . ?2](4+0](B) (?2](4+0](B . ?2](4+0](B) (?2](4,0](B . ?2](4,0](B)
|
|
268 (?2](4-0](B . ?2](400](B) (?2](4.0](B . ?2](4/0](B) (?2](4/0](B . ?2](4/0](B) (?2](400](B . ?2](400](B)
|
|
269 (?2](410](B . ?2](440](B) (?2](420](B . ?2](430](B) (?2](430](B . ?2](430](B) (?2](440](B . ?2](440](B)
|
|
270 (?2](3B0](B . ?2](3C0](B ) (?2](3C0](B . ?2](3C0](B )
|
|
271 (?2](3D0](B . ?2](3E0](B ) (?2](3E0](B . ?2](3E0](B )
|
|
272 (?2](3F0](B . ?2](3G0](B ) (?2](3G0](B . ?2](3G0](B )
|
|
273 (?2](3H0](B . ?2](3I0](B ) (?2](3I0](B . ?2](3I0](B )
|
|
274 (?2](450](B . ?2](480](B) (?2](460](B . ?2](470](B) (?2](470](B . ?2](470](B) (?2](480](B . ?2](480](B)
|
|
275 (?2](490](B . ?2](4<0](B) (?2](4:0](B . ?2](4;0](B) (?2](4;0](B . ?2](4;0](B) (?2](4<0](B . ?2](4<0](B)
|
|
276 (?2](4=0](B . ?2](4@0](B) (?2](4>0](B . ?2](4?0](B) (?2](4?0](B . ?2](4?0](B) (?2](4@0](B . ?2](4@0](B)
|
|
277 (?2](4A0](B . ?2](4D0](B) (?2](4B0](B . ?2](4C0](B) (?2](4C0](B . ?2](4C0](B) (?2](4D0](B . ?2](4D0](B)
|
|
278 (?2](4E0](B . ?2](4H0](B) (?2](4F0](B . ?2](4G0](B) (?2](4G0](B . ?2](4G0](B) (?2](4H0](B . ?2](4H0](B)
|
|
279 (?2](4I0](B . ?2](4L0](B) (?2](4J0](B . ?2](4K0](B) (?2](4K0](B . ?2](4K0](B) (?2](4L0](B . ?2](4L0](B)
|
|
280 (?2](4M0](B . ?2](4N0](B) (?2](3J0](B . ?2](3K0](B ) (?2](3K0](B . ?2](3K0](B ) (?2](4N0](B . ?2](4N0](B)
|
|
281 (?2](4O0](B . ?2](4P0](B) (?2](3L0](B . ?2](3M0](B ) (?2](3M0](B . ?2](3M0](B ) (?2](4P0](B . ?2](4P0](B)
|
|
282 (?2](4Q0](B . ?2](4R0](B) (?2](3N0](B . ?2](3O0](B ) (?2](3O0](B . ?2](3O0](B ) (?2](4R0](B . ?2](4R0](B)
|
|
283 (?2](4S0](B . ?2](4T0](B) (?2](3P0](B . ?2](3Q0](B ) (?2](3Q0](B . ?2](3Q0](B ) (?2](4T0](B . ?2](4T0](B)
|
|
284 (?2](4U0](B . ?2](4X0](B) (?2](4V0](B . ?2](4W0](B) (?2](4W0](B . ?2](4W0](B) (?2](4X0](B . ?2](4X0](B)
|
|
285 (?2](4Y0](B . ?2](4Z0](B) (?2](3R0](B . ?2](3S0](B ) (?2](3S0](B . ?2](3S0](B ) (?2](4Z0](B . ?2](4Z0](B)
|
|
286 (?2](3T0](B . ?2](3W0](B ) (?2](3U0](B . ?2](3V0](B ) (?2](3V0](B . ?2](3V0](B ) (?2](3W0](B . ?2](3W0](B )
|
|
287 (?2](4[0](B . ?2](4\0](B) (?2](3X0](B . ?2](3Y0](B ) (?2](3Y0](B . ?2](3Y0](B ) (?2](4\0](B . ?2](4\0](B)
|
|
288 (?2](3Z0](B . ?2](3]0](B ) (?2](3[0](B . ?2](3\0](B ) (?2](3\0](B . ?2](3\0](B ) (?2](3]0](B . ?2](3]0](B )
|
|
289 (?2](3^0](B . ?2](3_0](B ) (?2](3_0](B . ?2](3_0](B )
|
|
290 (?2](4]0](B . ?2](4^0](B) (?2](4^0](B . ?2](4^0](B)
|
|
291 (?2](4_0](B . ?2](4`0](B) (?2](3`0](B . ?2](3a0](B ) (?2](3a0](B . ?2](3a0](B ) (?2](4`0](B . ?2](4`0](B)
|
|
292 (?2](3b0](B . ?2](4a0](B) (?2](4a0](B . ?2](4a0](B)
|
|
293 (?2](3c0](B . ?2](4b0](B) (?2](4b0](B . ?2](4b0](B)
|
|
294 (?2](3d0](B . ?2](4c0](B) (?2](4c0](B . ?2](4c0](B)
|
|
295 (?2](3e0](B . ?2](4d0](B) (?2](4d0](B . ?2](4d0](B)
|
|
296 (?2](4e0](B . ?2](4f0](B) (?2](3f0](B . ?2](3g0](B ) (?2](3g0](B . ?2](3g0](B ) (?2](4f0](B . ?2](4f0](B)
|
|
297 (?2](4g0](B . ?2](4j0](B) (?2](4h0](B . ?2](4i0](B) (?2](4i0](B . ?2](4i0](B) (?2](4j0](B . ?2](4j0](B)
|
|
298 (?2](3h0](B . ?2](3i0](B ) (?2](3i0](B . ?2](3i0](B )
|
|
299 (?2](4k0](B . ?2](4n0](B) (?2](4l0](B . ?2](4m0](B) (?2](4m0](B . ?2](4m0](B) (?2](4n0](B . ?2](4n0](B)))
|
165
|
300
|
|
301 (defconst *arabic-adding-connection-to-left*
|
167
|
302 '((?2](4!0](B . ?2](360](B ) (?2](360](B . ?2](360](B ) (?2](370](B . ?2](370](B ) (?2](4"0](B . ?2](370](B)
|
|
303 (?2](4#0](B . ?2](3:0](B ) (?2](3:0](B . ?2](3:0](B ) (?2](3;0](B . ?2](3;0](B ) (?2](4$0](B . ?2](3;0](B )
|
|
304 (?2](4%0](B . ?2](3>0](B ) (?2](3>0](B . ?2](3>0](B ) (?2](3?0](B . ?2](3?0](B ) (?2](4&0](B . ?2](3?0](B )
|
|
305 (?2](4'0](B . ?2](3@0](B ) (?2](3@0](B . ?2](3@0](B ) (?2](3A0](B . ?2](3A0](B ) (?2](4(0](B . ?2](3A0](B )
|
|
306 (?2](4)0](B . ?2](4*0](B) (?2](4*0](B . ?2](4*0](B) (?2](4+0](B . ?2](4+0](B) (?2](4,0](B . ?2](4+0](B)
|
|
307 (?2](4-0](B . ?2](4.0](B) (?2](4.0](B . ?2](4.0](B) (?2](4/0](B . ?2](4/0](B) (?2](400](B . ?2](4/0](B)
|
|
308 (?2](410](B . ?2](420](B) (?2](420](B . ?2](420](B) (?2](430](B . ?2](430](B) (?2](440](B . ?2](430](B)
|
|
309 (?2](450](B . ?2](460](B) (?2](460](B . ?2](460](B) (?2](470](B . ?2](470](B) (?2](480](B . ?2](470](B)
|
|
310 (?2](490](B . ?2](4:0](B) (?2](4:0](B . ?2](4:0](B) (?2](4;0](B . ?2](4;0](B) (?2](4<0](B . ?2](4;0](B)
|
|
311 (?2](4=0](B . ?2](4>0](B) (?2](4>0](B . ?2](4>0](B) (?2](4?0](B . ?2](4?0](B) (?2](4@0](B . ?2](4?0](B)
|
|
312 (?2](4A0](B . ?2](4B0](B) (?2](4B0](B . ?2](4B0](B) (?2](4C0](B . ?2](4C0](B) (?2](4D0](B . ?2](4C0](B)
|
|
313 (?2](4E0](B . ?2](4F0](B) (?2](4F0](B . ?2](4F0](B) (?2](4G0](B . ?2](4G0](B) (?2](4H0](B . ?2](4G0](B)
|
|
314 (?2](4I0](B . ?2](4J0](B) (?2](4J0](B . ?2](4J0](B) (?2](4K0](B . ?2](4K0](B) (?2](4L0](B . ?2](4K0](B)
|
|
315 (?2](4M0](B . ?2](3J0](B ) (?2](3J0](B . ?2](3J0](B ) (?2](3K0](B . ?2](3K0](B ) (?2](4N0](B . ?2](3K0](B )
|
|
316 (?2](4O0](B . ?2](3L0](B ) (?2](3L0](B . ?2](3L0](B ) (?2](3M0](B . ?2](3M0](B ) (?2](4P0](B . ?2](3M0](B )
|
|
317 (?2](4Q0](B . ?2](3N0](B ) (?2](3N0](B . ?2](3N0](B ) (?2](3O0](B . ?2](3O0](B ) (?2](4R0](B . ?2](3O0](B )
|
|
318 (?2](4S0](B . ?2](3P0](B ) (?2](3P0](B . ?2](3P0](B ) (?2](3Q0](B . ?2](3Q0](B ) (?2](4T0](B . ?2](3Q0](B )
|
|
319 (?2](4U0](B . ?2](4V0](B) (?2](4V0](B . ?2](4V0](B) (?2](4W0](B . ?2](4W0](B) (?2](4X0](B . ?2](4W0](B)
|
|
320 (?2](4Y0](B . ?2](3R0](B ) (?2](3R0](B . ?2](3R0](B ) (?2](3S0](B . ?2](3S0](B ) (?2](4Z0](B . ?2](3S0](B )
|
|
321 (?2](3T0](B . ?2](3U0](B ) (?2](3U0](B . ?2](3U0](B ) (?2](3V0](B . ?2](3V0](B ) (?2](3W0](B . ?2](3V0](B )
|
|
322 (?2](4[0](B . ?2](3X0](B ) (?2](3X0](B . ?2](3X0](B ) (?2](3Y0](B . ?2](3Y0](B ) (?2](4\0](B . ?2](3Y0](B )
|
|
323 (?2](3Z0](B . ?2](3[0](B ) (?2](3[0](B . ?2](3[0](B ) (?2](3\0](B . ?2](3\0](B ) (?2](3]0](B . ?2](3\0](B )
|
|
324 (?2](4_0](B . ?2](3`0](B ) (?2](3`0](B . ?2](3`0](B ) (?2](3a0](B . ?2](3a0](B ) (?2](4`0](B . ?2](3a0](B )
|
|
325 (?2](4e0](B . ?2](3f0](B ) (?2](3f0](B . ?2](3f0](B ) (?2](3g0](B . ?2](3g0](B ) (?2](4f0](B . ?2](3g0](B)
|
|
326 (?2](4g0](B . ?2](4h0](B) (?2](4h0](B . ?2](4h0](B) (?2](4i0](B . ?2](4i0](B) (?2](4j0](B . ?2](4i0](B)
|
|
327 (?2](4k0](B . ?2](4l0](B) (?2](4l0](B . ?2](4l0](B) (?2](4m0](B . ?2](4m0](B) (?2](4n0](B . ?2](4m0](B)))
|
165
|
328
|
|
329 (defconst *arabic-removing-connection-from-right*
|
167
|
330 '((?2](3/0](B . ?2](3.0](B )
|
|
331 (?2](310](B . ?2](300](B )
|
|
332 (?2](330](B . ?2](320](B )
|
|
333 (?2](350](B . ?2](340](B )
|
|
334 (?2](4"0](B . ?2](4!0](B) (?2](370](B . ?2](360](B )
|
|
335 (?2](390](B . ?2](380](B )
|
|
336 (?2](4$0](B . ?2](4#0](B) (?2](3;0](B . ?2](3:0](B )
|
|
337 (?2](3=0](B . ?2](3<0](B )
|
|
338 (?2](4&0](B . ?2](4%0](B) (?2](3?0](B . ?2](3>0](B )
|
|
339 (?2](4(0](B . ?2](4'0](B) (?2](3A0](B . ?2](3@0](B )
|
|
340 (?2](4,0](B . ?2](4)0](B) (?2](4+0](B . ?2](4*0](B)
|
|
341 (?2](400](B . ?2](4-0](B) (?2](4/0](B . ?2](4.0](B)
|
|
342 (?2](440](B . ?2](410](B) (?2](430](B . ?2](420](B)
|
|
343 (?2](3C0](B . ?2](3B0](B )
|
|
344 (?2](3E0](B . ?2](3D0](B )
|
|
345 (?2](3G0](B . ?2](3F0](B )
|
|
346 (?2](3I0](B . ?2](3H0](B )
|
|
347 (?2](480](B . ?2](450](B) (?2](470](B . ?2](460](B)
|
|
348 (?2](4<0](B . ?2](490](B) (?2](4;0](B . ?2](4:0](B)
|
|
349 (?2](4@0](B . ?2](4=0](B) (?2](4?0](B . ?2](4>0](B)
|
|
350 (?2](4D0](B . ?2](4A0](B) (?2](4C0](B . ?2](4B0](B)
|
|
351 (?2](4H0](B . ?2](4E0](B) (?2](4G0](B . ?2](4F0](B)
|
|
352 (?2](4L0](B . ?2](4I0](B) (?2](4K0](B . ?2](4J0](B)
|
|
353 (?2](4N0](B . ?2](4M0](B) (?2](3K0](B . ?2](3J0](B )
|
|
354 (?2](4P0](B . ?2](4O0](B) (?2](3M0](B . ?2](3L0](B )
|
|
355 (?2](4R0](B . ?2](4Q0](B) (?2](3O0](B . ?2](3N0](B )
|
|
356 (?2](4T0](B . ?2](4S0](B) (?2](3Q0](B . ?2](3P0](B )
|
|
357 (?2](4X0](B . ?2](4U0](B) (?2](4W0](B . ?2](4V0](B)
|
|
358 (?2](4Z0](B . ?2](4Y0](B) (?2](3S0](B . ?2](3R0](B )
|
|
359 (?2](3W0](B . ?2](3T0](B ) (?2](3V0](B . ?2](3U0](B )
|
|
360 (?2](4\0](B . ?2](4[0](B) (?2](3Y0](B . ?2](3X0](B )
|
|
361 (?2](3]0](B . ?2](3Z0](B ) (?2](3\0](B . ?2](3[0](B )
|
|
362 (?2](3_0](B . ?2](3^0](B )
|
|
363 (?2](4^0](B . ?2](4]0](B)
|
|
364 (?2](4`0](B . ?2](4_0](B) (?2](3a0](B . ?2](3`0](B )
|
|
365 (?2](4a0](B . ?2](3b0](B )
|
|
366 (?2](4b0](B . ?2](3c0](B )
|
|
367 (?2](4c0](B . ?2](3d0](B )
|
|
368 (?2](4d0](B . ?2](3e0](B )
|
|
369 (?2](4f0](B . ?2](4e0](B) (?2](3g0](B . ?2](3f0](B )
|
|
370 (?2](4j0](B . ?2](4g0](B) (?2](4i0](B . ?2](4h0](B)
|
|
371 (?2](3i0](B . ?2](3h0](B)
|
|
372 (?2](4n0](B . ?2](4k0](B) (?2](4m0](B . ?2](4l0](B)))
|
165
|
373
|
|
374 (defconst *arabic-removing-connection-from-left*
|
167
|
375 '((?2](360](B . ?2](4!0](B) (?2](370](B . ?2](4"0](B)
|
|
376 (?2](3:0](B . ?2](4#0](B) (?2](3;0](B . ?2](4$0](B)
|
|
377 (?2](3>0](B . ?2](4%0](B) (?2](3?0](B . ?2](4&0](B)
|
|
378 (?2](3@0](B . ?2](4'0](B) (?2](3A0](B . ?2](4(0](B)
|
|
379 (?2](4*0](B . ?2](4)0](B) (?2](4+0](B . ?2](4,0](B)
|
|
380 (?2](4.0](B . ?2](4-0](B) (?2](4/0](B . ?2](400](B)
|
|
381 (?2](420](B . ?2](410](B) (?2](430](B . ?2](440](B)
|
|
382 (?2](460](B . ?2](450](B) (?2](470](B . ?2](480](B)
|
|
383 (?2](4:0](B . ?2](490](B) (?2](4;0](B . ?2](4<0](B)
|
|
384 (?2](4>0](B . ?2](4=0](B) (?2](4?0](B . ?2](4@0](B)
|
|
385 (?2](4D0](B . ?2](4A0](B) (?2](4C0](B . ?2](4A0](B)
|
|
386 (?2](4F0](B . ?2](4E0](B) (?2](4G0](B . ?2](4H0](B)
|
|
387 (?2](4J0](B . ?2](4I0](B) (?2](4K0](B . ?2](4L0](B)
|
|
388 (?2](3J0](B . ?2](4M0](B) (?2](3K0](B . ?2](4N0](B)
|
|
389 (?2](3L0](B . ?2](4O0](B) (?2](3M0](B . ?2](4P0](B)
|
|
390 (?2](3N0](B . ?2](4Q0](B) (?2](3O0](B . ?2](4R0](B)
|
|
391 (?2](3P0](B . ?2](4S0](B) (?2](3Q0](B . ?2](4T0](B)
|
|
392 (?2](4V0](B . ?2](4U0](B) (?2](4W0](B . ?2](4X0](B)
|
|
393 (?2](3R0](B . ?2](4Y0](B) (?2](3S0](B . ?2](4Z0](B)
|
|
394 (?2](3U0](B . ?2](3T0](B ) (?2](3V0](B . ?2](3W0](B )
|
|
395 (?2](3X0](B . ?2](4[0](B) (?2](3Y0](B . ?2](4\0](B)
|
|
396 (?2](3[0](B . ?2](3Z0](B ) (?2](3\0](B . ?2](3]0](B )
|
|
397 (?2](3`0](B . ?2](4_0](B) (?2](3a0](B . ?2](4`0](B)
|
|
398 (?2](4h0](B . ?2](4g0](B) (?2](4i0](B . ?2](4j0](B)
|
|
399 (?2](4l0](B . ?2](4k0](B) (?2](4m0](B . ?2](4n0](B)))
|
165
|
400
|
|
401 (defun arabic-make-connection nil
|
|
402 "If possible, tie the two characters around the cursor."
|
|
403 (interactive)
|
|
404 (let ((lch (assoc (visual-char-left) *arabic-adding-connection-to-right*))
|
|
405 (rch (assoc (visual-char-right) *arabic-adding-connection-to-left*)))
|
|
406 (if (not (and lch rch))
|
|
407 (arabic-cut-connection)
|
|
408 (visual-replace-left-1-char (cdr lch))
|
|
409 (visual-replace-right-1-char (cdr rch)))))
|
|
410
|
|
411 (defun arabic-cut-connection nil
|
|
412 "Remove the connection between the two characters around the cursor, if any."
|
|
413 (interactive)
|
|
414 (let
|
|
415 ((lch (assoc (visual-char-left) *arabic-removing-connection-from-right*))
|
|
416 (rch (assoc (visual-char-right) *arabic-removing-connection-from-left*)))
|
|
417 (if lch
|
|
418 (visual-replace-left-1-char (cdr lch)))
|
|
419 (if rch
|
|
420 (visual-replace-right-1-char (cdr rch)))))
|
|
421
|
|
422 (defun arabic-insert-char (ch arg)
|
|
423 "Insert ARG (2nd arg; > 0) number of CHs (1st arg; character) around
|
|
424 visual point.
|
|
425 If CH is l2r, inserted on the left. Otherwise, on the right."
|
|
426 (while (> arg 0)
|
|
427 (arabic-insert-1-char ch)
|
|
428 (setq arg (1- arg))))
|
|
429
|
|
430 (defun arabic-insert-1-char (ch)
|
|
431 "Insert CH (1st arg; character) around visual point.
|
|
432 If CH is l2r, inserted on the left. Otherwise, on the right."
|
|
433 (if (= (visual-char-direction ch) 0)
|
|
434 ; if visual-char-direction = 0, always disjoint.
|
|
435 (progn
|
|
436 (arabic-cut-connection)
|
|
437 (visual-insert-left-1-char ch))
|
|
438 (visual-insert-left-1-char ch)
|
|
439 (arabic-make-connection)
|
|
440 (visual-move-to-left-1-char)
|
|
441 (arabic-make-connection)))
|
|
442
|
|
443 (defun arabic-self-insert-command (arg)
|
|
444 "Self-insert-command for arabic-mode."
|
|
445 (interactive "*p")
|
|
446 (let ((ch last-command-char))
|
|
447 (if arabic-input-arabic-char
|
|
448 (setq ch (aref arabic-translate-table (- ch 32))))
|
|
449 (if (null ch)
|
|
450 (beep)
|
|
451 (while (> arg 0)
|
|
452 (arabic-keyboard-insert-1-char ch)
|
|
453 (setq arg (1- arg))))))
|
|
454
|
|
455 (defun arabic-keyboard-insert-1-char (ch)
|
|
456 "Insert CH (1st arg; Arabic character) at visual cursor position.
|
|
457 if last-command is arabic-cut-connection, CH will not connected to the
|
|
458 right adjacent character (but connected to the left, if possible)."
|
|
459 (let ((rch (visual-char-right)))
|
|
460 (cond
|
|
461 ((= (visual-char-direction ch) 0)
|
|
462 (arabic-cut-connection)
|
|
463 (visual-insert-left-1-char ch))
|
|
464 ((eq last-command 'arabic-cut-connection)
|
|
465 (visual-insert-right-1-char ch)
|
|
466 (arabic-make-connection))
|
|
467 (t
|
|
468 (arabic-insert-1-char ch)))))
|
|
469
|
|
470 (defun arabic-insert-gaaf (arg)
|
|
471 "Insert gaaf as if it were typed from keyboard."
|
|
472 (interactive "*p")
|
|
473 (while (> arg 0)
|
167
|
474 (arabic-keyboard-insert-1-char ?2](4k0](B)
|
165
|
475 (setq arg (1- arg))))
|
|
476
|
|
477 (defun arabic-insert-isolated-hamza (arg)
|
|
478 "Insert an isolated hamza as if it were typed from keyboard."
|
|
479 (interactive "*p")
|
|
480 (while (> arg 0)
|
167
|
481 (arabic-keyboard-insert-1-char ?2](3-0](B)
|
165
|
482 (setq arg (1- arg))))
|
|
483
|
|
484 (defun arabic-insert-madda nil
|
|
485 "Put madda on the previous alif."
|
|
486 (interactive)
|
|
487 (let ((rch (visual-char-right)))
|
|
488 (cond
|
167
|
489 ((eq rch ?2](380](B ) (visual-replace-right-1-char ?2](3.0](B ))
|
|
490 ((eq rch ?2](390](B ) (visual-replace-right-1-char ?2](3/0](B ))
|
|
491 ((eq rch ?2](3e0](B ) (visual-replace-right-1-char ?2](3b0](B ))
|
|
492 ((eq rch ?2](4d0](B) (visual-replace-right-1-char ?2](4a0](B))
|
165
|
493 (t (beep)))))
|
|
494
|
|
495 (defun arabic-insert-alif (arg)
|
|
496 "Insert ARG number of alif's.
|
|
497 If the previous character is a laam, replace it with an alif+laam ligature."
|
|
498 (interactive "*p")
|
|
499 (let (rch)
|
|
500 (while (> arg 0)
|
|
501 (setq rch (visual-char-right))
|
|
502 (cond
|
|
503 ((eq last-command 'arabic-cut-connection)
|
167
|
504 (visual-insert-right-1-char ?2](380](B))
|
|
505 ((or (eq rch ?2](4Y0](B) (eq rch ?2](3R0](B ))
|
|
506 (visual-replace-right-1-char ?2](3e0](B ))
|
|
507 ((or (eq rch ?2](3S0](B ) (eq rch ?2](4Z0](B))
|
|
508 (visual-replace-right-1-char ?2](4d0](B))
|
165
|
509 (t
|
167
|
510 (visual-insert-left-1-char ?2](380](B )
|
165
|
511 (arabic-make-connection)
|
|
512 (visual-move-to-left-1-char)))
|
|
513 (setq arg (1- arg)))
|
|
514 (arabic-cut-connection)))
|
|
515
|
|
516 (defun arabic-insert-hamza (arg)
|
|
517 "Insert ARG number of hamza's.
|
|
518 Put it on/under previous characters, if possible."
|
|
519 (interactive "*p")
|
|
520 (let (rch)
|
|
521 (while (> arg 0)
|
|
522 (setq rch (visual-char-right))
|
|
523 (cond
|
|
524 ((eq last-command 'arabic-cut-connection)
|
167
|
525 (visual-insert-right-1-char ?2](3-0](B))
|
|
526 ((eq rch ?2](380](B ) (visual-replace-right-1-char ?2](300](B ))
|
|
527 ((eq rch ?2](390](B ) (visual-replace-right-1-char ?2](310](B ))
|
|
528 ((eq rch ?2](300](B ) (visual-replace-right-1-char ?2](340](B ))
|
|
529 ((eq rch ?2](310](B ) (visual-replace-right-1-char ?2](350](B ))
|
|
530 ((eq rch ?2](3^0](B ) (visual-replace-right-1-char ?2](320](B ))
|
|
531 ((eq rch ?2](3_0](B ) (visual-replace-right-1-char ?2](330](B ))
|
|
532 ((eq rch ?2](4_0](B) (visual-replace-right-1-char ?2](4!0](B))
|
|
533 ((eq rch ?2](3`0](B ) (visual-replace-right-1-char ?2](360](B ))
|
|
534 ((eq rch ?2](3a0](B ) (visual-replace-right-1-char ?2](370](B ))
|
|
535 ((eq rch ?2](4`0](B) (visual-replace-right-1-char ?2](4"0](B))
|
|
536 ((eq rch ?2](4]0](B) (visual-replace-right-1-char ?2](4!0](B))
|
|
537 ((eq rch ?2](4^0](B) (visual-replace-right-1-char ?2](4"0](B))
|
|
538 ((eq rch ?2](3e0](B ) (visual-replace-right-1-char ?2](3c0](B ))
|
|
539 ((eq rch ?2](4d0](B) (visual-replace-right-1-char ?2](4b0](B))
|
|
540 ((eq rch ?2](3c0](B ) (visual-replace-right-1-char ?2](3d0](B ))
|
|
541 ((eq rch ?2](4b0](B) (visual-replace-right-1-char ?2](4c0](B))
|
165
|
542 (t (arabic-cut-connection)
|
167
|
543 (visual-insert-right-1-char ?2](3-0](B)))
|
165
|
544 (setq arg (1- arg)))))
|
|
545
|
|
546 (defun arabic-toggle-input-char nil
|
|
547 "Toggle Arabic key input and ASCII key input."
|
|
548 (interactive)
|
|
549 (if arabic-input-arabic-char
|
|
550 (setq arabic-input-arabic-char nil
|
|
551 arabic-mode-indicator " Arabic")
|
|
552 (setq arabic-input-arabic-char t
|
167
|
553 arabic-mode-indicator " 2](3=a:GJ0](B"))
|
165
|
554 (redraw-modeline t))
|
|
555
|
|
556 (defun arabic-newline (arg)
|
|
557 "Newline for arabic-mode."
|
|
558 (interactive "*p")
|
|
559 (arabic-insert-char ?\n arg))
|
|
560
|
|
561 (defun arabic-open-line (arg)
|
|
562 "Openline for arabic-mode."
|
|
563 (interactive "*p")
|
|
564 (arabic-insert-char ?\n arg)
|
|
565 (visual-backward-char arg))
|
|
566
|
|
567 (defun arabic-delete-char (arg)
|
|
568 "Delete ARG (1st arg; integer) chars visually after visual point.
|
|
569 After that, Arabic ligature is performed."
|
|
570 (interactive "*p")
|
|
571 (visual-delete-char arg)
|
|
572 (arabic-make-connection))
|
|
573
|
|
574 (defun arabic-backward-delete-char (arg)
|
|
575 "Delete ARG (1st arg; integer) chars visually before visual point.
|
|
576 After that, Arabic ligature is performed."
|
|
577 (interactive "*p")
|
|
578 (visual-backward-delete-char arg)
|
|
579 (arabic-make-connection))
|
|
580
|
|
581 (defun arabic-kill-region (beg end)
|
|
582 "Kill-region command for arabic-mode."
|
|
583 (interactive "r")
|
|
584 (if (or (and buffer-read-only (not inhibit-read-only))
|
|
585 (text-property-not-all beg end 'read-only nil))
|
|
586 (visual-kill-region beg end)
|
|
587 (visual-kill-region beg end)
|
|
588 (arabic-make-connection)))
|
|
589
|
|
590 (defun arabic-kill-word (arg)
|
|
591 "Kill-word command for arabic-mode."
|
|
592 (interactive "*p")
|
|
593 (visual-kill-word arg)
|
|
594 (arabic-make-connection))
|
|
595
|
|
596 (defun arabic-backward-kill-word (arg)
|
|
597 "Backword-ill-word command for arabic-mode."
|
|
598 (interactive "*p")
|
|
599 (visual-backward-kill-word arg)
|
|
600 (arabic-make-connection))
|
|
601
|
|
602 (defun arabic-kill-line (&optional arg)
|
|
603 "Kill-line command for arabic-mode."
|
|
604 (interactive "*P")
|
|
605 (visual-kill-line arg)
|
|
606 (arabic-make-connection))
|
|
607
|
|
608 (defun arabic-yank (&optional arg)
|
|
609 "yank command for arabic-mode."
|
|
610 (interactive "*P")
|
|
611 (visual-yank arg)
|
|
612 (let ((p1 (point)) (p2 (mark t)))
|
|
613 (arabic-make-connection)
|
|
614 (goto-char p2)
|
|
615 (arabic-make-connection)
|
|
616 (goto-char p1)
|
|
617 (set-marker (mark-marker) p2 (current-buffer))
|
|
618 nil))
|
|
619
|
|
620 (defun arabic-yank-pop (arg)
|
|
621 "yank-pop command for arabic-mode."
|
|
622 (interactive "*p")
|
|
623 (visual-yank-pop arg)
|
|
624 (let ((p1 (point)) (p2 (mark t)))
|
|
625 (arabic-make-connection)
|
|
626 (goto-char p2)
|
|
627 (arabic-make-connection)
|
|
628 (goto-char p1)
|
|
629 (set-marker (mark-marker) p2 (current-buffer))
|
|
630 nil))
|
|
631
|
|
632 (defun arabic-help nil
|
|
633 "Display keymap in Arabic-mode."
|
|
634 (interactive)
|
|
635 (let ((arabic-help-buffer (get-buffer-create "*Help*")))
|
|
636 (set-buffer arabic-help-buffer)
|
|
637 (erase-buffer)
|
|
638 (insert arabic-help-string)
|
|
639 (goto-char (point-min))
|
|
640 (display-buffer (current-buffer))))
|
|
641
|
|
642
|
|
643 ;; arabic LR commands
|
|
644
|
|
645 (defun arabic-delete-left-char (arg)
|
|
646 "Kill N (1st arg; integer) characters on the left of visual point."
|
|
647 (interactive "*p")
|
|
648 (if display-direction
|
|
649 (arabic-delete-char arg)
|
|
650 (arabic-backward-delete-char arg)))
|
|
651
|
|
652 (defun arabic-delete-right-char (arg)
|
|
653 "Kill N (1st arg; integer) characters on the right of visual point."
|
|
654 (interactive "*p")
|
|
655 (if display-direction
|
|
656 (arabic-backward-delete-char arg)
|
|
657 (arabic-delete-char arg)))
|
|
658
|
|
659 (defun arabic-kill-left-word (arg)
|
|
660 "Kill N (1st arg; integer) words on the left of visual point."
|
|
661 (interactive "*p")
|
|
662 (if display-direction
|
|
663 (arabic-kill-word arg)
|
|
664 (arabic-backward-kill-word arg)))
|
|
665
|
|
666 (defun arabic-kill-right-word (arg)
|
|
667 "Kill N (1st arg; integer) words on the right of visual point."
|
|
668 (interactive "*p")
|
|
669 (if display-direction
|
|
670 (arabic-backward-kill-word arg)
|
|
671 (arabic-kill-word arg)))
|
|
672
|
|
673 ;;;
|
167
|
674 (provide 'language/arabic-util)
|
|
675
|
165
|
676 ;;; arabic-util.el ends here
|