📄 insert.c
字号:
/*************************************************************************** * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne. JOVE * * is provided to you without charge, and with no warranty. You may give * * away copies of JOVE, including sources, provided that this notice is * * included in all the files. * ***************************************************************************/#include "jove.h"#include "ctype.h"#include "list.h"#include "chars.h"#include "disp.h"private void DoNewline proto((bool indentp));private Bufpos *lisp_indent proto((void));/* Make a new line after "after" in buffer "buf", unless "after" is NULL, in which case we insert the new line before first line. */Line *listput(buf, after)register Buffer *buf;register Line *after;{ register Line *newline = nbufline(); newline->l_prev = after; if (after == NULL) { /* Before the first line */ newline->l_next = buf->b_first; buf->b_first = newline; } else { newline->l_next = after->l_next; after->l_next = newline; } if (newline->l_next != NULL) newline->l_next->l_prev = newline; else if (buf != NULL) buf->b_last = newline; if (buf && buf->b_dot == NULL) buf->b_dot = newline; return newline;}/* Divide the current line and move the current line to the next one */voidLineInsert(num)register int num;{ char newline[LBSIZE]; register Line *newdot, *olddot; int oldchar; olddot = curline; oldchar = curchar; newdot = curline; while (--num >= 0) { newdot = listput(curbuf, newdot); SavLine(newdot, NullStr); } modify(); if (curchar != 0) { strcpy(newline, &linebuf[curchar]); linebuf[curchar] = '\0'; /* Shorten this line */ SavLine(curline, linebuf); strcpy(linebuf, newline); } else { /* Redisplay optimization */ newdot->l_dline = curline->l_dline; SavLine(curline, NullStr); } makedirty(curline); curline = newdot; curchar = 0; makedirty(curline); IFixMarks(olddot, oldchar, curline, curchar);}/* Inserts tabs and spaces to move the cursor to column GOAL. It Uses the most optimal number of tabs and spaces no matter what was there before hand. */voidn_indent(goal)register int goal;{ int dotcol, incrmt; DelWtSpace(); dotcol = calc_pos(linebuf, curchar); for (;;) { incrmt = (tabstop - (dotcol % tabstop)); if (dotcol + incrmt > goal) break; insert_c('\t', 1); dotcol += incrmt; } if (dotcol != goal) insert_c(' ', (goal - dotcol));}#ifdef ABBREVvoidMaybeAbbrevExpand(){ if (MinorMode(Abbrev) && !ismword(LastKeyStruck) && !bolp() && ismword(linebuf[curchar - 1])) AbbrevExpand();}#endifprivate voidInsert(c)int c;{ if (c == CTL('J')) LineInsert(arg_value()); else insert_c(c, arg_value());}voidSelfInsert(){#ifdef ABBREV MaybeAbbrevExpand();#endif if (LastKeyStruck != CTL('J') && MinorMode(OverWrite)) { register int num, i; for (i = 0, num = arg_value(); i < num; i++) { int pos = calc_pos(linebuf, curchar); if (!eolp()) { if (linebuf[curchar] == '\t') { if ((pos + 1) == ((pos + tabstop) - (pos % tabstop))) del_char(FORWARD, 1, NO); } else del_char(FORWARD, 1, NO); } insert_c(LastKeyStruck, 1); } } else Insert(LastKeyStruck); if (MinorMode(Fill) && (curchar >= RMargin || (calc_pos(linebuf, curchar) >= RMargin))) { int margin; Bufpos save; if (MinorMode(Indent)) { DOTsave(&save); ToIndent(); margin = calc_pos(linebuf, curchar); SetDot(&save); } else margin = LMargin; DoJustify(curline, 0, curline, curchar + (int)strlen(&linebuf[curchar]), YES, margin); }}/* insert character C N times at point */voidinsert_c(c, n)int c, n;{ if (n <= 0) return; modify(); makedirty(curline); ins_c(c, linebuf, curchar, n, LBSIZE); IFixMarks(curline, curchar, curline, curchar + n); curchar += n;}/* Tab in to the right place for C mode */voidTab(){#ifdef LISP if (MajorMode(LISPMODE) && (bolp() || !eolp())) { int dotchar = curchar; Mark *m = NULL; ToIndent(); if (dotchar > curchar) m = MakeMark(curline, dotchar, M_FLOATER); (void) lisp_indent(); if (m) { ToMark(m); DelMark(m); } else ToIndent(); return; }#endif if (MajorMode(CMODE)) { if (within_indent()) (void) c_indent(NO); else { int curpos, tabbed_pos; skip_wht_space(); curpos = calc_pos(linebuf, curchar); tabbed_pos = curpos + (CIndIncrmt - (curpos % CIndIncrmt)); n_indent(tabbed_pos); } } else SelfInsert();}voidQuotChar(){ int c, slow = NO; c = waitchar(&slow); if (c != CTL('@')) Insert(c);}/* Insert the paren. If in C mode and c is a '}' then insert the '}' in the "right" place for C indentation; that is indented the same amount as the matching '{' is indented. */int PDelay = 5, /* 1/2 a second */ CIndIncrmt = 8;voidDoParen(){ Bufpos *bp; int tried = NO, nx, c = LastKeyStruck; if (!jisclosep(c)) { SelfInsert(); return; } if (MajorMode(CMODE) && c == '}' && within_indent()) { bp = c_indent(YES); tried = TRUE; }#ifdef LISP if (MajorMode(LISPMODE) && c == ')' && blnkp(linebuf)) { bp = lisp_indent(); tried = TRUE; }#endif SelfInsert();#ifdef MAC if (MinorMode(ShowMatch) && !in_macro()) {#else if (MinorMode(ShowMatch) && !charp() && !in_macro()) {#endif b_char(1); /* Back onto the ')' */ if (!tried) bp = m_paren(c, BACKWARD, NO, YES); f_char(1); if (bp != NULL) { nx = in_window(curwind, bp->p_line); if (nx != -1) { /* is visible */ Bufpos b; DOTsave(&b); SetDot(bp); SitFor(PDelay); SetDot(&b); } else s_mess("%s", lcontents(bp->p_line)); } mp_error(); /* display error message */ }}voidLineAI(){ DoNewline(TRUE);}voidNewline(){ DoNewline(MinorMode(Indent));}private voidDoNewline(indentp)bool indentp;{ Bufpos save; int indent; /* first we calculate the indent of the current line */ DOTsave(&save); ToIndent(); indent = calc_pos(linebuf, curchar); SetDot(&save);#ifdef ABBREV MaybeAbbrevExpand();#endif if (#ifdef LISP MajorMode(LISPMODE) ||#endif indentp || blnkp(linebuf)) { DelWtSpace(); } /* If there is more than 2 blank lines in a row then don't make a newline, just move down one. */ if (arg_value() == 1 && eolp() && TwoBlank()) SetLine(curline->l_next); else LineInsert(arg_value()); if (indentp) {#ifdef LISP if (MajorMode(LISPMODE)) (void) lisp_indent(); else#endif { Bol(); n_indent((LMargin == 0) ? indent : LMargin); } }}voidins_str(str, ok_nl)register char *str;int ok_nl;{ register char c; Bufpos save; int llen; if (*str == '\0') return; /* ain't nothing to insert! */ DOTsave(&save); llen = strlen(linebuf); while ((c = *str++) != '\0') { if (c == '\n' || (ok_nl && llen >= LBSIZE - 2)) { IFixMarks(save.p_line, save.p_char, curline, curchar); modify(); makedirty(curline); LineInsert(1); DOTsave(&save); llen = strlen(linebuf); } if (c != '\n') { ins_c(c, linebuf, curchar++, 1, LBSIZE); llen += 1; } } IFixMarks(save.p_line, save.p_char, curline, curchar); modify(); makedirty(curline);}voidopen_lines(n)int n;{ Bufpos dot; DOTsave(&dot); LineInsert(n); /* Open the lines... */ SetDot(&dot);}voidOpenLine(){ open_lines(arg_value());}/* Take the region FLINE/FCHAR to TLINE/TCHAR and insert it at ATLINE/ATCHAR in WHATBUF. */Bufpos *DoYank(fline, fchar, tline, tchar, atline, atchar, whatbuf)Line *fline, *tline, *atline;int fchar, tchar, atchar;Buffer *whatbuf;{ register Line *newline; static Bufpos bp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -