如何在vi/Vim中的多行选择开头插入文本?

Jor*_*mer 398 vim editing viemu

Vim中,我如何在选择中的每一行的开头插入字符?

例如,假设我想通过//在每行的开头添加前缀来注释掉一段代码(假设我的语言的注释系统不允许块注释/* */).我该怎么做?

pix*_*eat 704

  • Esc进入'命令模式'
  • 使用Ctrl+ V进入可视区块模式
  • 移动Up/ Down选择要注释的行中的文本列.
  • 然后按Shift+键i并键入要插入的文本.
  • 然后点击Esc,等待1秒钟,插入的文字将出现在每一行.

有关更多信息和阅读,请查看vim wiki上的相关文章.

  • 您可以在gVim中使用Ctrl-Q作为替换(如:帮助Ctrl-V解释)但您需要使用hjkl在此模式下导航而不是箭头键 (22认同)
  • 知道为什么在推送esc后这不会做任何事情?我等了10秒才发生不到一百行的事情 - 没关系,我正在推动`Shift + v`而不是`CTRL + v`.@ vkaul11大概和你做的一样lol (14认同)
  • 不适合我(在Linux上)它不是 (11认同)
  • 如果在Windows gvim中覆盖了ctrl-v,则应编辑全局vimrc以停止包含mswin.vim. (9认同)
  • 唯一令人沮丧的是,它似乎在GVIM中覆盖了Ctrl + V. (6认同)
  • Shift+i 将我带回到插入模式,并且我丢失了通过 CTRL+V 获得的块选择。有什么理由吗? (3认同)
  • “等待一秒钟”部分让我在之前尝试发现这种方法时感到困惑。 (3认同)
  • 如果其他人像我一样感到困惑...那是 Shift + i,而不是小写 l。 (2认同)
  • CTRL不移位!那就是我所困惑的,所以要当心!现在,您能告诉我如何取消对某些行的注释吗? (2认同)
  • @mgouin 希望你在过去的一年里解决了这个问题,但我会把它留在这里,以防有人看到你的问题 - 在插入模式下,你总是可以使用`Ctrl-R(注册)`来放置(粘贴)。所以,类似于`Ctrl-V``Shift-I``Ctrl-R``"``Esc`。 (2认同)

Tom*_*lak 179

这将用"//" 替换每行的开头:

:%s!^!//!
Run Code Online (Sandbox Code Playgroud)

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

:'<,'>s!^!//!
Run Code Online (Sandbox Code Playgroud)

需要注意的是gv(正常模式)恢复上次视觉选择,这个就派上用场了,不时.

  • @HKK,通常使用正斜杠字符/作为搜索和替换命令的分隔符.在这种情况下,我们在搜索和替换中插入正斜杠,因此我们使用另一个分隔符,即感叹号! (19认同)
  • 上面的答案中感叹号的含义是什么?(:%S ^ // !!!) (4认同)
  • 谢谢!完全有道理.删除文本如下:'<,'> s!^ // !! (3认同)
  • +1,不知道你可以使用别的东西作为正则表达式分隔符(这里我使用`/`并且必须在`:s/^ /\/\/`中转义`//`而不是写`:s !^!//`) (3认同)

cyb*_*onk 81

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

:s/search/replace/
Run Code Online (Sandbox Code Playgroud)

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

:s/search/replace/g
Run Code Online (Sandbox Code Playgroud)

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

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

:%s/search/replace/c
Run Code Online (Sandbox Code Playgroud)

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

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

:14,20s/^/#/
Run Code Online (Sandbox Code Playgroud)

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

如果要使用其他注释字符(如//),请更改命令分隔符:

:14,20s!^!//!
Run Code Online (Sandbox Code Playgroud)

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

或者你总是可以逃脱//字符:

:14,20s/^/\/\//
Run Code Online (Sandbox Code Playgroud)

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

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

:set nu
Run Code Online (Sandbox Code Playgroud)


nin*_*rid 35

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

 some?
 code
 here
Run Code Online (Sandbox Code Playgroud)

将光标放在第一行,例如

: 1 Enter

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

I / / Space

 // ?some
 code
 here
Run Code Online (Sandbox Code Playgroud)

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

j . j .

 // some
 // code
 //?here
Run Code Online (Sandbox Code Playgroud)

j是一个动作命令,向下移动一行并.重复您最后编辑的命令.

  • 多数民众赞成真的很简单:) 如果你遇到麻烦可能是因为你正在键入一个条形图(另一个符号用你的\)`|`而不是大写字母`I`.起初我以为它是```. (3认同)

Yew*_*wge 25

另一种方式:

  • 移到一行的开头
  • 进入Visual Block模式(CTRL- v)
  • 选择你想要的线条(用j/ 向上/向下移动k,或者用[line]跳到一条线G)
  • I(这是资本i)
  • 输入注释字符
  • ESC


小智 19

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

:%s/^/#/
Run Code Online (Sandbox Code Playgroud)

人们会停止抱怨你缺乏正确的评论脚本.

  • 如果只想在选定的(或几行)行上添加#怎么办 (2认同)

Luc*_*man 15

如果你想了解它,请将它放在你的.vimrc中:

vmap \c :s!^!//!<CR>
vmap \u :s!^//!!<CR>
Run Code Online (Sandbox Code Playgroud)

然后,只要在可视化模式,你可以打\cç omment块,并\uü ncomment它.当然,您可以将这些快捷键击更改为任何内容.


Bri*_*per 10

另一种方式:

:'<,'>g/^/norm I//
Run Code Online (Sandbox Code Playgroud)

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

:g 在多行上执行复杂操作通常很方便,你可能想要在多种模式之间跳转,删除或添加行,移动光标,运行一堆宏等等.你可以告诉它只在行上运行匹配模式.

  • 实际上 :g 命令不是必需的。这将做: :'&lt;,'&gt;norm I// (2认同)

小智 7

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

  1. 进入命令模式

  2. % norm I ABC