📄 eekmac.c
字号:
/* ELLE - Copyright 1982, 1985, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. *//* EEKMAC - Keyboard Macro routines * Modelled after the "e_macro.c" for ICONOGRAPHICS * by C. D. Tavares, 9/11/82 */#include "elle.h"#if FX_SKMAC /* Entire file is under this conditional! */int kdef_mode; /* Set when collecting (a "minor mode") */static int km_flag = 0; /* 1 = executing, -1 collecting, 0 neither */static int km_exp; /* Arg to "Execute Kbd Macro" - # times more to xct */static struct buffer *km_buf;/* EFUN: "Start Kbd Macro" */f_skmac(){ register struct buffer *b; struct buffer *make_buf(); if(km_flag) { ding("Kbd macro active, ignoring \"Start Kbd Macro\""); return; } if((b = km_buf) == 0) b = km_buf = make_buf(" *KBDMAC*"); ex_reset(b); km_flag = -1; /* Say starting macro collection */ kdef_mode = 1; redp(RD_MODE);}/* EFUN: "End Kbd Macro" */f_ekmac(){ if(km_flag > 0 && (--km_exp >= 0)) { ex_go((SBBUF *)km_buf, (chroff)0); } else if(km_flag) { km_flag = 0; kdef_mode = 0; /* Flush minor mode */ redp(RD_MODE); }}/* EFUN: "Execute Kbd Macro" */f_xkmac(){ if(km_flag) ding("Already in kbd macro!"); else if(km_buf == 0) ding("No kbd macro defined"); else if((km_exp = exp-1) >= 0) { ex_go((SBBUF *)km_buf, (chroff) 0); km_flag = 1; /* Start macro execution */ }}/* EFUN: "View Kbd Macro" */f_vkmac(){ register struct buffer *b, *savbuf; chroff prmplen; if(!(b = km_buf)) { ding("No kbd macro defined"); return; } savbuf = cur_buf; chg_buf(b); e_gobob(); e_sputz("Current Kbd macro:\n\n"); prmplen = e_dot(); mk_showin(b); /* Show the macro buffer temporarily */ e_gobob(); chg_buf(savbuf); sb_deln((SBBUF *)b, prmplen); /* Flush the prompt */}/* KM_GETC - return next command char from kbd macro being executed.** This is < 0 if not executing kbd macro. Also responsible for** gathering input for kbd macro.*/km_getc(){ register int c; while (km_flag > 0) /* Executing macro? */ { c = sb_getc(((SBBUF *)km_buf)); /* Yes, get char */ if(c != EOF) return(c); /* and return as cmd */ if(--km_exp >= 0) /* Macro done. Repeat? */ ex_go((SBBUF *)km_buf, (chroff)0); /* Yes */ else km_flag = 0; /* No, stop execution */ } c = tgetc(); /* Get char from user (TTY) */ if(km_flag < 0) /* Save it if collecting macro */ { sb_putc(((SBBUF *)km_buf), c); } return(c);}/* KM_INWAIT() - Return TRUE if any keyboard-macro input waiting. */km_inwait(){ register int c; if(km_flag > 0) if((c = sb_getc(((SBBUF *)km_buf))) != EOF || (km_exp > 0)) { sb_backc(((SBBUF *)km_buf)); return(1); } return(0);}km_abort (){ if(km_flag > 0) /* Executing? */ km_flag = 0; /* Stop */ else if(km_flag < 0) /* Collecting? */ f_ekmac(); /* Close it out */}#endif /*FX_SKMAC*/#if 0 /* Old unused stuff */static char mode_buf [60];add_mode (mode) char *mode; { register char *cur, *c, *m; if (cur_mode != mode_buf) { strcpy (mode_buf, cur_mode); cur_mode = mode_buf; } if (cur_mode [0]) strcat (cur_mode, ", "); strcat (cur_mode, mode); make_mode (); }remove_mode (mode) char *mode; { register char *cur, *c, *m; if (*cur_mode == 0) return; if (cur_mode != mode_buf) { strcpy (mode_buf, cur_mode); cur_mode = mode_buf; } for (cur = cur_mode ; *cur ; cur++) if (*cur == *mode) /* 1st char matches */ { for (c = cur, m = mode ; *m && (*m == *c) ; m++, c++) ; if (!(*m)) /* ok, mode matched */ { /* kill leading ", " */ if (*(cur - 1) == ' ') --cur; if (*(cur - 1) == ',') --cur; for ( ; *cur = *c ; cur++, c++) ; /* recopy to end */ make_mode (); return; } } }#endif /*COMMENT*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -