2

我想要一个能够处理以下场景的 Ultisnips 片段:

const [value1, value2, value3, ...valueN] = await Promise.all([
  promise1,
  promise2,
  promise3,
  ...,
  promiseN,
]);

根据我在第一个方括号内输入的内容,我想为Promise.all块内的每一行生成相同数量的新制表位。

目前我有这种方法,几乎​​可以工作:

global !p
def insert_lines(txt, start = 2, generate_value = lambda i: f'val{i}'):
    count = len(txt.split(','))

    lines = ["${" + str(i) + ":" + generate_value(i+1-start) + "}," for i in range(start, count + 2)]

    snip.expand_anon("\n".join(lines))
endglobal

post_jump "if snip.tabstop == 0: insert_lines(snip.tabstops[1].current_text, start=2)"
snippet pall "await Promise.all" b
const [${1:...items}] = await Promise.all([
    $0
]);
endsnippet

我遇到的问题是,$0我需要比我想要的多跳一次。例如,如果我有:

const [foo, bar, baz|] = await Promise.all([
  val1,
  val2,
  val3,
]);

跳到下一个制表位,我得到:

const [foo, bar, baz|] = await Promise.all([
 |val1,
  val2,
  val3,
]);

然后:

const [foo, bar, baz|] = await Promise.all([
  val1,
 |val2,
  val3,
]);

然后:

const [foo, bar, baz|] = await Promise.all([
  val1,
  val2,
  |val3,
]);

此时,如果我跳到下一个制表位,我希望到达片段的末尾,但是,会发生什么:

const [foo, bar, baz|] = await Promise.all([
  val1,
  val2,
  val3,|
]);

这有点道理,因为那是$0.

还有其他方法可以实现我想要的吗?

4

1 回答 1

0

我试图回答这个问题,因为我参与 Ultisnips 已经有一段时间了,而且我没有足够的声誉来发表评论。

您为什么不尝试放置$0at like ]);$0(您发布的代码的最后一行)?

我想它应该可以解决问题。让我知道。

编辑:使用专门为 vim 和 vi 相关问题制作的堆栈来解决此类问题。您可以在此处找到该站点。

于 2021-01-26T10:07:53.807 回答