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

哈哈,那就需要想其他办法了 :slight_smile:

pyim 的嵌入文本是怎么实现的?或者说有没有边法让 posframe 出现在行列的默个位置?

应该就是直接在 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的原有逻辑进行整合。