librime
librime copied to clipboard
希望提供增强的SetCaretPos/GetCaretPos接口
现有的SetCaretPos()/GetCaretPos()是光标在GetInput()上的位置 而软光标又是在RimeComposition的preedit上,两者并不统一。 当用户在输入了一长串拼音或单引号(用于分割)、且前几个已转化为汉字后,希望用鼠标或触摸点选该汉字与后续拼音中间,希望把光标设置在该位置。此时无法直接使用SetCaretPos。
例如: 当用户输入“woshiyigelaohaoren”并选择转换了部分汉字“我是yigelaohaoren”,然后:
- 点击“是”字的右半侧,此时希望光标位置为“我是‸yigelaohaoren”
- 点击"是"字的左半侧,此时希望光标位置为“我‸shiyigelaohaoren” 以上两种情形,都不知如何调用SetCaretPos()
不容易呢。
並不是每個「字」前後都可以定位。這是因爲 Rime 並沒有規定「字」這個單位。假如碼表裏面爲「我是」定義一個不可拆分的編碼,則這個詞亦是不可拆分的。比如五筆裏面的詞組編碼,無法把其中的每個字與輸入碼的一部分對應起來。因此只能定位到輸入碼的邊界,而不能定位到其內部的各個 Unicode 字符。如果用拼音輸入法舉例,假想將方案升級爲支持兒化音節,比如「花兒」拼作一個音節 huar 而不是兩個音節 hua'er,同理無法將光標定位到兩字之間。
拋開以上問題,實現的主要難度是 preedit 是爲了顯示而格式化的字符串,已經不包含結構信息。設置光標可是需要按照輸入碼來定位的。
感覺用現有的顯示串以及樓主所求的接口來定位,實現複雜,不可靠。 理想中應當給出類似迭代器的接口,客戶端分段讀取每個不可切分的單元,從而獲知其顯示內容和屬性,包括對應輸入碼的區間。