Annotation of src/usr.bin/tmux/mode-key.c, Revision 1.9
1.9 ! nicm 1: /* $OpenBSD: mode-key.c,v 1.8 2009/07/27 19:29:35 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:
1.8 nicm 23: /* vi editing keys. */
24: const struct mode_key_entry mode_key_vi_edit[] = {
25: { '\003' /* C-c */, 0, MODEKEYEDIT_CANCEL },
26: { '\010' /* C-h */, 0, MODEKEYEDIT_BACKSPACE },
27: { '\011' /* Tab */, 0, MODEKEYEDIT_COMPLETE },
28: { '\033' /* Escape */, 0, MODEKEYEDIT_SWITCHMODE },
29: { '\r', 0, MODEKEYEDIT_ENTER },
30: { KEYC_BSPACE, 0, MODEKEYEDIT_BACKSPACE },
31: { KEYC_DC, 0, MODEKEYEDIT_DELETE },
32:
33: { '$', 1, MODEKEYEDIT_ENDOFLINE },
34: { '0', 1, MODEKEYEDIT_STARTOFLINE },
35: { 'D', 1, MODEKEYEDIT_DELETETOENDOFLINE },
36: { '\003' /* C-c */, 1, MODEKEYEDIT_CANCEL },
37: { '\010' /* C-h */, 1, MODEKEYEDIT_BACKSPACE },
38: { '\r', 1, MODEKEYEDIT_ENTER },
39: { '^', 1, MODEKEYEDIT_STARTOFLINE },
40: { 'a', 1, MODEKEYEDIT_SWITCHMODEAPPEND },
41: { 'h', 1, MODEKEYEDIT_CURSORLEFT },
42: { 'i', 1, MODEKEYEDIT_SWITCHMODE },
43: { 'j', 1, MODEKEYEDIT_HISTORYDOWN },
44: { 'k', 1, MODEKEYEDIT_HISTORYUP },
45: { 'l', 1, MODEKEYEDIT_CURSORRIGHT },
46: { 'p', 1, MODEKEYEDIT_PASTE },
47: { KEYC_BSPACE, 1, MODEKEYEDIT_BACKSPACE },
48: { KEYC_DC, 1, MODEKEYEDIT_DELETE },
49: { KEYC_DOWN, 1, MODEKEYEDIT_HISTORYDOWN },
50: { KEYC_LEFT, 1, MODEKEYEDIT_CURSORLEFT },
51: { KEYC_RIGHT, 1, MODEKEYEDIT_CURSORRIGHT },
52: { KEYC_UP, 1, MODEKEYEDIT_HISTORYUP },
53:
54: { 0, -1, 0 }
55: };
56:
57: /* vi choice selection keys. */
58: const struct mode_key_entry mode_key_vi_choice[] = {
59: { '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL },
60: { '\r', 0, MODEKEYCHOICE_CHOOSE },
61: { 'j', 0, MODEKEYCHOICE_DOWN },
62: { 'k', 0, MODEKEYCHOICE_UP },
63: { 'q', 0, MODEKEYCHOICE_CANCEL },
64: { KEYC_DOWN, 0, MODEKEYCHOICE_DOWN },
65: { KEYC_NPAGE, 0, MODEKEYCHOICE_PAGEDOWN },
66: { KEYC_PPAGE, 0, MODEKEYCHOICE_PAGEUP },
67: { KEYC_UP, 0, MODEKEYCHOICE_UP },
68:
69: { 0, -1, 0 }
70: };
71:
72: /* vi copy mode keys. */
73: const struct mode_key_entry mode_key_vi_copy[] = {
74: { ' ', 0, MODEKEYCOPY_STARTSELECTION },
75: { '$', 0, MODEKEYCOPY_ENDOFLINE },
76: { '0', 0, MODEKEYCOPY_STARTOFLINE },
1.9 ! nicm 77: { '\003' /* C-c */, 0, MODEKEYCOPY_CANCEL },
1.8 nicm 78: { '\006' /* C-f */, 0, MODEKEYCOPY_NEXTPAGE },
79: { '\010' /* C-h */, 0, MODEKEYCOPY_LEFT },
80: { '\025' /* C-u */, 0, MODEKEYCOPY_PREVIOUSPAGE },
81: { '\033' /* Escape */, 0, MODEKEYCOPY_CLEARSELECTION },
82: { '\r', 0, MODEKEYCOPY_COPYSELECTION },
83: { '^', 0, MODEKEYCOPY_BACKTOINDENTATION },
84: { 'b', 0, MODEKEYCOPY_PREVIOUSWORD },
85: { 'h', 0, MODEKEYCOPY_LEFT },
86: { 'j', 0, MODEKEYCOPY_DOWN },
87: { 'k', 0, MODEKEYCOPY_UP },
88: { 'l', 0, MODEKEYCOPY_RIGHT },
1.9 ! nicm 89: { 'q', 0, MODEKEYCOPY_CANCEL },
1.8 nicm 90: { 'w', 0, MODEKEYCOPY_NEXTWORD },
91: { KEYC_BSPACE, 0, MODEKEYCOPY_LEFT },
92: { KEYC_DOWN, 0, MODEKEYCOPY_DOWN },
93: { KEYC_LEFT, 0, MODEKEYCOPY_LEFT },
94: { KEYC_NPAGE, 0, MODEKEYCOPY_NEXTPAGE },
95: { KEYC_PPAGE, 0, MODEKEYCOPY_PREVIOUSPAGE },
96: { KEYC_RIGHT, 0, MODEKEYCOPY_RIGHT },
97: { KEYC_UP, 0, MODEKEYCOPY_UP },
98:
99: { 0, -1, 0 }
100: };
101:
102: /* emacs editing keys. */
103: const struct mode_key_entry mode_key_emacs_edit[] = {
104: { '\001' /* C-a */, 0, MODEKEYEDIT_STARTOFLINE },
105: { '\002' /* C-p */, 0, MODEKEYEDIT_CURSORLEFT },
106: { '\004' /* C-d */, 0, MODEKEYEDIT_DELETE },
107: { '\005' /* C-e */, 0, MODEKEYEDIT_ENDOFLINE },
108: { '\006' /* C-f */, 0, MODEKEYEDIT_CURSORRIGHT },
109: { '\010' /* C-H */, 0, MODEKEYEDIT_BACKSPACE },
110: { '\011' /* Tab */, 0, MODEKEYEDIT_COMPLETE },
111: { '\013' /* C-k */, 0, MODEKEYEDIT_DELETETOENDOFLINE },
112: { '\016' /* C-n */, 0, MODEKEYEDIT_HISTORYDOWN },
113: { '\020' /* C-p */, 0, MODEKEYEDIT_HISTORYUP },
114: { '\031' /* C-y */, 0, MODEKEYEDIT_PASTE },
115: { '\r', 0, MODEKEYEDIT_ENTER },
116: { 'm' | KEYC_ESCAPE, 0, MODEKEYEDIT_STARTOFLINE },
117: { KEYC_BSPACE, 0, MODEKEYEDIT_BACKSPACE },
118: { KEYC_DC, 0, MODEKEYEDIT_DELETE },
119: { KEYC_DOWN, 0, MODEKEYEDIT_HISTORYDOWN },
120: { KEYC_LEFT, 0, MODEKEYEDIT_CURSORLEFT },
121: { KEYC_RIGHT, 0, MODEKEYEDIT_CURSORRIGHT },
122: { KEYC_UP, 0, MODEKEYEDIT_HISTORYUP },
123:
124: { 0, -1, 0 }
125: };
126:
127: /* emacs choice selection keys. */
128: const struct mode_key_entry mode_key_emacs_choice[] = {
129: { '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL },
130: { '\033' /* Escape */, 0, MODEKEYCHOICE_CANCEL },
131: { '\r', 0, MODEKEYCHOICE_CHOOSE },
132: { 'q', 0, MODEKEYCHOICE_CANCEL },
133: { KEYC_DOWN, 0, MODEKEYCHOICE_DOWN },
134: { KEYC_NPAGE, 0, MODEKEYCHOICE_PAGEDOWN },
135: { KEYC_PPAGE, 0, MODEKEYCHOICE_PAGEUP },
136: { KEYC_UP, 0, MODEKEYCHOICE_UP },
137:
138: { 0, -1, 0 }
139: };
140:
141: /* emacs copy mode keys. */
142: const struct mode_key_entry mode_key_emacs_copy[] = {
143: { ' ', 0, MODEKEYCOPY_NEXTPAGE },
144: { '\000' /* C-Space */, 0, MODEKEYCOPY_STARTSELECTION },
145: { '\001' /* C-a */, 0, MODEKEYCOPY_STARTOFLINE },
146: { '\002' /* C-b */, 0, MODEKEYCOPY_LEFT },
1.9 ! nicm 147: { '\003' /* C-c */, 0, MODEKEYCOPY_CANCEL },
1.8 nicm 148: { '\005' /* C-e */, 0, MODEKEYCOPY_ENDOFLINE },
149: { '\006' /* C-f */, 0, MODEKEYCOPY_RIGHT },
150: { '\007' /* C-g */, 0, MODEKEYCOPY_CLEARSELECTION },
151: { '\016' /* C-n */, 0, MODEKEYCOPY_DOWN },
152: { '\020' /* C-p */, 0, MODEKEYCOPY_UP },
153: { '\026' /* C-v */, 0, MODEKEYCOPY_NEXTPAGE },
154: { '\027' /* C-w */, 0, MODEKEYCOPY_COPYSELECTION },
1.9 ! nicm 155: { '\033' /* Escape */, 0, MODEKEYCOPY_CANCEL },
1.8 nicm 156: { 'b' | KEYC_ESCAPE, 0, MODEKEYCOPY_PREVIOUSWORD },
157: { 'f' | KEYC_ESCAPE, 0, MODEKEYCOPY_NEXTWORD },
158: { 'm' | KEYC_ESCAPE, 0, MODEKEYCOPY_BACKTOINDENTATION },
1.9 ! nicm 159: { 'q', 0, MODEKEYCOPY_CANCEL },
1.8 nicm 160: { 'v' | KEYC_ESCAPE, 0, MODEKEYCOPY_PREVIOUSPAGE },
161: { 'w' | KEYC_ESCAPE, 0, MODEKEYCOPY_COPYSELECTION },
162: { KEYC_DOWN, 0, MODEKEYCOPY_DOWN },
163: { KEYC_LEFT, 0, MODEKEYCOPY_LEFT },
164: { KEYC_NPAGE, 0, MODEKEYCOPY_NEXTPAGE },
165: { KEYC_PPAGE, 0, MODEKEYCOPY_PREVIOUSPAGE },
166: { KEYC_RIGHT, 0, MODEKEYCOPY_RIGHT },
167: { KEYC_UP, 0, MODEKEYCOPY_UP },
168:
169: { 0, -1, 0 }
170: };
1.1 nicm 171:
172: void
1.8 nicm 173: mode_key_init(struct mode_key_data *mdata, const struct mode_key_entry *table)
1.1 nicm 174: {
1.8 nicm 175: mdata->table = table;
176: mdata->mode = 0;
1.1 nicm 177: }
178:
179: enum mode_key_cmd
180: mode_key_lookup(struct mode_key_data *mdata, int key)
181: {
1.8 nicm 182: const struct mode_key_entry *ment;
183: int mode;
1.1 nicm 184:
1.8 nicm 185: mode = mdata->mode;
186: for (ment = mdata->table; ment->mode != -1; ment++) {
187: if (ment->mode == mode && key == ment->key) {
188: switch (ment->cmd) {
189: case MODEKEYEDIT_SWITCHMODE:
190: case MODEKEYEDIT_SWITCHMODEAPPEND:
191: mdata->mode = 1 - mdata->mode;
192: /* FALLTHROUGH */
193: default:
194: return (ment->cmd);
195: }
1.1 nicm 196: }
197: }
1.8 nicm 198: if (mode != 0)
199: return (MODEKEY_NONE);
200: return (MODEKEY_OTHER);
1.1 nicm 201: }