diff options
-rw-r--r-- | runtime/doc/eval.txt | 47 | ||||
-rw-r--r-- | src/nvim/eval.c | 43 | ||||
-rw-r--r-- | src/nvim/testdir/test_bufwintabinfo.vim | 24 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
4 files changed, 86 insertions, 30 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index d97c10ee84..0a5a51a0e1 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.4. Last change: 2016 Jun 04 +*eval.txt* For Vim version 7.4. Last change: 2016 Aug 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -3625,26 +3625,31 @@ getbufinfo([{dict}]) lnum current line number in buffer. loaded TRUE if the buffer is loaded. name full path to the file in the buffer. - options dictionary of buffer local options. signs list of signs placed in the buffer. Each list item is a dictionary with the following fields: id sign identifier lnum line number name sign name - variables dictionary of buffer local variables. - windows list of window IDs with this buffer + variables a reference to the dictionary with + buffer-local variables. + windows list of |window-ID|s that display this + buffer Examples: > for buf in getbufinfo() echo buf.name endfor for buf in getbufinfo({'buflisted':1}) - if buf.options.filetype == 'java' + if buf.changed .... endif endfor < + To get buffer-local options use: > + getbufvar({bufnr}, '&') + +< *getbufline()* getbufline({expr}, {lnum} [, {end}]) Return a |List| with the lines starting from {lnum} to {end} @@ -3676,6 +3681,10 @@ getbufvar({expr}, {varname} [, {def}]) *getbufvar()* must be used. When {varname} is empty returns a dictionary with all the buffer-local variables. + When {varname} is equal to "&" returns a dictionary with all + the buffer-local options. + Otherwise, when {varname} starts with "&" returns the value of + a buffer-local option. This also works for a global or buffer-local option, but it doesn't work for a global variable, window-local variable or window-local option. @@ -4111,8 +4120,9 @@ gettabinfo([{arg}]) *gettabinfo()* Each List item is a Dictionary with the following entries: nr tab page number. + variables a reference to the dictionary with + tabpage-local variables windows List of window IDs in the tag page. - variables dictionary of tabpage local variables. gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()* Get the value of a tab-local variable {varname} in tab page @@ -4127,10 +4137,12 @@ gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()* gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()* Get the value of window-local variable {varname} in window {winnr} in tab page {tabnr}. - When {varname} starts with "&" get the value of a window-local - option. When {varname} is empty a dictionary with all window-local variables is returned. + When {varname} is equal to "&" get the values of all + window-local options in a Dictionary. + Otherwise, when {varname} starts with "&" get the value of a + window-local option. Note that {varname} must be the name without "w:". Tabs are numbered starting with one. For the current tabpage use |getwinvar()|. @@ -4170,13 +4182,16 @@ getwininfo([{winid}]) *getwininfo()* height window height loclist 1 if showing a location list nr window number - options dictionary of window local options quickfix 1 if quickfix or location list window tpnr tab page number - variables dictionary of window local variables + variables a reference to the dictionary with + window-local variables width window width winid window ID + To obtain all window-local variables use: > + gettabwinvar({tabnr}, {winnr}, '&') + getwinvar({winnr}, {varname} [, {def}]) *getwinvar()* Like |gettabwinvar()| for the current tabpage. Examples: > @@ -5544,6 +5559,16 @@ printf({fmt}, {expr1} ...) *printf()* numeric field; if the result of a conversion is wider than the field width, the field is expanded to contain the conversion result. + The 'h' modifier indicates the argument is 16 bits. + The 'l' modifier indicates the argument is 32 bits. + The 'L' modifier indicates the argument is 64 bits. + Generally, these modifiers are not useful. They are + ignored when type is known from the argument. + + i alias for d + D alias for ld + U alias for lu + O alias for lo *printf-c* c The Number argument is converted to a byte, and the @@ -5560,7 +5585,7 @@ printf({fmt}, {expr1} ...) *printf()* feature works just like 's'. *printf-f* *E807* - f The Float argument is converted into a string of the + f F The Float argument is converted into a string of the form 123.456. The precision specifies the number of digits after the decimal point. When the precision is zero the decimal point is omitted. When the precision diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 59d1132c79..2b325bbf20 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -9883,12 +9883,6 @@ static dict_T *get_buffer_info(buf_T *buf) // Get a reference to buffer variables dict_add_dict(dict, "variables", buf->b_vars); - // Copy buffer options - dict_T *opts = get_winbuf_options(true); - if (opts != NULL) { - dict_add_dict(dict, "options", opts); - } - // List of windows displaying this buffer list_T *windows = list_alloc(); FOR_ALL_TAB_WINDOWS(tp, wp) { @@ -10056,8 +10050,20 @@ static void f_getbufvar(typval_T *argvars, typval_T *rettv, FunPtr fptr) curbuf = buf; if (*varname == '&') { /* buffer-local-option */ - if (get_option_tv(&varname, rettv, TRUE) == OK) + if (varname[1] == NUL) { + // get all buffer-local options in a dict + dict_T *opts = get_winbuf_options(true); + + if (opts != NULL) { + rettv->v_type = VAR_DICT; + rettv->vval.v_dict = opts; + opts->dv_refcount++; + done = true; + } + } else if (get_option_tv(&varname, rettv, true) == OK) { + // buffer-local-option done = TRUE; + } } else if (STRCMP(varname, "changedtick") == 0) { rettv->v_type = VAR_NUMBER; rettv->vval.v_number = curbuf->b_changedtick; @@ -10904,15 +10910,9 @@ static dict_T *get_win_info(win_T *wp, short tpnr, short winnr) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL), NULL); - // Make a reference to window variables + // Add a reference to window variables dict_add_dict(dict, "variables", wp->w_vars); - // Copy window options - dict_T *opts = get_winbuf_options(false); - if (opts != NULL) { - dict_add_dict(dict, "options", opts); - } - return dict; } @@ -11072,8 +11072,19 @@ getwinvar ( bool need_switch_win = tp != curtab || win != curwin; if (!need_switch_win || switch_win(&oldcurwin, &oldtabpage, win, tp, true) == OK) { - if (*varname == '&') { // window-local-option - if (get_option_tv(&varname, rettv, 1) == OK) { + if (*varname == '&') { + if (varname[1] == NUL) { + // get all window-local options in a dict + dict_T *opts = get_winbuf_options(false); + + if (opts != NULL) { + rettv->v_type = VAR_DICT; + rettv->vval.v_dict = opts; + opts->dv_refcount++; + done = true; + } + } else if (get_option_tv(&varname, rettv, 1) == OK) { + // window-local-option done = true; } } else { diff --git a/src/nvim/testdir/test_bufwintabinfo.vim b/src/nvim/testdir/test_bufwintabinfo.vim index 42c016621f..5c916e2dd7 100644 --- a/src/nvim/testdir/test_bufwintabinfo.vim +++ b/src/nvim/testdir/test_bufwintabinfo.vim @@ -18,7 +18,6 @@ function Test_getbufwintabinfo() let b:editor = 'vim' let l = getbufinfo('%') call assert_equal(bufnr('%'), l[0].bufnr) - call assert_equal(8, l[0].options.tabstop) call assert_equal('vim', l[0].variables.editor) call assert_notequal(-1, index(l[0].windows, bufwinid('%'))) @@ -49,7 +48,6 @@ function Test_getbufwintabinfo() call assert_equal(winbufnr(2), winlist[1].bufnr) call assert_equal(winheight(2), winlist[1].height) call assert_equal(1, winlist[2].winnr) - call assert_equal('auto', winlist[0].options.signcolumn) call assert_equal(2, winlist[3].tabnr) call assert_equal('green', winlist[2].variables.signal) call assert_equal(winwidth(1), winlist[0].width) @@ -81,3 +79,25 @@ function Test_getbufwintabinfo() call assert_false(winlist[2].loclist) wincmd t | only endfunction + +function Test_get_buf_options() + let opts = getbufvar(bufnr('%'), '&') + call assert_equal(v:t_dict, type(opts)) + call assert_equal(8, opts.tabstop) +endfunc + +function Test_get_win_options() + let opts = getwinvar(1, '&') + call assert_equal(v:t_dict, type(opts)) + call assert_equal(0, opts.linebreak) + if has('signs') + call assert_equal('auto', opts.signcolumn) + endif + + let opts = gettabwinvar(1, 1, '&') + call assert_equal(v:t_dict, type(opts)) + call assert_equal(0, opts.linebreak) + if has('signs') + call assert_equal('auto', opts.signcolumn) + endif +endfunc diff --git a/src/nvim/version.c b/src/nvim/version.c index 4ad4c82928..55d86b3aec 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -167,7 +167,7 @@ static int included_patches[] = { // 2276, // 2275, 2274, - // 2273, + 2273, 2272, // 2271 NA // 2270 NA |