Vim: 改进了tex文件的段落跳转

Vim: refined paragraph jumping for tex files

我想为 tex 文件更改 vim 中 {} 的行为。

在 tex 文件中,段落通常由一个或多个空行分隔。

光标应该像 nroff 宏(例如 .sh)一样放在段落的第一行,而不是放在分隔的空行上。 Afaik,调整 :set paragraphs 不允许这样做 (see here).

值得注意的极端情况是:\indent\noindent\paragraph{}\subparagraph{},可能还有更多。不幸的是,全面的解决方案会非常复杂,请参阅 https://tex.stackexchange.com/q/13085/in-how-many-ways-can-you-create-a-paragraph-in-latex

但我不需要这个。即使我使用 \paragraph{} 我也会在它之前添加一个空行。

所以这个问题应该限制在空行上,并将光标放在下一个非空行上。

备注:

这个问题是由 junegunn 的插件 limelight.vim 提出的。

一种方法是:

nnoremap g} :call search('^$\n\s*\zs\S')<CR>
nnoremap g{ :call search('^$\n\s*\zs\S', 'b')<CR>

剩余问题:

  • 一种改进可能是将闭合折叠(例如插件 vimtex 的折叠部分)视为单个段落。
  • 遵守块的 'foldopen' 设置(与 {} 相同的行为)
    这可能也解决了第一个问题。
  • 无法转到文件开头。

改进的映射

nnoremap <silent> g} 
            \ :let old = @/
            \ <bar>/^$\n\s*\zs\S<CR>
            \ <bar>:nohlsearch
            \ <bar>call histdel('/', -1)
            \ <bar>let @/ = old<CR>
nnoremap <silent> g{
            \ :let old = @/
            \ <bar>?\(^$\n\s*\zs\S\)\<bar>\%^<CR>
            \ <bar>:nohlsearch
            \ <bar>call histdel('/', -1)
            \ <bar>let @/ = old<CR>
  • 不要污染搜索历史
  • 通过设置 :set 'foldopen' 包含 blocksearch(无论如何默认)与 {} 关于折叠
  • 相同的行为
  • jumplist 已修改:使用 CTRL-ICTRL-O 循环遍历这些。 (:h jumplist)
  • 允许转到文件开头

遗留问题二:

  • hlsearch 已关闭。如果用户想要保留当前搜索并希望看到它们突出显示,则必须进一步改进映射。可能会出现闪烁。

备注

  • 允许通过 g{ 从第一段跳到最后一段,使用 g} 从最后一段跳到第一段(与 {} 的行为不同)
  • dg} 不起作用(运算符 + g}/g{)。在这种情况下,无论如何我更喜欢d}