diff --git a/src/nsmenu.m b/src/nsmenu.m
index b5d0821323..f985234643 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -498,9 +498,16 @@ - (NSMenuItem *)addItemWithWidgetValue: (void *)wvptr
       keyEq = [self parseKeyEquiv: wv->key];
 #ifdef NS_IMPL_COCOA
       /* macOS mangles modifier strings longer than one character.  */
-      if (keyEquivModMask == 0)
+      if (1 || keyEquivModMask == 0)
         {
-          title = [title stringByAppendingFormat: @" (%@)", keyEq];
+          if (wv->key)
+            {
+              const char *k = wv->key;
+              while (*k == ' ') k++;
+              title = [title stringByAppendingString:
+                               [NSString stringWithUTF8String: k]];
+            }
+          //title = [title stringByAppendingString: keyEq];
           item = [self addItemWithTitle: (NSString *)title
                                  action: @selector (menuDown:)
                           keyEquivalent: @""];
@@ -514,7 +521,7 @@ - (NSMenuItem *)addItemWithWidgetValue: (void *)wvptr
 #ifdef NS_IMPL_COCOA
         }
 #endif
-      [item setKeyEquivalentModifierMask: keyEquivModMask];
+      //[item setKeyEquivalentModifierMask: keyEquivModMask];
 
       [item setEnabled: wv->enabled];
 
@@ -556,14 +563,67 @@ - (void)fillWithWidgetValue: (void *)wvptr
 
 - (void)fillWithWidgetValue: (void *)wvptr
 {
-  widget_value *wv = (widget_value *)wvptr;
+  widget_value *first_wv = (widget_value *)wvptr;
+  NSFont *menuFont = [NSFont menuFontOfSize:0];
+  NSDictionary <NSString *, id> *attributes =
+    [NSDictionary dictionaryWithObject:menuFont forKey:NSFontAttributeName];
+  const char space_str[] = " ";
+  int space_bytes = sizeof space_str - 1;
+  NSSize spaceSize = [[NSString stringWithUTF8String: space_str]
+                       sizeWithAttributes:attributes];
+  CGFloat spaceWidth = spaceSize.width;
+  CGFloat maxNameWidth = 0;
+  CGFloat maxKeyWidth = 0;
+
+  for (widget_value *wv = first_wv; wv != NULL; wv = wv->next)
+    if (!menu_separator_name_p (wv->name))
+      {
+        NSString *name = [NSString stringWithUTF8String: wv->name];
+        NSSize nameSize = [name sizeWithAttributes: attributes];
+        CGFloat nameWidth = nameSize.width;
+        maxNameWidth = MAX(maxNameWidth, nameWidth);
+        if (wv->key)
+          {
+            const char *k = wv->key;
+            while (*k == ' ') k++;
+            NSString *key = [NSString stringWithUTF8String: k];
+            NSSize keySize = [key sizeWithAttributes: attributes];
+            CGFloat keyWidth = keySize.width;
+            maxKeyWidth = MAX(maxKeyWidth, keyWidth);
+          }
+      }
 
   /* clear existing contents */
   [self removeAllItems];
 
   /* add new contents */
-  for (; wv != NULL; wv = wv->next)
+  for (widget_value *wv = first_wv; wv != NULL; wv = wv->next)
     {
+      if (wv->key && !menu_separator_name_p (wv->name))
+        {
+          NSString *name = [NSString stringWithUTF8String: wv->name];
+          NSSize nameSize = [name sizeWithAttributes: attributes];
+          CGFloat nameWidth = nameSize.width;
+          const char *k = wv->key;
+          while (*k == ' ') k++;
+          NSString *key = [NSString stringWithUTF8String: k];
+          NSSize keySize = [key sizeWithAttributes: attributes];
+          CGFloat keyWidth = keySize.width;
+          CGFloat padWidth = (maxNameWidth - nameWidth)
+                             + (maxKeyWidth - keyWidth);
+          int name_len = strlen (wv->name);
+          int extra_spaces = 7;
+          int pad_len = lround(padWidth / spaceWidth + extra_spaces);
+          Lisp_Object s = make_uninit_string (name_len + pad_len * space_bytes);
+          memcpy (SSDATA (s), wv->name, name_len);
+          if (space_bytes == 1)
+            memset (SDATA (s) + name_len, space_str[0], pad_len);
+          else
+            for (int i = 0; i < pad_len; i++)
+              memcpy (SDATA (s) + name_len + i * space_bytes, space_str,
+                      space_bytes);
+          wv->name = SSDATA (s);
+        }
       NSMenuItem *item = [self addItemWithWidgetValue: wv];
 
       if (wv->contents)
