我经常被“转换”和“包含”到更大的文档中而困扰。我编写了一些脚本和巫术来减轻我的工作量,但我仍然经常面临将给我的纯文本列表手动转换为 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“标记”来标记找到的点,并使用这些标记再次选择同一组行。以下映射完成所有这些操作(并使用标记名称a
和b
):
: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
。此时我们再次选择了\item
s集<f5>itemize<cr>
按下键F5并选择itemize
环境。这将调用一个latex-suite
宏,将选择内容包含在itemize
环境中。
这涵盖了项目之间有空行,以及项目周围有非空行的情况。