blob: 48dd991b07aec3afd80b6702a7654b0df4b2a308 [file] [log] [blame]
Bram Moolenaaredf3f972016-08-29 22:49:24 +02001/* vi:set ts=8 sts=4 sw=4 noet:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002 *
3 * VIM - Vi IMproved by Bram Moolenaar
4 *
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
8 */
9
10/*
11 * farsi.c: functions for Farsi language
Bram Moolenaar071d4272004-06-13 20:20:40 +000012 */
13
Bram Moolenaar75464dc2016-07-02 20:27:50 +020014#include "vim.h"
15
16#if defined(FEAT_FKMAP) || defined(PROTO)
17
Bram Moolenaard25c16e2016-01-29 22:13:30 +010018static int F_is_TyB_TyC_TyD(int src, int offset);
Bram Moolenaar071d4272004-06-13 20:20:40 +000019
20/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +020021 * Convert the given Farsi character into a _X or _X_ type
Bram Moolenaarddf662a2017-01-29 17:59:12 +010022 */
Bram Moolenaar071d4272004-06-13 20:20:40 +000023 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +010024toF_Xor_X_(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +000025{
26 int tempc;
27
28 switch (c)
29 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +020030 case BE: return _BE;
31 case PE: return _PE;
32 case TE: return _TE;
33 case SE: return _SE;
34 case JIM: return _JIM;
35 case CHE: return _CHE;
36 case HE_J: return _HE_J;
37 case XE: return _XE;
38 case SIN: return _SIN;
39 case SHIN: return _SHIN;
40 case SAD: return _SAD;
41 case ZAD: return _ZAD;
42 case AYN: return _AYN;
43 case AYN_: return _AYN_;
44 case GHAYN: return _GHAYN;
45 case GHAYN_: return _GHAYN_;
46 case FE: return _FE;
47 case GHAF: return _GHAF;
48 case KAF: return _KAF;
49 case GAF: return _GAF;
50 case LAM: return _LAM;
51 case MIM: return _MIM;
52 case NOON: return _NOON;
Bram Moolenaar071d4272004-06-13 20:20:40 +000053 case YE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +020054 case YE_: return _YE;
Bram Moolenaar071d4272004-06-13 20:20:40 +000055 case YEE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +020056 case YEE_: return _YEE;
Bram Moolenaar071d4272004-06-13 20:20:40 +000057 case IE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +020058 case IE_: return _IE;
Bram Moolenaar071d4272004-06-13 20:20:40 +000059 case F_HE:
60 tempc = _HE;
61
Bram Moolenaaraf0167f2009-05-16 15:31:32 +000062 if (p_ri && (curwin->w_cursor.col + 1
63 < (colnr_T)STRLEN(ml_get_curline())))
Bram Moolenaar071d4272004-06-13 20:20:40 +000064 {
65 inc_cursor();
66
67 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
68 tempc = _HE_;
69
70 dec_cursor();
71 }
72 if (!p_ri && STRLEN(ml_get_curline()))
73 {
74 dec_cursor();
75
76 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
77 tempc = _HE_;
78
79 inc_cursor();
80 }
81
82 return tempc;
83 }
84 return 0;
85}
86
87/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +020088 * Convert the given Farsi character into Farsi capital character.
Bram Moolenaarddf662a2017-01-29 17:59:12 +010089 */
Bram Moolenaaree2615a2016-07-02 18:25:34 +020090 static int
91toF_TyA(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +000092{
93 switch (c)
94 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +020095 case ALEF_: return ALEF;
96 case ALEF_U_H_: return ALEF_U_H;
97 case _BE: return BE;
98 case _PE: return PE;
99 case _TE: return TE;
100 case _SE: return SE;
101 case _JIM: return JIM;
102 case _CHE: return CHE;
103 case _HE_J: return HE_J;
104 case _XE: return XE;
105 case _SIN: return SIN;
106 case _SHIN: return SHIN;
107 case _SAD: return SAD;
108 case _ZAD: return ZAD;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109 case _AYN:
110 case AYN_:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200111 case _AYN_: return AYN;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000112 case _GHAYN:
113 case GHAYN_:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200114 case _GHAYN_: return GHAYN;
115 case _FE: return FE;
116 case _GHAF: return GHAF;
117 /* I am not sure what it is !!! case _KAF_H: */
118 case _KAF: return KAF;
119 case _GAF: return GAF;
120 case _LAM: return LAM;
121 case _MIM: return MIM;
122 case _NOON: return NOON;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123 case _YE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200124 case YE_: return YE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000125 case _YEE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200126 case YEE_: return YEE;
127 case TEE_: return TEE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128 case _IE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200129 case IE_: return IE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000130 case _HE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200131 case _HE_: return F_HE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132 }
133 return c;
134}
135
136/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200137 * Is the character under the cursor+offset in the given buffer a join type.
138 * That is a character that is combined with the others.
139 * Note: the offset is used only for command line buffer.
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100140 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100142F_is_TyB_TyC_TyD(int src, int offset)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000143{
144 int c;
145
146 if (src == SRC_EDT)
147 c = gchar_cursor();
148 else
149 c = cmd_gchar(AT_CURSOR+offset);
150
151 switch (c)
152 {
153 case _LAM:
154 case _BE:
155 case _PE:
156 case _TE:
157 case _SE:
158 case _JIM:
159 case _CHE:
160 case _HE_J:
161 case _XE:
162 case _SIN:
163 case _SHIN:
164 case _SAD:
165 case _ZAD:
166 case _TA:
167 case _ZA:
168 case _AYN:
169 case _AYN_:
170 case _GHAYN:
171 case _GHAYN_:
172 case _FE:
173 case _GHAF:
174 case _KAF:
175 case _KAF_H:
176 case _GAF:
177 case _MIM:
178 case _NOON:
179 case _YE:
180 case _YEE:
181 case _IE:
182 case _HE_:
183 case _HE:
184 return TRUE;
185 }
186 return FALSE;
187}
188
189/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200190 * Is the Farsi character one of the terminating only type.
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100191 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000192 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100193F_is_TyE(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194{
195 switch (c)
196 {
197 case ALEF_A:
198 case ALEF_D_H:
199 case DAL:
200 case ZAL:
201 case RE:
202 case ZE:
203 case JE:
204 case WAW:
205 case WAW_H:
206 case HAMZE:
207 return TRUE;
208 }
209 return FALSE;
210}
211
212/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200213 * Is the Farsi character one of the none leading type.
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100214 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100216F_is_TyC_TyD(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217{
218 switch (c)
219 {
220 case ALEF_:
221 case ALEF_U_H_:
222 case _AYN_:
223 case AYN_:
224 case _GHAYN_:
225 case GHAYN_:
226 case _HE_:
227 case YE_:
228 case IE_:
229 case TEE_:
230 case YEE_:
231 return TRUE;
232 }
233 return FALSE;
234}
235
236/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200237 * Convert a none leading Farsi char into a leading type.
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100238 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000239 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100240toF_TyB(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000241{
242 switch (c)
243 {
244 case ALEF_: return ALEF;
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200245 case ALEF_U_H_: return ALEF_U_H;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246 case _AYN_: return _AYN;
247 case AYN_: return AYN; /* exception - there are many of them */
248 case _GHAYN_: return _GHAYN;
249 case GHAYN_: return GHAYN; /* exception - there are many of them */
250 case _HE_: return _HE;
251 case YE_: return YE;
252 case IE_: return IE;
253 case TEE_: return TEE;
254 case YEE_: return YEE;
255 }
256 return c;
257}
258
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100259
260 static void
261put_and_redo(int c)
262{
263 pchar_cursor(c);
264 AppendCharToRedobuff(K_BS);
265 AppendCharToRedobuff(c);
266}
267
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200269 * Overwrite the current redo and cursor characters + left adjust.
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100270 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000271 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100272put_curr_and_l_to_X(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000273{
274 int tempc;
275
276 if (curwin->w_p_rl && p_ri)
277 return;
278
Bram Moolenaaraf0167f2009-05-16 15:31:32 +0000279 if ((curwin->w_cursor.col < (colnr_T)STRLEN(ml_get_curline())))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000280 {
281 if ((p_ri && curwin->w_cursor.col) || !p_ri)
282 {
283 if (p_ri)
284 dec_cursor();
285 else
286 inc_cursor();
287
288 if (F_is_TyC_TyD((tempc = gchar_cursor())))
289 {
290 pchar_cursor(toF_TyB(tempc));
291 AppendCharToRedobuff(K_BS);
292 AppendCharToRedobuff(tempc);
293 }
294
295 if (p_ri)
296 inc_cursor();
297 else
298 dec_cursor();
299 }
300 }
301
302 put_and_redo(c);
303}
304
Bram Moolenaar071d4272004-06-13 20:20:40 +0000305/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200306 * Change the char. under the cursor to a X_ or X type
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100307 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000308 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100309chg_c_toX_orX(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310{
311 int tempc, curc;
312
313 switch ((curc = gchar_cursor()))
314 {
315 case _BE:
316 tempc = BE;
317 break;
318 case _PE:
319 tempc = PE;
320 break;
321 case _TE:
322 tempc = TE;
323 break;
324 case _SE:
325 tempc = SE;
326 break;
327 case _JIM:
328 tempc = JIM;
329 break;
330 case _CHE:
331 tempc = CHE;
332 break;
333 case _HE_J:
334 tempc = HE_J;
335 break;
336 case _XE:
337 tempc = XE;
338 break;
339 case _SIN:
340 tempc = SIN;
341 break;
342 case _SHIN:
343 tempc = SHIN;
344 break;
345 case _SAD:
346 tempc = SAD;
347 break;
348 case _ZAD:
349 tempc = ZAD;
350 break;
351 case _FE:
352 tempc = FE;
353 break;
354 case _GHAF:
355 tempc = GHAF;
356 break;
357 case _KAF_H:
358 case _KAF:
359 tempc = KAF;
360 break;
361 case _GAF:
362 tempc = GAF;
363 break;
364 case _AYN:
365 tempc = AYN;
366 break;
367 case _AYN_:
368 tempc = AYN_;
369 break;
370 case _GHAYN:
371 tempc = GHAYN;
372 break;
373 case _GHAYN_:
374 tempc = GHAYN_;
375 break;
376 case _LAM:
377 tempc = LAM;
378 break;
379 case _MIM:
380 tempc = MIM;
381 break;
382 case _NOON:
383 tempc = NOON;
384 break;
385 case _HE:
386 case _HE_:
387 tempc = F_HE;
388 break;
389 case _YE:
390 case _IE:
391 case _YEE:
392 if (p_ri)
393 {
394 inc_cursor();
395 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
396 tempc = (curc == _YE ? YE_ :
397 (curc == _IE ? IE_ : YEE_));
398 else
399 tempc = (curc == _YE ? YE :
400 (curc == _IE ? IE : YEE));
401 dec_cursor();
402 }
403 else
404 {
405 if (curwin->w_cursor.col)
406 {
407 dec_cursor();
408 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
409 tempc = (curc == _YE ? YE_ :
410 (curc == _IE ? IE_ : YEE_));
411 else
412 tempc = (curc == _YE ? YE :
413 (curc == _IE ? IE : YEE));
414 inc_cursor();
415 }
416 else
417 tempc = (curc == _YE ? YE :
418 (curc == _IE ? IE : YEE));
419 }
420 break;
421 default:
422 tempc = 0;
423 }
424
425 if (tempc)
426 put_and_redo(tempc);
427}
428
429/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200430 * Change the char. under the cursor to a _X_ or X_ type
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100431 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000432 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100433chg_c_to_X_orX_(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000434{
435 int tempc;
436
437 switch (gchar_cursor())
438 {
439 case ALEF:
440 tempc = ALEF_;
441 break;
442 case ALEF_U_H:
443 tempc = ALEF_U_H_;
444 break;
445 case _AYN:
446 tempc = _AYN_;
447 break;
448 case AYN:
449 tempc = AYN_;
450 break;
451 case _GHAYN:
452 tempc = _GHAYN_;
453 break;
454 case GHAYN:
455 tempc = GHAYN_;
456 break;
457 case _HE:
458 tempc = _HE_;
459 break;
460 case YE:
461 tempc = YE_;
462 break;
463 case IE:
464 tempc = IE_;
465 break;
466 case TEE:
467 tempc = TEE_;
468 break;
469 case YEE:
470 tempc = YEE_;
471 break;
472 default:
473 tempc = 0;
474 }
475
476 if (tempc)
477 put_and_redo(tempc);
478}
479
480/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200481 * Change the char. under the cursor to a _X_ or _X type
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100482 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000483 static void
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100484chg_c_to_X_or_X(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000485{
486 int tempc;
487
488 tempc = gchar_cursor();
489
Bram Moolenaaraf0167f2009-05-16 15:31:32 +0000490 if (curwin->w_cursor.col + 1 < (colnr_T)STRLEN(ml_get_curline()))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000491 {
492 inc_cursor();
493
494 if ((tempc == F_HE) && (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)))
495 {
496 tempc = _HE_;
497
498 dec_cursor();
499
500 put_and_redo(tempc);
501 return;
502 }
503
504 dec_cursor();
505 }
506
507 if ((tempc = toF_Xor_X_(tempc)) != 0)
508 put_and_redo(tempc);
509}
510
511/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200512 * Change the character left to the cursor to a _X_ or X_ type
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100513 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000514 static void
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200515chg_l_to_X_orX_(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000516{
517 int tempc;
518
Bram Moolenaaraf0167f2009-05-16 15:31:32 +0000519 if (curwin->w_cursor.col != 0 &&
520 (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000521 return;
522
523 if (!curwin->w_cursor.col && p_ri)
524 return;
525
526 if (p_ri)
527 dec_cursor();
528 else
529 inc_cursor();
530
531 switch (gchar_cursor())
532 {
533 case ALEF:
534 tempc = ALEF_;
535 break;
536 case ALEF_U_H:
537 tempc = ALEF_U_H_;
538 break;
539 case _AYN:
540 tempc = _AYN_;
541 break;
542 case AYN:
543 tempc = AYN_;
544 break;
545 case _GHAYN:
546 tempc = _GHAYN_;
547 break;
548 case GHAYN:
549 tempc = GHAYN_;
550 break;
551 case _HE:
552 tempc = _HE_;
553 break;
554 case YE:
555 tempc = YE_;
556 break;
557 case IE:
558 tempc = IE_;
559 break;
560 case TEE:
561 tempc = TEE_;
562 break;
563 case YEE:
564 tempc = YEE_;
565 break;
566 default:
567 tempc = 0;
568 }
569
570 if (tempc)
571 put_and_redo(tempc);
572
573 if (p_ri)
574 inc_cursor();
575 else
576 dec_cursor();
577}
578
579/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200580 * Change the character left to the cursor to a X or _X type
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100581 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000582 static void
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100583chg_l_toXor_X(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000584{
585 int tempc;
586
Bram Moolenaaraf0167f2009-05-16 15:31:32 +0000587 if (curwin->w_cursor.col != 0 &&
588 (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000589 return;
590
591 if (!curwin->w_cursor.col && p_ri)
592 return;
593
594 if (p_ri)
595 dec_cursor();
596 else
597 inc_cursor();
598
599 switch (gchar_cursor())
600 {
601 case ALEF_:
602 tempc = ALEF;
603 break;
604 case ALEF_U_H_:
605 tempc = ALEF_U_H;
606 break;
607 case _AYN_:
608 tempc = _AYN;
609 break;
610 case AYN_:
611 tempc = AYN;
612 break;
613 case _GHAYN_:
614 tempc = _GHAYN;
615 break;
616 case GHAYN_:
617 tempc = GHAYN;
618 break;
619 case _HE_:
620 tempc = _HE;
621 break;
622 case YE_:
623 tempc = YE;
624 break;
625 case IE_:
626 tempc = IE;
627 break;
628 case TEE_:
629 tempc = TEE;
630 break;
631 case YEE_:
632 tempc = YEE;
633 break;
634 default:
635 tempc = 0;
636 }
637
638 if (tempc)
639 put_and_redo(tempc);
640
641 if (p_ri)
642 inc_cursor();
643 else
644 dec_cursor();
645}
646
647/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200648 * Change the character right to the cursor to a _X or _X_ type
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100649 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000650 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100651chg_r_to_Xor_X_(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000652{
653 int tempc, c;
654
655 if (curwin->w_cursor.col)
656 {
657 if (!p_ri)
658 dec_cursor();
659
660 tempc = gchar_cursor();
661
662 if ((c = toF_Xor_X_(tempc)) != 0)
663 put_and_redo(c);
664
665 if (!p_ri)
666 inc_cursor();
667
668 }
669}
670
671/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200672 * Map Farsi keyboard when in fkmap mode.
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100673 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000674 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100675fkmap(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000676{
677 int tempc;
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100678 int insert_mode = (State & INSERT);
679 static int revins = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000680
681 if (IS_SPECIAL(c))
682 return c;
683
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100684 if (insert_mode)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000685 {
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100686 if (VIM_ISDIGIT(c) || ((c == '.' || c == '+' || c == '-' ||
687 c == '^' || c == '%' || c == '#' || c == '=') && revins))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000688 {
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100689 /* Numbers are entered left-to-right. */
690 if (!revins)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000691 {
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100692 if (curwin->w_cursor.col)
693 {
694 if (!p_ri)
695 dec_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +0000696
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100697 chg_c_toX_orX ();
698 chg_l_toXor_X ();
Bram Moolenaar071d4272004-06-13 20:20:40 +0000699
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100700 if (!p_ri)
701 inc_cursor();
702 }
Bram Moolenaar071d4272004-06-13 20:20:40 +0000703 }
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100704
705 arrow_used = TRUE;
706 (void)stop_arrow();
707
708 if (!curwin->w_p_rl && revins)
709 inc_cursor();
710
711 ++revins;
712 p_ri = 1;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000713 }
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100714 else if (revins)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000715 {
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100716 /* Stop entering number. */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000717 arrow_used = TRUE;
718 (void)stop_arrow();
719
720 revins = 0;
721 if (curwin->w_p_rl)
722 {
723 while ((F_isdigit(gchar_cursor())
724 || (gchar_cursor() == F_PERIOD
725 || gchar_cursor() == F_PLUS
726 || gchar_cursor() == F_MINUS
727 || gchar_cursor() == F_MUL
728 || gchar_cursor() == F_DIVIDE
729 || gchar_cursor() == F_PERCENT
730 || gchar_cursor() == F_EQUALS))
731 && gchar_cursor() != NUL)
732 ++curwin->w_cursor.col;
733 }
734 else
735 {
736 if (curwin->w_cursor.col)
737 while ((F_isdigit(gchar_cursor())
738 || (gchar_cursor() == F_PERIOD
739 || gchar_cursor() == F_PLUS
740 || gchar_cursor() == F_MINUS
741 || gchar_cursor() == F_MUL
742 || gchar_cursor() == F_DIVIDE
743 || gchar_cursor() == F_PERCENT
744 || gchar_cursor() == F_EQUALS))
745 && --curwin->w_cursor.col)
746 ;
747
748 if (!F_isdigit(gchar_cursor()))
749 ++curwin->w_cursor.col;
750 }
751 }
752 }
753
754 if (!revins)
755 {
756 if (curwin->w_p_rl)
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100757 p_ri = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000758 if (!curwin->w_p_rl)
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100759 p_ri = 1;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000760 }
761
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100762 if ((c < 0x100) && (isalpha(c) || c == '&' || c == '^' || c == ';' ||
Bram Moolenaar071d4272004-06-13 20:20:40 +0000763 c == '\''|| c == ',' || c == '[' ||
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100764 c == ']' || c == '{' || c == '}'))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000765 chg_r_to_Xor_X_();
766
767 tempc = 0;
768
769 switch (c)
770 {
771 case '`':
772 case ' ':
773 case '.':
774 case '!':
775 case '"':
776 case '$':
777 case '%':
778 case '^':
779 case '&':
780 case '/':
781 case '(':
782 case ')':
783 case '=':
784 case '\\':
785 case '?':
786 case '+':
787 case '-':
788 case '_':
789 case '*':
790 case ':':
791 case '#':
792 case '~':
793 case '@':
794 case '<':
795 case '>':
796 case '{':
797 case '}':
798 case '|':
799 case '0':
800 case '1':
801 case '2':
802 case '3':
803 case '4':
804 case '5':
805 case '6':
806 case '7':
807 case '8':
808 case '9':
809 case 'B':
810 case 'E':
811 case 'F':
812 case 'H':
813 case 'I':
814 case 'K':
815 case 'L':
816 case 'M':
817 case 'O':
818 case 'P':
819 case 'Q':
820 case 'R':
821 case 'T':
822 case 'U':
823 case 'W':
824 case 'Y':
825 case NL:
826 case TAB:
827
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100828 if (p_ri && c == NL && curwin->w_cursor.col && insert_mode)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000829 {
830 /*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200831 * If the char before the cursor is _X_ or X_ do not change
832 * the one under the cursor with X type.
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100833 */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000834 dec_cursor();
835
836 if (F_isalpha(gchar_cursor()))
837 {
838 inc_cursor();
839 return NL;
840 }
841
842 inc_cursor();
843 }
844
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200845 if (!p_ri && !curwin->w_cursor.col)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000846 {
847 switch (c)
848 {
849 case '0': return FARSI_0;
850 case '1': return FARSI_1;
851 case '2': return FARSI_2;
852 case '3': return FARSI_3;
853 case '4': return FARSI_4;
854 case '5': return FARSI_5;
855 case '6': return FARSI_6;
856 case '7': return FARSI_7;
857 case '8': return FARSI_8;
858 case '9': return FARSI_9;
859 case 'B': return F_PSP;
860 case 'E': return JAZR_N;
861 case 'F': return ALEF_D_H;
862 case 'H': return ALEF_A;
863 case 'I': return TASH;
864 case 'K': return F_LQUOT;
865 case 'L': return F_RQUOT;
866 case 'M': return HAMZE;
867 case 'O': return '[';
868 case 'P': return ']';
869 case 'Q': return OO;
870 case 'R': return MAD_N;
871 case 'T': return OW;
872 case 'U': return MAD;
873 case 'W': return OW_OW;
874 case 'Y': return JAZR;
875 case '`': return F_PCN;
876 case '!': return F_EXCL;
877 case '@': return F_COMMA;
878 case '#': return F_DIVIDE;
879 case '$': return F_CURRENCY;
880 case '%': return F_PERCENT;
881 case '^': return F_MUL;
882 case '&': return F_BCOMMA;
883 case '*': return F_STAR;
884 case '(': return F_LPARENT;
885 case ')': return F_RPARENT;
886 case '-': return F_MINUS;
887 case '_': return F_UNDERLINE;
888 case '=': return F_EQUALS;
889 case '+': return F_PLUS;
890 case '\\': return F_BSLASH;
891 case '|': return F_PIPE;
892 case ':': return F_DCOLON;
893 case '"': return F_SEMICOLON;
894 case '.': return F_PERIOD;
895 case '/': return F_SLASH;
896 case '<': return F_LESS;
897 case '>': return F_GREATER;
898 case '?': return F_QUESTION;
899 case ' ': return F_BLANK;
900 }
901 break;
902 }
Bram Moolenaar071d4272004-06-13 20:20:40 +0000903
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100904 if (insert_mode)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000905 {
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100906 if (!p_ri)
907 dec_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +0000908
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100909 switch ((tempc = gchar_cursor()))
910 {
911 case _BE:
912 case _PE:
913 case _TE:
914 case _SE:
915 case _JIM:
916 case _CHE:
917 case _HE_J:
918 case _XE:
919 case _SIN:
920 case _SHIN:
921 case _SAD:
922 case _ZAD:
923 case _FE:
924 case _GHAF:
925 case _KAF:
926 case _KAF_H:
927 case _GAF:
928 case _LAM:
929 case _MIM:
930 case _NOON:
931 case _HE:
932 case _HE_:
933 case _TA:
934 case _ZA:
935 put_curr_and_l_to_X(toF_TyA(tempc));
936 break;
937 case _AYN:
938 case _AYN_:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000939
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100940 if (!p_ri)
941 if (!curwin->w_cursor.col)
942 {
943 put_curr_and_l_to_X(AYN);
944 break;
945 }
Bram Moolenaar071d4272004-06-13 20:20:40 +0000946
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100947 if (p_ri)
948 inc_cursor();
949 else
950 dec_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +0000951
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100952 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
953 tempc = AYN_;
954 else
955 tempc = AYN;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000956
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100957 if (p_ri)
958 dec_cursor();
959 else
960 inc_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +0000961
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100962 put_curr_and_l_to_X(tempc);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000963
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100964 break;
965 case _GHAYN:
966 case _GHAYN_:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000967
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100968 if (!p_ri)
969 if (!curwin->w_cursor.col)
970 {
971 put_curr_and_l_to_X(GHAYN);
972 break;
973 }
Bram Moolenaar071d4272004-06-13 20:20:40 +0000974
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100975 if (p_ri)
976 inc_cursor();
977 else
978 dec_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +0000979
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100980 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
981 tempc = GHAYN_;
982 else
983 tempc = GHAYN;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000984
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100985 if (p_ri)
986 dec_cursor();
987 else
988 inc_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +0000989
Bram Moolenaarddf662a2017-01-29 17:59:12 +0100990 put_curr_and_l_to_X(tempc);
991 break;
992 case _YE:
993 case _IE:
994 case _YEE:
995 if (!p_ri)
996 if (!curwin->w_cursor.col)
997 {
998 put_curr_and_l_to_X((tempc == _YE ? YE :
999 (tempc == _IE ? IE : YEE)));
1000 break;
1001 }
Bram Moolenaar071d4272004-06-13 20:20:40 +00001002
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001003 if (p_ri)
1004 inc_cursor();
1005 else
1006 dec_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001007
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001008 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1009 tempc = (tempc == _YE ? YE_ :
1010 (tempc == _IE ? IE_ : YEE_));
1011 else
1012 tempc = (tempc == _YE ? YE :
1013 (tempc == _IE ? IE : YEE));
Bram Moolenaar071d4272004-06-13 20:20:40 +00001014
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001015 if (p_ri)
1016 dec_cursor();
1017 else
1018 inc_cursor();
1019
1020 put_curr_and_l_to_X(tempc);
1021 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001022 }
1023
1024 if (!p_ri)
1025 inc_cursor();
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001026 }
Bram Moolenaar071d4272004-06-13 20:20:40 +00001027
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001028 tempc = 0;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001029
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001030 switch (c)
1031 {
1032 case '0': return FARSI_0;
1033 case '1': return FARSI_1;
1034 case '2': return FARSI_2;
1035 case '3': return FARSI_3;
1036 case '4': return FARSI_4;
1037 case '5': return FARSI_5;
1038 case '6': return FARSI_6;
1039 case '7': return FARSI_7;
1040 case '8': return FARSI_8;
1041 case '9': return FARSI_9;
1042 case 'B': return F_PSP;
1043 case 'E': return JAZR_N;
1044 case 'F': return ALEF_D_H;
1045 case 'H': return ALEF_A;
1046 case 'I': return TASH;
1047 case 'K': return F_LQUOT;
1048 case 'L': return F_RQUOT;
1049 case 'M': return HAMZE;
1050 case 'O': return '[';
1051 case 'P': return ']';
1052 case 'Q': return OO;
1053 case 'R': return MAD_N;
1054 case 'T': return OW;
1055 case 'U': return MAD;
1056 case 'W': return OW_OW;
1057 case 'Y': return JAZR;
1058 case '`': return F_PCN;
1059 case '!': return F_EXCL;
1060 case '@': return F_COMMA;
1061 case '#': return F_DIVIDE;
1062 case '$': return F_CURRENCY;
1063 case '%': return F_PERCENT;
1064 case '^': return F_MUL;
1065 case '&': return F_BCOMMA;
1066 case '*': return F_STAR;
1067 case '(': return F_LPARENT;
1068 case ')': return F_RPARENT;
1069 case '-': return F_MINUS;
1070 case '_': return F_UNDERLINE;
1071 case '=': return F_EQUALS;
1072 case '+': return F_PLUS;
1073 case '\\': return F_BSLASH;
1074 case '|': return F_PIPE;
1075 case ':': return F_DCOLON;
1076 case '"': return F_SEMICOLON;
1077 case '.': return F_PERIOD;
1078 case '/': return F_SLASH;
1079 case '<': return F_LESS;
1080 case '>': return F_GREATER;
1081 case '?': return F_QUESTION;
1082 case ' ': return F_BLANK;
1083 }
1084 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001085
1086 case 'a':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001087 tempc = _SHIN;
1088 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001089 case 'A':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001090 tempc = WAW_H;
1091 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001092 case 'b':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001093 tempc = ZAL;
1094 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001095 case 'c':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001096 tempc = ZE;
1097 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001098 case 'C':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001099 tempc = JE;
1100 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001101 case 'd':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001102 tempc = _YE;
1103 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001104 case 'D':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001105 tempc = _YEE;
1106 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001107 case 'e':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001108 tempc = _SE;
1109 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001110 case 'f':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001111 tempc = _BE;
1112 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001113 case 'g':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001114 tempc = _LAM;
1115 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001116 case 'G':
1117 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001118 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001119
1120 if (gchar_cursor() == _LAM)
1121 chg_c_toX_orX ();
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001122 else if (p_ri)
1123 chg_c_to_X_or_X ();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001124 }
1125
1126 if (!p_ri)
1127 if (!curwin->w_cursor.col)
1128 return ALEF_U_H;
1129
1130 if (!p_ri)
1131 dec_cursor();
1132
1133 if (gchar_cursor() == _LAM)
1134 {
1135 chg_c_toX_orX ();
1136 chg_l_toXor_X ();
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001137 tempc = ALEF_U_H;
1138 }
1139 else if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1140 {
1141 tempc = ALEF_U_H_;
1142 chg_l_toXor_X ();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001143 }
1144 else
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001145 tempc = ALEF_U_H;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001146
1147 if (!p_ri)
1148 inc_cursor();
1149
1150 return tempc;
1151 case 'h':
1152 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
1153 {
1154 if (p_ri)
1155 chg_c_to_X_or_X ();
1156
1157 }
1158
1159 if (!p_ri)
1160 if (!curwin->w_cursor.col)
1161 return ALEF;
1162
1163 if (!p_ri)
1164 dec_cursor();
1165
1166 if (gchar_cursor() == _LAM)
1167 {
1168 chg_l_toXor_X();
1169 del_char(FALSE);
1170 AppendCharToRedobuff(K_BS);
1171
1172 if (!p_ri)
1173 dec_cursor();
1174
Bram Moolenaar68c85fc2016-02-24 12:57:50 +01001175 tempc = LA;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001176 }
1177 else
1178 {
1179 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1180 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001181 tempc = ALEF_;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001182 chg_l_toXor_X ();
1183 }
1184 else
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001185 tempc = ALEF;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001186 }
1187
1188 if (!p_ri)
1189 inc_cursor();
1190
1191 return tempc;
1192 case 'i':
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001193 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
1194 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001195 if (!p_ri && !F_is_TyE(tempc))
1196 chg_c_to_X_orX_ ();
1197 if (p_ri)
1198 chg_c_to_X_or_X ();
1199
1200 }
1201
1202 if (!p_ri && !curwin->w_cursor.col)
1203 return _HE;
1204
1205 if (!p_ri)
1206 dec_cursor();
1207
1208 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001209 tempc = _HE_;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001210 else
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001211 tempc = _HE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001212
1213 if (!p_ri)
1214 inc_cursor();
1215 break;
1216 case 'j':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001217 tempc = _TE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001218 break;
1219 case 'J':
1220 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001221 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001222 if (p_ri)
1223 chg_c_to_X_or_X ();
1224
1225 }
1226
1227 if (!p_ri)
1228 if (!curwin->w_cursor.col)
1229 return TEE;
1230
1231 if (!p_ri)
1232 dec_cursor();
1233
1234 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1235 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001236 tempc = TEE_;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001237 chg_l_toXor_X ();
1238 }
1239 else
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001240 tempc = TEE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001241
1242 if (!p_ri)
1243 inc_cursor();
1244
1245 return tempc;
1246 case 'k':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001247 tempc = _NOON;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001248 break;
1249 case 'l':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001250 tempc = _MIM;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001251 break;
1252 case 'm':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001253 tempc = _PE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001254 break;
1255 case 'n':
1256 case 'N':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001257 tempc = DAL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001258 break;
1259 case 'o':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001260 tempc = _XE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001261 break;
1262 case 'p':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001263 tempc = _HE_J;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001264 break;
1265 case 'q':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001266 tempc = _ZAD;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001267 break;
1268 case 'r':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001269 tempc = _GHAF;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001270 break;
1271 case 's':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001272 tempc = _SIN;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001273 break;
1274 case 'S':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001275 tempc = _IE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001276 break;
1277 case 't':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001278 tempc = _FE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001279 break;
1280 case 'u':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001281 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
1282 {
1283 if (!p_ri && !F_is_TyE(tempc))
1284 chg_c_to_X_orX_ ();
1285 if (p_ri)
1286 chg_c_to_X_or_X ();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001287
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001288 }
Bram Moolenaar071d4272004-06-13 20:20:40 +00001289
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001290 if (!p_ri && !curwin->w_cursor.col)
1291 return _AYN;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001292
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001293 if (!p_ri)
1294 dec_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001295
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001296 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1297 tempc = _AYN_;
1298 else
1299 tempc = _AYN;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001300
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001301 if (!p_ri)
1302 inc_cursor();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001303 break;
1304 case 'v':
1305 case 'V':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001306 tempc = RE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001307 break;
1308 case 'w':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001309 tempc = _SAD;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001310 break;
1311 case 'x':
1312 case 'X':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001313 tempc = _TA;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001314 break;
1315 case 'y':
1316 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001317 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001318 if (!p_ri && !F_is_TyE(tempc))
1319 chg_c_to_X_orX_ ();
1320 if (p_ri)
1321 chg_c_to_X_or_X ();
1322
1323 }
1324
1325 if (!p_ri && !curwin->w_cursor.col)
1326 return _GHAYN;
1327
1328 if (!p_ri)
1329 dec_cursor();
1330
1331 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1332 tempc = _GHAYN_;
1333 else
1334 tempc = _GHAYN;
1335
1336 if (!p_ri)
1337 inc_cursor();
1338
1339 break;
1340 case 'z':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001341 tempc = _ZA;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001342 break;
1343 case 'Z':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001344 tempc = _KAF_H;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001345 break;
1346 case ';':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001347 tempc = _KAF;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001348 break;
1349 case '\'':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001350 tempc = _GAF;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001351 break;
1352 case ',':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001353 tempc = WAW;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001354 break;
1355 case '[':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001356 tempc = _JIM;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001357 break;
1358 case ']':
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001359 tempc = _CHE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001360 break;
1361 }
1362
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001363 if (F_isalpha(tempc) || F_isdigit(tempc))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001364 {
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001365 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001366 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001367 if (!p_ri && !F_is_TyE(tempc))
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001368 chg_c_to_X_orX_();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001369 if (p_ri)
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001370 chg_c_to_X_or_X();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001371 }
1372
1373 if (curwin->w_cursor.col)
1374 {
1375 if (!p_ri)
1376 dec_cursor();
1377
1378 if (F_is_TyE(tempc))
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001379 chg_l_toXor_X();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001380 else
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001381 chg_l_to_X_orX_();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001382
1383 if (!p_ri)
1384 inc_cursor();
1385 }
1386 }
1387 if (tempc)
1388 return tempc;
1389 return c;
1390}
1391
1392/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001393 * Convert a none leading Farsi char into a leading type.
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001394 */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001395 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001396toF_leading(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001397{
1398 switch (c)
1399 {
1400 case ALEF_: return ALEF;
1401 case ALEF_U_H_: return ALEF_U_H;
1402 case BE: return _BE;
1403 case PE: return _PE;
1404 case TE: return _TE;
1405 case SE: return _SE;
1406 case JIM: return _JIM;
1407 case CHE: return _CHE;
1408 case HE_J: return _HE_J;
1409 case XE: return _XE;
1410 case SIN: return _SIN;
1411 case SHIN: return _SHIN;
1412 case SAD: return _SAD;
1413 case ZAD: return _ZAD;
1414
1415 case AYN:
1416 case AYN_:
1417 case _AYN_: return _AYN;
1418
1419 case GHAYN:
1420 case GHAYN_:
1421 case _GHAYN_: return _GHAYN;
1422
1423 case FE: return _FE;
1424 case GHAF: return _GHAF;
1425 case KAF: return _KAF;
1426 case GAF: return _GAF;
1427 case LAM: return _LAM;
1428 case MIM: return _MIM;
1429 case NOON: return _NOON;
1430
1431 case _HE_:
1432 case F_HE: return _HE;
1433
1434 case YE:
1435 case YE_: return _YE;
1436
1437 case IE_:
1438 case IE: return _IE;
1439
1440 case YEE:
1441 case YEE_: return _YEE;
1442 }
1443 return c;
1444}
1445
1446/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001447 * Convert a given Farsi char into right joining type.
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001448 */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001449 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001450toF_Rjoin(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001451{
1452 switch (c)
1453 {
1454 case ALEF: return ALEF_;
1455 case ALEF_U_H: return ALEF_U_H_;
1456 case BE: return _BE;
1457 case PE: return _PE;
1458 case TE: return _TE;
1459 case SE: return _SE;
1460 case JIM: return _JIM;
1461 case CHE: return _CHE;
1462 case HE_J: return _HE_J;
1463 case XE: return _XE;
1464 case SIN: return _SIN;
1465 case SHIN: return _SHIN;
1466 case SAD: return _SAD;
1467 case ZAD: return _ZAD;
1468
1469 case AYN:
1470 case AYN_:
1471 case _AYN: return _AYN_;
1472
1473 case GHAYN:
1474 case GHAYN_:
1475 case _GHAYN_: return _GHAYN_;
1476
1477 case FE: return _FE;
1478 case GHAF: return _GHAF;
1479 case KAF: return _KAF;
1480 case GAF: return _GAF;
1481 case LAM: return _LAM;
1482 case MIM: return _MIM;
1483 case NOON: return _NOON;
1484
1485 case _HE:
1486 case F_HE: return _HE_;
1487
1488 case YE:
1489 case YE_: return _YE;
1490
1491 case IE_:
1492 case IE: return _IE;
1493
1494 case TEE: return TEE_;
1495
1496 case YEE:
1497 case YEE_: return _YEE;
1498 }
1499 return c;
1500}
1501
1502/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001503 * Can a given Farsi character join via its left edj.
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001504 */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001505 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001506canF_Ljoin(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001507{
1508 switch (c)
1509 {
1510 case _BE:
1511 case BE:
1512 case PE:
1513 case _PE:
1514 case TE:
1515 case _TE:
1516 case SE:
1517 case _SE:
1518 case JIM:
1519 case _JIM:
1520 case CHE:
1521 case _CHE:
1522 case HE_J:
1523 case _HE_J:
1524 case XE:
1525 case _XE:
1526 case SIN:
1527 case _SIN:
1528 case SHIN:
1529 case _SHIN:
1530 case SAD:
1531 case _SAD:
1532 case ZAD:
1533 case _ZAD:
1534 case _TA:
1535 case _ZA:
1536 case AYN:
1537 case _AYN:
1538 case _AYN_:
1539 case AYN_:
1540 case GHAYN:
1541 case GHAYN_:
1542 case _GHAYN_:
1543 case _GHAYN:
1544 case FE:
1545 case _FE:
1546 case GHAF:
1547 case _GHAF:
1548 case _KAF_H:
1549 case KAF:
1550 case _KAF:
1551 case GAF:
1552 case _GAF:
1553 case LAM:
1554 case _LAM:
1555 case MIM:
1556 case _MIM:
1557 case NOON:
1558 case _NOON:
1559 case IE:
1560 case _IE:
1561 case IE_:
1562 case YE:
1563 case _YE:
1564 case YE_:
1565 case YEE:
1566 case _YEE:
1567 case YEE_:
1568 case F_HE:
1569 case _HE:
1570 case _HE_:
1571 return TRUE;
1572 }
1573 return FALSE;
1574}
1575
1576/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001577 * Can a given Farsi character join via its right edj.
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001578 */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001579 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001580canF_Rjoin(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001581{
1582 switch (c)
1583 {
1584 case ALEF:
1585 case ALEF_:
1586 case ALEF_U_H:
1587 case ALEF_U_H_:
1588 case DAL:
1589 case ZAL:
1590 case RE:
1591 case JE:
1592 case ZE:
1593 case TEE:
1594 case TEE_:
1595 case WAW:
1596 case WAW_H:
1597 return TRUE;
1598 }
1599
1600 return canF_Ljoin(c);
1601
1602}
1603
1604/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001605 * is a given Farsi character a terminating type.
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001606 */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001607 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001608F_isterm(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001609{
1610 switch (c)
1611 {
1612 case ALEF:
1613 case ALEF_:
1614 case ALEF_U_H:
1615 case ALEF_U_H_:
1616 case DAL:
1617 case ZAL:
1618 case RE:
1619 case JE:
1620 case ZE:
1621 case WAW:
1622 case WAW_H:
1623 case TEE:
1624 case TEE_:
1625 return TRUE;
1626 }
1627
1628 return FALSE;
1629}
1630
1631/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001632 * Convert the given Farsi character into a ending type .
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001633 */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001634 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001635toF_ending(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001636{
Bram Moolenaar071d4272004-06-13 20:20:40 +00001637 switch (c)
1638 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001639 case _BE: return BE;
1640 case _PE: return PE;
1641 case _TE: return TE;
1642 case _SE: return SE;
1643 case _JIM: return JIM;
1644 case _CHE: return CHE;
1645 case _HE_J: return HE_J;
1646 case _XE: return XE;
1647 case _SIN: return SIN;
1648 case _SHIN: return SHIN;
1649 case _SAD: return SAD;
1650 case _ZAD: return ZAD;
1651 case _AYN: return AYN;
1652 case _AYN_: return AYN_;
1653 case _GHAYN: return GHAYN;
1654 case _GHAYN_: return GHAYN_;
1655 case _FE: return FE;
1656 case _GHAF: return GHAF;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001657 case _KAF_H:
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001658 case _KAF: return KAF;
1659 case _GAF: return GAF;
1660 case _LAM: return LAM;
1661 case _MIM: return MIM;
1662 case _NOON: return NOON;
1663 case _YE: return YE_;
1664 case YE_: return YE;
1665 case _YEE: return YEE_;
1666 case YEE_: return YEE;
1667 case TEE: return TEE_;
1668 case _IE: return IE_;
1669 case IE_: return IE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001670 case _HE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001671 case _HE_: return F_HE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001672 }
1673 return c;
1674}
1675
1676/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001677 * Convert the Farsi 3342 standard into Farsi VIM.
Bram Moolenaarddf662a2017-01-29 17:59:12 +01001678 */
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001679 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001680conv_to_pvim(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001681{
1682 char_u *ptr;
1683 int lnum, llen, i;
1684
1685 for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
1686 {
1687 ptr = ml_get((linenr_T)lnum);
1688
1689 llen = (int)STRLEN(ptr);
1690
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001691 for (i = 0; i < llen-1; i++)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001692 {
1693 if (canF_Ljoin(ptr[i]) && canF_Rjoin(ptr[i+1]))
1694 {
1695 ptr[i] = toF_leading(ptr[i]);
1696 ++i;
1697
Bram Moolenaar866c6882017-04-07 14:02:01 +02001698 while (i < llen && canF_Rjoin(ptr[i]))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001699 {
1700 ptr[i] = toF_Rjoin(ptr[i]);
1701 if (F_isterm(ptr[i]) || !F_isalpha(ptr[i]))
1702 break;
1703 ++i;
1704 }
1705 if (!F_isalpha(ptr[i]) || !canF_Rjoin(ptr[i]))
1706 ptr[i-1] = toF_ending(ptr[i-1]);
1707 }
1708 else
1709 ptr[i] = toF_TyA(ptr[i]);
1710 }
1711 }
1712
1713 /*
1714 * Following lines contains Farsi encoded character.
1715 */
1716
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001717 do_cmdline_cmd((char_u *)"%s/\202\231/\232/ge");
1718 do_cmdline_cmd((char_u *)"%s/\201\231/\370\334/ge");
Bram Moolenaar071d4272004-06-13 20:20:40 +00001719
1720 /* Assume the screen has been messed up: clear it and redraw. */
1721 redraw_later(CLEAR);
Bram Moolenaar32526b32019-01-19 17:43:09 +01001722 msg_attr(farsi_text_1, HL_ATTR(HLF_S));
Bram Moolenaar071d4272004-06-13 20:20:40 +00001723}
1724
1725/*
Bram Moolenaar84a05ac2013-05-06 04:24:17 +02001726 * Convert the Farsi VIM into Farsi 3342 standard.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001727 */
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001728 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001729conv_to_pstd(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001730{
1731 char_u *ptr;
1732 int lnum, llen, i;
1733
1734 /*
1735 * Following line contains Farsi encoded character.
1736 */
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001737 do_cmdline_cmd((char_u *)"%s/\232/\202\231/ge");
Bram Moolenaar071d4272004-06-13 20:20:40 +00001738
1739 for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
1740 {
1741 ptr = ml_get((linenr_T)lnum);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001742 llen = (int)STRLEN(ptr);
1743
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001744 for (i = 0; i < llen; i++)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001745 ptr[i] = toF_TyA(ptr[i]);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001746 }
1747
1748 /* Assume the screen has been messed up: clear it and redraw. */
1749 redraw_later(CLEAR);
Bram Moolenaar32526b32019-01-19 17:43:09 +01001750 msg_attr(farsi_text_2, HL_ATTR(HLF_S));
Bram Moolenaar071d4272004-06-13 20:20:40 +00001751}
1752
1753/*
1754 * left-right swap the characters in buf[len].
1755 */
1756 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001757lrswapbuf(char_u *buf, int len)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001758{
1759 char_u *s, *e;
1760 int c;
1761
1762 s = buf;
1763 e = buf + len - 1;
1764
1765 while (e > s)
1766 {
1767 c = *s;
1768 *s = *e;
1769 *e = c;
1770 ++s;
1771 --e;
1772 }
1773}
1774
1775/*
1776 * swap all the characters in reverse direction
1777 */
1778 char_u *
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001779lrswap(char_u *ibuf)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001780{
1781 if (ibuf != NULL && *ibuf != NUL)
1782 lrswapbuf(ibuf, (int)STRLEN(ibuf));
1783 return ibuf;
1784}
1785
1786/*
1787 * swap all the Farsi characters in reverse direction
1788 */
1789 char_u *
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001790lrFswap(char_u *cmdbuf, int len)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001791{
1792 int i, cnt;
1793
1794 if (cmdbuf == NULL)
1795 return cmdbuf;
1796
1797 if (len == 0 && (len = (int)STRLEN(cmdbuf)) == 0)
1798 return cmdbuf;
1799
1800 for (i = 0; i < len; i++)
1801 {
1802 for (cnt = 0; i + cnt < len
1803 && (F_isalpha(cmdbuf[i + cnt])
1804 || F_isdigit(cmdbuf[i + cnt])
1805 || cmdbuf[i + cnt] == ' '); ++cnt)
1806 ;
1807
1808 lrswapbuf(cmdbuf + i, cnt);
1809 i += cnt;
1810 }
1811 return cmdbuf;
1812}
1813
1814/*
Bram Moolenaar8c8de832008-06-24 22:58:06 +00001815 * Reverse the characters in the search path and substitute section
1816 * accordingly.
1817 * TODO: handle different separator characters. Use skip_regexp().
Bram Moolenaar071d4272004-06-13 20:20:40 +00001818 */
1819 char_u *
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001820lrF_sub(char_u *ibuf)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001821{
1822 char_u *p, *ep;
1823 int i, cnt;
1824
1825 p = ibuf;
1826
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +00001827 /* Find the boundary of the search path */
Bram Moolenaar42332f52005-07-06 22:38:49 +00001828 while (((p = vim_strchr(p + 1, '/')) != NULL) && p[-1] == '\\')
Bram Moolenaar071d4272004-06-13 20:20:40 +00001829 ;
1830
1831 if (p == NULL)
1832 return ibuf;
1833
1834 /* Reverse the Farsi characters in the search path. */
1835 lrFswap(ibuf, (int)(p-ibuf));
1836
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +00001837 /* Now find the boundary of the substitute section */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001838 if ((ep = (char_u *)strrchr((char *)++p, '/')) != NULL)
1839 cnt = (int)(ep - p);
1840 else
1841 cnt = (int)STRLEN(p);
1842
1843 /* Reverse the characters in the substitute section and take care of '\' */
1844 for (i = 0; i < cnt-1; i++)
1845 if (p[i] == '\\')
1846 {
1847 p[i] = p[i+1] ;
1848 p[++i] = '\\';
1849 }
1850
1851 lrswapbuf(p, cnt);
1852
1853 return ibuf;
1854}
1855
1856/*
1857 * Map Farsi keyboard when in cmd_fkmap mode.
1858 */
1859 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001860cmdl_fkmap(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001861{
1862 int tempc;
1863
1864 switch (c)
1865 {
1866 case '0':
1867 case '1':
1868 case '2':
1869 case '3':
1870 case '4':
1871 case '5':
1872 case '6':
1873 case '7':
1874 case '8':
1875 case '9':
1876 case '`':
1877 case ' ':
1878 case '.':
1879 case '!':
1880 case '"':
1881 case '$':
1882 case '%':
1883 case '^':
1884 case '&':
1885 case '/':
1886 case '(':
1887 case ')':
1888 case '=':
1889 case '\\':
1890 case '?':
1891 case '+':
1892 case '-':
1893 case '_':
1894 case '*':
1895 case ':':
1896 case '#':
1897 case '~':
1898 case '@':
1899 case '<':
1900 case '>':
1901 case '{':
1902 case '}':
1903 case '|':
1904 case 'B':
1905 case 'E':
1906 case 'F':
1907 case 'H':
1908 case 'I':
1909 case 'K':
1910 case 'L':
1911 case 'M':
1912 case 'O':
1913 case 'P':
1914 case 'Q':
1915 case 'R':
1916 case 'T':
1917 case 'U':
1918 case 'W':
1919 case 'Y':
1920 case NL:
1921 case TAB:
1922
Bram Moolenaar80627cf2017-01-29 19:59:39 +01001923 switch ((tempc = cmd_gchar(AT_CURSOR)))
1924 {
1925 case _BE:
1926 case _PE:
1927 case _TE:
1928 case _SE:
1929 case _JIM:
1930 case _CHE:
1931 case _HE_J:
1932 case _XE:
1933 case _SIN:
1934 case _SHIN:
1935 case _SAD:
1936 case _ZAD:
1937 case _AYN:
1938 case _GHAYN:
1939 case _FE:
1940 case _GHAF:
1941 case _KAF:
1942 case _GAF:
1943 case _LAM:
1944 case _MIM:
1945 case _NOON:
1946 case _HE:
1947 case _HE_:
1948 cmd_pchar(toF_TyA(tempc), AT_CURSOR);
1949 break;
1950 case _AYN_:
1951 cmd_pchar(AYN_, AT_CURSOR);
1952 break;
1953 case _GHAYN_:
1954 cmd_pchar(GHAYN_, AT_CURSOR);
1955 break;
1956 case _IE:
1957 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
1958 cmd_pchar(IE_, AT_CURSOR);
1959 else
1960 cmd_pchar(IE, AT_CURSOR);
1961 break;
1962 case _YEE:
1963 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
1964 cmd_pchar(YEE_, AT_CURSOR);
1965 else
1966 cmd_pchar(YEE, AT_CURSOR);
1967 break;
1968 case _YE:
1969 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
1970 cmd_pchar(YE_, AT_CURSOR);
1971 else
1972 cmd_pchar(YE, AT_CURSOR);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001973 }
1974
1975 switch (c)
1976 {
1977 case '0': return FARSI_0;
1978 case '1': return FARSI_1;
1979 case '2': return FARSI_2;
1980 case '3': return FARSI_3;
1981 case '4': return FARSI_4;
1982 case '5': return FARSI_5;
1983 case '6': return FARSI_6;
1984 case '7': return FARSI_7;
1985 case '8': return FARSI_8;
1986 case '9': return FARSI_9;
1987 case 'B': return F_PSP;
1988 case 'E': return JAZR_N;
1989 case 'F': return ALEF_D_H;
1990 case 'H': return ALEF_A;
1991 case 'I': return TASH;
1992 case 'K': return F_LQUOT;
1993 case 'L': return F_RQUOT;
1994 case 'M': return HAMZE;
1995 case 'O': return '[';
1996 case 'P': return ']';
1997 case 'Q': return OO;
1998 case 'R': return MAD_N;
1999 case 'T': return OW;
2000 case 'U': return MAD;
2001 case 'W': return OW_OW;
2002 case 'Y': return JAZR;
2003 case '`': return F_PCN;
2004 case '!': return F_EXCL;
2005 case '@': return F_COMMA;
2006 case '#': return F_DIVIDE;
2007 case '$': return F_CURRENCY;
2008 case '%': return F_PERCENT;
2009 case '^': return F_MUL;
2010 case '&': return F_BCOMMA;
2011 case '*': return F_STAR;
2012 case '(': return F_LPARENT;
2013 case ')': return F_RPARENT;
2014 case '-': return F_MINUS;
2015 case '_': return F_UNDERLINE;
2016 case '=': return F_EQUALS;
2017 case '+': return F_PLUS;
2018 case '\\': return F_BSLASH;
2019 case '|': return F_PIPE;
2020 case ':': return F_DCOLON;
2021 case '"': return F_SEMICOLON;
2022 case '.': return F_PERIOD;
2023 case '/': return F_SLASH;
2024 case '<': return F_LESS;
2025 case '>': return F_GREATER;
2026 case '?': return F_QUESTION;
2027 case ' ': return F_BLANK;
2028 }
2029
2030 break;
2031
2032 case 'a': return _SHIN;
2033 case 'A': return WAW_H;
2034 case 'b': return ZAL;
2035 case 'c': return ZE;
2036 case 'C': return JE;
2037 case 'd': return _YE;
2038 case 'D': return _YEE;
2039 case 'e': return _SE;
2040 case 'f': return _BE;
2041 case 'g': return _LAM;
2042 case 'G':
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002043 if (cmd_gchar(AT_CURSOR) == _LAM)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002044 {
2045 cmd_pchar(LAM, AT_CURSOR);
2046 return ALEF_U_H;
2047 }
2048
2049 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2050 return ALEF_U_H_;
2051 else
2052 return ALEF_U_H;
2053 case 'h':
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002054 if (cmd_gchar(AT_CURSOR) == _LAM)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002055 {
2056 cmd_pchar(LA, AT_CURSOR);
2057 redrawcmdline();
2058 return K_IGNORE;
2059 }
2060
2061 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2062 return ALEF_;
2063 else
2064 return ALEF;
2065 case 'i':
2066 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2067 return _HE_;
2068 else
2069 return _HE;
2070 case 'j': return _TE;
2071 case 'J':
2072 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2073 return TEE_;
2074 else
2075 return TEE;
2076 case 'k': return _NOON;
2077 case 'l': return _MIM;
2078 case 'm': return _PE;
2079 case 'n':
2080 case 'N': return DAL;
2081 case 'o': return _XE;
2082 case 'p': return _HE_J;
2083 case 'q': return _ZAD;
2084 case 'r': return _GHAF;
2085 case 's': return _SIN;
2086 case 'S': return _IE;
2087 case 't': return _FE;
2088 case 'u':
2089 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2090 return _AYN_;
2091 else
2092 return _AYN;
2093 case 'v':
2094 case 'V': return RE;
2095 case 'w': return _SAD;
2096 case 'x':
2097 case 'X': return _TA;
2098 case 'y':
2099 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2100 return _GHAYN_;
2101 else
2102 return _GHAYN;
2103 case 'z':
2104 case 'Z': return _ZA;
2105 case ';': return _KAF;
2106 case '\'': return _GAF;
2107 case ',': return WAW;
2108 case '[': return _JIM;
2109 case ']': return _CHE;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002110 }
Bram Moolenaar071d4272004-06-13 20:20:40 +00002111
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002112 return c;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002113}
2114
2115/*
2116 * F_isalpha returns TRUE if 'c' is a Farsi alphabet
2117 */
2118 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01002119F_isalpha(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002120{
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002121 return ((c >= TEE_ && c <= _YE)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002122 || (c >= ALEF_A && c <= YE)
2123 || (c >= _IE && c <= YE_));
2124}
2125
2126/*
2127 * F_isdigit returns TRUE if 'c' is a Farsi digit
2128 */
2129 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01002130F_isdigit(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002131{
2132 return (c >= FARSI_0 && c <= FARSI_9);
2133}
2134
2135/*
2136 * F_ischar returns TRUE if 'c' is a Farsi character.
2137 */
2138 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01002139F_ischar(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002140{
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002141 return (c >= TEE_ && c <= YE_);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002142}
2143
2144 void
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002145farsi_f8(cmdarg_T *cap UNUSED)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002146{
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002147 if (p_altkeymap)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002148 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002149 if (curwin->w_farsi & W_R_L)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002150 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002151 p_fkmap = 0;
2152 do_cmdline_cmd((char_u *)"set norl");
Bram Moolenaar32526b32019-01-19 17:43:09 +01002153 msg("");
Bram Moolenaar071d4272004-06-13 20:20:40 +00002154 }
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002155 else
2156 {
2157 p_fkmap = 1;
2158 do_cmdline_cmd((char_u *)"set rl");
Bram Moolenaar32526b32019-01-19 17:43:09 +01002159 msg("");
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002160 }
2161
2162 curwin->w_farsi = curwin->w_farsi ^ W_R_L;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002163 }
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002164}
Bram Moolenaar071d4272004-06-13 20:20:40 +00002165
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002166 void
2167farsi_f9(cmdarg_T *cap UNUSED)
2168{
2169 if (p_altkeymap && curwin->w_p_rl)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002170 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002171 curwin->w_farsi = curwin->w_farsi ^ W_CONV;
2172 if (curwin->w_farsi & W_CONV)
2173 conv_to_pvim();
2174 else
2175 conv_to_pstd();
Bram Moolenaar071d4272004-06-13 20:20:40 +00002176 }
2177}
Bram Moolenaar75464dc2016-07-02 20:27:50 +02002178
2179#endif /* FEAT_FKMAP */