精炼key-chord.el触发

时间:2012-07-07 17:55:51

标签: emacs keyboard-shortcuts elisp

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

为什么我希望这很简单,我会尽可能轻松地解释它:

  • 我确实希望将键盘分配给我的“强”手指(没有小指)并且在我的主行(我做触摸式)上的键。因此,当我打字时,我可能会创建一些可能与常用词/代码冲突的键盘。

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

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

我是一个快速打字员,所以如果我进入,比方说,“持有”,那么当我添加“持有”的“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

2 个答案:

答案 0 :(得分:5)

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

C-h i g (elisp) Idle Timers RET

我会留给你(或其他人)来弄清楚细节。副手的想法是:

  • 通过空闲计时器启用按键和弦功能
  • 使用post-command-hook再次停用

可能只需吗?

答案 1 :(得分:2)

我在这里看到了两个时间

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

时间的第二类可能更自然,并且易于习惯。如果有人输入和弦,则可以接受执行前的短暂超时。 (这不是你要求的,也不会解决“ld”的例子。但它可能会解决可能出现在单词开头的字母组合问题。)

时间的第一类型可能更难以习惯。当一个人完成输入一个单词并且下一个是键入一个和弦时,我怀疑短暂停顿并不是一种天生的本能。如果经常使用和弦,则可能会快速输入和,如果无法识别,则会感到烦恼(并且将两个字符插入到文本中)。我想说的是,我不确定和弦会在什么程度上解决问题

至于实施这样的时间安排。 key-chord-input-method函数中的状态机当前的结构方式,它将随着要考虑的定时器数量呈指数增长(如果我没记错的话)。即至少会有十几个新的代码行。

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

仅供测试用途的代码。它假定,但不检查,加载和启用了键和弦模式版本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)