changeset 15850:a6ca8cf07a98 v8.1.0932

patch 8.1.0932: Farsi support is outdated and unused commit https://github.com/vim/vim/commit/14184a3133b9a6ee5f711d493c04e41ba4fa7c2f Author: Bram Moolenaar <Bram@vim.org> Date: Sat Feb 16 15:10:30 2019 +0100 patch 8.1.0932: Farsi support is outdated and unused Problem: Farsi support is outdated and unused. Solution: Delete the Farsi support.
author Bram Moolenaar <Bram@vim.org>
date Sat, 16 Feb 2019 15:15:07 +0100
parents c478f5603556
children f73ee0f27e61
files Filelist farsi/README.txt farsi/fonts/DOS/far-a01.com farsi/fonts/SunOs/far-a01.fb farsi/fonts/UNIXs/far-a01.f16 farsi/fonts/UNIXs/far-a01.pcf.Z farsi/fonts/UNIXs/far-a01.pcf.gz farsi/fonts/WINDOWS/far-a01.fon runtime/doc/farsi.txt runtime/doc/options.txt runtime/doc/quickref.txt runtime/doc/starting.txt src/Make_bc5.mak src/Make_cyg_ming.mak src/Make_dice.mak src/Make_ivc.mak src/Make_manx.mak src/Make_morph.mak src/Make_mvc.mak src/Make_sas.mak src/Make_vms.mms src/Makefile src/auto/configure src/charset.c src/config.h.in src/configure.ac src/edit.c src/evalfunc.c src/ex_cmds.c src/ex_getln.c src/farsi.c src/farsi.h src/getchar.c src/globals.h src/main.c src/normal.c src/option.c src/proto.h src/proto/farsi.pro src/screen.c src/search.c src/structs.h src/testdir/Make_all.mak src/testdir/test_farsi.vim src/version.c src/window.c
diffstat 46 files changed, 245 insertions(+), 3434 deletions(-) [+]
line wrap: on
line diff
--- a/Filelist
+++ b/Filelist
@@ -37,8 +37,6 @@ SRC_ALL =	\
 		src/ex_docmd.c \
 		src/ex_eval.c \
 		src/ex_getln.c \
-		src/farsi.c \
-		src/farsi.h \
 		src/feature.h \
 		src/fileio.c \
 		src/findfile.c \
@@ -169,7 +167,6 @@ SRC_ALL =	\
 		src/proto/ex_docmd.pro \
 		src/proto/ex_eval.pro \
 		src/proto/ex_getln.pro \
-		src/proto/farsi.pro \
 		src/proto/fileio.pro \
 		src/proto/findfile.pro \
 		src/proto/fold.pro \
@@ -837,8 +834,6 @@ EXTRA =		\
 		$(SRC_EXTRA) \
 		README_extra.txt \
 		src/VisVim/VisVim.dll \
-		farsi/README.txt \
-		farsi/fonts/*/far-* \
 		runtime/vimlogo.xpm \
 		src/tee/Makefile \
 		src/tee/Make_mvc.mak \
deleted file mode 100644
--- a/farsi/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-For information about installation of Farsi fonts and Vim usage in Farsi mode,
-refer to the Farsi help file by typing ":help farsi" in Vim.
deleted file mode 100755
index ebd06caed1133abb5f8353306354d464d7cd497b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index c353f85319c2000c209a78a7606a5c736d6888ca..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 471eb3a3a7de94eb3498daaf23112c05e8071988..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index d8e44605f73db753e992da052c9e1e80a5e58688..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index ab6fa9ddd6418b958d820eecd6d55dd2f2f24d79..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 3121097d80651fce0e0ca3418799b833c2bebe79..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/runtime/doc/farsi.txt
+++ b/runtime/doc/farsi.txt
@@ -1,4 +1,4 @@
-*farsi.txt*     For Vim version 8.1.  Last change: 2015 Aug 29
+*farsi.txt*     For Vim version 8.1.  Last change: 2019 Feb 16
 
 
 		  VIM REFERENCE MANUAL    by Mortaza Ghassab Shiran
@@ -9,261 +9,12 @@ Right to Left and Farsi Mapping for Vim	
 {Vi does not have any of these commands}
 
 						*E27*
-In order to use right-to-left and Farsi mapping support, it is necessary to
-compile Vim with the |+farsi| feature.
-
-These functions have been made by Mortaza G. Shiran <shiran@jps.net>
-
-
-Introduction
-------------
-In right-to-left oriented files the characters appear on the screen from right
-to left.  This kind of file is most useful when writing Farsi documents,
-composing faxes or writing Farsi memos.
-
-The commands, prompts and help files are not in Farsi, therefore the user
-interface remains the standard Vi interface.
-
-
-Highlights
-----------
-o  Editing left-to-right files as in the original Vim, no change.
-
-o  Viewing and editing files in right-to-left windows.   File orientation is
-   per window, so it is possible to view the same file in right-to-left and
-   left-to-right modes, simultaneously.
-
-o  Compatibility to the original Vim.   Almost all features work in
-   right-to-left mode (see bugs below).
-
-o  Changing keyboard mapping and reverse insert modes using a single
-   command.
-
-o  Backing from reverse insert mode to the correct place in the file
-   (if possible).
-
-o  While in Farsi mode, numbers are entered from left to right.  Upon entering
-   a none number character, that character will be inserted just into the
-   left of the last number.
-
-o  No special terminal with right-to-left capabilities is required.  The
-   right-to-left changes are completely hardware independent.  Only
-   Farsi font is necessary.
-
-o  Farsi keymapping on the command line in reverse insert mode.
-
-o  Toggling between left-to-right and right-to-left via F8 function key.
-
-o  Toggling between Farsi ISIR-3342 standard encoding and Vim Farsi via F9
-   function key.  Since this makes sense only for the text written in
-   right-to-left mode, this function is also supported only in right-to-left
-   mode.
+Farsi support has been removed in patch 8.1.0932.  At that time it was
+outdated and unused.
 
-Farsi Fonts					*farsi-fonts*
------------
-
-The following files are found in the subdirectories of the '$VIM/farsi/fonts'
-directory:
-
-   +  far-a01.pcf    X Windows fonts for Unix including Linux systems
-   +  far-a01.bf     X Windows fonts for SunOS
-   +  far-a01.f16    a screen fonts for Unix including Linux systems
-   +  far-a01.fon    a monospaced fonts for Windows NT/95/98
-   +  far-a01.com    a screen fonts for DOS
-
-
-Font Installation
------------------
-
-o  Installation of fonts for MS Window systems (NT/95/98)
-
-   From 'Control Panel' folder, start the 'Fonts' program.  Then from 'file'
-   menu item select 'Install New Fonts ...'.  Browse and select the
-   'far-a01.fon', then follow the installation guide.
-   NOTE: several people have reported that this does not work.  The solution
-   is unknown.
-
-o  Installation of fonts for X Window systems (Unix/Linux)
-
-   Depending on your system, copy far-a01.pcf.Z or far-a01.pcf.gz into a
-   directory of your choice.  Change to the directory containing the Farsi
-   fonts and execute the following commands:
-
-   >  mkfontdir
-   >  xset +fp path_name_of_farsi_fonts_directory
-
-o  Installation of fonts for X Window systems (SunOS)
-
-   Copy far-a01.bf font into a directory of your choice.
-   Change to the directory containing the far-a01.fb fonts and
-   execute the following commands:
-
-   >  fldfamily
-   >  xset +fp path_name_of_fonts_directory
-
-o  Installation of ASCII screen fonts (Unix/Linux)
-
-   For Linux system, copy the far-a01.f16 fonts into /usr/lib/kbd/consolefonts
-   directory and execute the setfont program as "setfont far-a01.f16".  For
-   other systems (e.g. SCO Unix), please refer to the fonts installation
-   section of your system administration manuals.
-
-o  Installation of ASCII screen fonts (DOS)
-
-   After system power on, prior to the first use of Vim, upload the Farsi
-   fonts by executing the far-a01.com font uploading program.
+If you would like to bring Farsi support back, please have a look at the old
+Farsi code, as it was present at the 8.1 release.  It should be merged with
+Arabic support using the Unicode character set.
 
 
-Usage
------
-Prior to starting Vim, the environment in which Vim can run in Farsi mode,
-must be set.  In addition to installation of Farsi fonts, following points
-refer to some of the system environments, which you may need to set:
-Key code mapping, loading graphic card in ASCII screen mode, setting the IO
-driver in 8 bit clean mode ... .
-
-o  Setting the Farsi fonts
-
-   +  For Vim GUI set the 'guifont' to far-a01.  This is done by entering
-      ':set guifont=far-a01' in the Vim window.
-
-      You can have 'guifont' set to far-a01 by Vim during the Vim startup
-      by appending the ':set guifont=far-a01' into your .vimrc file
-      (in case of NT/95/98 platforms _vimrc).
-
-      Under the X Window environment, you can also start Vim with the
-      '-fn far-a01' option.
-
-   +  For Vim within a xterm, start a xterm with the Farsi fonts (e.g.
-      kterm -fn far-a01).  Then start Vim inside the kterm.
-
-   +  For Vim under DOS, prior to the first usage of Vim, upload the Farsi
-      fonts by executing the far-a01.com fonts uploading program.
-
-o  Farsi Keymapping Activation
-
-   To activate the Farsi keymapping, set either 'altkeymap' or 'fkmap'.
-   This is done by entering ':set akm' or ':set fk' in the Vim window.
-   You can have 'altkeymap' or 'fkmap' set as default by appending ':set akm'
-   or ':set fk' in your .vimrc file or _vimrc in case of NT/95/98 platforms.
-
-   To turn off the Farsi keymapping as a default second language keymapping,
-   reset the 'altkeymap' by entering ':set noakm'.
-
-o  right-to-left Farsi Mode
-
-   By default Vim starts in Left-to-right mode.  Following are ways to change
-   the window orientation:
-
-   + Start Vim with the -F option (e.g. vim -F ...).
-
-   + Use the F8 function key to toggle between left-to-right and right-to-left.
-
-   + While in Left-to-right mode, enter 'set rl' in the command line ('rl' is
-     the abbreviation for rightleft).
-
-   + Put the 'set rl' line in your '.vimrc' file to start Vim in
-     right-to-left mode permanently.
-
-Encoding
---------
-
-The letter encoding used is the Vim extended ISIR-3342 standard with a built
-in function to convert between Vim extended ISIR-3342 and ISIR-3342 standard.
-
-For document portability reasons, the letter encoding is kept the same across
-different platforms (i.e. UNIX's, NT/95/98, MS DOS, ...).
-
-
-o  Keyboard
-
-   +  CTRL-_ in insert/replace modes toggles between Farsi(akm)/Latin
-      mode as follows:
-
-   +  CTRL-_ moves the cursor to the end of the typed text in edit mode.
-
-   +  CTRL-_ in command mode only toggles keyboard mapping between Farsi(akm)/
-      Latin.  The Farsi text is then entered in reverse insert mode.
-
-   +  F8 - Toggles between left-to-right and right-to-left.
-
-   +  F9 - Toggles the encoding between ISIR-3342 standard and Vim extended
-      ISIR-3342 (supported only in right-to-left mode).
-
-   +  Keyboard mapping is based on the Iranian ISIRI-2901 standard.
-      Following table shows the keyboard mapping while Farsi(akm) mode set:
-
-	-------------------------------------
-	`  1  2  3  4  5  6  7  8  9  0  -  =
-	¢  ±  ²  ³  ´  µ  ¶  ·  ¸  ¹  °  ­  ½
-	-------------------------------------
-	~  !  @  #  $  %  ^  &  *  (  )  _  +
-	~  £  §  ®  ¤  ¥  ª  ¬  è  ¨  ©  é  «
-	-------------------------------------
-	q  w  e  r  t  z  u  i  o  p  [  ]
-	Ó  Ò  Æ  Ù  Ø  Õ  Ö  à  Ê  É  Ç  ˆ
-	-------------------------------------
-	Q  W  E  R  T  Z  U  I  O  P  {  }
-	÷  õ  ô  ó  ò  ý  ð  ö  [  ]  {  }
-	-------------------------------------
-	a  s  d  f  g  h  j  k  l  ;  '  \
-	Ñ  Ð  á  Ã  Ü  Á  Å  Þ  Ý  Ú  Û  ë
-	-------------------------------------
-	A  S  D  F  G  H  J  K  L  :  "  |
-	ù  û  þ  ú  ø  À  ü  æ  ç  º  »  ê
-	-------------------------------------
-	<  y  x  c  v  b  n  m  ,  .  /
-	¾  ×  Ô  Î  Í  Ì  Ë  Ä  ß  ¦  ¯
-	-------------------------------------
-	>  Y  X  C  V  B  N  M  <  >  ?
-	¼  ñ  Ô  Ï  Í  ¡  Ë  Â  ¾  ¼  ¿
-	-------------------------------------
-
-Note:
-	¡  stands for Farsi PSP (break without space)
-
-	¢  stands for Farsi PCN (for HAMZE attribute)
-
-Restrictions
-------------
-
-o  In insert/replace mode and fkmap (Farsi mode) set, CTRL-B is not
-   supported.
-
-o  If you change the character mapping between Latin/Farsi, the redo buffer
-   will be reset (emptied).  That is, redo is valid and will function (using
-   '.') only within the mode you are in.
-
-o  While numbers are entered in Farsi mode, the redo buffer will be reset
-   (emptied).  That is, you cannot redo the last changes (using '.') after
-   entering numbers.
-
-o  While in left-to-right mode and Farsi mode set, CTRL-R is not supported.
-
-o  While in right-to-left mode, the search on 'Latin' pattern does not work,
-   except if you enter the Latin search pattern in reverse.
-
-o  In command mode there is no support for entering numbers from left
-   to right and also for the sake of flexibility the keymapping logic is
-   restricted.
-
-o  Under the X Window environment, if you want to run Vim within a xterm
-   terminal emulator and Farsi mode set, you need to have an ANSI compatible
-   xterm terminal emulator.  This is because the letter codes above 128 decimal
-   have certain meanings in the standard xterm terminal emulator.
-
-   Note: Under X Window environment, Vim GUI works fine in Farsi mode.
-	 This eliminates the need of any xterm terminal emulator.
-
-
-Bugs
-----
-While in insert/replace and Farsi mode set, if you repeatedly change the
-cursor position (via cursor movement) and enter new text and then try to undo
-the last change, the undo will lag one change behind.  But as you continue to
-undo, you will reach the original line of text.  You can also use U to undo all
-changes made in the current line.
-
-For more information about the bugs refer to rileft.txt.
-
  vim:tw=78:ts=8:noet:ft=help:norl:
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -688,13 +688,8 @@ A jump table for the options with a shor
 			{not in Vi}
 			{only available when compiled with the |+farsi|
 			feature}
-	When on, the second language is Farsi.  In editing mode CTRL-_ toggles
-	the keyboard map between Farsi and English, when 'allowrevins' set.
-
-	When off, the keyboard map toggles between Hebrew and English.  This
-	is useful to start the Vim in native mode i.e. English (left-to-right
-	mode) and have default second language Farsi or Hebrew (right-to-left
-	mode).  See |farsi.txt|.
+	This option was for using Farsi, which has been removed.  See
+	|farsi.txt|.
 
 						*'ambiwidth'* *'ambw'*
 'ambiwidth' 'ambw'	string (default: "single")
@@ -3301,9 +3296,8 @@ A jump table for the options with a shor
 			{not in Vi}
 			{only available when compiled with the |+rightleft|
 			feature}
-	When on, the keyboard is mapped for the Farsi character set.
-	Normally you would set 'allowrevins' and use CTRL-_ in insert mode to
-	toggle this option |i_CTRL-_|.  See |farsi.txt|.
+	This option was for using Farsi, which has been removed.  See
+	|farsi.txt|.
 
 						*'foldclose'* *'fcl'*
 'foldclose' 'fcl'	string (default "")
--- a/runtime/doc/quickref.txt
+++ b/runtime/doc/quickref.txt
@@ -600,7 +600,6 @@ In Insert or Command-line mode:
 Short explanation of each option:		*option-list*
 'aleph'		  'al'	    ASCII code of the letter Aleph (Hebrew)
 'allowrevins'	  'ari'     allow CTRL-_ in Insert and Command-line mode
-'altkeymap'	  'akm'     for default second language (Farsi/Hebrew)
 'ambiwidth'	  'ambw'    what to do with Unicode chars of ambiguous width
 'antialias'	  'anti'    Mac OS X: use smooth, antialiased fonts
 'autochdir'	  'acd'     change directory to the file in the current window
@@ -700,7 +699,6 @@ Short explanation of each option:		*opti
 'filetype'	  'ft'	    type of file, used for autocommands
 'fillchars'	  'fcs'     characters to use for displaying special items
 'fixendofline'	  'fixeol'  make sure last line in file has <EOL>
-'fkmap'		  'fk'	    Farsi keyboard mapping
 'foldclose'	  'fcl'     close a fold when the cursor leaves it
 'foldcolumn'	  'fdc'     width of the column used to indicate folds
 'foldenable'	  'fen'     set to display all folds open
--- a/runtime/doc/starting.txt
+++ b/runtime/doc/starting.txt
@@ -321,9 +321,8 @@ a slash.  Thus "-R" means recovery and "
 		and exits.)  {not in Vi}
 
 							*-F*
--F		Farsi mode.  Sets the 'fkmap' and 'rightleft' options on.
-		(Only when compiled with |+rightleft| and |+farsi| features,
-		otherwise Vim gives an error message and exits.)  {not in Vi}
+-F		This was used for Farsi mode, which has been removed.
+		See |farsi.txt|.
 
 							*-H*
 -H		Hebrew mode.  Sets the 'hkmap' and 'rightleft' options on.
--- a/src/Make_bc5.mak
+++ b/src/Make_bc5.mak
@@ -542,7 +542,6 @@ vimobj =  \
 	$(OBJDIR)\ex_docmd.obj \
 	$(OBJDIR)\ex_eval.obj \
 	$(OBJDIR)\ex_getln.obj \
-	$(OBJDIR)\farsi.obj \
 	$(OBJDIR)\fileio.obj \
 	$(OBJDIR)\findfile.obj \
 	$(OBJDIR)\fold.obj \
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -714,7 +714,6 @@ OBJ = \
 	$(OUTDIR)/ex_docmd.o \
 	$(OUTDIR)/ex_eval.o \
 	$(OUTDIR)/ex_getln.o \
-	$(OUTDIR)/farsi.o \
 	$(OUTDIR)/fileio.o \
 	$(OUTDIR)/findfile.o \
 	$(OUTDIR)/fold.o \
@@ -1005,7 +1004,7 @@ endif
 	$(MAKE) -C tee clean
 
 ###########################################################################
-INCL =	vim.h alloc.h arabic.h ascii.h ex_cmds.h farsi.h feature.h globals.h \
+INCL =	vim.h alloc.h arabic.h ascii.h ex_cmds.h feature.h globals.h \
 	keymap.h macros.h option.h os_dos.h os_win32.h proto.h regexp.h \
 	spell.h structs.h term.h beval.h $(NBDEBUG_INCL)
 GUI_INCL = gui.h
--- a/src/Make_dice.mak
+++ b/src/Make_dice.mak
@@ -44,7 +44,6 @@ SRC = \
 	ex_docmd.c \
 	ex_eval.c \
 	ex_getln.c \
-	farsi.c \
 	fileio.c \
 	findfile.c \
 	fold.c \
@@ -104,7 +103,6 @@ OBJ =	o/arabic.o \
 	o/ex_docmd.o \
 	o/ex_eval.o \
 	o/ex_getln.o \
-	o/farsi.o \
 	o/fileio.o \
 	o/findfile.o \
 	o/fold.o \
@@ -201,8 +199,6 @@ o/ex_eval.o:	ex_eval.c  $(SYMS) ex_cmds.
 
 o/ex_getln.o:	ex_getln.c  $(SYMS)
 
-o/farsi.o:	farsi.c  $(SYMS)
-
 o/fileio.o:	fileio.c  $(SYMS)
 
 o/findfile.o:	findfile.c  $(SYMS)
--- a/src/Make_ivc.mak
+++ b/src/Make_ivc.mak
@@ -228,7 +228,6 @@ LINK32_OBJS= \
 	"$(INTDIR)/ex_docmd.obj" \
 	"$(INTDIR)/ex_eval.obj" \
 	"$(INTDIR)/ex_getln.obj" \
-	"$(INTDIR)/farsi.obj" \
 	"$(INTDIR)/fileio.obj" \
 	"$(INTDIR)/findfile.obj" \
 	"$(INTDIR)/fold.obj" \
@@ -413,10 +412,6 @@ SOURCE=.\ex_getln.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\farsi.c
-# End Source File
-# Begin Source File
-
 SOURCE=.\fileio.c
 # End Source File
 # Begin Source File
--- a/src/Make_manx.mak
+++ b/src/Make_manx.mak
@@ -54,7 +54,6 @@ SRC =	arabic.c \
 	ex_docmd.c \
 	ex_eval.c \
 	ex_getln.c \
-	farsi.c \
 	fileio.c \
 	findfile.c \
 	fold.c \
@@ -116,7 +115,6 @@ OBJ =	obj/arabic.o \
 	obj/ex_docmd.o \
 	obj/ex_eval.o \
 	obj/ex_getln.o \
-	obj/farsi.o \
 	obj/fileio.o \
 	obj/findfile.o \
 	obj/fold.o \
@@ -176,7 +174,6 @@ PRO =	proto/arabic.pro \
 	proto/ex_docmd.pro \
 	proto/ex_eval.pro \
 	proto/ex_getln.pro \
-	proto/farsi.pro \
 	proto/fileio.pro \
 	proto/findfile.pro \
 	proto/fold.pro \
@@ -317,9 +314,6 @@ obj/ex_eval.o:	ex_eval.c ex_cmds.h
 obj/ex_getln.o:	ex_getln.c
 	$(CCSYM) $@ ex_getln.c
 
-obj/farsi.o:	farsi.c
-	$(CCSYM) $@ farsi.c
-
 obj/fileio.o:	fileio.c
 	$(CCSYM) $@ fileio.c
 
--- a/src/Make_morph.mak
+++ b/src/Make_morph.mak
@@ -42,7 +42,6 @@ SRC =	arabic.c						\
 	ex_docmd.c						\
 	ex_eval.c						\
 	ex_getln.c						\
-	farsi.c							\
 	fileio.c						\
 	findfile.c						\
 	fold.c							\
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -694,7 +694,7 @@ CFLAGS = $(CFLAGS) /Zl /MTd
 !include Make_all.mak
 !include testdir\Make_all.mak
 
-INCL =	vim.h alloc.h arabic.h ascii.h ex_cmds.h farsi.h feature.h globals.h \
+INCL =	vim.h alloc.h arabic.h ascii.h ex_cmds.h feature.h globals.h \
 	keymap.h macros.h option.h os_dos.h os_win32.h proto.h regexp.h \
 	spell.h structs.h term.h beval.h $(NBDEBUG_INCL)
 
@@ -719,7 +719,6 @@ OBJ = \
 	$(OUTDIR)\ex_docmd.obj \
 	$(OUTDIR)\ex_eval.obj \
 	$(OUTDIR)\ex_getln.obj \
-	$(OUTDIR)\farsi.obj \
 	$(OUTDIR)\fileio.obj \
 	$(OUTDIR)\findfile.obj \
 	$(OUTDIR)\fold.obj \
@@ -1404,8 +1403,6 @@ testclean:
 
 $(OUTDIR)/ex_getln.obj:	$(OUTDIR) ex_getln.c  $(INCL)
 
-$(OUTDIR)/farsi.obj:	$(OUTDIR) farsi.c  $(INCL)
-
 $(OUTDIR)/fileio.obj:	$(OUTDIR) fileio.c  $(INCL)
 
 $(OUTDIR)/findfile.obj:	$(OUTDIR) findfile.c  $(INCL)
@@ -1646,7 +1643,6 @@ proto.h: \
 	proto/ex_docmd.pro \
 	proto/ex_eval.pro \
 	proto/ex_getln.pro \
-	proto/farsi.pro \
 	proto/fileio.pro \
 	proto/findfile.pro \
 	proto/getchar.pro \
--- a/src/Make_sas.mak
+++ b/src/Make_sas.mak
@@ -107,7 +107,6 @@ SRC = \
 	ex_docmd.c \
 	ex_eval.c \
 	ex_getln.c \
-	farsi.c \
 	fileio.c \
 	findfile.c \
 	fold.c \
@@ -168,7 +167,6 @@ OBJ = \
 	ex_docmd.o \
 	ex_eval.o \
 	ex_getln.o \
-	farsi.o \
 	fileio.o \
 	findfile.o \
 	fold.o \
@@ -229,7 +227,6 @@ PRO = \
 	proto/ex_docmd.pro \
 	proto/ex_eval.pro \
 	proto/ex_getln.pro \
-	proto/farsi.pro \
 	proto/fileio.pro \
 	proto/findfile.pro \
 	proto/fold.pro \
@@ -362,8 +359,6 @@ ex_eval.o:		ex_eval.c ex_cmds.h
 proto/ex_eval.pro:	ex_eval.c ex_cmds.h
 ex_getln.o:		ex_getln.c
 proto/ex_getln.pro:	ex_getln.c
-farsi.o:		farsi.c
-proto/farsi.pro:	farsi.c
 fileio.o:		fileio.c
 proto/fileio.pro:	fileio.c
 findfile.o:		findfile.c
--- a/src/Make_vms.mms
+++ b/src/Make_vms.mms
@@ -2,7 +2,7 @@
 # Makefile for Vim on OpenVMS
 #
 # Maintainer:   Zoltan Arpadffy <arpadffy@polarhome.com>
-# Last change:  2019 Jan 18
+# Last change:  2019 Feb 16
 #
 # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64
 # with MMS and MMK
@@ -315,7 +315,7 @@ ALL_LIBS = $(LIBS) $(GUI_LIB_DIR) $(GUI_
 SRC =	arabic.c autocmd.c beval.c blob.c blowfish.c buffer.c charset.c \
 	crypt.c crypt_zip.c dict.c diff.c digraph.c edit.c eval.c evalfunc.c \
 	ex_cmds.c ex_cmds2.c ex_docmd.c ex_eval.c ex_getln.c if_cscope.c \
-	if_xcmdsrv.c farsi.c fileio.c findfile.c fold.c getchar.c hardcopy.c \
+	if_xcmdsrv.c fileio.c findfile.c fold.c getchar.c hardcopy.c \
 	hashtab.c indent.c json.c list.c main.c mark.c menu.c mbyte.c \
 	memfile.c memline.c message.c misc1.c misc2.c move.c normal.c ops.c \
 	option.c popupmnu.c quickfix.c regexp.c search.c sha256.c sign.c \
@@ -328,7 +328,7 @@ SRC =	arabic.c autocmd.c beval.c blob.c 
 OBJ = 	arabic.obj autocmd.obj beval.obj blob.obj blowfish.obj buffer.obj \
 	charset.obj crypt.obj crypt_zip.obj dict.obj diff.obj digraph.obj \
 	edit.obj eval.obj evalfunc.obj ex_cmds.obj ex_cmds2.obj ex_docmd.obj \
-	ex_eval.obj ex_getln.obj if_cscope.obj if_xcmdsrv.obj farsi.obj \
+	ex_eval.obj ex_getln.obj if_cscope.obj if_xcmdsrv.obj \
 	fileio.obj findfile.obj fold.obj getchar.obj hardcopy.obj hashtab.obj \
 	indent.obj json.obj list.obj main.obj mark.obj menu.obj memfile.obj \
 	memline.obj message.obj misc1.obj misc2.obj move.obj mbyte.obj \
@@ -514,279 +514,278 @@ blob.obj : blob.c vim.h [.auto]config.h 
 buffer.obj : buffer.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h version.h
+ globals.h arabic.h version.h
 charset.obj : charset.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 crypt.obj : crypt.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \
  beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 crypt_zip.obj : crypt_zip.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h \
  regexp.h gui.h beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 dict.obj : dict.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \
  beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 diff.obj : diff.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 digraph.obj : digraph.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 edit.obj : edit.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 eval.obj : eval.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h version.h
 evalfunc.obj : evalfunc.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h \
  regexp.h gui.h beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 ex_cmds.obj : ex_cmds.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h version.h
+ globals.h arabic.h version.h
 ex_cmds2.obj : ex_cmds2.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h version.h
+ globals.h arabic.h version.h
 ex_docmd.obj : ex_docmd.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 ex_eval.obj : ex_eval.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 ex_getln.obj : ex_getln.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
-farsi.obj : farsi.c vim.h
+ globals.h arabic.h
 fileio.obj : fileio.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 findfile.obj : findfile.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 fold.obj : fold.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 getchar.obj : getchar.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 hardcopy.obj : hardcopy.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 hashtab.obj : hashtab.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 if_cscope.obj : if_cscope.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h if_cscope.h
+ globals.h arabic.h if_cscope.h
 if_xcmdsrv.obj : if_xcmdsrv.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h version.h
+ globals.h arabic.h version.h
 if_mzsch.obj : if_mzsch.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h \
  regexp.h gui.h beval.h [.proto]gui_beval.pro ex_cmds.h proto.h \
- globals.h farsi.h arabic.h if_mzsch.h 
+ globals.h arabic.h if_mzsch.h 
 indent.obj : indent.c vim.h [.auto]config.h feature.h os_unix.h
 json.obj : json.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h version.h
 list.obj : list.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \
  beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 main.obj : main.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
- arabic.h farsi.c arabic.c
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
+ arabic.h arabic.c
 mark.obj : mark.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 memfile.obj : memfile.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 memline.obj : memline.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 menu.obj : menu.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 message.obj : message.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 misc1.obj : misc1.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h version.h
 misc2.obj : misc2.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 move.obj : move.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 mbyte.obj : mbyte.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 normal.obj : normal.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 ops.obj : ops.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 option.obj : option.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 os_unix.obj : os_unix.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h os_unixx.h
+ globals.h arabic.h os_unixx.h
 os_vms.obj : os_vms.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h os_unixx.h
+ globals.h arabic.h os_unixx.h
 pathdef.obj : pathdef.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 popupmnu.obj : popupmnu.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 quickfix.obj : quickfix.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 regexp.obj : regexp.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 screen.obj : screen.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 search.obj : search.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 sha256.obj : sha256.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \
  beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 sign.obj : sign.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h regexp.h gui.h \
  beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 spell.obj : spell.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 spellfile.obj : spellfile.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h \
  regexp.h gui.h beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 syntax.obj : syntax.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 tag.obj : tag.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 term.obj : term.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 termlib.obj : termlib.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 textprop.obj : textprop.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 ui.obj : ui.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 undo.obj : undo.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 userfunc.obj : userfunc.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h option.h structs.h \
  regexp.h gui.h beval.h [.proto]gui_beval.pro alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 version.obj : version.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h version.h
+ globals.h arabic.h version.h
 window.obj : window.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 gui.obj : gui.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 gui_gtk.obj : gui_gtk.c gui_gtk_f.h vim.h [.auto]config.h feature.h \
  os_unix.h   ascii.h keymap.h term.h macros.h structs.h \
  regexp.h gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h \
- proto.h globals.h farsi.h arabic.h [-.pixmaps]stock_icons.h
+ proto.h globals.h arabic.h [-.pixmaps]stock_icons.h
 gui_gtk_f.obj : gui_gtk_f.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h gui_gtk_f.h
+ globals.h arabic.h gui_gtk_f.h
 gui_motif.obj : gui_motif.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h [-.pixmaps]alert.xpm [-.pixmaps]error.xpm \
+ globals.h arabic.h [-.pixmaps]alert.xpm [-.pixmaps]error.xpm \
  [-.pixmaps]generic.xpm [-.pixmaps]info.xpm [-.pixmaps]quest.xpm
 gui_athena.obj : gui_athena.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h gui_at_sb.h
+ globals.h arabic.h gui_at_sb.h
 gui_gtk_x11.obj : gui_gtk_x11.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h gui_gtk_f.h [-.runtime]vim32x32.xpm \
+ globals.h arabic.h gui_gtk_f.h [-.runtime]vim32x32.xpm \
  [-.runtime]vim16x16.xpm [-.runtime]vim48x48.xpm
 gui_x11.obj : gui_x11.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h [-.runtime]vim32x32.xpm \
+ globals.h arabic.h [-.runtime]vim32x32.xpm \
  [-.runtime]vim16x16.xpm [-.runtime]vim48x48.xpm [-.pixmaps]tb_new.xpm \
  [-.pixmaps]tb_open.xpm [-.pixmaps]tb_close.xpm [-.pixmaps]tb_save.xpm \
  [-.pixmaps]tb_print.xpm [-.pixmaps]tb_cut.xpm [-.pixmaps]tb_copy.xpm \
@@ -806,60 +805,60 @@ gui_x11.obj : gui_x11.c vim.h [.auto]con
 gui_at_sb.obj : gui_at_sb.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h gui_at_sb.h
+ globals.h arabic.h gui_at_sb.h
 gui_at_fs.obj : gui_at_fs.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h gui_at_sb.h
+ globals.h arabic.h gui_at_sb.h
 pty.obj : pty.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h term.h macros.h structs.h regexp.h gui.h beval.h \
- [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h farsi.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h globals.h \
  arabic.h
 hangulin.obj : hangulin.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 if_perl.obj : [.auto]if_perl.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 if_perlsfio.obj : if_perlsfio.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 if_python.obj : if_python.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 if_tcl.obj : if_tcl.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 if_ruby.obj : if_ruby.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h version.h
+ globals.h arabic.h version.h
 beval.obj : beval.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 gui_beval.obj : gui_beval.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h
+ globals.h arabic.h
 workshop.obj : workshop.c [.auto]config.h integration.h vim.h feature.h \
  os_unix.h ascii.h keymap.h term.h macros.h structs.h \
  regexp.h gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h \
- proto.h globals.h farsi.h arabic.h version.h workshop.h
+ proto.h globals.h arabic.h version.h workshop.h
 wsdebug.obj : wsdebug.c
 integration.obj : integration.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h integration.h
+ globals.h arabic.h integration.h
 netbeans.obj : netbeans.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
- globals.h farsi.h arabic.h version.h
+ globals.h arabic.h version.h
 gui_xmdlg.obj : gui_xmdlg.c [.auto]config.h vim.h feature.h os_unix.h
 gui_xmebw.obj : gui_xmebw.c [.auto]config.h vim.h feature.h os_unix.h
 xdiffi.obj : [.xdiff]xdiffi.c [.xdiff]xinclude.h [.auto]config.h vim.h feature.h os_unix.h
--- a/src/Makefile
+++ b/src/Makefile
@@ -492,9 +492,9 @@ CClink = $(CC)
 # MULTIBYTE - To edit multi-byte characters.
 # This is now always enabled.
 
-# When building with at least "big" features, right-left, Arabic and Farsi
+# When building with at least "big" features, right-left and Arabic
 # features are enabled.  Use this to disable them.
-#CONF_OPT_MULTIBYTE = --disable-rightleft --disable-farsi --disable-arabic
+#CONF_OPT_MULTIBYTE = --disable-rightleft --disable-arabic
 
 # NLS - National Language Support
 # Uncomment this when you do not want to support translated messages, even
@@ -1590,7 +1590,6 @@ BASIC_SRC = \
 	ex_docmd.c \
 	ex_eval.c \
 	ex_getln.c \
-	farsi.c \
 	fileio.c \
 	findfile.c \
 	fold.c \
@@ -1704,7 +1703,6 @@ OBJ_COMMON = \
 	objects/ex_docmd.o \
 	objects/ex_eval.o \
 	objects/ex_getln.o \
-	objects/farsi.o \
 	objects/fileio.o \
 	objects/findfile.o \
 	objects/fold.o \
@@ -1831,7 +1829,6 @@ PRO_AUTO = \
 	ex_docmd.pro \
 	ex_eval.pro \
 	ex_getln.pro \
-	farsi.pro \
 	fileio.pro \
 	findfile.pro \
 	fold.pro \
@@ -2996,9 +2993,6 @@ objects/ex_eval.o: ex_eval.c
 objects/ex_getln.o: ex_getln.c
 	$(CCC) -o $@ ex_getln.c
 
-objects/farsi.o: farsi.c
-	$(CCC) -o $@ farsi.c
-
 objects/fileio.o: fileio.c
 	$(CCC) -o $@ fileio.c
 
@@ -3392,290 +3386,286 @@ bundle-language: bundle-dir
 objects/arabic.o: arabic.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/autocmd.o: autocmd.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/beval.o: beval.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/blob.o: blob.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/blowfish.o: blowfish.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/buffer.o: buffer.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/charset.o: charset.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/crypt.o: crypt.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/crypt_zip.o: crypt_zip.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/dict.o: dict.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/diff.o: diff.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h xdiff/xdiff.h vim.h
+ proto.h globals.h arabic.h xdiff/xdiff.h vim.h
 objects/digraph.o: digraph.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/edit.o: edit.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/eval.o: eval.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/evalfunc.o: evalfunc.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/ex_cmds.o: ex_cmds.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/ex_cmds2.o: ex_cmds2.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/ex_docmd.o: ex_docmd.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h ex_cmdidxs.h
+ proto.h globals.h arabic.h ex_cmdidxs.h
 objects/ex_eval.o: ex_eval.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/ex_getln.o: ex_getln.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
-objects/farsi.o: farsi.c vim.h protodef.h auto/config.h feature.h os_unix.h \
- auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
- proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/fileio.o: fileio.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/findfile.o: findfile.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h libvterm/include/vterm.h \
+ proto.h globals.h arabic.h libvterm/include/vterm.h \
  libvterm/include/vterm_keycodes.h
 objects/fold.o: fold.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/getchar.o: getchar.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/hardcopy.o: hardcopy.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/hashtab.o: hashtab.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/if_cscope.o: if_cscope.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h if_cscope.h
+ proto.h globals.h arabic.h if_cscope.h
 objects/if_xcmdsrv.o: if_xcmdsrv.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/indent.o: indent.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/json.o: json.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/list.o: list.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/main.o: main.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/mark.o: mark.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/memfile.o: memfile.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/memline.o: memline.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/menu.o: menu.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/message.o: message.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/misc1.o: misc1.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/misc2.o: misc2.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/move.o: move.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/mbyte.o: mbyte.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/normal.o: normal.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/ops.o: ops.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/option.o: option.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/os_unix.o: os_unix.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h os_unixx.h
+ proto.h globals.h arabic.h os_unixx.h
 objects/pathdef.o: auto/pathdef.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/popupmnu.o: popupmnu.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/pty.o: pty.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/quickfix.o: quickfix.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/regexp.o: regexp.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h regexp_nfa.c
+ proto.h globals.h arabic.h regexp_nfa.c
 objects/screen.o: screen.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/search.o: search.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/sha256.o: sha256.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/sign.o: sign.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/spell.o: spell.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/spellfile.o: spellfile.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/syntax.o: syntax.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/tag.o: tag.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/term.o: term.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h libvterm/include/vterm.h \
+ proto.h globals.h arabic.h libvterm/include/vterm.h \
  libvterm/include/vterm_keycodes.h
 objects/terminal.o: terminal.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h libvterm/include/vterm.h \
+ proto.h globals.h arabic.h libvterm/include/vterm.h \
  libvterm/include/vterm_keycodes.h
 objects/textprop.o: textprop.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/ui.o: ui.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/undo.o: undo.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/userfunc.o: userfunc.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/version.o: version.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/window.o: window.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/gui.o: gui.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/gui_gtk.o: gui_gtk.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h gui_gtk_f.h
+ proto.h globals.h arabic.h gui_gtk_f.h
 objects/gui_gtk_f.o: gui_gtk_f.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h gui_gtk_f.h
+ proto.h globals.h arabic.h gui_gtk_f.h
 objects/gui_motif.o: gui_motif.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h gui_xmebw.h ../pixmaps/alert.xpm \
+ proto.h globals.h arabic.h gui_xmebw.h ../pixmaps/alert.xpm \
  ../pixmaps/error.xpm ../pixmaps/generic.xpm ../pixmaps/info.xpm \
  ../pixmaps/quest.xpm gui_x11_pm.h ../pixmaps/tb_new.xpm \
  ../pixmaps/tb_open.xpm ../pixmaps/tb_close.xpm ../pixmaps/tb_save.xpm \
@@ -3696,15 +3686,15 @@ objects/gui_motif.o: gui_motif.c vim.h p
 objects/gui_xmdlg.o: gui_xmdlg.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/gui_xmebw.o: gui_xmebw.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h gui_xmebwp.h gui_xmebw.h
+ proto.h globals.h arabic.h gui_xmebwp.h gui_xmebw.h
 objects/gui_athena.o: gui_athena.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h gui_at_sb.h gui_x11_pm.h \
+ proto.h globals.h arabic.h gui_at_sb.h gui_x11_pm.h \
  ../pixmaps/tb_new.xpm ../pixmaps/tb_open.xpm ../pixmaps/tb_close.xpm \
  ../pixmaps/tb_save.xpm ../pixmaps/tb_print.xpm ../pixmaps/tb_cut.xpm \
  ../pixmaps/tb_copy.xpm ../pixmaps/tb_paste.xpm ../pixmaps/tb_find.xpm \
@@ -3723,85 +3713,85 @@ objects/gui_athena.o: gui_athena.c vim.h
 objects/gui_gtk_x11.o: gui_gtk_x11.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h auto/gui_gtk_gresources.h gui_gtk_f.h \
+ proto.h globals.h arabic.h auto/gui_gtk_gresources.h gui_gtk_f.h \
  ../runtime/vim32x32.xpm ../runtime/vim16x16.xpm ../runtime/vim48x48.xpm
 objects/gui_x11.o: gui_x11.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h ../runtime/vim32x32.xpm \
+ proto.h globals.h arabic.h ../runtime/vim32x32.xpm \
  ../runtime/vim16x16.xpm ../runtime/vim48x48.xpm
 objects/gui_at_sb.o: gui_at_sb.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h gui_at_sb.h
+ proto.h globals.h arabic.h gui_at_sb.h
 objects/gui_at_fs.o: gui_at_fs.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h gui_at_sb.h
+ proto.h globals.h arabic.h gui_at_sb.h
 objects/json_test.o: json_test.c main.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h json.c
+ proto.h globals.h arabic.h json.c
 objects/kword_test.o: kword_test.c main.c vim.h protodef.h auto/config.h \
  feature.h os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h \
  option.h beval.h proto/gui_beval.pro structs.h regexp.h gui.h alloc.h \
- ex_cmds.h spell.h proto.h globals.h farsi.h arabic.h charset.c
+ ex_cmds.h spell.h proto.h globals.h arabic.h charset.c
 objects/memfile_test.o: memfile_test.c main.c vim.h protodef.h auto/config.h \
  feature.h os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h \
  option.h beval.h proto/gui_beval.pro structs.h regexp.h gui.h alloc.h \
- ex_cmds.h spell.h proto.h globals.h farsi.h arabic.h memfile.c
+ ex_cmds.h spell.h proto.h globals.h arabic.h memfile.c
 objects/message_test.o: message_test.c main.c vim.h protodef.h auto/config.h \
  feature.h os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h \
  option.h beval.h proto/gui_beval.pro structs.h regexp.h gui.h alloc.h \
- ex_cmds.h spell.h proto.h globals.h farsi.h arabic.h message.c
+ ex_cmds.h spell.h proto.h globals.h arabic.h message.c
 objects/hangulin.o: hangulin.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/if_lua.o: if_lua.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/if_mzsch.o: if_mzsch.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h if_mzsch.h
+ proto.h globals.h arabic.h if_mzsch.h
 objects/if_perl.o: auto/if_perl.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/if_perlsfio.o: if_perlsfio.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/if_python.o: if_python.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h if_py_both.h
+ proto.h globals.h arabic.h if_py_both.h
 objects/if_python3.o: if_python3.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h if_py_both.h
+ proto.h globals.h arabic.h if_py_both.h
 objects/if_tcl.o: if_tcl.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/if_ruby.o: if_ruby.c protodef.h auto/config.h vim.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/gui_beval.o: gui_beval.c vim.h protodef.h auto/config.h feature.h \
  os_unix.h auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/netbeans.o: netbeans.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h version.h
+ proto.h globals.h arabic.h version.h
 objects/channel.o: channel.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
- proto.h globals.h farsi.h arabic.h
+ proto.h globals.h arabic.h
 objects/gui_gtk_gresources.o: auto/gui_gtk_gresources.c
 objects/encoding.o: libvterm/src/encoding.c libvterm/src/vterm_internal.h \
  libvterm/include/vterm.h libvterm/include/vterm_keycodes.h \
@@ -3833,7 +3823,7 @@ objects/xdiffi.o: xdiff/xdiffi.c xdiff/x
  macros.h option.h beval.h proto/gui_beval.pro \
  structs.h regexp.h gui.h alloc.h \
  ex_cmds.h spell.h proto.h globals.h \
- farsi.h arabic.h xdiff/xtypes.h xdiff/xutils.h \
+ arabic.h xdiff/xtypes.h xdiff/xutils.h \
  xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
 objects/xemit.o: xdiff/xemit.c xdiff/xinclude.h auto/config.h \
  xdiff/xmacros.h xdiff/xdiff.h vim.h protodef.h \
@@ -3842,7 +3832,7 @@ objects/xemit.o: xdiff/xemit.c xdiff/xin
  macros.h option.h beval.h proto/gui_beval.pro \
  structs.h regexp.h gui.h alloc.h \
  ex_cmds.h spell.h proto.h globals.h \
- farsi.h arabic.h xdiff/xtypes.h xdiff/xutils.h \
+ arabic.h xdiff/xtypes.h xdiff/xutils.h \
  xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
 objects/xprepare.o: xdiff/xprepare.c xdiff/xinclude.h auto/config.h \
  xdiff/xmacros.h xdiff/xdiff.h vim.h protodef.h \
@@ -3851,7 +3841,7 @@ objects/xprepare.o: xdiff/xprepare.c xdi
  macros.h option.h beval.h proto/gui_beval.pro \
  structs.h regexp.h gui.h alloc.h \
  ex_cmds.h spell.h proto.h globals.h \
- farsi.h arabic.h xdiff/xtypes.h xdiff/xutils.h \
+ arabic.h xdiff/xtypes.h xdiff/xutils.h \
  xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
 objects/xutils.o: xdiff/xutils.c xdiff/xinclude.h auto/config.h \
  xdiff/xmacros.h xdiff/xdiff.h vim.h protodef.h \
@@ -3860,7 +3850,7 @@ objects/xutils.o: xdiff/xutils.c xdiff/x
  macros.h option.h beval.h proto/gui_beval.pro \
  structs.h regexp.h gui.h alloc.h \
  ex_cmds.h spell.h proto.h globals.h \
- farsi.h arabic.h xdiff/xtypes.h xdiff/xutils.h \
+ arabic.h xdiff/xtypes.h xdiff/xutils.h \
  xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
 objects/xhistogram.o: xdiff/xhistogram.c xdiff/xinclude.h auto/config.h \
  xdiff/xmacros.h xdiff/xdiff.h vim.h protodef.h \
@@ -3869,7 +3859,7 @@ objects/xhistogram.o: xdiff/xhistogram.c
  macros.h option.h beval.h proto/gui_beval.pro \
  structs.h regexp.h gui.h alloc.h \
  ex_cmds.h spell.h proto.h globals.h \
- farsi.h arabic.h xdiff/xtypes.h xdiff/xutils.h \
+ arabic.h xdiff/xtypes.h xdiff/xutils.h \
  xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
 objects/xpatience.o: xdiff/xpatience.c xdiff/xinclude.h auto/config.h \
  xdiff/xmacros.h xdiff/xdiff.h vim.h protodef.h \
@@ -3878,5 +3868,5 @@ objects/xpatience.o: xdiff/xpatience.c x
  macros.h option.h beval.h proto/gui_beval.pro \
  structs.h regexp.h gui.h alloc.h \
  ex_cmds.h spell.h proto.h globals.h \
- farsi.h arabic.h xdiff/xtypes.h xdiff/xutils.h \
+ arabic.h xdiff/xtypes.h xdiff/xutils.h \
  xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -1498,7 +1498,7 @@ Optional Features:
   --enable-multibyte      Include multibyte editing support.
   --disable-rightleft     Do not include Right-to-Left language support.
   --disable-arabic        Do not include Arabic language support.
-  --disable-farsi         Do not include Farsi language support.
+  --disable-farsi         Deprecated.
   --enable-hangulinput    Include Hangul input support.
   --enable-xim            Include XIM input support.
   --enable-fontset        Include X fontset output support.
@@ -7980,24 +7980,11 @@ else
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking --disable-farsi argument" >&5
-$as_echo_n "checking --disable-farsi argument... " >&6; }
 # Check whether --enable-farsi was given.
 if test "${enable_farsi+set}" = set; then :
   enableval=$enable_farsi;
-else
-  enable_farsi="yes"
-fi
-
-if test "$enable_farsi" = "yes"; then
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-else
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-	$as_echo "#define DISABLE_FARSI 1" >>confdefs.h
-
-fi
+fi
+
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-hangulinput argument" >&5
 $as_echo_n "checking --enable-hangulinput argument... " >&6; }
--- a/src/charset.c
+++ b/src/charset.c
@@ -98,13 +98,6 @@ buf_init_chartab(
 	while (c <= '~')
 #endif
 	    g_chartab[c++] = 1 + CT_PRINT_CHAR;
-#ifdef FEAT_FKMAP
-	if (p_altkeymap)
-	{
-	    while (c < YE)
-		g_chartab[c++] = 1 + CT_PRINT_CHAR;
-	}
-#endif
 	while (c < 256)
 	{
 	    /* UTF-8: bytes 0xa0 - 0xff are printable (latin1) */
@@ -218,11 +211,7 @@ buf_init_chartab(
 		/* Use the MB_ functions here, because isalpha() doesn't
 		 * work properly when 'encoding' is "latin1" and the locale is
 		 * "C".  */
-		if (!do_isalpha || MB_ISLOWER(c) || MB_ISUPPER(c)
-#ifdef FEAT_FKMAP
-			|| (p_altkeymap && (F_isalpha(c) || F_isdigit(c)))
-#endif
-			    )
+		if (!do_isalpha || MB_ISLOWER(c) || MB_ISUPPER(c))
 		{
 		    if (i == 0)			/* (re)set ID flag */
 		    {
@@ -237,10 +226,6 @@ buf_init_chartab(
 #ifndef EBCDIC
 				    || c > '~'
 #endif
-#ifdef FEAT_FKMAP
-				    || (p_altkeymap
-					&& (F_isalpha(c) || F_isdigit(c)))
-#endif
 				// For double-byte we keep the cell width, so
 				// that we can detect it from the first byte.
 			    ) && !(enc_dbcs && MB_BYTE2LEN(c) == 2))
@@ -540,9 +525,6 @@ transchar(int c)
 #else
 		    (c >= ' ' && c <= '~')
 #endif
-#ifdef FEAT_FKMAP
-			|| (p_altkeymap && F_ischar(c))
-#endif
 		)) || (c < 256 && vim_isprintc_strict(c)))
     {
 	/* printable character */
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -391,9 +391,6 @@
 /* Define if you don't want to include right-left support. */
 #undef DISABLE_RIGHTLEFT
 
-/* Define if you don't want to include Farsi support. */
-#undef DISABLE_FARSI
-
 /* Define if you don't want to include Arabic support. */
 #undef DISABLE_ARABIC
 
--- a/src/configure.ac
+++ b/src/configure.ac
@@ -2155,18 +2155,9 @@ else
 	AC_DEFINE(DISABLE_ARABIC)
 fi
 
-dnl Farsi language support for vim will be included with big features,
-dnl unless ENABLE_FARSI is undefined.
-AC_MSG_CHECKING(--disable-farsi argument)
+dnl Farsi language support has been removed, ignore --disable-farsi
 AC_ARG_ENABLE(farsi,
-	[  --disable-farsi         Do not include Farsi language support.],
-	, [enable_farsi="yes"])
-if test "$enable_farsi" = "yes"; then
-	AC_MSG_RESULT(no)
-else
-	AC_MSG_RESULT(yes)
-	AC_DEFINE(DISABLE_FARSI)
-fi
+	[  --disable-farsi         Deprecated.],,)
 
 AC_MSG_CHECKING(--enable-hangulinput argument)
 AC_ARG_ENABLE(hangulinput,
--- a/src/edit.c
+++ b/src/edit.c
@@ -467,15 +467,6 @@ edit(
 
     if (cmdchar == 'R')
     {
-#ifdef FEAT_FKMAP
-	if (p_fkmap && p_ri)
-	{
-	    beep_flush();
-	    emsg(farsi_text_3);	    /* encoded in Farsi */
-	    State = INSERT;
-	}
-	else
-#endif
 	State = REPLACE;
     }
     else if (cmdchar == 'V' || cmdchar == 'v')
@@ -812,10 +803,6 @@ edit(
 	if (p_hkmap && KeyTyped)
 	    c = hkmap(c);		/* Hebrew mode mapping */
 #endif
-#ifdef FEAT_FKMAP
-	if (p_fkmap && KeyTyped)
-	    c = fkmap(c);		/* Farsi mode mapping */
-#endif
 
 #ifdef FEAT_INS_EXPAND
 	/*
@@ -6281,9 +6268,6 @@ insertchar(
 		&& !ISSPECIAL(c)
 		&& (!has_mbyte || MB_BYTE2LEN_CHECK(c) == 1)
 		&& i < INPUT_BUFLEN
-# ifdef FEAT_FKMAP
-		&& !(p_fkmap && KeyTyped) /* Farsi mode mapping moves cursor */
-# endif
 		&& (textwidth == 0
 		    || (virtcol += byte2cells(buf[i - 1])) < (colnr_T)textwidth)
 		&& !(!no_abbr && !vim_iswordc(c) && vim_iswordc(buf[i - 1])))
@@ -8406,23 +8390,7 @@ ins_ctrl_(void)
     }
     else
 	revins_scol = -1;
-#ifdef FEAT_FKMAP
-    if (p_altkeymap)
-    {
-	/*
-	 * to be consistent also for redo command, using '.'
-	 * set arrow_used to true and stop it - causing to redo
-	 * characters entered in one mode (normal/reverse insert).
-	 */
-	arrow_used = TRUE;
-	(void)stop_arrow();
-	p_fkmap = curwin->w_p_rl ^ p_ri;
-	if (p_fkmap && p_ri)
-	    State = INSERT;
-    }
-    else
-#endif
-	p_hkmap = curwin->w_p_rl ^ p_ri;    /* be consistent! */
+    p_hkmap = curwin->w_p_rl ^ p_ri;    // be consistent!
     showmode();
 }
 #endif
@@ -8488,21 +8456,12 @@ ins_start_select(int c)
     static void
 ins_insert(int replaceState)
 {
-#ifdef FEAT_FKMAP
-    if (p_fkmap && p_ri)
-    {
-	beep_flush();
-	emsg(farsi_text_3);	/* encoded in Farsi */
-	return;
-    }
-#endif
-
-# ifdef FEAT_EVAL
+#ifdef FEAT_EVAL
     set_vim_var_string(VV_INSERTMODE,
 		   (char_u *)((State & REPLACE_FLAG) ? "i"
 		          : replaceState == VREPLACE ? "v"
 						     : "r"), 1);
-# endif
+#endif
     ins_apply_autocmds(EVENT_INSERTCHANGE);
     if (State & REPLACE_FLAG)
 	State = INSERT | (State & LANGMAP);
@@ -9916,10 +9875,6 @@ ins_eol(int c)
 	coladvance(getviscol());
 
 #ifdef FEAT_RIGHTLEFT
-# ifdef FEAT_FKMAP
-    if (p_altkeymap && p_fkmap)
-	fkmap(NL);
-# endif
     /* NL in reverse insert will always start in the end of
      * current line. */
     if (revins_on)
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -6268,9 +6268,6 @@ f_has(typval_T *argvars, typval_T *rettv
 #ifdef FEAT_SEARCH_EXTRA
 	"extra_search",
 #endif
-#ifdef FEAT_FKMAP
-	"farsi",
-#endif
 #ifdef FEAT_SEARCHPATH
 	"file_in_path",
 #endif
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -4911,10 +4911,6 @@ do_sub(exarg_T *eap)
 	}
 	else		/* find the end of the regexp */
 	{
-#ifdef FEAT_FKMAP	/* reverse the flow of the Farsi characters */
-	    if (p_altkeymap && curwin->w_p_rl)
-		lrF_sub(cmd);
-#endif
 	    which_pat = RE_LAST;	    /* use last used regexp */
 	    delimiter = *cmd++;		    /* remember delimiter character */
 	    pat = cmd;			    /* remember start of search pat */
@@ -6070,11 +6066,6 @@ ex_global(exarg_T *eap)
 	    *cmd++ = NUL;		    /* replace it with a NUL */
     }
 
-#ifdef FEAT_FKMAP	/* when in Farsi mode, reverse the character flow */
-    if (p_altkeymap && curwin->w_p_rl)
-	lrFswap(pat,0);
-#endif
-
     if (search_regcomp(pat, RE_BOTH, which_pat, SEARCH_HIS, &regmatch) == FAIL)
     {
 	emsg(_(e_invcmd));
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -81,10 +81,6 @@ static int	hist_char2type(int c);
 static int	cmd_hkmap = 0;	/* Hebrew mapping during command line */
 #endif
 
-#ifdef FEAT_FKMAP
-static int	cmd_fkmap = 0;	/* Farsi mapping during command line */
-#endif
-
 static char_u	*getcmdline_int(int firstc, long count, int indent, int init_ccline);
 static int	cmdline_charsize(int idx);
 static void	set_cmdspos(void);
@@ -1043,10 +1039,6 @@ getcmdline_int(
 #ifdef FEAT_RIGHTLEFT
 	    if (cmd_hkmap)
 		c = hkmap(c);
-# ifdef FEAT_FKMAP
-	    if (cmd_fkmap)
-		c = cmdl_fkmap(c);
-# endif
 	    if (cmdmsg_rl && !KeyStuffed)
 	    {
 		/* Invert horizontal movements and operations.  Only when
@@ -1595,10 +1587,6 @@ getcmdline_int(
 	case K_DEL:
 	case K_KDEL:
 	case Ctrl_W:
-#ifdef FEAT_FKMAP
-		if (cmd_fkmap && c == K_BS)
-		    c = K_DEL;
-#endif
 		if (c == K_KDEL)
 		    c = K_DEL;
 
@@ -1694,13 +1682,6 @@ getcmdline_int(
 
 	case K_INS:
 	case K_KINS:
-#ifdef FEAT_FKMAP
-		/* if Farsi mode set, we are in reverse insert mode -
-		   Do not change the mode */
-		if (cmd_fkmap)
-		    beep_flush();
-		else
-#endif
 		ccline.overstrike = !ccline.overstrike;
 #ifdef CURSOR_SHAPE
 		ui_cursor_shape();	/* may show different cursor shape */
@@ -2309,16 +2290,7 @@ getcmdline_int(
 	case Ctrl__:	    /* CTRL-_: switch language mode */
 		if (!p_ari)
 		    break;
-# ifdef FEAT_FKMAP
-		if (p_altkeymap)
-		{
-		    cmd_fkmap = !cmd_fkmap;
-		    if (cmd_fkmap)	/* in Farsi always in Insert mode */
-			ccline.overstrike = FALSE;
-		}
-		else			    /* Hebrew is default */
-# endif
-		    cmd_hkmap = !cmd_hkmap;
+		cmd_hkmap = !cmd_hkmap;
 		goto cmdline_not_changed;
 #endif
 
@@ -2421,10 +2393,6 @@ returncmd:
     cmdmsg_rl = FALSE;
 #endif
 
-#ifdef FEAT_FKMAP
-    cmd_fkmap = 0;
-#endif
-
     ExpandCleanup(&xpc);
     ccline.xpc = NULL;
 
@@ -3463,44 +3431,35 @@ put_on_cmdline(char_u *str, int len, int
 		msg_clr_eos();
 	    msg_no_more = FALSE;
 	}
-#ifdef FEAT_FKMAP
-	/*
-	 * If we are in Farsi command mode, the character input must be in
-	 * Insert mode. So do not advance the cmdpos.
-	 */
-	if (!cmd_fkmap)
-#endif
+	if (KeyTyped)
+	{
+	    m = Columns * Rows;
+	    if (m < 0)	/* overflow, Columns or Rows at weird value */
+		m = MAXCOL;
+	}
+	else
+	    m = MAXCOL;
+	for (i = 0; i < len; ++i)
 	{
-	    if (KeyTyped)
-	    {
-		m = Columns * Rows;
-		if (m < 0)	/* overflow, Columns or Rows at weird value */
-		    m = MAXCOL;
-	    }
-	    else
-		m = MAXCOL;
-	    for (i = 0; i < len; ++i)
+	    c = cmdline_charsize(ccline.cmdpos);
+	    /* count ">" for a double-wide char that doesn't fit. */
+	    if (has_mbyte)
+		correct_cmdspos(ccline.cmdpos, c);
+	    /* Stop cursor at the end of the screen, but do increment the
+	     * insert position, so that entering a very long command
+	     * works, even though you can't see it. */
+	    if (ccline.cmdspos + c < m)
+		ccline.cmdspos += c;
+
+	    if (has_mbyte)
 	    {
-		c = cmdline_charsize(ccline.cmdpos);
-		/* count ">" for a double-wide char that doesn't fit. */
-		if (has_mbyte)
-		    correct_cmdspos(ccline.cmdpos, c);
-		/* Stop cursor at the end of the screen, but do increment the
-		 * insert position, so that entering a very long command
-		 * works, even though you can't see it. */
-		if (ccline.cmdspos + c < m)
-		    ccline.cmdspos += c;
-
-		if (has_mbyte)
-		{
-		    c = (*mb_ptr2len)(ccline.cmdbuff + ccline.cmdpos) - 1;
-		    if (c > len - i - 1)
-			c = len - i - 1;
-		    ccline.cmdpos += c;
-		    i += c;
-		}
-		++ccline.cmdpos;
+		c = (*mb_ptr2len)(ccline.cmdbuff + ccline.cmdpos) - 1;
+		if (c > len - i - 1)
+		    c = len - i - 1;
+		ccline.cmdpos += c;
+		i += c;
 	    }
+	    ++ccline.cmdpos;
 	}
     }
     if (redraw)
@@ -7126,35 +7085,6 @@ write_viminfo_history(FILE *fp, int merg
 }
 #endif /* FEAT_VIMINFO */
 
-#if defined(FEAT_FKMAP) || defined(PROTO)
-/*
- * Write a character at the current cursor+offset position.
- * It is directly written into the command buffer block.
- */
-    void
-cmd_pchar(int c, int offset)
-{
-    if (ccline.cmdpos + offset >= ccline.cmdlen || ccline.cmdpos + offset < 0)
-    {
-	emsg(_("E198: cmd_pchar beyond the command length"));
-	return;
-    }
-    ccline.cmdbuff[ccline.cmdpos + offset] = (char_u)c;
-    ccline.cmdbuff[ccline.cmdlen] = NUL;
-}
-
-    int
-cmd_gchar(int offset)
-{
-    if (ccline.cmdpos + offset >= ccline.cmdlen || ccline.cmdpos + offset < 0)
-    {
-	// emsg(_("cmd_gchar beyond the command length"));
-	return NUL;
-    }
-    return (int)ccline.cmdbuff[ccline.cmdpos + offset];
-}
-#endif
-
 #if defined(FEAT_CMDWIN) || defined(PROTO)
 /*
  * Open a window on the current command line and history.  Allow editing in
deleted file mode 100644
--- a/src/farsi.c
+++ /dev/null
@@ -1,2179 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4 noet:
- *
- * VIM - Vi IMproved	by Bram Moolenaar
- *
- * Do ":help uganda"  in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- * See README.txt for an overview of the Vim source code.
- */
-
-/*
- * farsi.c: functions for Farsi language
- */
-
-#include "vim.h"
-
-#if defined(FEAT_FKMAP) || defined(PROTO)
-
-static int F_is_TyB_TyC_TyD(int src, int offset);
-
-/*
- * Convert the given Farsi character into a _X or _X_ type
- */
-    static int
-toF_Xor_X_(int c)
-{
-    int tempc;
-
-    switch (c)
-    {
-	case BE: return _BE;
-	case PE: return _PE;
-	case TE: return _TE;
-	case SE: return _SE;
-	case JIM: return _JIM;
-	case CHE: return _CHE;
-	case HE_J: return _HE_J;
-	case XE: return _XE;
-	case SIN: return _SIN;
-	case SHIN: return _SHIN;
-	case SAD: return _SAD;
-	case ZAD: return _ZAD;
-	case AYN: return _AYN;
-	case AYN_: return _AYN_;
-	case GHAYN: return _GHAYN;
-	case GHAYN_: return _GHAYN_;
-	case FE: return _FE;
-	case GHAF: return _GHAF;
-	case KAF: return _KAF;
-	case GAF: return _GAF;
-	case LAM: return _LAM;
-	case MIM: return _MIM;
-	case NOON: return _NOON;
-	case YE:
-	case YE_: return _YE;
-	case YEE:
-	case YEE_: return _YEE;
-	case IE:
-	case IE_: return _IE;
-	case F_HE:
-		tempc = _HE;
-
-		if (p_ri && (curwin->w_cursor.col + 1
-					 < (colnr_T)STRLEN(ml_get_curline())))
-		{
-		    inc_cursor();
-
-		    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-			tempc = _HE_;
-
-		    dec_cursor();
-		}
-		if (!p_ri && STRLEN(ml_get_curline()))
-		{
-		    dec_cursor();
-
-		    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-			tempc = _HE_;
-
-		    inc_cursor();
-		}
-
-		return tempc;
-    }
-    return 0;
-}
-
-/*
- * Convert the given Farsi character into Farsi capital character.
- */
-    static int
-toF_TyA(int c)
-{
-    switch (c)
-    {
-	case ALEF_: return ALEF;
-	case ALEF_U_H_: return ALEF_U_H;
-	case _BE: return BE;
-	case _PE: return PE;
-	case _TE: return TE;
-	case _SE: return SE;
-	case _JIM: return JIM;
-	case _CHE: return CHE;
-	case _HE_J: return HE_J;
-	case _XE: return XE;
-	case _SIN: return SIN;
-	case _SHIN: return SHIN;
-	case _SAD: return SAD;
-	case _ZAD: return ZAD;
-	case _AYN:
-	case AYN_:
-	case _AYN_: return AYN;
-	case _GHAYN:
-	case GHAYN_:
-	case _GHAYN_: return GHAYN;
-	case _FE: return FE;
-	case _GHAF: return GHAF;
-	/* I am not sure what it is !!!	    case _KAF_H: */
-	case _KAF: return KAF;
-	case _GAF: return GAF;
-	case _LAM: return LAM;
-	case _MIM: return MIM;
-	case _NOON: return NOON;
-	case _YE:
-	case YE_: return YE;
-	case _YEE:
-	case YEE_: return YEE;
-	case TEE_: return TEE;
-	case _IE:
-	case IE_: return IE;
-	case _HE:
-	case _HE_: return F_HE;
-    }
-    return c;
-}
-
-/*
- * Is the character under the cursor+offset in the given buffer a join type.
- * That is a character that is combined with the others.
- * Note: the offset is used only for command line buffer.
- */
-    static int
-F_is_TyB_TyC_TyD(int src, int offset)
-{
-    int		c;
-
-    if (src == SRC_EDT)
-	c = gchar_cursor();
-    else
-	c = cmd_gchar(AT_CURSOR+offset);
-
-    switch (c)
-    {
-	case _LAM:
-	case _BE:
-	case _PE:
-	case _TE:
-	case _SE:
-	case _JIM:
-	case _CHE:
-	case _HE_J:
-	case _XE:
-	case _SIN:
-	case _SHIN:
-	case _SAD:
-	case _ZAD:
-	case _TA:
-	case _ZA:
-	case _AYN:
-	case _AYN_:
-	case _GHAYN:
-	case _GHAYN_:
-	case _FE:
-	case _GHAF:
-	case _KAF:
-	case _KAF_H:
-	case _GAF:
-	case _MIM:
-	case _NOON:
-	case _YE:
-	case _YEE:
-	case _IE:
-	case _HE_:
-	case _HE:
-		return TRUE;
-    }
-    return FALSE;
-}
-
-/*
- * Is the Farsi character one of the terminating only type.
- */
-    static int
-F_is_TyE(int c)
-{
-    switch (c)
-    {
-	case ALEF_A:
-	case ALEF_D_H:
-	case DAL:
-	case ZAL:
-	case RE:
-	case ZE:
-	case JE:
-	case WAW:
-	case WAW_H:
-	case HAMZE:
-		return TRUE;
-    }
-    return FALSE;
-}
-
-/*
- * Is the Farsi character one of the none leading type.
- */
-    static int
-F_is_TyC_TyD(int c)
-{
-    switch (c)
-    {
-	case ALEF_:
-	case ALEF_U_H_:
-	case _AYN_:
-	case AYN_:
-	case _GHAYN_:
-	case GHAYN_:
-	case _HE_:
-	case YE_:
-	case IE_:
-	case TEE_:
-	case YEE_:
-		return TRUE;
-    }
-    return FALSE;
-}
-
-/*
- * Convert a none leading Farsi char into a leading type.
- */
-    static int
-toF_TyB(int c)
-{
-    switch (c)
-    {
-	case ALEF_:	return ALEF;
-	case ALEF_U_H_:	return ALEF_U_H;
-	case _AYN_:	return _AYN;
-	case AYN_:	return AYN;	/* exception - there are many of them */
-	case _GHAYN_:	return _GHAYN;
-	case GHAYN_:	return GHAYN;	/* exception - there are many of them */
-	case _HE_:	return _HE;
-	case YE_:	return YE;
-	case IE_:	return IE;
-	case TEE_:	return TEE;
-	case YEE_:	return YEE;
-    }
-    return c;
-}
-
-
-    static void
-put_and_redo(int c)
-{
-    pchar_cursor(c);
-    AppendCharToRedobuff(K_BS);
-    AppendCharToRedobuff(c);
-}
-
-/*
- * Overwrite the current redo and cursor characters + left adjust.
- */
-    static void
-put_curr_and_l_to_X(int c)
-{
-    int	tempc;
-
-    if (curwin->w_p_rl && p_ri)
-	return;
-
-    if ((curwin->w_cursor.col < (colnr_T)STRLEN(ml_get_curline())))
-    {
-	if ((p_ri && curwin->w_cursor.col) || !p_ri)
-	{
-	    if (p_ri)
-		dec_cursor();
-	    else
-		inc_cursor();
-
-	    if (F_is_TyC_TyD((tempc = gchar_cursor())))
-	    {
-		pchar_cursor(toF_TyB(tempc));
-		AppendCharToRedobuff(K_BS);
-		AppendCharToRedobuff(tempc);
-	    }
-
-	    if (p_ri)
-		inc_cursor();
-	    else
-		dec_cursor();
-	}
-    }
-
-    put_and_redo(c);
-}
-
-/*
- * Change the char. under the cursor to a X_ or X type
- */
-    static void
-chg_c_toX_orX(void)
-{
-    int	tempc, curc;
-
-    switch ((curc = gchar_cursor()))
-    {
-	case _BE:
-		tempc = BE;
-		break;
-	case _PE:
-		tempc = PE;
-		break;
-	case _TE:
-		tempc = TE;
-		break;
-	case _SE:
-		tempc = SE;
-		break;
-	case _JIM:
-		tempc = JIM;
-		break;
-	case _CHE:
-		tempc = CHE;
-		break;
-	case _HE_J:
-		tempc = HE_J;
-		break;
-	case _XE:
-		tempc = XE;
-		break;
-	case _SIN:
-		tempc = SIN;
-		break;
-	case _SHIN:
-		tempc = SHIN;
-		break;
-	case _SAD:
-		tempc = SAD;
-		break;
-	case _ZAD:
-		tempc = ZAD;
-		break;
-	case _FE:
-		tempc = FE;
-		break;
-	case _GHAF:
-		tempc = GHAF;
-		break;
-	case _KAF_H:
-	case _KAF:
-		tempc = KAF;
-		break;
-	case _GAF:
-		tempc = GAF;
-		break;
-	case _AYN:
-		tempc = AYN;
-		break;
-	case _AYN_:
-		tempc = AYN_;
-		break;
-	case _GHAYN:
-		tempc = GHAYN;
-		break;
-	case _GHAYN_:
-		tempc = GHAYN_;
-		break;
-	case _LAM:
-		tempc = LAM;
-		break;
-	case _MIM:
-		tempc = MIM;
-		break;
-	case _NOON:
-		tempc = NOON;
-		break;
-	case _HE:
-	case _HE_:
-		tempc = F_HE;
-		break;
-	case _YE:
-	case _IE:
-	case _YEE:
-		if (p_ri)
-		{
-		    inc_cursor();
-		    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-			    tempc = (curc == _YE ? YE_ :
-			    (curc == _IE ? IE_ : YEE_));
-		    else
-			    tempc = (curc == _YE ? YE :
-			    (curc == _IE ? IE : YEE));
-		    dec_cursor();
-		}
-		else
-		{
-		    if (curwin->w_cursor.col)
-		    {
-			dec_cursor();
-			if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-				tempc = (curc == _YE ? YE_ :
-				(curc == _IE ? IE_ : YEE_));
-			else
-				tempc = (curc == _YE ? YE :
-				(curc == _IE ? IE : YEE));
-			inc_cursor();
-		    }
-		    else
-			    tempc = (curc == _YE ? YE :
-			    (curc == _IE ? IE : YEE));
-		}
-		break;
-	default:
-		tempc = 0;
-    }
-
-    if (tempc)
-	put_and_redo(tempc);
-}
-
-/*
- * Change the char. under the cursor to a _X_ or X_ type
- */
-    static void
-chg_c_to_X_orX_(void)
-{
-    int	tempc;
-
-    switch (gchar_cursor())
-    {
-	case ALEF:
-		tempc = ALEF_;
-		break;
-	case ALEF_U_H:
-		tempc = ALEF_U_H_;
-		break;
-	case _AYN:
-		tempc = _AYN_;
-		break;
-	case AYN:
-		tempc = AYN_;
-		break;
-	case _GHAYN:
-		tempc = _GHAYN_;
-		break;
-	case GHAYN:
-		tempc = GHAYN_;
-		break;
-	case _HE:
-		tempc = _HE_;
-		break;
-	case YE:
-		tempc = YE_;
-		break;
-	case IE:
-		tempc = IE_;
-		break;
-	case TEE:
-		tempc = TEE_;
-		break;
-	case YEE:
-		tempc = YEE_;
-		break;
-	default:
-		tempc = 0;
-    }
-
-    if (tempc)
-	put_and_redo(tempc);
-}
-
-/*
- * Change the char. under the cursor to a _X_ or _X type
- */
-    static void
-chg_c_to_X_or_X(void)
-{
-    int	tempc;
-
-    tempc = gchar_cursor();
-
-    if (curwin->w_cursor.col + 1 < (colnr_T)STRLEN(ml_get_curline()))
-    {
-	inc_cursor();
-
-	if ((tempc == F_HE) && (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)))
-	{
-	    tempc = _HE_;
-
-	    dec_cursor();
-
-	    put_and_redo(tempc);
-	    return;
-	}
-
-	dec_cursor();
-    }
-
-    if ((tempc = toF_Xor_X_(tempc)) != 0)
-	put_and_redo(tempc);
-}
-
-/*
- * Change the character left to the cursor to a _X_ or X_ type
- */
-    static void
-chg_l_to_X_orX_(void)
-{
-    int	tempc;
-
-    if (curwin->w_cursor.col != 0 &&
-	(curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
-	return;
-
-    if (!curwin->w_cursor.col && p_ri)
-	return;
-
-    if (p_ri)
-	dec_cursor();
-    else
-	inc_cursor();
-
-    switch (gchar_cursor())
-    {
-	case ALEF:
-		tempc = ALEF_;
-		break;
-	case ALEF_U_H:
-		tempc = ALEF_U_H_;
-		break;
-	case _AYN:
-		tempc = _AYN_;
-		break;
-	case AYN:
-		tempc = AYN_;
-		break;
-	case _GHAYN:
-		tempc = _GHAYN_;
-		break;
-	case GHAYN:
-		tempc = GHAYN_;
-		break;
-	case _HE:
-		tempc = _HE_;
-		break;
-	case YE:
-		tempc = YE_;
-		break;
-	case IE:
-		tempc = IE_;
-		break;
-	case TEE:
-		tempc = TEE_;
-		break;
-	case YEE:
-		tempc = YEE_;
-		break;
-	default:
-		tempc = 0;
-    }
-
-    if (tempc)
-	put_and_redo(tempc);
-
-    if (p_ri)
-	inc_cursor();
-    else
-	dec_cursor();
-}
-
-/*
- * Change the character left to the cursor to a X or _X type
- */
-    static void
-chg_l_toXor_X(void)
-{
-    int	tempc;
-
-    if (curwin->w_cursor.col != 0 &&
-	(curwin->w_cursor.col + 1 == (colnr_T)STRLEN(ml_get_curline())))
-	return;
-
-    if (!curwin->w_cursor.col && p_ri)
-	return;
-
-    if (p_ri)
-	dec_cursor();
-    else
-	inc_cursor();
-
-    switch (gchar_cursor())
-    {
-	case ALEF_:
-		tempc = ALEF;
-		break;
-	case ALEF_U_H_:
-		tempc = ALEF_U_H;
-		break;
-	case _AYN_:
-		tempc = _AYN;
-		break;
-	case AYN_:
-		tempc = AYN;
-		break;
-	case _GHAYN_:
-		tempc = _GHAYN;
-		break;
-	case GHAYN_:
-		tempc = GHAYN;
-		break;
-	case _HE_:
-		tempc = _HE;
-		break;
-	case YE_:
-		tempc = YE;
-		break;
-	case IE_:
-		tempc = IE;
-		break;
-	case TEE_:
-		tempc = TEE;
-		break;
-	case YEE_:
-		tempc = YEE;
-		break;
-	default:
-		tempc = 0;
-    }
-
-    if (tempc)
-	put_and_redo(tempc);
-
-    if (p_ri)
-	inc_cursor();
-    else
-	dec_cursor();
-}
-
-/*
- * Change the character right to the cursor to a _X or _X_ type
- */
-    static void
-chg_r_to_Xor_X_(void)
-{
-    int tempc, c;
-
-    if (curwin->w_cursor.col)
-    {
-	if (!p_ri)
-	    dec_cursor();
-
-	tempc = gchar_cursor();
-
-	if ((c = toF_Xor_X_(tempc)) != 0)
-	    put_and_redo(c);
-
-	if (!p_ri)
-	    inc_cursor();
-
-    }
-}
-
-/*
- * Map Farsi keyboard when in fkmap mode.
- */
-    int
-fkmap(int c)
-{
-    int		tempc;
-    int		insert_mode = (State & INSERT);
-    static int	revins = 0;
-
-    if (IS_SPECIAL(c))
-	return c;
-
-    if (insert_mode)
-    {
-	if (VIM_ISDIGIT(c) || ((c == '.' || c == '+' || c == '-' ||
-	    c == '^' || c == '%' || c == '#' || c == '=') && revins))
-	{
-	    /* Numbers are entered left-to-right. */
-	    if (!revins)
-	    {
-		if (curwin->w_cursor.col)
-		{
-		    if (!p_ri)
-			dec_cursor();
-
-		    chg_c_toX_orX ();
-		    chg_l_toXor_X ();
-
-		    if (!p_ri)
-			inc_cursor();
-		}
-	    }
-
-	    arrow_used = TRUE;
-	    (void)stop_arrow();
-
-	    if (!curwin->w_p_rl && revins)
-		inc_cursor();
-
-	    ++revins;
-	    p_ri = 1;
-	}
-	else if (revins)
-	{
-	    /* Stop entering number. */
-	    arrow_used = TRUE;
-	    (void)stop_arrow();
-
-	    revins = 0;
-	    if (curwin->w_p_rl)
-	    {
-		while ((F_isdigit(gchar_cursor())
-			    || (gchar_cursor() == F_PERIOD
-				|| gchar_cursor() == F_PLUS
-				|| gchar_cursor() == F_MINUS
-				|| gchar_cursor() == F_MUL
-				|| gchar_cursor() == F_DIVIDE
-				|| gchar_cursor() == F_PERCENT
-				|| gchar_cursor() == F_EQUALS))
-			&& gchar_cursor() != NUL)
-		    ++curwin->w_cursor.col;
-	    }
-	    else
-	    {
-		if (curwin->w_cursor.col)
-		    while ((F_isdigit(gchar_cursor())
-			    || (gchar_cursor() == F_PERIOD
-				|| gchar_cursor() == F_PLUS
-				|| gchar_cursor() == F_MINUS
-				|| gchar_cursor() == F_MUL
-				|| gchar_cursor() == F_DIVIDE
-				|| gchar_cursor() == F_PERCENT
-				|| gchar_cursor() == F_EQUALS))
-			    && --curwin->w_cursor.col)
-			;
-
-		if (!F_isdigit(gchar_cursor()))
-		    ++curwin->w_cursor.col;
-	    }
-	}
-    }
-
-    if (!revins)
-    {
-	if (curwin->w_p_rl)
-	    p_ri = 0;
-	if (!curwin->w_p_rl)
-	    p_ri = 1;
-    }
-
-    if ((c < 0x100) && (isalpha(c) || c == '&' || c == '^' ||	c == ';' ||
-			    c == '\''||	c == ',' || c == '[' ||
-			    c == ']' ||	c == '{' || c == '}'))
-	chg_r_to_Xor_X_();
-
-    tempc = 0;
-
-    switch (c)
-    {
-	case '`':
-	case ' ':
-	case '.':
-	case '!':
-	case '"':
-	case '$':
-	case '%':
-	case '^':
-	case '&':
-	case '/':
-	case '(':
-	case ')':
-	case '=':
-	case '\\':
-	case '?':
-	case '+':
-	case '-':
-	case '_':
-	case '*':
-	case ':':
-	case '#':
-	case '~':
-	case '@':
-	case '<':
-	case '>':
-	case '{':
-	case '}':
-	case '|':
-	case '0':
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':
-	case 'B':
-	case 'E':
-	case 'F':
-	case 'H':
-	case 'I':
-	case 'K':
-	case 'L':
-	case 'M':
-	case 'O':
-	case 'P':
-	case 'Q':
-	case 'R':
-	case 'T':
-	case 'U':
-	case 'W':
-	case 'Y':
-	case  NL:
-	case  TAB:
-
-	    if (p_ri && c == NL && curwin->w_cursor.col && insert_mode)
-	    {
-		/*
-		 * If the char before the cursor is _X_ or X_ do not change
-		 * the one under the cursor with X type.
-		 */
-		dec_cursor();
-
-		if (F_isalpha(gchar_cursor()))
-		{
-		    inc_cursor();
-		    return NL;
-		}
-
-		inc_cursor();
-	    }
-
-	    if (!p_ri && !curwin->w_cursor.col)
-	    {
-		switch (c)
-		{
-		    case '0':	return FARSI_0;
-		    case '1':	return FARSI_1;
-		    case '2':	return FARSI_2;
-		    case '3':	return FARSI_3;
-		    case '4':	return FARSI_4;
-		    case '5':	return FARSI_5;
-		    case '6':	return FARSI_6;
-		    case '7':	return FARSI_7;
-		    case '8':	return FARSI_8;
-		    case '9':	return FARSI_9;
-		    case 'B':	return F_PSP;
-		    case 'E':	return JAZR_N;
-		    case 'F':	return ALEF_D_H;
-		    case 'H':	return ALEF_A;
-		    case 'I':	return TASH;
-		    case 'K':	return F_LQUOT;
-		    case 'L':	return F_RQUOT;
-		    case 'M':	return HAMZE;
-		    case 'O':	return '[';
-		    case 'P':	return ']';
-		    case 'Q':	return OO;
-		    case 'R':	return MAD_N;
-		    case 'T':	return OW;
-		    case 'U':	return MAD;
-		    case 'W':	return OW_OW;
-		    case 'Y':	return JAZR;
-		    case '`':	return F_PCN;
-		    case '!':	return F_EXCL;
-		    case '@':	return F_COMMA;
-		    case '#':	return F_DIVIDE;
-		    case '$':	return F_CURRENCY;
-		    case '%':	return F_PERCENT;
-		    case '^':	return F_MUL;
-		    case '&':	return F_BCOMMA;
-		    case '*':	return F_STAR;
-		    case '(':	return F_LPARENT;
-		    case ')':	return F_RPARENT;
-		    case '-':	return F_MINUS;
-		    case '_':	return F_UNDERLINE;
-		    case '=':	return F_EQUALS;
-		    case '+':	return F_PLUS;
-		    case '\\':	return F_BSLASH;
-		    case '|':	return F_PIPE;
-		    case ':':	return F_DCOLON;
-		    case '"':	return F_SEMICOLON;
-		    case '.':	return F_PERIOD;
-		    case '/':	return F_SLASH;
-		    case '<':	return F_LESS;
-		    case '>':	return F_GREATER;
-		    case '?':	return F_QUESTION;
-		    case ' ':	return F_BLANK;
-		}
-		break;
-	    }
-
-	    if (insert_mode)
-	    {
-		if (!p_ri)
-		    dec_cursor();
-
-		switch ((tempc = gchar_cursor()))
-		{
-		    case _BE:
-		    case _PE:
-		    case _TE:
-		    case _SE:
-		    case _JIM:
-		    case _CHE:
-		    case _HE_J:
-		    case _XE:
-		    case _SIN:
-		    case _SHIN:
-		    case _SAD:
-		    case _ZAD:
-		    case _FE:
-		    case _GHAF:
-		    case _KAF:
-		    case _KAF_H:
-		    case _GAF:
-		    case _LAM:
-		    case _MIM:
-		    case _NOON:
-		    case _HE:
-		    case _HE_:
-		    case _TA:
-		    case _ZA:
-			    put_curr_and_l_to_X(toF_TyA(tempc));
-			    break;
-		    case _AYN:
-		    case _AYN_:
-
-			    if (!p_ri)
-				if (!curwin->w_cursor.col)
-				{
-				    put_curr_and_l_to_X(AYN);
-				    break;
-				}
-
-			    if (p_ri)
-				inc_cursor();
-			    else
-				dec_cursor();
-
-			    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-				tempc = AYN_;
-			    else
-				tempc = AYN;
-
-			    if (p_ri)
-				dec_cursor();
-			    else
-				inc_cursor();
-
-			    put_curr_and_l_to_X(tempc);
-
-			    break;
-		    case _GHAYN:
-		    case _GHAYN_:
-
-			    if (!p_ri)
-				if (!curwin->w_cursor.col)
-				{
-				    put_curr_and_l_to_X(GHAYN);
-				    break;
-				}
-
-			    if (p_ri)
-				inc_cursor();
-			    else
-				dec_cursor();
-
-			    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-				tempc = GHAYN_;
-			    else
-				tempc = GHAYN;
-
-			    if (p_ri)
-				dec_cursor();
-			    else
-				inc_cursor();
-
-			    put_curr_and_l_to_X(tempc);
-			    break;
-		    case _YE:
-		    case _IE:
-		    case _YEE:
-			    if (!p_ri)
-				if (!curwin->w_cursor.col)
-				{
-				    put_curr_and_l_to_X((tempc == _YE ? YE :
-						(tempc == _IE ? IE : YEE)));
-				    break;
-				}
-
-			    if (p_ri)
-				inc_cursor();
-			    else
-				dec_cursor();
-
-			    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-				    tempc = (tempc == _YE ? YE_ :
-					(tempc == _IE ? IE_ : YEE_));
-			    else
-				    tempc = (tempc == _YE ? YE :
-					(tempc == _IE ? IE : YEE));
-
-			    if (p_ri)
-				dec_cursor();
-			    else
-				inc_cursor();
-
-			    put_curr_and_l_to_X(tempc);
-			    break;
-		}
-
-		if (!p_ri)
-		    inc_cursor();
-	    }
-
-	    tempc = 0;
-
-	    switch (c)
-	    {
-		case '0':	return FARSI_0;
-		case '1':	return FARSI_1;
-		case '2':	return FARSI_2;
-		case '3':	return FARSI_3;
-		case '4':	return FARSI_4;
-		case '5':	return FARSI_5;
-		case '6':	return FARSI_6;
-		case '7':	return FARSI_7;
-		case '8':	return FARSI_8;
-		case '9':	return FARSI_9;
-		case 'B':	return F_PSP;
-		case 'E':	return JAZR_N;
-		case 'F':	return ALEF_D_H;
-		case 'H':	return ALEF_A;
-		case 'I':	return TASH;
-		case 'K':	return F_LQUOT;
-		case 'L':	return F_RQUOT;
-		case 'M':	return HAMZE;
-		case 'O':	return '[';
-		case 'P':	return ']';
-		case 'Q':	return OO;
-		case 'R':	return MAD_N;
-		case 'T':	return OW;
-		case 'U':	return MAD;
-		case 'W':	return OW_OW;
-		case 'Y':	return JAZR;
-		case '`':	return F_PCN;
-		case '!':	return F_EXCL;
-		case '@':	return F_COMMA;
-		case '#':	return F_DIVIDE;
-		case '$':	return F_CURRENCY;
-		case '%':	return F_PERCENT;
-		case '^':	return F_MUL;
-		case '&':	return F_BCOMMA;
-		case '*':	return F_STAR;
-		case '(':	return F_LPARENT;
-		case ')':	return F_RPARENT;
-		case '-':	return F_MINUS;
-		case '_':	return F_UNDERLINE;
-		case '=':	return F_EQUALS;
-		case '+':	return F_PLUS;
-		case '\\':	return F_BSLASH;
-		case '|':	return F_PIPE;
-		case ':':	return F_DCOLON;
-		case '"':	return F_SEMICOLON;
-		case '.':	return F_PERIOD;
-		case '/':	return F_SLASH;
-		case '<':	return F_LESS;
-		case '>':	return F_GREATER;
-		case '?':	return F_QUESTION;
-		case ' ':	return F_BLANK;
-	    }
-	    break;
-
-	case 'a':
-	    tempc = _SHIN;
-	    break;
-	case 'A':
-	    tempc = WAW_H;
-	    break;
-	case 'b':
-	    tempc = ZAL;
-	    break;
-	case 'c':
-	    tempc = ZE;
-	    break;
-	case 'C':
-	    tempc = JE;
-	    break;
-	case 'd':
-	    tempc = _YE;
-	    break;
-	case 'D':
-	    tempc = _YEE;
-	    break;
-	case 'e':
-	    tempc = _SE;
-	    break;
-	case 'f':
-	    tempc = _BE;
-	    break;
-	case 'g':
-	    tempc = _LAM;
-	    break;
-	case 'G':
-	    if (!curwin->w_cursor.col  &&  STRLEN(ml_get_curline()))
-	    {
-
-		if (gchar_cursor() == _LAM)
-		    chg_c_toX_orX ();
-		else if (p_ri)
-		    chg_c_to_X_or_X ();
-	    }
-
-	    if (!p_ri)
-		if (!curwin->w_cursor.col)
-		    return ALEF_U_H;
-
-	    if (!p_ri)
-		dec_cursor();
-
-	    if (gchar_cursor() == _LAM)
-	    {
-		chg_c_toX_orX ();
-		chg_l_toXor_X ();
-		tempc = ALEF_U_H;
-	    }
-	    else if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-	    {
-		tempc = ALEF_U_H_;
-		chg_l_toXor_X ();
-	    }
-	    else
-		tempc = ALEF_U_H;
-
-	    if (!p_ri)
-		inc_cursor();
-
-	    return tempc;
-	case 'h':
-	    if (!curwin->w_cursor.col  &&  STRLEN(ml_get_curline()))
-		{
-		if (p_ri)
-		    chg_c_to_X_or_X ();
-
-	    }
-
-	    if (!p_ri)
-		if (!curwin->w_cursor.col)
-		    return ALEF;
-
-	    if (!p_ri)
-		dec_cursor();
-
-	    if (gchar_cursor() == _LAM)
-	    {
-		chg_l_toXor_X();
-		del_char(FALSE);
-		AppendCharToRedobuff(K_BS);
-
-		if (!p_ri)
-		    dec_cursor();
-
-		tempc = LA;
-	    }
-	    else
-	    {
-		if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-		{
-		    tempc = ALEF_;
-		    chg_l_toXor_X ();
-		}
-		else
-		    tempc = ALEF;
-	    }
-
-	    if (!p_ri)
-		inc_cursor();
-
-	    return tempc;
-	case 'i':
-	    if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
-	    {
-		if (!p_ri && !F_is_TyE(tempc))
-		    chg_c_to_X_orX_ ();
-		if (p_ri)
-		    chg_c_to_X_or_X ();
-
-	    }
-
-	    if (!p_ri && !curwin->w_cursor.col)
-		return _HE;
-
-	    if (!p_ri)
-		dec_cursor();
-
-	    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-		tempc = _HE_;
-	    else
-		tempc = _HE;
-
-	    if (!p_ri)
-		inc_cursor();
-	    break;
-	case 'j':
-	    tempc = _TE;
-	    break;
-	case 'J':
-	    if (!curwin->w_cursor.col  &&  STRLEN(ml_get_curline()))
-	    {
-		if (p_ri)
-		    chg_c_to_X_or_X ();
-
-	    }
-
-	    if (!p_ri)
-		if (!curwin->w_cursor.col)
-		    return TEE;
-
-	    if (!p_ri)
-		dec_cursor();
-
-	    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-	    {
-		tempc = TEE_;
-		chg_l_toXor_X ();
-	    }
-	    else
-		tempc = TEE;
-
-	    if (!p_ri)
-		inc_cursor();
-
-	    return tempc;
-	case 'k':
-	    tempc = _NOON;
-	    break;
-	case 'l':
-	    tempc = _MIM;
-	    break;
-	case 'm':
-	    tempc = _PE;
-	    break;
-	case 'n':
-	case 'N':
-	    tempc = DAL;
-	    break;
-	case 'o':
-	    tempc = _XE;
-	    break;
-	case 'p':
-	    tempc = _HE_J;
-	    break;
-	case 'q':
-	    tempc = _ZAD;
-	    break;
-	case 'r':
-	    tempc = _GHAF;
-	    break;
-	case 's':
-	    tempc = _SIN;
-	    break;
-	case 'S':
-	    tempc = _IE;
-	    break;
-	case 't':
-	    tempc = _FE;
-	    break;
-	case 'u':
-	    if (!curwin->w_cursor.col  &&  STRLEN(ml_get_curline()))
-	    {
-		if (!p_ri && !F_is_TyE(tempc))
-		    chg_c_to_X_orX_ ();
-		if (p_ri)
-		    chg_c_to_X_or_X ();
-
-	    }
-
-	    if (!p_ri && !curwin->w_cursor.col)
-		return _AYN;
-
-	    if (!p_ri)
-		dec_cursor();
-
-	    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-		tempc = _AYN_;
-	    else
-		tempc = _AYN;
-
-	    if (!p_ri)
-		inc_cursor();
-	    break;
-	case 'v':
-	case 'V':
-	    tempc = RE;
-	    break;
-	case 'w':
-	    tempc = _SAD;
-	    break;
-	case 'x':
-	case 'X':
-	    tempc = _TA;
-	    break;
-	case 'y':
-	    if (!curwin->w_cursor.col  &&  STRLEN(ml_get_curline()))
-	    {
-		if (!p_ri && !F_is_TyE(tempc))
-		    chg_c_to_X_orX_ ();
-		if (p_ri)
-		    chg_c_to_X_or_X ();
-
-	    }
-
-	    if (!p_ri && !curwin->w_cursor.col)
-		return _GHAYN;
-
-	    if (!p_ri)
-		dec_cursor();
-
-	    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
-		tempc = _GHAYN_;
-	    else
-		tempc = _GHAYN;
-
-	    if (!p_ri)
-		inc_cursor();
-
-	    break;
-	case 'z':
-	    tempc = _ZA;
-	    break;
-	case 'Z':
-	    tempc = _KAF_H;
-	    break;
-	case ';':
-	    tempc = _KAF;
-	    break;
-	case '\'':
-	    tempc = _GAF;
-	    break;
-	case ',':
-	    tempc = WAW;
-	    break;
-	case '[':
-	    tempc = _JIM;
-	    break;
-	case ']':
-	    tempc = _CHE;
-	    break;
-    }
-
-    if (F_isalpha(tempc) || F_isdigit(tempc))
-    {
-	if (!curwin->w_cursor.col && STRLEN(ml_get_curline()))
-	{
-	    if (!p_ri && !F_is_TyE(tempc))
-		chg_c_to_X_orX_();
-	    if (p_ri)
-		chg_c_to_X_or_X();
-	}
-
-	if (curwin->w_cursor.col)
-	{
-	    if (!p_ri)
-		dec_cursor();
-
-	    if (F_is_TyE(tempc))
-		chg_l_toXor_X();
-	    else
-		chg_l_to_X_orX_();
-
-	    if (!p_ri)
-		inc_cursor();
-	}
-    }
-    if (tempc)
-	return tempc;
-    return c;
-}
-
-/*
- * Convert a none leading Farsi char into a leading type.
- */
-    static int
-toF_leading(int c)
-{
-    switch (c)
-    {
-	case ALEF_:	return ALEF;
-	case ALEF_U_H_:	    return ALEF_U_H;
-	case BE:    return _BE;
-	case PE:    return _PE;
-	case TE:    return _TE;
-	case SE:    return _SE;
-	case JIM:   return _JIM;
-	case CHE:   return _CHE;
-	case HE_J:  return _HE_J;
-	case XE:    return _XE;
-	case SIN:   return _SIN;
-	case SHIN:  return _SHIN;
-	case SAD:   return _SAD;
-	case ZAD:   return _ZAD;
-
-	case AYN:
-	case AYN_:
-	case _AYN_: return _AYN;
-
-	case GHAYN:
-	case GHAYN_:
-	case _GHAYN_:	return _GHAYN;
-
-	case FE:    return _FE;
-	case GHAF:  return _GHAF;
-	case KAF:   return _KAF;
-	case GAF:   return _GAF;
-	case LAM:   return _LAM;
-	case MIM:   return _MIM;
-	case NOON:  return _NOON;
-
-	case _HE_:
-	case F_HE:	return _HE;
-
-	case YE:
-	case YE_:	return _YE;
-
-	case IE_:
-	case IE:	return _IE;
-
-	case YEE:
-	case YEE_:	return _YEE;
-    }
-    return c;
-}
-
-/*
- * Convert a given Farsi char into right joining type.
- */
-    static int
-toF_Rjoin(int c)
-{
-    switch (c)
-    {
-	case ALEF:  return ALEF_;
-	case ALEF_U_H:	return ALEF_U_H_;
-	case BE:    return _BE;
-	case PE:    return _PE;
-	case TE:    return _TE;
-	case SE:    return _SE;
-	case JIM:   return _JIM;
-	case CHE:   return _CHE;
-	case HE_J:  return _HE_J;
-	case XE:    return _XE;
-	case SIN:   return _SIN;
-	case SHIN:  return _SHIN;
-	case SAD:   return _SAD;
-	case ZAD:   return _ZAD;
-
-	case AYN:
-	case AYN_:
-	case _AYN:  return _AYN_;
-
-	case GHAYN:
-	case GHAYN_:
-	case _GHAYN_:	return _GHAYN_;
-
-	case FE:    return _FE;
-	case GHAF:  return _GHAF;
-	case KAF:   return _KAF;
-	case GAF:   return _GAF;
-	case LAM:   return _LAM;
-	case MIM:   return _MIM;
-	case NOON:  return _NOON;
-
-	case _HE:
-	case F_HE:	return _HE_;
-
-	case YE:
-	case YE_:	return _YE;
-
-	case IE_:
-	case IE:	return _IE;
-
-	case TEE:	return TEE_;
-
-	case YEE:
-	case YEE_:	return _YEE;
-    }
-    return c;
-}
-
-/*
- * Can a given Farsi character join via its left edj.
- */
-    static int
-canF_Ljoin(int c)
-{
-    switch (c)
-    {
-	case _BE:
-	case BE:
-	case PE:
-	case _PE:
-	case TE:
-	case _TE:
-	case SE:
-	case _SE:
-	case JIM:
-	case _JIM:
-	case CHE:
-	case _CHE:
-	case HE_J:
-	case _HE_J:
-	case XE:
-	case _XE:
-	case SIN:
-	case _SIN:
-	case SHIN:
-	case _SHIN:
-	case SAD:
-	case _SAD:
-	case ZAD:
-	case _ZAD:
-	case _TA:
-	case _ZA:
-	case AYN:
-	case _AYN:
-	case _AYN_:
-	case AYN_:
-	case GHAYN:
-	case GHAYN_:
-	case _GHAYN_:
-	case _GHAYN:
-	case FE:
-	case _FE:
-	case GHAF:
-	case _GHAF:
-	case _KAF_H:
-	case KAF:
-	case _KAF:
-	case GAF:
-	case _GAF:
-	case LAM:
-	case _LAM:
-	case MIM:
-	case _MIM:
-	case NOON:
-	case _NOON:
-	case IE:
-	case _IE:
-	case IE_:
-	case YE:
-	case _YE:
-	case YE_:
-	case YEE:
-	case _YEE:
-	case YEE_:
-	case F_HE:
-	case _HE:
-	case _HE_:
-	    return TRUE;
-    }
-    return FALSE;
-}
-
-/*
- * Can a given Farsi character join via its right edj.
- */
-    static int
-canF_Rjoin(int c)
-{
-    switch (c)
-    {
-	case ALEF:
-	case ALEF_:
-	case ALEF_U_H:
-	case ALEF_U_H_:
-	case DAL:
-	case ZAL:
-	case RE:
-	case JE:
-	case ZE:
-	case TEE:
-	case TEE_:
-	case WAW:
-	case WAW_H:
-	    return TRUE;
-    }
-
-    return canF_Ljoin(c);
-
-}
-
-/*
- * is a given Farsi character a terminating type.
- */
-    static int
-F_isterm(int c)
-{
-    switch (c)
-    {
-	case ALEF:
-	case ALEF_:
-	case ALEF_U_H:
-	case ALEF_U_H_:
-	case DAL:
-	case ZAL:
-	case RE:
-	case JE:
-	case ZE:
-	case WAW:
-	case WAW_H:
-	case TEE:
-	case TEE_:
-	    return TRUE;
-    }
-
-    return FALSE;
-}
-
-/*
- * Convert the given Farsi character into a ending type .
- */
-    static int
-toF_ending(int c)
-{
-    switch (c)
-    {
-	case _BE: return BE;
-	case _PE: return PE;
-	case _TE: return TE;
-	case _SE: return SE;
-	case _JIM: return JIM;
-	case _CHE: return CHE;
-	case _HE_J: return HE_J;
-	case _XE: return XE;
-	case _SIN: return SIN;
-	case _SHIN: return SHIN;
-	case _SAD: return SAD;
-	case _ZAD: return ZAD;
-	case _AYN: return AYN;
-	case _AYN_: return AYN_;
-	case _GHAYN: return GHAYN;
-	case _GHAYN_: return GHAYN_;
-	case _FE: return FE;
-	case _GHAF: return GHAF;
-	case _KAF_H:
-	case _KAF: return KAF;
-	case _GAF: return GAF;
-	case _LAM: return LAM;
-	case _MIM: return MIM;
-	case _NOON: return NOON;
-	case _YE: return YE_;
-	case YE_: return YE;
-	case _YEE: return YEE_;
-	case YEE_: return YEE;
-	case TEE: return TEE_;
-	case _IE: return IE_;
-	case IE_: return IE;
-	case _HE:
-	case _HE_: return F_HE;
-    }
-    return c;
-}
-
-/*
- * Convert the Farsi 3342 standard into Farsi VIM.
- */
-    static void
-conv_to_pvim(void)
-{
-    char_u	*ptr;
-    int		lnum, llen, i;
-
-    for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
-    {
-	ptr = ml_get((linenr_T)lnum);
-
-	llen = (int)STRLEN(ptr);
-
-	for (i = 0; i < llen-1; i++)
-	{
-	    if (canF_Ljoin(ptr[i]) && canF_Rjoin(ptr[i+1]))
-	    {
-		ptr[i] = toF_leading(ptr[i]);
-		++i;
-
-		while (i < llen && canF_Rjoin(ptr[i]))
-		{
-		    ptr[i] = toF_Rjoin(ptr[i]);
-		    if (F_isterm(ptr[i]) || !F_isalpha(ptr[i]))
-			break;
-		    ++i;
-		}
-		if (!F_isalpha(ptr[i]) || !canF_Rjoin(ptr[i]))
-		    ptr[i-1] = toF_ending(ptr[i-1]);
-	    }
-	    else
-		ptr[i] = toF_TyA(ptr[i]);
-	}
-    }
-
-    /*
-     * Following lines contains Farsi encoded character.
-     */
-
-    do_cmdline_cmd((char_u *)"%s/\202\231/\232/ge");
-    do_cmdline_cmd((char_u *)"%s/\201\231/\370\334/ge");
-
-    /* Assume the screen has been messed up: clear it and redraw. */
-    redraw_later(CLEAR);
-    msg_attr(farsi_text_1, HL_ATTR(HLF_S));
-}
-
-/*
- * Convert the Farsi VIM into Farsi 3342 standard.
- */
-    static void
-conv_to_pstd(void)
-{
-    char_u	*ptr;
-    int		lnum, llen, i;
-
-    /*
-     * Following line contains Farsi encoded character.
-     */
-    do_cmdline_cmd((char_u *)"%s/\232/\202\231/ge");
-
-    for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum)
-    {
-	ptr = ml_get((linenr_T)lnum);
-	llen = (int)STRLEN(ptr);
-
-	for (i = 0; i < llen; i++)
-	    ptr[i] = toF_TyA(ptr[i]);
-    }
-
-    /* Assume the screen has been messed up: clear it and redraw. */
-    redraw_later(CLEAR);
-    msg_attr(farsi_text_2, HL_ATTR(HLF_S));
-}
-
-/*
- * left-right swap the characters in buf[len].
- */
-    static void
-lrswapbuf(char_u *buf, int len)
-{
-    char_u	*s, *e;
-    int		c;
-
-    s = buf;
-    e = buf + len - 1;
-
-    while (e > s)
-    {
-	c = *s;
-	*s = *e;
-	*e = c;
-	++s;
-	--e;
-    }
-}
-
-/*
- * swap all the characters in reverse direction
- */
-    char_u *
-lrswap(char_u *ibuf)
-{
-    if (ibuf != NULL && *ibuf != NUL)
-	lrswapbuf(ibuf, (int)STRLEN(ibuf));
-    return ibuf;
-}
-
-/*
- * swap all the Farsi characters in reverse direction
- */
-    char_u *
-lrFswap(char_u *cmdbuf, int len)
-{
-    int		i, cnt;
-
-    if (cmdbuf == NULL)
-	return cmdbuf;
-
-    if (len == 0 && (len = (int)STRLEN(cmdbuf)) == 0)
-	return cmdbuf;
-
-    for (i = 0; i < len; i++)
-    {
-	for (cnt = 0; i + cnt < len
-			&& (F_isalpha(cmdbuf[i + cnt])
-			    || F_isdigit(cmdbuf[i + cnt])
-			    || cmdbuf[i + cnt] == ' '); ++cnt)
-	    ;
-
-	lrswapbuf(cmdbuf + i, cnt);
-	i += cnt;
-    }
-    return cmdbuf;
-}
-
-/*
- * Reverse the characters in the search path and substitute section
- * accordingly.
- * TODO: handle different separator characters.  Use skip_regexp().
- */
-    char_u *
-lrF_sub(char_u *ibuf)
-{
-    char_u	*p, *ep;
-    int		i, cnt;
-
-    p = ibuf;
-
-    /* Find the boundary of the search path */
-    while (((p = vim_strchr(p + 1, '/')) != NULL) && p[-1] == '\\')
-	;
-
-    if (p == NULL)
-	return ibuf;
-
-    /* Reverse the Farsi characters in the search path. */
-    lrFswap(ibuf, (int)(p-ibuf));
-
-    /* Now find the boundary of the substitute section */
-    if ((ep = (char_u *)strrchr((char *)++p, '/')) != NULL)
-	cnt = (int)(ep - p);
-    else
-	cnt = (int)STRLEN(p);
-
-    /* Reverse the characters in the substitute section and take care of '\' */
-    for (i = 0; i < cnt-1; i++)
-	if (p[i] == '\\')
-	{
-	    p[i] = p[i+1] ;
-	    p[++i] = '\\';
-	}
-
-    lrswapbuf(p, cnt);
-
-    return ibuf;
-}
-
-/*
- * Map Farsi keyboard when in cmd_fkmap mode.
- */
-    int
-cmdl_fkmap(int c)
-{
-    int	    tempc;
-
-    switch (c)
-    {
-	case '0':
-	case '1':
-	case '2':
-	case '3':
-	case '4':
-	case '5':
-	case '6':
-	case '7':
-	case '8':
-	case '9':
-	case '`':
-	case ' ':
-	case '.':
-	case '!':
-	case '"':
-	case '$':
-	case '%':
-	case '^':
-	case '&':
-	case '/':
-	case '(':
-	case ')':
-	case '=':
-	case '\\':
-	case '?':
-	case '+':
-	case '-':
-	case '_':
-	case '*':
-	case ':':
-	case '#':
-	case '~':
-	case '@':
-	case '<':
-	case '>':
-	case '{':
-	case '}':
-	case '|':
-	case 'B':
-	case 'E':
-	case 'F':
-	case 'H':
-	case 'I':
-	case 'K':
-	case 'L':
-	case 'M':
-	case 'O':
-	case 'P':
-	case 'Q':
-	case 'R':
-	case 'T':
-	case 'U':
-	case 'W':
-	case 'Y':
-	case  NL:
-	case  TAB:
-
-	    switch ((tempc = cmd_gchar(AT_CURSOR)))
-	    {
-		case _BE:
-		case _PE:
-		case _TE:
-		case _SE:
-		case _JIM:
-		case _CHE:
-		case _HE_J:
-		case _XE:
-		case _SIN:
-		case _SHIN:
-		case _SAD:
-		case _ZAD:
-		case _AYN:
-		case _GHAYN:
-		case _FE:
-		case _GHAF:
-		case _KAF:
-		case _GAF:
-		case _LAM:
-		case _MIM:
-		case _NOON:
-		case _HE:
-		case _HE_:
-		    cmd_pchar(toF_TyA(tempc), AT_CURSOR);
-		    break;
-		case _AYN_:
-		    cmd_pchar(AYN_, AT_CURSOR);
-		    break;
-		case _GHAYN_:
-		    cmd_pchar(GHAYN_, AT_CURSOR);
-		    break;
-		case _IE:
-		    if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
-			cmd_pchar(IE_, AT_CURSOR);
-		    else
-			cmd_pchar(IE, AT_CURSOR);
-		    break;
-		case _YEE:
-		    if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
-			cmd_pchar(YEE_, AT_CURSOR);
-		    else
-			cmd_pchar(YEE, AT_CURSOR);
-		    break;
-		case _YE:
-		    if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR+1))
-			cmd_pchar(YE_, AT_CURSOR);
-		    else
-			cmd_pchar(YE, AT_CURSOR);
-	    }
-
-	    switch (c)
-	    {
-		case '0':   return FARSI_0;
-		case '1':   return FARSI_1;
-		case '2':   return FARSI_2;
-		case '3':   return FARSI_3;
-		case '4':   return FARSI_4;
-		case '5':   return FARSI_5;
-		case '6':   return FARSI_6;
-		case '7':   return FARSI_7;
-		case '8':   return FARSI_8;
-		case '9':   return FARSI_9;
-		case 'B':   return F_PSP;
-		case 'E':   return JAZR_N;
-		case 'F':   return ALEF_D_H;
-		case 'H':   return ALEF_A;
-		case 'I':   return TASH;
-		case 'K':   return F_LQUOT;
-		case 'L':   return F_RQUOT;
-		case 'M':   return HAMZE;
-		case 'O':   return '[';
-		case 'P':   return ']';
-		case 'Q':   return OO;
-		case 'R':   return MAD_N;
-		case 'T':   return OW;
-		case 'U':   return MAD;
-		case 'W':   return OW_OW;
-		case 'Y':   return JAZR;
-		case '`':   return F_PCN;
-		case '!':   return F_EXCL;
-		case '@':   return F_COMMA;
-		case '#':   return F_DIVIDE;
-		case '$':   return F_CURRENCY;
-		case '%':   return F_PERCENT;
-		case '^':   return F_MUL;
-		case '&':   return F_BCOMMA;
-		case '*':   return F_STAR;
-		case '(':   return F_LPARENT;
-		case ')':   return F_RPARENT;
-		case '-':   return F_MINUS;
-		case '_':   return F_UNDERLINE;
-		case '=':   return F_EQUALS;
-		case '+':   return F_PLUS;
-		case '\\':  return F_BSLASH;
-		case '|':   return F_PIPE;
-		case ':':   return F_DCOLON;
-		case '"':   return F_SEMICOLON;
-		case '.':   return F_PERIOD;
-		case '/':   return F_SLASH;
-		case '<':   return F_LESS;
-		case '>':   return F_GREATER;
-		case '?':   return F_QUESTION;
-		case ' ':   return F_BLANK;
-	    }
-
-	    break;
-
-	case 'a':   return _SHIN;
-	case 'A':   return WAW_H;
-	case 'b':   return ZAL;
-	case 'c':   return ZE;
-	case 'C':   return JE;
-	case 'd':   return _YE;
-	case 'D':   return _YEE;
-	case 'e':   return _SE;
-	case 'f':   return _BE;
-	case 'g':   return _LAM;
-	case 'G':
-		if (cmd_gchar(AT_CURSOR) == _LAM)
-		{
-		    cmd_pchar(LAM, AT_CURSOR);
-			    return ALEF_U_H;
-		}
-
-		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
-			return ALEF_U_H_;
-		else
-			return ALEF_U_H;
-	case 'h':
-		if (cmd_gchar(AT_CURSOR) == _LAM)
-		{
-		    cmd_pchar(LA, AT_CURSOR);
-		    redrawcmdline();
-		    return K_IGNORE;
-		}
-
-		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
-			return ALEF_;
-		else
-			return ALEF;
-	case 'i':
-		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
-			return _HE_;
-		else
-			return _HE;
-	case 'j':   return _TE;
-	case 'J':
-		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
-			return TEE_;
-		else
-			return TEE;
-	case 'k':   return _NOON;
-	case 'l':   return _MIM;
-	case 'm':   return _PE;
-	case 'n':
-	case 'N':   return DAL;
-	case 'o':   return _XE;
-	case 'p':   return _HE_J;
-	case 'q':   return _ZAD;
-	case 'r':   return _GHAF;
-	case 's':   return _SIN;
-	case 'S':   return _IE;
-	case 't':   return _FE;
-	case 'u':
-		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
-			return _AYN_;
-		else
-			return _AYN;
-	case 'v':
-	case 'V':   return RE;
-	case 'w':   return _SAD;
-	case 'x':
-	case 'X':   return _TA;
-	case 'y':
-		if (F_is_TyB_TyC_TyD(SRC_CMD, AT_CURSOR))
-			return _GHAYN_;
-		else
-			return _GHAYN;
-	case 'z':
-	case 'Z':   return _ZA;
-	case ';':   return _KAF;
-	case '\'':  return _GAF;
-	case ',':   return WAW;
-	case '[':   return _JIM;
-	case ']':   return _CHE;
-    }
-
-    return c;
-}
-
-/*
- * F_isalpha returns TRUE if 'c' is a Farsi alphabet
- */
-    int
-F_isalpha(int c)
-{
-    return ((c >= TEE_ && c <= _YE)
-	    || (c >= ALEF_A && c <= YE)
-	    || (c >= _IE && c <= YE_));
-}
-
-/*
- * F_isdigit returns TRUE if 'c' is a Farsi digit
- */
-    int
-F_isdigit(int c)
-{
-    return (c >= FARSI_0 && c <= FARSI_9);
-}
-
-/*
- * F_ischar returns TRUE if 'c' is a Farsi character.
- */
-    int
-F_ischar(int c)
-{
-    return (c >= TEE_ && c <= YE_);
-}
-
-    void
-farsi_f8(cmdarg_T *cap UNUSED)
-{
-    if (p_altkeymap)
-    {
-	if (curwin->w_farsi & W_R_L)
-	{
-	    p_fkmap = 0;
-	    do_cmdline_cmd((char_u *)"set norl");
-	    msg("");
-	}
-	else
-	{
-	    p_fkmap = 1;
-	    do_cmdline_cmd((char_u *)"set rl");
-	    msg("");
-	}
-
-	curwin->w_farsi = curwin->w_farsi ^ W_R_L;
-    }
-}
-
-    void
-farsi_f9(cmdarg_T *cap UNUSED)
-{
-    if (p_altkeymap && curwin->w_p_rl)
-    {
-	curwin->w_farsi = curwin->w_farsi ^ W_CONV;
-	if (curwin->w_farsi & W_CONV)
-	    conv_to_pvim();
-	else
-	    conv_to_pstd();
-    }
-}
-
-#endif /* FEAT_FKMAP */
deleted file mode 100644
--- a/src/farsi.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/* vi:set ts=8 sts=4 sw=4 noet:
- *
- * VIM - Vi IMproved	by Bram Moolenaar
- *
- * Do ":help uganda"  in Vim to read copying and usage conditions.
- * Do ":help credits" in Vim to see a list of people who contributed.
- */
-
-/*
- * Farsi characters are categorized into following types:
- *
- * TyA	(for capital letter representation)
- * TyB	(for types that look like _X  e.g. AYN)
- * TyC	(for types that look like X_  e.g. YE_)
- * TyD	(for types that look like _X_  e.g. _AYN_)
- * TyE	(for types that look like X  e.g. RE)
- */
-
-/*
- * Farsi character set definition
- */
-
-/*
- * Begin of the non-standard part
- */
-
-#define TEE_		0x80
-#define ALEF_U_H_	0x81
-#define ALEF_		0x82
-#define _BE		0x83
-#define _PE		0x84
-#define _TE		0x85
-#define _SE		0x86
-#define _JIM		0x87
-#define _CHE		0x88
-#define _HE_J		0x89
-#define _XE		0x8a
-#define _SIN		0x8b
-#define _SHIN		0x8c
-#define _SAD		0x8d
-#define _ZAD		0x8e
-#define _AYN		0x8f
-#define _AYN_		0x90
-#define AYN_		0x91
-#define _GHAYN		0x92
-#define _GHAYN_		0x93
-#define GHAYN_		0x94
-#define _FE		0x95
-#define _GHAF		0x96
-#define _KAF		0x97
-#define _GAF		0x98
-#define _LAM		0x99
-#define LA		0x9a
-#define _MIM		0x9b
-#define _NOON		0x9c
-#define _HE		0x9d
-#define _HE_		0x9e
-#define _YE		0x9f
-#define _IE		0xec
-#define IE_		0xed
-#define IE		0xfb
-#define _YEE		0xee
-#define YEE_		0xef
-#define YE_		0xff
-
-/*
- * End of the non-standard part
- */
-
-/*
- * Standard part
- */
-
-#define F_BLANK		0xa0	/* Farsi ' ' (SP) character */
-#define F_PSP		0xa1	/* PSP for capitalizing of a character */
-#define F_PCN		0xa2	/* PCN for redefining of the hamye meaning */
-#define F_EXCL		0xa3	/* Farsi ! character */
-#define F_CURRENCY	0xa4	/* Farsi Rial character */
-#define F_PERCENT	0xa5	/* Farsi % character */
-#define F_PERIOD	0xa6	/* Farsi '.' character */
-#define F_COMMA		0xa7	/* Farsi ',' character */
-#define F_LPARENT	0xa8	/* Farsi '(' character */
-#define F_RPARENT	0xa9	/* Farsi ')' character */
-#define F_MUL		0xaa	/* Farsi 'x' character */
-#define F_PLUS		0xab	/* Farsi '+' character */
-#define F_BCOMMA	0xac	/* Farsi comma character */
-#define F_MINUS		0xad	/* Farsi '-' character */
-#define F_DIVIDE	0xae	/* Farsi divide (/) character */
-#define F_SLASH		0xaf	/* Farsi '/' character */
-
-#define FARSI_0		0xb0
-#define FARSI_1		0xb1
-#define FARSI_2		0xb2
-#define FARSI_3		0xb3
-#define FARSI_4		0xb4
-#define FARSI_5		0xb5
-#define FARSI_6		0xb6
-#define FARSI_7		0xb7
-#define FARSI_8		0xb8
-#define FARSI_9		0xb9
-
-#define F_DCOLON	0xba	/* Farsi ':' character */
-#define F_SEMICOLON	0xbb	/* Farsi ';' character */
-#define F_GREATER	0xbc	/* Farsi '>' character */
-#define F_EQUALS	0xbd	/* Farsi '=' character */
-#define F_LESS		0xbe	/* Farsi '<' character */
-#define F_QUESTION	0xbf	/* Farsi ? character */
-
-#define ALEF_A	0xc0
-#define ALEF	0xc1
-#define HAMZE	0xc2
-#define BE	0xc3
-#define PE	0xc4
-#define TE	0xc5
-#define SE	0xc6
-#define JIM	0xc7
-#define CHE	0xc8
-#define HE_J	0xc9
-#define XE	0xca
-#define DAL	0xcb
-#define ZAL	0xcc
-#define RE	0xcd
-#define ZE	0xce
-#define JE	0xcf
-#define SIN	0xd0
-#define SHIN	0xd1
-#define SAD	0xd2
-#define ZAD	0xd3
-#define _TA	0xd4
-#define _ZA	0xd5
-#define AYN	0xd6
-#define GHAYN	0xd7
-#define FE	0xd8
-#define GHAF	0xd9
-#define KAF	0xda
-#define GAF	0xdb
-#define LAM	0xdc
-#define MIM	0xdd
-#define NOON	0xde
-#define WAW	0xdf
-#define F_HE	0xe0		/* F_ added for name clash with Perl */
-#define YE	0xe1
-#define TEE	0xfc
-#define _KAF_H	0xfd
-#define YEE	0xfe
-
-#define F_LBRACK	0xe2	/* Farsi '[' character */
-#define F_RBRACK	0xe3	/* Farsi ']' character */
-#define F_LBRACE	0xe4	/* Farsi '{' character */
-#define F_RBRACE	0xe5	/* Farsi '}' character */
-#define F_LQUOT		0xe6	/* Farsi left quotation character */
-#define F_RQUOT		0xe7	/* Farsi right quotation character */
-#define F_STAR		0xe8	/* Farsi '*' character */
-#define F_UNDERLINE	0xe9	/* Farsi '_' character */
-#define F_PIPE		0xea	/* Farsi '|' character */
-#define F_BSLASH	0xeb	/* Farsi '\' character */
-
-#define MAD		0xf0
-#define JAZR		0xf1
-#define OW		0xf2
-#define MAD_N		0xf3
-#define JAZR_N		0xf4
-#define OW_OW		0xf5
-#define TASH		0xf6
-#define OO		0xf7
-#define ALEF_U_H	0xf8
-#define WAW_H		0xf9
-#define ALEF_D_H	0xfa
-
-/*
- * global definitions
- * ==================
- */
-
-#define SRC_EDT	0
-#define SRC_CMD 1
-
-#define AT_CURSOR 0
-
-/*
- * definitions for the window dependent functions (w_farsi).
- */
-#define W_CONV 0x1
-#define W_R_L  0x2
-
-
-/* special Farsi text messages */
-
-EXTERN char farsi_text_1[]
-#ifdef DO_INIT
-		= { YE_, _SIN, RE, ALEF_, _FE, ' ', 'V', 'I', 'M',
-		    ' ', F_HE, _BE, ' ', SHIN, RE, _GAF, DAL,' ', NOON,
-		    ALEF_, _YE, ALEF_, _PE, '\0'}
-#endif
-		     ;
-
-EXTERN char farsi_text_2[]
-#ifdef DO_INIT
-		= { YE_, _SIN, RE, ALEF_, _FE, ' ', FARSI_3, FARSI_3,
-		    FARSI_4, FARSI_2, ' ', DAL, RE, ALEF, DAL, _NOON,
-		    ALEF_, _TE, _SIN, ALEF, ' ', F_HE, _BE, ' ', SHIN,
-		    RE,  _GAF, DAL, ' ', NOON, ALEF_, _YE, ALEF_, _PE, '\0'}
-#endif
-		     ;
-
-EXTERN char farsi_text_3[]
-#ifdef DO_INIT
-		= { DAL, WAW, _SHIN, _YE, _MIM, _NOON, ' ', YE_, _NOON,
-		    ALEF_,_BE, _YE, _TE, _SHIN, _PE, ' ', 'R','E','P','L',
-		    'A','C','E', ' ', NOON, ALEF_, _MIM, RE, _FE, ZE, ALEF,
-		    ' ', 'R', 'E', 'V', 'E', 'R', 'S', 'E', ' ', 'I', 'N',
-		    'S', 'E', 'R', 'T', ' ', SHIN, WAW, RE, ' ', ALEF_, _BE,
-		    ' ', YE_, _SIN, RE, ALEF_, _FE, ' ', RE, DAL, ' ', RE,
-		    ALEF_, _KAF,' ', MIM, ALEF_, _GAF, _NOON, _HE, '\0'}
-#endif
-		    ;
-
-#if 0 /* not used */
-EXTERN char_u farsi_text_4[]
-#ifdef DO_INIT
-		= { DAL, WAW, _SHIN, _YE, _MIM, _NOON, ' ', YE_, _NOON,
-		    ALEF_, _BE, _YE, _TE, _SHIN, _PE, ' ', '<', 'C','T','R',
-		    'L','-','B','>', ' ', NOON, ALEF_, _MIM, RE, _FE, ZE,
-		    ALEF, ' ', YE_, _SIN, RE, ALEF_, _FE, ' ', RE, DAL, ' ',
-		    RE, ALEF_, _KAF,' ', MIM, ALEF_, _GAF, _NOON, _HE, '\0'}
-#endif
-		    ;
-#endif
-
-EXTERN char farsi_text_5[]
-#ifdef DO_INIT
-		= { ' ', YE_, _SIN, RE, ALEF_, _FE, '\0'}
-#endif
-		    ;
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -3361,15 +3361,6 @@ do_map(
 	    rhs = replace_termcodes(rhs, &arg_buf, FALSE, TRUE, special);
     }
 
-#ifdef FEAT_FKMAP
-    /*
-     * When in right-to-left mode and alternate keymap option set,
-     * reverse the character flow in the rhs in Farsi.
-     */
-    if (p_altkeymap && curwin->w_p_rl)
-	lrswap(rhs);
-#endif
-
     /*
      * check arguments and translate function keys
      */
--- a/src/globals.h
+++ b/src/globals.h
@@ -1450,9 +1450,7 @@ EXTERN char e_nogvim[]	INIT(= N_("E25: G
 #ifndef FEAT_RIGHTLEFT
 EXTERN char e_nohebrew[]	INIT(= N_("E26: Hebrew cannot be used: Not enabled at compile time\n"));
 #endif
-#ifndef FEAT_FKMAP
-EXTERN char e_nofarsi[]	INIT(= N_("E27: Farsi cannot be used: Not enabled at compile time\n"));
-#endif
+EXTERN char e_nofarsi[]		INIT(= N_("E27: Farsi support has been removed\n"));
 #ifndef FEAT_ARABIC
 EXTERN char e_noarabic[]	INIT(= N_("E800: Arabic cannot be used: Not enabled at compile time\n"));
 #endif
@@ -1656,13 +1654,6 @@ EXTERN int text_prop_frozen INIT(= 0);
 #endif
 
 /*
- * Optional Farsi support.  Include it here, so EXTERN and INIT are defined.
- */
-#ifdef FEAT_FKMAP
-# include "farsi.h"
-#endif
-
-/*
  * Optional Arabic support. Include it here, so EXTERN and INIT are defined.
  */
 #ifdef FEAT_ARABIC
--- a/src/main.c
+++ b/src/main.c
@@ -535,17 +535,6 @@ vim_main2(void)
     if (params.no_swap_file)
 	p_uc = 0;
 
-#ifdef FEAT_FKMAP
-    if (curwin->w_p_rl && p_altkeymap)
-    {
-	p_hkmap = FALSE;	/* Reset the Hebrew keymap mode */
-# ifdef FEAT_ARABIC
-	curwin->w_p_arab = FALSE; /* Reset the Arabic keymap mode */
-# endif
-	p_fkmap = TRUE;		/* Set the Farsi keymap mode */
-    }
-#endif
-
 #ifdef FEAT_GUI
     if (gui.starting)
     {
@@ -2025,14 +2014,9 @@ command_line_scan(mparm_T *parmp)
 		main_start_gui();
 		break;
 
-	    case 'F':		/* "-F" start in Farsi mode: rl + fkmap set */
-#ifdef FEAT_FKMAP
-		p_fkmap = TRUE;
-		set_option_value((char_u *)"rl", 1L, NULL, 0);
-#else
+	    case 'F':		/* "-F" was for Farsi mode */
 		mch_errmsg(_(e_nofarsi));
 		mch_exit(2);
-#endif
 		break;
 
 	    case '?':		/* "-?" give help message (for MS-Windows) */
@@ -3351,9 +3335,6 @@ usage(void)
 #ifdef FEAT_RIGHTLEFT
     main_msg(_("-H\t\t\tStart in Hebrew mode"));
 #endif
-#ifdef FEAT_FKMAP
-    main_msg(_("-F\t\t\tStart in Farsi mode"));
-#endif
     main_msg(_("-T <terminal>\tSet terminal type to <terminal>"));
     main_msg(_("--not-a-term\t\tSkip warning for input/output not being a terminal"));
     main_msg(_("--ttyfail\t\tExit if input or output is not a terminal"));
--- a/src/normal.c
+++ b/src/normal.c
@@ -397,10 +397,6 @@ static const struct nv_cmd
     {K_TABLINE, nv_tabline,	0,			0},
     {K_TABMENU, nv_tabmenu,	0,			0},
 #endif
-#ifdef FEAT_FKMAP
-    {K_F8,	farsi_f8,	0,			0},
-    {K_F9,	farsi_f9,	0,			0},
-#endif
 #ifdef FEAT_NETBEANS_INTG
     {K_F21,	nv_nbcmd,	NV_NCH_ALW,		0},
 #endif
@@ -987,11 +983,6 @@ getcount:
 		/* adjust Hebrew mapped char */
 		if (p_hkmap && lang && KeyTyped)
 		    *cp = hkmap(*cp);
-# ifdef FEAT_FKMAP
-		/* adjust Farsi mapped char */
-		if (p_fkmap && lang && KeyTyped)
-		    *cp = fkmap(*cp);
-# endif
 #endif
 	    }
 
--- a/src/option.c
+++ b/src/option.c
@@ -542,11 +542,7 @@ static struct vimoption options[] =
 #endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"altkeymap",   "akm",  P_BOOL|P_VI_DEF,
-#ifdef FEAT_FKMAP
-			    (char_u *)&p_altkeymap, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
+			    (char_u *)NULL, PV_NONE,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"ambiwidth",  "ambw",  P_STRING|P_VI_DEF|P_RCLR,
 			    (char_u *)&p_ambw, PV_NONE,
@@ -1141,11 +1137,7 @@ static struct vimoption options[] =
 			    (char_u *)&p_fixeol, PV_FIXEOL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"fkmap",	    "fk",   P_BOOL|P_VI_DEF,
-#ifdef FEAT_FKMAP
-			    (char_u *)&p_fkmap, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
+			    (char_u *)NULL, PV_NONE,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"flash",	    "fl",   P_BOOL|P_VI_DEF,
 			    (char_u *)NULL, PV_NONE,
@@ -8707,69 +8699,6 @@ set_bool_option(
     }
 #endif
 
-#ifdef FEAT_FKMAP
-    else if ((int *)varp == &p_altkeymap)
-    {
-	if (old_value != p_altkeymap)
-	{
-	    if (!p_altkeymap)
-	    {
-		p_hkmap = p_fkmap;
-		p_fkmap = 0;
-	    }
-	    else
-	    {
-		p_fkmap = p_hkmap;
-		p_hkmap = 0;
-	    }
-	    (void)init_chartab();
-	}
-    }
-
-    /*
-     * In case some second language keymapping options have changed, check
-     * and correct the setting in a consistent way.
-     */
-
-    /*
-     * If hkmap or fkmap are set, reset Arabic keymapping.
-     */
-    if ((p_hkmap || p_fkmap) && p_altkeymap)
-    {
-	p_altkeymap = p_fkmap;
-# ifdef FEAT_ARABIC
-	curwin->w_p_arab = FALSE;
-# endif
-	(void)init_chartab();
-    }
-
-    /*
-     * If hkmap set, reset Farsi keymapping.
-     */
-    if (p_hkmap && p_altkeymap)
-    {
-	p_altkeymap = 0;
-	p_fkmap = 0;
-# ifdef FEAT_ARABIC
-	curwin->w_p_arab = FALSE;
-# endif
-	(void)init_chartab();
-    }
-
-    /*
-     * If fkmap set, reset Hebrew keymapping.
-     */
-    if (p_fkmap && !p_altkeymap)
-    {
-	p_altkeymap = 1;
-	p_hkmap = 0;
-# ifdef FEAT_ARABIC
-	curwin->w_p_arab = FALSE;
-# endif
-	(void)init_chartab();
-    }
-#endif
-
 #ifdef FEAT_ARABIC
     if ((int *)varp == &curwin->w_p_arab)
     {
@@ -8816,12 +8745,6 @@ set_bool_option(
 	    set_option_value((char_u *)"keymap", 0L, (char_u *)"arabic",
 								   OPT_LOCAL);
 # endif
-# ifdef FEAT_FKMAP
-	    p_altkeymap = 0;
-	    p_hkmap = 0;
-	    p_fkmap = 0;
-	    (void)init_chartab();
-# endif
 	}
 	else
 	{
@@ -11085,12 +11008,6 @@ win_copy_options(win_T *wp_from, win_T *
 {
     copy_winopt(&wp_from->w_onebuf_opt, &wp_to->w_onebuf_opt);
     copy_winopt(&wp_from->w_allbuf_opt, &wp_to->w_allbuf_opt);
-# ifdef FEAT_RIGHTLEFT
-#  ifdef FEAT_FKMAP
-    /* Is this right? */
-    wp_to->w_farsi = wp_from->w_farsi;
-#  endif
-# endif
 #if defined(FEAT_LINEBREAK)
     briopt_check(wp_to);
 #endif
--- a/src/proto.h
+++ b/src/proto.h
@@ -99,9 +99,6 @@ extern int _stricoll(char *a, char *b);
 # ifdef FEAT_MENU
 #  include "menu.pro"
 # endif
-# ifdef FEAT_FKMAP
-#  include "farsi.pro"
-# endif
 # ifdef FEAT_ARABIC
 #  include "arabic.pro"
 # endif
deleted file mode 100644
--- a/src/proto/farsi.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-/* farsi.c */
-int fkmap(int c);
-char_u *lrswap(char_u *ibuf);
-char_u *lrFswap(char_u *cmdbuf, int len);
-char_u *lrF_sub(char_u *ibuf);
-int cmdl_fkmap(int c);
-int F_isalpha(int c);
-int F_isdigit(int c);
-int F_ischar(int c);
-void farsi_f8(cmdarg_T *cap);
-void farsi_f9(cmdarg_T *cap);
-/* vim: set ft=c : */
--- a/src/screen.c
+++ b/src/screen.c
@@ -10247,10 +10247,6 @@ showmode(void)
 #ifdef FEAT_RIGHTLEFT
 		if (p_hkmap)
 		    msg_puts_attr(_(" Hebrew"), attr);
-# ifdef FEAT_FKMAP
-		if (p_fkmap)
-		    msg_puts_attr(farsi_text_5, attr);
-# endif
 #endif
 #ifdef FEAT_KEYMAP
 		if (State & LANGMAP)
--- a/src/search.c
+++ b/src/search.c
@@ -1477,12 +1477,8 @@ do_search(
 	    }
 	}
 
-#ifdef FEAT_FKMAP	/* when in Farsi mode, reverse the character flow */
-	if (p_altkeymap && curwin->w_p_rl)
-	     lrFswap(searchstr,0);
-#endif
-
-	c = searchit(curwin, curbuf, &pos, NULL, dirc == '/' ? FORWARD : BACKWARD,
+	c = searchit(curwin, curbuf, &pos, NULL,
+					      dirc == '/' ? FORWARD : BACKWARD,
 		searchstr, count, spats[0].off.end + (options &
 		       (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
 			+ SEARCH_MSG + SEARCH_START
@@ -2976,10 +2972,6 @@ cls(void)
     int	    c;
 
     c = gchar_cursor();
-#ifdef FEAT_FKMAP	/* when 'akm' (Farsi mode), take care of Farsi blank */
-    if (p_altkeymap && c == F_BLANK)
-	return 0;
-#endif
     if (c == ' ' || c == '\t' || c == NUL)
 	return 0;
     if (enc_dbcs != 0 && c > 0xFF)
--- a/src/structs.h
+++ b/src/structs.h
@@ -2952,10 +2952,6 @@ struct window_S
     dict_T	*w_vars;	/* internal variables, local to window */
 #endif
 
-#if defined(FEAT_RIGHTLEFT) && defined(FEAT_FKMAP)
-    int		w_farsi;	/* for the window dependent Farsi functions */
-#endif
-
     /*
      * The w_prev_pcmark field is used to check whether we really did jump to
      * a new line after setting the w_pcmark.  If not, then we revert to
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -118,7 +118,6 @@ NEW_TESTS = \
 	test_expand_func \
 	test_expr \
 	test_expr_utf8 \
-	test_farsi \
 	test_feedkeys \
 	test_file_perm \
 	test_file_size \
@@ -318,7 +317,6 @@ NEW_TESTS_RES = \
 	test_exists.res \
 	test_exists_autocmd.res \
 	test_exit.res \
-	test_farsi.res \
 	test_file_size.res \
 	test_filechanged.res \
 	test_find_complete.res \
deleted file mode 100644
--- a/src/testdir/test_farsi.vim
+++ /dev/null
@@ -1,133 +0,0 @@
-" Simplistic testing of Farsi mode.
-" Note: must be edited with latin1 encoding.
-
-if !has('farsi')
-  finish
-endif
-" Farsi uses a single byte encoding.
-set enc=latin1
-
-func Test_farsi_toggle()
-  new
-
-  set altkeymap
-  call assert_equal(0, &fkmap)
-  call assert_equal(0, &rl)
-  call feedkeys("\<F8>", 'x')
-  call assert_equal(1, &fkmap)
-  call assert_equal(1, &rl)
-  call feedkeys("\<F8>", 'x')
-  call assert_equal(0, &fkmap)
-  call assert_equal(0, &rl)
-
-  set rl
-  " conversion from Farsi 3342 to Farsi VIM.
-  call setline(1, join(map(range(0x80, 0xff), 'nr2char(v:val)'), ''))
-  call feedkeys("\<F9>", 'x')
-  let exp = [0xfc, 0xf8, 0xc1, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
-	   \ 0xc8, 0xc9, 0xca, 0xd0, 0xd1, 0xd2, 0xd3, 0xd6,
-	   \ 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xd8, 0xd9, 0xda,
-	   \ 0xdb, 0xdc, 0xdc, 0xc1, 0xdd, 0xde, 0xe0, 0xe0,
-	   \ 0xe1, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
-	   \ 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae,
-	   \ 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
-	   \ 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe,
-	   \ 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
-	   \ 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce,
-	   \ 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
-	   \ 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde,
-	   \ 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,
-	   \ 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xfb, 0xfb, 0xfe,
-	   \ 0xfe, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,
-	   \ 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xe1,
-           \ ]
-  call assert_equal(join(map(exp, 'nr2char(v:val)'), ''), getline(1))
-
-  " conversion from Farsi VIM to Farsi 3342.
-  call setline(1, join(map(range(0x80, 0xff), 'nr2char(v:val)'), ''))
-  call feedkeys("\<F9>", 'x')
-  let exp = [0xfc, 0xf8, 0xc1, 0x83, 0x84, 0x85, 0x86, 0x87,
-	   \ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x90,
-	   \ 0x90, 0x90, 0x92, 0x93, 0x93, 0x95, 0x96, 0x97,
-	   \ 0x98, 0xdc, 0x9a, 0x9b, 0x9c, 0x9e, 0x9e, 0xff,
-	   \ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
-	   \ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
-	   \ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
-	   \ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
-	   \ 0xc0, 0xc1, 0xc2, 0x83, 0x84, 0x85, 0x86, 0x87,
-	   \ 0x88, 0x89, 0x8a, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
-	   \ 0x8b, 0x8c, 0x8d, 0x8e, 0xd4, 0xd5, 0x90, 0x93,
-	   \ 0x95, 0x96, 0x97, 0x98, 0x99, 0x9b, 0x9c, 0xdf,
-	   \ 0x9d, 0xff, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
-	   \ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xec, 0xee, 0xef,
-	   \ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-	   \ 0xf8, 0xf9, 0xfa, 0xec, 0x80, 0xfd, 0xee, 0xff,
-           \ ]
-  call assert_equal(join(map(exp, 'nr2char(v:val)'), ''), getline(1))
-
-  bwipe!
-endfunc
-
-func Test_farsi_map()
-  new
-
-  set altkeymap
-  set rl
-  " RHS of mapping is reversed.
-  imap xyz abc
-  call feedkeys("axyz\<Esc>", 'tx')
-  call assert_equal('cba', getline(1))
-
-  set norl
-  iunmap xyz
-  set noaltkeymap
-  bwipe!
-endfunc
-
-func Test_input_farsi()
-  new
-  setlocal rightleft fkmap
-  " numbers switch input direction
-  call feedkeys("aabc0123456789.+-^%#=xyz\<Esc>", 'tx')
-  call assert_equal("\x8cÌν®¥ª­«¦¹¸·¶µ´³²±°Ô\x93Õ", getline('.'))
-
-  " all non-number special chars with spaces
-  call feedkeys("oB E F H I K L M O P Q R T U W Y ` !  @ # $ % ^ & * () - _ = + \\ | : \" .  / < > ? \<Esc>", 'tx')
-  call assert_equal("¡ ô ú À ö æ ç Â [ ] ÷ ó ò ð õ ñ ¢ £  § ® ¤ ¥ ª ¬ è ¨© ­ é ½ « ë ê º » ¦  ¯ ¾ ¼ ¿ ", getline('.'))
-
-  " all non-number special chars without spaces
-  call feedkeys("oBEFHIKLMOPQRTUWY`!@#$%^&*()-_=+\\|:\"./<>?\<Esc>",'tx')
-  call assert_equal("¡ôúÀöæçÂ[]÷óòðõñ¢£§®¤¥ª¬è¨©­é½«ë꺻¦¯¾¼¿", getline('.'))
-
-  " all letter chars with spaces
-  call feedkeys("oa A b c C d D e f g G h i j J k l m n N o p q r s S t u v V w x X y z Z ; \ , [ ] \<Esc>", 'tx')
-  call assert_equal("Ñ ù Ì Î Ï á þ Æ Ã Ü ø Á à Å ü Þ Ý Ä Ë Ë Ê É Ó Ù Ð û Ø Ö Í Í Ò Ô Ô × Õ ý Ú  ß Ç È ", getline('.'))
-
-  " all letter chars without spaces
-  call feedkeys("oaAbcCdDefgGhijJklmnNopqrsStuvVwxXyzZ;\,[]\<Esc>", 'tx')
-  call assert_equal("\x8cùÌÎÏ\x9fî\x86\x83ÜøÁ\x9d\x85\x80\x9c\x9b\x84ËË\x8a\x89\x8e\x96\x8bì\x95\x90ÍÍ\x8dÔÔ\x93Õý\x97ß\x87\x88", getline('.'))
-
-  bwipe!
-endfunc
-
-func Test_command_line_farsi()
-  set allowrevins altkeymap
-
-  " letter characters with spaces
-  call feedkeys(":\"\<C-_>a A b c C d D e f g G h i j J k l m n N o p q r s S t u v V w x X y z Z ; \\ , [ ]\<CR>", 'tx')
-  call assert_equal("\"\x88 Ç ß ë Ú Õ Õ × Ô Ô Ò Í Í Ö Ø û Ð Ù Ó É Ê Ë Ë Ä Ý Þ ü Å à Á ø Ü Ã Æ þ á Ï Î Ì ù Ñ", getreg(':'))
- 
-  " letter characters without spaces
-  call feedkeys(":\"\<C-_>aAbcCdDefgGhijJklmnNopqrsStuvVwxXyzZ;\\,[]\<CR>", 'tx')
-  call assert_equal("\"\x88\x87ßëÚÕÕ\x93ÔÔ\x8dÍÍ\x90\x95ì\x8b\x96\x8e\x89\x8aËË\x84\x9b\x9c\x80\x85\x9dÁøÜ\x83\x86î\x9fÏÎÌù\x8c", getreg(':'))
- 
-  " other characters with spaces
-  call feedkeys(":\"\<C-_>0 1 2 3 4 5 6 7 8 9 ` .  !  \" $ % ^ & / () = \\ ?  + - _ * : # ~ @ < > { } | B E F H I K L M O P Q R T U W Y\<CR>", 'tx')
-  call assert_equal("\"ñ õ ð ò ó ÷ ] [ Â ç æ ö À ú ô ¡ ê } { ¼ ¾ § ~ ® º è é ­ «  ¿ ë ½ ©¨ ¯ ¬ ª ¥ ¤ »  £  ¦ ¢ ¹ ¸ · ¶ µ ´ ³ ² ± °", getreg(':'))
-
-  " other characters without spaces
-  call feedkeys(":\"\<C-_>0123456789`.!\"$%^&/()=\\?+-_*:#~@<>{}|BEFHIKLMOPQRTUWY\<CR>", 'tx')
-  call assert_equal("\"ñõðòó÷][ÂçæöÀúô¡ê}{¼¾§~®ºèé­«¿ë½©¨¯¬ª¥¤»£¦¢¹¸·¶µ´³²±°", getreg(':'))
-
-  set noallowrevins noaltkeymap
-endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -255,11 +255,7 @@ static char *(features[]) =
 #else
 	"-extra_search",
 #endif
-#ifdef FEAT_FKMAP
-	"+farsi",
-#else
 	"-farsi",
-#endif
 #ifdef FEAT_SEARCHPATH
 	"+file_in_path",
 #else
@@ -784,6 +780,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    932,
+/**/
     931,
 /**/
     930,
--- a/src/window.c
+++ b/src/window.c
@@ -3445,12 +3445,6 @@ win_init_empty(win_T *wp)
     wp->w_topfill = 0;
 #endif
     wp->w_botline = 2;
-#ifdef FEAT_FKMAP
-    if (wp->w_p_rl)
-	wp->w_farsi = W_CONV + W_R_L;
-    else
-	wp->w_farsi = W_CONV;
-#endif
 #ifdef FEAT_SYN_HL
     wp->w_s = &wp->w_buffer->b_s;
 #endif