Patch 7.2.432

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Patch 7.2.432

Bram Moolenaar

Patch 7.2.432
Problem:    When menus are translated they can only be found by the translated
            name.  That makes ":emenu" difficult to use.
Solution:   Store the untranslated name and use it for completion and :emenu.
            (Edward L. Fox / Liang Peng / Bezetek James)
Files:    src/menu.c, src/structs.h


*** ../vim-7.2.431/src/menu.c 2010-05-14 21:19:16.000000000 +0200
--- src/menu.c 2010-05-14 21:52:58.000000000 +0200
***************
*** 58,63 ****
--- 58,66 ----
  static char_u *menutrans_lookup __ARGS((char_u *name, int len));
  #endif
 
+ static char_u *menu_translate_tab_and_shift __ARGS((char_u *arg_start));
+ static void menu_unescape_name  __ARGS((char_u *p));
+
  /* The character for each menu mode */
  static char_u menu_mode_chars[] = {'n', 'v', 's', 'o', 'i', 'c', 't'};
 
***************
*** 106,115 ****
      int pri_tab[MENUDEPTH + 1];
      int enable = MAYBE;    /* TRUE for "menu enable", FALSE for "menu
      * disable */
- #ifdef FEAT_MULTI_LANG
-     char_u *tofree = NULL;
-     char_u *new_cmd;
- #endif
  #ifdef FEAT_TOOLBAR
      char_u *icon = NULL;
  #endif
--- 109,114 ----
***************
*** 251,291 ****
      }
  #endif
 
- #ifdef FEAT_MULTI_LANG
-     /*
-      * Translate menu names as specified with ":menutrans" commands.
-      */
-     menu_path = arg;
-     while (*menu_path)
-     {
- /* find the end of one part and check if it should be translated */
- p = menu_skip_part(menu_path);
- map_to = menutrans_lookup(menu_path, (int)(p - menu_path));
- if (map_to != NULL)
- {
-    /* found a match: replace with the translated part */
-    i = (int)STRLEN(map_to);
-    new_cmd = alloc((unsigned)STRLEN(arg) + i + 1);
-    if (new_cmd == NULL)
- break;
-    mch_memmove(new_cmd, arg, menu_path - arg);
-    mch_memmove(new_cmd + (menu_path - arg), map_to, (size_t)i);
-    STRCPY(new_cmd + (menu_path - arg) + i, p);
-    p = new_cmd + (menu_path - arg) + i;
-    vim_free(tofree);
-    tofree = new_cmd;
-    arg = new_cmd;
- }
- if (*p != '.')
-    break;
- menu_path = p + 1;
-     }
- #endif
-
-     /*
-      * Isolate the menu name.
-      * Skip the menu name, and translate <Tab> into a real TAB.
-      */
      menu_path = arg;
      if (*menu_path == '.')
      {
--- 250,255 ----
***************
*** 293,313 ****
  goto theend;
      }
 
!     while (*arg && !vim_iswhite(*arg))
!     {
! if ((*arg == '\\' || *arg == Ctrl_V) && arg[1] != NUL)
!    arg++;
! else if (STRNICMP(arg, "<TAB>", 5) == 0)
! {
!    *arg = TAB;
!    STRMOVE(arg + 1, arg + 5);
! }
! arg++;
!     }
!     if (*arg != NUL)
! *arg++ = NUL;
!     arg = skipwhite(arg);
!     map_to = arg;
 
      /*
       * If there is only a menu name, display menus with that name.
--- 257,263 ----
  goto theend;
      }
 
!     map_to = menu_translate_tab_and_shift(arg);
 
      /*
       * If there is only a menu name, display menus with that name.
***************
*** 453,463 ****
  #endif
 
  theend:
- #ifdef FEAT_MULTI_LANG
-     vim_free(tofree);
- #else
      ;
- #endif
  }
 
  /*
--- 403,409 ----
***************
*** 498,503 ****
--- 444,453 ----
      int pri_idx = 0;
      int old_modes = 0;
      int amenu;
+ #ifdef FEAT_MULTI_LANG
+     char_u *en_name;
+     char_u *map_to = NULL;
+ #endif
 
      /* Make a copy so we can stuff around with it, since it could be const */
      path_name = vim_strsave(menu_path);
***************
*** 511,516 ****
--- 461,476 ----
  /* Get name of this element in the menu hierarchy, and the simplified
  * name (without mnemonic and accelerator text). */
  next_name = menu_name_skip(name);
+ #ifdef FEAT_MULTI_LANG
+ map_to = menutrans_lookup(name,STRLEN(name));
+ if (map_to != NULL)
+ {
+    en_name = name;
+    name = map_to;
+ }
+ else
+    en_name = NULL;
+ #endif
  dname = menu_text(name, NULL, NULL);
  if (dname == NULL)
     goto erret;
***************
*** 594,599 ****
--- 554,571 ----
     menu->name = vim_strsave(name);
     /* separate mnemonic and accelerator text from actual menu name */
     menu->dname = menu_text(name, &menu->mnemonic, &menu->actext);
+ #ifdef FEAT_MULTI_LANG
+    if (en_name != NULL)
+    {
+ menu->en_name = vim_strsave(en_name);
+ menu->en_dname = menu_text(en_name, NULL, NULL);
+    }
+    else
+    {
+ menu->en_name = NULL;
+ menu->en_dname = NULL;
+    }
+ #endif
     menu->priority = pri_tab[pri_idx];
     menu->parent = parent;
  #ifdef FEAT_GUI_MOTIF
***************
*** 1040,1045 ****
--- 1012,1021 ----
      *menup = menu->next;
      vim_free(menu->name);
      vim_free(menu->dname);
+ #ifdef FEAT_MULTI_LANG
+     vim_free(menu->en_name);
+     vim_free(menu->en_dname);
+ #endif
      vim_free(menu->actext);
  #ifdef FEAT_TOOLBAR
      vim_free(menu->iconfile);
***************
*** 1357,1365 ****
--- 1333,1347 ----
  {
      static vimmenu_T *menu = NULL;
      char_u *str;
+ #ifdef FEAT_MULTI_LANG
+     static  int should_advance = FALSE;
+ #endif
 
      if (idx == 0)    /* first call: start at first item */
+     {
  menu = expand_menu;
+ should_advance = FALSE;
+     }
 
      /* Skip PopUp[nvoci]. */
      while (menu != NULL && (menu_is_hidden(menu->dname)
***************
*** 1372,1383 ****
  return NULL;
 
      if (menu->modes & expand_modes)
! str = menu->dname;
      else
  str = (char_u *)"";
 
!     /* Advance to next menu entry. */
!     menu = menu->next;
 
      return str;
  }
--- 1354,1383 ----
  return NULL;
 
      if (menu->modes & expand_modes)
! #ifdef FEAT_MULTI_LANG
! if (should_advance)
!    str = menu->en_dname;
! else
! {
! #endif
!    str = menu->dname;
! #ifdef FEAT_MULTI_LANG
!    if (menu->en_dname == NULL)
!                 should_advance = TRUE;
! }
! #endif
      else
  str = (char_u *)"";
 
! #ifdef FEAT_MULTI_LANG
!     if (should_advance)
! #endif
!         /* Advance to next menu entry. */
!         menu = menu->next;
!
! #ifdef FEAT_MULTI_LANG
!     should_advance = !should_advance;
! #endif
 
      return str;
  }
***************
*** 1394,1402 ****
--- 1394,1408 ----
      static vimmenu_T *menu = NULL;
      static char_u tbuffer[256]; /*hack*/
      char_u *str;
+ #ifdef FEAT_MULTI_LANG
+     static  int should_advance = FALSE;
+ #endif
 
      if (idx == 0)    /* first call: start at first item */
+     {
  menu = expand_menu;
+ should_advance = FALSE;
+     }
 
      /* Skip Browse-style entries, popup menus and separators. */
      while (menu != NULL
***************
*** 1416,1435 ****
      {
  if (menu->children != NULL)
  {
!    STRCPY(tbuffer, menu->dname);
     /* hack on menu separators:  use a 'magic' char for the separator
      * so that '.' in names gets escaped properly */
     STRCAT(tbuffer, "\001");
     str = tbuffer;
  }
  else
!    str = menu->dname;
      }
      else
  str = (char_u *)"";
 
!     /* Advance to next menu entry. */
!     menu = menu->next;
 
      return str;
  }
--- 1422,1472 ----
      {
  if (menu->children != NULL)
  {
! #ifdef FEAT_MULTI_LANG
!    if (should_advance)
! STRCPY(tbuffer, menu->en_dname);
!    else
!    {
! #endif
! STRCPY(tbuffer, menu->dname);
! #ifdef FEAT_MULTI_LANG
! if (menu->en_dname == NULL)
!    should_advance = TRUE;
!    }
! #endif
     /* hack on menu separators:  use a 'magic' char for the separator
      * so that '.' in names gets escaped properly */
     STRCAT(tbuffer, "\001");
     str = tbuffer;
  }
  else
! #ifdef FEAT_MULTI_LANG
!         {
!             if (should_advance)
!                 str = menu->en_dname;
!             else
!             {
! #endif
!                 str = menu->dname;
! #ifdef FEAT_MULTI_LANG
!                 if (menu->en_dname == NULL)
!                     should_advance = TRUE;
!             }
!         }
! #endif
      }
      else
  str = (char_u *)"";
 
! #ifdef FEAT_MULTI_LANG
!     if (should_advance)
! #endif
!         /* Advance to next menu entry. */
!         menu = menu->next;
!
! #ifdef FEAT_MULTI_LANG
!     should_advance = !should_advance;
! #endif
 
      return str;
  }
***************
*** 1469,1475 ****
      char_u *name;
      vimmenu_T *menu;
  {
!     return (menu_namecmp(name, menu->name) || menu_namecmp(name, menu->dname));
  }
 
      static int
--- 1506,1516 ----
      char_u *name;
      vimmenu_T *menu;
  {
!     if (menu->en_name != NULL
!    && (menu_namecmp(name,menu->en_name)
! || menu_namecmp(name,menu->en_dname)))
!         return TRUE;
!     return menu_namecmp(name, menu->name) || menu_namecmp(name, menu->dname);
  }
 
      static int
***************
*** 2402,2407 ****
--- 2443,2452 ----
     to = vim_strnsave(to, (int)(arg - to));
     if (from_noamp != NULL && to != NULL)
     {
+ menu_translate_tab_and_shift(from);
+ menu_translate_tab_and_shift(to);
+ menu_unescape_name(from);
+ menu_unescape_name(to);
  tp[menutrans_ga.ga_len].from = from;
  tp[menutrans_ga.ga_len].from_noamp = from_noamp;
  tp[menutrans_ga.ga_len].to = to;
***************
*** 2476,2479 ****
--- 2521,2566 ----
  }
  #endif /* FEAT_MULTI_LANG */
 
+ /*
+  * Unescape the name in the translate dictionary table.
+  */
+     static void
+ menu_unescape_name(name)
+     char_u *name;
+ {
+     char_u  *p;
+
+     for (p = name; *p && *p != '.'; mb_ptr_adv(p))
+ if (*p == '\\')
+    STRMOVE(p, p + 1);
+ }
+
+ /*
+  * Isolate the menu name.
+  * Skip the menu name, and translate <Tab> into a real TAB.
+  */
+     static char_u *
+ menu_translate_tab_and_shift(arg_start)
+     char_u *arg_start;
+ {
+     char_u *arg = arg_start;
+
+     while (*arg && !vim_iswhite(*arg))
+     {
+ if ((*arg == '\\' || *arg == Ctrl_V) && arg[1] != NUL)
+    arg++;
+ else if (STRNICMP(arg, "<TAB>", 5) == 0)
+ {
+    *arg = TAB;
+    STRMOVE(arg + 1, arg + 5);
+ }
+ arg++;
+     }
+     if (*arg != NUL)
+ *arg++ = NUL;
+     arg = skipwhite(arg);
+
+     return arg;
+ }
+
  #endif /* FEAT_MENU */
*** ../vim-7.2.431/src/structs.h 2009-09-18 17:24:54.000000000 +0200
--- src/structs.h 2010-05-14 22:21:50.000000000 +0200
***************
*** 232,238 ****
  {
      wininfo_T *wi_next; /* next entry or NULL for last entry */
      wininfo_T *wi_prev; /* previous entry or NULL for first entry */
!     win_T *wi_win; /* pointer to window that did set wi_lnum */
      pos_T wi_fpos; /* last cursor position in the file */
      int wi_optset; /* TRUE when wi_opt has useful values */
      winopt_T wi_opt; /* local window options */
--- 232,238 ----
  {
      wininfo_T *wi_next; /* next entry or NULL for last entry */
      wininfo_T *wi_prev; /* previous entry or NULL for first entry */
!     win_T *wi_win; /* pointer to window that did set wi_fpos */
      pos_T wi_fpos; /* last cursor position in the file */
      int wi_optset; /* TRUE when wi_opt has useful values */
      winopt_T wi_opt; /* local window options */
***************
*** 2207,2214 ****
  {
      int modes;    /* Which modes is this menu visible for? */
      int enabled;    /* for which modes the menu is enabled */
!     char_u *name;    /* Name of menu */
!     char_u *dname;    /* Displayed Name (without '&') */
      int mnemonic;    /* mnemonic key (after '&') */
      char_u *actext;    /* accelerator text (after TAB) */
      int priority;    /* Menu order priority */
--- 2207,2220 ----
  {
      int modes;    /* Which modes is this menu visible for? */
      int enabled;    /* for which modes the menu is enabled */
!     char_u *name;    /* Name of menu, possibly translated */
!     char_u *dname;    /* Displayed Name ("name" without '&') */
! #ifdef FEAT_MULTI_LANG
!     char_u *en_name;    /* "name" untranslated, NULL when "name"
!     * was not translated */
!     char_u *en_dname;    /* "dname" untranslated, NULL when "dname"
!     * was not translated */
! #endif
      int mnemonic;    /* mnemonic key (after '&') */
      char_u *actext;    /* accelerator text (after TAB) */
      int priority;    /* Menu order priority */
*** ../vim-7.2.431/src/version.c 2010-05-14 21:19:16.000000000 +0200
--- src/version.c 2010-05-14 22:19:39.000000000 +0200
***************
*** 683,684 ****
--- 683,686 ----
  {   /* Add new patch number below this line */
+ /**/
+     432,
  /**/

--
It is hard to understand how a cemetery raised its burial
cost and blamed it on the cost of living.

 /// Bram Moolenaar -- [hidden email] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
Reply | Threaded
Open this post in threaded view
|

Re: Patch 7.2.432

Edward L. Fox
+bezetek

On Sat, May 15, 2010 at 04:25, Bram Moolenaar <[hidden email]> wrote:
>
> Patch 7.2.432
> Problem:    When menus are translated they can only be found by the translated
>            name.  That makes ":emenu" difficult to use.
> Solution:   Store the untranslated name and use it for completion and :emenu.
>            (Edward L. Fox / Liang Peng / Bezetek James)
> Files:      src/menu.c, src/structs.h

To Bram: Thanks a lot for reviewing and including this patch.

To Liang: Big congratulations for that your first patch got accepted
by Vim.  And, many thanks for your interests in open source projects.
Now you should understand that contributing to Open Source projects is
not that difficult as you thought.  Just keep trying and I'm sure that
many people will benefit from your enthusiasm and efforts.

A few things to verify:

1. "Liang Peng" and "Bezetek James" is the same person.  In my
original mail I said "Liang Peng (alias Bezetek James)", so Liang Peng
is the only author of this patch and Bezeteck James is not considered
as "co-author".  He can choose a more preferable alias and stick to it
in his later patches.

2. Liang made the whole patch himself.  I only did some code review
for him and gave him some advices.  So actually I'm not one of the
authors of this patch.  Even if I am treated as a co-author, I should
be the second author.  Maybe the order of names is not a very
important thing, I just want to make sure Liang can receive enough
encouragement that he deserves, as this is his first time contributing
to open source project.

>
>
> [...]


Best regards,


Edward

--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
Reply | Threaded
Open this post in threaded view
|

Re: Patch 7.2.432

John Marriott-2

Hi all,

This patch fails to compile on Windows (but I suspect the problem is not
restricted that platform) if FEAT_MULTI_LANG is not defined:

<snip>
gcc -c -Iproto -DWIN32 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400
-DHAVE_PATHDEF -DFEAT_BIG -DFEAT_MBYTE -pipe -w -march=native -Wall -O3
-fomit-frame-pointer -freg-struct-return -s menu.c -o obj/menu.o
menu.c: In function 'get_menu_name':
menu.c:1343: error: 'should_advance' undeclared (first use in this function)
menu.c:1343: error: (Each undeclared identifier is reported only once
menu.c:1343: error: for each function it appears in.)
menu.c: In function 'get_menu_names':
menu.c:1404: error: 'should_advance' undeclared (first use in this function)
menu.c: In function 'menu_name_equal':
menu.c:1509: error: 'vimmenu_T' has no member named 'en_name'
menu.c:1510: error: 'vimmenu_T' has no member named 'en_name'
menu.c:1511: error: 'vimmenu_T' has no member named 'en_dname'
make: *** [obj/menu.o] Error 1
</snip>

The attached patch seems to fix it.

Cheers
John

--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

menu.c.diff (1K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Patch 7.2.432

Bezetek James

 Sorry for this mistake, Thanks for your patch !
 
 
2010/5/16 John Marriott <[hidden email]>

Hi all,

This patch fails to compile on Windows (but I suspect the problem is not restricted that platform) if FEAT_MULTI_LANG is not defined:

<snip>
gcc -c -Iproto -DWIN32 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 -DHAVE_PATHDEF -DFEAT_BIG -DFEAT_MBYTE -pipe -w -march=native -Wall -O3 -fomit-frame-pointer -freg-struct-return -s menu.c -o obj/menu.o
menu.c: In function 'get_menu_name':
menu.c:1343: error: 'should_advance' undeclared (first use in this function)
menu.c:1343: error: (Each undeclared identifier is reported only once
menu.c:1343: error: for each function it appears in.)
menu.c: In function 'get_menu_names':
menu.c:1404: error: 'should_advance' undeclared (first use in this function)
menu.c: In function 'menu_name_equal':
menu.c:1509: error: 'vimmenu_T' has no member named 'en_name'
menu.c:1510: error: 'vimmenu_T' has no member named 'en_name'
menu.c:1511: error: 'vimmenu_T' has no member named 'en_dname'
make: *** [obj/menu.o] Error 1
</snip>

The attached patch seems to fix it.

Cheers
John


--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
Reply | Threaded
Open this post in threaded view
|

Re: Patch 7.2.432

Bram Moolenaar
In reply to this post by John Marriott-2

John Marriott wrote:

> This patch fails to compile on Windows (but I suspect the problem is not
> restricted that platform) if FEAT_MULTI_LANG is not defined:
>
> <snip>
> gcc -c -Iproto -DWIN32 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400
> -DHAVE_PATHDEF -DFEAT_BIG -DFEAT_MBYTE -pipe -w -march=native -Wall -O3
> -fomit-frame-pointer -freg-struct-return -s menu.c -o obj/menu.o
> menu.c: In function 'get_menu_name':
> menu.c:1343: error: 'should_advance' undeclared (first use in this function)
> menu.c:1343: error: (Each undeclared identifier is reported only once
> menu.c:1343: error: for each function it appears in.)
> menu.c: In function 'get_menu_names':
> menu.c:1404: error: 'should_advance' undeclared (first use in this function)
> menu.c: In function 'menu_name_equal':
> menu.c:1509: error: 'vimmenu_T' has no member named 'en_name'
> menu.c:1510: error: 'vimmenu_T' has no member named 'en_name'
> menu.c:1511: error: 'vimmenu_T' has no member named 'en_dname'
> make: *** [obj/menu.o] Error 1
> </snip>
>
> The attached patch seems to fix it.

Thanks!

--
hundred-and-one symptoms of being an internet addict:
42. Your virtual girlfriend finds a new net sweetheart with a larger bandwidth.

 /// Bram Moolenaar -- [hidden email] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php