Patch 8.1.1510

25 views
Skip to first unread message

Bram Moolenaar

unread,
Jun 9, 2019, 11:22:53 AM6/9/19
to vim...@googlegroups.com

Patch 8.1.1510
Problem: A plugin cannot easily expand a command like done internally.
Solution: Add the expandcmd() function. (Yegappan Lakshmanan, closes #4514)
Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
src/testdir/test_expand.vim


*** ../vim-8.1.1509/runtime/doc/eval.txt 2019-06-09 13:42:36.428522167 +0200
--- runtime/doc/eval.txt 2019-06-09 17:06:36.603194124 +0200
***************
*** 2325,2330 ****
--- 2326,2332 ----
exp({expr}) Float exponential of {expr}
expand({expr} [, {nosuf} [, {list}]])
any expand special keywords in {expr}
+ expandcmd({expr}) String expand {expr} like with `:edit`
feedkeys({string} [, {mode}]) Number add key sequence to typeahead buffer
filereadable({file}) Number |TRUE| if {file} is a readable file
filewritable({file}) Number |TRUE| if {file} is a writable file
***************
*** 4217,4222 ****
--- 4219,4232 ----
See |glob()| for finding existing files. See |system()| for
getting the raw output of an external command.

+ expandcmd({expr}) *expandcmd()*
+ Expand special items in {expr} like what is done for an Ex
+ command such as `:edit`. This expands special keywords, like
+ with |expand()|, and environment variables, anywhere in
+ {expr}. Returns the expanded string.
+ Example: >
+ :echo expandcmd('make %<.o')
+ <
extend({expr1}, {expr2} [, {expr3}]) *extend()*
{expr1} and {expr2} must be both |Lists| or both
|Dictionaries|.
*** ../vim-8.1.1509/runtime/doc/usr_41.txt 2019-05-11 21:14:02.332269584 +0200
--- runtime/doc/usr_41.txt 2019-06-09 17:07:15.550875139 +0200
***************
*** 608,619 ****
--- 609,622 ----
strcharpart() get part of a string using char index
strgetchar() get character from a string using char index
expand() expand special keywords
+ expandcmd() expand a command like done for `:edit`
iconv() convert text from one encoding to another
byteidx() byte index of a character in a string
byteidxcomp() like byteidx() but count composing characters
repeat() repeat a string multiple times
eval() evaluate a string expression
execute() execute an Ex command and get the output
+ win_execute() like execute() but in a specified window
trim() trim characters from a string

List manipulation: *list-functions*
***************
*** 813,818 ****
--- 816,822 ----
appendbufline() append a list of lines in the specified buffer
deletebufline() delete lines from a specified buffer
listener_add() add a callback to listen to changes
+ listener_flush() invoke listener callbacks
listener_remove() remove a listener callback
win_findbuf() find windows containing a buffer
win_getid() get window ID of a window
*** ../vim-8.1.1509/src/evalfunc.c 2019-06-09 13:42:36.428522167 +0200
--- src/evalfunc.c 2019-06-09 17:14:51.367682702 +0200
***************
*** 149,154 ****
--- 149,155 ----
static void f_exp(typval_T *argvars, typval_T *rettv);
#endif
static void f_expand(typval_T *argvars, typval_T *rettv);
+ static void f_expandcmd(typval_T *argvars, typval_T *rettv);
static void f_extend(typval_T *argvars, typval_T *rettv);
static void f_feedkeys(typval_T *argvars, typval_T *rettv);
static void f_filereadable(typval_T *argvars, typval_T *rettv);
***************
*** 646,651 ****
--- 647,653 ----
{"exp", 1, 1, f_exp},
#endif
{"expand", 1, 3, f_expand},
+ {"expandcmd", 1, 1, f_expandcmd},
{"extend", 2, 3, f_extend},
{"feedkeys", 1, 2, f_feedkeys},
{"file_readable", 1, 1, f_filereadable}, /* obsolete */
***************
*** 3791,3796 ****
--- 3793,3827 ----
}

/*
+ * "expandcmd()" function
+ * Expand all the special characters in a command string.
+ */
+ static void
+ f_expandcmd(typval_T *argvars, typval_T *rettv)
+ {
+ exarg_T eap;
+ char_u *cmdstr;
+ char *errormsg = NULL;
+
+ rettv->v_type = VAR_STRING;
+ cmdstr = vim_strsave(tv_get_string(&argvars[0]));
+
+ memset(&eap, 0, sizeof(eap));
+ eap.cmd = cmdstr;
+ eap.arg = cmdstr;
+ eap.argt |= NOSPC;
+ eap.usefilter = FALSE;
+ eap.nextcmd = NULL;
+ eap.cmdidx = CMD_USER;
+
+ expand_filename(&eap, &cmdstr, &errormsg);
+ if (errormsg != NULL && *errormsg != NUL)
+ emsg(errormsg);
+
+ rettv->vval.v_string = cmdstr;
+ }
+
+ /*
* "extend(list, list [, idx])" function
* "extend(dict, dict [, action])" function
*/
*** ../vim-8.1.1509/src/testdir/test_expand.vim 2018-07-25 21:19:09.351657045 +0200
--- src/testdir/test_expand.vim 2019-06-09 17:19:20.546087850 +0200
***************
*** 47,49 ****
--- 47,83 ----
call assert_match('\~', expand('%:p'))
bwipe!
endfunc
+
+ func Test_expandcmd()
+ let $FOO = 'Test'
+ call assert_equal('e x/Test/y', expandcmd('e x/$FOO/y'))
+ unlet $FOO
+
+ new
+ edit Xfile1
+ call assert_equal('e Xfile1', expandcmd('e %'))
+ edit Xfile2
+ edit Xfile1
+ call assert_equal('e Xfile2', expandcmd('e #'))
+ edit Xfile2
+ edit Xfile3
+ edit Xfile4
+ let bnum = bufnr('Xfile2')
+ call assert_equal('e Xfile2', expandcmd('e #' . bnum))
+ call setline('.', 'Vim!@#')
+ call assert_equal('e Vim', expandcmd('e <cword>'))
+ call assert_equal('e Vim!@#', expandcmd('e <cWORD>'))
+ enew!
+ edit Xfile.java
+ call assert_equal('e Xfile.py', expandcmd('e %:r.py'))
+ call assert_equal('make abc.java', expandcmd('make abc.%:e'))
+ call assert_equal('make Xabc.java', expandcmd('make %:s?file?abc?'))
+ edit a1a2a3.rb
+ call assert_equal('make b1b2b3.rb a1a2a3 Xfile.o', expandcmd('make %:gs?a?b? %< #<.o'))
+
+ call assert_fails('call expandcmd("make <afile>")', 'E495:')
+ call assert_fails('call expandcmd("make <afile>")', 'E495:')
+ enew
+ call assert_fails('call expandcmd("make %")', 'E499:')
+ close
+ endfunc
*** ../vim-8.1.1509/src/version.c 2019-06-09 16:40:42.374865927 +0200
--- src/version.c 2019-06-09 17:03:09.729078138 +0200
***************
*** 779,780 ****
--- 779,782 ----
{ /* Add new patch number below this line */
+ /**/
+ 1510,
/**/

--
Birthdays are healthy. The more you have them, the longer you live.

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

Andy Wokula

unread,
Aug 5, 2019, 2:53:53 PM8/5/19
to vim...@googlegroups.com
Am 09.06.2019 um 17:22 schrieb Bram Moolenaar:
> Patch 8.1.1510
> Problem: A plugin cannot easily expand a command like done internally.
> Solution: Add the expandcmd() function. (Yegappan Lakshmanan, closes #4514)
> Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
> src/testdir/test_expand.vim

"cannot easily" is not true I think:


func! ExpandCmd(args)
exec 'NwoExpand '. a:args
endfunc

" Internal:
com! -nargs=? -complete=file NwoExpand return <q-args>


"cannot nicely" may hit it better because of the internal command.
This side effect of file completion was undocumented.
Works for Vim 7.0.

Not sure if it really does the same as expandcmd().

--
Andy

Yegappan Lakshmanan

unread,
Aug 5, 2019, 6:59:35 PM8/5/19
to vim_dev
Hi Andy,
Your solution is similar to the expand() function used by the dispatch
plugin (https://github.com/tpope/vim-dispatch/blob/master/autoload/dispatch.vim).
Your solution is simpler than the one used by the dispatch plugin.
But the Vim plugins have to use this as a workaround to expand the
wildcards anywhere in the command-line instead of a native solution.

Regards,
Yegappan
Reply all
Reply to author
Forward
0 new messages