Начиная с 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
};
to:
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 Keymap OS-level?
Edit : С тех пор я еще немного покопался.Похоже, что версия MATLAB для Mac неправильно соблюдает свойство «потреблено» keyEvent.Я могу прикрепить действие KeyReplacementAction либо к inputMap
, либо к keymap
, и в обоих случаях я увеличиваю привязку клавиш вместо ее замены.Я использовал отражение, чтобы «снять защиту» с consume()
метода для 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
.Работая над этим сейчас…
Редактировать 4 : MATLAB действительно использует раскладку системной клавиатуры.Я создал один без каких-либо привязок, как предложено RM .Похоже, это работает - MATLAB ведет себя правильно.К сожалению, это также нарушает мои пользовательские сочетания клавиш Какао во всех других программах.Близко, но не сигара.(На самом деле достаточно близко, что RM выиграл награду +500 из-за краткой мысли, что она сработала ... пока я не попытался написать свой поздравительный комментарий и не обнаружил, что не могу перемещаться по текстовому полю, как обычно.)