📄 trig.vtc
字号:
Ttrig ?:= new_assoc();&Ttrig->name; &Ttrig->pattern; &Ttrig->reg; &Ttrig->cmd; &Ttrig->pri;&Ttrig->world; &Ttrig->enabled; &Ttrig->rearm; &Ttrig->style;enum(&S_NORM, &S_GAG, &S_NOHISTGAG, &S_HILITE);style_names ?:= table("Normal", "Gag", "No-history gag", "Hilite");trigs ?:= new_list();trig_id ?:= 0;func find_trig(name) [i] { if (!*name) return NULL; if (*name == '#') { i = atoi(name + 1); return i >= 1 && i <= *trigs ? &trigs[i] : NULL; } for (i = 1; i <= *trigs; i++) { if (!stricmp(trigs[i]->name, name)) return &trigs[i]; }}func Find_trig(name) --> efind(.find_trig, "trigger", name)func add_trig(name, pat, cmd, pri, w, on, rearm, style, isreg) [trig, i, r] { if (*name == '#') trig_id = max(atoi(name + 1) + 1, trig_id); else if (!*name) name = "#" + itoa(trig_id++); if (isreg && !(r = regcomp(pat))) return output("regcomp failed\n"); trig = ptable(Ttrig, name, pat, r, cmd, pri, w, on, rearm, style); for (i = 1; i <= *trigs && stricmp(trigs[i]->name, name); i++); if (i <= *trigs) del_list(trigs, i); insert_trig(trig);}func Add_trig(name, pat, cmd, pri, wname, on, rearm, style, isreg) { add_trig(name, pat, cmd, pri, find_world(wname), on, rearm, style, isreg);}func del_trig(name) [t, i, f] { if (*name == '#') { i = atoi(name + 1); if (i >= 1 && i <= *trigs) del_list(trigs, i); else output("Trigger number out of range\n"); return; } for (i = 1; i <= *trigs; i++) { if (*trigs[i]->name != '#' && smatch(name, trigs[i]->name) || smatch(name, trigs[i]->pattern)) { del_list(trigs, i--); f = 1; } } if (!f) printf("Couldn't find trigger %s\n", name);}func edit_trig(name, pri, enabled, rearm, style, world) [t, offset] { t = Find_trig(name); offset = t - trigs; t = *t; if (pri != NULL) { t->pri = pri; del_list(trigs, offset); insert_trig(t); } if (enabled != NULL) t->enabled = enabled; if (rearm != NULL) t->rearm = !rearm; if (style != NULL) t->style = style; if (world == 0) t->world = NULL; else if (world) t->world = world;}func insert_trig(t) [i] { for (i = 1; i <= *trigs && trigs[i]->pri >= t->pri; i++); add_list(trigs, t, i);}func check_triggers(text) [i, pri, trig, style] { pri = 0; style = S_NORM; for (i = 1; i <= *trigs && trigs[i]->pri >= pri; i++) { trig = trigs[i]; if (trig->world && trig->world != cur_world() || !trig->enabled || trig->reg && !regexec(trig->reg, text) || !trig->reg && !smatch(trig->pattern, text)) continue; run_cmd(trig, text); pri = trig->pri; trig->enabled = trig->rearm; style = max(style, trig->style); } return style;}func run_cmd(trig, text) [f, a] { if (!trig->reg) { a = explo(text, " "); a[0] = text; } else a = regmatch_array(trig->reg); f = (type(trig->cmd) == T_FPTR) ? .detach : .process_cmdline; (*f)(trig->cmd, text, a);}func regmatch_array(reg) [a, i] { a = alloc(NSUBEXP); for (i = 0; i < NSUBEXP; i++) a[i] = regmatch(reg, i); return a;}stchars = table('n', 'g', 'G', 'h');func list_trigs(s) [i, trig] { for (i = 1; i <= *trigs; i++) { trig = trigs[i]; if (trig->world && trig->world != cur_world() || *s && !smatch(s, trig->name)) continue; printf("%3d: %4d%c%c %10s %s\n", i, trig->pri, trig->enabled ? '+' : '-', stchars[trig->style], (*trig->name == '#') ? "" : trig->name, trig->pattern); }}func list_style(style, s) [i, trig] { for (i = 1; i <= *trigs; i++) { trig = trigs[i]; if (trig->world && trig->world != cur_world() || trig->style != style || *s && !smatch(s, trig->name)) continue; printf("%3d: %s\n", i, trig->pattern); }}func print_trig(n) [trig] { t = Find_trig(n); trig = *t; if (*trig->name != '#') printf("Name: %s\n", trig->name); printf("%s: %s\n", trig->reg ? "Regexp" : "Pattern", trig->pattern); printf("Priority: %d\n", trig->pri); if (trig->world) printf("World: %s\n", trig->world->name); if (type(trig->cmd) == T_FPTR) printf("Function: %s\n", func_name(trig->cmd)); else printf("Command: %s\n", trig->cmd); output("Flags: "); output(trig->enabled ? "Enabled, " : "Disabled, "); output(trig->rearm ? "Permanent, " : "One-shot, "); printf("%s\n", style_names[trig->style]);}func purge_world_trigs(w) [i] { for (i = 1; i < *trigs; i++) { if (trigs[i]->world == w) del_list(trigs, i--); }}func save_trigs(fp) [i, t] { for (i = 1; i <= *trigs; i++) { t = base(trigs[i]); fprintf(fp, "Add_trig(%s);\n", arglist(t[0], t[1], t[3], t[4], t[5] ? t[5]->name : "", t[6], t[7], t[8], t[2] ? 1 : 0)); }}func Trig(s) [arg, style, pri, pat, cmd, p, w] { s = getopt(s, "e1hgrPNW", arg = table(1, 0, 0, 0, 0, "", "", NULL)); style = arg[2] ? S_HILITE : (arg[3] == 2) ? S_NOHISTGAG : arg[3] ? S_GAG : S_NORM; pri = max(atoi(arg[5]), 0); if (arg[7]) { w = find_world(arg[7]); if (!w) return printf("Can't find world %s\n", arg[7]); } p = strchr(s, '=') ? : s + strlen(s); cmd = strdup(skipspaces(p + 1)); while (*--p == ' ') ; strcpy(pat = "", s, p + 1 - s); add_trig(arg[6], pat, cmd, pri, w, arg[0], !arg[1], style, arg[4]);}func Edit(s) [arg, style, pri, world] { s = getopt(s, "e1hgnPW", arg = alloc(7)); style = arg[2] ? S_HILITE : (arg[3] == 2) ? S_NOHISTGAG : arg[3] ? S_GAG : arg[4] ? S_NORM : NULL; pri = arg[5] ? max(atoi(arg[5]), 0) : NULL; if (arg[6]) { if (!*arg[6]) world = 0; else { world = find_world(arg[6]); if (!world) return printf("Can't find world %s\n", arg[6]); } } edit_trig(s, pri, arg[0], arg[1], style, world);}func Untrig(name) { del_trig(name); }func Hilite(s) { Trig("-h " + s); }func Gag(s) { Trig("-g " + s); }func List_trigs(s) { print_or_list(s, .print_trig, .list_trigs); }func List_norms(s) { list_style(S_NORM, s); }func List_gags(s) { list_style(S_GAG, s); }func List_hilites(s) { list_style(S_HILITE, s); }add_cmd("trig", -1, .Trig, \ "/trig [+|-e1hg] [-p<pri>] [-n<name>] [-w<world>] <pattern> = <cmd>");add_cmd("hilite", -1, .Hilite, \ "/hilite [+|-e1] [-p<pri>] [-n<name>] [-w<world>] <pattern> = <cmd>");add_cmd("gag", -1, .Gag, \ "/gag [+|-e1] [-p<pri>] [-n<name>] [-w<world>] <pattern> = <cmd>");add_cmd("edit", -1, .Edit, "/edit [+|-e1hgn] [-p<pri>] [-w[<world>]] <name>");add_cmd("list_trigs", -1, .List_trigs, "/list_trigs [<which>]");add_cmd("list_norms", -1, .List_norms, "/list_norms");add_cmd("list_gags", -1, .List_gags, "/list_gags");add_cmd("list_hilites", -1, .List_hilites, "/list_hilites");add_cmd("untrig", -1, .Untrig, "/untrig {<name>|#<number>}");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -