pyim 输入法下如何配合 key-chord 进行快速按键 执行函数,而不是pyim候选词

想要在 pyim 输入法下配合 key-chord

比如,当我在 pyim 下,快速按下 jk 键,它会执行某个函数,如果单单按个 j 键,pyim 将会弹出 候选词,不影响使用

因为我注意到,无论 pyim 选的是半角还是全角符号,key-chord 无效

你搜索一下 pyim 的 issue 吧,好像有同学以前提到过这个问题,还提出了一个解决方案

他的问题大概怎么描写的??有点难找

How to us evil-escape when I am input Chinese using pyim? · Issue #260 · tumashu/pyim · GitHub like this.

我研究研究,似乎还跟 pyim 的配置有关,我直接拿过来无法使用 :joy:

非常感谢 :innocent:

也可以用这个

虽然在emacs28里面有些函数名字要修改一下才能用,作者好像也是论坛中的道友。

输入法不用的/键(或其他不用的按键)可用来关闭输入法,关闭后可以执行其他函数。`

这是我最近的设置。

感谢,不过没有我想要的那么方便

似乎无效,太久没维护了

其实略加改动,在28里是可以用的

(require 'key-chord)

(defun rime--enable-key-chord-fun (orig key)
  (if (key-chord-lookup-key (vector 'key-chord key))
      (let ((result (key-chord-input-method key)))
        (if (eq (car result) 'key-chord)
            result
          (funcall orig key)))
    (funcall orig key)))

(advice-add 'pyim-input-method :around #'rime--enable-key-chord-fun)

上面的 advice 是为了在 emacs-rime 中使用 key-chord 写的,应该也适用于 pyim(以前测试过)

4 个赞

这个可能是一个更好的解决思路,如果可行的话

太感谢了,完全可行:grinning::pray:

有用,key-chord配合pyim可以进一步提升输入法体验:

(key-chord-define-global " j" 'pyim-convert-string-at-point)
(key-chord-define-global " k" 'pyim-convert-string-at-point)

您好,能分享一下emacs-rime的版本吗?

把 pyim 改成 rime

(advice-add 'rime-input-method :around #'rime--enable-key-chord-fun)

1 个赞

似乎这个 issue 里面的解决方法过期了,用到的一些 api 都没有了。我是想向原来那个 issue 的问题一样,在使用 evil-escape 的时候,快速输入 kj 切换 evil 状态,而不是让 pyim 上屏词组。不知道 issue 中的函数要如何改进?

我用的下面这段代码,你试试看。效果是快速jk之后中文不上屏,而是将已经输入的拼音插入buffer中,并切换到evil的normal模式。

有两个问题:1. 我本地的pyim还是5.2.6版本,不确定最新的pyim会不会有不兼容的修改;2. 这段代码只能说基本可以工作,但不够完美(譬如当前输入了jk,然后再快速按jk,已经输入的jk就没了)。

(with-eval-after-load 'evil-escape
  (defun pyim-plus-self-insert-command (orig-func)
    (interactive "*")
    (let ((first-key (elt evil-escape-key-sequence 0))
          (second-key (elt evil-escape-key-sequence 1)))
      (if (and (local-variable-p 'last-event-time)
               (floatp last-event-time)
               (< (- (float-time) last-event-time) evil-escape-delay))
          (set (make-local-variable 'temp-evil-escape-mode) t)
        (set (make-local-variable 'temp-evil-escape-mode) nil))
      (if (and temp-evil-escape-mode
               (string-prefix-p (char-to-string first-key) (reverse (pyim-entered-get 'point-before)))
               (equal last-command-event second-key))
          (progn
            (push last-command-event unread-command-events)
            ;; (pyim-process-outcome-handle 'pyim-entered)
            (push (pyim-entered-get 'point-before) pyim-outcome--history)
            (pyim-process-terminate))
        (progn
          (call-interactively orig-func)
          (set (make-local-variable 'last-event-time) (float-time))))))
  (advice-add 'pyim-self-insert-command :around #'pyim-plus-self-insert-command)
  )
1 个赞

感谢🙏,测试了一下,相当完美~