欢迎尝试 emacs-rime,计划中功能已全部完成。

应该就是直接在 point 出插入字符串,

    (insert preview)
    ;; Highlight new preview string.
    (move-overlay pyim-preview-overlay
                  (overlay-start pyim-preview-overlay) (point))))

posframe 定位功能可以是一个座标或者 point,也可以是一个 poshandler 函数,所以关键是如何计算出位置

用当前 point - 高亮文本的长度 ? 估计就可以了吧?

并不可以,那个

TEXTTEXT|OVERLAY|
       a--------^

横线的这几个位置和最后 ^ 的位置是同一个位置,只能定在后面。 这个位置 -1 就变成了 a,如果再 +1 就回到了 ^ 所以这个可能大概率实现不了。

如果插入真实文本的话,会不会影响 undo?

好像没影响 undo 吧

还有一种方案是直接不显示光标后面的词,直接看posframe的结果,这样显示框应该就不会晃动了吧? Emacs-rime:

系统Rime:

添加一个不显示嵌入文本的选项是一个办法,不过我更在意有什么好办法能直接解决问题。

实现你需要的效果可以做个这样的 patch

(defun rime--display-preedit ())

把这个函数重定义成空实现就可以了

1 个赞

:+1:我暂时先这样用,期待大佬直接解决这个问题。

有件事我不确定,就是如果我用插入文本的方式做嵌入文本的话,我插入文本,上屏之后清空文件,如果这个时候 undo 的话,好像是会把之前插入的文本给还原回来。

如果有办法解决这个问题的话,就可以实现这个功能。

如果是正常删除的话肯定是会影响Undo的,不知道有没有用特殊的删除方法? 另外我想能否在当前行光标后面再弹一个posframe用于显示嵌入文本,并且这个弹窗是透明的,这样也就能达到同样效果了吧?

不行的。

image

这种情况下如果是 posframe 的话会重叠。

@DogLooksGood 我想把中文和英文中间的空格删除。直接在rime–inline-ascii后面加advice,这样合适吗?

增加了一个新的选项,rime-inline-ascii-holder 值为任意一个 char 表示一位编码,比如 ?a, 是一个比较无奈的 Hack 的选项。

有时 Rime 中中文标点会直接上屏,比如左全角括号,这种时候会没有办法进入 inline ascii 模式。设置了 (setq rime-inline-ascii-holder ?a) 之后,在确定要 inline ascii 的情况下,输入第一位编码之前,会先自动输入一个 a, 然后进入 inline ascii,然后输入 (, 之后删掉最开始的 a。实现任意字符都能进入 inline ascii 的效果。

设置为 nil 时与之前行为相同,默认为 nil

感觉这个可以解决一些之前很复杂的关于标点的断言 @cnsunyour

是合适的,但是不会觉得很反常吗,按了空格却没有插入空格。

对了,问下你是用什么输入法(方案)

rime+五笔86

其实这样挺好

如果有这样的需要,我倾向于扩展几个 hook 出来。

rime-inline-ascii-hook rime-commit-hook rime-cancel-hook

之类的。这样再自由的扩展。

其实中英文之间留有空格反而是我觉得反常的事。原因是中英文之间加空格这件事不是码字的时候应该处理的事情,这是排版软件的工作。如果写出来的东西里面就有空格,那在各种后续排版的时候势必造成一些不必要的麻烦。假如我把在orgmode里面写的东西导成docx文档,office会自动在排版的时候渲染出半个空格,让版面好看。要是我手工加了空格,那排出来的效果就会很怪。这种麻烦事在我之前使用panguspacing插入真实空格的时候就遇到过。中英文之间加空格也许是一个值得提倡的习惯。但是在没有得到全面支持的情况下,在输入法层面将加空格作为默认选择只会带来不必要的麻烦。我在使用emacs-rime写西的时候最后都不得不手工去掉所有不必要的空格,觉得挺麻烦的。这也许是个人的选择吧。有人可以接受,有人不能接受。

所以我觉得emacs-rime做好输入法的本职工作就够了。我同意你“明确的边界”的说法。不需要为了满足每个人的不同输入习惯而做各种定制,但希望emacs-rime能够给用户更大的定制自由。举个例子,按照我之前的使用习惯我会在emacs启动后第一时间就自动打开emacs-rime,输入法默认处于英文状态。以现在emacs-rime的切换逻辑,这是做不到的。我如果在rime里面配置schema的默认状态是英文,就没办法通过断言来自动切换了。中英文切换这种事每个人习惯都不太一样,现在emacs-rime的切换逻辑只能让用户来适应输入法,而不能让用户自己决定自己怎么切换。

这几个hook应该能让用户做出不少扩展。但是这似乎对切换逻辑的扩展没什么帮助吧?现在的切换逻辑上面觉得还是不够自由。其实就一点:怎么自然地从英文切换到中文?emacs-rime上面似乎没有提供什么比较优雅的方法,而如果用户自己想扩展也不太容易和emacs-rime的原有逻辑进行整合。

感觉用posframe敲快了还是有闪烁,不知道大家发现没有

感谢这么详细的说明,我觉得我可以理解你的想法。

我觉得这里面可能有一些误解,emacs-rime 本身并没有把空格切换中英文做为默认的行为。

所谓“切换中英文”的关键,在于这个 diasble-predicates 。predicate 是无副作用的断言函数。emacs-rime 提供的机制是允许配置 什么情况下关闭输入法,而不是如何 切换中英文。如何切换是用户的定制,是比较主观的。

可以理解为 emacs-rime 倾向于提供一个无状态的方案。不知这么说是否可以理解。

对于空格切换输入法,然后删除空格,不妨考虑为让空格键在某个情况下实现开关输入法或通过断言禁用输入法的效果。

1 个赞