Генерация указанного количества вложенных фрагментов с использованием Ultisnips в vim

В настоящее время у меня есть файл tex.snippets для хранения фрагментов, которые облегчают написание домашних заданий в LaTeX. Например, у меня есть фрагмент '2problem' в форме:

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

Это дает мне простой способ начать 2-х частей проблемы. Есть ли способ, однако, сделать фрагмент, который выводит проблемы из n частей? Прямо сейчас у меня есть отдельные фрагменты для отдельного числа проблем, что довольно утомительно.

2 ответа

Я знаю, это не решение ultisnip, на всякий случай: mu-template поддерживает циклы и рекурсию в фрагментах. Вот как я генерирую конструкцию switch-case из определения enum в 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)

      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, для таких вопросов. Вы можете найти сайт здесь .

Другие вопросы по тегам