Включение сочетаний клавиш опций в MATLAB для Mac

Начиная с R2009b, MATLAB имеет чудесно настраиваемые сочетания клавиш с помощью его Keyboard Shortcuts Preferences . Это очень хорошо работает для настройки ярлыков с использованием команд и управления на Mac.

К сожалению, эти сочетания клавиш, похоже, не могут переопределить встроенную карту символов MATLAB. Например, если я определяю option-f как cursor-next-word (а-ля emacs), он принимает привязку. Нажатие комбинации клавиш правильно перемещает курсор к следующему слову, но дополнительно печатает символ ƒ ! Я считаю, что это из карты символов (возможно, в отличие от карты ввода?). Ни EditorMacro , ни KeyBindings не могут изменить это поведение.

Я наткнулся на этот ответ из косвенно связанного вопроса , который вселяет в меня надежду. Короче говоря, он определил класс Java, который может обрабатывать события клавиатуры и заменять их другим вводом нажатия клавиш. Однако решение работает только так, как предписано в Windows. Для работы на Mac потребовались следующие модификации:

Мне нужно было изменить коды клавиш, чтобы переназначить их «нажатие» в строке, например:

map = {
    '$' '^'
    '#' char(181)  % might be useful for text formatting
};

на:

map = {
    'alt pressed F' '^'
    'alt pressed B' char(181)  % might be useful for text formatting
};

К сожалению, после запуска кода нажатие option-f возвращает курсор-следующее-слово и символ ƒ , как и раньше. Однако, если я отключу привязку cursor-next-word в настройках, тогда я получаю и ƒ , и ^ ! В самом деле, даже если я использую простое действие, такое как нажатие F , KeyReplacementAction не заменяет действие, а скорее увеличивает его. Похоже, это поведение уникально для MATLAB в OS X.

Кажется, что я просто не отменяю правильную раскладку клавиатуры. Я пробовал покопаться в среде выполнения Java, но я недостаточно знаком с моделью отправки событий, чтобы знать, где искать дальше. Может быть, что-то в раскладке Java на уровне ОС?


Edit : С тех пор я немного покопался. Похоже, что версия MATLAB для Mac не соблюдает должным образом свойство «потреблено» для keyEvent. Я могу прикрепить KeyReplacementAction либо к inputMap , либо к раскладке , и в обоих случаях я увеличиваю привязку клавиш вместо ее замены. Я использовал отражение, чтобы «снять защиту» метода consumer () для AWTEvents, но эффект был таким же, как и раньше.

После трассировки стека кажется, что keyEvent переходит в экземпляр javax.swing.KeyboardManager . Похоже, я смогу отвязать нажатия клавиш в KeyboardManager, но я не могу понять, как получить доступ к экземпляру из имеющихся у меня дескрипторов MATLAB. Возможно, кто-нибудь, более знакомый с моделью событий Swing и отладчиком Java, сможет продвинуться дальше.


Edit 2 : flolo ответ побудил меня изучить раскладки клавиатуры X11. Несколько примечаний:

  • Matlab, похоже, не уважает ~ / .Xmodmap или любые загруженные в настоящее время карты модов.
  • Matlab использует переменную среды $ XKEYSYMDB , если она существует при запуске. В противном случае он загружает его из $ MATLAB / X11 / app-defaults / XKeysymDB .
  • Весь каталог $ MATLAB / X11 / app-defaults / выглядит очень интересно; Возможно, это сработает с помощью какого-нибудь хакера?
  • Где находятся раскладки клавиатуры X11 на Mac? Как MATLAB переключается на международные раскладки клавиатуры?

Edit 3 : Хм, я думаю, что X11 - отвлекающий маневр. lsof -c MATLAB показывает, что он обращается к / System / Library / Keyboard Layouts / AppleKeyboardLayouts.bundle . Работаем над этим сейчас…


Edit 4 : MATLAB действительно использует раскладку системной клавиатуры. Я создал его без каких-либо привязок, как предложил RM . Это сработало - MATLAB действительно ведет себя правильно. К сожалению, это также нарушает мои пользовательские привязки клавиш Cocoa во всех других программах. Близко, но не сигара. (Достаточно близко, что RM выиграл награду +500 из-за краткой мысли, что это сработало ... пока я не попытался составить свой поздравительный комментарий и не обнаружил, что не могу перемещаться по текстовому полю, как обычно.)

14
задан Community 23 May 2017 в 11:46
поделиться