To: vim_dev@googlegroups.com Subject: Patch 8.1.1510 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 ')) + call assert_equal('e Vim!@#', expandcmd('e ')) + 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 ")', 'E495:') + call assert_fails('call expandcmd("make ")', '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 -- Bram@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 ///