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

时间:2015-01-27 04:42:34

标签: vim ultisnips

我目前有一个tex.snippets文件来保存片段,这使得在LaTeX中编写作业变得更容易。例如,我有一个代码片段' 2问题'形式:

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

这为我提供了一个简单的方法来解决两部分问题。但是,有没有办法制作一个输出n部分问题的片段?现在我有单独的片段来解决单独的问题,这是非常繁琐的。

2 个答案:

答案 0 :(得分:0)

我知道,这不是一个ultisnip解决方案,以防万一:mu-template支持循环和recursion的摘要。我是如何在C和C ++中生成switch-case construct from an enum definition的。定义它有点麻烦,但效果很好。

答案 1 :(得分:0)

使用片段定义为:

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)

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

它适用于我的编辑器和 Ultisnips,希望它也适用于您的编辑器。 祝你好运!

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