4

真的很喜欢key-chord.el,但我只需要在我没有做任何事情的短暂延迟后开始按下击键时触发它。我想知道是否容易修改key-chord.el来做到这一点。

为什么我想要这很简单,我会尽可能简单地解释它:

  • 我确实希望将键弦分配给我的“强壮”手指(没有小指)和我的主行(我做触摸式)上的键。因此,我可能会创建相当多的键弦,这些键弦在我打字时可能会与常见的单词/代码发生冲突。

  • 我意识到每次发生冲突(即键弦在我不想的时候开始)都是因为我正在疯狂地修改缓冲区。

这是一个例子......

我是一个快速打字员,所以如果我输入,比如说,“hold”,在我添加“held”的“e”和输入“l”之间永远不会有很长的延迟。所以在这种情况下,当我键入“ld”时,我不希望键和弦启动应该是“显而易见的”。但是,如果有停顿并且如果“ld”是指定的键和弦,然后我点击“ld”,那么我不太可能编写以“ld”开头的代码/文本。因此,在后一种情况下(并且因为我已将“ld”分配给键和弦),我确实希望它能够发挥作用。

现在不要误会我的意思:我并不是说这会消除每一种情况下的每一种可能的冲突。我要说的是,就我而言,这可能会消除 99.9% 的(已经很少见的)冲突。与键和弦使我获得收益的时间相比,在更改键和弦后仍然发生冲突时,“损失的时间”可以忽略不计。

代码key-chord.el非常小,所以也许这样的添加不会太难?

有没有人知道如何很容易修改key-chord.el以提供这样的功能?(我希望我正确解释了我想要做什么)

这是 key-chord.el 的代码,其中一半是注释:

http://emacswiki.org/emacs/key-chord.el

4

2 回答 2

5

空闲计时器机制应该能够促进这一点。

C-hig (elisp) Idle Timers RET

我会把它留给你(或其他人)来弄清楚细节。临时的想法是:

  • 通过空闲计时器启用 Key Chord 功能
  • 用于post-command-hook再次禁用它

可能就是所有需要的?

于 2012-07-12T22:42:38.627 回答
2

我在这里看到两个时机

  • 和弦前的时间(和弦前的字母和和弦之间。如果足够短,则没有和弦)
  • 和弦后的时间(如果快速键入新字母,则没有和弦)

第二种时机可能更自然,也更容易习惯。如果键入和弦,则可以接受在执行之前的短暂超时。(这不是您所要求的,也不会解决“ld”示例。但它可能会解决可能出现在单词开头的字母组合的问题。)

一种时间可能更难习惯。当一个人打完一个单词,接下来就是打一个和弦时,我怀疑短暂的停顿不是一种自然的本能。如果一个人经常使用和弦,一个人可能会很快输入它,如果它不被识别就会生气(并且两个字符被插入到文本中)。我想说的是,我不确定和弦会在一个令人满意的程度上解决问题之前的时机

至于执行这么一个时机。key-chord-input-method 函数中状态机的当前结构方式,它会随着要考虑的计时器数量呈指数增长(如果我没记错的话)。即至少会有十多行新代码。

要试验该功能,请尝试其他答案中的phils建议:禁用和弦的发布命令,以及在几分之一秒后再次启用它们的空闲计时器。在不实际更改次要模式的情况下,禁用和启用和弦的一种快速而肮脏的方法是设置 input-method-function 变量。

仅用于测试目的的代码。它假定但不检查 key-chord-mode 版本 0.5 已加载并启用:

;; Helper functions to be used in timers and hooks
(defun my-enable-chords () (setq input-method-function 'key-chord-input-method))
(defun my-disable-chords () (setq input-method-function nil))

;; Start test
(add-hook 'post-command-hook 'my-disable-chords)
(setq my-timer (run-with-idle-timer 0.3 'repeat 'my-enable-chords))

;; Finish test
(remove-hook 'post-command-hook 'my-disable-chords)
(cancel-timer my-timer)
于 2012-10-23T00:57:23.437 回答