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

Posted

技术标签:

【中文标题】如何在 vi/Vim 中的多行选择的开头插入文本【英文标题】:How to insert text at beginning of a multi-line selection in vi/Vim 【发布时间】:2010-09-20 04:24:06 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

:%s!^!//!

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

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

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

【讨论】:

谢谢!完全有道理。删除文本如下:'s!^//!! 以上答案中的感叹号是什么意思? (:%s!^!//!) @HKK,通常使用正斜杠字符 / 作为搜索和替换命令的分隔符。在这种情况下,我们将插入正斜杠作为搜索和替换的一部分,因此我们使用替代分隔符,即感叹号! +1 这在 VsVim 中有效,而 (Ctrl+V) (Shiift+I) Esc 无效。 +1,不知道您可以使用其他东西作为正则表达式分隔符(这里我使用/ 并且不得不在:s/^/\/\/ 中转义// 而不是写:s!^!//【参考方案2】:Esc 进入“命令模式” 使用Ctrl+V进入可视块模式 移动 Up/Down以选择您想要的行中的文本列 评论。 然后按 Shift+i 并键入要插入的文本。 然后按Esc,等待1秒,插入的文字会出现在每一行。

如需更多信息和阅读,请查看 Vim Tips Wiki 中的“Inserting text in multiple lines”。

【讨论】:

唯一的遗憾是 Ctrl+V 在 GVIM 中似乎被覆盖了。 不适合我(在 linux 上)它不是 您可以在 gVim 中使用 Ctrl-Q 作为替代品(如 :help Ctrl-V 解释的那样),但您需要使用 hjkl 在此模式下导航,而不是使用箭头键 如果您的 ctrl-v 在 windows gvim 中被覆盖,您应该编辑全局 vimrc 以停止包含 mswin.vim。 知道为什么在按下 esc 后这不会做任何事情吗?我等了大约 10 秒钟,在不到 100 行的情况下发生了一些事情——没关系,我推的是 Shift + v 而不是 CTRL + v。 @vkaul11 可能和你做的一样,哈哈【参考方案3】:

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

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

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

【讨论】:

投了赞成票,因为它引入了一些新东西 - vmap!【参考方案4】:

另一种方式:

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

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

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

【讨论】:

实际上 :g 命令不是必需的。这会做: :'norm I// 而且 :s 在这种情况下也更好用。 这是最有用的答案。【参考方案5】:

我可以推荐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' 注释/取消注释(选定的)行

【讨论】:

你也可以在vim.org/scripts/script.php?script_id=1218使用Nerd Commenter【参考方案6】:

还有另一种方式:

移动到行首 进入可视块模式(CTRL-v) 选择你想要的行(用j/k向上/向下移动,或用[line]G跳到一行) 按I(大写i) 输入注释字符 按 ESC

【讨论】:

谢谢,这对修改服务器中的文件有很大帮助,无需额外的 VI 插件【参考方案7】:

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

 some█
 code
 here

将光标放在第一行,例如由

gg

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

I / / 空格

 // █some
 code
 here

Esc 返回命令模式并使用二合字母:

j . j .

 // some
 // code
 //█here

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

【讨论】:

这真的很简单:)。如果您遇到问题,可能是因为您正在输入一个条形(另一个带有 \ 的符号)| 而不是大写字母I。一开始我以为是| 如果我做“5”。它从同一行中删除 5 个字符。如何让它从每行一次删除 5 个字符? @RahulPrasad 假设你有 25 行,然后从第一行的前面开始,只需将 5xj 记录到一个寄存器中并播放该寄存器 24 次,例如:qa5xjq25@a 但这样会更好如果您将此作为实际问题发布(如果它不存在)...【参考方案8】:

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

选择一些文字:

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

评论:

,cc

取消注释:

,cu

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

,c<space>

【讨论】:

【参考方案9】:

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

:%s/^/#/

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

【讨论】:

如果您只想在选定的(或少数)行上添加 # 怎么办【参考方案10】:

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

:s/search/replace/

将第一次出现的“搜索”替换为当前行的“替换”

: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

【讨论】:

删除开头的#:而不是:14,20s/#/^/,你应该使用:14,20s/#// @cn1h 我认为这也将替换该行中的其他#。你应该改用^# 感谢您解释基础知识。很高兴知道为什么会发生某些事情。【参考方案11】:

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

然后做c#&lt;ESC&gt;p

    change 到 "#" 放回去

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

:vmap \q c#<ESC>p

【讨论】:

【参考方案12】:

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

    进入命令模式

    % norm I ABC

【讨论】:

这会将文本添加到该行中第一个非空格字符的左侧。【参考方案13】:

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

    vip:选择并标记整个段落 shift-i: 在行首插入文本 escape: 离开插入模式/进入正常模式[行开头仍然被选中] escape:取消选择行首

【讨论】:

【参考方案14】:

投票最多的答案的映射:

第一视觉选择所需的行,然后执行&lt;leader&gt;zzz,其值:

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

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

nnoremap <leader>zzz gv<C-V>^I-<Space><Esc>

【讨论】:

以上是关于如何在 vi/Vim 中的多行选择的开头插入文本的主要内容,如果未能解决你的问题,请参考以下文章

vi/vim 中如何在每行行首或行尾插入指定字符串

如何选择文本框中的文本,插入符号位于选择的开头?

Linux ❀ vi/vim多行前缀等长删除操作

Linux ❀ vi/vim多行前缀等长删除操作

vi/vim多行注释和取消注释

vi/vim多行注释和取消注释