有时在做代码中重新格式化块注释的事情时,我发现我需要将单词向上移动一行。在下面的例子中,我想把'希望'这个词移到第一行。通常我使用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”这样的东西加入下一行的前两个单词会很棒。
答案 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
,则会删除这两个字。
如果你想要一个更好的解决方案,你可以编写一个函数并进行映射来调用它。如果值得做的话。
我更喜欢手动加入和剪切。