📄 marks.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"bool MarksShouldFloat = ON;Mark *MakeMark(line, column, type)register Line *line;int column, type;{ register Mark *newmark = (Mark *) emalloc(sizeof *newmark); MarkSet(newmark, line, column); newmark->m_next = curbuf->b_marks; newmark->m_flags = type; curbuf->b_marks = newmark; return newmark;}voidflush_marks(b)Buffer *b;{ register Mark *m, *next; m = b->b_marks; while (m != NULL) { next = m->m_next; free((UnivPtr) m); m = next; }}voidDelMark(m)register Mark *m;{ register Mark *mp = curbuf->b_marks; if (m == mp) curbuf->b_marks = m->m_next; else { while (mp != NULL && mp->m_next != m) mp = mp->m_next; if (mp == NULL) complain("Unknown mark!"); mp->m_next = m->m_next; } free((UnivPtr) m);}voidAllMarkSet(b, line, col)Buffer *b;register Line *line;int col;{ register Mark *mp; for (mp = b->b_marks; mp != NULL; mp = mp->m_next) MarkSet(mp, line, col);}voidMarkSet(m, line, column)Mark *m;Line *line;int column;{ m->m_line = line; m->m_char = column;}voidPopMark(){ int pmark; if (curmark == NULL) return; if (curbuf->b_markring[(curbuf->b_themark + 1) % NMARKS] == NULL) { pmark = curbuf->b_themark; do { if (--pmark < 0) pmark = NMARKS - 1; } while (curbuf->b_markring[pmark] != NULL); curbuf->b_markring[pmark] = MakeMark(curline, curchar, MarksShouldFloat ? M_FLOATER : M_FIXED); ToMark(curmark); DelMark(curmark); curmark = NULL; } else PtToMark(); pmark = curbuf->b_themark - 1; if (pmark < 0) pmark = NMARKS - 1; curbuf->b_themark = pmark;}voidSetMark(){ if (is_an_arg()) PopMark(); else set_mark();}voidset_mark(){ do_set_mark(curline, curchar);}voiddo_set_mark(l, c)Line *l;int c;{ curbuf->b_themark = (curbuf->b_themark + 1) % NMARKS; if (curmark == NULL) curmark = MakeMark(l, c, MarksShouldFloat ? M_FLOATER : M_FIXED); else MarkSet(curmark, l, c); s_mess("[Point pushed]");}/* Move point to Mark */voidToMark(m)Mark *m;{ int len; if (m == NULL) return; DotTo(m->m_line, m->m_char); if (curchar > (len = length(curline))) curchar = len;}Mark *CurMark(){ if (curmark == NULL) complain("No mark."); return curmark;}voidPtToMark(){ Line *mline; int mchar; Mark *m = CurMark(); mline = curline; mchar = curchar; ToMark(m); MarkSet(m, mline, mchar);}/* Fix marks for after a deletion. For now, even marks that don't float will actually float, because we can't allow marks to point to non-existant lines. */voidDFixMarks(line1, char1, line2, char2)register Line *line1, *line2;int char1, char2;{ register Mark *m; Line *lp; if (curbuf->b_marks == NULL) return; for (lp = line1; lp != line2->l_next; lp = lp->l_next) { for (m = curbuf->b_marks; m != NULL; m = m->m_next) { if (m->m_line == lp && (lp != line1 || m->m_char > char1)) { if (lp == line2 && m->m_char >= char2) m->m_char -= char2-char1; else m->m_char = char1; m->m_line = line1; if (line1 != line2) m->m_flags |= M_BIG_DELETE; } } }}/* Fix marks after an insertion. Marks that don't float are ignored on insertion, which means PtToMark has to be careful ... */voidIFixMarks(line1, char1, line2, char2)register Line *line1, *line2;int char1, char2;{ register Mark *m; for (m = curbuf->b_marks; m != NULL; m = m->m_next) { if ((m->m_flags & M_FLOATER) && m->m_line == line1 && m->m_char > char1) { m->m_line = line2; m->m_char += char2 - char1; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -