如何在不产生空格的情况下连接线?


72

J用于连接行的标准命令用空格替换换行符。这在编辑“文学”时很有用,但是如果我忘记手工删除一个多余的空间,比如说我手动编辑一个十六进制转储会很麻烦。

有没有一种快速简便的方法来连接两条线而又不会在它们之间留出空间?

Answers:


86

gJ组合做到这一点; 来自:help gJ

连接[count]行,最少两行。请勿插入或删除任何空格。

J如果您想保存击键,可以将其重新绑定到:

:nnoremap J gJ

请注意,这不会删除任何空格,因此,如果当前行以空格结尾或下一行以一个或多个空格开头,它们将保持原样

所以:

Hello
    world

成为:

Hello    world

我们可以Jx在这种情况下使用,那么它将是Helloworld,但并非在所有情况下都有效;来自帮助:

连接突出显示的行,最少两行。删除缩进并最多插入两个空格

[...]

除非有尾随空格或下一行以')'开头,否则这些命令(“ gJ”除外)将在空格处插入一个空格。

因此,在某些情况下,会插入一个以上的空格或不插入任何空格。据我所知,没有简单的方法可以改变这种行为。我创建了一个函数来修改gJ为始终加入空格:

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

另请参阅::help J:help 'joinspaces'


使用此功能时是否可以使用某些“保留”功能来保持光标位置,或者如何获得此结果?
SergioAraujo

8

您可以尝试的另一种技巧是使用replace。有时这可能很有用。

%s/$\n//g

场景:删除最后一个字符并与下一行连接:

%s/=$\n\(.\)/\1/g

例如,

xxxx=
123

变成:

xxxx123

3

创建一个宏并重用它:

qaJxq

现在,a通过使用@a您想在没有空格的情况下连接两行的任何位置来重播宏。

@@将重复上一个宏。因此,您只需按住@即可加入多行。


1
为什么@a可以打字Jx?相同数量的按键和SHIFT按键!
Shahbaz

2
@Shahbaz也许是因为最后一行:“您可以按住@”
muru

1
@muru,是的!
Shahbaz

4
它还使它成为可重复的命令,因此您可以3@a用来连接3行,而这样做3Jx会将3行与空格连接起来,然后删除第二行和第三行之间的空格,而在其他行之间保留空格。
哈金,

1

要始终加入单个空格:

nmap J gJi <ESC>ciW <ESC>

要完全没有空间加入(删除尾随+前导空间):

nmap <C-J> gJi <ESC>diW

1
欢迎光临本站!您的映射对我来说似乎有点过分设计,如果您可以添加一些更多关于它们如何工作的说明,将很有帮助。
statox

1

选择要合并的行,在正常模式下通过键入冒号输入一个Ex命令:。然后键入以下命令:

s/$\n\s*//gc

整个命令应如下所示:

:'<,'>s/$\n\s*//gc

这实际上是@insidepower命令的经过调整的版本,该命令替换了空格和换行符。

说明:

  • '<,'> 意味着我们只修改在可视模式下选择的线。

  • /$\n\s*正则表达式模式。我们正在寻找以$换行符结尾且此后\n具有不确定数量的空格的匹配项*

  • s/pattern//gc是替代命令,用于查找每个模式并在确认时将其替换为空字符。

要了解有关Vim中正则表达式的标志和元字符的更多信息,请参阅《 Vim参考》这一章。


2
大家好,欢迎来到Vi和Vim!您在那里有一个写得很好的答案;对此表示敬意。我的一个提要是vim正则表达式= / = python正则表达式,有时这会使用户感到困惑。也许链接到Vim regex的帮助文档?
D. Ben Knoble

2
第二个要点:您引用的答案由@ insidepower编写,由Peter编辑。
D. Ben Knoble
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.