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

评论

另请参见superuser.com/a/1564180/73961

#1 楼

您可以使用命令: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
15年2月13日在15:26

@romainl更好吗?

–toro2k
15年2月13日在15:28

是的,最好是IMO。

– romainl
15年2月13日在15:42

它是\ r,请参见:help s / \ r。可以用键入 的文字换行符代替。在这种情况下,\ n为空字符,请参见:help s / \ n。

–toro2k
2015年2月13日在16:09



替换寄存器的内容-哪个寄存器?

–stillanoob
19年5月1日在11:49

#2 楼

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

1 a b c d e f
~


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

因此,我们可以输入0将光标移至行首,然后输入fspace将光标移至第一个空格。这样,我们便可以键入renter,结果是:现在,由于我们的可重用宏已准备好重复,因此击中q现在是个好主意。随意地,我们注意到还剩下4个空格以换行符代替。因此,通过点击4 @ q,我们将q宏重复了4次,结果是:

1 a
2 b c d e f
~


请注意,由于设置宏的方式不同,可以安全地重复执行该命令超过9000次,因为它只会影响当前行,并且由于最后一个数据条目的右边没有空格,因此fspace会“非常”失败,从而防止用换行符替换数据。 br />
所以从头开始重复一下:

qq0fspacerenterq9001 @ q

提供了我们的结果。

评论


我喜欢您的键盘上有9001键,可快速输入用户名。

–丰富
19年5月2日,12:24

#3 楼

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

在可视模式下,它将拆分所选内容,在正常模式下,您要跟随gq动作。例如,gql会将一行分割为当前设置的宽度。要将分隔线的宽度设置为与当前设置不同,可以使用:set textwidth=n,其中n是一行中想要的字符数,例如10,并在完成后更改回正常宽度。

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