📄 eef3.c
字号:
/* ELLE - Copyright 1982, 1984, 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. *//* * EEF3 Various Functions (Yanking, Indentation, miscellaneous) */#include "elle.h"#if FX_APPNKILL/* EFUN: "Append Next Kill" */f_appnkill(){ this_cmd = KILLCMD; /* Fake out next call to ed_kill */}#endif /*FX_APPNKILL*/#if FX_UNKILL/* EFUN: "Un-kill" */f_unkill(){ register SBSTR *sd; if((sd = kill_ring[kill_ptr]) == 0) { ring_bell(); return; } mark_dot = cur_dot; /* Set mark at old location */ mark_p = 1; /* Mark's been set */ sb_sins((SBBUF *)cur_buf,sbs_cpy(sd)); /* Insert copy of stuff */ cur_dot = e_dot(); /* We're now after the new stuff */ buf_tmat(mark_dot); /* Say modified from here to cur_dot*/ this_cmd = YANKCMD;}#endif /*FX_UNKILL*/#if FX_UNKPOP/* EFUN: "Un-kill Pop" */f_unkpop(){ register SBSTR *sd; register int i; if (last_cmd != YANKCMD) { ring_bell (); return; } ed_delete(cur_dot,mark_dot); if(cur_dot > mark_dot) cur_dot = mark_dot; i = KILL_LEN; do { if(--kill_ptr < 0) kill_ptr = KILL_LEN-1; if(sd = kill_ring[kill_ptr]) break; } while(--i); /* kill_ptr now pointing to right place; effect the yank. */ e_gocur(); /* Make sure point at right place too! */ return(f_unkill());}#endif /*FX_UNKPOP*//* Indentation routines - still not polished */#if FX_INDATM/* EFUN: "Indent According to Mode" *//* In Fundamental mode, just inserts a tab.*/f_indatm(){ f_insself(TAB); /* This takes care of mode checking */}#endif /*FX_INDATM*/#if FX_INDNL/* EFUN: "Indent New Line" */f_indnl() /* execute CR followed by tab */{#if IMAGEN /* Not dispatch-based, but rather hard-wired to do Gosmacs thing */ ed_crins(); f_indund();#else cmd_xct(CR); cmd_xct(TAB);#endif /*-IMAGEN*/}#endif /*FX_INDNL*/#if FX_BACKIND/* EFUN: "Back to Indentation"** Moves to end of current line's indentation.*/f_backind(){ e_gobol(); /* First move to beg of line */ e_gofwsp(); /* Then forward over whitespace */ ed_setcur();}#endif /*FX_BACKIND*/#if FX_INDCOMMstatic char *comm_beg = "/* ";static char *comm_end = " */";/* EFUN: "Indent for Comment" */f_indcomm(){ f_endline(); if(indtion(cur_dot) < ev_ccolumn) ed_indto(ev_ccolumn); else ed_sins(" "); ed_sins (comm_beg); ed_sins (comm_end); e_igoff(-strlen (comm_end)); /* back over end string */ e_setcur();}#endif /*FX_INDCOMM*/#if FX_INDREL/* EFUN: "Indent Relative" *//* This used to mistakenly be called Indent Under.** Still not fully implemented.** If at beginning of line, looks back at previous indented line,** and indents this line that much. If there is no preceding indented** line or not at beginning of line, insert a tab.*/f_indrel(){ register int c; register n;#if IMAGEN chroff savdot;#endif /*IMAGEN*/#if ICONOGRAPHICS chroff savdot; int curind, newind, morebuf;#endif /*ICONOGRAPHICS*/ if((c = e_rgetc()) == EOF)#if IMAGEN return(f_insself(TAB)); /* Do mode-based tabbing */#else return(ed_insert(TAB));#endif /*-IMAGEN*/ if(c == LF) { e_gobol(); e_gofwsp(); n = d_curind(); e_gonl(); /* Return to orig pos */ if(n) { ed_indto(n);#if IMAGEN savdot = e_dot(); e_gofwsp(); ed_delete(savdot, e_dot());#endif /*IMAGEN*/ return; } }#if ICONOGRAPHICS else { e_igoff (1); curind = indtion (savdot = e_dot ()); /* get current dot and indentation */ while (1) /* find a prev line that extends rightward */ { morebuf = e_gopl (); e_goeol (); if ((newind = d_curind()) > curind) break; if (morebuf == 0) /* hit beginning of buffer */ { e_go (savdot); f_delspc(); return (1); } } e_gobol (); e_igoff (inindex (e_dot (), curind)); if (d_curind() > curind) e_rgetc (); /* pushed ahead by tab */ while (c_wsp (e_getc ()) == 0) ; e_backc (); e_fwsp (); newind = d_curind(); e_go (savdot); f_delspc(); ed_indto (newind); }#else else e_getc();#if IMAGEN f_insself(TAB); /* Do mode-based tabbing */#else ed_insert(TAB);#endif /*-IMAGEN*/#endif /*-ICONOGRAPHICS*/}#endif /*FX_INDREL*//* Paren matching stuff. Note that this stuff will be very painful unless** tinwait() works properly.*/#if 0/* EFUN: "Self-Insert and Match" (intended to be bound to brackets) *//* (KLH: Evidently this was never finished)*/insertmatch(c)register int c;{ }#endif/* Should change this to Matching Paren */#if FX_MATCHBRACK/* EFUN: "Match Bracket" (not EMACS) - from IMAGEN config * Show the matching bracket for the character right before dot */f_matchbrack(){ chroff savdot; register int i, mc, secs; if (exp_p) secs = exp; else secs = 1; savdot = cur_dot; /* Save our location */ mc = e_rgetc(); /* Pick up character before dot */ if (mc != ')' && mc != ']' && mc != '}') { e_getc(); /* Nothing, try at dot instead */ e_getc(); mc = e_rgetc(); if (mc != ')' && mc != ']' && mc != '}') { ding("What bracket?"); e_go(savdot); return; } } if (! matchonelevel(mc)) ring_bell(); else { ed_setcur(); if (d_line(cur_dot) < 0) secs = 10; /* Wait longer if off-screen */ redisplay(); /* Wish it were simple upd_wind() */ for (i = 1; i <= secs; ++i) { if (tinwait()) break; sleep(1); } } e_gosetcur(savdot); /* Back to origin */ redp(RD_MOVE); /* Cursor has moved */}/* Try to match 'mc', return true iff found it */matchonelevel(mc)register int mc;{ register int c; while ((c = e_rgetc()) != EOF) { if (c == /*[*/ ']' || c == /*(*/ ')' || c == /*{*/ '}') { if (! matchonelevel(c)) break; } else if (c == '(' /*)*/) return(mc == /*(*/ ')'); else if (c == '[' /*]*/) return(mc == /*[*/ ']'); else if (c == '{' /*}*/) return(mc == /*{*/ '}'); } return(0);}#endif /*FX_MATCHBRACK*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -