home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume6 / uemacs3.7 / part09 < prev    next >
Text File  |  1986-11-30  |  43KB  |  1,266 lines

  1. Subject: v06i079:  MicroEmacs, Version 3.7 (uEmacs3.7), Part09/12
  2. Newsgroups: mod.sources
  3. Approved: rs@mirror.UUCP
  4.  
  5. Submitted by: ihnp4!pur-ee!pur-phy!duncan!lawrence
  6. Mod.sources: Volume 6, Issue 79
  7. Archive-name: uEmacs3.7/Part09
  8.  
  9. [  This is the latest revision of one of two programs named "MicroEmacs";
  10.    when discussing these on the net, or in contacting the authors, make
  11.    sure to mention the version number -- in this case 3.7 -- as that is
  12.    the easiest way to distinguish between them.  Daniel will be posting
  13.    uuencoded executables in net.micro.pc and net.micro.amiga; the file
  14.    'readme' contains information on how to also get these from him
  15.    directly.   --r$ ]
  16.  
  17. echo extracting - menu1
  18. sed 's/^X//' > menu1 << 'FRIDAY_NIGHT'
  19. X--<<01>>-----------------------------------------------------------------------
  20. XMicroEMACS 3.7      F1 WORD CASE/SCREEN CONTROL   F2  PAGING/SCROLLING
  21. X[Main Menu]         F3 CUT & PASTE                F4  SEARCH AND REPLACE
  22. X                    F5 DELETION COMMANDS          F6  WORD PROCESSING
  23. X                    F7 INSERTION COMMANDS         F8  EDITOR CONTROL
  24. X 06/18/86           F9 CURSOR MOVEMENT            F10 exit MicroEMACS
  25. X--<<02>>-----------------------------------------------------------------------
  26. XMicroEMACS 3.7      F1 BUFFER CONTROL             F2  MACROS
  27. X[Editor control]    F3 COLOR CHANGES              F4  MODES
  28. X                    F5 DOS COMMANDS               F6  SCRIPTS
  29. X                    F7 FILE ACCESS                F8  WINDOWS
  30. X                    F9 KEY BINDINGS               F10 exit to MAIN MENU
  31. X--<<03>>-----------------------------------------------------------------------
  32. XMicroEMACS 3.7      F1 upper case a word          F2  upper case a region
  33. X Word case &        F3 lower case a word          F4  lower case a region
  34. X  Screen control    F5 capitilize a word
  35. X                    F7 redraw the screen          F8  mark a region
  36. X                    F9 center the current line    F10 exit to MAIN MENU
  37. X--<<04>>-----------------------------------------------------------------------
  38. XMicroEMACS 3.7      F1  mark a region
  39. X  Cut & Paste       F3  delete the region
  40. X                    F5  copy the region to the kill buffer
  41. X                    F7  insert the kill buffer into the text here
  42. X                                                  F10 exit to MAIN MENU
  43. X--<<05>>-----------------------------------------------------------------------
  44. XMicroEMACS 3.7      F1 delete the last character
  45. X  Deletions         F3 delete the next character
  46. X                    F5 delete to the end of the current line
  47. X                    F7 delete all the blank lines around the cursor
  48. X                                                  F10 exit to MAIN MENU
  49. X--<<06>>-----------------------------------------------------------------------
  50. XMicroEMACS 3.7      F1 open a blank line          F2  insert a prompted string
  51. X  Insertion         F3 insert a tab               F4  quote the next character
  52. X                    F5 insert a space             F6  transpose last 2 chars
  53. X                    F7 insert a newline and indent like the last line
  54. X                    F9 insert a newline           F10 exit to MAIN MENU
  55. X--<<07>>-----------------------------------------------------------------------
  56. XMicroEMACS 3.7      F1 begining of the file       F2  up one line
  57. X  Cursor Movement   F3 left                       F4  right
  58. X        F^2         F5 end of the file            F6  down one line
  59. X    F3 < + > F4     F7 begining of line           F8  end of line
  60. X        FV6         F9 goto line                  F10 exit to MAIN MENU
  61. X--<<08>>-----------------------------------------------------------------------
  62. XMicroEMACS 3.7      F1  go up one page            F2  go down one page
  63. X  Paging and        F3  scroll the screen up      F4  scroll the screen down
  64. X     Scrolling      F5  make the next widow go up one page
  65. X                    F7  make the next window go down one page
  66. X                    F9  exchange cursor & mark    F10 exit to MAIN MENU
  67. X--<<09>>-----------------------------------------------------------------------
  68. XMicroEMACS 3.7      f1  search forward            f2  seach backwards
  69. X  Search and        F3  hunt forward              f4  hunt backwards
  70. X    Replace         F5  isearch forward           F6  isearch backward
  71. X                    F7  replace string            F8  replace string w/query
  72. X                                                  F10 exit to MAIN MENU
  73. X--<<10>>-----------------------------------------------------------------------
  74. XMicroEMACS 3.7      F1 go back a word             F2  go forward a word
  75. X  Word processing   F3 go back a paragraph        F4  go forward a paragraph
  76. X                    F5 fill paragraph             F6  delete current paragraph
  77. X                    F7 delete last word           F8  delete next word
  78. X                    F9 count words in region      F10 exit to MAIN MENU
  79. X--<<11>>-----------------------------------------------------------------------
  80. XMicroEMACS 3.7      F1 report position            F2  unmark buffer
  81. X  Buffer Control    F3 delete buffer              F4  switch to next buffer
  82. X                    F5 list all buffers           F6  filter buffer through
  83. X                    F7 rename current buffer             DOS program
  84. X                    F9 select buffer              F10 exit to CONTROL MENU
  85. X--<<12>>-----------------------------------------------------------------------
  86. XMicroEMACS 3.7      Colors:           |  F1 current window's forground color
  87. X  Color changes       Black   Magenta |  F3 current window's background color
  88. X                      Blue    Cyan    |  F5 global forground color
  89. X                      Red     Yellow  |  F7 global background color
  90. X                      Green   White   |           F10  exit to CONTROL MENU
  91. X--<<13>>-----------------------------------------------------------------------
  92. XMicroEMACS 3.7      F1  execute one DOS command
  93. X  DOS commands      F3  pipe one DOS command to a buffer
  94. X                    F5  shell up to a new command interpeter
  95. X                    F7  QUICK exit (write out all changed buffers and exit)
  96. X                    F9  exit MicroEMACS           F10 exit to CONTROL MENU
  97. X--<<14>>-----------------------------------------------------------------------
  98. XMicroEMACS 3.7      F1 find file                  F2 save current file
  99. X  File Access       F3 view file (in VIEW mode)   F4 write file w/ new name
  100. X                    F5 read file into buffer      F6 change current file name
  101. X                    F7 insert file into buffer
  102. X                                                  F10  exit to CONTROL MENU
  103. X--<<15>>-----------------------------------------------------------------------
  104. XMicroEMACS 3.7      F1 bind a function to a key
  105. X  Key Bindings      F3 unbind a key
  106. X                    F5 describe a key
  107. X                    F7 describe all bindings
  108. X                                                  F10  exit to CONTROL MENU
  109. X--<<16>>-----------------------------------------------------------------------
  110. XMicroEMACS 3.7      F1 define macro         The keyboard macro only works
  111. X  Keyboard Macro    F3 end macro            for standard commands, NOT for
  112. X                    F5 execute macro        menu selections.
  113. X
  114. X                                                  F10  exit to CONTROL MENU
  115. X--<<17>>-----------------------------------------------------------------------
  116. XMicroEMACS 3.7      F1 set mode                   F2  set global mode
  117. X  Modes             F3 delete mode                F4  delete global mode
  118. X            Standard modes are:                   F6  set fill column
  119. X                WRAP  VIEW  CMODE  EXACT OVER MAGIC
  120. X                                                  F10 exit to CONTROL MENU
  121. X--<<18>>-----------------------------------------------------------------------
  122. XMicroEMACS 3.7      F1 execute script file        F2  execute script line
  123. X  Script            F3 execute script in buffer   F4  execute command (by name)
  124. X            Script line format:
  125. X         {<repeat count>} <command name> {<argument(s)> | "<argument(s)>"}
  126. X                                                  F10  exit to CONTROL MENU
  127. X--<<19>>-----------------------------------------------------------------------
  128. XMicroEMACS 3.7      F1 split current window       F2  delete all other windows
  129. X  Windows           F3 resize window              F4  delete current window
  130. X                    F5 shrink window              F6  enlarge window
  131. X                    F7 next window                F8  previous window
  132. X                                                  F10 exit to CONTROL MENU
  133. X-------------------------------------------------------------------------------
  134. FRIDAY_NIGHT
  135. echo extracting - random.c
  136. sed 's/^X//' > random.c << 'FRIDAY_NIGHT'
  137. X/*
  138. X * This file contains the command processing functions for a number of random
  139. X * commands. There is no functional grouping here, for sure.
  140. X */
  141. X
  142. X#include        <stdio.h>
  143. X#include    "estruct.h"
  144. X#include        "edef.h"
  145. X
  146. Xint     tabsize;                        /* Tab size (0: use real tabs)  */
  147. X
  148. X/*
  149. X * Set fill column to n.
  150. X */
  151. Xsetfillcol(f, n)
  152. X{
  153. X        fillcol = n;
  154. X    mlwrite("[Fill column is %d]",n);
  155. X        return(TRUE);
  156. X}
  157. X
  158. X/*
  159. X * Display the current position of the cursor, in origin 1 X-Y coordinates,
  160. X * the character that is under the cursor (in hex), and the fraction of the
  161. X * text that is before the cursor. The displayed column is not the current
  162. X * column, but the column that would be used on an infinite width display.
  163. X * Normally this is bound to "C-X =".
  164. X */
  165. Xshowcpos(f, n)
  166. X{
  167. X        register LINE   *lp;        /* current line */
  168. X        register long   numchars;    /* # of chars in file */
  169. X        register int    numlines;    /* # of lines in file */
  170. X        register long   predchars;    /* # chars preceding point */
  171. X        register int    predlines;    /* # lines preceding point */
  172. X        register int    curchar;    /* character under cursor */
  173. X        int ratio;
  174. X        int col;
  175. X    int savepos;            /* temp save for current offset */
  176. X    int ecol;            /* column pos/end of current line */
  177. X
  178. X    /* starting at the begining of the buffer */
  179. X        lp = lforw(curbp->b_linep);
  180. X
  181. X    /* start counting chars and lines */
  182. X        numchars = 0;
  183. X        numlines = 0;
  184. X        while (lp != curbp->b_linep) {
  185. X        /* if we are on the current line, record it */
  186. X        if (lp == curwp->w_dotp) {
  187. X            predlines = numlines;
  188. X            predchars = numchars + curwp->w_doto;
  189. X            if ((curwp->w_doto) == llength(lp))
  190. X                curchar = '\n';
  191. X            else
  192. X                curchar = lgetc(lp, curwp->w_doto);
  193. X        }
  194. X        /* on to the next line */
  195. X        ++numlines;
  196. X        numchars += llength(lp) + 1;
  197. X        lp = lforw(lp);
  198. X        }
  199. X
  200. X    /* if at end of file, record it */
  201. X    if (curwp->w_dotp == curbp->b_linep) {
  202. X        predlines = numlines;
  203. X        predchars = numchars;
  204. X    }
  205. X
  206. X    /* Get real column and end-of-line column. */
  207. X    col = getccol(FALSE);
  208. X    savepos = curwp->w_doto;
  209. X    curwp->w_doto = llength(curwp->w_dotp);
  210. X    ecol = getccol(FALSE);
  211. X    curwp->w_doto = savepos;
  212. X
  213. X        ratio = 0;              /* Ratio before dot. */
  214. X        if (numchars != 0)
  215. X                ratio = (100L*predchars) / numchars;
  216. X
  217. X    /* summarize and report the info */
  218. X    mlwrite("Line %d/%d Col %d/%d Char %D/%D (%d%%) char = 0x%x",
  219. X        predlines+1, numlines+1, col, ecol,
  220. X        predchars, numchars, ratio, curchar);
  221. X        return (TRUE);
  222. X}
  223. X
  224. X/*
  225. X * Return current column.  Stop at first non-blank given TRUE argument.
  226. X */
  227. Xgetccol(bflg)
  228. Xint bflg;
  229. X{
  230. X        register int c, i, col;
  231. X        col = 0;
  232. X        for (i=0; i<curwp->w_doto; ++i) {
  233. X                c = lgetc(curwp->w_dotp, i);
  234. X                if (c!=' ' && c!='\t' && bflg)
  235. X                        break;
  236. X                if (c == '\t')
  237. X                        col |= 0x07;
  238. X                else if (c<0x20 || c==0x7F)
  239. X                        ++col;
  240. X                ++col;
  241. X        }
  242. X        return(col);
  243. X}
  244. X
  245. X/*
  246. X * Twiddle the two characters on either side of dot. If dot is at the end of
  247. X * the line twiddle the two characters before it. Return with an error if dot
  248. X * is at the beginning of line; it seems to be a bit pointless to make this
  249. X * work. This fixes up a very common typo with a single stroke. Normally bound
  250. X * to "C-T". This always works within a line, so "WFEDIT" is good enough.
  251. X */
  252. Xtwiddle(f, n)
  253. X{
  254. X        register LINE   *dotp;
  255. X        register int    doto;
  256. X        register int    cl;
  257. X        register int    cr;
  258. X
  259. X    if (curbp->b_mode&MDVIEW)    /* don't allow this command if    */
  260. X        return(rdonly());    /* we are in read only mode    */
  261. X        dotp = curwp->w_dotp;
  262. X        doto = curwp->w_doto;
  263. X        if (doto==llength(dotp) && --doto<0)
  264. X                return (FALSE);
  265. X        cr = lgetc(dotp, doto);
  266. X        if (--doto < 0)
  267. X                return (FALSE);
  268. X        cl = lgetc(dotp, doto);
  269. X        lputc(dotp, doto+0, cr);
  270. X        lputc(dotp, doto+1, cl);
  271. X        lchange(WFEDIT);
  272. X        return (TRUE);
  273. X}
  274. X
  275. X/*
  276. X * Quote the next character, and insert it into the buffer. All the characters
  277. X * are taken literally, with the exception of the newline, which always has
  278. X * its line splitting meaning. The character is always read, even if it is
  279. X * inserted 0 times, for regularity. Bound to "C-Q"
  280. X */
  281. Xquote(f, n)
  282. X{
  283. X        register int    s;
  284. X        register int    c;
  285. X
  286. X    if (curbp->b_mode&MDVIEW)    /* don't allow this command if    */
  287. X        return(rdonly());    /* we are in read only mode    */
  288. X        c = (*term.t_getchar)();
  289. X        if (n < 0)
  290. X                return (FALSE);
  291. X        if (n == 0)
  292. X                return (TRUE);
  293. X        if (c == '\n') {
  294. X                do {
  295. X                        s = lnewline();
  296. X                } while (s==TRUE && --n);
  297. X                return (s);
  298. X        }
  299. X        return (linsert(n, c));
  300. X}
  301. X
  302. X/*
  303. X * Set tab size if given non-default argument (n <> 1).  Otherwise, insert a
  304. X * tab into file.  If given argument, n, of zero, change to true tabs.
  305. X * If n > 1, simulate tab stop every n-characters using spaces. This has to be
  306. X * done in this slightly funny way because the tab (in ASCII) has been turned
  307. X * into "C-I" (in 10 bit code) already. Bound to "C-I".
  308. X */
  309. Xtab(f, n)
  310. X{
  311. X        if (n < 0)
  312. X                return (FALSE);
  313. X        if (n == 0 || n > 1) {
  314. X                tabsize = n;
  315. X                return(TRUE);
  316. X        }
  317. X        if (! tabsize)
  318. X                return(linsert(1, '\t'));
  319. X        return(linsert(tabsize - (getccol(FALSE) % tabsize), ' '));
  320. X}
  321. X
  322. X/*
  323. X * Open up some blank space. The basic plan is to insert a bunch of newlines,
  324. X * and then back up over them. Everything is done by the subcommand
  325. X * procerssors. They even handle the looping. Normally this is bound to "C-O".
  326. X */
  327. Xopenline(f, n)
  328. X{
  329. X        register int    i;
  330. X        register int    s;
  331. X
  332. X    if (curbp->b_mode&MDVIEW)    /* don't allow this command if    */
  333. X        return(rdonly());    /* we are in read only mode    */
  334. X        if (n < 0)
  335. X                return (FALSE);
  336. X        if (n == 0)
  337. X                return (TRUE);
  338. X        i = n;                                  /* Insert newlines.     */
  339. X        do {
  340. X                s = lnewline();
  341. X        } while (s==TRUE && --i);
  342. X        if (s == TRUE)                          /* Then back up overtop */
  343. X                s = backchar(f, n);             /* of them all.         */
  344. X        return (s);
  345. X}
  346. X
  347. X/*
  348. X * Insert a newline. Bound to "C-M". If we are in CMODE, do automatic
  349. X * indentation as specified.
  350. X */
  351. Xnewline(f, n)
  352. X{
  353. X    register int    s;
  354. X
  355. X    if (curbp->b_mode&MDVIEW)    /* don't allow this command if    */
  356. X        return(rdonly());    /* we are in read only mode    */
  357. X    if (n < 0)
  358. X        return (FALSE);
  359. X
  360. X    /* if we are in C mode and this is a default <NL> */
  361. X    if (n == 1 && (curbp->b_mode & MDCMOD) &&
  362. X        curwp->w_dotp != curbp->b_linep)
  363. X        return(cinsert());
  364. X
  365. X    /* insert some lines */
  366. X    while (n--) {
  367. X        if ((s=lnewline()) != TRUE)
  368. X            return (s);
  369. X    }
  370. X    return (TRUE);
  371. X}
  372. X
  373. Xcinsert()    /* insert a newline and indentation for C */
  374. X
  375. X{
  376. X    register char *cptr;    /* string pointer into text to copy */
  377. X    register int tptr;    /* index to scan into line */
  378. X    register int bracef;    /* was there a brace at the end of line? */
  379. X    register int i;
  380. X    char ichar[NSTRING];    /* buffer to hold indent of last line */
  381. X
  382. X    /* grab a pointer to text to copy indentation from */
  383. X    cptr = &curwp->w_dotp->l_text[0];
  384. X
  385. X    /* check for a brace */
  386. X    tptr = curwp->w_doto - 1;
  387. X    bracef = (cptr[tptr] == '{');
  388. X
  389. X    /* save the indent of the previous line */
  390. X    i = 0;
  391. X    while ((i < tptr) && (cptr[i] == ' ' || cptr[i] == '\t')
  392. X        && (i < NSTRING - 1)) {
  393. X        ichar[i] = cptr[i];
  394. X        ++i;
  395. X    }
  396. X    ichar[i] = 0;        /* terminate it */
  397. X
  398. X    /* put in the newline */
  399. X    if (lnewline() == FALSE)
  400. X        return(FALSE);
  401. X
  402. X    /* and the saved indentation */
  403. X    i = 0;
  404. X    while (ichar[i])
  405. X        linsert(1, ichar[i++]);
  406. X
  407. X    /* and one more tab for a brace */
  408. X    if (bracef)
  409. X        tab(FALSE, 1);
  410. X
  411. X    return(TRUE);
  412. X}
  413. X
  414. Xinsbrace(n, c)    /* insert a brace into the text here...we are in CMODE */
  415. X
  416. Xint n;    /* repeat count */
  417. Xint c;    /* brace to insert (always { for now) */
  418. X
  419. X{
  420. X    register int ch;    /* last character before input */
  421. X    register int i;
  422. X    register int target;    /* column brace should go after */
  423. X
  424. X    /* if we are at the begining of the line, no go */
  425. X    if (curwp->w_doto == 0)
  426. X        return(linsert(n,c));
  427. X        
  428. X    /* scan to see if all space before this is white space */
  429. X    for (i = curwp->w_doto - 1; i >= 0; --i) {
  430. X        ch = lgetc(curwp->w_dotp, i);
  431. X        if (ch != ' ' && ch != '\t')
  432. X            return(linsert(n, c));
  433. X    }
  434. X
  435. X    /* delete back first */
  436. X    target = getccol(FALSE);    /* calc where we will delete to */
  437. X    target -= 1;
  438. X    target -= target % (tabsize == 0 ? 8 : tabsize);
  439. X    while (getccol(FALSE) > target)
  440. X        backdel(FALSE, 1);
  441. X
  442. X    /* and insert the required brace(s) */
  443. X    return(linsert(n, c));
  444. X}
  445. X
  446. Xinspound()    /* insert a # into the text here...we are in CMODE */
  447. X
  448. X{
  449. X    register int ch;    /* last character before input */
  450. X    register int i;
  451. X
  452. X    /* if we are at the begining of the line, no go */
  453. X    if (curwp->w_doto == 0)
  454. X        return(linsert(1,'#'));
  455. X        
  456. X    /* scan to see if all space before this is white space */
  457. X    for (i = curwp->w_doto - 1; i >= 0; --i) {
  458. X        ch = lgetc(curwp->w_dotp, i);
  459. X        if (ch != ' ' && ch != '\t')
  460. X            return(linsert(1, '#'));
  461. X    }
  462. X
  463. X    /* delete back first */
  464. X    while (getccol(FALSE) >= 1)
  465. X        backdel(FALSE, 1);
  466. X
  467. X    /* and insert the required pound */
  468. X    return(linsert(1, '#'));
  469. X}
  470. X
  471. X/*
  472. X * Delete blank lines around dot. What this command does depends if dot is
  473. X * sitting on a blank line. If dot is sitting on a blank line, this command
  474. X * deletes all the blank lines above and below the current line. If it is
  475. X * sitting on a non blank line then it deletes all of the blank lines after
  476. X * the line. Normally this command is bound to "C-X C-O". Any argument is
  477. X * ignored.
  478. X */
  479. Xdeblank(f, n)
  480. X{
  481. X        register LINE   *lp1;
  482. X        register LINE   *lp2;
  483. X        long nld;
  484. X
  485. X    if (curbp->b_mode&MDVIEW)    /* don't allow this command if    */
  486. X        return(rdonly());    /* we are in read only mode    */
  487. X        lp1 = curwp->w_dotp;
  488. X        while (llength(lp1)==0 && (lp2=lback(lp1))!=curbp->b_linep)
  489. X                lp1 = lp2;
  490. X        lp2 = lp1;
  491. X        nld = 0;
  492. X        while ((lp2=lforw(lp2))!=curbp->b_linep && llength(lp2)==0)
  493. X                ++nld;
  494. X        if (nld == 0)
  495. X                return (TRUE);
  496. X        curwp->w_dotp = lforw(lp1);
  497. X        curwp->w_doto = 0;
  498. X        return (ldelete(nld, FALSE));
  499. X}
  500. X
  501. X/*
  502. X * Insert a newline, then enough tabs and spaces to duplicate the indentation
  503. X * of the previous line. Assumes tabs are every eight characters. Quite simple.
  504. X * Figure out the indentation of the current line. Insert a newline by calling
  505. X * the standard routine. Insert the indentation by inserting the right number
  506. X * of tabs and spaces. Return TRUE if all ok. Return FALSE if one of the
  507. X * subcomands failed. Normally bound to "C-J".
  508. X */
  509. Xindent(f, n)
  510. X{
  511. X        register int    nicol;
  512. X        register int    c;
  513. X        register int    i;
  514. X
  515. X    if (curbp->b_mode&MDVIEW)    /* don't allow this command if    */
  516. X        return(rdonly());    /* we are in read only mode    */
  517. X        if (n < 0)
  518. X                return (FALSE);
  519. X        while (n--) {
  520. X                nicol = 0;
  521. X                for (i=0; i<llength(curwp->w_dotp); ++i) {
  522. X                        c = lgetc(curwp->w_dotp, i);
  523. X                        if (c!=' ' && c!='\t')
  524. X                                break;
  525. X                        if (c == '\t')
  526. X                                nicol |= 0x07;
  527. X                        ++nicol;
  528. X                }
  529. X                if (lnewline() == FALSE
  530. X                || ((i=nicol/8)!=0 && linsert(i, '\t')==FALSE)
  531. X                || ((i=nicol%8)!=0 && linsert(i,  ' ')==FALSE))
  532. X                        return (FALSE);
  533. X        }
  534. X        return (TRUE);
  535. X}
  536. X
  537. X/*
  538. X * Delete forward. This is real easy, because the basic delete routine does
  539. X * all of the work. Watches for negative arguments, and does the right thing.
  540. X * If any argument is present, it kills rather than deletes, to prevent loss
  541. X * of text if typed with a big argument. Normally bound to "C-D".
  542. X */
  543. Xforwdel(f, n)
  544. X{
  545. X    if (curbp->b_mode&MDVIEW)    /* don't allow this command if    */
  546. X        return(rdonly());    /* we are in read only mode    */
  547. X        if (n < 0)
  548. X                return (backdel(f, -n));
  549. X        if (f != FALSE) {                       /* Really a kill.       */
  550. X                if ((lastflag&CFKILL) == 0)
  551. X                        kdelete();
  552. X                thisflag |= CFKILL;
  553. X        }
  554. X        return (ldelete((long)n, f));
  555. X}
  556. X
  557. X/*
  558. X * Delete backwards. This is quite easy too, because it's all done with other
  559. X * functions. Just move the cursor back, and delete forwards. Like delete
  560. X * forward, this actually does a kill if presented with an argument. Bound to
  561. X * both "RUBOUT" and "C-H".
  562. X */
  563. Xbackdel(f, n)
  564. X{
  565. X        register int    s;
  566. X
  567. X    if (curbp->b_mode&MDVIEW)    /* don't allow this command if    */
  568. X        return(rdonly());    /* we are in read only mode    */
  569. X        if (n < 0)
  570. X                return (forwdel(f, -n));
  571. X        if (f != FALSE) {                       /* Really a kill.       */
  572. X                if ((lastflag&CFKILL) == 0)
  573. X                        kdelete();
  574. X                thisflag |= CFKILL;
  575. X        }
  576. X        if ((s=backchar(f, n)) == TRUE)
  577. X                s = ldelete((long)n, f);
  578. X        return (s);
  579. X}
  580. X
  581. X/*
  582. X * Kill text. If called without an argument, it kills from dot to the end of
  583. X * the line, unless it is at the end of the line, when it kills the newline.
  584. X * If called with an argument of 0, it kills from the start of the line to dot.
  585. X * If called with a positive argument, it kills from dot forward over that
  586. X * number of newlines. If called with a negative argument it kills backwards
  587. X * that number of newlines. Normally bound to "C-K".
  588. X */
  589. Xkilltext(f, n)
  590. X{
  591. X        register LINE   *nextp;
  592. X        long chunk;
  593. X
  594. X    if (curbp->b_mode&MDVIEW)    /* don't allow this command if    */
  595. X        return(rdonly());    /* we are in read only mode    */
  596. X        if ((lastflag&CFKILL) == 0)             /* Clear kill buffer if */
  597. X                kdelete();                      /* last wasn't a kill.  */
  598. X        thisflag |= CFKILL;
  599. X        if (f == FALSE) {
  600. X                chunk = llength(curwp->w_dotp)-curwp->w_doto;
  601. X                if (chunk == 0)
  602. X                        chunk = 1;
  603. X        } else if (n == 0) {
  604. X                chunk = curwp->w_doto;
  605. X                curwp->w_doto = 0;
  606. X        } else if (n > 0) {
  607. X                chunk = llength(curwp->w_dotp)-curwp->w_doto+1;
  608. X                nextp = lforw(curwp->w_dotp);
  609. X                while (--n) {
  610. X                        if (nextp == curbp->b_linep)
  611. X                                return (FALSE);
  612. X                        chunk += llength(nextp)+1;
  613. X                        nextp = lforw(nextp);
  614. X                }
  615. X        } else {
  616. X                mlwrite("neg kill");
  617. X                return (FALSE);
  618. X        }
  619. X        return(ldelete(chunk, TRUE));
  620. X}
  621. X
  622. Xsetmode(f, n)    /* prompt and set an editor mode */
  623. X
  624. Xint f, n;    /* default and argument */
  625. X
  626. X{
  627. X    adjustmode(TRUE, FALSE);
  628. X}
  629. X
  630. Xdelmode(f, n)    /* prompt and delete an editor mode */
  631. X
  632. Xint f, n;    /* default and argument */
  633. X
  634. X{
  635. X    adjustmode(FALSE, FALSE);
  636. X}
  637. X
  638. Xsetgmode(f, n)    /* prompt and set a global editor mode */
  639. X
  640. Xint f, n;    /* default and argument */
  641. X
  642. X{
  643. X    adjustmode(TRUE, TRUE);
  644. X}
  645. X
  646. Xdelgmode(f, n)    /* prompt and delete a global editor mode */
  647. X
  648. Xint f, n;    /* default and argument */
  649. X
  650. X{
  651. X    adjustmode(FALSE, TRUE);
  652. X}
  653. X
  654. Xadjustmode(kind, global)    /* change the editor mode status */
  655. X
  656. Xint kind;    /* true = set,        false = delete */
  657. Xint global;    /* true = global flag,    false = current buffer flag */
  658. X{
  659. X    register char *scan;        /* scanning pointer to convert prompt */
  660. X    register int i;            /* loop index */
  661. X#if    COLOR
  662. X    register int uflag;        /* was modename uppercase?    */
  663. X#endif
  664. X    char prompt[50];    /* string to prompt user with */
  665. X    char cbuf[NPAT];        /* buffer to recieve mode name into */
  666. X
  667. X    /* build the proper prompt string */
  668. X    if (global)
  669. X        strcpy(prompt,"Global mode to ");
  670. X    else
  671. X        strcpy(prompt,"Mode to ");
  672. X
  673. X    if (kind == TRUE)
  674. X        strcat(prompt, "add: ");
  675. X    else
  676. X        strcat(prompt, "delete: ");
  677. X
  678. X    /* prompt the user and get an answer */
  679. X
  680. X    mlreply(prompt, cbuf, NPAT - 1);
  681. X
  682. X    /* make it uppercase */
  683. X
  684. X    scan = cbuf;
  685. X#if    COLOR
  686. X    uflag = (*scan >= 'A' && *scan <= 'Z');
  687. X#endif
  688. X    while (*scan != 0) {
  689. X        if (*scan >= 'a' && *scan <= 'z')
  690. X            *scan = *scan - 32;
  691. X        scan++;
  692. X    }
  693. X
  694. X    /* test it first against the colors we know */
  695. X    for (i=0; i<NCOLORS; i++) {
  696. X        if (strcmp(cbuf, cname[i]) == 0) {
  697. X            /* finding the match, we set the color */
  698. X#if    COLOR
  699. X            if (uflag)
  700. X                if (global)
  701. X                    gfcolor = i;
  702. X                else
  703. X                    curwp->w_fcolor = i;
  704. X            else
  705. X                if (global)
  706. X                    gbcolor = i;
  707. X                else
  708. X                    curwp->w_bcolor = i;
  709. X
  710. X            curwp->w_flag |= WFCOLR;
  711. X#endif
  712. X            mlerase();
  713. X            return(TRUE);
  714. X        }
  715. X    }
  716. X
  717. X    /* test it against the modes we know */
  718. X
  719. X    for (i=0; i < NUMMODES; i++) {
  720. X        if (strcmp(cbuf, modename[i]) == 0) {
  721. X            /* finding a match, we process it */
  722. X            if (kind == TRUE)
  723. X                if (global)
  724. X                    gmode |= (1 << i);
  725. X                else
  726. X                    curwp->w_bufp->b_mode |= (1 << i);
  727. X            else
  728. X                if (global)
  729. X                    gmode &= ~(1 << i);
  730. X                else
  731. X                    curwp->w_bufp->b_mode &= ~(1 << i);
  732. X            /* display new mode line */
  733. X            if (global == 0)
  734. X                upmode();
  735. X            mlerase();    /* erase the junk */
  736. X            return(TRUE);
  737. X        }
  738. X    }
  739. X
  740. X    mlwrite("No such mode!");
  741. X    return(FALSE);
  742. X}
  743. X
  744. X/*    This function simply clears the message line,
  745. X        mainly for macro usage            */
  746. X
  747. Xclrmes(f, n)
  748. X
  749. Xint f, n;    /* arguments ignored */
  750. X
  751. X{
  752. X    mlwrite("");
  753. X    return(TRUE);
  754. X}
  755. X
  756. X/*    This function writes a string on the message line
  757. X        mainly for macro usage            */
  758. X
  759. Xwritemsg(f, n)
  760. X
  761. Xint f, n;    /* arguments ignored */
  762. X
  763. X{
  764. X    register char *sp;    /* pointer into buf to expand %s */
  765. X    register char *np;    /* ptr into nbuf */
  766. X    register int status;
  767. X    char buf[NPAT];        /* buffer to recieve mode name into */
  768. X    char nbuf[NPAT*2];    /* buffer to expand string into */
  769. X
  770. X    if ((status = mlreply("Message to write: ", buf, NPAT - 1)) != TRUE)
  771. X        return(status);
  772. X
  773. X    /* expand all '%' to "%%" so mlwrite won't expect arguments */
  774. X    sp = buf;
  775. X    np = nbuf;
  776. X    while (*sp) {
  777. X        *np++ = *sp;
  778. X        if (*sp++ == '%')
  779. X            *np++ = '%';
  780. X    }
  781. X    *np = '\0';
  782. X    mlwrite(nbuf);
  783. X    return(TRUE);
  784. X}
  785. X
  786. X/*    Close fences are matched against their partners, and if
  787. X    on screen the cursor briefly lights there        */
  788. X
  789. Xfmatch(ch)
  790. X
  791. Xchar ch;    /* fence type to match against */
  792. X
  793. X{
  794. X    register LINE *oldlp;    /* original line pointer */
  795. X    register int oldoff;    /* and offset */
  796. X    register LINE *toplp;    /* top line in current window */
  797. X    register int count;    /* current fence level count */
  798. X    register char opench;    /* open fence */
  799. X    register char c;    /* current character in scan */
  800. X    register int i;
  801. X
  802. X    /* first get the display update out there */
  803. X    update(FALSE);
  804. X
  805. X    /* save the original cursor position */
  806. X    oldlp = curwp->w_dotp;
  807. X    oldoff = curwp->w_doto;
  808. X
  809. X    /* setup proper open fence for passed close fence */
  810. X    if (ch == ')')
  811. X        opench = '(';
  812. X    else
  813. X        opench = '{';
  814. X
  815. X    /* find the top line and set up for scan */
  816. X    toplp = curwp->w_linep->l_bp;
  817. X    count = 1;
  818. X    backchar(FALSE, 2);
  819. X
  820. X    /* scan back until we find it, or reach past the top of the window */
  821. X    while (count > 0 && curwp->w_dotp != toplp) {
  822. X        c = lgetc(curwp->w_dotp, curwp->w_doto);
  823. X        if (c == ch)
  824. X            ++count;
  825. X        if (c == opench)
  826. X            --count;
  827. X        backchar(FALSE, 1);
  828. X        if (curwp->w_dotp == curwp->w_bufp->b_linep->l_fp &&
  829. X            curwp->w_doto == 0)
  830. X            break;
  831. X    }
  832. X
  833. X    /* if count is zero, we have a match, display the sucker */
  834. X    /* there is a real machine dependant timing problem here we have
  835. X       yet to solve......... */
  836. X    if (count == 0) {
  837. X        forwchar(FALSE, 1);
  838. X        for (i = 0; i < term.t_pause; i++)
  839. X            update(FALSE);
  840. X    }
  841. X
  842. X    /* restore the current position */
  843. X    curwp->w_dotp = oldlp;
  844. X    curwp->w_doto = oldoff;
  845. X    return(TRUE);
  846. X}
  847. X
  848. Xistring(f, n)    /* ask for and insert a string into the current
  849. X           buffer at the current point */
  850. X
  851. Xint f, n;    /* ignored arguments */
  852. X
  853. X{
  854. X    register char *tp;    /* pointer into string to add */
  855. X    register int status;    /* status return code */
  856. X    char tstring[NPAT+1];    /* string to add */
  857. X
  858. X    /* ask for string to insert */
  859. X    status = mlreplyt("String to insert<ESC>: ", tstring, NPAT, 27);
  860. X    if (status != TRUE)
  861. X        return(status);
  862. X
  863. X    /* insert it */
  864. X    tp = &tstring[0];
  865. X    while (*tp) {
  866. X        if (*tp == 0x0a)
  867. X            status = lnewline();
  868. X        else
  869. X            status = linsert(1, *tp);
  870. X        ++tp;
  871. X        if (status != TRUE)
  872. X            return(status);
  873. X    }
  874. X    return(TRUE);
  875. X}
  876. X
  877. FRIDAY_NIGHT
  878. echo extracting - readme
  879. sed 's/^X//' > readme << 'FRIDAY_NIGHT'
  880. X        MicroEMACS 3.7 release notes
  881. X
  882. X    First off, I would like to thank all the people that send in
  883. Xvarious comments, bug fixes and code segments.  I have included as many
  884. Xof these as possible in this current source.  All the new features which
  885. Xare larger than a couple of lines are IFDEF'ed by symbols in the
  886. XESTRUCT.H header file.  As long as everyone keeps sending these in, I
  887. Xwill keep trying to incorporate them, at least in spirit. 
  888. X
  889. X    Installation is fairly straight forward.  Copy or compile the
  890. Xappropriate version of the editor into EMACS (EMACS.EXE on MS/PC DOS)
  891. Xsomewhere on your executable path.  Then copy the emacs.hlp file to one
  892. Xof the directories names in the epath.h file for your system.  A startup
  893. Xfile .emacsrc (EMACS.RC on PC/MS DOS) can be placed in the directory
  894. Xpointed to by your HOME environment variable. 
  895. X    
  896. X[    Note for AMIGA users: Lattice 3.02 was giving me some rather
  897. Xmysterious software task failure errors while compiling some of the
  898. Xmodules. Not having the Amiga long enough to solve this, I upgraded to
  899. XLattice 3.03 and these problems disappeared. If enough people are stuck
  900. Xwith 3.02 and someone comes up with a fix and sends it to me, I will
  901. Xincorporate it into the master sources. Remember to say "stack 16000"
  902. Xbefore compiling the larger files.]
  903. X
  904. X    A new reference manual with a listing of all the commands and
  905. Xdescriptions is now included.  Commands are listed in logical groups.
  906. XAlso coming in the near future will be a beginner's document to replace
  907. X"emacs.tut".
  908. X
  909. X    Also included are two files, "menu.cmd" and "menu1" that make up
  910. Xa simple menu driven interface to MicroEMACS 3.7.  For people who prefer
  911. Xmenu driven interfaces, rename "menu.cmd" as "emacs.rc" and place it
  912. Xwhere a startup file would be expected.  Also find a place for the text
  913. Xfile "menu1" and change your "emacs.rc" to view-file from that directory
  914. Xfor "menu1".
  915. X
  916. X    MicroEMACS 3.7 is distributed on three 5 1/4" diskettes, or as one
  917. X3 1/2" diskette, or as apx. ten shell archives.  The shell archives are
  918. Xposted to USENET mod.sources and do not include the executable files. 
  919. XThe executable PC and AMIGA versions will also be posted in the relevent
  920. XUSENET groups. 
  921. X
  922. XDisk ONE contains:
  923. X
  924. X    readme        this file
  925. X
  926. X    acemacs.exe    MSDOS ansi color executable
  927. X    icemacs.exe    PCDOS color executable
  928. X
  929. X    ebind.h        default biding structures
  930. X    edef.h        static global data declarations
  931. X    efunc.h        function names binding table
  932. X    epath.h        help/startup file path definitions
  933. X    estruct.h    structure and configuration header file
  934. X
  935. X    emacs.hlp    online help file
  936. X    emacs.key    command wall chart
  937. X    emacs.rc    standard startup file
  938. X    emacs2.mss    reference manual (in MicroSCRIBE format)
  939. X    emacs.tut    beginers tutorial file
  940. X    makefile    UNIX V7/BSD 4.2 compilation command file
  941. X    azmap.cmd    an example MicroEMACS macro file
  942. X    menu.cmd    Menu driven command driver script
  943. X    menu1        data file for menu.cmd
  944. X
  945. XDisk TWO contains:
  946. X
  947. X    ansi.c        ANSI screen driver
  948. X    basic.c        cursor movement
  949. X    bind.c        bind/unbind and help commands
  950. X    buffer.c    buffer management
  951. X    display.c    display update functions
  952. X    dg10.c        Data General System/10 screen driver
  953. X    exec.c        macro line execution functions
  954. X    file.c        use file commands
  955. X    fileio.c    file I/O functions
  956. X    hp150.c        HP150 screen/keyboard driver
  957. X    ibmpc.c        IBM-PC screen driver
  958. X    input.c        message line input routines
  959. X    isearch.c    interactive search commands
  960. X    line.c        line editing functions
  961. X    lock.c        file locking front end
  962. X    main.c        command line and keyboard command parsing
  963. X    random.c    some random commands
  964. X    region.c    wipe/copy/yank commands
  965. X    search.c    normal search commands
  966. X    spawn.c        DOS interface commands
  967. X    tcap.c        UNIX screen drivers
  968. X    termio.c    Keyboard I/O routines
  969. X    vmsvt.c        VMS screen drivers
  970. X    vt52.c        VT52 screen drivers
  971. X    window.c    window management commands
  972. X    word.c        word move/delete/reformat commands
  973. X
  974. XDisk THREE contains:
  975. X
  976. X    hpemacs.exe    HP150 executable
  977. X    dgemacs.exe    Data General System/10 executable
  978. X    wgemacs.exe    Wang PC executable
  979. X    amemacs.exe    Commodore AMIGA executable
  980. X
  981. X    The next version of MicroEMACS (3.8) will probably not be until
  982. Xlate fall 1986, but it will probably be accompanied by the first version
  983. Xof MicroSCRIBE, a text formater to go along with MicroEMACS.  As I will
  984. Xcontinue to support MicroEMACS, ideas, comments, bug fixes and new code
  985. Xshould be send to:
  986. X
  987. X    Daniel Lawrence
  988. X    617 New York St
  989. X    Lafayette, IN 47091
  990. X
  991. X    or
  992. X
  993. X    ihnp4!pur-ee!pur-phy!duncan!lawrence on USENET
  994. X
  995. X    and, as before, copies of MicroEMACS 3.7 may be gotten by
  996. Xsending a self addressed, self stamped mailer with two 5 1/4" diskettes
  997. Xto the above address.
  998. X
  999. X-------------------------------------------------------------------------------
  1000. X        MicroEMACS 3.7    -    New Features
  1001. X
  1002. X***    COLOR!!!!
  1003. X
  1004. X    The forground and backgound color of buffers may be set
  1005. Xwith the add-mode and add-global-mode commands. Forgound colors
  1006. Xare set with capitalized color names, and background colors with
  1007. Xlower case color names. Availible colors are the ANSI color set:
  1008. X
  1009. Xblack, blue, red, green, yellow, cyan, magenta, and white
  1010. X
  1011. X    This feature is only availible on machines that support
  1012. Xcolor properly in text mode. (IBM-PC w/color graphics adapter
  1013. Xand its clones)
  1014. X
  1015. X***    Pipe command
  1016. X
  1017. X    The pipe-command (^X-@) command allows you to execute an
  1018. Xoperating system command and send the results into a buffer.
  1019. XMicroEMACS will make a buffer by the name of "command" for the
  1020. Xresults. This is only supported on systems that allow I/O redirection.
  1021. X
  1022. X***    Filter buffer
  1023. X
  1024. X    The filter-buffer (^X-#) command allows you to send an
  1025. Xexisting buffer's contents through a filter which runs under the
  1026. Xcurrent operating system. The result replaces the contents of
  1027. Xthe current buffer (beware of non-existant filters). Its a good
  1028. Xidea to make a backup of the buffer to be filtered.
  1029. X
  1030. X***    Switchar is fixed
  1031. X
  1032. X    MicroEMACS under PC/MS DOS no longer cares about the
  1033. Xsetting of the switchar. It uses the DOS call to look it up and
  1034. Xuse it in its fork and system calls.
  1035. X
  1036. X***    CMODE is configurable
  1037. X
  1038. X    Automatic entering of CMODE for .c and .h extension
  1039. Xfiles is now configurable with the ACMODE symbol in estruct.h
  1040. X
  1041. X***    Query-replace UNDO command
  1042. X
  1043. X    While making a query-replace (M-^R) run, the U key now
  1044. Xundoes the last replace.
  1045. X
  1046. X***    New cursor position report
  1047. X
  1048. X    Re-wrote the buffer-position (^X-=) command to give more
  1049. Xusefull information on # lines in file, current line and column,
  1050. Xpercentage of text before cursor and the hex value of the
  1051. Xcharacter the cursor is on.
  1052. X
  1053. X***    Word wrapping improved
  1054. X
  1055. X    Words are now only broken at spaces and tabs by the word
  1056. Xwrapping algorithm. No more disapearing punctuation delimiters.
  1057. X
  1058. X***    IBM-PC Color board display driver
  1059. X
  1060. X    A new screen driver for the IBM-PC color board is in the
  1061. Xfile IBMPC.C and this vastly improves the paging speed and
  1062. Xeliminates the retrace flicker. However, under the color
  1063. Xversion, the update while adding text is a little more slugish
  1064. Xthan I would hope. We will be working to improve this in the future.
  1065. X
  1066. X***    Destroying windows!!
  1067. X
  1068. X    A new command, delete-window (^X-0 [zero]) allows you to
  1069. Xdelete just the current window from the screen, leaving all the
  1070. Xothers intact, (and one of them bigger). This is very convient
  1071. Xwhen you have a lot of windows on the screen.
  1072. X
  1073. X***    Execute Macro commands
  1074. X
  1075. X    Buffers holding commands can now be executed as a "macro". The
  1076. Xnames of these buffers is in the form "[Macro nn]" where nn is a number
  1077. Xfrom 1 to 20.  Each buffer has a corrosponding execute-macro-nn command,
  1078. Xthe first ten of which are bound to the shifted function keys on the IBM
  1079. Xversions.
  1080. X
  1081. X***    Macro loading
  1082. X
  1083. X    Macroes can be loaded from a command file (or startup file) with
  1084. Xthe use of the store-macro command. For example, to make macro 5 insert
  1085. Xa blank line at the begining of the current line, one would put the
  1086. Xfollowing in their startup file:
  1087. X
  1088. X;    Open up a line before the current line
  1089. X
  1090. X5 store-macro
  1091. X    begining-of-line
  1092. X    open-line
  1093. X[end]
  1094. X
  1095. X    more details on this can be found in the standard startup file
  1096. Xand the reference manual.
  1097. X
  1098. X***    Clear message line
  1099. X
  1100. X    Sometimes when executing macroes you want the last command not
  1101. Xto leave a message on the message line at the bottom of the screen. The
  1102. Xclear-message-line command does just that.
  1103. X
  1104. X***    Absolute window resizing
  1105. X
  1106. X    This new command, resize-window (^X-W) allows you to specify the
  1107. Xnumber of lines you wish to have in the current window. For example,
  1108. XM 12 ^X W forces the current window to a size of 12 lines if possible.
  1109. X
  1110. X***    Interactive macro arguments
  1111. X
  1112. X    When executing a command line, if any of the arguments begin
  1113. Xwith an at sign (@) MicroEMACS will prompt the user for that argument on
  1114. Xthe message line, using whatever text follows. A quick macro
  1115. Xdemonstating this can be:
  1116. X
  1117. X;    consult file
  1118. X2 store-macro
  1119. X    2 split-current-window
  1120. X    previous-window
  1121. X    view-file "@File to Consult: "
  1122. X    8 resize-window
  1123. X    add-mode "green"
  1124. X    add-mode "Black"
  1125. X    next-window
  1126. X[end]
  1127. X
  1128. X***    Buffer Macro arguments
  1129. X
  1130. X    When executing a command line, any arguments begining with a
  1131. Xpound sign (#) mean that the argument is to be fetched from the current
  1132. Xline of the named buffer. The point in that buffer is then advanced one
  1133. Xline if that buffer is not currently being displayed.
  1134. X
  1135. X***    Split window modified
  1136. X
  1137. X    The split window command normally leaves the cursor in the window
  1138. Xwhere the cursor was originaly. Now a numeric argument of one forces the
  1139. Xcursor into the upper window, and an argument of 2 forces the cursor
  1140. Xinto the lower window.
  1141. X
  1142. X***    MicroSoft C compiler support
  1143. X
  1144. X    The MicroSoft C compiler (version 3) now can be used
  1145. Xsuccessfully to compile MicroEMACS. Use the large data, small program
  1146. Xmodel for best results. Thanks to Oliver Sharp for the needed
  1147. Xmodifications.
  1148. X
  1149. X***    VMS terminal support upgraded
  1150. X
  1151. X    VMS now uses the newer terminal modes when executing MicroEMACS.
  1152. XAlso some bugs were fixed. Both of these are thanks to Guy Streeter.
  1153. X
  1154. X***    CMODE enhanced
  1155. X
  1156. X    Lines starting with # as the first non-blank character (ie
  1157. Xpre-processer directives) force the # into column one.  Also, if
  1158. Xmatching open parenthises and braces are being displayed when the
  1159. Xclosing one is typed, the cursor will breifly flash to the open and
  1160. Xback.
  1161. X
  1162. X***    Special character quoting
  1163. X
  1164. X    When typing in search/replace strings, ^Q quotes the following
  1165. Xcharacter, allowing keys like <ESC> to be searched for.
  1166. X
  1167. X***    Bindable prefix keys
  1168. X
  1169. X    The META and ^X prefixes may now be bound to other keys. Only
  1170. Xone key may be a prefix key at a time, when one of these is rebound, the
  1171. Xold key is automatically unbound.
  1172. X
  1173. X***    New command line options
  1174. X
  1175. X    @<file>        Specifies an alternative startup file(s) to
  1176. X            run instead of emacs.rc or .emacsrc
  1177. X
  1178. X    -g<n>        go to line <n> of the first file read in
  1179. X
  1180. X    -s<string>    search the first file for <string> and leave
  1181. X            the cursor there.
  1182. X
  1183. X***    Wang keyboard support
  1184. X
  1185. X    The Wang-PC keyboard and is function keys are now supported.
  1186. X(Define WANG in estruct.h as 1) Thanks to Sid Shapiro for this code.
  1187. X
  1188. X***    System V support
  1189. X
  1190. X    Unix system V should now compile and execute MicroEMACS
  1191. Xproperly. Code for this was submited by Linwood Varney.
  1192. X
  1193. X***    Unix definitions reorginized
  1194. X
  1195. X    Now only ONE of the unix symbols should be defined when
  1196. Xcompiling on unices.
  1197. X
  1198. X***    Incremental Search added
  1199. X
  1200. X    For those clamering for it.....Isearch commands. This code was
  1201. Xsubmited by D. R. Banks and seems to work well. (Later we will merge it
  1202. Xwith parts of the normal searching code to conserve space) This is
  1203. Xavailible conditionally depending on the ISRCH symbol in estruct.h
  1204. X
  1205. X***    Insert string command
  1206. X
  1207. X    The insert-string command (unbound) allows you to insert text
  1208. Xinto a line from a macro.  This can be used to build special help and
  1209. Xtext screens.
  1210. X
  1211. X***    Unmark buffer command
  1212. X
  1213. X    The unmark-command (unbound) allows you to unmark a buffer. 
  1214. XThis will keep the exit commands from complaining abount unchanged
  1215. Xbuffers.  This is most usefull when you have built up a text screen from
  1216. Xa macro and have no intention of saving it.
  1217. X
  1218. X***    Special characters
  1219. X
  1220. X    Inside of string argument in macroes, the following special
  1221. Xcharacters are active:
  1222. X
  1223. X    ~n    newline
  1224. X    ~t    tab
  1225. X    ~b    backspace
  1226. X    ~f    formfeed
  1227. X
  1228. X***    Fixed large file problems
  1229. X
  1230. X    Several problems caused by keeping character counts in integers
  1231. Xhave been fixed by making these counts be longs.  Also regions can now
  1232. Xbe larger than 65535 chars.
  1233. X
  1234. X***    Kill buffer re-coded
  1235. X
  1236. X    New kill buffer routines should (and do) work faster.  Also an
  1237. Xunlimited (except by RAM) amount of text can be killed safely.
  1238. X
  1239. X***    Word counting
  1240. X
  1241. X    The count-words (M-^C) command counts the number of words,
  1242. Xcharacters and lines in the current region.  It also gives an average
  1243. Xwords/character total. 
  1244. X
  1245. X***    Changed delete-word behavior
  1246. X
  1247. X    Delete-next-word no longer kills the newline as it deletes tha
  1248. Xlast word on the line.  It does however then delete the newline as it
  1249. Xdeletes the first word on the next line.
  1250. X
  1251. X***    Next/Previous buffer cammands augmented
  1252. X
  1253. X    Both now take a numeric argument to switch to the nth window
  1254. Xfrom the top/bottom.
  1255. X
  1256. X***    Data General Support
  1257. X
  1258. X    MicroEMACS now supprts the Data General System/10 computer under
  1259. XMSDOS.
  1260. X
  1261. X
  1262. FRIDAY_NIGHT
  1263. echo es.9 completed!
  1264. : That's all folks!
  1265.  
  1266.