似乎在pyim的函数pyim-convert-string-at-point中发现一个bug。理论上这个函数会把光标前的字符转换成中文。比如’,'会被转为全角逗号,英文句号变为中文句号。但是发现如下问题,字符串为".,.“,且光标位于逗号与第二个句号中间,此时使用这个函数会把字符串变为”。,。"。就是说会把之前与之后的符号都变掉,而非仅仅是光标之前的一个字符。
但是如果字符串是“.,”光标位于逗号之后,此时使用这个函数,确实只会把逗号变掉,英文句号没有变化,这应该是期待有的的行为。试验了一下,逗号后面出现字母,行为也是正确的,就是不能出现标点符号。
简单说pyim-convert-string-at-point的行为是分两种情况的,按优先级排序:
- 用
pyim-punctuation-translate将光标处的连续标点转换为全角,
- 否则,将光标前的合法字符(不包括标点)喂进输入法。
但如果这样讲".,"(光标在逗号后)应该被转换成“。,”,但实际上此时转换的结果是“.,”,即只转换了逗号。而且无论如何,光标之后的标点也会被转换就很奇怪。
不好意思,凭之前折腾pyim时的印象回答导致了错误。
刚看了下源码,pyim-punctuation-translate的实现是根据光标后标点的个数N,转换光标前N+1个标点和光标后N个标点(用|代表光标位置):
,,| -- N = 0 --> ,,|
,,,,,,|... -- N = 3 --> ,,,,,,|。。。
不过感觉docstring描述的行为「前后连续成对的n个标点符号」和实现不太一致。
(defun pyim-punctuation-translate (&optional punct-style)
"将光标前1个或前后连续成对的n个标点符号进行全角/半角转换.
当 PUNCT-STYLE 设置为 \\='full-width 时,所有的标点符号转换为全角符
号,设置为 \\='half-width 时,转换为半角符号。"
原来这是个feature
。这样处理是不是打击面太大了些,似乎只有像括号引号这类成对出现的符号才有这样做的必要。
我之所以会遇到这个问题,原因是在latex中输入中文的时候,由于输入公式的缘故经常会有"$,"这种字符串出现,这时候我就想把逗号转为中文逗号。但如果逗号之后恰好有其他符号,这时候$符号就跟着被转换了,反而更麻烦了。