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{}
我也会在它之前添加一个空行。
所以这个问题应该限制在空行上,并将光标放在下一个非空行上。
备注:
- 映射不应触及搜索历史记录。
jumplist
应该修改(与 {
和 }
相同的行为)。
这个问题是由 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'
包含 block
和 search
(无论如何默认)与 {
和 }
关于折叠 相同的行为
jumplist
已修改:使用 CTRL-I
和 CTRL-O
循环遍历这些。 (:h jumplist
)
- 允许转到文件开头
遗留问题二:
hlsearch
已关闭。如果用户想要保留当前搜索并希望看到它们突出显示,则必须进一步改进映射。可能会出现闪烁。
备注
- 允许通过
g{
从第一段跳到最后一段,使用 g}
从最后一段跳到第一段(与 {
和 }
的行为不同)
dg}
不起作用(运算符 + g}
/g{
)。在这种情况下,无论如何我更喜欢d}
。
我想为 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{}
我也会在它之前添加一个空行。
所以这个问题应该限制在空行上,并将光标放在下一个非空行上。
备注:
- 映射不应触及搜索历史记录。
jumplist
应该修改(与{
和}
相同的行为)。
这个问题是由 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'
包含block
和search
(无论如何默认)与{
和}
关于折叠 相同的行为
jumplist
已修改:使用CTRL-I
和CTRL-O
循环遍历这些。 (:h jumplist
)- 允许转到文件开头
遗留问题二:
hlsearch
已关闭。如果用户想要保留当前搜索并希望看到它们突出显示,则必须进一步改进映射。可能会出现闪烁。
备注
- 允许通过
g{
从第一段跳到最后一段,使用g}
从最后一段跳到第一段(与{
和}
的行为不同) dg}
不起作用(运算符 +g}
/g{
)。在这种情况下,无论如何我更喜欢d}
。