使用空间而不是控制来避免emacs小指?

问题描述:

我已经开发了一个emacs pinky的例子,它太多的按下了C-x。理想情况下,我想使用空格键代替控件作为前缀命令,因为用拇指按住容易得多。按下并释放空间仍然应该添加一个空格,但同时按Space + x应该可以绑定到一个命令。例如:使用空间而不是控制来避免emacs小指?

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

有没有人有关于如何实现这一点的任何想法?是否有可能只使用elisp来完成它,还是必须修改emacs源代码并编译我自己的版本?

由于我在Windows和Linux上都使用emacs,我宁愿选择与操作系统无关的解决方案。

编辑: 我已经尝试过key-chord.el,它有助于在某些情况下但不是全部(C-x C-s)。我宁愿一个小模式,如控股空间是控制或持有空间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)执行的。

+1

我发现的一个技巧是(键盘允许),你可以放下你的手的一部分来点击ctrl键并用你的拇指点击C-x C-s等键。 Caps Lock重新映射也可以使用,因为您可以使用无名指。尽管我个人最喜欢的是切换ALT和CTRL,但原因是因为大多数键盘实际上都有类似的键(ALT的用途通常比CTRL少),所以您可以使用拇指代替,这需要一些习惯并假设您使用ALT比CTRL少很多。 – 2012-01-04 12:23:59

+0

我尝试过使用我的下掌握住Ctrl,但由于我的MS自然键盘上的小尺寸键很不容易。如果我能找到一个巨大的按键按钮,我会买一对夫妇。我看过Kinesis和Maltron键盘,但它们相当昂贵。我也更喜欢一个比携带自己的键盘更便携的解决方案:) – athoren 2012-01-04 14:57:15

+0

对于我来说,切换CTRL和ALT的作品,传统的旧键盘实际上是默认这种方式,这就是为什么Emacs小指从来没有真正的问题。 – 2012-01-04 15:01:11

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

+1

我开始这样做的时候,当我第一次感觉到疼痛,现在我在两个小指中都有疼痛感: )迄今为止我发现的最佳解决方案是和弦。例如,我使用'jb'而不是'C-x b'。但是,对于重复的命令,例如“向上移动4行”(5 x C-p),它不起作用。 – athoren 2012-01-04 15:32:38

我将CapsLock重新映射为Control以避免痛苦(尽管使用KDE来执行映射,但不是emacs)。

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

我不认为这在Emacs Lisp中是可行的。为了做你想做的事,人们必须检查'空格'键是否仍然被按下或者是否被释放。然而,Emacs中的键盘事件只是简单的字符,而不是“按下”和“释放”事件,就像鼠标按钮一样。我不知道Emacs C代码是否足以说明这是否可以在不破坏正常事件循环的情况下实现。

所以我们来看看依赖于操作系统的解决方案。在Xorg下,您可以将修饰符映射到常规键(使用xmodmap);然而,按'空格'仍然会产生一个空白,而作为修饰符,这不是你想要的。我所知道的唯一的解决办法是一个特殊的Xorg键盘驱动程序:

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

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

+0

由于我在Windows中工作,Windows是主要问题。在win中编写自定义键盘驱动程序似乎比在linux中困难得多。我担心elisp没有“紧急”事件,因为我从未见过这样的事情。尽管如此,我仍然希望在Emacs的资源中可以这样做。 – athoren 2012-01-04 15:28:38

+0

家中修饰符在Linux上似乎是一个很好的解决方案。如果我能在窗户上找到类似的东西,我会很开心...... – athoren 2012-01-04 15:36:56

+0

使用AutoHotKey,通过phils回答,您可以做到。 (我是at-home-modifier的作者=)祝你好运。 – 2012-02-28 11:48:17

Xah李写了一篇关于这一主题的nice article, 尤其是当他建议

用手掌或半拳头而不是你的小手指的按控制 关键

+2

[使用空格键和空格键](http://*.com/a/8935973/780703)更好。 Ctrl对于Emacs来说至关重要,而且用手掌按下Ctrl键太笨拙。我使用左下角的按键进行窗口管理。 – 2012-10-17 05:49:35

在Windows,AutoHotKey是针对大多数关键重新映射要求的非常灵活且可脚本化的解决方案。

我所做的是切换Alt键和alt-meta的超级键,避免点击恼人的左控制。除了我切换大写锁定超级有一个额外的修饰符,我用于切换缓冲区H-p H-n和其他东西。 如果你有Ubuntu,你的键盘设置中的变化是微不足道的。

您可以看看cua-mode,它对C-xC-c(标记处于活动状态时)做了类似的处理。我当然不是专家(我甚至没有使用cua-mode),但是简要地看一下代码,有一个定时器发送一个timeout事件,以便(在你的情况下)你可以绑定[?\s timeout]来插入一个空格并绑定其他的键任何你想要的。你也不能(我不认为),绑定按键,仿佛SPC是一个定语:

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

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

(define-key space-as-prefix-map (kbd "s") 'search-forward) 

我试图做一个快速使用cua-mode进行测试,但不幸的是,计时器仅在标记处于活动状态时才运行。好吧,这比这更复杂一点,但足以说我没有坚持足够长的时间来完成所有事情。但是确实有可能通过空间来控制逃避的内容。

这应该做你想要什么:

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

(空弦定义全局“S”“搜索进)

它‘和弦’,所以你必须在同一时间键入空格和s,但这样做很容易。

或者,如果您可以使用控制锁来帮助避免按住控制键(这就像控制键的大写锁定)。

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

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