Merge #10064 from janlazo/vim-8.1.0211

vim-patch:8.1.{211,307}
This commit is contained in:
Justin M. Keyes
2019-05-26 16:33:10 +02:00
committed by GitHub
9 changed files with 139 additions and 12 deletions

View File

@@ -8868,8 +8868,8 @@ static void f_fnamemodify(typval_T *argvars, typval_T *rettv, FunPtr fptr)
} else {
len = strlen(fname);
size_t usedlen = 0;
(void)modify_fname((char_u *)mods, &usedlen, (char_u **)&fname, &fbuf,
&len);
(void)modify_fname((char_u *)mods, false, &usedlen,
(char_u **)&fname, &fbuf, &len);
}
rettv->v_type = VAR_STRING;
@@ -17872,6 +17872,25 @@ static void f_winheight(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
}
// "winlayout()" function
static void f_winlayout(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
tabpage_T *tp;
tv_list_alloc_ret(rettv, 2);
if (argvars[0].v_type == VAR_UNKNOWN) {
tp = curtab;
} else {
tp = find_tabpage((int)tv_get_number(&argvars[0]));
if (tp == NULL) {
return;
}
}
get_framelayout(tp->tp_topframe, rettv->vval.v_list, true);
}
/*
* "winline()" function
*/
@@ -22623,6 +22642,7 @@ void reset_v_option_vars(void)
int
modify_fname(
char_u *src, // string with modifiers
bool tilde_file, // "~" is a file name, not $HOME
size_t *usedlen, // characters after src that are used
char_u **fnamep, // file name so far
char_u **bufp, // buffer for allocated file name or NULL
@@ -22652,8 +22672,8 @@ repeat:
|| (*fnamep)[1] == '\\'
# endif
|| (*fnamep)[1] == NUL)
#endif
&& !(tilde_file && (*fnamep)[1] == NUL)
) {
*fnamep = expand_env_save(*fnamep);
xfree(*bufp); /* free any allocated file name */

View File

@@ -352,6 +352,7 @@ return {
winbufnr={args=1},
wincol={},
winheight={args=1},
winlayout={args={0, 1}},
winline={},
winnr={args={0, 1}},
winrestcmd={},

View File

@@ -8552,6 +8552,7 @@ eval_vars (
size_t resultlen;
buf_T *buf;
int valid = VALID_HEAD | VALID_PATH; // Assume valid result.
bool tilde_file = false;
int skip_mod = false;
char strbuf[30];
@@ -8608,9 +8609,11 @@ eval_vars (
case SPEC_PERC: /* '%': current file */
if (curbuf->b_fname == NULL) {
result = (char_u *)"";
valid = 0; /* Must have ":p:h" to be valid */
} else
valid = 0; // Must have ":p:h" to be valid
} else {
result = curbuf->b_fname;
tilde_file = STRCMP(result, "~") == 0;
}
break;
case SPEC_HASH: /* '#' or "#99": alternate file */
@@ -8659,9 +8662,11 @@ eval_vars (
*lnump = ECMD_LAST;
if (buf->b_fname == NULL) {
result = (char_u *)"";
valid = 0; /* Must have ":p:h" to be valid */
} else
valid = 0; // Must have ":p:h" to be valid
} else {
result = buf->b_fname;
tilde_file = STRCMP(result, "~") == 0;
}
}
break;
@@ -8746,7 +8751,8 @@ eval_vars (
resultlen = (size_t)(s - result);
}
} else if (!skip_mod) {
valid |= modify_fname(src, usedlen, &result, &resultbuf, &resultlen);
valid |= modify_fname(src, tilde_file, usedlen, &result,
&resultbuf, &resultlen);
if (result == NULL) {
*errormsg = (char_u *)"";
return NULL;

View File

@@ -425,9 +425,11 @@ cs_add_common(
expand_env((char_u *)arg1, (char_u *)fname, MAXPATHL);
size_t len = STRLEN(fname);
fbuf = (char_u *)fname;
(void)modify_fname((char_u *)":p", &usedlen, (char_u **)&fname, &fbuf, &len);
if (fname == NULL)
(void)modify_fname((char_u *)":p", false, &usedlen,
(char_u **)&fname, &fbuf, &len);
if (fname == NULL) {
goto add_err;
}
fname = (char *)vim_strnsave((char_u *)fname, len);
xfree(fbuf);
FileInfo file_info;

View File

@@ -870,8 +870,8 @@ size_t home_replace(const buf_T *const buf, const char_u *src,
size_t usedlen = 0;
size_t flen = strlen(homedir_env_mod);
char_u *fbuf = NULL;
(void)modify_fname((char_u *)":p", &usedlen, (char_u **)&homedir_env_mod,
&fbuf, &flen);
(void)modify_fname((char_u *)":p", false, &usedlen,
(char_u **)&homedir_env_mod, &fbuf, &flen);
flen = strlen(homedir_env_mod);
assert(homedir_env_mod != homedir_env);
if (vim_ispathsep(homedir_env_mod[flen - 1])) {

View File

@@ -101,3 +101,23 @@ func Test_win_getid_curtab()
call assert_equal(win_getid(1), win_getid(1, 1))
tabclose!
endfunc
func Test_winlayout()
let w1 = win_getid()
call assert_equal(['leaf', w1], winlayout())
split
let w2 = win_getid()
call assert_equal(['col', [['leaf', w2], ['leaf', w1]]], winlayout())
split
let w3 = win_getid()
call assert_equal(['col', [['leaf', w3], ['leaf', w2], ['leaf', w1]]], winlayout())
2wincmd w
vsplit
let w4 = win_getid()
call assert_equal(['col', [['leaf', w3], ['row', [['leaf', w4], ['leaf', w2]]], ['leaf', w1]]], winlayout())
only!
endfunc

View File

@@ -6658,6 +6658,41 @@ void win_findbuf(typval_T *argvars, list_T *list)
}
}
// Get the layout of the given tab page for winlayout().
void get_framelayout(const frame_T *fr, list_T *l, bool outer)
{
list_T *fr_list;
if (fr == NULL) {
return;
}
if (outer) {
// outermost call from f_winlayout()
fr_list = l;
} else {
fr_list = tv_list_alloc(2);
tv_list_append_list(l, fr_list);
}
if (fr->fr_layout == FR_LEAF) {
if (fr->fr_win != NULL) {
tv_list_append_string(fr_list, "leaf", -1);
tv_list_append_number(fr_list, fr->fr_win->handle);
}
} else {
tv_list_append_string(fr_list, fr->fr_layout == FR_ROW ? "row" : "col", -1);
list_T *const win_list = tv_list_alloc(kListLenUnknown);
tv_list_append_list(fr_list, win_list);
const frame_T *child = fr->fr_child;
while (child != NULL) {
get_framelayout(child, win_list, false);
child = child->fr_next;
}
}
}
void win_ui_flush_positions(void)
{
FOR_ALL_TAB_WINDOWS(tp, wp) {