如何有效地将一条线分成多条线?


11

我一直在一个文本文件中接收记录的数据,该文本文件只是一个长行,每个值都用空格分隔。是否有一个或一组命令会将一行分成多行?

Answers:


21

您可以使用命令简单地用换行符替换行上的任何连续空格:s/\s\+/\r/g\s\+表示一个或多个空格字符,并且\r是换行符,请参见:help :substitute:help regexp有关详细信息。如果在以下行中运行命令:

foo bar baz

你得到:

foo
bar
baz

如果hlsearch启用了此功能,但又不想在屏幕上到处都突出显示空格,则可以编写如下所示的小功能来避免它:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction

“如果您不想让屏幕上到处都有突出显示的空间而使画面混乱”,则可以认为OP的设置太多了。
romainl

@romainl更好吗?
toro2k 2015年

1
是的,最好是IMO。
romainl

2
是的\r,看:help s/\r。可以用文字换行符代替<c-v><cr>。在此上下文\n中为空字符,请参见:help s/\n
toro2k 2015年

1
replaces the content of the register-哪个寄存器?
stillanoob

5

使用vim的替换可能是完成任务的更好方法之一,但是您也可以使用宏。假设我们有以下数据,光标位于第1行:

1 a b c d e f
~

从正常模式qq开始,点击将开始记录可通过调用的宏@q。之后键入的任何内容qq都可以通过上述调用重复进行。我们的目标是记录足够通用的常规命令,以实现无缝重复。

因此,我们可以键入0将光标移到行首,然后fspace将光标移到第一个空格。然后renter,我们可以输入,导致:

1 a
2 b c d e f
~

q现在点击是个好主意,因为我们可重复使用的宏已准备好进行重复。任意地,我们注意到还有4个空格要用换行符代替。因此,点击,4@q我们将q宏重复4次,结果是:

1 a
2 b
3 c
4 d
5 e
6 f
~

请注意,由于我们设置宏的方式,将命令重复执行9000次是安全的,因为它只会影响当前行,并且由于最后一个数据条目的右边没有空格,因此fspace将“很好”的失败,阻止了用换行符替换数据。

所以从头开始重复一下:

qq0fspacerenterq9001@q

提供我们的结果。


1
我喜欢9001您的键盘上有一个按键,可以快速输入用户名。
Rich

4

我发现在Vim中分割行的最简单方法是普通模式命令gq(在普通模式或可视模式下快速连续键入两个字母)。

在可视模式下,它将拆分所选内容,在正常模式下,您将跟随gq动作。

例如,gql将一条线拆分为当前设置的宽度。要将分割线的宽度设置为与当前设置不同,可以使用:set textwidth=n,例如,其中n的行数是您想要的字符数,例如,完成后10变回常规宽度。

从Kholidfu 的Youtube 视频中获得了此信息,该视频演示了如何在普通模式下使用动作连接和分割线。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.