【问题标题】:Generating a specified number of sub-snippets using Ultisnips in vim在 vim 中使用 Ultisnips 生成指定数量的子片段
【发布时间】:2021-01-26 18:23:00
【问题描述】:

我目前有一个 tex.sn-ps 文件来保存 sn-ps,这使得在 LaTeX 中编写作业更容易。例如,我有一个 sn-p '2problem' 的形式:

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

这给了我一个开始两部分问题的简单方法。然而,有没有办法制作一个输出 n 部分问题的 sn-p?现在我有单独的sn-ps来处理不同数量的问题,这很乏味。

【问题讨论】:

    标签: vim ultisnips


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用 sn-p 定义为:

      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
      

      将这段代码附加到所需的 sn-ps 文件的末尾。(可能类似于 tex.sn-ps)

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 2021-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多