Annotation of src/usr.bin/tmux/mode-key.c, Revision 1.8
1.8 ! nicm 1: /* $OpenBSD: mode-key.c,v 1.7 2009/07/27 18:51:46 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 },
! 77: { '\003' /* C-c */, 0, MODEKEYCOPY_QUIT },
! 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 },
! 89: { 'q', 0, MODEKEYCOPY_QUIT },
! 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 },
! 147: { '\003' /* C-c */, 0, MODEKEYCOPY_QUIT },
! 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 },
! 155: { '\033' /* Escape */, 0, MODEKEYCOPY_QUIT },
! 156: { 'b' | KEYC_ESCAPE, 0, MODEKEYCOPY_PREVIOUSWORD },
! 157: { 'f' | KEYC_ESCAPE, 0, MODEKEYCOPY_NEXTWORD },
! 158: { 'm' | KEYC_ESCAPE, 0, MODEKEYCOPY_BACKTOINDENTATION },
! 159: { 'q', 0, MODEKEYCOPY_QUIT },
! 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: }