北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 7486|回复: 2

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

[复制链接]
发表于 2006-12-30 11:30:21 | 显示全部楼层 |阅读模式
// /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[0..<2], "/")+"/_"+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;
}

int  help(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/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)                // 呼叫编辑器,开始编辑
{
        int  i;
        mapping me;


        if (objectp(EditedFiles[file]))
        {
                write(sprintf("%s 正在编辑这个档案,请稍候再编辑。\n",
                        capitalize(EditedFiles[file]->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                                         if (me["sText"][j] == '\t')
                                                me["sText"] = replace_string(
                                                        me["sText"], "\t", tabs[0..7-j%8]);
                        }
                }
                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());
        }
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2006-12-30 12:20:58 | 显示全部楼层

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

有的,但zmud这种行输入而非字符输入的方式vi没法用,所以一般都直接edit,或者ftp到本机修改。
thanx!
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2006-12-31 09:43:04 | 显示全部楼层

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

en,我以前在netterm下,使用vi编辑
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-5-3 01:27 PM , Processed in 0.009703 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表