Связывание клавиш цифровой клавиатуры с Emacs 24 и OS / X - PullRequest
6 голосов
/ 21 апреля 2011

В настоящее время я пробую Git HEAD версию Emacs 24 для OS / X, как описано в этой статье:

http://www.viget.com/extend/emacs-24-rails-development-environment-from-scratch-to-productive-in-5-minu/

Я бы хотел связать некоторые из клавиш цифровой клавиатуры расширенной клавиатуры Macintosh с функциями Emacs, но, похоже, это не работает. Когда я делаю «c-h k», чтобы проверить детали клавиш, нажатия клавиш не распознаются. То же самое, если я обращаюсь к ним в параметре (глобальный набор ключей (kbd "kp-minus") ...).

Это проблема с использованием версии Emacs 24 для разработки, или это что-то из аппаратного обеспечения клавиатуры Macintosh и как Emacs это видит? Кто-нибудь может посоветовать лучший способ сделать это?

Заранее спасибо,

Stu

Ответы [ 4 ]

1 голос
/ 19 мая 2011

У меня была та же проблема с клавишами клавиатуры при сборке emacs 24. Проблема та же с emacs 23. Я исправил код emacs 24 следующим образом, чтобы исправить проблему. Не уверен, что это хорошее решение, но оно мне подходит.

index 91f0cbb..d537ee3 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -87,6 +87,7 @@ static unsigned convert_ns_to_X_keysym[] =
   NSBeginFunctionKey,           0x58,
   NSSelectFunctionKey,          0x60,
   NSPrintFunctionKey,           0x61,
+  NSClearLineFunctionKey,       0x0B,
   NSExecuteFunctionKey,         0x62,
   NSInsertFunctionKey,          0x63,
   NSUndoFunctionKey,            0x65,
@@ -134,6 +135,35 @@ static unsigned convert_ns_to_X_keysym[] =
   0x1B,                0x1B   /* escape */
 };

+static unsigned convert_nskeypad_to_X_keysym[] =
+{
+  /* Arrow keys are both function and keypad keys */
+  NSLeftArrowFunctionKey,       0x51,
+  NSUpArrowFunctionKey,         0x52,
+  NSRightArrowFunctionKey,      0x53,
+  NSDownArrowFunctionKey,       0x54,
+
+  0x41,                         0xAE,  /* KP_Decimal */
+  0x43,                         0xAA,  /* KP_Multiply */
+  0x45,                         0xAB,  /* KP_Add */
+  0x4B,                         0xAF,  /* KP_Divide */
+  0x4E,                         0xAD,  /* KP_Subtract */
+  0x51,                         0xBD,  /* KP_Equal */
+  0x52,                         0xB0,  /* KP_0 */
+  0x53,                         0xB1,  /* KP_1 */
+  0x54,                         0xB2,  /* KP_2 */
+  0x55,                         0xB3,  /* KP_3 */
+  0x56,                         0xB4,  /* KP_4 */
+  0x57,                         0xB5,  /* KP_5 */
+  0x58,                         0xB6,  /* KP_6 */
+  0x59,                         0xB7,  /* KP_7 */
+  0x5B,                         0xB8,  /* KP_8 */
+  0x5C,                         0xB9,  /* KP_9 */
+
+  // The enter key is on the keypad but modifier isnt set
+  NSEnterCharacter,        0x8D
+};
+

 static Lisp_Object Qmodifier_value;
 Lisp_Object Qalt, Qcontrol, Qhyper, Qmeta, Qsuper, Qnone;
@@ -1924,13 +1954,33 @@ ns_convert_key (unsigned code)
   unsigned keysym;
   /* An array would be faster, but less easy to read. */
   for (keysym = 0; keysym < last_keysym; keysym += 2)
-    if (code == convert_ns_to_X_keysym[keysym])
-      return 0xFF00 | convert_ns_to_X_keysym[keysym+1];
+      
+      if (code == convert_ns_to_X_keysym[keysym]) {
+        return 0xFF00 | convert_ns_to_X_keysym[keysym+1];
+      }
   return 0;
 /* if decide to use keyCode and Carbon table, use this line:
      return code > 0xff ? 0 : 0xFF00 | ns_keycode_to_xkeysym_table[code]; */
 }

+static unsigned
+ns_convert_keypad (unsigned code)
+/* --------------------------------------------------------------------------
+    Internal call used by NSView-keyDown.
+   -------------------------------------------------------------------------- */
+{
+  const unsigned last_keysym = (sizeof (convert_nskeypad_to_X_keysym)
+                                / sizeof (convert_nskeypad_to_X_keysym[0]));
+  unsigned keysym;
+  /* An array would be faster, but less easy to read. */
+  for (keysym = 0; keysym < last_keysym; keysym += 2) {
+      if (code == convert_nskeypad_to_X_keysym[keysym]) {
+        return 0xFF00 | convert_nskeypad_to_X_keysym[keysym+1];
+      }
+  }
+  return 0;
+}
+

 char *
 x_get_keysym_name (int keysym)
@@ -4503,10 +4553,10 @@ ns_term_shutdown (int sig)
   Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (emacsframe);
   int code;
   unsigned fnKeysym = 0;
-  int flags;
   static NSMutableArray *nsEvArray;
   static BOOL firstTime = YES;
   int left_is_none;
+  unsigned int flags = [theEvent modifierFlags];

   NSTRACE (keyDown);

@@ -4550,9 +4600,13 @@ ns_term_shutdown (int sig)
       code = ([[theEvent charactersIgnoringModifiers] length] == 0) ?
         0 : [[theEvent charactersIgnoringModifiers] characterAtIndex: 0];
       /* (Carbon way: [theEvent keyCode]) */
+      

       /* is it a "function key"? */
-      fnKeysym = ns_convert_key (code);
+      if (code < 0x00ff && (flags & NSNumericPadKeyMask) )
+   fnKeysym = ns_convert_keypad([theEvent keyCode]);
+      else
+   fnKeysym = ns_convert_key(code);
       if (fnKeysym)
         {
           /* COUNTERHACK: map 'Delete' on upper-right main KB to 'Backspace',
@@ -4565,7 +4619,6 @@ ns_term_shutdown (int sig)

       /* are there modifiers? */
       emacs_event->modifiers = 0;
-      flags = [theEvent modifierFlags];

       if (flags & NSHelpKeyMask)
           emacs_event->modifiers |= hyper_modifier;
0 голосов
/ 14 ноября 2011

Вот перевод Emacs 23.3 с патчем Emacs 24 MD Маркионна, размещенный на этой странице.

--- nsterm-orig.m   2011-11-13 17:51:47.000000000 -0500
+++ nsterm.m    2011-11-13 17:39:56.000000000 -0500
@@ -87,6 +87,7 @@
   NSBeginFunctionKey,           0x58,
   NSSelectFunctionKey,          0x60,
   NSPrintFunctionKey,           0x61,
+  NSClearLineFunctionKey,       0x0B,
   NSExecuteFunctionKey,         0x62,
   NSInsertFunctionKey,          0x63,
   NSUndoFunctionKey,            0x65,
@@ -134,6 +135,33 @@
   0x1B,                         0x1B   /* escape */
 };

+static unsigned convert_nskeypad_to_X_keysym[] =
+{
+  /* Arrow keys are both function and keypad keys */
+  NSLeftArrowFunctionKey,       0x51,
+  NSUpArrowFunctionKey,         0x52,
+  NSRightArrowFunctionKey,      0x53,
+  NSDownArrowFunctionKey,       0x54,
+
+  0x41,                         0xAE,  /* KP_Decimal */
+  0x43,                         0xAA,  /* KP_Multiply */
+  0x45,                         0xAB,  /* KP_Add */
+  0x4B,                         0xAF,  /* KP_Divide */
+  0x4E,                         0xAD,  /* KP_Subtract */
+  0x51,                         0xBD,  /* KP_Equal */
+  0x52,                         0xB0,  /* KP_0 */
+  0x53,                         0xB1,  /* KP_1 */
+  0x54,                         0xB2,  /* KP_2 */
+  0x55,                         0xB3,  /* KP_3 */
+  0x56,                         0xB4,  /* KP_4 */
+  0x57,                         0xB5,  /* KP_5 */
+  0x58,                         0xB6,  /* KP_6 */
+  0x59,                         0xB7,  /* KP_7 */
+  0x5B,                         0xB8,  /* KP_8 */
+  0x5C,                         0xB9,  /* KP_9 */
+  // The enter key is on the keypad but modifier isnt set
+  NSEnterCharacter,        0x8D
+};

 /* Lisp communications */
 Lisp_Object ns_input_file, ns_input_font, ns_input_fontsize, ns_input_line;
@@ -1842,6 +1870,23 @@
      return code > 0xff ? 0 : 0xFF00 | ns_keycode_to_xkeysym_table[code]; */
 }

+static unsigned
+ns_convert_keypad (unsigned code)
+/* --------------------------------------------------------------------------
+    Internal call used by NSView-keyDown.
+   -------------------------------------------------------------------------- */
+{
+  const unsigned last_keysym = (sizeof (convert_nskeypad_to_X_keysym)
+                                / sizeof (convert_nskeypad_to_X_keysym[0]));
+  unsigned keysym;
+  /* An array would be faster, but less easy to read. */
+  for (keysym = 0; keysym < last_keysym; keysym += 2) {
+      if (code == convert_nskeypad_to_X_keysym[keysym]) {
+        return 0xFF00 | convert_nskeypad_to_X_keysym[keysym+1];
+      }
+  }
+  return 0;
+}

 char *
 x_get_keysym_name (int keysym)
@@ -4349,7 +4394,7 @@
   struct ns_display_info *dpyinfo = FRAME_NS_DISPLAY_INFO (emacsframe);
   int code;
   unsigned fnKeysym = 0;
-  int flags;
+  unsigned int flags = [theEvent modifierFlags];
   static NSMutableArray *nsEvArray;
   static BOOL firstTime = YES;

@@ -4397,6 +4442,9 @@
       /* (Carbon way: [theEvent keyCode]) */

       /* is it a "function key"? */
+      if (code < 0x00ff && (flags & NSNumericPadKeyMask) )
+        fnKeysym = ns_convert_keypad([theEvent keyCode]);
+      else
       fnKeysym = ns_convert_key (code);
       if (fnKeysym)
         {
@@ -4410,8 +4458,6 @@

       /* are there modifiers? */
       emacs_event->modifiers = 0;
-      flags = [theEvent modifierFlags];
-
       if (flags & NSHelpKeyMask)
           emacs_event->modifiers |= hyper_modifier;
0 голосов
/ 24 мая 2011

Проблема исключительно для какао-варианта emacs. Проблема не существовала в версии Carbon, то есть emacs22. Я обновил патч, который выложил выше, который теперь работает лучше. Скорее всего, он будет работать с кодовой базой Emacs23 с использованием XCode 3. Если вы используете XCode 4, как и я, вам нужно будет использовать кодовую базу Emacs24, которая в настоящее время доступна только в репозитории GIT. Вот очень хорошее описание сборки Emacs24 через XCode 4

[http://mikbe.tk/2011/04/18/build-emacs-with-xcode-4/][1]

0 голосов
/ 04 мая 2011

Я пробовал это с более старым Emacs:

Это GNU Emacs 22.2.1 (powerpc-apple-darwin9.5.0, GTK + версия 2.10.13)

Построен из коллекции портов с + gtk + x11 и используется с сервером X11 XQuartz 2.1.6 (xorg-server 1.4.2-apple33), когда я смотрю с C-h l, я получаю

<kp-0> ... <kp-9>

для номеров. и

<kp-enter> <kp-subtract> <kp-multiply> <kp-divide> <kp-equal>

Для других ключей.

Я бы предложил собрать последние версии Emacs из MacPorts с опциями + gtk и + x11.

Тогда я бы взял последнюю версию XQuartz и запустил Emacs поверх X11 (я предпочитаю это более естественным сборкам, потому что тогда Emacs всегда ведет себя одинаково, независимо от того, работает ли он удаленно на другой ОС (обычно через 1020 *) или локально.

Я обновлю свои порты до последней версии Emacs на следующей неделе и добавлю результат для них.

...