📄 delete.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. * ***************************************************************************//* Routines to perform all kinds of deletion. */#include "jove.h"#include "disp.h"/* Assumes that either line1 or line2 is actual the current line, so it can put its result into linebuf. */private voidpatchup(line1, char1, line2, char2)Line *line1, *line2;register int char1, char2;{ if (line1 != line2) ChkWindows(line1, line2); DotTo(line1, char1); modify(); linecopy(linebuf, curchar, lcontents(line2) + char2); /* The following is a redisplay optimization. */ if (line1 != line2 && (char1 == 0 && char2 == 0)) line1->l_dline = line2->l_dline; DFixMarks(line1, char1, line2, char2); makedirty(curline);}/* Deletes the region by unlinking the lines in the middle, and patching things up. The unlinked lines are still in order. */Line *reg_delete(line1, char1, line2, char2)Line *line1, *line2;int char1, char2;{ register Line *retline; if ((line1 == line2 && char1 == char2) || line2 == NULL) complain((char *)NULL); (void) fixorder(&line1, &char1, &line2, &char2); retline = nbufline(); /* New buffer line */ (void) ltobuf(line1, genbuf); if (line1 == line2) genbuf[char2] = '\0'; retline->l_prev = NULL; retline->l_dline = putline(&genbuf[char1]); patchup(line1, char1, line2, char2); if (line1 == line2) retline->l_next = NULL; else { retline->l_next = line1->l_next; (void) ltobuf(line2, genbuf); genbuf[char2] = '\0'; line2->l_dline = putline(genbuf); /* Shorten this line */ } if (line1 != line2) { line1->l_next = line2->l_next; if (line1->l_next) line1->l_next->l_prev = line1; else curbuf->b_last = line1; line2->l_next = NULL; } return retline;}private voidlremove(line1, line2)register Line *line1, *line2;{ Line *next = line1->l_next; if (line1 == line2) return; line1->l_next = line2->l_next; if (line1->l_next) line1->l_next->l_prev = line1; else curbuf->b_last = line1; lfreereg(next, line2); /* Put region at end of free line list. */}/* delete character forward */voidDelNChar(){ del_char(FORWARD, arg_value(), YES);}/* Delete character backward */voidDelPChar(){ if (MinorMode(OverWrite)) { int count = min(arg_value(), curchar); b_char(count); /* overwrite with spaces */ set_arg_value(count); LastKeyStruck = ' '; SelfInsert(); b_char(count); } else del_char(BACKWARD, arg_value(), YES);}/* Delete some characters. If deleting forward then call for_char to the final position otherwise call back_char. Then delete the region between the two with patchup(). */voiddel_char(dir, num, OK_kill)int dir, num, OK_kill;{ Bufpos before, after; bool killp = (OK_kill && (abs(num) > 1)); DOTsave(&before); if (dir == FORWARD) f_char(num); else b_char(num); if (before.p_line == curline && before.p_char == curchar) complain((char *)NULL); if (killp) reg_kill(before.p_line, before.p_char, YES); else { DOTsave(&after); (void) fixorder(&before.p_line, &before.p_char, &after.p_line, &after.p_char); patchup(before.p_line, before.p_char, after.p_line, after.p_char); lremove(before.p_line, after.p_line); }}/* This kills a region between point, and line1/char1 and puts it on the kill-ring. If the last command was one of the kill commands, the region is appended (prepended if backwards) to the last entry. */int killptr = 0;Line *killbuf[NUMKILLS];voidreg_kill(line2, char2, dot_moved)Line *line2;int char2;bool dot_moved;{ Line *nl, *line1 = curline; int char1 = curchar; bool backwards; backwards = !fixorder(&line1, &char1, &line2, &char2); /* This is a kludge! But it possible for commands that don't know which direction they are deleting in (e.g., delete previous word could have been called with a negative argument in which case, it wouldn't know that it really deleted forward. */ if (!dot_moved) backwards = !backwards; DotTo(line1, char1); nl = reg_delete(line1, char1, line2, char2); if (last_cmd != KILLCMD) { killptr = ((killptr + 1) % NUMKILLS); lfreelist(killbuf[killptr]); killbuf[killptr] = nl; } else { Line *lastln = lastline(nl); if (backwards) { (void) DoYank(nl, 0, lastln, length(lastln), killbuf[killptr], 0, (Buffer *)NULL); } else { Line *olastln = lastline(killbuf[killptr]); (void) DoYank(nl, 0, lastln, length(lastln), olastln, length(olastln), (Buffer *)NULL); } } this_cmd = KILLCMD;}voidDelReg(){ register Mark *mp = CurMark(); reg_kill(mp->m_line, mp->m_char, NO);}/* Save a region. A pretend kill. */voidCopyRegion(){ register Line *nl; register Mark *mp; register int status; mp = CurMark(); if (mp->m_line == curline && mp->m_char == curchar) complain((char *)NULL); killptr = ((killptr + 1) % NUMKILLS); if (killbuf[killptr]) lfreelist(killbuf[killptr]); nl = killbuf[killptr] = nbufline(); SavLine(nl, NullStr); nl->l_next = nl->l_prev = NULL; status = inorder(mp->m_line, mp->m_char, curline, curchar); if (status == -1) return; if (status) (void) DoYank(mp->m_line, mp->m_char, curline, curchar, nl, 0, (Buffer *)NULL); else (void) DoYank(curline, curchar, mp->m_line, mp->m_char, nl, 0, (Buffer *)NULL);}voidDelWtSpace(){ register char *ep = &linebuf[curchar], *sp = &linebuf[curchar]; while (*ep == ' ' || *ep == '\t') ep += 1; while (sp > linebuf && (sp[-1] == ' ' || sp[-1] == '\t')) sp -= 1; if (sp != ep) { curchar = sp - linebuf; DFixMarks(curline, curchar, curline, curchar + (ep - sp)); strcpy(sp, ep); makedirty(curline); modify(); }}voidDelBlnkLines(){ register Mark *dot; bool all; if (!blnkp(&linebuf[curchar])) return; dot = MakeMark(curline, curchar, M_FLOATER); all = !blnkp(linebuf); while (blnkp(linebuf) && curline->l_prev) SetLine(curline->l_prev); all |= firstp(curline); Eol(); DelWtSpace(); line_move(FORWARD, 1, NO); while (blnkp(linebuf) && !eobp()) { DelWtSpace(); del_char(FORWARD, 1, NO); } if (!all && !eobp()) open_lines(1); ToMark(dot); DelMark(dot);}private voiddword(forward)bool forward;{ Bufpos savedot; DOTsave(&savedot); if (forward) ForWord(); else BackWord(); reg_kill(savedot.p_line, savedot.p_char, YES);}voidDelNWord(){ dword(YES);}voidDelPWord(){ dword(NO);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -