С R2009b у MATLAB были великолепно настраиваемые сочетания клавиш с помощью "Настройки ярлыков клавиатуры" . Это очень хорошо подходит для настройки ярлыков с помощью команды и управления на Mac.
К сожалению, эти привязки клавиш, похоже, не могут переопределить встроенную карту символов MATLAB. Например, если я определяю параметр -f как cursor-next-word
(a la 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
};
К сожалению, после запуска кода нажатие опции-f дает cursor-next-word
и символ ƒ
, как и раньше. Однако, если я отключу привязку cursor-next-word
от предпочтений, я получаю как ƒ
, так и ^
! Действительно, даже если я использую простое действие вроде pressed F
, KeyReplacementAction не заменяет действие, а увеличивает его. Похоже, что это поведение уникально для MATLAB на OS X.
Кажется, я просто не переопределяю правильную раскладку. Я пробовал копать через среду выполнения Java, но я недостаточно знаком с моделью отправки событий, чтобы узнать, где искать дальше. Возможно, что-то в Java-клавиатуре на уровне ОС?
Изменить. С тех пор я немного поработал. Похоже, что версия Mac MATLAB должным образом не учитывает свойство "потребляемого" ключа. Я могу привязать KeyReplacementAction к inputMap
или keymap
, и в обоих случаях я увеличиваю привязку клавиш вместо их замены. Я использовал отражение для "снятия защиты" метода consume()
для AWTEvents, но эффект был таким же, как и раньше.
После трассировки стека, кажется, что keyEvent проваливается к экземпляру javax.swing.KeyboardManager
. Похоже, что я должен иметь возможность развязывать нажатия клавиш в KeyboardManager, но я не могу понять, как получить доступ к экземпляру с помощью ручек MATLAB, которые у меня есть. Возможно, кто-то, более знакомый с моделью событий Swing и отладчиком Java, может пройти дальше.
Изменить 2: flolo ответ заставил меня взглянуть на раскладки клавиатуры X11. Несколько примечаний:
- Matlab, похоже, не уважает
~/.Xmodmap
или любые загруженные в текущий момент модемы. - Matlab использует переменную среды
$XKEYSYMDB
, если она существует при запуске. В противном случае он загружает его из$MATLAB/X11/app-defaults/XKeysymDB
. - Весь каталог
$MATLAB/X11/app-defaults/
выглядит очень интересным; возможно, некоторые хакеры могут сделать эту работу? - Где находятся раскладки клавиатуры X11 на Mac? Как MATLAB переключается на международные раскладки клавиатуры?
Изменить 3: Хм, я думаю, что X11 - это красная селедка. lsof -c MATLAB
показывает, что он обращается к /System/Library/Keyboard Layouts/AppleKeyboardLayouts.bundle
. Работая над этим сейчас...
Изменить 4: MATLAB действительно использует раскладку системной клавиатуры. Я создал один без каких-либо привязок в качестве R.M.. Это, похоже, сработало - MATLAB ведет себя правильно. К сожалению, он также нарушает мои пользовательские привязки Cocoa для всех других программ. Близко, но не сигара. (На самом деле достаточно близко, что RM выиграл +500 баунти из-за короткой мысли, что это сработало... пока я не попытался составить свой поздравительный комментарий и обнаружил, что я не мог перемещаться по текстовому полю, как обычно.)