作者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 發表