UltiSnips:如何冻结vim.current.window.cursor值修复代码片段异常
解决Neovim中UltiSnips注释块等号长度随输入缩短的问题
这问题我之前折腾过好一会儿!核心原因是UltiSnips默认会在片段的每一步(比如你在占位符里输入内容时)重新执行所有!p代码块。原来的写法里,每次光标移动(输入内容时光标会右移),vim.current.window.cursor[1]都会取新的位置,导致等号长度跟着缩水。
要冻结光标位置的值,关键是在片段触发的瞬间就把光标列号存成一个变量,之后全程用这个固定变量计算等号长度。修改后的代码如下:
snippet #= "comment ===" b !p pos = vim.current.window.cursor[1] # `!p snip.rv = '=' * (78 - pos)` # ${1:comments} # `!p snip.rv = '=' * (78 - pos)` endsnippet
为什么这样有效?
- 第一行的
!p pos = vim.current.window.cursor[1]只会在你触发片段的那一刻执行一次,把当时的光标列号存在pos变量里。 - 后面两个
!p代码块都用这个固定的pos值计算等号长度,不管你在${1:comments}里输入多少内容,光标怎么移动,等号的长度都不会再变了。
另外提个小细节:如果你的注释行宽度不是78,可以自己调整那个数字,改成你习惯的宽度就行。
内容的提问来源于stack exchange,提问作者Nic




