vim 中的智能段落重排?

vim 中的智能段落重排?

我不确定这个问题是否适合 tex.SE。如果您认为不应该在这里问这样的问题,请表达您的担忧。如有必要,我会在 meta 上提出问题。

为了便于阅读,我喜欢将源文件中的行长保持在 80 个字符左右。Vim 有一个不错的快捷方式gqap,可以重新排列当前段落以适应 80 个字符,而不会因行太短而浪费空间。它甚至保留了缩进。不幸的是,它认为段落是用空行标记的,并且认为没有被空行分隔的所有内容都在同一段落中。特别是任何方程式(以\[或开头\begin{...})始终被视为段落的一部分并重新排列。

有没有办法让 vim 在这方面更智能地处理 LaTeX 语法?还有其他文本编辑器可以做到这一点吗?

(我知道我可以只突出显示文本然后使用gq,但如果可能的话,我希望有一个命令来重新排列一个段落,而无需手动标记该段落是什么。)

答案1

我的文件中有以下函数$VIM/ftplugin/context.vim来格式化 ConTeXt 段落(与 LaTeX 相同:环境包含在\start...and中\stop...而不是\begin{...}and \end{...})。它应该很容易适应 LaTeX(事实上,我认为我最初是从为 LaTeX 编写它的人那里复制而来,并将其改编为 ConTeXt)。

" Reformat lines (getting the spacing correct) {{{
fun! TeX_fmt()
    if (getline(".") != "")
    let save_cursor = getpos(".")
        let op_wrapscan = &wrapscan
        set nowrapscan
        let par_begin = '^\(%D\)\=\s*\($\|\\start\|\\stop\|\\Start\|\\Stop\|\\\(sub\)*section\>\|\\item\>\|\\NC\>\|\\blank\>\|\\noindent\>\)'
        let par_end   = '^\(%D\)\=\s*\($\|\\start\|\\stop\|\\Start\|\\Stop\|\\place\|\\\(sub\)*section\>\|\\item\>\|\\NC\>\|\\blank\>\)'
    try
      exe '?'.par_begin.'?+'
    catch /E384/
      1
    endtry
        norm V
    try
      exe '/'.par_end.'/-'
    catch /E385/
      $
    endtry
    norm gq
        let &wrapscan = op_wrapscan
    call setpos('.', save_cursor) 
    endif
endfun

nmap Q :call TeX_fmt()<CR>

答案2

我知道对其他答案发表评论是违反政策的,但在这种情况下——考虑到我缺乏直接对相关答案发表评论所需的 50 点声誉——我认为这是值得的。

Aditya 提供的函数完美适用于 LaTeX,但有一个细节除外:通常在开始一个环境或一个部分后,下一行将是 \label{}。原始 TeX_fmt() 函数错误地将此行视为段落的一部分。要解决此问题,请将设置 par_begin 的行修改为:

let par_begin = '^\(%D\)\=\s*\($\|\\label\|\\begin\|\\end\|\\[\|\\]\|\\\(sub\)*section\>\|\\item\>\|\\NC\>\|\\blank\>\|\\noindent\>\)'

基本上,在 \begin 之前添加一个 \label。

利润!!

答案3

以下解决方案仅适用于段落格式,它将根据 LaTeX 样式设置正常工作。

另一个可能的解决方案是设置一个硬包装最多 80 个字符。

http://vimcasts.org/episodes/hard-wrapping-text/

formatoptions

t- 使用 textwidth 自动换行

c- 使用文本宽度自动换行注释,自动插入当前注释引线。

a- 自动格式化段落。

以下是一些设置命令:

:set formatoptions=tc
:set fo+=a
:set textwidth=80

提示:使用autocmdftplugin文件夹根据文件类型自动设置这些设置。运行help: ftpluginvim获取更多信息。

请阅读此处了解有关格式化的更多信息:

http://vimdoc.sourceforge.net/htmldoc/change.html#fo-table

答案4

我遇到了同样的问题。这是对我有用的解决方案。我编写了一个外部脚本来处理 latex 文本的格式(https://github.com/elmanuelito/par-latex)。我通常会一次性重新格式化整个文档,但也可以逐段进行。

vim 中的使用示例:

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

您可以自定义脚本(它基于一些正则表达式)并在开始时更改一些参数。

相关内容