代码之家  ›  专栏  ›  技术社区  ›  Jordan Parmer

在Vim中,如何将一条真正长的线分成多条线?

vim
  •  150
  • Jordan Parmer  · 技术社区  · 16 年前

    假设我在VIM编辑器中有一个超长行(比如大约300多个字符)。我如何将它分成多行,使单词边界大约在80个字符处中断?

    例子:

    This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line
    

    This is a really long line 
    This is a really long line
    This is a really long line
    This is a really long line
    This is a really long line
    This is a ...
    
    8 回复  |  直到 8 年前
        1
  •  227
  •   he_the_great    8 年前

    Vim很容易做到这一点(在单词边界处换行)。

    gq{motion} % format the line that {motion} moves over
    {Visual}gq % format the visually selected area
    gqq        % format the current line
    ...
    

    我建议你退房 :help gq :help gw .

    同时设置文本宽度( tw )在输入过程中超过时自动换行。它用于 gq 同样,如果禁用 GQ 根据先到的窗口大小或79进行中断。

    :set tw=80
    

    通过设置包含文本宽度的格式选项,VIM将在TW设置时自动中断。

    :set fo+=t
    
        2
  •  78
  •   user80168    16 年前

    首先设置VIM,使其了解您需要80个字符:

    :set tw=80
    

    然后,打开线:

    V
    

    并使VIM重新格式化:

    gq
    
        3
  •  15
  •   Wernsey    16 年前

    这与Vim并不相关,但您可以使用 FMT 程序如

    $ fmt myfile
    
        4
  •  8
  •   smokedice    8 年前

    对于实线文本,在正常模式下使用v突出显示该区域,然后按

    :s/\v(.{80})/\1\r/g
    

    这将在每80个字符的末尾添加新行。

    :s/       replaces within the current select
    \v        uses regular expressions
    (.{80})   selects 80 characters & placed them into group one
    \1\r      replaces group one with group one and a newline
    
        5
  •  6
  •   Michael Anderson    10 年前

    如果你在*尼克斯,你可能有 fold 可用。

    选择要使用的区域 v ,然后可以使用以下命令在宽度为80的空间上打断:

    !fold --spaces --width=80

    这在本质上与使用 gq .

    但是,如果只想在字符80处中断,而不限于空格,则可以使用:

    !fold --width=80

    如果你想只按一次键就设置一个映射-我用过

    vmap <f1> !fold --width=80<CR>

        6
  •  4
  •   John Rix    11 年前

    我需要重新格式化整个文件而不是一行。正如Wernsey指出的,我本可以使用“fmt”,但vim中的以下序列也使用了这个技巧(借用这里的各种答案):

    <ESC>
    :setl tw=80 fo=t
    1GVGgq
    
        7
  •  3
  •   Brad Koch Daniel Wright    9 年前

    作为一个快速和讨厌的,可以尝试以下地图:

    map q 080lwbels<CR><ESC>
    

    上面写着:

    • 开始第0行位置,
    • 移到右边第80个字符,
    • 转到下一个词的开头,
    • 回到前一个词,
    • 转到当前单词的结尾,
    • 向右移动一个字符,然后
    • 用CR代替该字符。

    然后按q和cr将在单词边界上将该行分成若干块。

        8
  •  2
  •   Olivier Faucheux    10 年前

    要在不删除现有换行符的情况下拆分完整文档中的长行,请使用:

    :set formatoptions+=w
    :set tw=80
    gggqG