回精華區
作者chwaian.bbs@processor.tfcis.org (無言) 看板: Maple_itoc
標題Re: vedit的KEY_UP、KEY_DOWN可跳行還原ve_col
時間動力核心 (04/19/04 00:58:36 Mon) Updated: 2005/03/16
假設文章內文為這樣

------------
一二三四五
一二三
         (空行)
一二三四
一二三四五
-------------

如果在第一行的最後面一直按KEY_DOWN

游標的移動方式如下

------------
 一二三四五_
 一二三_
_        (空行)
_一二三四
_一二三四五
-------------

改完這篇後

------------
 一二三四五_
 一二三_
_        (空行)
 一二三四_
 一二三四五_
-------------


  但是在 Ctrl+V 的 ansi-mode 之下,仍和之前移動方式一樣


: edit.c

static int ve_col;
+ static int ve_coll;    /* last cursor position (column) */

: edit.c:ve_char()

    if (mode & VE_ANSI)
      col = ansi2n(n2ansi(col, p), p);

-   ve_col = col;
+   ve_col = ve_coll = col;
    return;
  }
  ...
  ...
  data[col++] = ch;
- ve_col = col;
+ ve_col = ve_coll = col;
  p->len = ++len;

: edit.c:vedit()

- ve_col = ve_row = margin = 0;
+ ve_col = ve_coll = ve_row = margin = 0;
  ve_lno = 1;
  ve_mode = VE_INSERT | VE_REDRAW | VE_FOOTER;

  ...
  ...

      case KEY_BKSP:            /* backspace */
        ...
        ...
        if (col)
        {
-         delete_char(vln, ve_col = --col);
+         delete_char(vln, ve_col = ve_coll = --col);
          continue;
        }

  ...
  ...

      case KEY_DEL:             /* delete current character */
        ...
        ...
            ve_col = ansi2n(n2ansi(col, vln), vln);
        }
+       ve_coll = ve_col;
        continue;

      case KEY_LEFT:
        ...
        ...
-         ve_col = (mode & VE_ANSI) ? ansi2n(pos - 1, vln) : col - 1;
+         ve_col = ve_coll = (mode & VE_ANSI) ? ansi2n(pos - 1, vln) : col - 1;
          continue;

  ...
  ...

      case KEY_RIGHT:

        if (vln->len != col)
        {
-         ve_col = (mode & VE_ANSI) ? ansi2n(pos + 1, vln) : col + 1;
+         ve_col = ve_coll = (mode & VE_ANSI) ? ansi2n(pos + 1, vln) : col + 1;
          continue;
        }

  ...
  ...

      case KEY_HOME:
      case Ctrl('A'):

-       ve_col = 0;
+       ve_col = ve_coll = 0;
        continue;


      case KEY_END:
      case Ctrl('E'):

-       ve_col = vln->len;
+       ve_col = ve_coll = vln->len;
        continue;

  ...
  ...

      case KEY_UP:
        ...
        ...
          if (col > cc)
            ve_col = cc;
+         else
+           ve_col = (cc < ve_coll) ? cc : ve_coll;  /* 還原先前的 ve_col */

  ...
  ...

      case KEY_DOWN:

          if (col > cc)
            ve_col = cc;
+         else
+           ve_col = (cc < ve_coll) ? cc : ve_coll;  /* 還原先前的 ve_col */

      case Ctrl('S'):           /* start of file */

        vx_cur = vx_top = vx_ini;
-       ve_col = ve_row = 0;
+       ve_col = ve_coll = ve_row = 0;
        ve_lno = 1;
        ve_mode = mode | VE_REDRAW;
        continue;

  ...
  ...

      case Ctrl('Y'):           /* delete current line */

-       vln->len = ve_col = 0;
+       vln->len = ve_col = ve_coll = 0;
        vln->data[0] = '\0'; /* Thor.981001: 將內容一併清除 */

      case Ctrl('K'):           /* delete to end of line */

        if (cc = vln->len)
        {
          if (cc != col)
          {
-           vln->len = col;
+           vln->len = ve_coll = col;
            vln->data[col] = '\0';
            continue;



不知道有沒有漏改或有問題的地方 @_@


--
  Origin:  Maple-itoc˙動力核心  processor.tfcis.org 
  Author: chwaian 218-171-118-64.dynamic.hinet.net 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻