⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 marks.c

📁 早期freebsd实现
💻 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 + -