diff --git a/cmd-source-file.c b/cmd-source-file.c index 2fe124b6..d945e247 100644 --- a/cmd-source-file.c +++ b/cmd-source-file.c @@ -18,6 +18,7 @@ #include +#include #include #include #include @@ -149,6 +150,21 @@ cmd_source_file_add(struct cmd_source_file_data *cdata, const char *path) cdata->files[cdata->nfiles++] = xstrdup(path); } +static char * +cmd_source_file_quote_for_glob(const char *path) +{ + char *quoted = xmalloc(2 * strlen(path) + 1), *q = quoted; + const char *p = path; + + while (*p != '\0') { + if ((u_char)*p < 128 && !isalnum((u_char)*p) && *p != '/') + *q++ = '\\'; + *q++ = *p++; + } + *q = '\0'; + return (quoted); +} + static enum cmd_retval cmd_source_file_exec(struct cmd *self, struct cmdq_item *item) { @@ -188,7 +204,7 @@ cmd_source_file_exec(struct cmd *self, struct cmdq_item *item) if (args_has(args, 'v')) cdata->flags |= CMD_PARSE_VERBOSE; - utf8_stravis(&cwd, server_client_get_cwd(c, NULL), VIS_GLOB); + cwd = cmd_source_file_quote_for_glob(server_client_get_cwd(c, NULL)); for (i = 0; i < args_count(args); i++) { path = args_string(args, i); diff --git a/layout-set.c b/layout-set.c index 642dbffb..bd68f663 100644 --- a/layout-set.c +++ b/layout-set.c @@ -584,10 +584,11 @@ layout_set_main_v_mirrored(struct window *w) void layout_set_tiled(struct window *w) { + struct options *oo = w->options; struct window_pane *wp; struct layout_cell *lc, *lcrow, *lcchild; u_int n, width, height, used, sx, sy; - u_int i, j, columns, rows; + u_int i, j, columns, rows, max_columns; layout_print_cell(w->layout_root, __func__, 1); @@ -596,11 +597,15 @@ layout_set_tiled(struct window *w) if (n <= 1) return; + /* Get maximum columns from window option. */ + max_columns = options_get_number(oo, "tiled-layout-max-columns"); + /* How many rows and columns are wanted? */ rows = columns = 1; while (rows * columns < n) { rows++; - if (rows * columns < n) + if (rows * columns < n && + (max_columns == 0 || columns < max_columns)) columns++; } diff --git a/options-table.c b/options-table.c index 160cd7ac..6946a085 100644 --- a/options-table.c +++ b/options-table.c @@ -1394,6 +1394,16 @@ const struct options_table_entry options_table[] = { .text = "Whether typing should be sent to all panes simultaneously." }, + { .name = "tiled-layout-max-columns", + .type = OPTIONS_TABLE_NUMBER, + .scope = OPTIONS_TABLE_WINDOW, + .minimum = 0, + .maximum = USHRT_MAX, + .default_num = 0, + .text = "Maximum number of columns in the 'tiled' layout. " + "A value of 0 means no limit." + }, + { .name = "window-active-style", .type = OPTIONS_TABLE_STRING, .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE, diff --git a/tmux.1 b/tmux.1 index 5d42f8ae..f456d367 100644 --- a/tmux.1 +++ b/tmux.1 @@ -5222,6 +5222,14 @@ see the .Sx STYLES section. .Pp +.It Ic tiled-layout-max-columns Ar number +Set the maximum number of columns in the +.Ic tiled +layout. +A value of 0 (the default) means no limit. +When a limit is set, panes are arranged to not exceed this number of columns, +with additional panes stacked in extra rows. +.Pp .It Ic window-status-activity-style Ar style Set status line style for windows with an activity alert. For how to specify