changeset 12421:da55ea30842c v8.0.1090

patch 8.0.1090: cannot get the text under the cursor like v:beval_text commit https://github.com/vim/vim/commit/65f084749b260746d7f186af4f080298be2df55b Author: Bram Moolenaar <Bram@vim.org> Date: Sun Sep 10 18:16:20 2017 +0200 patch 8.0.1090: cannot get the text under the cursor like v:beval_text Problem: cannot get the text under the cursor like v:beval_text Solution: Add <cexpr>.
author Christian Brabandt <cb@256bit.org>
date Sun, 10 Sep 2017 18:30:05 +0200
parents 3dab736a3cd5
children 158cf874086e
files runtime/doc/cmdline.txt src/ex_docmd.c src/testdir/test_normal.vim src/version.c
diffstat 4 files changed, 43 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/cmdline.txt
+++ b/runtime/doc/cmdline.txt
@@ -830,6 +830,11 @@ Also see |`=|.
 Note: these are typed literally, they are not special keys!
 	<cword>    is replaced with the word under the cursor (like |star|)
 	<cWORD>    is replaced with the WORD under the cursor (see |WORD|)
+	<cexpr>    is replaced with the word under the cursor, including more
+		   to form a C expression.  E.g., when the cursor is on "arg"
+		   of "ptr->arg" then the result is "ptr->arg"; when the
+		   cursor is on "]" of "list[idx]" then the result is
+		   "list[idx]".  This is used for |v:beval_text|.
 	<cfile>    is replaced with the path name under the cursor (like what
 		   |gf| uses)
 	<afile>    When executing autocommands, is replaced with the file name
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -10650,31 +10650,33 @@ find_cmdline_var(char_u *src, int *usedl
 		    "%",
 #define SPEC_PERC   0
 		    "#",
-#define SPEC_HASH   1
+#define SPEC_HASH   (SPEC_PERC + 1)
 		    "<cword>",		/* cursor word */
-#define SPEC_CWORD  2
+#define SPEC_CWORD  (SPEC_HASH + 1)
 		    "<cWORD>",		/* cursor WORD */
-#define SPEC_CCWORD 3
+#define SPEC_CCWORD (SPEC_CWORD + 1)
+		    "<cexpr>",		/* expr under cursor */
+#define SPEC_CEXPR  (SPEC_CCWORD + 1)
 		    "<cfile>",		/* cursor path name */
-#define SPEC_CFILE  4
+#define SPEC_CFILE  (SPEC_CEXPR + 1)
 		    "<sfile>",		/* ":so" file name */
-#define SPEC_SFILE  5
+#define SPEC_SFILE  (SPEC_CFILE + 1)
 		    "<slnum>",		/* ":so" file line number */
-#define SPEC_SLNUM  6
+#define SPEC_SLNUM  (SPEC_SFILE + 1)
 #ifdef FEAT_AUTOCMD
 		    "<afile>",		/* autocommand file name */
-# define SPEC_AFILE 7
+# define SPEC_AFILE (SPEC_SLNUM + 1)
 		    "<abuf>",		/* autocommand buffer number */
-# define SPEC_ABUF  8
+# define SPEC_ABUF  (SPEC_AFILE + 1)
 		    "<amatch>",		/* autocommand match name */
-# define SPEC_AMATCH 9
+# define SPEC_AMATCH (SPEC_ABUF + 1)
 #endif
 #ifdef FEAT_CLIENTSERVER
 		    "<client>"
 # ifdef FEAT_AUTOCMD
-#  define SPEC_CLIENT 10
+#  define SPEC_CLIENT (SPEC_AMATCH + 1)
 # else
-#  define SPEC_CLIENT 7
+#  define SPEC_CLIENT (SPEC_SLNUM + 1)
 # endif
 #endif
     };
@@ -10762,10 +10764,13 @@ eval_vars(
     /*
      * word or WORD under cursor
      */
-    if (spec_idx == SPEC_CWORD || spec_idx == SPEC_CCWORD)
-    {
-	resultlen = find_ident_under_cursor(&result, spec_idx == SPEC_CWORD ?
-				      (FIND_IDENT|FIND_STRING) : FIND_STRING);
+    if (spec_idx == SPEC_CWORD || spec_idx == SPEC_CCWORD
+						     || spec_idx == SPEC_CEXPR)
+    {
+	resultlen = find_ident_under_cursor(&result,
+		spec_idx == SPEC_CWORD ? (FIND_IDENT | FIND_STRING)
+	      : spec_idx == SPEC_CEXPR ? (FIND_IDENT | FIND_STRING | FIND_EVAL)
+	      : FIND_STRING);
 	if (resultlen == 0)
 	{
 	    *errormsg = (char_u *)"";
--- a/src/testdir/test_normal.vim
+++ b/src/testdir/test_normal.vim
@@ -389,10 +389,22 @@ func! Test_normal10_expand()
   call setline(1, ['1', 'ifooar,,cbar'])
   2
   norm! $
-  let a=expand('<cword>')
-  let b=expand('<cWORD>')
-  call assert_equal('cbar', a)
-  call assert_equal('ifooar,,cbar', b)
+  call assert_equal('cbar', expand('<cword>'))
+  call assert_equal('ifooar,,cbar', expand('<cWORD>'))
+
+  call setline(1, ['prx = list[idx];'])
+  1
+  let expected = ['', 'prx', 'prx', 'prx',
+	\ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
+	\ 'idx', 'idx', 'idx', 'idx',
+	\ 'list[idx]',
+	\ '];',
+	\ ]
+  for i in range(1, 16)
+    exe 'norm ' . i . '|'
+    call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
+  endfor
+
   " clean up
   bw!
 endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1090,
+/**/
     1089,
 /**/
     1088,