1

有时,在执行诸如重新格式化代码中的块注释之类的操作时,我发现我需要将单词向上移动一行。在下面的示例中,假设我想将“希望”这个词移到第一行。通常我使用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.
 */

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

4

3 回答 3

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%

抓住

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

哎呀。你是对的。这里似乎发生的事情是 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.
 */

这似乎奏效了。“现在”这个词也从第三行移到了第二行,但我认为这对 Vim 来说是一个很好的决定。还有一点需要注意:如果你不喜欢那些前导*的 s,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.
 */

有点好笑,但很有道理。在我看来更像是一个段落。希望这里的东西有用。

编辑:

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

于 2013-07-22T15:43:12.277 回答
1

让 vim 处理评论块的格式怎么样。gqap做了一个段落。如果它不能满足您的要求,请查看:help 'fo(格式选项),尤其是:help 'fo-table. 例如,设置:set fo+=j可能有助于那些 C 块(加入行时自动删除评论前导。)

于 2013-07-22T15:42:22.413 回答
0

vim 中没有内置这样的东西。

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

您可以以旧方式进行:J2elr<cr>或创建映射,接收要加入的单词数作为参数,以使其更容易:

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

所以有了这个映射,如果你按下<leader>jw,vim 会等待另一个输入键,即你想要“加入”的单词数。但这不是一个完美的解决方案,因为:

  • 如果您想加入超过 9 个单词,它将无法正常工作。映射需要单个字符。

  • 它可能会做一些完全出乎意料的事情,例如,如果您按d,这两个词将被删除。

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

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

于 2013-07-22T15:43:23.080 回答