回精華區
作者itoc, 信區: itoc
標題[功能] edit.c 編輯文章時搜尋字串
時間03/08/24
作者: itoc (寫不完了 ^^) 看板: plan
標題: [功能] 編輯文章時搜尋字串
時間: Sat Aug 23 20:59:41 2003                          Updated: 2003/08/23

※ 引述《cpd.bbs@pitch.twbbs.org (Seasons)》之銘言:
> 就是在編輯文章的時候...不知道maple有沒有尋找字串的功能呢?
> 像joe一樣,按 ^kf 或 Esc + s 就能尋找字串...
> 像一篇文章很長的時候,就可以按E來編輯搜尋要找的字串...

  由於 edit 時的按鍵 Ctrl+? 都有功能佔去了
  所以要先抓出一個按鍵,在此以 Ctrl('B') 做例子
  你也可以自己選別的鍵

: edit.c:vedit() 由於 Ctrl('B') 可以用 KEY_PGUP 取代
:                所以把 Ctrl('B') 釋放出來給別的功能用

int             /* -1:取消編輯 0:完成編輯 */
vedit(fpath, ve_op)
  char *fpath;
  int ve_op; /* 0:純粹編輯檔案  -1:編輯但不能儲存  1:quote/header  2:quote */
{
  textline *vln, *tmp;
  int cc, col, mode, margin, pos;
+ char hunt[32];

  /* --------------------------------------------------- */
  /* 初始設定:載入檔案、引用文章、設定編輯模式          */
  /* --------------------------------------------------- */

+ hunt[0] = '\0';
  tmp = vln = ve_alloc();

  ...
  ...

      case KEY_PGUP:
-     case Ctrl('B'):

        ve_pageup();
        continue;

   ...
   ...

+     case Ctrl('B'):
+
+       if (vget(b_lines, 0, "搜尋:", hunt, sizeof(hunt), GCARRY))
+       {
+         if (!ve_search(hunt))
+         {
+           vmsg("找不到您想搜尋的字串");
+           ve_mode = mode | VE_FOOTER;
+         }
+       }
+       continue;

      default:

        goto ve_key;
      }

: edit.c:ve_search() 新增此函式於 ve_goto() 後面

static inline int
ve_search(hunt)
  char *hunt;
{
  textline *cur, *top, *tmp;
  uschar *str, *pend;
  int len, find;

  len = strlen(hunt);
  find = 0;

  for (cur = vx_cur; cur; cur = cur->next)   /* 往下搜尋 */
  {
    str = cur->data + (cur == vx_cur ? ve_col + 1: 0);
    pend = str + cur->len - len + 1;

    while (str < pend)
    {
      if (!str_ncmp(str, hunt, len))
      {
        ve_col = str - cur->data;
        find = 1;
        goto find_hunt;
      }
      str++;
    }
  }

find_hunt:

  if (find)
  {
    top = cur;

    for (len = 0; len < 10; len++)
    {
      if (!(tmp = top->prev))
        break;
      top = tmp;
    }

    vx_cur = cur;
    vx_top = top;
    ve_lno = len;

    ve_position(cur, top);
  }

  return find;
}

--
□ 本文章由 itocitoc.Dorm11.NCTU.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻