Annotation of src/usr.bin/tmux/mode-key.c, Revision 1.7
1.7 ! nicm 1: /* $OpenBSD: mode-key.c,v 1.6 2009/07/27 12:11:11 nicm Exp $ */
1.1 nicm 2:
3: /*
4: * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15: * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18:
19: #include <sys/types.h>
20:
21: #include "tmux.h"
22:
23: enum mode_key_cmd mode_key_lookup_vi(struct mode_key_data *, int);
24: enum mode_key_cmd mode_key_lookup_emacs(struct mode_key_data *, int);
25:
26: void
27: mode_key_init(struct mode_key_data *mdata, int type, int flags)
28: {
29: mdata->type = type;
30:
31: if (flags & MODEKEY_CANEDIT)
32: flags |= MODEKEY_EDITMODE;
33: mdata->flags = flags;
34: }
35:
36: enum mode_key_cmd
37: mode_key_lookup(struct mode_key_data *mdata, int key)
38: {
39: switch (mdata->type) {
40: case MODEKEY_VI:
41: return (mode_key_lookup_vi(mdata, key));
42: case MODEKEY_EMACS:
43: return (mode_key_lookup_emacs(mdata, key));
44: default:
45: fatalx("unknown mode key type");
46: }
47: }
48:
49: enum mode_key_cmd
50: mode_key_lookup_vi(struct mode_key_data *mdata, int key)
51: {
1.3 nicm 52: if (key & KEYC_ESCAPE) {
53: key &= ~KEYC_ESCAPE;
1.1 nicm 54: if (mdata->flags & MODEKEY_CANEDIT)
55: mdata->flags ^= MODEKEY_EDITMODE;
56: }
57:
58:
59: if (mdata->flags & MODEKEY_EDITMODE) {
60: switch (key) {
61: case '\003':
62: return (MODEKEYCMD_QUIT);
63: case '\033':
64: if (mdata->flags & MODEKEY_CANEDIT)
65: mdata->flags &= ~MODEKEY_EDITMODE;
66: return (MODEKEYCMD_NONE);
67: case '\010':
1.5 nicm 68: case KEYC_BSPACE:
1.1 nicm 69: return (MODEKEYCMD_BACKSPACE);
70: case '\011':
71: return (MODEKEYCMD_COMPLETE);
72: case KEYC_DC:
73: return (MODEKEYCMD_DELETE);
74: case '\r':
75: return (MODEKEYCMD_CHOOSE);
76: }
77: return (MODEKEYCMD_OTHERKEY);
78: }
79:
80: switch (key) {
81: case '\010':
1.5 nicm 82: case KEYC_BSPACE:
1.1 nicm 83: return (MODEKEYCMD_LEFT);
84: case KEYC_DC:
85: return (MODEKEYCMD_DELETE);
86: case '\011':
87: return (MODEKEYCMD_COMPLETE);
88: case 'i':
89: if (mdata->flags & MODEKEY_CANEDIT)
90: mdata->flags |= MODEKEY_EDITMODE;
91: break;
92: case 'a':
93: if (mdata->flags & MODEKEY_CANEDIT) {
94: mdata->flags |= MODEKEY_EDITMODE;
95: return (MODEKEYCMD_RIGHT);
96: }
97: break;
98: case '\r':
99: if (mdata->flags & (MODEKEY_CANEDIT|MODEKEY_CHOOSEMODE))
100: return (MODEKEYCMD_CHOOSE);
101: return (MODEKEYCMD_COPYSELECTION);
102: case '0':
1.2 nicm 103: return (MODEKEYCMD_STARTOFLINE);
1.1 nicm 104: case '^':
1.2 nicm 105: return (MODEKEYCMD_BACKTOINDENTATION);
1.1 nicm 106: case '\033':
107: return (MODEKEYCMD_CLEARSELECTION);
1.6 nicm 108: case 'C':
109: if (mdata->flags & MODEKEY_CANEDIT)
110: mdata->flags |= MODEKEY_EDITMODE;
111: return (MODEKEYCMD_DELETETOENDOFLINE);
112: case 'D':
113: return (MODEKEYCMD_DELETETOENDOFLINE);
1.1 nicm 114: case 'j':
115: case KEYC_DOWN:
116: return (MODEKEYCMD_DOWN);
117: case '$':
118: return (MODEKEYCMD_ENDOFLINE);
119: case 'h':
120: case KEYC_LEFT:
121: return (MODEKEYCMD_LEFT);
122: case '\006':
123: case KEYC_NPAGE:
124: return (MODEKEYCMD_NEXTPAGE);
125: case 'w':
126: return (MODEKEYCMD_NEXTWORD);
127: case '\025':
128: case KEYC_PPAGE:
129: return (MODEKEYCMD_PREVIOUSPAGE);
130: case 'b':
131: return (MODEKEYCMD_PREVIOUSWORD);
132: case 'q':
133: case '\003':
134: return (MODEKEYCMD_QUIT);
135: case 'l':
136: case KEYC_RIGHT:
137: return (MODEKEYCMD_RIGHT);
138: case ' ':
139: return (MODEKEYCMD_STARTSELECTION);
140: case 'k':
141: case KEYC_UP:
142: return (MODEKEYCMD_UP);
143: case 'p':
144: return (MODEKEYCMD_PASTE);
145: }
146:
147: return (MODEKEYCMD_NONE);
148: }
149:
150: enum mode_key_cmd
151: mode_key_lookup_emacs(struct mode_key_data *mdata, int key)
152: {
153: switch (key) {
154: case '\010':
1.5 nicm 155: case KEYC_BSPACE:
1.1 nicm 156: return (MODEKEYCMD_BACKSPACE);
1.4 nicm 157: case '\004':
1.1 nicm 158: case KEYC_DC:
159: return (MODEKEYCMD_DELETE);
160: case '\011':
161: return (MODEKEYCMD_COMPLETE);
162: case '\r':
163: return (MODEKEYCMD_CHOOSE);
164: case '\001':
165: return (MODEKEYCMD_STARTOFLINE);
1.3 nicm 166: case 'm' | KEYC_ESCAPE:
1.2 nicm 167: return (MODEKEYCMD_BACKTOINDENTATION);
1.1 nicm 168: case '\007':
169: return (MODEKEYCMD_CLEARSELECTION);
170: case '\027':
1.3 nicm 171: case 'w' | KEYC_ESCAPE:
1.1 nicm 172: return (MODEKEYCMD_COPYSELECTION);
1.6 nicm 173: case '\013':
174: return (MODEKEYCMD_DELETETOENDOFLINE);
1.1 nicm 175: case '\016':
176: case KEYC_DOWN:
177: return (MODEKEYCMD_DOWN);
178: case '\005':
179: return (MODEKEYCMD_ENDOFLINE);
180: case '\002':
181: case KEYC_LEFT:
182: return (MODEKEYCMD_LEFT);
183: case ' ':
184: if (mdata->flags & MODEKEY_CANEDIT)
185: break;
186: /* FALLTHROUGH */
187: case '\026':
188: case KEYC_NPAGE:
189: return (MODEKEYCMD_NEXTPAGE);
1.3 nicm 190: case 'f' | KEYC_ESCAPE:
1.1 nicm 191: return (MODEKEYCMD_NEXTWORD);
192: case '\031':
193: return (MODEKEYCMD_PASTE);
1.3 nicm 194: case 'v' | KEYC_ESCAPE:
1.1 nicm 195: case KEYC_PPAGE:
196: return (MODEKEYCMD_PREVIOUSPAGE);
1.3 nicm 197: case 'b' | KEYC_ESCAPE:
1.1 nicm 198: return (MODEKEYCMD_PREVIOUSWORD);
199: case '\006':
200: case KEYC_RIGHT:
201: return (MODEKEYCMD_RIGHT);
202: case '\000':
203: return (MODEKEYCMD_STARTSELECTION);
204: case '\020':
205: case KEYC_UP:
206: return (MODEKEYCMD_UP);
207: case 'q':
208: if (mdata->flags & MODEKEY_CANEDIT)
209: break;
210: /* FALLTHROUGH */
211: case '\003':
212: case '\033':
213: return (MODEKEYCMD_QUIT);
214: }
215:
216: return (MODEKEYCMD_OTHERKEY);
217: }