今天我发现Steven Losh 的这篇非常好的文章他在文中介绍了几种提高工作效率的键盘映射。其中包括左右 Shift 键的动态映射。
理念
当按下 Shift_L 或 Shift_R 而没有其他键时,它们分别映射到“(”和“)”,否则它们照常运行。
问题
他在 OSX 下完成了所有这些操作。我试图在 Linux 下实现同样的操作。没有直接的方法来实现这一点,因为据我所知,您不能使用 xmodmap 单独为 Shift_L 配置一个键,并在用作修饰键时为 Shift 配置另一个键。
我用 Google 搜索了一下,发现人们试图在 Windows 下做同样的事情,显然使用 AutoHotKey 就可以实现,但我没有找到任何适用于 Linux 的东西。
在Linux下有没有什么办法可以解决这个问题?
答案1
哇!用户 teika kazura 对原始问题的评论非常正确——这不仅是对那个问题的重复其他问题,但那里提供的答案(“使用卡普“)解决了这个问题!
在克隆 xcape repo 并进行编译之后(我必须先在我的 Fedora 机器上安装 libXtst-devel),我能够使用以下命令获得请求的精确行为:
xcape -e "Shift_L=parenleft;Shift_R=parenright"
经过粗略的测试,它似乎有效极其好。真棒!
其他选项
如果您使用 Shift 键作为鼠标修饰键(即,如果您曾经按住 Shift 键单击任何内容),则可能需要包含 xcape 的超时选项并找到一个合适的超时值,以便与鼠标结合使用的单独 Shift 按键不会生成虚假括号。摘自 xcape README:
-t <timeout ms>
如果您按住某个按键的时间超过此超时时间,xcape 将不会生成按键事件。默认值为 500 毫秒。
因此,通过添加一个-t
适合您的超时值的标志,您仍然可以使用鼠标进行 Shift 键单击,只要您按住 Shift 键至少 timeout ms
毫秒。
答案2
这是一个有趣的挑战,我同意 xinput 似乎不太适合这个挑战。我花了一些时间摆弄 xmodmap 的功能,结果非常令人沮丧关闭实现您想要做的事情...但实际上无需努力即可实现。
使用 xmodmap,可以将 parenleft 指定为左移键上的移位键符号:
xmodmap -e 'keysym Shift_L = Shift_L parenleft Shift_L parenleft'
哪个有点至少在我的 Fedora 17 机器上测试时,Shift 键可以正常工作,但效果并不令人满意。我发现,有了这种映射,Shift 键仍然可以正常工作,并且不会呈现任何虚假的括号,但(令人沮丧的是)它也不能可靠地生成左括号。无论出于何种原因,该键似乎无法可靠地修改本身,这会破坏其移位赋值……最初。无论出于什么原因,连续按几次左移最终会导致它开始产生左括号,但只有在按第四次或第五次之后才会产生。
我的一个行为做过但是请注意,您可能能够使用“足够接近”的类似物:我发现在将左括号和右括号映射到 Shift_L 和 Shift_R 之后,我可以通过“滚动”两个 Shift 键来可靠地键入括号 - 换句话说,使用这种映射:
xmodmap -e 'keysym Shift_L = Shift_L parenleft Shift_L parenleft'
xmodmap -e 'keysym Shift_R = Shift_R parenright Shift_R parenright'
按下 Shift_L 再按下 Shift_R,然后松开两者,将输出右括号,或向另一个方向输出左括号。(当然,括号映射可以反转;我无法确定哪种方式感觉更“自然”。)
这与我所寻求的精确行为最为接近;仅使用 xmodmap 似乎不可能实现。
我几乎确信这根本不可能,但后来我意识到至少有一个键可以起作用确切地正如您所描述的:Super(“Windows”)键。在 Gnome Shell 下,它是一个修饰键 (mod4),单独按下时会产生不同的效果(触发概览)。因此,至少在理论上,可以用相同的方式实现所需的 Shift 键重载。
...但是,我完全不知道该如何做,或者每次按下 Shift 键时陷入必要的处理中会有多么大的侵入性。:-)
答案3
也许可以查看 xbindkeys 来更改键映射,或者只是为 vim 或 gedit 找到一个好的编码插件,或者任何你喜欢使用或编写自己的插件。
更改键盘映射的工具 https://stackoverflow.com/questions/6812/mapping-my-custom-keys-in-debian
或许http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-14.html
并编写脚本来启用它。