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

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

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

437281 次浏览

每一行的开头替换为"//":

:%s!^!//!

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

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

gv(在正常模式下)恢复上次的可视选择,这有时很方便。

  1. Esc进入“命令模式”
  2. 使用Ctrl+V进入可视块模式
  3. 移动向上/ __abc1来选择你想要的行中的文本列 李置评。< / >
  4. 然后点击转变+,输入你想要插入的文本。
  5. 然后点击Esc,等待1秒,插入的文本将出现在每行。

欲了解更多信息和阅读,请查看&;在多行中插入文本"在Vim Tips Wiki中。

如果你想要更加花哨,把这个放在你的。vimrc中:

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

然后,无论何时在可视模式下,你都可以按\c来__abc2注释块,按\u来__abc3注释块。当然,你可以把这些快捷键击变成任何东西。

还有另一种方式:

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

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

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

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

还有另一种方式:

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

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

 some█
code
here

把光标放在第一行上,例如by

gg

然后输入以下命令进入插入模式并添加文本:

__abc0 __abc1 __abc1 __abc3

 // █some
code
here

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

__abc0 __abc1 __abc0 __abc1

 // some
// code
//█here

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

对于注释代码块,我喜欢书呆子评论者插件。

选择一些文本:

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

备注:

,cc

取消:

,cu

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

,c<space>

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

:%s/^/#/

人们将不再抱怨你缺乏适当的注释脚本。

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

:s/search/replace/

将当前行中第一次出现的'search'替换为'replace'

:s/search/replace/g

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

此命令将只替换当前行中出现的'search'。%用于搜索整个文件。要交互式地确认每个替换,需要添加一个'c'来确认:

:%s/search/replace/c

交互式确认替换'搜索'与'替换'为整个文件

你可以使用行号范围(注意'^'字符是一行开始的特殊搜索字符)来代替%字符:

:14,20s/^/#/

在第14-20行开始处插入'#'字符

如果你想使用另一个注释字符(比如//),那么改变你的命令分隔符:

:14,20s!^!//!

在第14-20行开始处插入'//'字符序列

或者你可以像这样转义//字符:

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

在第14-20行开始处插入'//'字符序列

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

:set nu

将注释区域标记为可视块(<C-V)

并执行c#<ESC>p

  1. change为“#”
  2. 放回去

如果你经常这样做,在你的.vimrc中定义一个捷径(例如\q)

:vmap \q c#<ESC>p

插入“;ABC"每行开头:

  1. 进入命令模式

  2. < p > % norm I ABC

如果有人的多行选择实际上是一个段落,则不需要手动选择行。Vim可以为您做到这一点:

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

投票最多的答案映射:

首先可视化地选择所需的行,然后执行<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>