Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Vim,isn';有没有一种更有效的方法可以根据这种最佳实践来设置LaTeX段落的格式?_Vim_Latex_Formatting - Fatal编程技术网

使用Vim,isn';有没有一种更有效的方法可以根据这种最佳实践来设置LaTeX段落的格式?

使用Vim,isn';有没有一种更有效的方法可以根据这种最佳实践来设置LaTeX段落的格式?,vim,latex,formatting,Vim,Latex,Formatting,标题中提到的最佳实践是: 写段落时,从每个段落开始 一行开头的句子, 如果它溢出,每个后续的 行是选项卡式的 我使用文件附带的gVim with来编辑LaTeX文件。我目前实施上述做法的方式如下: I:设置textwidth=79,在行变长之前自动断开行 在插入完每个句子后,我手动按Enter键 如果我修改和编辑完一个句子,我会使用>>手动移动溢出,必要时在前面加上一个计数 有时,最后一步会使一个或多个溢出超过最大线宽。在这种情况下,我 gqq检查出故障线路 我一直到句子的结尾 根据需要重复步骤

标题中提到的最佳实践是:

写段落时,从每个段落开始 一行开头的句子, 如果它溢出,每个后续的 行是选项卡式的

我使用文件附带的gVim with来编辑LaTeX文件。我目前实施上述做法的方式如下:

  • I
    :设置textwidth=79
    ,在行变长之前自动断开行
  • 在插入完每个句子后,我手动按Enter键
  • 如果我修改和编辑完一个句子,我会使用>>手动移动溢出,必要时在前面加上一个计数
  • 有时,最后一步会使一个或多个溢出超过最大线宽。在这种情况下,我

  • gqq检查出故障线路
  • 我一直到句子的结尾
  • 根据需要重复步骤1和2
  • 正如你所想象的,这可能会变得乏味有没有更有效的方法来达到同样的结果?最终,我希望能够在不担心句子格式的情况下写出句子,然后使用gqap或gqip自动生成我目前手动生成的结果


    为此,我怀疑我需要自己编写一个
    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