使用Space而不是Control来避免emacs小指?

时间:2012-01-04 09:35:16

标签: emacs elisp

我已经开发了一个因为太过紧迫C-x而变成了粉红色的案例。理想情况下,我想使用空格键而不是控制作为前缀命令,因为用拇指按住更容易。按下和释放空间仍应添加空格,但同时按下Space + x应该可以绑定到命令。例如:

(local-set-key (kbd "SPC-s") 'search-forward)

有没有人对如何实施这一点有任何想法?是否可以仅使用elisp来完成,或者我是否必须修改emacs源并编译我自己的版本?

我更喜欢独立于操作系统的解决方案,因为我在Windows和Linux上使用emacs。

编辑: 我尝试过key-chord.el,它在某些情况下有所帮助但不是全部(C-x C-s)。我更喜欢一种次要模式,例如hold-space-is-control或holding-space-is-meta

编辑: 感谢所有的答复。我目前正在使用键和弦将许多C- *命令映射到j *或f *,具体取决于if是左手还是右手键。例如,我用jb替换C-x b。它适用于您通常键入一次的所有命令,但不适用于重复使用的命令(例如前向或后向段落)。它是迄今为止最好的跨平台解决方案,因为它只需要自定义的.emacs和key-chord.el文件。我更喜欢一种需要较少重新映射的解决方案,并降低了输入“fyi”并获得“< yank> i”的风险。我相信使用空间可以工作,但我不太了解emacs的技术细节,以使其工作。

我考虑用Ctrl替换Caps-Lock或Alt,但这只对左小指有帮助。许多常用命令使用右小指(C-x,C-s,C-w,C-y)执行。

10 个答案:

答案 0 :(得分:7)

我将CapsLock重新映射到Control以避免痛苦(使用KDE进行映射,而不是emacs)。

更新:我也可以在LXDE和MS Windows中实现这一点。

答案 1 :(得分:6)

在Windows上,AutoHotKey是一种非常灵活且可编写脚本的解决方案,适用于大多数密钥重映射要求。

答案 2 :(得分:4)

我不认为这在Emacs Lisp中是可行的。为了做你想做的事,人们必须检查'空格'键是否仍然按下或是否被释放。但是,Emacs中的键盘事件只是字符,而不是鼠标按钮的“按下”和“释放”事件。我不太清楚Emacs C代码是否可以在不破坏正常事件循环的情况下实现它。

让我们转向依赖于操作系统的解决方案。在Xorg下,您可以将修改器映射到普通键(使用xmodmap);但是,按“空格”仍会产生空格,而作为修饰符,这不是你想要的。我所知道的唯一解决方案是一个特殊的Xorg键盘驱动程序:

https://gitlab.com/at-home-modifier/at-home-modifier-evdev/wikis/home

我不知道Windows是否存在类似的东西。

答案 3 :(得分:4)

Xah Lee在这个问题上写了nice article, 特别是当他建议

  

用手掌或半拳而不是小指按压控件   键

答案 4 :(得分:4)

这应该做你想要的:

http://www.emacswiki.org/emacs/space-chord.el

(space-chord-define-global“s”'search-forward)

它确实是“chording”所以你必须同时输入space和s,但这样做很容易。

或者,如果你可以使用控制锁来帮助避免控制同样多的控制(就像控制键的大写锁定一样)。

答案 5 :(得分:2)

在过去的几周里,我编写并使用了AutoHotKey脚本,该脚本提供了Windows范围的功能,可以完全按照您的描述进行操作。它现在可用on GitHub。虽然它不是独立于操作系统的解决方案,但Linux上的实现几乎相同(例如At-Home-Modifier和Space2Ctrl),因此您应该能够在任一平台上获得相同的用户体验。从好的方面来说,您还可以在其他程序中使用它来完成复制,粘贴和切换浏览器选项卡等任务。希望它有所帮助。

答案 6 :(得分:2)

这里描述了确切的解决方案。它包括使用额外的软件(每个操作系统上都有)。 http://emacswiki.org/emacs/MovingTheCtrlKey#toc24

答案 7 :(得分:1)

我所做的是为alt-meta切换控件和超级键的alt键,这样可以避免点击恼人的左控件。除了我切换Caps Lock for Hyper还有一个额外的修饰符,我用它在缓冲区H-p H-n和其他东西之间切换。 如果你有Ubuntu,你的键盘设置变化是微不足道的。

答案 8 :(得分:1)

您可以查看为cua-modeC-x执行类似操作的C-c(当标记处于活动状态时)。我当然不是专家(我甚至不使用cua-mode),但简要地看一下代码,有一个定时器发送timeout事件,以便(在你的情况下)你会绑定{ {1}}插入空格并将其他键绑定到您想要的任何内容。你也不能(我不认为)绑定键,好像SPC是一个修饰符:

[?\s timeout]

但你会将它们绑定为(比如说)

(local-set-key (kbd "SPC-s") 'search-forward)

我尝试使用(define-key space-as-prefix-map (kbd "s") 'search-forward) 进行快速测试,但不幸的是,计时器仅在标记处于活动状态时运行。嗯,这比这复杂一点,但足以说我没有坚持足够长的时间来弄清楚这一切。但绝对有可能让空间控制逃避对元的影响。

答案 9 :(得分:0)

这不是你的问题的答案,但它是一种避免Emacs小指的方法:不要用一只手按下修饰符和一个键。所以(假设你有一个Qwerty键盘)用右手按Control,用左手按'x'。