Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于中文和英文/数字间插入空格的问题 #129

Open
qwertyyb opened this issue Apr 15, 2024 · 2 comments
Open

关于中文和英文/数字间插入空格的问题 #129

qwertyyb opened this issue Apr 15, 2024 · 2 comments
Labels
bug Something isn't working

Comments

@qwertyyb
Copy link
Owner

目前已发现的问题

  1. 输入英文后按删除键删除英文,再输入中文,仍然会在前面插入空格,比较影响使用,初步方案为按删除键后,不再执行自动插入空格的逻辑,按删除键后清空lastInputText变量
  2. 输入数字后再输入中文,不会自动插入空格
@qwertyyb qwertyyb added the bug Something isn't working label Apr 15, 2024
@qwertyyb
Copy link
Owner Author

qwertyyb commented Apr 16, 2024

  1. 输入英文后,回车,再输入中文,在新行会自动插入一个空格。此问题看上去和问题1比较像,可以一起处理,考虑使用白名单的方式处理,输入中文 或英文后,下一个操作在白名单中时(如输入中文或输入英文时),保留 lastInputText,若不在白名单,则把lastInputText 清空

@qwertyyb
Copy link
Owner Author

let previousLocation = client().selectedRange().location - client().markedRange().length - 1

关于计算的说明:

我所理解的 selectedRange 和 markedRange

selectedRange

image

上图是我对 selectedRange 的理解,selectedRange 永远是光标所在的位置,length 按是否有选中文字,如果没有选中就是 0,如果有选中就是选中文字的长度。

markedRange

image

markedRange 我理解是标注组字的区域,在英文下其实没有意义,在中文组字时才有意义,所以在英文状态下,我理解它的 location 值应该和 selectedRange 是一致的,在中文模式下,在组字时,length 才有可能为非 0 值。

现实的参差

关于我假设的验证,我使用的是 MacOS 内置的备忘录 APP,发现 selectedRange 和我预期是一致的表现,而 markedRange 则有所不同。
在英文输入模式下,markedRange 不会更新,它的 location 是首次输入文字时的起始位置,之后即使输入了其它字符,markedRange 是纹丝不动,这和我预期的虽然有差异,但毕竟英文输入模式下,markedRange 实际并无意义,所以这种表现也能理解。
我期望能获取到输入区域的前一个文字是什么,刚开始我是使用 {markedRange.location - 1, 1} 来获取,然而由于上面的原因,这种只有在输入中文时,才能正确获取,如果是英文模式下,则获取的不正确。
后面更改为了上面的方式,即 {selectedRange.location - markedRange.length - 1, 1},但是在实际使用过程中发现仍然有问题,在 Chrome 浏览器中,下面的这种情形与备忘录 APP 中的表现又不一样。

image

探究

可以看到不同的 APP 对于输入区域的内容,即使外在表现一致,但是内核可能是完全不一样的。去查找了一下 MacOS 的文档,发现应用确实有这样的能力来重写这些行为,具体可以参考此文档:https://developer.apple.com/documentation/appkit/nstextinputclient

根据此文档,对于那些不遵循常理规范或者对这些规范有自己理解的开发者来说,实现出来的调用可能是不一致的,比如系统的备忘录 APP 和 Chrome 浏览器,那么对于依赖这些 API 实现的输入法来说简直是地狱。

解决方案

尚在探索中

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant