使用Vim,isn';有没有一种更有效的方法可以根据这种最佳实践来设置LaTeX段落的格式?
标题中提到的最佳实践是: 写段落时,从每个段落开始 一行开头的句子, 如果它溢出,每个后续的 行是选项卡式的 我使用文件附带的gVim with来编辑LaTeX文件。我目前实施上述做法的方式如下:使用Vim,isn';有没有一种更有效的方法可以根据这种最佳实践来设置LaTeX段落的格式?,vim,latex,formatting,Vim,Latex,Formatting,标题中提到的最佳实践是: 写段落时,从每个段落开始 一行开头的句子, 如果它溢出,每个后续的 行是选项卡式的 我使用文件附带的gVim with来编辑LaTeX文件。我目前实施上述做法的方式如下: I:设置textwidth=79,在行变长之前自动断开行 在插入完每个句子后,我手动按Enter键 如果我修改和编辑完一个句子,我会使用>>手动移动溢出,必要时在前面加上一个计数 有时,最后一步会使一个或多个溢出超过最大线宽。在这种情况下,我 gqq检查出故障线路 我一直到句子的结尾 根据需要重复步骤
:设置textwidth=79
,在行变长之前自动断开行为此,我怀疑我需要自己编写一个
formatexpr
,但我不确定如何继续。我已经找到了许多插件,和,和,但它们似乎都不适合我的需要,我不知道如何修改它们来满足我的需要。我可能过于简化了这个问题,但是这个映射是否满足了您的需要
nnoremap \z (j>>gq)
因此,在正常模式下按\z将执行以下操作:从光标位置跳到句子的开头。然后转到下一行并缩进它。然后从这一行改写到句末。按照句子的顺序重新格式化才是正确的做法,而不是像你的方法那样单独地重新格式化每一行
当然,如果愿意,您可以使用插入模式映射,甚至可以尝试重新定义Enter键的行为来自动执行此操作(尽管我不知道这是否会产生意外的后果…。与制表符后续行不同的一个选项是在formatoptions中设置
w
标志。当您这样做时,它会改变Vim识别新段落的方式,以空格结尾的行会被理解为在新行上继续作为同一段落的一部分。请参见表:h
call textobj#user#plugin('latexpar', {
\ 'par': {
\ 'select-a-function': 'LaTeXPar',
\ 'select-a': 'al',
\ },
\ })
function! LaTeXPar()
let pattern='\v^$|^\s*(\\\[|\\\]|\\begin|\\end|\})|\{$'
if search(pattern,"bW")
normal! j
else
normal! gg
endif
let head_pos = getpos('.')
if search(pattern,"W")
normal! k
else
normal! G
endif
let tail_pos = getpos('.')
" echo head_pos[2]
" echo tail_pos[2]
return ["V", head_pos, tail_pos]
endfunction
如果您设置w标志并输入文本,使连续的句子行是唯一以空格结尾的句子行(并且完全放弃在任何文本行的开头输入制表符的做法),那么我认为您应该能够使用gqap
来设置文本段落的格式。为了获得逻辑结构的视觉提示,您可以设置listchars
以显示eol(即
)字符,并为
和
设置不同的高亮显示,以便容易发现句子/段落结尾
此方法的另一个好处是,您可以自然键入文本,并通过textwidth设置自动输入换行符。(只需确保LaTeX格式行不会在textwidth区域中自动断开;您希望它们具有非空格字符作为行中的最后一个字符。)一种方法不是实际断开文件中的行,而是执行以下操作:
set wrap linebreak
let &showbreak='===> '
换行
选项使长行换行,而不是延伸到屏幕外,换行
使换行仅发生在换行
选项中指定的字符处
您可以将showbreak设置为任何令您满意的内容。当我使用vim时,unicode字符可以正常工作,我最喜欢的是:
let &showbreak="\u21aa "
这就意味着↪ 符号位于每一行的开头
我还喜欢打开行号(set number
),以提供文件中实际行的另一个指示器
要使文件导航更容易,您可能需要使用
noremap j gj
noremap k gk
noremap gj j
noremap gk k
这使k和j通过显示的行而不是文件行上下移动。要影响光标键,请将
k
替换为
,将j
替换为
,这一提示也引起了我的注意。下面是我解决问题的方法(tex.vim中更改的行的差异):
基本上,当前一行以大写字母开头,以字母、数字或逗号结尾时,它会缩进新行,而前一行的“未缩进”新行以句点结尾
当然还有改进的余地(更好的标准),但对我来说,到目前为止效果还不错。我觉得@kev(以及人们的评论)的建议是最令人满意的 这里,通过设置
:set fo+=n
然后是
:let &flp='^\s*\\(item\|end\|begin)*\s*'
或
允许您键入gggqG以重新格式化整个文件。我使用该插件定义“LaTeXPar”文本对象。然后我可以使用gwal
进行格式化
已经有了一个插件,但它定义的最大文本对象是“环境”。这不是我(和OP)想要的
“LaTeXPar”由
- 空行
- 一行以
,\[
,\]
,\begin
,\end
}
- 以
{
\section
后面有一个空行,总是在一行中使用\[
\]
,等等。你可以轻松地为自己写一行
这是我的~/.vim/ftplugin/tex.vim
中的相关部分
call textobj#user#plugin('latexpar', {
\ 'par': {
\ 'select-a-function': 'LaTeXPar',
\ 'select-a': 'al',
\ },
\ })
function! LaTeXPar()
let pattern='\v^$|^\s*(\\\[|\\\]|\\begin|\\end|\})|\{$'
if search(pattern,"bW")
normal! j
else
normal! gg
endif
let head_pos = getpos('.')
if search(pattern,"W")
normal! k
else
normal! G
endif
let tail_pos = getpos('.')
" echo head_pos[2]
" echo tail_pos[2]
return ["V", head_pos, tail_pos]
endfunction
我想这可能是@Matteo的材料。这是一个Vim问题,这使它更适合这里。我修改了标题以表明这一点。缩进段落后面的句子有什么用呢?段落已经用em分隔了
call textobj#user#plugin('latexpar', {
\ 'par': {
\ 'select-a-function': 'LaTeXPar',
\ 'select-a': 'al',
\ },
\ })
function! LaTeXPar()
let pattern='\v^$|^\s*(\\\[|\\\]|\\begin|\\end|\})|\{$'
if search(pattern,"bW")
normal! j
else
normal! gg
endif
let head_pos = getpos('.')
if search(pattern,"W")
normal! k
else
normal! G
endif
let tail_pos = getpos('.')
" echo head_pos[2]
" echo tail_pos[2]
return ["V", head_pos, tail_pos]
endfunction