我想在涉及键(“windows”键)的eclipse(3.7.2)中设置一些键绑定,但是当我按下它时它似乎没有拾取那个修饰键。为什么?我该怎么做才能检测到它?
3 回答
Eclipse 不挂钩 Windows 键。您唯一能做的就是使用工具将 Windows 键重新绑定到例如CTRL++ (如果您不使用它)ALT。SHIFT像 AutoHotkey这样的工具可以完成这项工作。
然后,每当您按下 windows 键时,就好像您按下了++ CTRL,然后您可以使用它来绑定您想要的热键。ALTSHIFT
您在问题中标记了“linux”,所以我假设您使用的是 Linux 和 X ...
所以,要在 Eclipse 中使用 Super,首先你必须发现你是否有一个 Super,如果没有,就做一个。在 xmodmap 的主题上,剩下的部分可能比你需要的要多得多。
首先要做的是查看您是否已经拥有 Super 修饰键。运行“xmodmap -pm”来查看你当前的修饰符是什么。这是一个常见的输出:
$ xmodmap -pm
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
在上面的输出中,一堆键已经映射到 Super,(十六进制)键码为 0x85、0x86、0xce 和 0xcf。要查看键盘上的任何东西是否恰好是这些键之一(并非总是如此),请在终端中运行“xev”并将鼠标指针移动到“xev”的大部分为白色的输入窗口中,然后尝试不同的键。键的典型输出如下所示(尝试 control 和 shift 以查看示例) - 特别注意带有键码和键符号名称的第三行,此处为 64 和 Meta_L。
一定要试试你的“Windows”键,看看它目前有什么键码和映射。
KeyPress event, serial 42, synthetic NO, window 0xe600003,
root 0x6b6, subw 0x0, time 2232472454, (-1,167), root:(871,683),
state 0x0, keycode 64 (keysym 0xffe7, Meta_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
找到“keycode”部分并将其转换为基数 16。如果您点击了其中一个 Supers,则转换后的代码将匹配其中一个(在上面的示例中为四个)十六进制键码,并显示 Super_L 或 Super_R 而不是Meta_L 如上所示。
如果您没有任何键映射到 Super,或者您的键盘上没有任何键,则使用 xev 查找您要用于 Super 的键的键码(CapsLock 对于某些人来说可能是一个不错的选择伙计们),然后使用 xmodmap 或桌面 UI 中的其他工具进行设置。后者不在此回复的范围内,但使用 xmodmap,您可以在主目录中创建一个名为 .Xmodmap 的文件,其中包含以下内容:
! note: replace the 0xff below with your *actual* Super_L key's keycode.
! note: whether to use mod3 or mod4 depends on your environment.
keycode 0xff = Super_L
clear mod4
add mod4 = Super_L
使用“xmodmap ~/.Xmodmap”应用结果。许多 X 初创公司会自动为您应用这些。如果您使用的是 Ubuntu Unity,请在 Dash 中查找启动应用程序并为同一命令添加一个。我不确定“~”在上下文中是否有效,您可能想尝试 $HOME 或者只是在那里使用您的主目录。它最终在 ~/.config/autostart/xmodmap.desktop 中生成一个文件,如下所示(erlkonig = me; 把你的家放在里面):
$ cat ./.config/autostart/xmodmap.desktop
[Desktop Entry]
Type=Application
Exec=/usr/bin/xmodmap /home/erlkonig/.Xmodmap
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=Xmodmap Keymap Settings
Name=Xmodmap Keymap Settings
Comment[en_US]=Set Keyboard Bindings
Comment=Set Keyboard Bindings
您可以使用“xmodmap -pm”或“xev”验证结果。这是我的环境从更复杂的设置中获得的前者的输出(这可能与您自己想要的不匹配)。
$ xmodmap -pm
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x7f)
control Control_L (0x25)
mod1 Meta_L (0x40), Meta_L (0xcd)
mod2 Alt_L (0x6c), Alt_L (0xcc)
mod3 Super_R (0x69), Super_L (0x85), Super_R (0x86), Super_L (0xce)
mod4 Hyper_L (0x42), Hyper_L (0xcf)
mod5 Num_Lock (0x4d)
Hyper 取代了 CapsLock(我已将其移至别处);我将它用于窗口管理器功能,例如 Hyper-f 用于“前置”窗口,Hyper-r 用于调整大小等。
对于另一个使用 xmodmap 可以实现的随机(ish)示例,这里有一个键映射,它将任何键码 78 映射到 Mode_switch,然后允许您将其与 '、"、` 和 ~ 组合以输入构成下一个元音的前缀有类似的变音符号。你也可以使用 Mode_switch 和 a 来获取 æ,d 来获取 ð,? 来获取 ¿,以及其他一些。
! note: 78 is probably not the keycode most would want here; pick your own :-)
keycode 78 = Mode_switch
! no mods shift mode-switch shift+mode-switch
keysym a = a A ae AE
keysym d = d D thorn THORN
keysym n = n N ntilde Ntilde
keysym o = o O oslash Oslash
keysym t = t T eth ETH
keysym s = s S ssharp
keysym 0 = 0 parenright degree
keysym 6 = 6 asciicircum dead_circumflex
keysym 8 = 8 asterisk multiply
keysym apostrophe = apostrophe quotedbl dead_acute dead_diaeresis
keysym grave = grave asciitilde dead_grave
keysym comma = comma less dead_cedilla guillemotleft
keysym period = period greater NoSymbol guillemotright
keysym slash = slash question NoSymbol questiondown
keysym 1 = 1 exclam NoSymbol exclamdown
keysym equal = equal plus notequal plusminus
有关更多信息,请使用“man xmodmap”。
我怀疑您的核心目标是在现有的控件和 alt 绑定之外创建键绑定。因此,例如,让 Windows-L 执行与 Control-L、Alt-L 或 Shift-L 不同的操作。
不幸的是,Linux 上的 Eclipse 似乎不支持 shift、control 和 alt 之外的修饰符(在 xmodmap 中是 mod1)。因此,您无需将 Windows 键映射到其他修饰符。合乎逻辑的选择是 mod4,但似乎 SWT 在非 Windows 平台上不支持 mod4。
在https://bugs.eclipse.org/bugs/show_bug.cgi?id=55236添加非 Windows mod4 支持存在一个错误。不幸的是,它被标记为“不会修复”一段时间了。我建议去那里投票并分享其他用户案例/重新打开它的原因,如果你有的话。