如何在Vimscript中创建单词式字符串修复翻译插件粘贴错位问题
解决Vim插件中翻译内容换行的问题
我明白你遇到的这个烦恼——在可视化模式选中内容后,翻译结果总是跑到下一行,这确实影响使用体验。问题的核心在于Vim处理寄存器内容的"模式类型":如果你的翻译字符串是以行式(line-wise)存储的,粘贴时就会自动换行;而我们需要让它以字符式(character-wise,也就是你说的"单词式")来处理,这样就能直接替换选中的内容,不会跳行。
下面给你两种可行的解决方案:
方法1:将翻译字符串设置为字符式寄存器内容
在Vimscript中,你可以用setreg()函数明确指定寄存器的内容类型。假设你的翻译结果存在变量translated_str中,你可以这样把它存入默认寄存器("),并指定为字符式:
call setreg('"', translated_str, 'v')
这里第三个参数'v'代表character-wise模式,之后你用p或者在插件里执行normal! p来粘贴时,内容就会直接替换选中的部分,不会换行。
方法2:直接替换选中内容(无需依赖寄存器)
如果你不想操作寄存器,也可以直接在可视化选中的区域执行删除+插入操作,这样更直接:
execute "normal! gvc" . translated_str
解释一下:gv会重新选中之前的可视化区域,c会删除选中内容并进入插入模式,接着插入翻译后的字符串,最后自动回到正常模式——这样完全不会出现换行问题。
如果需要更精确地处理跨多行的选中内容,也可以用范围替换的方式:
" 获取可视化选中的起止位置 let [lnum1, col1] = getpos("'<")[1:2] let [lnum2, col2] = getpos("'>")[1:2] " 精准替换选中范围内的内容 execute lnum1 . "," . lnum2 . "s/\%>" . (col1-1) . "c.*\%<" . (col2+1) . "c/" . escape(translated_str, '/\') . "/"
额外提示
如果你是在处理单词级别的选中(比如用户用viw选中单词),上面的两种方法已经能覆盖场景,不管是字符选中还是单词选中,都能保证翻译内容直接替换原选中区域。
内容的提问来源于stack exchange,提问作者Michael Ness
相关产品推荐
相关产品推荐

