使用变量默认占位符定义 UltiSnip

Define UltiSnip With Variable Default Placeholder

我正在使用出色的 UltiSnips Vim plugin 来帮助改进我的开发工作流程。我已经使用它好几年了,它确实帮助我在编码时自动化了很多多余的输入。

无论如何:我正在尝试定义一个片段来帮助我生成 Javascript require 语句。

一个普通的 Javascript require 语句看起来像这样:

let express = require('express');

所以,这是我定义的片段:

snippet req "require a module" b
let  = require('');
endsnippet

这让我可以在 Vim 中键入 req,这会将我的光标移动到代码段中的 </code> 位置,以便我可以定义变量名称。第二次点击后,我的光标将移动到代码段中 <code> 的位置,这样我就可以定义要导入的实际 Javascript 模块名称。

这很好用,但我想做的是更进一步。我想制作一个片段:

当我为 </code> 输入值时,值 <code> 默认更新为 </code> 的值。这样,在某些情况下,我可以节省两次输入相同模块名称的时间。</p> <p>我的想法是我应该能够做这样的事情:</p> <pre><code>snippet req "require a module" b let = require('${2:}'); endsnippet

这样,如果我输入:

req<tab>express

我应该得到以下扩展行:

let express = require('express');

不过,在这种情况下它应该也能工作:

req<tab>exp<tab>express

这将输出:

let exp = require('express');

这有意义吗?

无论如何:任何帮助将不胜感激!上面的代码示例并不像我想象的那样工作。 ${2:} 位被忽略并且没有按预期工作(它没有将 </code> 的占位符值设置为 <code>)。

您可以使用 python 插值来做到这一点。

snippet req "require a module"
let ${1:${VISUAL: my_name}} = require ('`!p snip.rv = t[1]`');
endsnippet

将其添加到 javascript 片段文件后,它应该会完全按照您描述的方式工作。 输入 req<tab>express 你会得到

let express = require ('express');

作为奖励,该代码段也适用于可视模式。 要以这种方式使用它,请输入 express,然后在可视模式下输入 select。 您可以将光标定位在您想要 select 的词上并键入 viw。 然后,使用模块名称 selected,输入 <tab>req<tab> 到 运行 代码段。 如果您记得在键入所需名称后要使用 require 语句,这将很有用。

我从 Drew Neil 的 Vimcasts 那里学到了大部分内容。 他在 Ultisnips 上有一系列的三个,从这个开始:http://vimcasts.org/episodes/meet-ultisnips/.

以下代码段同时满足 req<tab>expressreq<tab>exp<tab>express:(对您的想法稍作修改)

snippet req "require a module" b
let  = require('${0:}');
endsnippet

</code> 是占位符 <code> 的镜像。还用 0 替换了 2,因为片段在此占位符中结束。 要添加 visual 支持,只需将 ${VISUAL} 添加到占位符即可。由于@lwassink 提供的说明,我只给出片段:

snippet req "require a module" b
let ${1:${VISUAL}} = require('${0:}');
endsnippet