예제 #1
0
파일: farsi.c 프로젝트: Happy-Dude/neovim
/// Convert the given Farsi character into a _X or _X_ type
///
/// @param c The character to convert.
///
/// @return Farsi character converted to 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(get_cursor_line_ptr()))) {
        inc_cursor();
        if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
          tempc = _HE_;
        }
        dec_cursor();
      }

      if (!p_ri && STRLEN(get_cursor_line_ptr())) {
        dec_cursor();
        if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
          tempc = _HE_;
        }
        inc_cursor();
      }

      return tempc;
  }
  return 0;
}
예제 #2
0
파일: farsi.c 프로젝트: Happy-Dude/neovim
/// 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);
  }
}
예제 #3
0
파일: farsi.c 프로젝트: phodge/neovim
/// Convert the given Farsi character into a _X or _X_ type
///
/// @param c The character to convert.
///
/// @return Farsi character converted to a _X or _X_ type.
static char_u toF_Xor_X_(int c)
{
  char_u tempc;

  switch (c) {
    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 AYN    : tempc = _AYN    ; break;
    case AYN_   : tempc = _AYN_   ; break;
    case GHAYN  : tempc = _GHAYN  ; break;
    case GHAYN_ : tempc = _GHAYN_ ; break;
    case FE     : tempc = _FE     ; break;
    case GHAF   : tempc = _GHAF   ; break;
    case KAF    : tempc = _KAF    ; break;
    case GAF    : tempc = _GAF    ; break;
    case LAM    : tempc = _LAM    ; break;
    case MIM    : tempc = _MIM    ; break;
    case NOON   : tempc = _NOON   ; break;
    case YE     :
    case YE_    : tempc = _YE     ; break;
    case YEE    :
    case YEE_   : tempc = _YEE    ; break;
    case IE     :
    case IE_    : tempc = _IE     ; break;
    case F_HE   :
      tempc = _HE;

      if (p_ri
          && (curwin->w_cursor.col + 1
              < (colnr_T)STRLEN(get_cursor_line_ptr()))) {
        inc_cursor();
        if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
          tempc = _HE_;
        }
        dec_cursor();
      }

      if (!p_ri && STRLEN(get_cursor_line_ptr())) {
        dec_cursor();
        if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) {
          tempc = _HE_;
        }
        inc_cursor();
      }

      break;

    default:
      tempc = 0;
  }

  return tempc;
}
예제 #4
0
파일: farsi.c 프로젝트: Happy-Dude/neovim
/// Map Farsi keyboard when in cmd_fkmap mode.
///
/// @param c
///
/// @return The mapped character.
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;
}
예제 #5
0
파일: farsi.c 프로젝트: phodge/neovim
/// 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 (ascii_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) {
        if (!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((char_u)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((char_u)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((char_u)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((char_u)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(get_cursor_line_ptr())) {
        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;
        }
        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(get_cursor_line_ptr())) {
        if (p_ri) {
          chg_c_to_X_or_X();
        }
      }

      if (!p_ri) {
        if (!curwin->w_cursor.col) {
          return ALEF;
        }
        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(get_cursor_line_ptr())) {
        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(get_cursor_line_ptr())) {
        if (p_ri) {
          chg_c_to_X_or_X();
        }
      }

      if (!p_ri) {
        if (!curwin->w_cursor.col) {
          return TEE;
        }
        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(get_cursor_line_ptr())) {
        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(get_cursor_line_ptr())) {
        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(get_cursor_line_ptr())) {
      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;
}