469

Vim中,如何在所选内容的每行开头插入字符?

例如,//假设我的语言的注释系统不允许像/* */. 我该怎么做?

4

14 回答 14

839
  • 按下Esc进入“命令模式”
  • 使用Ctrl+V进入可视块模式
  • 移动Up/Down以选择要评论的行中的文本列。
  • 然后点击Shift+i并键入要插入的文本。
  • 然后点击Esc,等待 1 秒,插入的文本将出现在每一行。

如需更多信息和阅读,请查看Vim Tips Wiki 中的“在多行中插入文本”。

于 2008-10-31T13:02:10.193 回答
198

这将每行的开头替换为“//”:

:%s!^!//!

这将每个选定行的开头(使用可视模式进行选择)替换为“//”:

:'<,'>s!^!//!

请注意gv在正常模式下)恢复最后的视觉选择,这有时会派上用场。

于 2008-10-31T12:59:17.017 回答
91

搜索和替换的一般模式是:

:s/search/replace/

用 'replace' 替换当前行的第一次出现的 'search'

:s/search/replace/g

将所有出现的 'search' 替换为当前行的 'replace','g' 是 'global' 的缩写

此命令将仅针对当前行将每次出现的 'search' 替换为 'replace'。% 用于搜索整个文件。要以交互方式确认每个替换,请附加一个“c”以进行确认:

:%s/search/replace/c

交互式确认将整个文件的“搜索”替换为“替换”

您可以使用行号范围代替 % 字符(请注意,'^' 字符是行首的特殊搜索字符)

:14,20s/^/#/

在第 14-20 行的开头插入一个“#”字符

如果您想使用另一个注释字符(例如 //),请更改您的命令分隔符:

:14,20s!^!//!

在第 14-20 行的开头插入一个 '//' 字符序列

或者您可以随时转义 // 字符,例如:

:14,20s/^/\/\//

在第 14-20 行的开头插入一个 '//' 字符序列

如果您没有在编辑器中看到行号,只需键入以下内容

:set nu
于 2010-10-06T18:05:09.630 回答
46

对新手来说可能更容易的另一种方法:

 some█
 code
 here

将光标放在第一行,例如通过

gg

并键入以下内容以进入插入模式并添加您的文本:

I / / Space

 // █some
 code
 here

Esc返回命令模式并使用有向图:

j . j .

 // some
 // code
 //█here

j是一个向下一行的运动命令,并.重复您所做的最后一个编辑命令。

于 2009-04-08T20:15:53.653 回答
28

还有另一种方式:

  • 移动到行首
  • 进入可视块模式 ( CTRL- v)
  • j选择您想要的行(使用/向上/向下移动k,或使用 [line] 跳转到一行G
  • I(大写 i)
  • 输入评论字符
  • ESC
于 2008-11-20T19:51:29.197 回答
24

这会#在每一行的开头添加:

:%s/^/#/

人们将不再抱怨您缺乏正确的评论脚本。

于 2010-01-08T21:00:34.903 回答
16

如果你想对它超级感兴趣,把它放在你的 .vimrc 中:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>

然后,无论何时在可视模式下,您都可以点击\c评论该块并\u取消评论它。当然,您可以将这些快捷键更改为任何内容。

于 2008-10-31T13:31:55.767 回答
14

还有一种方式:

:'<,'>g/^/norm I//

/^/只是一个匹配每一行的虚拟模式。 norm允许您运行随后的正常模式命令。 I//表示在将光标跳转到行首的同时进入插入模式,然后插入以下文本(两个斜杠)。

:g对于在多行上执行复杂的操作通常很方便,您可能希望在多个模式之间跳转、删除或添加行、移动光标、运行一堆宏等。您可以告诉它只在以下行上操作匹配一个模式。

于 2008-11-02T00:00:24.687 回答
5

在每行的开头插入“ABC”:

  1. 进入命令模式

  2. % norm I ABC

于 2018-12-11T02:48:08.957 回答
3

对于注释代码块,我喜欢NERD Commenter插件。

选择一些文本:

Shift-V
...select the lines of text you want to comment....

评论:

,cc

取消注释:

,cu

或者只是切换行或块的注释状态:

,c<space>
于 2009-08-29T18:27:56.070 回答
2

我可以推荐EnhCommentify插件。

例如。把它放到你的 vimrc 中:

let maplocalleader=','
vmap <silent> <LocalLeader>c <Plug>VisualTraditional
nmap <silent> <LocalLeader>c <Plug>Traditional
let g:EnhCommentifyBindInInsert = 'No'
let g:EnhCommentifyMultiPartBlocks = 'Yes'
let g:EnhCommentifyPretty = 'Yes'
let g:EnhCommentifyRespectIndent = 'Yes'
let g:EnhCommentifyUseBlockIndent = 'Yes'

然后,您可以使用 ',c' 注释/取消注释(选定的)行

于 2008-11-02T00:12:44.193 回答
1

将要评论的区域标记为可视块 ( <C-V)

c#<ESC>p

  1. c把它挂到“#”
  2. 放回去

\q如果你经常这样做,在你的 .vimrc 中定义一个快捷方式(example )

:vmap \q c#<ESC>p
于 2015-09-29T11:39:58.233 回答
1

如果某人的多行选择实际上是一个段落,则无需手动选择行。vim 可以为你做到这一点:

  1. vip:选择并标记整个段落
  2. shift-i: 在行首插入文本
  3. escape: 离开插入模式/进入正常模式[仍然选择行开头]
  4. escape: 取消选择行首
于 2019-07-19T13:14:00.387 回答
0

投票最多的答案的映射:

第一个视觉选择所需的行,然后执行<leader>zzz,其值:

vnoremap <leader>zzz <C-V>^I-<Space><Esc>
  • <C-V>进入视觉模式
  • ^转到行首(或使用 ' 0' 到第一个非空白)
  • I以块模式插入
  • -<Space>插入“-”(例如,根据需要进行编辑)
  • <Esc>对所有可视块行应用相同的插入

或从正常模式的最后一次视觉选择:

nnoremap <leader>zzz gv<C-V>^I-<Space><Esc>
于 2021-03-20T21:34:07.380 回答