在vim中使用Ultisnips生成指定数量的子代码段

在vim中使用Ultisnips生成指定数量的子代码段,vim,ultisnips,Vim,Ultisnips,我目前有一个tex.snippets文件来保存代码片段,这使得用LaTeX编写家庭作业更加容易。例如,我有一个“2problem”片段,其形式如下: snippet 2problem \begin{homeworkProblem} \begin{enumerate} \item[] $1 $2 \item[] $3 $4 \end{enumera

我目前有一个tex.snippets文件来保存代码片段,这使得用LaTeX编写家庭作业更加容易。例如,我有一个“2problem”片段,其形式如下:

snippet 2problem
    \begin{homeworkProblem}
        \begin{enumerate}
            \item[] $1
                $2
            \item[] $3
                $4
        \end{enumerate}
    \end{homeworkProblem}
endsnippet

这给了我一个开始两部分问题的简单方法。但是,有没有办法制作一个输出n部分问题的代码段?现在,我为不同数量的问题提供了不同的代码段,这相当乏味。

我知道,这不是一个ultisnip解决方案,以防万一:支持循环和代码段。我如何在C和C++中生成一个。定义代码段有点麻烦,但效果很好。

将代码段定义用作:

post_jump "dynamicsnippet(snip)"
snippet '(\d+)problem' rb
        \begin{homeworkProblem}
                \begin{enumerate}
`!p snip.rv=create_partprob(int(match.group(1)))`
                \end{enumerate}
        \end{homeworkProblem}
endsnippet
将这段代码附加到所需代码段文件的末尾。(可能类似于tex.snippets)

它在我的编辑器和Ultisnips中起作用,希望在你的编辑器和Ultisnips中也起作用。 祝你好运

编辑:使用专门为vim和vi相关问题设计的堆栈处理此类问题。你可以找到这个网站

global !p
def dynamicsnippet(snip):
    # Create anonymous snippet body
    anon_snippet_body = ""

    # Get start and end line number of expanded snippet
    start = snip.snippet_start[0]
    end = snip.snippet_end[0]

        # Append current line into anonymous snippet
    for i in range(start, end + 1):
        anon_snippet_body += snip.buffer[i]
        anon_snippet_body += "" if i == end else "\n"

    # Delete expanded snippet line till second to last line
    for i in range(start, end):
        del snip.buffer[start]

    # Empty last expanded snippet line while preserving the line
    snip.buffer[start] = ''

    # Expand anonymous snippet
    snip.expand_anon(anon_snippet_body)
def create_partprob(n):
 out=""
 placeholder=1
 for _ in range(0,n):
   out+=24*" "+"\\item[] $"+f"{placeholder}\\\\\\\\\n"
   placeholder+=1
   out+=24*" "+"   $"+f"{placeholder}\\\\\\\\\n"
   placeholder+=1
 out=out[:-1]
 return out
endglobal