ttao 发表于 2006-12-30 11:30:21

献丑了,不知道你们这里有没有mudlib里的vi用

// /cmds/wiz/me.c
//
// Kenny@Broken.History (6/18/1996)

inherit F_CLEAN_UP;
inherit F_VI;                           // 继承编辑功能

int file_exists(string file);

int main(object me, string arg)
{
      string file, oldfile;
      object ob;

      if (in_edit(me)) return notify_fail("你已经在使用编辑器了。\n");
      if (!arg) return notify_fail("指令格式:me <档名>|<物件名>\n");

      seteuid(geteuid(me));
      file = resolve_path(me->query("cwd"), arg); // 取得档名
      if (!file_exists(file)) // check virtual object
      {
                string *path=explode(file, "/");
                oldfile = file;
                file = "/"+implode(path, "/")+"/_"+path[<1];
      }
      if (!file_exists(file))
      {       // 新档
                ob = present(arg, me);// 检查身上的物件
                if (!ob) ob = present(arg, environment(me)); // 检查房间里的物件
                if (ob && me->visible(ob))
                        file = base_name(ob) + ".c"; // 取得物件的档名
                else    file = oldfile;
      }

      start_edit(file);               // 呼叫编辑器,开始编辑
      return 1;
} // main()

int file_exists(string file)
{
      if (!stringp(file) || file=="") return 0;
      return file_size(file)>=0;
}

inthelp(object me)
{
      write(@HELP
指令格式:me <档名>|<物件名>

利用此一指令可直接在线上编辑档案,详细说明请看编辑器内的线上辅助说明。

相关指令:edit、update。
HELP
                );
      return 1;
} // help()

/* Program      : /feature/me.c
* Author       :Kenny@Eternal.Civilization (3/25/1998)
*
* port to chinese wizard group : /feature/vi.c by ken@chinesemud.net (99-3-15)
*/

#include <ansi.h>                     // 定义 ANSI/VT100 终端机的逸脱码

#define ECHO 0                        // 读取输入时要显示字元
#define HIDE 1                        // 读取输入时不显示字元
#define REFRESH 1                     // 读取输入後要重绘画面
#define LOGFILE "static/VI"             // 档案异动记录档

void start_edit(string filename);       // 呼叫编辑器,开始编辑
private void _append(object pl);      // 在游标後面加字
private void _append_line(object pl);   // 在游标底下加一新行
private void _backspace(object pl);   // 删除游标前的字
protected void _confirm_save(string str, object pl); // 离开编辑器前确认存档
private void _del_char(object pl, int bs);      // 删除游标上的字
private void _del_line(object pl);            // 删除整行
private int_dispatcher(object pl);            // 分派指令到不同函式
private void _down(object pl);                  // 游标往下移一行
private void _end(object pl);                   // 将游标移到行尾
private void _esc(object pl);                   // 从输入模式回到命令模式
private void _file_end(object pl);            // 将游标移到档尾
private void _file_head(object pl);             // 将游标移到档头
private void _goto_line(object pl);             // 跳到特定行去
protected void _goto_line_done(string str, object pl, int rein); // 取得行号
private void _help(object pl);                  // 辅助画面
private void _home(object pl);                  // 将游标移到行首
protected void _input(string str, object pl, int fresh); // 读得输入字串
private void _insert(object pl);                // 在游标前面插字
private void _insert_line(object pl);         // 在游标上方加一新行
private void _insert_exclam_mark(object pl);    // 在游标前面插入一个「!」字元
private void _join(object pl);                  // 将下行文字移到此行後面
private void _keymap(object pl);                // 定义新功能键
protected void _keymap_done(string str, object pl); // 取得定义功能键
private void _left(object pl);                  // 游标往左移一字
// 在状态列显示讯息
private varargs void _message(object pl, string str, string callback, int hide,
mixed arg);
protected void _message_done(string str, object pl); // 结束讯息的显示
private void _next_match(object pl);            // 搜寻/替换下个符合字串
private void _page_down(object pl);             // 往下卷一页(22 行)
private void _page_up(object pl);               // 往上卷一页(22 行)
private void _process(object pl);               // 处理输入模式的字串输入
protected void _quit(mixed unused, mixed pl);   // 离开编辑器
private void _refresh(object pl);               // 更新画面
private void _refresh_cursor(object pl);      // 更新游标位置
// 重绘画面
private void _refresh_screen(object pl, int s_row, int e_row, int s_col);
private void _refresh_status(object pl);      // 更新状态列
private void _replace(object pl);               // 字串替换
protected void _replace_done(string str, object pl); // 取得替换字串
private void _right(object pl, int col, int extra);// 游标往右移一字
private void _search(object pl);                     // 字串搜寻
protected void _search_done(string str, object pl);// 取得搜寻字串
private void _tab(object pl);                        // 命令模式下 TAB 键的定位
private void _undef_key(object pl);                  // 取消某功能键定义
protected void _undef_key_done(string str, object pl); // 取得指定功能键
private void _up(object pl);                           // 游标往上移一行
private void _write(object pl);                        // 取得储存档案名称
protected void _write_done(string str, object pl, int quit); // 储存档案

private mapping EditedFiles=([ ]);            // 编辑中的档案
/*
int iS_Row, iE_Row,                           // 可见视窗的始末行号
    iS_Col, iE_Col,                           // 可见视窗的始未栏位
    iRow,   iCol,                               // 游标位置
    is_Command_Mode, is_NewFile, is_Modify,   // 档案状况旗标
    is_Substituted;                           // 代换内码旗标
string *sText,                                  // 档案内容
       sChar, sOldChar,                         // 输入字串(命令)
       sCount,                                  // 命令计数
       sFileName,                               // 编辑档名
       sSearch, sReplace;                     // 搜寻/替换字串
mapping keymap;                                 // 功能键定义对照表
*/

void start_edit(string file)                // 呼叫编辑器,开始编辑
{
      inti;
      mapping me;


      if (objectp(EditedFiles))
      {
                write(sprintf("%s 正在编辑这个档案,请稍候再编辑。\n",
                        capitalize(EditedFiles->query("id"))));
                return;
      } // if
      this_player()->set_temp("me", ([ ]));
      me = this_player()->query_temp("me");
      me["sFileName"] = file;
      if (file_size(file) <= 0)
      {      // 档案长度小於 1
                me["sText"] = ({ "" });
                if (file_size(file) < 0)
                {      // 新档
                        me["is_Command_Mode"] = 0;
                        me["is_NewFile"] = 1;
                }
      }
      else
      {
                string content=read_file(file), tabs="      ";

                // 档案长度大於 0
                me["is_Command_Mode"] = 1;
                me["is_NewFile"] = 0;
                if (stringp(content))
                {
                        me["sText"] = explode(read_file(file), "\n");
                        // 将 TAB,以 8 个空白代替,以方便游标位置的计算
                        for (i=sizeof(me["sText"])-1; i>=0; i--)
                        {
                              int len=sizeof(me["sText"]);
                              reset_eval_cost();
                              for (int j=0; j<len; j++)
                                        if (me["sText"] == '\t')
                                                me["sText"] = replace_string(
                                                        me["sText"], "\t", tabs);
                        }
                }
                else me["sText"] = ({ "" });
      } // old file

      me["sCount"] = "";
      me["sSearch"] = me["sReplace"] = me["is_Modify"] = 0;
      me["iE_Row"] = 23;
      me["iS_Row"] = me["iS_Col"] = me["iRow"] = me["iCol"] = 1;
      EditedFiles += ([ file: this_player()->link() ]);

      // 取得/设定功能键定义对照表
             if (!mapp(me["keymap"] = this_player()->query("me_keymap")))
                     me["keymap"] = ([ ]);
      if (this_player()->query("me_no_help") ||
            this_player()->query_temp("no_me_help"))
      {      // 非第一次使用编辑器,直接进入编辑器
                _refresh_screen(this_player(), 1, 23, 1);

                get_char("_input", HIDE, this_player());
      }

icer 发表于 2006-12-30 12:20:58

Re:献丑了,不知道你们这里有没有mudlib里的vi用

有的,但zmud这种行输入而非字符输入的方式vi没法用,所以一般都直接edit,或者ftp到本机修改。
thanx!

ttao 发表于 2006-12-31 09:43:04

en,我以前在netterm下,使用vi编辑

en,我以前在netterm下,使用vi编辑
页: [1]
查看完整版本: 献丑了,不知道你们这里有没有mudlib里的vi用