【发布时间】:2011-03-11 15:40:43
【问题描述】:
自 R2009b 以来,MATLAB 已通过其Keyboard Shortcuts Preferences 提供了惊人的可自定义键盘快捷键。这对于在 Mac 上使用命令和控制自定义快捷方式非常有效。
不幸的是,这些键绑定似乎无法覆盖 MATLAB 的内置字符映射。例如,如果我将 option-f 定义为 cursor-next-word (a la emacs),它会接受绑定。点击组合键确实可以将光标正确地移动到下一个单词,但它还会打印ƒ 字符!我相信这是来自字符映射(也许与输入映射相反?)。 EditorMacro 和 KeyBindings 都无法覆盖此行为。
我偶然发现了this answer from a tangentially related question,这给了我希望。简而言之,他定义了一个 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 和 ƒ 字符,就像以前一样。但是,如果我从首选项中禁用 cursor-next-word 绑定,那么我会得到 both ƒ 和 ^!事实上,即使我使用像pressed F 这样的简单操作,KeyReplacementAction 也不会替换该操作,而是增强它。这种行为似乎是 OS X 上的 MATLAB 独有的。
似乎我只是没有覆盖正确的键盘映射。我尝试过深入研究 Java 运行时,但我对事件分派模型不够熟悉,不知道下一步该往哪里看。也许在 Java 的操作系统级键盘映射中有些东西?
编辑:我已经做了更多的挖掘工作。似乎 Mac 版本的 MATLAB 没有正确尊重 keyEvent 的“消费”属性。我可以将 KeyReplacementAction 附加到 inputMap 或 keymap,在这两种情况下我都增加了键绑定而不是替换它。我使用反射对 AWTEvents 的 consume() 方法进行了“取消保护”,但效果与之前相同。
在堆栈跟踪之后,似乎 keyEvent 正在下降到 javax.swing.KeyboardManager 的实例。看起来我应该能够在 KeyboardManager 中取消绑定击键,但我不知道如何从我拥有的 MATLAB 句柄访问实例。也许对 Swing 的事件模型和 Java 调试器更熟悉的人可以走得更远。
编辑 2:flolo 的回答促使我研究 X11 的键盘映射。几点注意事项:
- Matlab 似乎不尊重
~/.Xmodmap或任何当前加载的 modmap。 - Matlab 使用
$XKEYSYMDB环境变量(如果它在启动时存在)。否则,它会从$MATLAB/X11/app-defaults/XKeysymDB加载它。 - 整个
$MATLAB/X11/app-defaults/目录看起来很有趣;也许那里的一些黑客可以使这项工作? - Mac 上的 X11 键盘映射在哪里? MATLAB 如何切换到国际键盘布局?
编辑 3:嗯,我认为 X11 是红鲱鱼。 lsof -c MATLAB 表明它正在访问/System/Library/Keyboard Layouts/AppleKeyboardLayouts.bundle。现在正在努力……
编辑 4:MATLAB 确实使用系统键盘布局。我创建了一个没有任何绑定的 R.M. 建议。这似乎奏效了——MATLAB 运行正常。不幸的是,它还破坏了我在所有其他程序中的自定义 Cocoa 键绑定。关闭,但没有雪茄。 (实际上,R.M. 赢得了 +500 的赏金,因为我短暂地认为它已经奏效了……直到我尝试撰写我的祝贺评论并发现我无法像往常一样浏览文本字段。)
【问题讨论】:
-
我已向 MathWorks 提交了“增强请求”。不过,我仍然希望看到一个未记录的解决方案。
-
我会更加重视这个问题。
:) -
您是否更接近解决您的问题?我想知道,因为我也有一个 mac。
-
@d'o-o'b:不,自上周末以来,我一直没有机会在这方面工作太多。如果我发现解决方案,我一定会更新它。我仍然在这里抱有希望;看到这种赏金萎靡不振肯定是一种耻辱……
-
@d'o-o'b:您应该查看this bounty FAQ,以更加熟悉奖励赏金的工作原理。特别是,没有办法让你的赏金回来。如果您将其授予您自己的答案,那么您将一无所获。赏金就这样消失了。如果您不授予赏金,则在赏金期结束时,一半的赏金将自动授予在赏金开始后给出的最高投票答案至少 +2 分(这将是目前 R.M.s 的答案)。
标签: java swing matlab keyboard-shortcuts