【问题标题】:Using Space instead of Control to avoid emacs pinky?使用空间而不是控制来避免emacs小指?
【发布时间】:2012-01-04 09:35:15
【问题描述】:

我开发了一个 emacs pinky 的案例,它是通过按 C-x 太多来实现的。理想情况下,我想使用空格键而不是控制作为前缀命令,因为用拇指按住它更容易。按下和释放空格仍应添加空格,但同时按下 Space+x 应该可以绑定到命令。例如:

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

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

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

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

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

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

【问题讨论】:

  • 我发现的一个技巧是(在键盘允许的情况下)您可以休息一部分手来敲击 ctrl 键,然后用拇指敲击诸如 C-x C-s 之类的键。 Caps Lock 重新映射也可以使用,因为您只需使用无名指即可。虽然我个人最喜欢的是切换 ALT 和 CTRL,但原因是因为之前的大多数键盘实际上都有这样的键(ALT 的使用频率低于 CTRL)所以你会用拇指代替,这需要一些时间来适应并假设你使用 ALT比 CTRL 少很多。
  • 我试过用我的下手掌按住 Ctrl,但由于我的 MS Natural 键盘上的键尺寸很小,这并不容易。如果我能找到一个带有巨大 ctrl 按钮的键盘,我会买几个。我看过 Kinesis 和 Maltron 键盘,但它们相当昂贵。我也更喜欢一个比随身携带键盘更便携的解决方案:)
  • 对我来说,切换 CTRL 和 ALT 是有效的,传统的旧键盘默认情况下实际上是这种方式,这就是为什么 Emacs 小指从来没有真正成为问题的原因。
  • 我还没试过,但这是个好主意。我听说旧键盘是这样的。不幸的是,在 Windows 上它需要安装驱动程序,这意味着我必须向我的 IT 部门征求许可(也许还有其他方法?)。
  • 您可以更改一些注册表项(至少我是这样做的)不幸的是无法记住现在是哪些:(

标签: emacs elisp


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在 Windows 上,AutoHotKey 是一种非常灵活且可编写脚本的解决方案,可满足大多数类型的键重映射要求。

    【讨论】:

      【解决方案3】:

      我认为这在 Emacs Lisp 中是不可能的。为了做你想做的事,你必须检查“空格”键是否仍然被按住或者它是否被释放。然而,Emacs 中的键盘事件只是字符,而不是像鼠标按钮那样的“按下”和“释放”事件。我对 Emacs C 代码的了解还不够,无法说明是否可以在不破坏正常事件循环的情况下在那里实现。

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

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

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

      【讨论】:

      • Windows 是我在 Windows 中工作的主要问题。在 win 中编写自定义键盘驱动程序似乎比在 linux 中困难得多。我担心 elisp 中没有“压制”事件,因为我从未见过这样的事情。不过,我仍然希望在 Emacs 源中它可能是可能的。
      • at-home-modifier 在 Linux 上似乎是一个不错的解决方案。如果我能在 Windows 上找到类似的东西,我会很高兴......
      • 通过 phils 回答的 AutoHotKey,您可以做到。 (我是 at-home-modifier 的作者。=)祝你好运。
      【解决方案4】:

      Xah Lee 就这个主题写了nice article, 尤其是当他推荐时

      用你的手掌或半拳代替你的小指来按下控制 键

      【讨论】:

      【解决方案5】:

      这应该做你想做的:

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

      (space-chord-define-global "s" '向前搜索)

      它会“和弦”,因此您必须同时输入空格和 s,但这样做很容易。

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          我所做的是切换控件的 alt 键和 alt-meta 的超级键,这样可以避免单击烦人的左控件。此外,我为 Hyper 切换 Caps Lock 以获得额外的修饰符,用于在缓冲区 H-p H-n 和其他内容之间切换。 如果您有 Ubuntu,则键盘设置中的更改是微不足道的。

          【讨论】:

            【解决方案8】:

            您可以查看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 进行快速测试,但不幸的是,计时器仅在标记处于活动状态时运行。嗯,它比这更复杂一点,但足以说明我没有坚持足够长的时间来弄清楚这一切。但是绝对有可能让空间成为控制逃逸对元的影响。

            【讨论】:

              【解决方案9】:

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

              【讨论】:

              • 这是关于将 ctrl 移动/交换为大写锁定。空格键在这方面其实是很不一样的。
              【解决方案10】:

              这不是您问题的答案,但它是一种避免 Emacs 小指的方法:不要用一只手按修饰符和键。因此(假设您有 Qwerty 键盘)用右手按 Control,左手按“x”。

              【讨论】:

              • 当我第一次感到疼痛时,我就开始这样做了,现在我的两个小指都感到疼痛 :) 到目前为止,我发现的最佳解决方案是键和弦。例如,我使用“jb”而不是“C-x b”。但是,对于诸如“向上移动 4 行”(5 x C-p) 之类的重复命令,它并不能很好地工作。
              猜你喜欢
              • 1970-01-01
              • 2021-12-05
              • 2017-02-18
              • 2013-09-29
              • 1970-01-01
              • 2014-03-14
              • 1970-01-01
              • 2016-02-18
              相关资源
              最近更新 更多