Monaco编辑器虚拟键盘输入异常求助:后续字符前置
修复Monaco编辑器虚拟键盘插入字符光标位置问题
嘿,我来帮你解决这个问题~你遇到的第二次字符插入跑到前一个字符前面的情况,核心问题出在光标位置的更新上,咱们一步步拆解:
问题根源
你代码的最后一行editor.setPosition(position+1)是错误的:Monaco的position是一个包含lineNumber和column的对象,不是单纯的数字,直接用+1会得到无效值,导致光标没有移动到新插入字符的后面。下一次插入时,光标还停留在原来的位置,所以新字符就会插在前一个字符的前面。
另外还要纠正一个小错误:editor.getValue(position)是错误用法,getValue()方法不需要传参数,它会返回整个编辑器的文本内容。
快速修复方案
把光标更新的代码改成正确的方式,创建新的IPosition对象来指定新的光标位置:
var position = editor.getPosition(); // 获取当前光标位置 var text = editor.getValue(); // 获取编辑器全部文本 var splitedText = text.split("\n"); var lineContent = splitedText[position.lineNumber - 1]; // 获取当前行内容 var textToInsert = character; // 要插入的字符 splitedText[position.lineNumber - 1] = [ lineContent.slice(0, position.column - 1), textToInsert, lineContent.slice(position.column - 1) ].join(''); editor.setValue(splitedText.join("\n")); // 正确更新光标位置:列数加1,行数保持不变 editor.setPosition({ lineNumber: position.lineNumber, column: position.column + 1 });
更优实现方式(推荐)
其实Monaco提供了官方的编辑方法executeEdits,比手动拆分文本更可靠,还能自动处理光标位置、撤销/重做等功能,代码也更简洁:
const position = editor.getPosition(); const textToInsert = character; // 使用executeEdits插入文本,自动将光标移到插入内容的后面 editor.executeEdits('virtual-keyboard', [ { range: new monaco.Range( position.lineNumber, position.column, position.lineNumber, position.column ), text: textToInsert } ]);
这个方法会自动处理文档变更,你不需要手动计算光标位置,Monaco会帮你把光标放在新插入字符的后面,完美解决你的问题。
内容的提问来源于stack exchange,提问作者Binita Gyawali
相关产品推荐
相关产品推荐

