如何在 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>
然后,无论何时在可视模式下,您都可以点击\c
来c评论该块并点击\u
来un 评论它。当然,您可以将这些快捷键更改为任何内容。
【讨论】:
投了赞成票,因为它引入了一些新东西 -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】:
将要评论的区域标记为可视块 (<C-V
)
然后做c#<ESC>p
c
hange 到 "#"
放回去
如果您经常这样做,请在您的 .vimrc 中定义一个快捷方式(例如 \q
)
:vmap \q c#<ESC>p
【讨论】:
【参考方案12】:在每行的开头插入“ABC”:
进入命令模式
% norm I ABC
【讨论】:
这会将文本添加到该行中第一个非空格字符的左侧。【参考方案13】:如果某人的多行选择实际上是一个段落,则无需手动选择行。 vim 可以为你做到这一点:
vip
:选择并标记整个段落
shift-i
: 在行首插入文本
escape
: 离开插入模式/进入正常模式[行开头仍然被选中]
escape
:取消选择行首
【讨论】:
【参考方案14】:投票最多的答案的映射:
第一视觉选择所需的行,然后执行<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>
【讨论】:
以上是关于如何在 vi/Vim 中的多行选择的开头插入文本的主要内容,如果未能解决你的问题,请参考以下文章