献丑了,不知道你们这里有没有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());
}
Re:献丑了,不知道你们这里有没有mudlib里的vi用
有的,但zmud这种行输入而非字符输入的方式vi没法用,所以一般都直接edit,或者ftp到本机修改。thanx!
en,我以前在netterm下,使用vi编辑
en,我以前在netterm下,使用vi编辑
页:
[1]