Skip to content

Commit 76d6d36

Browse files
author
nicm
committed
Fundamental change to how copy mode key bindings work:
The vi-copy and emacs-copy mode key tables are gone, and instead copy mode commands are bound in one of two normal key tables ("copy-mode" or "copy-mode-vi"). Keys are bound to "send-keys -X copy-mode-command". So: bind -temacs-copy C-Up scroll-up bind -temacs-copy -R5 WheelUpPane scroll-up Becomes: bind -Tcopy-mode C-Up send -X scroll-up bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up This allows the full command parser and command set to be used - for example, we can use the normal command prompt for searching, jumping, and so on instead of a custom one: bind -Tcopy-mode C-r command-prompt -p'search up' "send -X search-backward '%%'" command-prompt also gets a -1 option to only require on key press, which is needed for jumping. The plan is to get rid of mode keys entirely, so more to come eventually.
1 parent 8b804fb commit 76d6d36

File tree

14 files changed

+806
-1190
lines changed

14 files changed

+806
-1190
lines changed

cmd-bind-key.c

Lines changed: 6 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ const struct cmd_entry cmd_bind_key_entry = {
3636
.name = "bind-key",
3737
.alias = "bind",
3838

39-
.args = { "cnrR:t:T:", 1, -1 },
40-
.usage = "[-cnr] [-t mode-table] [-R repeat-count] [-T key-table] key "
39+
.args = { "cnrt:T:", 1, -1 },
40+
.usage = "[-cnr] [-t mode-table] [-T key-table] key "
4141
"command [arguments]",
4242

4343
.flags = 0,
@@ -97,12 +97,10 @@ static enum cmd_retval
9797
cmd_bind_key_mode_table(struct cmd *self, struct cmd_q *cmdq, key_code key)
9898
{
9999
struct args *args = self->args;
100-
const char *tablename, *arg;
100+
const char *tablename;
101101
const struct mode_key_table *mtab;
102102
struct mode_key_binding *mbind, mtmp;
103103
enum mode_key_cmd cmd;
104-
char *cause;
105-
u_int repeat;
106104

107105
tablename = args_get(args, 't');
108106
if ((mtab = mode_key_findtable(tablename)) == NULL) {
@@ -116,44 +114,9 @@ cmd_bind_key_mode_table(struct cmd *self, struct cmd_q *cmdq, key_code key)
116114
return (CMD_RETURN_ERROR);
117115
}
118116

119-
switch (cmd) {
120-
case MODEKEYCOPY_APPENDSELECTION:
121-
case MODEKEYCOPY_COPYSELECTION:
122-
case MODEKEYCOPY_STARTNAMEDBUFFER:
123-
if (args->argc == 2)
124-
arg = NULL;
125-
else {
126-
arg = args->argv[2];
127-
if (strcmp(arg, "-x") != 0) {
128-
cmdq_error(cmdq, "unknown argument");
129-
return (CMD_RETURN_ERROR);
130-
}
131-
}
132-
break;
133-
case MODEKEYCOPY_COPYPIPE:
134-
if (args->argc != 3) {
135-
cmdq_error(cmdq, "no argument given");
136-
return (CMD_RETURN_ERROR);
137-
}
138-
arg = args->argv[2];
139-
break;
140-
default:
141-
if (args->argc != 2) {
142-
cmdq_error(cmdq, "no argument allowed");
143-
return (CMD_RETURN_ERROR);
144-
}
145-
arg = NULL;
146-
break;
147-
}
148-
149-
repeat = 1;
150-
if (args_has(args, 'R')) {
151-
repeat = args_strtonum(args, 'R', 1, SHRT_MAX, &cause);
152-
if (cause != NULL) {
153-
cmdq_error(cmdq, "repeat count %s", cause);
154-
free(cause);
155-
return (CMD_RETURN_ERROR);
156-
}
117+
if (args->argc != 2) {
118+
cmdq_error(cmdq, "no argument allowed");
119+
return (CMD_RETURN_ERROR);
157120
}
158121

159122
mtmp.key = key;
@@ -164,8 +127,6 @@ cmd_bind_key_mode_table(struct cmd *self, struct cmd_q *cmdq, key_code key)
164127
mbind->mode = mtmp.mode;
165128
RB_INSERT(mode_key_tree, mtab->tree, mbind);
166129
}
167-
mbind->repeat = repeat;
168130
mbind->cmd = cmd;
169-
mbind->arg = arg != NULL ? xstrdup(arg) : NULL;
170131
return (CMD_RETURN_NORMAL);
171132
}

cmd-command-prompt.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ const struct cmd_entry cmd_command_prompt_entry = {
3838
.name = "command-prompt",
3939
.alias = NULL,
4040

41-
.args = { "I:p:t:", 0, 1 },
42-
.usage = "[-I inputs] [-p prompts] " CMD_TARGET_CLIENT_USAGE " "
41+
.args = { "1I:p:t:", 0, 1 },
42+
.usage = "[-1] [-I inputs] [-p prompts] " CMD_TARGET_CLIENT_USAGE " "
4343
"[template]",
4444

4545
.tflag = CMD_CLIENT,
@@ -67,6 +67,7 @@ cmd_command_prompt_exec(struct cmd *self, struct cmd_q *cmdq)
6767
struct client *c = cmdq->state.c;
6868
char *prompt, *ptr, *input = NULL;
6969
size_t n;
70+
int flags;
7071

7172
if (c->prompt_string != NULL)
7273
return (CMD_RETURN_NORMAL);
@@ -108,8 +109,11 @@ cmd_command_prompt_exec(struct cmd *self, struct cmd_q *cmdq)
108109
input = strsep(&cdata->next_input, ",");
109110
}
110111

112+
flags = 0;
113+
if (args_has(args, '1'))
114+
flags |= PROMPT_SINGLE;
111115
status_prompt_set(c, prompt, input, cmd_command_prompt_callback,
112-
cmd_command_prompt_free, cdata, 0);
116+
cmd_command_prompt_free, cdata, flags);
113117
free(prompt);
114118

115119
return (CMD_RETURN_NORMAL);

cmd-list-keys.c

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -138,16 +138,15 @@ cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
138138
const char *tablename, *key, *cmdstr, *mode;
139139
const struct mode_key_table *mtab;
140140
struct mode_key_binding *mbind;
141-
char repeat[16];
142-
int width, keywidth, repeatwidth, any_mode;
141+
int width, keywidth, any_mode;
143142

144143
tablename = args_get(args, 't');
145144
if ((mtab = mode_key_findtable(tablename)) == NULL) {
146145
cmdq_error(cmdq, "unknown key table: %s", tablename);
147146
return (CMD_RETURN_ERROR);
148147
}
149148

150-
keywidth = repeatwidth = 0;
149+
keywidth = 0;
151150
any_mode = 0;
152151
RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
153152
key = key_string_lookup_key(mbind->key);
@@ -158,13 +157,6 @@ cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
158157
width = strlen(key);
159158
if (width > keywidth)
160159
keywidth = width;
161-
162-
if (mbind->repeat != 1) {
163-
snprintf(repeat, sizeof repeat, "%u", mbind->repeat);
164-
width = strlen(repeat);
165-
if (width > repeatwidth)
166-
repeatwidth = width;
167-
}
168160
}
169161

170162
RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
@@ -173,20 +165,12 @@ cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
173165
mode = "";
174166
if (mbind->mode != 0)
175167
mode = "c";
176-
snprintf(repeat, sizeof repeat, "%u", mbind->repeat);
177168
cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd);
178169
if (cmdstr != NULL) {
179-
cmdq_print(cmdq,
180-
"bind-key -%st %s%s%s%*s %*s %s%s%s%s",
170+
cmdq_print(cmdq, "bind-key -%st %s%s %*s %s",
181171
mode, any_mode && *mode == '\0' ? " " : "",
182172
mtab->name,
183-
mbind->repeat != 1 ? " -R " :
184-
(repeatwidth == 0 ? "" : " "),
185-
repeatwidth, mbind->repeat != 1 ? repeat : "",
186-
(int)keywidth, key, cmdstr,
187-
mbind->arg != NULL ? " \"" : "",
188-
mbind->arg != NULL ? mbind->arg : "",
189-
mbind->arg != NULL ? "\"": "");
173+
(int)keywidth, key, cmdstr);
190174
}
191175
}
192176

cmd-send-keys.c

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ const struct cmd_entry cmd_send_keys_entry = {
3333
.name = "send-keys",
3434
.alias = "send",
3535

36-
.args = { "lRMt:", 0, -1 },
37-
.usage = "[-lRM] " CMD_TARGET_PANE_USAGE " key ...",
36+
.args = { "lXRMN:t:", 0, -1 },
37+
.usage = "[-lXRM] [-N repeat-count] " CMD_TARGET_PANE_USAGE " key ...",
3838

3939
.tflag = CMD_PANE,
4040

@@ -59,12 +59,44 @@ static enum cmd_retval
5959
cmd_send_keys_exec(struct cmd *self, struct cmd_q *cmdq)
6060
{
6161
struct args *args = self->args;
62+
struct client *c = cmdq->state.c;
6263
struct window_pane *wp = cmdq->state.tflag.wp;
6364
struct session *s = cmdq->state.tflag.s;
6465
struct mouse_event *m = &cmdq->item->mouse;
6566
const u_char *keystr;
6667
int i, literal;
6768
key_code key;
69+
u_int np;
70+
char *cause = NULL;
71+
72+
if (args_has(args, 'N')) {
73+
if (wp->mode == NULL || wp->mode->command == NULL) {
74+
cmdq_error(cmdq, "not in a mode");
75+
return (CMD_RETURN_ERROR);
76+
}
77+
np = args_strtonum(args, 'N', 1, UINT_MAX, &cause);
78+
if (cause != NULL) {
79+
cmdq_error(cmdq, "prefix %s", cause);
80+
free(cause);
81+
return (CMD_RETURN_ERROR);
82+
}
83+
wp->modeprefix = np;
84+
}
85+
86+
if (args_has(args, 'X')) {
87+
if (wp->mode == NULL || wp->mode->command == NULL) {
88+
cmdq_error(cmdq, "not in a mode");
89+
return (CMD_RETURN_ERROR);
90+
}
91+
if (!m->valid)
92+
wp->mode->command(wp, c, s, args, NULL);
93+
else
94+
wp->mode->command(wp, c, s, args, m);
95+
return (CMD_RETURN_NORMAL);
96+
}
97+
98+
if (args_has(args, 'N')) /* only with -X */
99+
return (CMD_RETURN_NORMAL);
68100

69101
if (args_has(args, 'M')) {
70102
wp = cmd_mouse_pane(m, &s, NULL);

key-bindings.c

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,142 @@ key_bindings_init(void)
232232
"bind -n MouseDrag1Pane if -Ft= '#{mouse_any_flag}' 'if -Ft= \"#{pane_in_mode}\" \"copy-mode -M\" \"send-keys -M\"' 'copy-mode -M'",
233233
"bind -n MouseDown3Pane if-shell -Ft= '#{mouse_any_flag}' 'select-pane -t=; send-keys -M' 'select-pane -mt='",
234234
"bind -n WheelUpPane if-shell -Ft= '#{mouse_any_flag}' 'send-keys -M' 'if -Ft= \"#{pane_in_mode}\" \"send-keys -M\" \"copy-mode -et=\"'",
235+
236+
"bind -Tcopy-mode C-Space send -X begin-selection",
237+
"bind -Tcopy-mode C-a send -X start-of-line",
238+
"bind -Tcopy-mode C-c send -X cancel",
239+
"bind -Tcopy-mode C-e send -X end-of-line",
240+
"bind -Tcopy-mode C-f send -X cursor-right",
241+
"bind -Tcopy-mode C-g send -X clear-selection",
242+
"bind -Tcopy-mode C-k send -X copy-end-of-line",
243+
"bind -Tcopy-mode C-n send -X cursor-down",
244+
"bind -Tcopy-mode C-p send -X cursor-up",
245+
"bind -Tcopy-mode C-r command-prompt -p'search up' \"send -X search-backward '%%'\"",
246+
"bind -Tcopy-mode C-s command-prompt -p'search down' \"send -X search-forward '%%'\"",
247+
"bind -Tcopy-mode C-v send -X page-down",
248+
"bind -Tcopy-mode C-w send -X copy-selection-and-cancel",
249+
"bind -Tcopy-mode Escape send -X cancel",
250+
"bind -Tcopy-mode Space send -X page-down",
251+
"bind -Tcopy-mode , send -X jump-reverse",
252+
"bind -Tcopy-mode \\; send -X jump-again",
253+
"bind -Tcopy-mode F command-prompt -1p'jump backward' \"send -X jump-backward '%%'\"",
254+
"bind -Tcopy-mode N send -X search-reverse",
255+
"bind -Tcopy-mode R send -X rectangle-toggle",
256+
"bind -Tcopy-mode T command-prompt -1p'jump to backward' \"send -X jump-to-backward '%%'\"",
257+
"bind -Tcopy-mode f command-prompt -1p'jump forward' \"send -X jump-forward '%%'\"",
258+
"bind -Tcopy-mode g command-prompt -p'goto line' \"send -X goto-line '%%'\"",
259+
"bind -Tcopy-mode n send -X search-again",
260+
"bind -Tcopy-mode q send -X cancel",
261+
"bind -Tcopy-mode t command-prompt -1p'jump to forward' \"send -X jump-to-forward '%%'\"",
262+
"bind -Tcopy-mode MouseDrag1Pane send -X begin-selection",
263+
"bind -Tcopy-mode MouseDragEnd1Pane send -X copy-selection-and-cancel",
264+
"bind -Tcopy-mode WheelUpPane send -N5 -X scroll-up",
265+
"bind -Tcopy-mode WheelDownPane send -N5 -X scroll-down",
266+
"bind -Tcopy-mode NPage send -X page-down",
267+
"bind -Tcopy-mode PPage send -X page-up",
268+
"bind -Tcopy-mode Up send -X cursor-up",
269+
"bind -Tcopy-mode Down send -X cursor-down",
270+
"bind -Tcopy-mode Left send -X cursor-left",
271+
"bind -Tcopy-mode Right send -X cursor-right",
272+
"bind -Tcopy-mode M-1 command-prompt -p'repeat' -I1 \"send -N '%%'\"",
273+
"bind -Tcopy-mode M-2 command-prompt -p'repeat' -I2 \"send -N '%%'\"",
274+
"bind -Tcopy-mode M-3 command-prompt -p'repeat' -I3 \"send -N '%%'\"",
275+
"bind -Tcopy-mode M-4 command-prompt -p'repeat' -I4 \"send -N '%%'\"",
276+
"bind -Tcopy-mode M-5 command-prompt -p'repeat' -I5 \"send -N '%%'\"",
277+
"bind -Tcopy-mode M-6 command-prompt -p'repeat' -I6 \"send -N '%%'\"",
278+
"bind -Tcopy-mode M-7 command-prompt -p'repeat' -I7 \"send -N '%%'\"",
279+
"bind -Tcopy-mode M-8 command-prompt -p'repeat' -I8 \"send -N '%%'\"",
280+
"bind -Tcopy-mode M-9 command-prompt -p'repeat' -I9 \"send -N '%%'\"",
281+
"bind -Tcopy-mode M-< send -X history-top",
282+
"bind -Tcopy-mode M-> send -X history-bottom",
283+
"bind -Tcopy-mode M-R send -X top-line",
284+
"bind -Tcopy-mode M-b send -X previous-word",
285+
"bind -Tcopy-mode M-f send -X next-word-end",
286+
"bind -Tcopy-mode M-m send -X back-to-indentation",
287+
"bind -Tcopy-mode M-r send -X middle-line",
288+
"bind -Tcopy-mode M-v send -X page-up",
289+
"bind -Tcopy-mode M-w send -X copy-selection-and-cancel",
290+
"bind -Tcopy-mode M-{ send -X previous-paragraph",
291+
"bind -Tcopy-mode M-} send -X next-paragraph",
292+
"bind -Tcopy-mode M-Up send -X halfpage-up",
293+
"bind -Tcopy-mode M-Down send -X halfpage-down",
294+
"bind -Tcopy-mode C-Up send -X scroll-up",
295+
"bind -Tcopy-mode C-Down send -X scroll-down",
296+
297+
"bind -Tcopy-mode-vi C-b send -X page-up",
298+
"bind -Tcopy-mode-vi C-c send -X cancel",
299+
"bind -Tcopy-mode-vi C-d send -X halfpage-down",
300+
"bind -Tcopy-mode-vi C-e send -X scroll-down",
301+
"bind -Tcopy-mode-vi C-f send -X page-down",
302+
"bind -Tcopy-mode-vi C-h send -X cursor-left",
303+
"bind -Tcopy-mode-vi C-j send -X copy-selection-and-cancel",
304+
"bind -Tcopy-mode-vi Enter send -X copy-selection-and-cancel",
305+
"bind -Tcopy-mode-vi C-u send -X halfpage-up",
306+
"bind -Tcopy-mode-vi C-v send -X rectangle-toggle",
307+
"bind -Tcopy-mode-vi C-y send -X scroll-up",
308+
"bind -Tcopy-mode-vi Escape send -X clear-selection",
309+
"bind -Tcopy-mode-vi Space send -X begin-selection",
310+
"bind -Tcopy-mode-vi '$' send -X end-of-line",
311+
"bind -Tcopy-mode-vi , send -X jump-reverse",
312+
"bind -Tcopy-mode-vi / command-prompt -p'search down' \"send -X search-forward '%%'\"",
313+
"bind -Tcopy-mode-vi 0 send -X start-of-line",
314+
"bind -Tcopy-mode-vi 1 command-prompt -p'repeat' -I1 \"send -N '%%'\"",
315+
"bind -Tcopy-mode-vi 2 command-prompt -p'repeat' -I2 \"send -N '%%'\"",
316+
"bind -Tcopy-mode-vi 3 command-prompt -p'repeat' -I3 \"send -N '%%'\"",
317+
"bind -Tcopy-mode-vi 4 command-prompt -p'repeat' -I4 \"send -N '%%'\"",
318+
"bind -Tcopy-mode-vi 5 command-prompt -p'repeat' -I5 \"send -N '%%'\"",
319+
"bind -Tcopy-mode-vi 6 command-prompt -p'repeat' -I6 \"send -N '%%'\"",
320+
"bind -Tcopy-mode-vi 7 command-prompt -p'repeat' -I7 \"send -N '%%'\"",
321+
"bind -Tcopy-mode-vi 8 command-prompt -p'repeat' -I8 \"send -N '%%'\"",
322+
"bind -Tcopy-mode-vi 9 command-prompt -p'repeat' -I9 \"send -N '%%'\"",
323+
"bind -Tcopy-mode-vi : command-prompt -p'goto line' \"send -X goto-line '%%'\"",
324+
"bind -Tcopy-mode-vi \\; send -X jump-again"
325+
"bind -Tcopy-mode-vi ? command-prompt -p'search up' \"send -X search-backward '%%'\"",
326+
"bind -Tcopy-mode-vi A send -X append-selection-and-cancel",
327+
"bind -Tcopy-mode-vi B send -X previous-space",
328+
"bind -Tcopy-mode-vi D send -X copy-end-of-line",
329+
"bind -Tcopy-mode-vi E send -X next-space-end",
330+
"bind -Tcopy-mode-vi F command-prompt -1p'jump backward' \"send -X jump-backward '%%'\"",
331+
"bind -Tcopy-mode-vi G send -X history-bottom",
332+
"bind -Tcopy-mode-vi H send -X top-line",
333+
"bind -Tcopy-mode-vi J send -X scroll-down",
334+
"bind -Tcopy-mode-vi K send -X scroll-up",
335+
"bind -Tcopy-mode-vi L send -X bottom-line",
336+
"bind -Tcopy-mode-vi M send -X middle-line",
337+
"bind -Tcopy-mode-vi N send -X search-reverse",
338+
"bind -Tcopy-mode-vi T command-prompt -1p'jump to backward' \"send -X jump-to-backward '%%'\"",
339+
"bind -Tcopy-mode-vi V send -X select-line",
340+
"bind -Tcopy-mode-vi W send -X next-space",
341+
"bind -Tcopy-mode-vi ^ send -X back-to-indentation",
342+
"bind -Tcopy-mode-vi b send -X previous-word",
343+
"bind -Tcopy-mode-vi e send -X next-word-end",
344+
"bind -Tcopy-mode-vi f command-prompt -1p'jump forward' \"send -X jump-forward '%%'\"",
345+
"bind -Tcopy-mode-vi g send -X history-top",
346+
"bind -Tcopy-mode-vi h send -X cursor-left",
347+
"bind -Tcopy-mode-vi j send -X cursor-down",
348+
"bind -Tcopy-mode-vi k send -X cursor-up",
349+
"bind -Tcopy-mode-vi l send -X cursor-right",
350+
"bind -Tcopy-mode-vi n send -X search-again",
351+
"bind -Tcopy-mode-vi o send -X other-end",
352+
"bind -Tcopy-mode-vi q send -X cancel",
353+
"bind -Tcopy-mode-vi t command-prompt -1p'jump to forward' \"send -X jump-to-forward '%%'\"",
354+
"bind -Tcopy-mode-vi v send -X rectangle-toggle",
355+
"bind -Tcopy-mode-vi w send -X next-word",
356+
"bind -Tcopy-mode-vi { send -X previous-paragraph",
357+
"bind -Tcopy-mode-vi } send -X next-paragraph",
358+
"bind -Tcopy-mode-vi MouseDrag1Pane send -X begin-selection",
359+
"bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-selection-and-cancel",
360+
"bind -Tcopy-mode-vi WheelUpPane send -N5 -X scroll-up",
361+
"bind -Tcopy-mode-vi WheelDownPane send -N5 -X scroll-down",
362+
"bind -Tcopy-mode-vi BSpace send -X cursor-left",
363+
"bind -Tcopy-mode-vi NPage send -X page-down",
364+
"bind -Tcopy-mode-vi PPage send -X page-up",
365+
"bind -Tcopy-mode-vi Up send -X cursor-up",
366+
"bind -Tcopy-mode-vi Down send -X cursor-down",
367+
"bind -Tcopy-mode-vi Left send -X cursor-left",
368+
"bind -Tcopy-mode-vi Right send -X cursor-right",
369+
"bind -Tcopy-mode-vi C-Up send -X scroll-up",
370+
"bind -Tcopy-mode-vi C-Down send -X scroll-down",
235371
};
236372
u_int i;
237373
struct cmd_list *cmdlist;

0 commit comments

Comments
 (0)