在Linux中,如何在没有其他键的情况下按下SHIFT_L / SHIFT_R?


13

今天,我发现了Steven Losh撰写的这篇非常不错的文章,其中他提出了一些提高键盘映射效率的方法。其中包括左和右Shift键的动态映射。

想法

在没有其他键的情况下按下Shift_L或Shift_R时,它们分别映射到'('和')',否则它们将照常运行。

问题

他在OSX下完成所有这些工作。我试图在Linux下实现相同的目标。没有直接的方法,因为据我了解,您不能使用xmodmap单独为Shift_L配置一个键,而在用作修饰键时为Shift配置另一个键。

我在Google上搜索了一下,发现人们试图在Windows下使用AutoHotKey进行相同的操作,但是我找不到Linux上的任何东西。

有没有办法在Linux下解决这个问题?


我没有尝试过,但这可能会有所帮助askubuntu.com/q/24916/11352
Mansuro 2013年

2
这个问题几乎是重复的。=)
teika kazura

Answers:


4

哇!用户teika kazura对原始问题的评论是非常正确的-不仅有效地是另一个问题的重复,而且在那里提供的答案(“ use xcape ”)解决了这个问题!

克隆xcape存储库并进行编译(首先我必须在Fedora盒上安装libXtst-devel)之后,我能够使用以下命令获得所需的确切行为:

xcape -e "Shift_L=parenleft;Shift_R=parenright"

经过公认的定期测试后,它似乎工作得非常好。真好!

其他选择

如果将Shift键用作鼠标修饰符(即,如果曾经按住Shift键单击任何东西),则可能要包括xcape的timeout选项并找到合适的超时值,以便将单独的Shift键与鼠标组合使用不会产生假括号。从xcape自述文件中:

-t <timeout ms>

如果您按住某个键的时间超过此超时时间,则xcape将不会生成键事件。默认值为500毫秒。

因此,通过包含-t具有适用于您的超时值的标志,只要按住Shift 至少 timeout ms毫秒,您仍然可以用鼠标按住Shift键单击。

(再次向teika kazura指出另一个问题,并向don_crissti给出那里的原始答案。)


这种方法的一个问题是我经常按[Shift] + [LMouse]在编辑器中选择一些文本。有趣的是,Sublime Text也使用[Ctrl] + [LMouse],因此有关重新映射[Ctrl]的问题也会引起问题。
AnnanFay

@Annan您是否尝试过调整xcape的超时选项?从自述文件中:“ -t <timeout ms>如果您按住某个键的时间超过此超时,则xcape将不会生成键事件。默认值为500毫秒。” ...除非xcape干扰修改器的按下事件(我不记得),否则它应避免产生伪造的按键,同时只要您将其保持足够长的时间,仍可以将其用作鼠标选择修改器。
FeRD '17

@Annan真高兴,我已更新答案以建议使用该-t标志!
FeRD

1

这是一个有趣的挑战,我同意xinput似乎并不十分适合的挑战。我花了一些时间来摆弄xmodmap的功能,并且非常沮丧地接近实现您想做的事情...而实际上并没有设法到达那里。

使用xmodmap,可以将parenleft分配为左移键上的移位键符号:

xmodmap -e 'keysym Shift_L = Shift_L parenleft Shift_L parenleft'

至少在我的Fedora 17盒子上进行测试时,这种排序方式是可行的,但效果并不令人满意。我发现,有了此映射,shift键仍然可以正常工作,并且没有渲染任何假的parens,但是(令人沮丧的)它也不能可靠地产生左parens。无论出于何种原因,该密钥似乎都无法可靠地对其自身进行修改,这最初会中断其转移的分配。无论出于何种原因,连续几次左移都会最终导致它开始产生左括号,但仅在第四或第五次按下之后。

但是,我确实注意到一种行为,您也许可以作为“足够接近”的类比使用:我发现将parenleft和parenright映射到Shift_L和Shift_R之后,我可以通过在两个Shift键上“滚动”来可靠地键入parens —换句话说,使用此映射:

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,然后再释放它们,将在另一个方向上输出右方或左方。(当然可以颠倒paren映射;我无法完全确定哪种方式更“自然”。)

这与我要实现所需的确切行为差不多。似乎不可能单独使用xmodmap。

我半信半疑地说,这简直是不可能的,期间,但后来我意识到至少有一个按键可以完全按照您的描述工作:Super(“ Windows”)按键。在Gnome Shell下,它是一个修饰键(mod4),当单独按下该键时会产生不同的效果(触发“概述”)。因此,至少在理论上,有可能以相同的方式实现所需的Shift键重载。

...但是,我绝对不知道该怎么做,或者每次按下Shift键时陷入必要的处理过程都会带来多大的侵害。:-)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.