使用可变默认占位符

时间:2016-07-31 19:39:43

标签: javascript vim ultisnips

我正在使用优秀的UltiSnips Vim plugin来帮助改进我的开发工作流程。我已经使用它好几年了,它确实帮我在编码时自动完成了很多冗余打字。

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

正常的Javascript require语句如下所示:

let express = require('express');

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

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

这允许我在Vim中键入req,然后将光标移动到代码段中的${1}位置,以便我可以定义变量名称。第二次点击后,我的光标将移动到代码段中${2}的位置,这样我就可以定义要导入的实际Javascript模块名称。

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

当我输入${1}的值时,默认情况下,值${2}会更新为${1}的值。这样,在某些情况下,我可以节省两次输入相同的模块名称。

我的想法是我应该能够做到这样的事情:

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

这样,如果我输入:

req<tab>express

我应该得到以下扩展的一行:

let express = require('express');

但是,它也适用于这种情况:

req<tab>exp<tab>express

哪个会输出:

let exp = require('express');

这有意义吗?

无论如何:任何帮助将不胜感激!上面的代码示例不像我想的那样工作。 ${2:${1}}位被忽略,无法按预期工作(它不会将${2}的占位符值设置为${1}

2 个答案:

答案 0 :(得分:3)

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

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

$1是占位符${1}的镜像。还将2替换为0,因为代码段在此占位符中结束。 要添加直观支持,只需向占位符添加${VISUAL}即可。由于@ lwassink 提供了说明,我只是提供代码段:

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

答案 1 :(得分:2)

你可以用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,然后在可视模式下选择express。 您可以将光标放在要选择的单词上并键入viw来完成此操作。 然后,选择模块名称,输入<tab>req<tab>以运行代码段。 如果您在键入要要求的名称后想要使用require语句,这将非常有用。

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