vim“gq}”命令重新换行段落,以及LaTeX

vim“gq}”命令重新换行段落,以及LaTeX

我怎样才能让这个命令不包装类似的东西\item

例如:

\begin{enumerate}
\item this might be a long paragraph that spans multiple lines 
\item blah
\end{enumerate}

如果我将光标放在第一个项目(的首字母this)上并运行“gq}”,它会产生以下输出:

\begin{enumerate}
\item this might be a long 
paragraph that spans multiple 
lines \item blah \end{enumerate}

这就是我要的:

\begin{enumerate}
\item this might be a long 
paragraph that spans multiple 
lines 
\item blah
\end{enumerate}

如果我能让 vim 识别出该标记\item表示段落的结束,我想它就能正常工作。但是我该怎么做呢?

答案1

我认为你可以通过将“formatlistpat”选项设置为包含段落分隔标签来实现这一点。你需要在“formatoptions”中包含“n”才能实现这一点。请参阅

:help 'formatlistpat'
:help 'formatoptions'

例如,

:set formatlistpat=^\\s*\\\\\\(end\\\\|item\\)\\>
:set formatoptions+=n
:set textwidth=40

格式化您的示例会产生以下结果:

\开始{枚举}
\item 这可能是一个很长的段落
     跨越多行
\item 等等
\end{枚举}

请注意,第一项的第二行按标签的长度缩进\item,因此它不是您想要的,但可能足够接近。您还可以尝试\ze帮助中提到的方法,看看是否可以让 Vim 识别标签而不缩进后续行。我没有尝试过。

更新

:let如果使用而不是 来设置,“formatlistpat”会更清晰一些,也更容易编辑:set

:let &l:flp = '^\s*\\\(end\|item\)\>'

l:部分指定它是一个缓冲区本地设置。

更新

要将缩进减少到 1 个字符,请执行以下操作:

:let &l:flp = '^\s*\\\ze\(end\|item\)\>'

请注意,如果 之前有任何空格\item,则缩进量将变为该数字 + 1。我不知道是否可以使用 将缩进量减少到 0 \ze

答案2

这是对我有用的解决方案。我编写了一个外部脚本来处理 latex 文本的格式(https://github.com/elmanuelito/par-latex

vim 中的使用示例:

  • 选择一些文本(例如 VjggVG
  • 输入“:!par-latex”(vim 命令行如下所示'<,'>!par-latex:)
  • 输入回车

使用默认选项,如果您在 itemize 环境中选择文本,它将处理您的示例。要让它在您选择更多文本时工作,您需要format_inside_group在脚本开头激活该选项。

相关内容