如何将下一个N个单词(Shift + J)连接到当前行而不是整行?

时间:2013-07-22 15:13:27

标签: vim vi

有时在做代码中重新格式化块注释的事情时,我发现我需要将单词向上移动一行。在下面的例子中,我想把'希望'这个词移到第一行。通常我使用Shift+J加入整行,将光标移动到“希望”一词之后,然后按Enter将该行的其余部分移回。

/* Line 1 of some large comment block,
   hopefully it contains well written documentation. I'd
   now like 'hopefully' to be on the first line.
 */

即使看起来并不多,但如果很多行都需要这种改变,那么我目前正在执行的命令序列会变得乏味。是否存在Join命令的变体,只能对下一行中的前N个单词执行此操作?像“2wJ”这样的东西加入下一行的前两个单词会很棒。

3 个答案:

答案 0 :(得分:4)

坏消息

我不确定你的建议存在的东西,虽然它绝对可以--Vim每天都让我感到惊讶。我确信有人知道。

好消息

有更好的方法来实现你想要的!或者,我想要的想法。您可以告诉Vim对给定的文本区域执行格式化操作。您所要做的就是将textwidth设置为您想要的最大宽度,然后使用gq{motion}格式化{motion}移动的文本。以你的例子:

/* Line 1 of some large comment block,
   hopefully it contains well written documentation. I'd
   now like 'hopefully' to be on the first line.
 */

你只需设置一个合理的textwidth - 这里看起来你要约50 - 然后格式化评论。将光标放在第一个/

:set textwidth=50
gq%

Catch

但是等等,你说,没有用!

糟糕。你是对的。这里似乎发生的事情是Vim不理解这种格式。当我遵循自己的指示时,我看到了这一点,尽管你的里程可能会有所不同:

/* Line 1 of some large comment block,
   hopefully it contains well written 
documentation. I'd now like 'hopefully' to be on 
the first line.
 */

看起来不对,但事实并非如此。但是,如果我将块注释重新格式化为Vim识别的内容(这是我编写块注释的方式),如下所示:

/* 
 * Line 1 of some large comment block,
 * hopefully it contains well written documentation. I'd
 * now like 'hopefully' to be on the first line.
 */

然后我gq%textwidth仍为50)我得到:

/* 
 * Line 1 of some large comment block, hopefully 
 * it contains well written documentation. I'd now 
 * like 'hopefully' to be on the first line.
 */

这似乎有效。 “now”这个词也从第三行移到了第二行,但我认为这对Vim来说是一个很好的决定。还有一点需要注意:如果你不喜欢那些领先*的人,Vim也会用这种格式做得很好:

/* 
   Line 1 of some large comment block,
   hopefully it contains well written documentation. I'd
   now like 'hopefully' to be on the first line.
 */

当我gq%时,我得到:

/* 
   Line 1 of some large comment block, hopefully 
it contains well written documentation. I'd now 
like 'hopefully' to be on the first line.
 */

有点好笑,但这很有道理。看起来更像是一个段落给我。希望这里的内容很有用。

修改

正如另一个答案中提到的那样,你可以在我上面使用gqap的任何地方使用gq%。谢谢!

答案 1 :(得分:1)

如何让vim处理评论块的格式。 gqap执行一个段落。如果它无法满足您的需求,请查看:help 'fo(格式选项),尤其是:help 'fo-table。例如,设置:set fo+=j可能对这些C块有帮助(在连接线时自动删除注释引导线。)

答案 2 :(得分:0)

vim中没有内置的东西。

想想2wJ,vim会认为你想要向前移动两个单词,然后加入。

您可以用旧方式执行此操作:J2elr<cr>或创建映射,接收您要加入的字词数作为参数,以便更轻松:

nnoremap <expr> <leader>jw 'J' . nr2char(getchar()) . 'elr<CR>'

因此,使用此映射,如果按<leader>jw,vim将等待另一个输入键,即您要“加入”的单词数。 然而,这不是一个完美的解决方案,因为:

  • 如果您想加入超过9个字,它将无效。映射需要单个字符。

  • 它可以完全出乎意料,例如,如果按d,则会删除这两个字。

  • 如果你想要一个更好的解决方案,你可以编写一个函数并进行映射来调用它。如果值得做的话。

我更喜欢手动加入和剪切。