2 * Copyright (c) 1991, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 * Copyright (c) 1991, 1993, 1994, 1995, 1996
5 * Keith Bostic. All rights reserved.
7 * See the LICENSE file for redistribution information.
9 * $Id: key.h,v 10.36 2001/04/23 22:46:56 skimo Exp $ (Berkeley) $Date: 2001/04/23 22:46:56 $
12 #include "multibyte.h"
15 * Fundamental character types.
17 * CHAR_T An integral type that can hold any character.
18 * ARG_CHAR_T The type of a CHAR_T when passed as an argument using
19 * traditional promotion rules. It should also be able
20 * to be compared against any CHAR_T for equality without
22 * MAX_CHAR_T The maximum value of any character.
24 * If no integral type can hold a character, don't even try the port.
26 typedef u_int ARG_CHAR_T
;
29 #define FILE2INT(sp,n,nlen,w,wlen) \
30 sp->conv->file2int(sp->conv, n, nlen, &sp->wp->cw, &wlen), \
32 #define INT2FILE(sp,w,wlen,n,nlen) \
33 sp->conv->int2file(sp->conv, w, wlen, &sp->wp->cw, &nlen), \
35 #define CHAR2INTB(sp,n,nlen,w,wlen,buf) \
36 sp->conv->char2int(sp->conv, n, nlen, &buf, &wlen), \
38 #define INT2CHAR(sp,w,wlen,n,nlen) \
39 sp->conv->int2char(sp->conv, w, wlen, &sp->wp->cw, &nlen), \
41 #define INT2DISP(sp,w,wlen,n,nlen) \
42 sp->conv->int2disp(sp->conv, w, wlen, &sp->wp->cw, &nlen), \
46 #define FILE2INT(sp,n,nlen,w,wlen) \
48 #define INT2FILE(sp,w,wlen,n,nlen) \
50 #define CHAR2INTB(sp,n,nlen,w,wlen,buf) \
52 #define INT2CHAR(sp,w,wlen,n,nlen) \
54 #define INT2DISP(sp,w,wlen,n,nlen) \
58 #define CHAR2INT(sp,n,nlen,w,wlen) \
59 CHAR2INTB(sp,n,nlen,w,wlen,sp->wp->cw)
67 #define MEMCPYW(to, from, n) \
68 memcpy(to, from, (n) * sizeof(CHAR_T))
69 #define MEMMOVEW(to, from, n) \
70 memmove(to, from, (n) * sizeof(CHAR_T))
72 /* The maximum number of columns any character can take up on a screen. */
73 #define MAX_CHARACTER_COLUMNS 4
78 * The program structure depends on the event loop being able to return
79 * E_EOF/E_ERR multiple times -- eventually enough things will end due
80 * to the events that vi will reach the command level for the screen, at
81 * which point the exit flags will be set and vi will exit.
84 E_NOTUSED
= 0, /* Not set. */
85 E_CHARACTER
, /* Input character: e_c set. */
86 E_EOF
, /* End of input (NOT ^D). */
87 E_ERR
, /* Input error. */
88 E_INTERRUPT
, /* Interrupt. */
89 E_IPCOMMAND
, /* IP command: e_ipcom set. */
90 E_REPAINT
, /* Repaint: e_flno, e_tlno set. */
91 E_SIGHUP
, /* SIGHUP. */
92 E_SIGTERM
, /* SIGTERM. */
93 E_STRING
, /* Input string: e_csp, e_len set. */
94 E_TIMEOUT
, /* Timeout. */
95 E_WRESIZE
, /* Window resize. */
103 K_NOTUSED
= 0, /* Not set. */
116 K_RIGHTBRACE
, /* } */
117 K_RIGHTPAREN
, /* ) */
119 K_VERASE
, /* set from tty: default ^H */
120 K_VKILL
, /* set from tty: default ^U */
121 K_VLNEXT
, /* set from tty: default ^V */
122 K_VWERASE
, /* set from tty: default ^W */
127 TAILQ_ENTRY(_event
) q
; /* Linked list of events. */
128 e_event_t e_event
; /* Event type. */
129 int e_ipcom
; /* IP command. */
131 #define CH_ABBREVIATED 0x01 /* Character is from an abbreviation. */
132 #define CH_MAPPED 0x02 /* Character is from a map. */
133 #define CH_NOMAP 0x04 /* Do not map the character. */
134 #define CH_QUOTED 0x08 /* Character is already quoted. */
135 CHAR_T e_c
; /* Character. */
136 e_key_t e_value
; /* Key type. */
138 #define e_flags e_val1 /* Flags. */
139 #define e_lno e_val1 /* Single location. */
141 #define e_flno e_val1 /* Text region. */
142 #define e_fcno e_val2
143 #define e_tlno e_val3
144 #define e_tcno e_val4
145 size_t e_val1
; /* Value #1. */
146 size_t e_val2
; /* Value #2. */
147 size_t e_val3
; /* Value #3. */
148 size_t e_val4
; /* Value #4. */
152 CHAR_T
*e_str1
; /* String #1. */
153 size_t e_len1
; /* String #1 length. */
154 CHAR_T
*e_str2
; /* String #2. */
155 size_t e_len2
; /* String #2 length. */
158 typedef struct _keylist
{
159 e_key_t value
; /* Special value. */
160 UCHAR_T ch
; /* Key. */
162 extern KEYLIST keylist
[];
164 /* Return if more keys in queue. */
165 #define KEYS_WAITING(sp) ((sp)->wp->i_cnt != 0)
166 #define MAPPED_KEYS_WAITING(sp) \
167 (KEYS_WAITING(sp) && \
168 FL_ISSET((sp)->wp->i_event[(sp)->wp->i_next].e_flags, CH_MAPPED))
171 * Ex/vi commands are generally separated by whitespace characters. We
172 * can't use the standard isspace(3) macro because it returns true for
173 * characters like ^K in the ASCII character set. The 4.4BSD isblank(3)
174 * macro does exactly what we want, but it's not portable yet.
177 * Note side effect, ch is evaluated multiple times.
180 #define isblank(ch) ((ch) == ' ' || (ch) == '\t')
183 /* The "standard" tab width, for displaying things to users. */
184 #define STANDARD_TAB 6
186 /* Various special characters, messages. */
187 #define CH_BSEARCH '?' /* Backward search prompt. */
188 #define CH_CURSOR ' ' /* Cursor character. */
189 #define CH_ENDMARK '$' /* End of a range. */
190 #define CH_EXPROMPT ':' /* Ex prompt. */
191 #define CH_FSEARCH '/' /* Forward search prompt. */
192 #define CH_HEX '\030' /* Leading hex character. */
193 #define CH_LITERAL '\026' /* ASCII ^V. */
194 #define CH_NO 'n' /* No. */
195 #define CH_NOT_DIGIT 'a' /* A non-isdigit() character. */
196 #define CH_QUIT 'q' /* Quit. */
197 #define CH_YES 'y' /* Yes. */
200 * Checking for interrupts means that we look at the bit that gets set if the
201 * screen code supports asynchronous events, and call back into the event code
202 * so that non-asynchronous screens get a chance to post the interrupt.
204 * INTERRUPT_CHECK is the number of lines "operated" on before checking for
207 #define INTERRUPT_CHECK 100
208 #define INTERRUPTED(sp) \
209 (F_ISSET((sp)->gp, G_INTERRUPTED) || \
210 (!v_event_get(sp, NULL, 0, EC_INTERRUPT) && \
211 F_ISSET((sp)->gp, G_INTERRUPTED)))
212 #define CLR_INTERRUPT(sp) \
213 F_CLR((sp)->gp, G_INTERRUPTED)
215 /* Flags describing types of characters being requested. */
216 #define EC_INTERRUPT 0x001 /* Checking for interrupts. */
217 #define EC_MAPCOMMAND 0x002 /* Apply the command map. */
218 #define EC_MAPINPUT 0x004 /* Apply the input map. */
219 #define EC_MAPNODIGIT 0x008 /* Return to a digit. */
220 #define EC_QUOTED 0x010 /* Try to quote next character */
221 #define EC_RAW 0x020 /* Any next character. XXX: not used. */
222 #define EC_TIMEOUT 0x040 /* Timeout to next character. */
224 /* Flags describing text input special cases. */
225 #define TXT_ADDNEWLINE 0x00000001 /* Replay starts on a new line. */
226 #define TXT_AICHARS 0x00000002 /* Leading autoindent chars. */
227 #define TXT_ALTWERASE 0x00000004 /* Option: altwerase. */
228 #define TXT_APPENDEOL 0x00000008 /* Appending after EOL. */
229 #define TXT_AUTOINDENT 0x00000010 /* Autoindent set this line. */
230 #define TXT_BACKSLASH 0x00000020 /* Backslashes escape characters. */
231 #define TXT_BEAUTIFY 0x00000040 /* Only printable characters. */
232 #define TXT_BS 0x00000080 /* Backspace returns the buffer. */
233 #define TXT_CEDIT 0x00000100 /* Can return TERM_CEDIT. */
234 #define TXT_CNTRLD 0x00000200 /* Control-D is a command. */
235 #define TXT_CNTRLT 0x00000400 /* Control-T is an indent special. */
236 #define TXT_CR 0x00000800 /* CR returns the buffer. */
237 #define TXT_DOTTERM 0x00001000 /* Leading '.' terminates the input. */
238 #define TXT_EMARK 0x00002000 /* End of replacement mark. */
239 #define TXT_EOFCHAR 0x00004000 /* ICANON set, return EOF character. */
240 #define TXT_ESCAPE 0x00008000 /* Escape returns the buffer. */
241 #define TXT_FILEC 0x00010000 /* Option: filec. */
242 #define TXT_INFOLINE 0x00020000 /* Editing the info line. */
243 #define TXT_MAPINPUT 0x00040000 /* Apply the input map. */
244 #define TXT_NLECHO 0x00080000 /* Echo the newline. */
245 #define TXT_NUMBER 0x00100000 /* Number the line. */
246 #define TXT_OVERWRITE 0x00200000 /* Overwrite characters. */
247 #define TXT_PROMPT 0x00400000 /* Display a prompt. */
248 #define TXT_RECORD 0x00800000 /* Record for replay. */
249 #define TXT_REPLACE 0x01000000 /* Replace; don't delete overwrite. */
250 #define TXT_REPLAY 0x02000000 /* Replay the last input. */
251 #define TXT_RESOLVE 0x04000000 /* Resolve the text into the file. */
252 #define TXT_SEARCHINCR 0x08000000 /* Incremental search. */
253 #define TXT_SHOWMATCH 0x10000000 /* Option: showmatch. */
254 #define TXT_TTYWERASE 0x20000000 /* Option: ttywerase. */
255 #define TXT_WRAPMARGIN 0x40000000 /* Option: wrapmargin. */