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

📄 vcmd.h

📁 早期freebsd实现
💻 H
字号:
/*- * Copyright (c) 1992, 1993, 1994 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * *	@(#)vcmd.h	8.30 (Berkeley) 4/13/94 */typedef struct _vikeys VIKEYS;/* Structure passed around to functions implementing vi commands. */typedef struct _vicmdarg {#define	vp_startzero	buffer		/* START ZERO OUT. */	CHAR_T	key;			/* Command key. */	CHAR_T	buffer;			/* Buffer. */	CHAR_T	character;		/* Character. */	u_long	count;			/* Count. */	u_long	count2;			/* Second count (only used by z). */	VIKEYS const *kp;		/* VIKEYS key. */	size_t	klen;			/* Keyword length. */	/*	 * Historic vi allowed "dl" when the cursor was on the last column,	 * deleting the last character, and similarly allowed "dw" when	 * the cursor was on the last column of the file.  It didn't allow	 * "dh" when the cursor was on column 1, although these cases are	 * not strictly analogous.  The point is that some movements would	 * succeed if they were associated with a motion command, and fail	 * otherwise.  This is part of the off-by-1 schizophrenia that	 * plagued vi.  Other examples are that "dfb" deleted everything	 * up to and including the next 'b' character, while "d/b" deleted	 * everything up to the next 'b' character.  While this implementation	 * regularizes the interface to the extent possible, there are many	 * special cases that can't be fixed.  The special cases are handled	 * by setting flags per command so that the underlying command and	 * motion routines know what's really going on.	 *	 * The VC_* and VM_* flags are set in the vikeys array, and the VM_*	 * flags may be set by the underlying functions (motion component or	 * command) as well.  For this reason, the flags in the VICMDARG and	 * VIKEYS structures live in the same name space.	 */#define	VC_C		0x00000001	/* The 'c' command. */#define	VC_D		0x00000002	/* The 'd' command. */#define	VC_S		0x00000004	/* The '>' command. */#define	VC_Y		0x00000008	/* The 'y' command. */#define	VC_COMMASK	0x0000000f	/* Mask for special flags. */#define	ISMOTION(vp)	F_ISSET(vp, VC_COMMASK)	/*	 * The VM_RCM_* flags are single usage, i.e. if you set one, you have	 * to clear the others.	 */#define	VM_LDOUBLE	0x00000010	/* Doubled command for line mode. */#define	VM_LMODE	0x00000020	/* Motion is line oriented. */#define	VM_NOMOTION	0x00000040	/* Motion command not entered. */#define	VM_RCM		0x00000080	/* Use relative cursor movment (RCM). */#define	VM_RCM_SET	0x00000100	/* RCM: set to current position. */#define	VM_RCM_SETFNB	0x00000200	/* RCM: set to first non-blank (FNB). */#define	VM_RCM_SETLAST	0x00000400	/* RCM: set to last character. */#define	VM_RCM_SETLFNB	0x00000800	/* RCM: set to FNB if cursor moved. */#define	VM_RCM_SETNNB	0x00001000	/* RCM: set to next non-blank. */#define	VM_RCM_MASK	0x00001f80	/* Mask for RCM flags. */	/* Flags for the underlying function. */#define	VC_BUFFER	0x00002000	/* The buffer was set. */#define	VC_C1RESET	0x00004000	/* Reset C1SET flag for dot commands. */#define	VC_C1SET	0x00008000	/* Count 1 was set. */#define	VC_C2SET	0x00010000	/* Count 2 was set. */#define	VC_ISDOT	0x00020000	/* Command was the dot command. */	u_int32_t flags;#define	vp_endzero	keyword		/* END ZERO OUT. */	char	*keyword;		/* Keyword. */	size_t	 kbuflen;		/* Keyword buffer length. */	/*	 * There are four cursor locations that we worry about: the initial	 * cursor position, the start of the range, the end of the range,	 * and the final cursor position.  The initial cursor position and	 * the start of the range are both m_start, and are always the same.	 * All locations are initialized to the starting cursor position by	 * the main vi routines, and the underlying functions depend on this.	 *	 * Commands that can be motion components set the end of the range	 * cursor position, m_stop.  All commands must set the ending cursor	 * position, m_final.  The reason that m_stop isn't the same as m_final	 * is that there are situations where the final position of the cursor	 * is outside of the cut/delete range (e.g. 'd[[' from the first column	 * of a line).  The final cursor position often varies based on the	 * direction of the movement, as well as the command.  The only special	 * case that the delete code handles is that it will make adjustments	 * if the final cursor position is deleted.	 *	 * The reason for all of this is that the historic vi semantics were	 * defined command-by-command.  Every function has to roll its own	 * starting and stopping positions, and adjust if it's being used as a	 * motion component.  The general rules are as follows:	 *	1: If not a motion component, the final cursor is at the end	 *	   of the range.	 *	2: If moving backward in the file:	 *	 a:	VC_D moves to the end of the range.	 *	 b:	If the line hasn't changed, VC_Y doesn't move, else it	 *		moves to the end of the range.	 *	3: If moving forward in the file, VC_D and VC_Y stay at the	 *	   start of the range.	 *	 * Usually, if moving backward in the file and it's a motion component,	 * the starting cursor is decremented by a single character (or, in a	 * few cases, to the end of the previous line) so that the starting	 * cursor character isn't cut or deleted.  No cursor adjustment is	 * needed for moving forward, because the cut/delete routines handle	 * m_stop inclusively, i.e. the last character in the range is cut or	 * deleted.  This makes cutting to the EOF/EOL reasonable.	 *	 * We ignore VC_C and VC_S everywhere, because the text input routines	 * always set the cursor to the last character inserted.	 */	MARK	 m_start;		/* mark: initial cursor, range start. */	MARK	 m_stop;		/* mark: range end. */	MARK	 m_final;		/* mark: final cursor position. */} VICMDARG;/* Vi command structure. */struct _vikeys {			/* Underlying function. */	int	 (*func) __P((SCR *, EXF *, VICMDARG *));#define	V_ABS		0x00040000	/* Absolute movement, set '' mark. */#define	V_CHAR		0x00080000	/* Character (required, trailing). */#define	V_CNT		0x00100000	/* Count (optional, leading). */#define	V_DOT		0x00200000	/* On success, sets dot command. */#define	V_KEYNUM	0x00400000	/* Cursor referenced number. */#define	V_KEYW		0x00800000	/* Cursor referenced word. */#define	V_MOTION	0x01000000	/* Motion (required, trailing). */#define	V_MOVE		0x02000000	/* Command defines movement. */#define	V_OBUF		0x04000000	/* Buffer (optional, leading). */#define	V_RBUF		0x08000000	/* Buffer (required, trailing). */	u_int32_t flags;	char	*usage;			/* Usage line. */	char	*help;			/* Help line. */};#define	MAXVIKEY	126		/* List of vi commands. */extern VIKEYS const vikeys[MAXVIKEY + 1];/* Definition of a vi "word". */#define	inword(ch)	(isalnum(ch) || (ch) == '_')/* Offset to next column of stop size. */#define	STOP_OFF(c, stop)	(stop - (c) % stop)/* Character stream structure, prototypes. */typedef struct _vcs {	recno_t	 cs_lno;		/* Line. */	size_t	 cs_cno;		/* Column. */	char	*cs_bp;			/* Buffer. */	size_t	 cs_len;		/* Length. */	int	 cs_ch;			/* Character. */#define	CS_EMP	1			/* Empty line. */#define	CS_EOF	2			/* End-of-file. */#define	CS_EOL	3			/* End-of-line. */#define	CS_SOF	4			/* Start-of-file. */	int	 cs_flags;		/* Return flags. */} VCS;int	cs_bblank __P((SCR *, EXF *, VCS *));int	cs_fblank __P((SCR *, EXF *, VCS *));int	cs_fspace __P((SCR *, EXF *, VCS *));int	cs_init __P((SCR *, EXF *, VCS *));int	cs_next __P((SCR *, EXF *, VCS *));int	cs_prev __P((SCR *, EXF *, VCS *));					/* Character search information. */enum cdirection	{ CNOTSET, FSEARCH, fSEARCH, TSEARCH, tSEARCH };/* Vi private, per-screen memory. */typedef struct _vi_private {	VICMDARG sdot;			/* Saved dot, motion command. */	VICMDARG sdotmotion;	CHAR_T	 rlast;			/* Last 'r' command character. */	char	*rep;			/* Input replay buffer. */	size_t	 rep_len;		/* Input replay buffer length. */	size_t	 rep_cnt;		/* Input replay buffer characters. */	CHAR_T	 inc_lastch;		/* Last increment character. */	long	 inc_lastval;		/* Last increment value. */	char	*paragraph;		/* Paragraph search list. */	size_t	 paragraph_len;		/* Paragraph search list length. */	u_long	 u_ccnt;		/* Undo command count. */	CHAR_T	 lastckey;		/* Last search character. */	enum cdirection	csearchdir;	/* Character search direction. */} VI_PRIVATE;#define	VIP(sp)	((VI_PRIVATE *)((sp)->vi_private))/* Vi function prototypes. */int	txt_auto __P((SCR *, EXF *, recno_t, TEXT *, size_t, TEXT *));int	v_buildparagraph __P((SCR *));int	v_end __P((SCR *));void	v_eof __P((SCR *, EXF *, MARK *));void	v_eol __P((SCR *, EXF *, MARK *));int	v_exwrite __P((void *, const char *, int));int	v_init __P((SCR *, EXF *));int	v_isempty __P((char *, size_t));int	v_msgflush __P((SCR *));void	v_nomove __P((SCR *));int	v_ntext __P((SCR *, EXF *, TEXTH *, MARK *,	    const char *, const size_t, MARK *, ARG_CHAR_T, recno_t, u_int));int	v_optchange __P((SCR *, int));int	v_screen_copy __P((SCR *, SCR *));int	v_screen_end __P((SCR *));void	v_sof __P((SCR *, MARK *));void	v_sol __P((SCR *));int	vi __P((SCR *, EXF *));#define	VIPROTO(name)	int name __P((SCR *, EXF *, VICMDARG *))VIPROTO(v_again);VIPROTO(v_at);VIPROTO(v_bmark);VIPROTO(v_bottom);VIPROTO(v_cfirst);VIPROTO(v_Change);VIPROTO(v_change);VIPROTO(v_chF);VIPROTO(v_chf);VIPROTO(v_chrepeat);VIPROTO(v_chrrepeat);VIPROTO(v_chT);VIPROTO(v_cht);VIPROTO(v_cr);VIPROTO(v_Delete);VIPROTO(v_delete);VIPROTO(v_dollar);VIPROTO(v_down);VIPROTO(v_ex);VIPROTO(v_exmode);VIPROTO(v_filter);VIPROTO(v_first);VIPROTO(v_fmark);VIPROTO(v_home);VIPROTO(v_hpagedown);VIPROTO(v_hpageup);VIPROTO(v_iA);VIPROTO(v_ia);VIPROTO(v_iI);VIPROTO(v_ii);VIPROTO(v_increment);VIPROTO(v_iO);VIPROTO(v_io);VIPROTO(v_join);VIPROTO(v_left);VIPROTO(v_lgoto);VIPROTO(v_linedown);VIPROTO(v_lineup);VIPROTO(v_mark);VIPROTO(v_match);VIPROTO(v_middle);VIPROTO(v_ncol);VIPROTO(v_pagedown);VIPROTO(v_pageup);VIPROTO(v_paragraphb);VIPROTO(v_paragraphf);VIPROTO(v_Put);VIPROTO(v_put);VIPROTO(v_redraw);VIPROTO(v_Replace);VIPROTO(v_replace);VIPROTO(v_right);VIPROTO(v_screen);VIPROTO(v_searchb);VIPROTO(v_searchf);VIPROTO(v_searchN);VIPROTO(v_searchn);VIPROTO(v_searchw);VIPROTO(v_sectionb);VIPROTO(v_sectionf);VIPROTO(v_sentenceb);VIPROTO(v_sentencef);VIPROTO(v_shiftl);VIPROTO(v_shiftr);VIPROTO(v_status);VIPROTO(v_stop);VIPROTO(v_Subst);VIPROTO(v_subst);VIPROTO(v_switch);VIPROTO(v_tagpop);VIPROTO(v_tagpush);VIPROTO(v_ulcase);VIPROTO(v_Undo);VIPROTO(v_undo);VIPROTO(v_up);VIPROTO(v_wordB);VIPROTO(v_wordb);VIPROTO(v_wordE);VIPROTO(v_worde);VIPROTO(v_wordW);VIPROTO(v_wordw);VIPROTO(v_Xchar);VIPROTO(v_xchar);VIPROTO(v_Yank);VIPROTO(v_yank);VIPROTO(v_z);VIPROTO(v_zero);VIPROTO(v_zexit);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -