如何使用 Vim + LatexSuite 将纯文本列表转换为逐项列举/枚举等

如何使用 Vim + LatexSuite 将纯文本列表转换为逐项列举/枚举等

我经常被“转换”和“包含”到更大的文档中而困扰。我编写了一些脚本和巫术来减轻我的工作量,但我仍然经常面临将给我的纯文本列表手动转换为 LaTeX 的任务,例如:

1. Foo
2. Bar

执行此操作时,我在可视模式下选择纯文本列表,并将前缀替换为\item。在此示例中,s/^../\\item/结果为:

\item Foo
\item Bar

然后我再次选择列表并点击F5,当系统询问我想要哪个环境时,我会输入itemize(或其他内容),这最终会得到我想要的结果:

\begin{itemize}
\item Foo
\item Bar
\end{itemize}

我的问题是:如何在 Vim 中创建一个快捷方式,一次性完成两个步骤?最终我只想选择一个列表并点击F6

当然,我需要偶尔重新定义函数(或只是全局变量),以便在用 \item 替换前缀时使用不同的模式并使用不同的环境。我认为一旦我让初始快捷方式/功能正常工作,我就可以做到这一点。

答案1

如果您的行列表被空行包围,则以下映射将起作用:

:map <f6> {jV}:s/^../\\item/<cr>{jV}k<f5>itemize<cr>

将光标放在编号列表中的任意位置,然后按F6

更新

更通用的方法是向后搜索直到第一行不以数字开头,然后从中选择直到最后一行以数字开头。在选定的范围内,数字被替换\item。然后我们必须再次标记相同的范围以将其转换为itemize,这很棘手,因为我们不能使用相同的正则表达式来选择(因为数字被替换了)。我们可以使用 vi“标记”来标记找到的点,并使用这些标记再次选择同一组行。以下映射完成所有这些操作(并使用标记名称ab):

:map <f6> ?^\D<cr>jmaV/<cr>kmb:s/^../\\item/<cr>'aV'b<f5>itemize<cr>

也许我们可以剖析一下这种黑魔法:

  • :map <f6>为键 创建一个映射F6。当按下该键时,将“执行”以下击键序列。
  • ?^\D<cr>将光标移动到与正则表达式匹配的第一行(向后)^\D,这意味着“行首后跟一个非数字”
  • j前进到下一行
  • ma将当前光标位置存储在 mark 中a
  • V在可视模式下开始选择
  • /<cr>前进到与最后使用的正则表达式匹配的下一行(向前),即前进到以非数字字符开头的第一行。
  • k移至上一行
  • mb将光标位置存储在 mark 中b
  • :s/^../\\item/<cr>将选定范围内每行的前两个字符替换为\item
  • 'a移动到存储的标记a(选择的开始处)
  • V重新开始视觉选择
  • 'b移动到标记b。此时我们再次选择了\items集
  • <f5>itemize<cr>按下键F5并选择itemize环境。这将调用一个latex-suite宏,将选择内容包含在itemize环境中。

这涵盖了项目之间有空行,以及项目周围有非空行的情况。

相关内容