blob: b082829220b597eb3db27aa8caf1d15d43c9832a [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001/* vi:set ts=8 sts=4 sw=4:
2 *
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
12 *
13 * Included by main.c, when FEAT_FKMAP is defined.
14 */
15
Bram Moolenaard25c16e2016-01-29 22:13:30 +010016static int toF_Xor_X_(int c);
17static int F_is_TyE(int c);
18static int F_is_TyC_TyD(int c);
19static int F_is_TyB_TyC_TyD(int src, int offset);
20static int toF_TyB(int c);
21static void put_curr_and_l_to_X(int c);
22static void put_and_redo(int c);
23static void chg_c_toX_orX(void);
24static void chg_c_to_X_orX_(void);
25static void chg_c_to_X_or_X(void);
26static void chg_l_to_X_orX_(void);
27static void chg_l_toXor_X(void);
28static void chg_r_to_Xor_X_(void);
29static int toF_leading(int c);
30static int toF_Rjoin(int c);
31static int canF_Ljoin(int c);
32static int canF_Rjoin(int c);
33static int F_isterm(int c);
34static int toF_ending(int c);
35static void lrswapbuf(char_u *buf, int len);
Bram Moolenaar071d4272004-06-13 20:20:40 +000036
37/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +020038 * Convert the given Farsi character into a _X or _X_ type
Bram Moolenaar071d4272004-06-13 20:20:40 +000039*/
40 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +010041toF_Xor_X_(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +000042{
43 int tempc;
44
45 switch (c)
46 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +020047 case BE: return _BE;
48 case PE: return _PE;
49 case TE: return _TE;
50 case SE: return _SE;
51 case JIM: return _JIM;
52 case CHE: return _CHE;
53 case HE_J: return _HE_J;
54 case XE: return _XE;
55 case SIN: return _SIN;
56 case SHIN: return _SHIN;
57 case SAD: return _SAD;
58 case ZAD: return _ZAD;
59 case AYN: return _AYN;
60 case AYN_: return _AYN_;
61 case GHAYN: return _GHAYN;
62 case GHAYN_: return _GHAYN_;
63 case FE: return _FE;
64 case GHAF: return _GHAF;
65 case KAF: return _KAF;
66 case GAF: return _GAF;
67 case LAM: return _LAM;
68 case MIM: return _MIM;
69 case NOON: return _NOON;
Bram Moolenaar071d4272004-06-13 20:20:40 +000070 case YE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +020071 case YE_: return _YE;
Bram Moolenaar071d4272004-06-13 20:20:40 +000072 case YEE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +020073 case YEE_: return _YEE;
Bram Moolenaar071d4272004-06-13 20:20:40 +000074 case IE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +020075 case IE_: return _IE;
Bram Moolenaar071d4272004-06-13 20:20:40 +000076 case F_HE:
77 tempc = _HE;
78
Bram Moolenaaraf0167f2009-05-16 15:31:32 +000079 if (p_ri && (curwin->w_cursor.col + 1
80 < (colnr_T)STRLEN(ml_get_curline())))
Bram Moolenaar071d4272004-06-13 20:20:40 +000081 {
82 inc_cursor();
83
84 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
85 tempc = _HE_;
86
87 dec_cursor();
88 }
89 if (!p_ri && STRLEN(ml_get_curline()))
90 {
91 dec_cursor();
92
93 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
94 tempc = _HE_;
95
96 inc_cursor();
97 }
98
99 return tempc;
100 }
101 return 0;
102}
103
104/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200105 * Convert the given Farsi character into Farsi capital character.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000106*/
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200107 static int
108toF_TyA(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109{
110 switch (c)
111 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200112 case ALEF_: return ALEF;
113 case ALEF_U_H_: return ALEF_U_H;
114 case _BE: return BE;
115 case _PE: return PE;
116 case _TE: return TE;
117 case _SE: return SE;
118 case _JIM: return JIM;
119 case _CHE: return CHE;
120 case _HE_J: return HE_J;
121 case _XE: return XE;
122 case _SIN: return SIN;
123 case _SHIN: return SHIN;
124 case _SAD: return SAD;
125 case _ZAD: return ZAD;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000126 case _AYN:
127 case AYN_:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200128 case _AYN_: return AYN;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000129 case _GHAYN:
130 case GHAYN_:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200131 case _GHAYN_: return GHAYN;
132 case _FE: return FE;
133 case _GHAF: return GHAF;
134 /* I am not sure what it is !!! case _KAF_H: */
135 case _KAF: return KAF;
136 case _GAF: return GAF;
137 case _LAM: return LAM;
138 case _MIM: return MIM;
139 case _NOON: return NOON;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000140 case _YE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200141 case YE_: return YE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142 case _YEE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200143 case YEE_: return YEE;
144 case TEE_: return TEE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000145 case _IE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200146 case IE_: return IE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000147 case _HE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200148 case _HE_: return F_HE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000149 }
150 return c;
151}
152
153/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200154 * Is the character under the cursor+offset in the given buffer a join type.
155 * That is a character that is combined with the others.
156 * Note: the offset is used only for command line buffer.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000157*/
158 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100159F_is_TyB_TyC_TyD(int src, int offset)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160{
161 int c;
162
163 if (src == SRC_EDT)
164 c = gchar_cursor();
165 else
166 c = cmd_gchar(AT_CURSOR+offset);
167
168 switch (c)
169 {
170 case _LAM:
171 case _BE:
172 case _PE:
173 case _TE:
174 case _SE:
175 case _JIM:
176 case _CHE:
177 case _HE_J:
178 case _XE:
179 case _SIN:
180 case _SHIN:
181 case _SAD:
182 case _ZAD:
183 case _TA:
184 case _ZA:
185 case _AYN:
186 case _AYN_:
187 case _GHAYN:
188 case _GHAYN_:
189 case _FE:
190 case _GHAF:
191 case _KAF:
192 case _KAF_H:
193 case _GAF:
194 case _MIM:
195 case _NOON:
196 case _YE:
197 case _YEE:
198 case _IE:
199 case _HE_:
200 case _HE:
201 return TRUE;
202 }
203 return FALSE;
204}
205
206/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200207 * Is the Farsi character one of the terminating only type.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000208*/
209 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100210F_is_TyE(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211{
212 switch (c)
213 {
214 case ALEF_A:
215 case ALEF_D_H:
216 case DAL:
217 case ZAL:
218 case RE:
219 case ZE:
220 case JE:
221 case WAW:
222 case WAW_H:
223 case HAMZE:
224 return TRUE;
225 }
226 return FALSE;
227}
228
229/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200230 * Is the Farsi character one of the none leading type.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000231*/
232 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100233F_is_TyC_TyD(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000234{
235 switch (c)
236 {
237 case ALEF_:
238 case ALEF_U_H_:
239 case _AYN_:
240 case AYN_:
241 case _GHAYN_:
242 case GHAYN_:
243 case _HE_:
244 case YE_:
245 case IE_:
246 case TEE_:
247 case YEE_:
248 return TRUE;
249 }
250 return FALSE;
251}
252
253/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200254 * Convert a none leading Farsi char into a leading type.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000255*/
256 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100257toF_TyB(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258{
259 switch (c)
260 {
261 case ALEF_: return ALEF;
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200262 case ALEF_U_H_: return ALEF_U_H;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000263 case _AYN_: return _AYN;
264 case AYN_: return AYN; /* exception - there are many of them */
265 case _GHAYN_: return _GHAYN;
266 case GHAYN_: return GHAYN; /* exception - there are many of them */
267 case _HE_: return _HE;
268 case YE_: return YE;
269 case IE_: return IE;
270 case TEE_: return TEE;
271 case YEE_: return YEE;
272 }
273 return c;
274}
275
276/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200277 * Overwrite the current redo and cursor characters + left adjust.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000278*/
279 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100280put_curr_and_l_to_X(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000281{
282 int tempc;
283
284 if (curwin->w_p_rl && p_ri)
285 return;
286
Bram Moolenaaraf0167f2009-05-16 15:31:32 +0000287 if ((curwin->w_cursor.col < (colnr_T)STRLEN(ml_get_curline())))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288 {
289 if ((p_ri && curwin->w_cursor.col) || !p_ri)
290 {
291 if (p_ri)
292 dec_cursor();
293 else
294 inc_cursor();
295
296 if (F_is_TyC_TyD((tempc = gchar_cursor())))
297 {
298 pchar_cursor(toF_TyB(tempc));
299 AppendCharToRedobuff(K_BS);
300 AppendCharToRedobuff(tempc);
301 }
302
303 if (p_ri)
304 inc_cursor();
305 else
306 dec_cursor();
307 }
308 }
309
310 put_and_redo(c);
311}
312
313 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100314put_and_redo(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315{
316 pchar_cursor(c);
317 AppendCharToRedobuff(K_BS);
318 AppendCharToRedobuff(c);
319}
320
321/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200322 * Change the char. under the cursor to a X_ or X type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323*/
324 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100325chg_c_toX_orX(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000326{
327 int tempc, curc;
328
329 switch ((curc = gchar_cursor()))
330 {
331 case _BE:
332 tempc = BE;
333 break;
334 case _PE:
335 tempc = PE;
336 break;
337 case _TE:
338 tempc = TE;
339 break;
340 case _SE:
341 tempc = SE;
342 break;
343 case _JIM:
344 tempc = JIM;
345 break;
346 case _CHE:
347 tempc = CHE;
348 break;
349 case _HE_J:
350 tempc = HE_J;
351 break;
352 case _XE:
353 tempc = XE;
354 break;
355 case _SIN:
356 tempc = SIN;
357 break;
358 case _SHIN:
359 tempc = SHIN;
360 break;
361 case _SAD:
362 tempc = SAD;
363 break;
364 case _ZAD:
365 tempc = ZAD;
366 break;
367 case _FE:
368 tempc = FE;
369 break;
370 case _GHAF:
371 tempc = GHAF;
372 break;
373 case _KAF_H:
374 case _KAF:
375 tempc = KAF;
376 break;
377 case _GAF:
378 tempc = GAF;
379 break;
380 case _AYN:
381 tempc = AYN;
382 break;
383 case _AYN_:
384 tempc = AYN_;
385 break;
386 case _GHAYN:
387 tempc = GHAYN;
388 break;
389 case _GHAYN_:
390 tempc = GHAYN_;
391 break;
392 case _LAM:
393 tempc = LAM;
394 break;
395 case _MIM:
396 tempc = MIM;
397 break;
398 case _NOON:
399 tempc = NOON;
400 break;
401 case _HE:
402 case _HE_:
403 tempc = F_HE;
404 break;
405 case _YE:
406 case _IE:
407 case _YEE:
408 if (p_ri)
409 {
410 inc_cursor();
411 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
412 tempc = (curc == _YE ? YE_ :
413 (curc == _IE ? IE_ : YEE_));
414 else
415 tempc = (curc == _YE ? YE :
416 (curc == _IE ? IE : YEE));
417 dec_cursor();
418 }
419 else
420 {
421 if (curwin->w_cursor.col)
422 {
423 dec_cursor();
424 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
425 tempc = (curc == _YE ? YE_ :
426 (curc == _IE ? IE_ : YEE_));
427 else
428 tempc = (curc == _YE ? YE :
429 (curc == _IE ? IE : YEE));
430 inc_cursor();
431 }
432 else
433 tempc = (curc == _YE ? YE :
434 (curc == _IE ? IE : YEE));
435 }
436 break;
437 default:
438 tempc = 0;
439 }
440
441 if (tempc)
442 put_and_redo(tempc);
443}
444
445/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200446 * Change the char. under the cursor to a _X_ or X_ type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000447*/
448
449 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100450chg_c_to_X_orX_(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000451{
452 int tempc;
453
454 switch (gchar_cursor())
455 {
456 case ALEF:
457 tempc = ALEF_;
458 break;
459 case ALEF_U_H:
460 tempc = ALEF_U_H_;
461 break;
462 case _AYN:
463 tempc = _AYN_;
464 break;
465 case AYN:
466 tempc = AYN_;
467 break;
468 case _GHAYN:
469 tempc = _GHAYN_;
470 break;
471 case GHAYN:
472 tempc = GHAYN_;
473 break;
474 case _HE:
475 tempc = _HE_;
476 break;
477 case YE:
478 tempc = YE_;
479 break;
480 case IE:
481 tempc = IE_;
482 break;
483 case TEE:
484 tempc = TEE_;
485 break;
486 case YEE:
487 tempc = YEE_;
488 break;
489 default:
490 tempc = 0;
491 }
492
493 if (tempc)
494 put_and_redo(tempc);
495}
496
497/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200498 * Change the char. under the cursor to a _X_ or _X type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000499*/
500 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100501chg_c_to_X_or_X (void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000502{
503 int tempc;
504
505 tempc = gchar_cursor();
506
Bram Moolenaaraf0167f2009-05-16 15:31:32 +0000507 if (curwin->w_cursor.col + 1 < (colnr_T)STRLEN(ml_get_curline()))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000508 {
509 inc_cursor();
510
511 if ((tempc == F_HE) && (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)))
512 {
513 tempc = _HE_;
514
515 dec_cursor();
516
517 put_and_redo(tempc);
518 return;
519 }
520
521 dec_cursor();
522 }
523
524 if ((tempc = toF_Xor_X_(tempc)) != 0)
525 put_and_redo(tempc);
526}
527
528/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200529 * Change the character left to the cursor to a _X_ or X_ type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000530*/
531 static void
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200532chg_l_to_X_orX_(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000533{
534 int tempc;
535
Bram Moolenaaraf0167f2009-05-16 15:31:32 +0000536 if (curwin->w_cursor.col != 0 &&
537 (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000538 return;
539
540 if (!curwin->w_cursor.col && p_ri)
541 return;
542
543 if (p_ri)
544 dec_cursor();
545 else
546 inc_cursor();
547
548 switch (gchar_cursor())
549 {
550 case ALEF:
551 tempc = ALEF_;
552 break;
553 case ALEF_U_H:
554 tempc = ALEF_U_H_;
555 break;
556 case _AYN:
557 tempc = _AYN_;
558 break;
559 case AYN:
560 tempc = AYN_;
561 break;
562 case _GHAYN:
563 tempc = _GHAYN_;
564 break;
565 case GHAYN:
566 tempc = GHAYN_;
567 break;
568 case _HE:
569 tempc = _HE_;
570 break;
571 case YE:
572 tempc = YE_;
573 break;
574 case IE:
575 tempc = IE_;
576 break;
577 case TEE:
578 tempc = TEE_;
579 break;
580 case YEE:
581 tempc = YEE_;
582 break;
583 default:
584 tempc = 0;
585 }
586
587 if (tempc)
588 put_and_redo(tempc);
589
590 if (p_ri)
591 inc_cursor();
592 else
593 dec_cursor();
594}
595
596/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200597 * Change the character left to the cursor to a X or _X type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000598*/
599
600 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100601chg_l_toXor_X (void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000602{
603 int tempc;
604
Bram Moolenaaraf0167f2009-05-16 15:31:32 +0000605 if (curwin->w_cursor.col != 0 &&
606 (curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000607 return;
608
609 if (!curwin->w_cursor.col && p_ri)
610 return;
611
612 if (p_ri)
613 dec_cursor();
614 else
615 inc_cursor();
616
617 switch (gchar_cursor())
618 {
619 case ALEF_:
620 tempc = ALEF;
621 break;
622 case ALEF_U_H_:
623 tempc = ALEF_U_H;
624 break;
625 case _AYN_:
626 tempc = _AYN;
627 break;
628 case AYN_:
629 tempc = AYN;
630 break;
631 case _GHAYN_:
632 tempc = _GHAYN;
633 break;
634 case GHAYN_:
635 tempc = GHAYN;
636 break;
637 case _HE_:
638 tempc = _HE;
639 break;
640 case YE_:
641 tempc = YE;
642 break;
643 case IE_:
644 tempc = IE;
645 break;
646 case TEE_:
647 tempc = TEE;
648 break;
649 case YEE_:
650 tempc = YEE;
651 break;
652 default:
653 tempc = 0;
654 }
655
656 if (tempc)
657 put_and_redo(tempc);
658
659 if (p_ri)
660 inc_cursor();
661 else
662 dec_cursor();
663}
664
665/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200666 * Change the character right to the cursor to a _X or _X_ type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000667*/
668
669 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100670chg_r_to_Xor_X_(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000671{
672 int tempc, c;
673
674 if (curwin->w_cursor.col)
675 {
676 if (!p_ri)
677 dec_cursor();
678
679 tempc = gchar_cursor();
680
681 if ((c = toF_Xor_X_(tempc)) != 0)
682 put_and_redo(c);
683
684 if (!p_ri)
685 inc_cursor();
686
687 }
688}
689
690/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200691 * Map Farsi keyboard when in fkmap mode.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000692*/
693
694 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +0100695fkmap(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000696{
697 int tempc;
698 static int revins;
699
700 if (IS_SPECIAL(c))
701 return c;
702
703 if (VIM_ISDIGIT(c) || ((c == '.' || c == '+' || c == '-' ||
704 c == '^' || c == '%' || c == '#' || c == '=') && revins))
705 {
706 if (!revins)
707 {
708 if (curwin->w_cursor.col)
709 {
710 if (!p_ri)
711 dec_cursor();
712
Bram Moolenaar68c85fc2016-02-24 12:57:50 +0100713 chg_c_toX_orX ();
714 chg_l_toXor_X ();
Bram Moolenaar071d4272004-06-13 20:20:40 +0000715
716 if (!p_ri)
717 inc_cursor();
718 }
719 }
720
721 arrow_used = TRUE;
722 (void)stop_arrow();
723
724 if (!curwin->w_p_rl && revins)
725 inc_cursor();
726
727 ++revins;
728 p_ri=1;
729 }
730 else
731 {
732 if (revins)
733 {
734 arrow_used = TRUE;
735 (void)stop_arrow();
736
737 revins = 0;
738 if (curwin->w_p_rl)
739 {
740 while ((F_isdigit(gchar_cursor())
741 || (gchar_cursor() == F_PERIOD
742 || gchar_cursor() == F_PLUS
743 || gchar_cursor() == F_MINUS
744 || gchar_cursor() == F_MUL
745 || gchar_cursor() == F_DIVIDE
746 || gchar_cursor() == F_PERCENT
747 || gchar_cursor() == F_EQUALS))
748 && gchar_cursor() != NUL)
749 ++curwin->w_cursor.col;
750 }
751 else
752 {
753 if (curwin->w_cursor.col)
754 while ((F_isdigit(gchar_cursor())
755 || (gchar_cursor() == F_PERIOD
756 || gchar_cursor() == F_PLUS
757 || gchar_cursor() == F_MINUS
758 || gchar_cursor() == F_MUL
759 || gchar_cursor() == F_DIVIDE
760 || gchar_cursor() == F_PERCENT
761 || gchar_cursor() == F_EQUALS))
762 && --curwin->w_cursor.col)
763 ;
764
765 if (!F_isdigit(gchar_cursor()))
766 ++curwin->w_cursor.col;
767 }
768 }
769 }
770
771 if (!revins)
772 {
773 if (curwin->w_p_rl)
774 p_ri=0;
775 if (!curwin->w_p_rl)
776 p_ri=1;
777 }
778
779 if ((c < 0x100) && (isalpha(c) || c == '&' || c == '^' || c == ';' ||
780 c == '\''|| c == ',' || c == '[' ||
781 c == ']' || c == '{' || c == '}' ))
782 chg_r_to_Xor_X_();
783
784 tempc = 0;
785
786 switch (c)
787 {
788 case '`':
789 case ' ':
790 case '.':
791 case '!':
792 case '"':
793 case '$':
794 case '%':
795 case '^':
796 case '&':
797 case '/':
798 case '(':
799 case ')':
800 case '=':
801 case '\\':
802 case '?':
803 case '+':
804 case '-':
805 case '_':
806 case '*':
807 case ':':
808 case '#':
809 case '~':
810 case '@':
811 case '<':
812 case '>':
813 case '{':
814 case '}':
815 case '|':
816 case '0':
817 case '1':
818 case '2':
819 case '3':
820 case '4':
821 case '5':
822 case '6':
823 case '7':
824 case '8':
825 case '9':
826 case 'B':
827 case 'E':
828 case 'F':
829 case 'H':
830 case 'I':
831 case 'K':
832 case 'L':
833 case 'M':
834 case 'O':
835 case 'P':
836 case 'Q':
837 case 'R':
838 case 'T':
839 case 'U':
840 case 'W':
841 case 'Y':
842 case NL:
843 case TAB:
844
845 if (p_ri && c == NL && curwin->w_cursor.col)
846 {
847 /*
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200848 * If the char before the cursor is _X_ or X_ do not change
849 * the one under the cursor with X type.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000850 */
851
852 dec_cursor();
853
854 if (F_isalpha(gchar_cursor()))
855 {
856 inc_cursor();
857 return NL;
858 }
859
860 inc_cursor();
861 }
862
Bram Moolenaaree2615a2016-07-02 18:25:34 +0200863 if (!p_ri && !curwin->w_cursor.col)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000864 {
865 switch (c)
866 {
867 case '0': return FARSI_0;
868 case '1': return FARSI_1;
869 case '2': return FARSI_2;
870 case '3': return FARSI_3;
871 case '4': return FARSI_4;
872 case '5': return FARSI_5;
873 case '6': return FARSI_6;
874 case '7': return FARSI_7;
875 case '8': return FARSI_8;
876 case '9': return FARSI_9;
877 case 'B': return F_PSP;
878 case 'E': return JAZR_N;
879 case 'F': return ALEF_D_H;
880 case 'H': return ALEF_A;
881 case 'I': return TASH;
882 case 'K': return F_LQUOT;
883 case 'L': return F_RQUOT;
884 case 'M': return HAMZE;
885 case 'O': return '[';
886 case 'P': return ']';
887 case 'Q': return OO;
888 case 'R': return MAD_N;
889 case 'T': return OW;
890 case 'U': return MAD;
891 case 'W': return OW_OW;
892 case 'Y': return JAZR;
893 case '`': return F_PCN;
894 case '!': return F_EXCL;
895 case '@': return F_COMMA;
896 case '#': return F_DIVIDE;
897 case '$': return F_CURRENCY;
898 case '%': return F_PERCENT;
899 case '^': return F_MUL;
900 case '&': return F_BCOMMA;
901 case '*': return F_STAR;
902 case '(': return F_LPARENT;
903 case ')': return F_RPARENT;
904 case '-': return F_MINUS;
905 case '_': return F_UNDERLINE;
906 case '=': return F_EQUALS;
907 case '+': return F_PLUS;
908 case '\\': return F_BSLASH;
909 case '|': return F_PIPE;
910 case ':': return F_DCOLON;
911 case '"': return F_SEMICOLON;
912 case '.': return F_PERIOD;
913 case '/': return F_SLASH;
914 case '<': return F_LESS;
915 case '>': return F_GREATER;
916 case '?': return F_QUESTION;
917 case ' ': return F_BLANK;
918 }
919 break;
920 }
921 if (!p_ri)
922 dec_cursor();
923
924 switch ((tempc = gchar_cursor()))
925 {
926 case _BE:
927 case _PE:
928 case _TE:
929 case _SE:
930 case _JIM:
931 case _CHE:
932 case _HE_J:
933 case _XE:
934 case _SIN:
935 case _SHIN:
936 case _SAD:
937 case _ZAD:
938 case _FE:
939 case _GHAF:
940 case _KAF:
941 case _KAF_H:
942 case _GAF:
943 case _LAM:
944 case _MIM:
945 case _NOON:
946 case _HE:
947 case _HE_:
948 case _TA:
949 case _ZA:
950 put_curr_and_l_to_X(toF_TyA(tempc));
951 break;
952 case _AYN:
953 case _AYN_:
954
955 if (!p_ri)
956 if (!curwin->w_cursor.col)
957 {
958 put_curr_and_l_to_X(AYN);
959 break;
960 }
961
962 if (p_ri)
963 inc_cursor();
964 else
965 dec_cursor();
966
967 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
968 tempc = AYN_;
969 else
970 tempc = AYN;
971
972 if (p_ri)
973 dec_cursor();
974 else
975 inc_cursor();
976
977 put_curr_and_l_to_X(tempc);
978
979 break;
980 case _GHAYN:
981 case _GHAYN_:
982
983 if (!p_ri)
984 if (!curwin->w_cursor.col)
985 {
986 put_curr_and_l_to_X(GHAYN);
987 break;
988 }
989
990 if (p_ri)
991 inc_cursor();
992 else
993 dec_cursor();
994
995 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
996 tempc = GHAYN_;
997 else
998 tempc = GHAYN;
999
1000 if (p_ri)
1001 dec_cursor();
1002 else
1003 inc_cursor();
1004
1005 put_curr_and_l_to_X(tempc);
1006 break;
1007 case _YE:
1008 case _IE:
1009 case _YEE:
1010 if (!p_ri)
1011 if (!curwin->w_cursor.col)
1012 {
1013 put_curr_and_l_to_X((tempc == _YE ? YE :
1014 (tempc == _IE ? IE : YEE)));
1015 break;
1016 }
1017
1018 if (p_ri)
1019 inc_cursor();
1020 else
1021 dec_cursor();
1022
1023 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1024 tempc = (tempc == _YE ? YE_ :
1025 (tempc == _IE ? IE_ : YEE_));
1026 else
1027 tempc = (tempc == _YE ? YE :
1028 (tempc == _IE ? IE : YEE));
1029
1030 if (p_ri)
1031 dec_cursor();
1032 else
1033 inc_cursor();
1034
1035 put_curr_and_l_to_X(tempc);
1036 break;
1037 }
1038
1039 if (!p_ri)
1040 inc_cursor();
1041
1042 tempc = 0;
1043
1044 switch (c)
1045 {
1046 case '0': return FARSI_0;
1047 case '1': return FARSI_1;
1048 case '2': return FARSI_2;
1049 case '3': return FARSI_3;
1050 case '4': return FARSI_4;
1051 case '5': return FARSI_5;
1052 case '6': return FARSI_6;
1053 case '7': return FARSI_7;
1054 case '8': return FARSI_8;
1055 case '9': return FARSI_9;
1056 case 'B': return F_PSP;
1057 case 'E': return JAZR_N;
1058 case 'F': return ALEF_D_H;
1059 case 'H': return ALEF_A;
1060 case 'I': return TASH;
1061 case 'K': return F_LQUOT;
1062 case 'L': return F_RQUOT;
1063 case 'M': return HAMZE;
1064 case 'O': return '[';
1065 case 'P': return ']';
1066 case 'Q': return OO;
1067 case 'R': return MAD_N;
1068 case 'T': return OW;
1069 case 'U': return MAD;
1070 case 'W': return OW_OW;
1071 case 'Y': return JAZR;
1072 case '`': return F_PCN;
1073 case '!': return F_EXCL;
1074 case '@': return F_COMMA;
1075 case '#': return F_DIVIDE;
1076 case '$': return F_CURRENCY;
1077 case '%': return F_PERCENT;
1078 case '^': return F_MUL;
1079 case '&': return F_BCOMMA;
1080 case '*': return F_STAR;
1081 case '(': return F_LPARENT;
1082 case ')': return F_RPARENT;
1083 case '-': return F_MINUS;
1084 case '_': return F_UNDERLINE;
1085 case '=': return F_EQUALS;
1086 case '+': return F_PLUS;
1087 case '\\': return F_BSLASH;
1088 case '|': return F_PIPE;
1089 case ':': return F_DCOLON;
1090 case '"': return F_SEMICOLON;
1091 case '.': return F_PERIOD;
1092 case '/': return F_SLASH;
1093 case '<': return F_LESS;
1094 case '>': return F_GREATER;
1095 case '?': return F_QUESTION;
1096 case ' ': return F_BLANK;
1097 }
1098 break;
1099
1100 case 'a':
1101 tempc = _SHIN;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001102 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001103 case 'A':
1104 tempc = WAW_H;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001105 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001106 case 'b':
1107 tempc = ZAL;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001108 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001109 case 'c':
1110 tempc = ZE;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001111 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001112 case 'C':
1113 tempc = JE;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001114 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001115 case 'd':
1116 tempc = _YE;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001117 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001118 case 'D':
1119 tempc = _YEE;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001120 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001121 case 'e':
1122 tempc = _SE;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001123 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001124 case 'f':
1125 tempc = _BE;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001126 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001127 case 'g':
1128 tempc = _LAM;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001129 break;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001130 case 'G':
1131 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001132 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001133
1134 if (gchar_cursor() == _LAM)
1135 chg_c_toX_orX ();
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001136 else if (p_ri)
1137 chg_c_to_X_or_X ();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001138 }
1139
1140 if (!p_ri)
1141 if (!curwin->w_cursor.col)
1142 return ALEF_U_H;
1143
1144 if (!p_ri)
1145 dec_cursor();
1146
1147 if (gchar_cursor() == _LAM)
1148 {
1149 chg_c_toX_orX ();
1150 chg_l_toXor_X ();
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001151 tempc = ALEF_U_H;
1152 }
1153 else if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1154 {
1155 tempc = ALEF_U_H_;
1156 chg_l_toXor_X ();
Bram Moolenaar071d4272004-06-13 20:20:40 +00001157 }
1158 else
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001159 tempc = ALEF_U_H;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001160
1161 if (!p_ri)
1162 inc_cursor();
1163
1164 return tempc;
1165 case 'h':
1166 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
1167 {
1168 if (p_ri)
1169 chg_c_to_X_or_X ();
1170
1171 }
1172
1173 if (!p_ri)
1174 if (!curwin->w_cursor.col)
1175 return ALEF;
1176
1177 if (!p_ri)
1178 dec_cursor();
1179
1180 if (gchar_cursor() == _LAM)
1181 {
1182 chg_l_toXor_X();
1183 del_char(FALSE);
1184 AppendCharToRedobuff(K_BS);
1185
1186 if (!p_ri)
1187 dec_cursor();
1188
Bram Moolenaar68c85fc2016-02-24 12:57:50 +01001189 tempc = LA;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001190 }
1191 else
1192 {
1193 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1194 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001195 tempc = ALEF_;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001196 chg_l_toXor_X ();
1197 }
1198 else
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001199 tempc = ALEF;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001200 }
1201
1202 if (!p_ri)
1203 inc_cursor();
1204
1205 return tempc;
1206 case 'i':
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001207 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
1208 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001209 if (!p_ri && !F_is_TyE(tempc))
1210 chg_c_to_X_orX_ ();
1211 if (p_ri)
1212 chg_c_to_X_or_X ();
1213
1214 }
1215
1216 if (!p_ri && !curwin->w_cursor.col)
1217 return _HE;
1218
1219 if (!p_ri)
1220 dec_cursor();
1221
1222 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001223 tempc = _HE_;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001224 else
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001225 tempc = _HE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001226
1227 if (!p_ri)
1228 inc_cursor();
1229 break;
1230 case 'j':
1231 tempc = _TE;
1232 break;
1233 case 'J':
1234 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001235 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001236 if (p_ri)
1237 chg_c_to_X_or_X ();
1238
1239 }
1240
1241 if (!p_ri)
1242 if (!curwin->w_cursor.col)
1243 return TEE;
1244
1245 if (!p_ri)
1246 dec_cursor();
1247
1248 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1249 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001250 tempc = TEE_;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001251 chg_l_toXor_X ();
1252 }
1253 else
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001254 tempc = TEE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001255
1256 if (!p_ri)
1257 inc_cursor();
1258
1259 return tempc;
1260 case 'k':
1261 tempc = _NOON;
1262 break;
1263 case 'l':
1264 tempc = _MIM;
1265 break;
1266 case 'm':
1267 tempc = _PE;
1268 break;
1269 case 'n':
1270 case 'N':
1271 tempc = DAL;
1272 break;
1273 case 'o':
1274 tempc = _XE;
1275 break;
1276 case 'p':
1277 tempc = _HE_J;
1278 break;
1279 case 'q':
1280 tempc = _ZAD;
1281 break;
1282 case 'r':
1283 tempc = _GHAF;
1284 break;
1285 case 's':
1286 tempc = _SIN;
1287 break;
1288 case 'S':
1289 tempc = _IE;
1290 break;
1291 case 't':
1292 tempc = _FE;
1293 break;
1294 case 'u':
1295 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
1296 {
1297 if (!p_ri && !F_is_TyE(tempc))
1298 chg_c_to_X_orX_ ();
1299 if (p_ri)
1300 chg_c_to_X_or_X ();
1301
1302 }
1303
1304 if (!p_ri && !curwin->w_cursor.col)
1305 return _AYN;
1306
1307 if (!p_ri)
1308 dec_cursor();
1309
1310 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1311 tempc = _AYN_;
1312 else
1313 tempc = _AYN;
1314
1315 if (!p_ri)
1316 inc_cursor();
1317 break;
1318 case 'v':
1319 case 'V':
1320 tempc = RE;
1321 break;
1322 case 'w':
1323 tempc = _SAD;
1324 break;
1325 case 'x':
1326 case 'X':
1327 tempc = _TA;
1328 break;
1329 case 'y':
1330 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001331 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001332 if (!p_ri && !F_is_TyE(tempc))
1333 chg_c_to_X_orX_ ();
1334 if (p_ri)
1335 chg_c_to_X_or_X ();
1336
1337 }
1338
1339 if (!p_ri && !curwin->w_cursor.col)
1340 return _GHAYN;
1341
1342 if (!p_ri)
1343 dec_cursor();
1344
1345 if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
1346 tempc = _GHAYN_;
1347 else
1348 tempc = _GHAYN;
1349
1350 if (!p_ri)
1351 inc_cursor();
1352
1353 break;
1354 case 'z':
1355 tempc = _ZA;
1356 break;
1357 case 'Z':
1358 tempc = _KAF_H;
1359 break;
1360 case ';':
1361 tempc = _KAF;
1362 break;
1363 case '\'':
1364 tempc = _GAF;
1365 break;
1366 case ',':
1367 tempc = WAW;
1368 break;
1369 case '[':
1370 tempc = _JIM;
1371 break;
1372 case ']':
1373 tempc = _CHE;
1374 break;
1375 }
1376
1377 if ((F_isalpha(tempc) || F_isdigit(tempc)))
1378 {
1379 if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001380 {
Bram Moolenaar071d4272004-06-13 20:20:40 +00001381 if (!p_ri && !F_is_TyE(tempc))
1382 chg_c_to_X_orX_ ();
1383 if (p_ri)
1384 chg_c_to_X_or_X ();
1385 }
1386
1387 if (curwin->w_cursor.col)
1388 {
1389 if (!p_ri)
1390 dec_cursor();
1391
1392 if (F_is_TyE(tempc))
1393 chg_l_toXor_X ();
1394 else
1395 chg_l_to_X_orX_ ();
1396
1397 if (!p_ri)
1398 inc_cursor();
1399 }
1400 }
1401 if (tempc)
1402 return tempc;
1403 return c;
1404}
1405
1406/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001407 * Convert a none leading Farsi char into a leading type.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001408*/
1409 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001410toF_leading(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001411{
1412 switch (c)
1413 {
1414 case ALEF_: return ALEF;
1415 case ALEF_U_H_: return ALEF_U_H;
1416 case BE: return _BE;
1417 case PE: return _PE;
1418 case TE: return _TE;
1419 case SE: return _SE;
1420 case JIM: return _JIM;
1421 case CHE: return _CHE;
1422 case HE_J: return _HE_J;
1423 case XE: return _XE;
1424 case SIN: return _SIN;
1425 case SHIN: return _SHIN;
1426 case SAD: return _SAD;
1427 case ZAD: return _ZAD;
1428
1429 case AYN:
1430 case AYN_:
1431 case _AYN_: return _AYN;
1432
1433 case GHAYN:
1434 case GHAYN_:
1435 case _GHAYN_: return _GHAYN;
1436
1437 case FE: return _FE;
1438 case GHAF: return _GHAF;
1439 case KAF: return _KAF;
1440 case GAF: return _GAF;
1441 case LAM: return _LAM;
1442 case MIM: return _MIM;
1443 case NOON: return _NOON;
1444
1445 case _HE_:
1446 case F_HE: return _HE;
1447
1448 case YE:
1449 case YE_: return _YE;
1450
1451 case IE_:
1452 case IE: return _IE;
1453
1454 case YEE:
1455 case YEE_: return _YEE;
1456 }
1457 return c;
1458}
1459
1460/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001461 * Convert a given Farsi char into right joining type.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001462*/
1463 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001464toF_Rjoin(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001465{
1466 switch (c)
1467 {
1468 case ALEF: return ALEF_;
1469 case ALEF_U_H: return ALEF_U_H_;
1470 case BE: return _BE;
1471 case PE: return _PE;
1472 case TE: return _TE;
1473 case SE: return _SE;
1474 case JIM: return _JIM;
1475 case CHE: return _CHE;
1476 case HE_J: return _HE_J;
1477 case XE: return _XE;
1478 case SIN: return _SIN;
1479 case SHIN: return _SHIN;
1480 case SAD: return _SAD;
1481 case ZAD: return _ZAD;
1482
1483 case AYN:
1484 case AYN_:
1485 case _AYN: return _AYN_;
1486
1487 case GHAYN:
1488 case GHAYN_:
1489 case _GHAYN_: return _GHAYN_;
1490
1491 case FE: return _FE;
1492 case GHAF: return _GHAF;
1493 case KAF: return _KAF;
1494 case GAF: return _GAF;
1495 case LAM: return _LAM;
1496 case MIM: return _MIM;
1497 case NOON: return _NOON;
1498
1499 case _HE:
1500 case F_HE: return _HE_;
1501
1502 case YE:
1503 case YE_: return _YE;
1504
1505 case IE_:
1506 case IE: return _IE;
1507
1508 case TEE: return TEE_;
1509
1510 case YEE:
1511 case YEE_: return _YEE;
1512 }
1513 return c;
1514}
1515
1516/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001517 * Can a given Farsi character join via its left edj.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001518*/
1519 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001520canF_Ljoin(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001521{
1522 switch (c)
1523 {
1524 case _BE:
1525 case BE:
1526 case PE:
1527 case _PE:
1528 case TE:
1529 case _TE:
1530 case SE:
1531 case _SE:
1532 case JIM:
1533 case _JIM:
1534 case CHE:
1535 case _CHE:
1536 case HE_J:
1537 case _HE_J:
1538 case XE:
1539 case _XE:
1540 case SIN:
1541 case _SIN:
1542 case SHIN:
1543 case _SHIN:
1544 case SAD:
1545 case _SAD:
1546 case ZAD:
1547 case _ZAD:
1548 case _TA:
1549 case _ZA:
1550 case AYN:
1551 case _AYN:
1552 case _AYN_:
1553 case AYN_:
1554 case GHAYN:
1555 case GHAYN_:
1556 case _GHAYN_:
1557 case _GHAYN:
1558 case FE:
1559 case _FE:
1560 case GHAF:
1561 case _GHAF:
1562 case _KAF_H:
1563 case KAF:
1564 case _KAF:
1565 case GAF:
1566 case _GAF:
1567 case LAM:
1568 case _LAM:
1569 case MIM:
1570 case _MIM:
1571 case NOON:
1572 case _NOON:
1573 case IE:
1574 case _IE:
1575 case IE_:
1576 case YE:
1577 case _YE:
1578 case YE_:
1579 case YEE:
1580 case _YEE:
1581 case YEE_:
1582 case F_HE:
1583 case _HE:
1584 case _HE_:
1585 return TRUE;
1586 }
1587 return FALSE;
1588}
1589
1590/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001591 * Can a given Farsi character join via its right edj.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001592*/
1593 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001594canF_Rjoin(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001595{
1596 switch (c)
1597 {
1598 case ALEF:
1599 case ALEF_:
1600 case ALEF_U_H:
1601 case ALEF_U_H_:
1602 case DAL:
1603 case ZAL:
1604 case RE:
1605 case JE:
1606 case ZE:
1607 case TEE:
1608 case TEE_:
1609 case WAW:
1610 case WAW_H:
1611 return TRUE;
1612 }
1613
1614 return canF_Ljoin(c);
1615
1616}
1617
1618/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001619 * is a given Farsi character a terminating type.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001620*/
1621 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001622F_isterm(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001623{
1624 switch (c)
1625 {
1626 case ALEF:
1627 case ALEF_:
1628 case ALEF_U_H:
1629 case ALEF_U_H_:
1630 case DAL:
1631 case ZAL:
1632 case RE:
1633 case JE:
1634 case ZE:
1635 case WAW:
1636 case WAW_H:
1637 case TEE:
1638 case TEE_:
1639 return TRUE;
1640 }
1641
1642 return FALSE;
1643}
1644
1645/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001646 * Convert the given Farsi character into a ending type .
Bram Moolenaar071d4272004-06-13 20:20:40 +00001647*/
1648 static int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001649toF_ending(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001650{
Bram Moolenaar071d4272004-06-13 20:20:40 +00001651 switch (c)
1652 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001653 case _BE: return BE;
1654 case _PE: return PE;
1655 case _TE: return TE;
1656 case _SE: return SE;
1657 case _JIM: return JIM;
1658 case _CHE: return CHE;
1659 case _HE_J: return HE_J;
1660 case _XE: return XE;
1661 case _SIN: return SIN;
1662 case _SHIN: return SHIN;
1663 case _SAD: return SAD;
1664 case _ZAD: return ZAD;
1665 case _AYN: return AYN;
1666 case _AYN_: return AYN_;
1667 case _GHAYN: return GHAYN;
1668 case _GHAYN_: return GHAYN_;
1669 case _FE: return FE;
1670 case _GHAF: return GHAF;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001671 case _KAF_H:
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001672 case _KAF: return KAF;
1673 case _GAF: return GAF;
1674 case _LAM: return LAM;
1675 case _MIM: return MIM;
1676 case _NOON: return NOON;
1677 case _YE: return YE_;
1678 case YE_: return YE;
1679 case _YEE: return YEE_;
1680 case YEE_: return YEE;
1681 case TEE: return TEE_;
1682 case _IE: return IE_;
1683 case IE_: return IE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001684 case _HE:
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001685 case _HE_: return F_HE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001686 }
1687 return c;
1688}
1689
1690/*
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001691 * Convert the Farsi 3342 standard into Farsi VIM.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001692*/
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001693 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001694conv_to_pvim(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001695{
1696 char_u *ptr;
1697 int lnum, llen, i;
1698
1699 for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
1700 {
1701 ptr = ml_get((linenr_T)lnum);
1702
1703 llen = (int)STRLEN(ptr);
1704
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001705 for (i = 0; i < llen-1; i++)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001706 {
1707 if (canF_Ljoin(ptr[i]) && canF_Rjoin(ptr[i+1]))
1708 {
1709 ptr[i] = toF_leading(ptr[i]);
1710 ++i;
1711
Bram Moolenaar97f38d92012-07-16 17:26:22 +02001712 while (canF_Rjoin(ptr[i]) && i < llen)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001713 {
1714 ptr[i] = toF_Rjoin(ptr[i]);
1715 if (F_isterm(ptr[i]) || !F_isalpha(ptr[i]))
1716 break;
1717 ++i;
1718 }
1719 if (!F_isalpha(ptr[i]) || !canF_Rjoin(ptr[i]))
1720 ptr[i-1] = toF_ending(ptr[i-1]);
1721 }
1722 else
1723 ptr[i] = toF_TyA(ptr[i]);
1724 }
1725 }
1726
1727 /*
1728 * Following lines contains Farsi encoded character.
1729 */
1730
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001731 do_cmdline_cmd((char_u *)"%s/\202\231/\232/ge");
1732 do_cmdline_cmd((char_u *)"%s/\201\231/\370\334/ge");
Bram Moolenaar071d4272004-06-13 20:20:40 +00001733
1734 /* Assume the screen has been messed up: clear it and redraw. */
1735 redraw_later(CLEAR);
1736 MSG_ATTR(farsi_text_1, hl_attr(HLF_S));
1737}
1738
1739/*
Bram Moolenaar84a05ac2013-05-06 04:24:17 +02001740 * Convert the Farsi VIM into Farsi 3342 standard.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001741 */
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001742 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001743conv_to_pstd(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001744{
1745 char_u *ptr;
1746 int lnum, llen, i;
1747
1748 /*
1749 * Following line contains Farsi encoded character.
1750 */
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001751 do_cmdline_cmd((char_u *)"%s/\232/\202\231/ge");
Bram Moolenaar071d4272004-06-13 20:20:40 +00001752
1753 for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
1754 {
1755 ptr = ml_get((linenr_T)lnum);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001756 llen = (int)STRLEN(ptr);
1757
Bram Moolenaaree2615a2016-07-02 18:25:34 +02001758 for (i = 0; i < llen; i++)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001759 ptr[i] = toF_TyA(ptr[i]);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001760 }
1761
1762 /* Assume the screen has been messed up: clear it and redraw. */
1763 redraw_later(CLEAR);
1764 MSG_ATTR(farsi_text_2, hl_attr(HLF_S));
1765}
1766
1767/*
1768 * left-right swap the characters in buf[len].
1769 */
1770 static void
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001771lrswapbuf(char_u *buf, int len)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001772{
1773 char_u *s, *e;
1774 int c;
1775
1776 s = buf;
1777 e = buf + len - 1;
1778
1779 while (e > s)
1780 {
1781 c = *s;
1782 *s = *e;
1783 *e = c;
1784 ++s;
1785 --e;
1786 }
1787}
1788
1789/*
1790 * swap all the characters in reverse direction
1791 */
1792 char_u *
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001793lrswap(char_u *ibuf)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001794{
1795 if (ibuf != NULL && *ibuf != NUL)
1796 lrswapbuf(ibuf, (int)STRLEN(ibuf));
1797 return ibuf;
1798}
1799
1800/*
1801 * swap all the Farsi characters in reverse direction
1802 */
1803 char_u *
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001804lrFswap(char_u *cmdbuf, int len)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001805{
1806 int i, cnt;
1807
1808 if (cmdbuf == NULL)
1809 return cmdbuf;
1810
1811 if (len == 0 && (len = (int)STRLEN(cmdbuf)) == 0)
1812 return cmdbuf;
1813
1814 for (i = 0; i < len; i++)
1815 {
1816 for (cnt = 0; i + cnt < len
1817 && (F_isalpha(cmdbuf[i + cnt])
1818 || F_isdigit(cmdbuf[i + cnt])
1819 || cmdbuf[i + cnt] == ' '); ++cnt)
1820 ;
1821
1822 lrswapbuf(cmdbuf + i, cnt);
1823 i += cnt;
1824 }
1825 return cmdbuf;
1826}
1827
1828/*
Bram Moolenaar8c8de832008-06-24 22:58:06 +00001829 * Reverse the characters in the search path and substitute section
1830 * accordingly.
1831 * TODO: handle different separator characters. Use skip_regexp().
Bram Moolenaar071d4272004-06-13 20:20:40 +00001832 */
1833 char_u *
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001834lrF_sub(char_u *ibuf)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001835{
1836 char_u *p, *ep;
1837 int i, cnt;
1838
1839 p = ibuf;
1840
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +00001841 /* Find the boundary of the search path */
Bram Moolenaar42332f52005-07-06 22:38:49 +00001842 while (((p = vim_strchr(p + 1, '/')) != NULL) && p[-1] == '\\')
Bram Moolenaar071d4272004-06-13 20:20:40 +00001843 ;
1844
1845 if (p == NULL)
1846 return ibuf;
1847
1848 /* Reverse the Farsi characters in the search path. */
1849 lrFswap(ibuf, (int)(p-ibuf));
1850
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +00001851 /* Now find the boundary of the substitute section */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001852 if ((ep = (char_u *)strrchr((char *)++p, '/')) != NULL)
1853 cnt = (int)(ep - p);
1854 else
1855 cnt = (int)STRLEN(p);
1856
1857 /* Reverse the characters in the substitute section and take care of '\' */
1858 for (i = 0; i < cnt-1; i++)
1859 if (p[i] == '\\')
1860 {
1861 p[i] = p[i+1] ;
1862 p[++i] = '\\';
1863 }
1864
1865 lrswapbuf(p, cnt);
1866
1867 return ibuf;
1868}
1869
1870/*
1871 * Map Farsi keyboard when in cmd_fkmap mode.
1872 */
1873 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01001874cmdl_fkmap(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001875{
1876 int tempc;
1877
1878 switch (c)
1879 {
1880 case '0':
1881 case '1':
1882 case '2':
1883 case '3':
1884 case '4':
1885 case '5':
1886 case '6':
1887 case '7':
1888 case '8':
1889 case '9':
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 '?':
1905 case '+':
1906 case '-':
1907 case '_':
1908 case '*':
1909 case ':':
1910 case '#':
1911 case '~':
1912 case '@':
1913 case '<':
1914 case '>':
1915 case '{':
1916 case '}':
1917 case '|':
1918 case 'B':
1919 case 'E':
1920 case 'F':
1921 case 'H':
1922 case 'I':
1923 case 'K':
1924 case 'L':
1925 case 'M':
1926 case 'O':
1927 case 'P':
1928 case 'Q':
1929 case 'R':
1930 case 'T':
1931 case 'U':
1932 case 'W':
1933 case 'Y':
1934 case NL:
1935 case TAB:
1936
1937 switch ((tempc = cmd_gchar(AT_CURSOR)))
1938 {
1939 case _BE:
1940 case _PE:
1941 case _TE:
1942 case _SE:
1943 case _JIM:
1944 case _CHE:
1945 case _HE_J:
1946 case _XE:
1947 case _SIN:
1948 case _SHIN:
1949 case _SAD:
1950 case _ZAD:
1951 case _AYN:
1952 case _GHAYN:
1953 case _FE:
1954 case _GHAF:
1955 case _KAF:
1956 case _GAF:
1957 case _LAM:
1958 case _MIM:
1959 case _NOON:
1960 case _HE:
1961 case _HE_:
1962 cmd_pchar(toF_TyA(tempc), AT_CURSOR);
1963 break;
1964 case _AYN_:
1965 cmd_pchar(AYN_, AT_CURSOR);
1966 break;
1967 case _GHAYN_:
1968 cmd_pchar(GHAYN_, AT_CURSOR);
1969 break;
1970 case _IE:
1971 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
1972 cmd_pchar(IE_, AT_CURSOR);
1973 else
1974 cmd_pchar(IE, AT_CURSOR);
1975 break;
1976 case _YEE:
1977 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
1978 cmd_pchar(YEE_, AT_CURSOR);
1979 else
1980 cmd_pchar(YEE, AT_CURSOR);
1981 break;
1982 case _YE:
1983 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
1984 cmd_pchar(YE_, AT_CURSOR);
1985 else
1986 cmd_pchar(YE, AT_CURSOR);
1987 }
1988
1989 switch (c)
1990 {
1991 case '0': return FARSI_0;
1992 case '1': return FARSI_1;
1993 case '2': return FARSI_2;
1994 case '3': return FARSI_3;
1995 case '4': return FARSI_4;
1996 case '5': return FARSI_5;
1997 case '6': return FARSI_6;
1998 case '7': return FARSI_7;
1999 case '8': return FARSI_8;
2000 case '9': return FARSI_9;
2001 case 'B': return F_PSP;
2002 case 'E': return JAZR_N;
2003 case 'F': return ALEF_D_H;
2004 case 'H': return ALEF_A;
2005 case 'I': return TASH;
2006 case 'K': return F_LQUOT;
2007 case 'L': return F_RQUOT;
2008 case 'M': return HAMZE;
2009 case 'O': return '[';
2010 case 'P': return ']';
2011 case 'Q': return OO;
2012 case 'R': return MAD_N;
2013 case 'T': return OW;
2014 case 'U': return MAD;
2015 case 'W': return OW_OW;
2016 case 'Y': return JAZR;
2017 case '`': return F_PCN;
2018 case '!': return F_EXCL;
2019 case '@': return F_COMMA;
2020 case '#': return F_DIVIDE;
2021 case '$': return F_CURRENCY;
2022 case '%': return F_PERCENT;
2023 case '^': return F_MUL;
2024 case '&': return F_BCOMMA;
2025 case '*': return F_STAR;
2026 case '(': return F_LPARENT;
2027 case ')': return F_RPARENT;
2028 case '-': return F_MINUS;
2029 case '_': return F_UNDERLINE;
2030 case '=': return F_EQUALS;
2031 case '+': return F_PLUS;
2032 case '\\': return F_BSLASH;
2033 case '|': return F_PIPE;
2034 case ':': return F_DCOLON;
2035 case '"': return F_SEMICOLON;
2036 case '.': return F_PERIOD;
2037 case '/': return F_SLASH;
2038 case '<': return F_LESS;
2039 case '>': return F_GREATER;
2040 case '?': return F_QUESTION;
2041 case ' ': return F_BLANK;
2042 }
2043
2044 break;
2045
2046 case 'a': return _SHIN;
2047 case 'A': return WAW_H;
2048 case 'b': return ZAL;
2049 case 'c': return ZE;
2050 case 'C': return JE;
2051 case 'd': return _YE;
2052 case 'D': return _YEE;
2053 case 'e': return _SE;
2054 case 'f': return _BE;
2055 case 'g': return _LAM;
2056 case 'G':
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002057 if (cmd_gchar(AT_CURSOR) == _LAM)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002058 {
2059 cmd_pchar(LAM, AT_CURSOR);
2060 return ALEF_U_H;
2061 }
2062
2063 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2064 return ALEF_U_H_;
2065 else
2066 return ALEF_U_H;
2067 case 'h':
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002068 if (cmd_gchar(AT_CURSOR) == _LAM)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002069 {
2070 cmd_pchar(LA, AT_CURSOR);
2071 redrawcmdline();
2072 return K_IGNORE;
2073 }
2074
2075 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2076 return ALEF_;
2077 else
2078 return ALEF;
2079 case 'i':
2080 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2081 return _HE_;
2082 else
2083 return _HE;
2084 case 'j': return _TE;
2085 case 'J':
2086 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2087 return TEE_;
2088 else
2089 return TEE;
2090 case 'k': return _NOON;
2091 case 'l': return _MIM;
2092 case 'm': return _PE;
2093 case 'n':
2094 case 'N': return DAL;
2095 case 'o': return _XE;
2096 case 'p': return _HE_J;
2097 case 'q': return _ZAD;
2098 case 'r': return _GHAF;
2099 case 's': return _SIN;
2100 case 'S': return _IE;
2101 case 't': return _FE;
2102 case 'u':
2103 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2104 return _AYN_;
2105 else
2106 return _AYN;
2107 case 'v':
2108 case 'V': return RE;
2109 case 'w': return _SAD;
2110 case 'x':
2111 case 'X': return _TA;
2112 case 'y':
2113 if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
2114 return _GHAYN_;
2115 else
2116 return _GHAYN;
2117 case 'z':
2118 case 'Z': return _ZA;
2119 case ';': return _KAF;
2120 case '\'': return _GAF;
2121 case ',': return WAW;
2122 case '[': return _JIM;
2123 case ']': return _CHE;
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002124 }
Bram Moolenaar071d4272004-06-13 20:20:40 +00002125
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002126 return c;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002127}
2128
2129/*
2130 * F_isalpha returns TRUE if 'c' is a Farsi alphabet
2131 */
2132 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01002133F_isalpha(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002134{
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002135 return ((c >= TEE_ && c <= _YE)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002136 || (c >= ALEF_A && c <= YE)
2137 || (c >= _IE && c <= YE_));
2138}
2139
2140/*
2141 * F_isdigit returns TRUE if 'c' is a Farsi digit
2142 */
2143 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01002144F_isdigit(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002145{
2146 return (c >= FARSI_0 && c <= FARSI_9);
2147}
2148
2149/*
2150 * F_ischar returns TRUE if 'c' is a Farsi character.
2151 */
2152 int
Bram Moolenaar78c0b7d2016-01-30 15:52:46 +01002153F_ischar(int c)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002154{
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002155 return (c >= TEE_ && c <= YE_);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002156}
2157
2158 void
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002159farsi_f8(cmdarg_T *cap UNUSED)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002160{
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002161 if (p_altkeymap)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002162 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002163 if (curwin->w_farsi & W_R_L)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002164 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002165 p_fkmap = 0;
2166 do_cmdline_cmd((char_u *)"set norl");
2167 MSG("");
Bram Moolenaar071d4272004-06-13 20:20:40 +00002168 }
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002169 else
2170 {
2171 p_fkmap = 1;
2172 do_cmdline_cmd((char_u *)"set rl");
2173 MSG("");
2174 }
2175
2176 curwin->w_farsi = curwin->w_farsi ^ W_R_L;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002177 }
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002178}
Bram Moolenaar071d4272004-06-13 20:20:40 +00002179
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002180 void
2181farsi_f9(cmdarg_T *cap UNUSED)
2182{
2183 if (p_altkeymap && curwin->w_p_rl)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002184 {
Bram Moolenaaree2615a2016-07-02 18:25:34 +02002185 curwin->w_farsi = curwin->w_farsi ^ W_CONV;
2186 if (curwin->w_farsi & W_CONV)
2187 conv_to_pvim();
2188 else
2189 conv_to_pstd();
Bram Moolenaar071d4272004-06-13 20:20:40 +00002190 }
2191}