/* MACBIND.C - Customized BINDINGS.C This contains MMakMacro and MDoMacro, which build and execute macros. MMakMacro is bound to M-M and MDoMacro is bound to M-C-M. Macros are saved in spare. Written by Barry A. Dobyns. 07/25/81. Modifications Record: 07/25/81 Original implementation in MINCE 2.6 completed. [BAD]. Also, This contains the MNewDsp and MRNewDsp, which take arguments. The argument indicates how many lines to move down or up before doing a NewDsp. Without an arg, they are equivalent to a single NewDsp. I always seem to be doing a C-U nn C-N C-L or C-U nn C-P C-L and this takes care of that for me in an elegant way. Written by Barry A. Dobyns 07/22/81. Modifications Record: 07/22/81 Original implementation in MINCE 2.6 completed. [BAD]. This one has MIncSearch() and MIncRSearch() which implement incremental searches in a way halfway between Mince's non-incremental MSearch and EMACS ^R Incremental Search. The MIncSearch gets the search argument all at once, like MSearch, and unlike ^R Incremental Search but leaves the point after the best match (the most matches from left to right for the search arg) unlike MSearch and like ^R Incremental Search. I have taken the liberty of binding them to C-R and C-S so as to replace the regular MSearch and MRsearch, since I couldn't find any other good ways to name them consistent with the current naming philosophy. MIncSearch() and MIncRSearch() written by Barry A. Dobyns 07/07/81. Modifications record: 07/07/81 Original Implementation in MINCE 2.5 completed. [BAD]. 07/22/81 Bug fixes and installation in Version 2.6. Significant speed improvements by running under 2.6, even with the redisplay, it is still faster than the old 2.5 searches alone. I strongly do not reccommend permanent implementation in 2.5. [BAD]. 07/23/81 Renamed to MSearch and MRSearch to save space. I only need one set of search commands at a time. Since L2 and CLINK both ignore all occurences of a function except for the first. With COMM1 ahead of the -l option on the L2 command line, we MUST name these guys the same as the functions they replace, or edit them out of either the source (before compilation) or the .CRL (with CLIB). I can compile and link this into a small -e7900 MINCE in 2.6, but I believe my TERM routines are a bit shorter overall, so you may not be able to. [BAD]. 09/19/81 Renamed back to MIncSearch and MIncRSearch, since I have moved MSearch and MRSearch, along with all of the page mode functions [e.g. MP????() ] into COMM4.C so that they will not be linked in anymore. COMM4.C appears after the -l switch on the L2 command line. Page Mode is commented out of BINDINGS.C. It is tempting to put all of the COMMn.C files after the -l option, and not play musical source code anymore. [BAD]. */ /* BINDINGS.C - Set up the key bindings for Mince The seller of this software hereby disclaims any and all guarantees and warranties, both express and implied. No liability of any form shall be assumed by the seller, nor shall direct, consequential, or other damages be assumed by the seller. Any user of this software uses it at his or her own risk. Due to the ill-defined nature of "fitness for purpose" or similar types of guarantees for this type of product, no fitness for any purpose whatsoever is claimed or implied. The physical medium upon which the software is supplied is guaranteed for one year against any physical defect. If it should fail, return it to the seller, and a new physical medium with a copy of the purchased software shall be sent. The seller reserve the right to make changes, additions, and improvements to the software at any time; no guarantee is made that future versions of the software will be compatible with any other version. The parts of this disclaimer are severable and fault found in any one part does not invalidate any other parts. Copyright (c) 1981 by Mark of the Unicorn Created for Version 2.3 10/4/80 JTL Updated to version three 1/7/81 JTL This file contains the function table initializers and mode set up functions */ #include "mince.gbl" finit1() /* initialize the control and self insert key bindings */ { int cnt; int MInsert(), MSetMrk(), MBegLin(), MPrevChar(); int MNotImpl(), MDelChar(), MEndLin(), MNextChar(); int MAbort(), MDelLin(), MNewDsp(), MNewLin(); int MNextLin(), MOpenLin(), MPrevLin(), MQuote(); int MIncRSearch(), MIncSearch(), MSwapChar(), MArg(); int MNextPage(), MDelRgn(), MCtrlX(), MYank(); int MMeta(), MDelIndent(), MRDelChar(), MIndent(); for (cnt=0; cnt<128; ++cnt) functs[cnt] = MInsert; TKbChk(); */ functs[1] = MBegLin; /* C-A */ functs[2] = MPrevChar; /* C-B */ functs[3] = MNotImpl; /* C-C */ functs[4] = MDelChar; /* C-D */ functs[5] = MEndLin; /* C-E */ functs[6] = MNextChar; /* C-F */ functs[7] = MAbort; /* C-G */ functs[8] = MPrevChar; /* C-H */ /* C-I */ functs[10] = MIndent; /* C-J */ functs[11] = MDelLin; /* C-K */ functs[12] = MNewDsp; /* C-L */ functs[13] = MNewLin; /* C-M */ functs[14] = MNextLin; /* C-N */ functs[15] = MOpenLin; /* C-O */ functs[16] = MPrevLin; /* C-P */ functs[17] = MQuote; /* C-Q */ functs[18] = MIncRSearch; /* C-R */ functs[19] = MIncSearch; /* C-S */ functs[20] = MSwapChar; /* C-T */ functs[21] = MArg; /* C-U */ functs[22] = MNextPage; /* C-V */ functs[23] = MDelRgn; /* C-W */ functs[24] = MCtrlX; /* C-X */ functs[25] = MYank; /* C-Y */ functs[26] = MNotImpl; /* C-Z */ functs[ESC] = MMeta; /* ESC */ functs[28] = MDelIndent; /* C-\ */ functs[29] = MNotImpl; /* C-] */ functs[30] = MNotImpl; /* C-^ */ functs[31] = MNotImpl; /* C-_ */ functs[DEL] = MRDelChar; /* DEL */ } finit2() /* set up the Meta key bindings */ { int cnt; int MNotImpl(), MAbort(), MDelELin(), MRNewDsp(); int MDoMacro(), MQryRplc(); int MMakeDel(), MToStart(), MToEnd(), MBSent(); int BWord(), MCapWord(), MDelWord(), MFSent(); int FWord(), MMrkPara(), MDelSent(), MLowWord(); int MMakMacro(), MFillPara(), MReplace(), MCntrLine(), MUpWord(); int MPrevPage(), MCopyRgn(), MBPara(), MDelWhite(); int MFPara(), MRDelWord(), MSetMrk(), MSwapWord(); for (cnt=128; cnt<256; ++cnt) functs[cnt] = MNotImpl; TKbChk(); functs[128+7] = MAbort; /* M-C-G */ functs[128+8] = MRDelWord; /* M-C-H */ functs[128+11] = MDelELin; /* M-C-K */ functs[128+12] = MRNewDsp; /* M-C-L */ functs[128+13] = MDoMacro; /* M-C-M */ functs[128+18] = MQryRplc; /* M-C-R */ functs[128+23] = MMakeDel; /* M-C-W */ functs[128+'<'] = MToStart; /* M-< */ functs[128+'>'] = MToEnd; /* M-> */ functs[128+' '] = MSetMrk; /* M- */ functs[128+'A']=functs[128+'a'] = MBSent; /* M-A */ functs[128+'B']=functs[128+'b'] = BWord; /* M-B */ functs[128+'C']=functs[128+'c'] = MCapWord; /* M-C */ functs[128+'D']=functs[128+'d'] = MDelWord; /* M-D */ functs[128+'E']=functs[128+'e'] = MFSent; /* M-E */ functs[128+'F']=functs[128+'f'] = FWord; /* M-F */ functs[128+'H']=functs[128+'h'] = MMrkPara; /* M-H */ functs[128+'K']=functs[128+'k'] = MDelSent; /* M-K */ functs[128+'L']=functs[128+'l'] = MLowWord; /* M-L */ functs[128+'M']=functs[128+'m'] = MMakMacro; /* M-M */ functs[128+'Q']=functs[128+'q'] = MFillPara; /* M-Q */ functs[128+'R']=functs[128+'r'] = MReplace; /* M-R */ functs[128+'S']=functs[128+'s'] = MCntrLine; /* M-S */ functs[128+'T']=functs[128+'t'] = MSwapWord; /* M-T */ functs[128+'U']=functs[128+'u'] = MUpWord; /* M-U */ functs[128+'V']=functs[128+'v'] = MPrevPage; /* M-V */ functs[128+'W']=functs[128+'w'] = MCopyRgn; /* M-W */ functs[128+'['] = MBPara; /* M-[ */ functs[128+'\\'] = MDelWhite; /* M-\ */ functs[128+']'] = MFPara; /* M-] */ functs[128+DEL] = MRDelWord; /* M-DEL */ } finit3() /* set up the Control-X key bindings */ { int cnt; int MNotImpl(), MLstBuffs(), MExit(), MFindFile(); int MAbort(), MSetTabs(), MDelMode(), MFileRead(); int MFileSave(), MFileWrite(), MSwapMrk(), MSetIndent(); int MPrintPos(), MSwitchTo(), MKillBuff(), MSetFill(); int MAddMode(), MOneWind(), MTwoWind(), MSwpWind(); int MNxtOthrWind(), MPrvOthrWind(), MGrowWind(); #ifdef UNIX int MUnix(); #endif for (cnt=256; cnt<384; ++cnt) functs[cnt] = &MNotImpl; TKbChk(); functs[256+2] = MLstBuffs; /* C-X C-B */ functs[256+3] = MExit; /* C-X C-C */ functs[256+6] = MFindFile; /* C-X C-F */ functs[256+7] = MAbort; /* C-X C-G */ functs[256+9] = MSetTabs; /* C-X Tab */ functs[256+13] = MDelMode; /* C-X C-M */ functs[256+18] = MFileRead; /* C-X C-R */ functs[256+19] = MFileSave; /* C-X C-S */ functs[256+22] = MNxtOthrWind; /* C-X C-V */ functs[256+23] = MFileWrite; /* C-X C-W */ functs[256+24] = MSwapMrk; /* C-X C-X */ functs[256+26] = MPrvOthrWind; /* C-X C-Z */ functs[256+'.'] = MSetIndent; /* C-X . */ #ifdef UNIX functs[256+'!'] = MUnix; /* C-X ! */ #endif functs[256+'='] = MPrintPos; /* C-X = */ functs[256+'1'] = MOneWind; /* C-X 1 */ functs[256+'2'] = MTwoWind; /* C-X 2 */ functs[256+'B']=functs[256+'b'] = MSwitchTo; /* C-X B */ functs[256+'K']=functs[256+'k'] = MKillBuff; /* C-X K */ functs[256+'F']=functs[256+'f'] = MSetFill; /* C-X F */ functs[256+'M']=functs[256+'m'] = MAddMode; /* C-X M */ functs[256+'O']=functs[256+'o'] = MSwpWind; /* C-X O */ functs[256+'^'] = MGrowWind; /* C-X ^ */ } SetModes() /* Set the modes according to the bmodes array */ { int cnt; int MFillChk(); /* These are for the (unnecessary) page mode int MOverwrite(), MPBegLine(), MInsert(); int MPBChar(), MPEndLine(), MPFChar(), MPBackSpace(); int MPNextLine(), MPPrevLine(), MTrimWhite(), MPTab(); */ #ifdef LARGE int MNewLin(), MCIndent(), MSInsert(); #endif *mode='\0'; finit1(); /* Set up the key bindings */ finit2(); finit3(); for (cnt=MAXMODES-1; cnt>=0; --cnt) { switch (buffs[cbuff].bmodes[cnt]) { #ifdef LARGE case 'c': functs[13] = MCIndent; strcat(mode,"C "); break; case 's': Rebind(MInsert,MSInsert); strcat(mode,"Save "); break; #endif case 'f': functs[' '] = MFillChk; strcat(mode,"Fill "); break; /* case 'p': Rebind(MInsert,MOverwrite); functs[1] = MPBegLine; functs[2] = MPBChar; functs[5] = MPEndLine; functs[6] = MPFChar; functs[8] = MPBackSpace; functs[9] = MPTab; functs[14] = MPNextLine; functs[16] = MPPrevLine; functs[256+'\\'] = MTrimWhite; strcat(mode,"Page "); break; */ } } if (!*mode) strcpy(mode,"Normal "); mode[strlen(mode)-1]='\0'; ModeLine(); } UInit() /* Do user code initilization */ /* This function is called once at the very begining. It may be used to do any initilization required for user code */ { } MIncSearch() /* Forward Incremental String Search */ { int tmp,cnt; if (!GetArg("Incremental Search : ",ESC,strarg,STRMAX)){ arg=0; return; } for (cnt = 0; strarg[cnt] != '\0'; cnt++){ tmp = strarg[cnt + 1]; /* save the char */ strarg[cnt + 1] = '\0'; /* and truncate srtarg to length I */ tmark = BCreMrk(); /* Current point */ if (!StrSrch(strarg,FORWARD)){ BPntToMrk(tmark); BMove(cnt); /* Put point after last found chars */ Echo ("Not Found"); arg=0; return; } strarg[cnt + 1] = tmp; /* restore strarg */ IncrDsp(); /* force redisplay */ BMove(-cnt - 1); /* get before the truncated strarg so that if this is the complete strarg we will find it */ BKillMrk(tmark); } Bmove(cnt); /* Put point after last found chars */ } MIncRSearch() /* Reverse Incremental String Search */ { int tmp,cnt; if (!GetArg("Reverse Incremental Search : ",ESC,strarg,STRMAX)){ arg=0; return; } for (cnt = 1; strarg[cnt] != '\0'; cnt++){ tmp = strarg[cnt + 1]; /* save the char */ strarg[cnt + 1] = '\0'; /* and truncate srtarg to length I */ tmark = BCreMrk(); /* Current point */ if (!StrSrch(strarg,BACKWARD)){ BPntToMrk(tmark); BMove(-cnt); /* Put point after last found chars */ Echo ("Not Found"); arg=0; return; } strarg[cnt + 1] = tmp; /* restore strarg */ IncrDsp(); /* force redisplay */ BMove(cnt + 1); /* get before the truncated strarg so that if this is the complete strarg we will find it */ BKillMrk(tmark); } BMove(-cnt); /* Put point after last found chars */ } MNewDsp() /* move down arg lines and redisplay*/ { if (argp){ if (!VMovCmnd(lfunct)) lcol=BGetCol(); while(arg-- > 0) NLSrch(); BMakeCol(lcol); } arg=0; NewDsp(); } MRNewDsp() /* move arg lines previous and redisplay */ { if (argp){ if (!VMovCmnd(lfunct)) lcol=BGetCol(); while (arg-- > 0) RNLSrch(); BMakeCol(lcol); } arg = 0; NewDsp(); } MMakMacro() { char *macroptr; macroptr = spare; GetMacro("Macro :",'\035',strarg,20); strcpy(macroptr,strarg); Echo(macroptr); } MDoMacro() { char *macroptr; macroptr = spare; TSetPoint(TMaxRow()-1,0); while (*macroptr != '\0'){ TPrntChar(*macroptr); if (!QFull(&kbdq)) QShove(*macroptr, &kbdq); else TBell(); macroptr++; } } GetMacro(mesg,term,str,len) /* input a string argument */ char *mesg, term, *str; int len; { char stemp[80], inpt, *nstr, tcol; TDisStr(TMaxRow()-1,0,mesg); TCLEOL(); tcol=TGetCol(); TForce(); nstr=stemp; while ((KbWait(),inpt=TGetKb())!=term) { if (inpt==BELL) { ClrEcho(); return(FALSE); } switch (inpt) { case CR: TPrntStr(""); *nstr++=NL; break; default: TPrntChar(inpt); *nstr++=inpt; break; } TForce(); } if (nstr!=stemp) { *nstr='\0'; strcpy(str,stemp); } else NLPrnt(str); TSetPoint(TMaxRow()-1,0); TForce(); return(TRUE); } /* END OF BINDINGS.C - set up key bindings */