Начиная с 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. Несколько примечаний:
~ / .Xmodmap
или любые загруженные в настоящее время карты модов. $ XKEYSYMDB
, если она существует при запуске. В противном случае он загружает его из $ MATLAB / X11 / app-defaults / XKeysymDB
. $ MATLAB / X11 / app-defaults /
выглядит очень интересно; Возможно, это сработает с помощью какого-нибудь хакера? Edit 3 : Хм, я думаю, что X11 - отвлекающий маневр. lsof -c MATLAB
показывает, что он обращается к / System / Library / Keyboard Layouts / AppleKeyboardLayouts.bundle
. Работаем над этим сейчас…
Edit 4 : MATLAB действительно использует раскладку системной клавиатуры. Я создал его без каких-либо привязок, как предложил RM . Это сработало - MATLAB действительно ведет себя правильно. К сожалению, это также нарушает мои пользовательские привязки клавиш Cocoa во всех других программах. Близко, но не сигара. (Достаточно близко, что RM выиграл награду +500 из-за краткой мысли, что это сработало ... пока я не попытался составить свой поздравительный комментарий и не обнаружил, что не могу перемещаться по текстовому полю, как обычно.)