First period not last for host_short, from Michael Scholz.
[tmux-openbsd.git] / options-table.c
blob22913854605f0705277ebb5bfc946ede7bd14159
1 /* $OpenBSD$ */
3 /*
4 * Copyright (c) 2011 Nicholas Marriott <nicm@users.sourceforge.net>
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.
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.
19 #include <sys/types.h>
21 #include <string.h>
22 #include <paths.h>
24 #include "tmux.h"
27 * This file has a tables with all the server, session and window
28 * options. These tables are the master copy of the options with their real
29 * (user-visible) types, range limits and default values. At start these are
30 * copied into the runtime global options trees (which only has number and
31 * string types). These tables are then used to loop up the real type when
32 * the user sets an option or its value needs to be shown.
35 /* Choice option type lists. */
36 const char *options_table_mode_keys_list[] = {
37 "emacs", "vi", NULL
39 const char *options_table_mode_mouse_list[] = {
40 "off", "on", "copy-mode", NULL
42 const char *options_table_clock_mode_style_list[] = {
43 "12", "24", NULL
45 const char *options_table_status_keys_list[] = {
46 "emacs", "vi", NULL
48 const char *options_table_status_justify_list[] = {
49 "left", "centre", "right", NULL
51 const char *options_table_status_position_list[] = {
52 "top", "bottom", NULL
54 const char *options_table_bell_action_list[] = {
55 "none", "any", "current", NULL
58 /* Server options. */
59 const struct options_table_entry server_options_table[] = {
60 { .name = "buffer-limit",
61 .type = OPTIONS_TABLE_NUMBER,
62 .minimum = 1,
63 .maximum = INT_MAX,
64 .default_num = 20
67 { .name = "escape-time",
68 .type = OPTIONS_TABLE_NUMBER,
69 .minimum = 0,
70 .maximum = INT_MAX,
71 .default_num = 500
74 { .name = "exit-unattached",
75 .type = OPTIONS_TABLE_FLAG,
76 .default_num = 0
79 { .name = "focus-events",
80 .type = OPTIONS_TABLE_FLAG,
81 .default_num = 0
84 { .name = "quiet",
85 .type = OPTIONS_TABLE_FLAG,
86 .default_num = 0 /* overridden in main() */
89 { .name = "set-clipboard",
90 .type = OPTIONS_TABLE_FLAG,
91 .default_num = 1
94 { .name = NULL }
97 /* Session options. */
98 const struct options_table_entry session_options_table[] = {
99 { .name = "assume-paste-time",
100 .type = OPTIONS_TABLE_NUMBER,
101 .minimum = 0,
102 .maximum = INT_MAX,
103 .default_num = 1,
106 { .name = "base-index",
107 .type = OPTIONS_TABLE_NUMBER,
108 .minimum = 0,
109 .maximum = INT_MAX,
110 .default_num = 0
113 { .name = "bell-action",
114 .type = OPTIONS_TABLE_CHOICE,
115 .choices = options_table_bell_action_list,
116 .default_num = BELL_ANY
119 { .name = "bell-on-alert",
120 .type = OPTIONS_TABLE_FLAG,
121 .default_num = 0
124 { .name = "default-command",
125 .type = OPTIONS_TABLE_STRING,
126 .default_str = ""
129 { .name = "default-path",
130 .type = OPTIONS_TABLE_STRING,
131 .default_str = "~"
134 { .name = "default-shell",
135 .type = OPTIONS_TABLE_STRING,
136 .default_str = _PATH_BSHELL
139 { .name = "default-terminal",
140 .type = OPTIONS_TABLE_STRING,
141 .default_str = "screen"
144 { .name = "destroy-unattached",
145 .type = OPTIONS_TABLE_FLAG,
146 .default_num = 0
149 { .name = "detach-on-destroy",
150 .type = OPTIONS_TABLE_FLAG,
151 .default_num = 1
154 { .name = "display-panes-active-colour",
155 .type = OPTIONS_TABLE_COLOUR,
156 .default_num = 1
159 { .name = "display-panes-colour",
160 .type = OPTIONS_TABLE_COLOUR,
161 .default_num = 4
164 { .name = "display-panes-time",
165 .type = OPTIONS_TABLE_NUMBER,
166 .minimum = 1,
167 .maximum = INT_MAX,
168 .default_num = 1000
171 { .name = "display-time",
172 .type = OPTIONS_TABLE_NUMBER,
173 .minimum = 1,
174 .maximum = INT_MAX,
175 .default_num = 750
178 { .name = "history-limit",
179 .type = OPTIONS_TABLE_NUMBER,
180 .minimum = 0,
181 .maximum = INT_MAX,
182 .default_num = 2000
185 { .name = "lock-after-time",
186 .type = OPTIONS_TABLE_NUMBER,
187 .minimum = 0,
188 .maximum = INT_MAX,
189 .default_num = 0
192 { .name = "lock-command",
193 .type = OPTIONS_TABLE_STRING,
194 .default_str = "lock -np"
197 { .name = "lock-server",
198 .type = OPTIONS_TABLE_FLAG,
199 .default_num = 1
202 { .name = "message-attr",
203 .type = OPTIONS_TABLE_ATTRIBUTES,
204 .default_num = 0
207 { .name = "message-bg",
208 .type = OPTIONS_TABLE_COLOUR,
209 .default_num = 3
212 { .name = "message-command-attr",
213 .type = OPTIONS_TABLE_ATTRIBUTES,
214 .default_num = 0
217 { .name = "message-command-bg",
218 .type = OPTIONS_TABLE_COLOUR,
219 .default_num = 0
222 { .name = "message-command-fg",
223 .type = OPTIONS_TABLE_COLOUR,
224 .default_num = 3
227 { .name = "message-fg",
228 .type = OPTIONS_TABLE_COLOUR,
229 .default_num = 0
232 { .name = "message-limit",
233 .type = OPTIONS_TABLE_NUMBER,
234 .minimum = 0,
235 .maximum = INT_MAX,
236 .default_num = 20
239 { .name = "mouse-resize-pane",
240 .type = OPTIONS_TABLE_FLAG,
241 .default_num = 0
244 { .name = "mouse-select-pane",
245 .type = OPTIONS_TABLE_FLAG,
246 .default_num = 0
249 { .name = "mouse-select-window",
250 .type = OPTIONS_TABLE_FLAG,
251 .default_num = 0
254 { .name = "mouse-utf8",
255 .type = OPTIONS_TABLE_FLAG,
256 .default_num = 0
259 { .name = "pane-active-border-bg",
260 .type = OPTIONS_TABLE_COLOUR,
261 .default_num = 8
264 { .name = "pane-active-border-fg",
265 .type = OPTIONS_TABLE_COLOUR,
266 .default_num = 2
269 { .name = "pane-border-bg",
270 .type = OPTIONS_TABLE_COLOUR,
271 .default_num = 8
274 { .name = "pane-border-fg",
275 .type = OPTIONS_TABLE_COLOUR,
276 .default_num = 8
279 { .name = "prefix",
280 .type = OPTIONS_TABLE_KEY,
281 .default_num = '\002',
284 { .name = "prefix2",
285 .type = OPTIONS_TABLE_KEY,
286 .default_num = KEYC_NONE,
289 { .name = "renumber-windows",
290 .type = OPTIONS_TABLE_FLAG,
291 .default_num = 0
294 { .name = "repeat-time",
295 .type = OPTIONS_TABLE_NUMBER,
296 .minimum = 0,
297 .maximum = SHRT_MAX,
298 .default_num = 500
301 { .name = "set-remain-on-exit",
302 .type = OPTIONS_TABLE_FLAG,
303 .default_num = 0
306 { .name = "set-titles",
307 .type = OPTIONS_TABLE_FLAG,
308 .default_num = 0
311 { .name = "set-titles-string",
312 .type = OPTIONS_TABLE_STRING,
313 .default_str = "#S:#I:#W - \"#T\""
316 { .name = "status",
317 .type = OPTIONS_TABLE_FLAG,
318 .default_num = 1
321 { .name = "status-attr",
322 .type = OPTIONS_TABLE_ATTRIBUTES,
323 .default_num = 0
326 { .name = "status-bg",
327 .type = OPTIONS_TABLE_COLOUR,
328 .default_num = 2
331 { .name = "status-fg",
332 .type = OPTIONS_TABLE_COLOUR,
333 .default_num = 0
336 { .name = "status-interval",
337 .type = OPTIONS_TABLE_NUMBER,
338 .minimum = 0,
339 .maximum = INT_MAX,
340 .default_num = 15
343 { .name = "status-justify",
344 .type = OPTIONS_TABLE_CHOICE,
345 .choices = options_table_status_justify_list,
346 .default_num = 0
349 { .name = "status-keys",
350 .type = OPTIONS_TABLE_CHOICE,
351 .choices = options_table_status_keys_list,
352 .default_num = MODEKEY_EMACS
355 { .name = "status-left",
356 .type = OPTIONS_TABLE_STRING,
357 .default_str = "[#S]"
360 { .name = "status-left-attr",
361 .type = OPTIONS_TABLE_ATTRIBUTES,
362 .default_num = 0
365 { .name = "status-left-bg",
366 .type = OPTIONS_TABLE_COLOUR,
367 .default_num = 8
370 { .name = "status-left-fg",
371 .type = OPTIONS_TABLE_COLOUR,
372 .default_num = 8
375 { .name = "status-left-length",
376 .type = OPTIONS_TABLE_NUMBER,
377 .minimum = 0,
378 .maximum = SHRT_MAX,
379 .default_num = 10
382 { .name = "status-position",
383 .type = OPTIONS_TABLE_CHOICE,
384 .choices = options_table_status_position_list,
385 .default_num = 1
388 { .name = "status-right",
389 .type = OPTIONS_TABLE_STRING,
390 .default_str = "\"#{=22:pane_title}\" %H:%M %d-%b-%y"
393 { .name = "status-right-attr",
394 .type = OPTIONS_TABLE_ATTRIBUTES,
395 .default_num = 0
398 { .name = "status-right-bg",
399 .type = OPTIONS_TABLE_COLOUR,
400 .default_num = 8
403 { .name = "status-right-fg",
404 .type = OPTIONS_TABLE_COLOUR,
405 .default_num = 8
408 { .name = "status-right-length",
409 .type = OPTIONS_TABLE_NUMBER,
410 .minimum = 0,
411 .maximum = SHRT_MAX,
412 .default_num = 40
415 { .name = "status-utf8",
416 .type = OPTIONS_TABLE_FLAG,
417 .default_num = 0 /* overridden in main() */
420 { .name = "terminal-overrides",
421 .type = OPTIONS_TABLE_STRING,
422 .default_str = "*256col*:colors=256"
423 ",xterm*:XT:Ms=\\E]52;%p1%s;%p2%s\\007"
424 ":Cs=\\E]12;%p1%s\\007:Cr=\\E]112\\007"
425 ":Ss=\\E[%p1%d q:Se=\\E[2 q,screen*:XT"
428 { .name = "update-environment",
429 .type = OPTIONS_TABLE_STRING,
430 .default_str = "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID "
431 "SSH_CONNECTION WINDOWID XAUTHORITY"
435 { .name = "visual-activity",
436 .type = OPTIONS_TABLE_FLAG,
437 .default_num = 0
440 { .name = "visual-bell",
441 .type = OPTIONS_TABLE_FLAG,
442 .default_num = 0
445 { .name = "visual-content",
446 .type = OPTIONS_TABLE_FLAG,
447 .default_num = 0
450 { .name = "visual-silence",
451 .type = OPTIONS_TABLE_FLAG,
452 .default_num = 0
455 { .name = "word-separators",
456 .type = OPTIONS_TABLE_STRING,
457 .default_str = " -_@"
460 { .name = NULL }
463 /* Window options. */
464 const struct options_table_entry window_options_table[] = {
465 { .name = "aggressive-resize",
466 .type = OPTIONS_TABLE_FLAG,
467 .default_num = 0
470 { .name = "allow-rename",
471 .type = OPTIONS_TABLE_FLAG,
472 .default_num = 1
475 { .name = "alternate-screen",
476 .type = OPTIONS_TABLE_FLAG,
477 .default_num = 1
480 { .name = "automatic-rename",
481 .type = OPTIONS_TABLE_FLAG,
482 .default_num = 1
485 { .name = "automatic-rename-format",
486 .type = OPTIONS_TABLE_STRING,
487 .default_str = "#{?pane_in_mode,[tmux],#{pane_current_command}}#{?pane_dead,[dead],}"
490 { .name = "c0-change-trigger",
491 .type = OPTIONS_TABLE_NUMBER,
492 .default_num = 250,
493 .minimum = 0,
494 .maximum = USHRT_MAX
497 { .name = "c0-change-interval",
498 .type = OPTIONS_TABLE_NUMBER,
499 .default_num = 100,
500 .minimum = 1,
501 .maximum = USHRT_MAX
504 { .name = "clock-mode-colour",
505 .type = OPTIONS_TABLE_COLOUR,
506 .default_num = 4
509 { .name = "clock-mode-style",
510 .type = OPTIONS_TABLE_CHOICE,
511 .choices = options_table_clock_mode_style_list,
512 .default_num = 1
515 { .name = "force-height",
516 .type = OPTIONS_TABLE_NUMBER,
517 .minimum = 0,
518 .maximum = INT_MAX,
519 .default_num = 0
522 { .name = "force-width",
523 .type = OPTIONS_TABLE_NUMBER,
524 .minimum = 0,
525 .maximum = INT_MAX,
526 .default_num = 0
529 { .name = "main-pane-height",
530 .type = OPTIONS_TABLE_NUMBER,
531 .minimum = 1,
532 .maximum = INT_MAX,
533 .default_num = 24
536 { .name = "main-pane-width",
537 .type = OPTIONS_TABLE_NUMBER,
538 .minimum = 1,
539 .maximum = INT_MAX,
540 .default_num = 80
543 { .name = "mode-attr",
544 .type = OPTIONS_TABLE_ATTRIBUTES,
545 .default_num = 0
548 { .name = "mode-bg",
549 .type = OPTIONS_TABLE_COLOUR,
550 .default_num = 3
553 { .name = "mode-fg",
554 .type = OPTIONS_TABLE_COLOUR,
555 .default_num = 0
558 { .name = "mode-keys",
559 .type = OPTIONS_TABLE_CHOICE,
560 .choices = options_table_mode_keys_list,
561 .default_num = MODEKEY_EMACS
564 { .name = "mode-mouse",
565 .type = OPTIONS_TABLE_CHOICE,
566 .choices = options_table_mode_mouse_list,
567 .default_num = 0
570 { .name = "monitor-activity",
571 .type = OPTIONS_TABLE_FLAG,
572 .default_num = 0
575 { .name = "monitor-content",
576 .type = OPTIONS_TABLE_STRING,
577 .default_str = ""
580 { .name = "monitor-silence",
581 .type = OPTIONS_TABLE_NUMBER,
582 .minimum = 0,
583 .maximum = INT_MAX,
584 .default_num = 0
587 { .name = "other-pane-height",
588 .type = OPTIONS_TABLE_NUMBER,
589 .minimum = 0,
590 .maximum = INT_MAX,
591 .default_num = 0
594 { .name = "other-pane-width",
595 .type = OPTIONS_TABLE_NUMBER,
596 .minimum = 0,
597 .maximum = INT_MAX,
598 .default_num = 0
601 { .name = "pane-base-index",
602 .type = OPTIONS_TABLE_NUMBER,
603 .minimum = 0,
604 .maximum = USHRT_MAX,
605 .default_num = 0
608 { .name = "remain-on-exit",
609 .type = OPTIONS_TABLE_FLAG,
610 .default_num = 0
613 { .name = "synchronize-panes",
614 .type = OPTIONS_TABLE_FLAG,
615 .default_num = 0
618 { .name = "utf8",
619 .type = OPTIONS_TABLE_FLAG,
620 .default_num = 0 /* overridden in main() */
623 { .name = "window-status-activity-attr",
624 .type = OPTIONS_TABLE_ATTRIBUTES,
625 .default_num = GRID_ATTR_REVERSE
628 { .name = "window-status-activity-bg",
629 .type = OPTIONS_TABLE_COLOUR,
630 .default_num = 8
633 { .name = "window-status-activity-fg",
634 .type = OPTIONS_TABLE_COLOUR,
635 .default_num = 8
638 { .name = "window-status-bell-attr",
639 .type = OPTIONS_TABLE_ATTRIBUTES,
640 .default_num = GRID_ATTR_REVERSE
643 { .name = "window-status-bell-bg",
644 .type = OPTIONS_TABLE_COLOUR,
645 .default_num = 8
648 { .name = "window-status-bell-fg",
649 .type = OPTIONS_TABLE_COLOUR,
650 .default_num = 8
653 { .name = "window-status-content-attr",
654 .type = OPTIONS_TABLE_ATTRIBUTES,
655 .default_num = GRID_ATTR_REVERSE
658 { .name = "window-status-content-bg",
659 .type = OPTIONS_TABLE_COLOUR,
660 .default_num = 8
663 { .name = "window-status-content-fg",
664 .type = OPTIONS_TABLE_COLOUR,
665 .default_num = 8
668 { .name = "window-status-attr",
669 .type = OPTIONS_TABLE_ATTRIBUTES,
670 .default_num = 0
673 { .name = "window-status-bg",
674 .type = OPTIONS_TABLE_COLOUR,
675 .default_num = 8
678 { .name = "window-status-current-attr",
679 .type = OPTIONS_TABLE_ATTRIBUTES,
680 .default_num = 0
683 { .name = "window-status-current-bg",
684 .type = OPTIONS_TABLE_COLOUR,
685 .default_num = 8
688 { .name = "window-status-current-fg",
689 .type = OPTIONS_TABLE_COLOUR,
690 .default_num = 8
693 { .name = "window-status-current-format",
694 .type = OPTIONS_TABLE_STRING,
695 .default_str = "#I:#W#F"
698 { .name = "window-status-last-attr",
699 .type = OPTIONS_TABLE_ATTRIBUTES,
700 .default_num = 0
703 { .name = "window-status-last-bg",
704 .type = OPTIONS_TABLE_COLOUR,
705 .default_num = 8
708 { .name = "window-status-last-fg",
709 .type = OPTIONS_TABLE_COLOUR,
710 .default_num = 8
713 { .name = "window-status-fg",
714 .type = OPTIONS_TABLE_COLOUR,
715 .default_num = 8
718 { .name = "window-status-format",
719 .type = OPTIONS_TABLE_STRING,
720 .default_str = "#I:#W#F"
723 { .name = "window-status-separator",
724 .type = OPTIONS_TABLE_STRING,
725 .default_str = " "
728 { .name = "wrap-search",
729 .type = OPTIONS_TABLE_FLAG,
730 .default_num = 1
733 { .name = "xterm-keys",
734 .type = OPTIONS_TABLE_FLAG,
735 .default_num = 0
738 { .name = NULL }
741 /* Populate an options tree from a table. */
742 void
743 options_table_populate_tree(
744 const struct options_table_entry *table, struct options *oo)
746 const struct options_table_entry *oe;
748 for (oe = table; oe->name != NULL; oe++) {
749 if (oe->default_str != NULL)
750 options_set_string(oo, oe->name, "%s", oe->default_str);
751 else
752 options_set_number(oo, oe->name, oe->default_num);
756 /* Print an option using its type from the table. */
757 const char *
758 options_table_print_entry(const struct options_table_entry *oe,
759 struct options_entry *o, int no_quotes)
761 static char out[BUFSIZ];
762 const char *s;
764 *out = '\0';
765 switch (oe->type) {
766 case OPTIONS_TABLE_STRING:
767 if (no_quotes)
768 xsnprintf(out, sizeof out, "%s", o->str);
769 else
770 xsnprintf(out, sizeof out, "\"%s\"", o->str);
771 break;
772 case OPTIONS_TABLE_NUMBER:
773 xsnprintf(out, sizeof out, "%lld", o->num);
774 break;
775 case OPTIONS_TABLE_KEY:
776 xsnprintf(out, sizeof out, "%s",
777 key_string_lookup_key(o->num));
778 break;
779 case OPTIONS_TABLE_COLOUR:
780 s = colour_tostring(o->num);
781 xsnprintf(out, sizeof out, "%s", s);
782 break;
783 case OPTIONS_TABLE_ATTRIBUTES:
784 s = attributes_tostring(o->num);
785 xsnprintf(out, sizeof out, "%s", s);
786 break;
787 case OPTIONS_TABLE_FLAG:
788 if (o->num)
789 strlcpy(out, "on", sizeof out);
790 else
791 strlcpy(out, "off", sizeof out);
792 break;
793 case OPTIONS_TABLE_CHOICE:
794 s = oe->choices[o->num];
795 xsnprintf(out, sizeof out, "%s", s);
796 break;
798 return (out);
801 /* Find an option. */
803 options_table_find(
804 const char *optstr, const struct options_table_entry **table,
805 const struct options_table_entry **oe)
807 static const struct options_table_entry *tables[] = {
808 server_options_table,
809 window_options_table,
810 session_options_table
812 const struct options_table_entry *oe_loop;
813 u_int i;
815 for (i = 0; i < nitems(tables); i++) {
816 for (oe_loop = tables[i]; oe_loop->name != NULL; oe_loop++) {
817 if (strncmp(oe_loop->name, optstr, strlen(optstr)) != 0)
818 continue;
820 /* If already found, ambiguous. */
821 if (*oe != NULL)
822 return (-1);
823 *oe = oe_loop;
824 *table = tables[i];
826 /* Bail now if an exact match. */
827 if (strcmp((*oe)->name, optstr) == 0)
828 break;
831 return (0);