Project Icon

vim-subversive

Vim文本替换增强插件 提升编辑效率

vim-subversive是一款增强Vim文本替换功能的插件。它提供了两种新的操作符动作,支持范围替换、单词替换和确认替换等多种模式。该插件需要用户自定义映射,可与vim-abolish等插件集成使用。通过简化复杂的替换操作,有效提高了Vim用户的文本编辑效率,特别适合需要频繁进行大规模文本替换的开发者和编辑者。

Subversive.vim

Subversive提供了两种新的操作动作,使得快速替换变得非常简单。它不包含任何默认映射,在您添加自己的映射之前不会产生任何效果。

如果您更喜欢观看视频解释而不是阅读以下文本,也可以点击这里

替换动作

示例配置:

" s 表示替换
nmap s <plug>(SubversiveSubstitute)
nmap ss <plug>(SubversiveSubstituteLine)
nmap S <plug>(SubversiveSubstituteToEndOfLine)

请注意,在这种情况下,您将覆盖更改字符键 s,因此您必须使用较长的形式 cl

添加这些映射后,您可以执行 s<动作> 来用默认寄存器(或指定的寄存器)的内容替换由动作提供的文本对象。例如,您可以执行 siw 来用当前复制的内容替换光标下的当前单词,或执行 sip 来替换段落等。

范围替换动作

Subversive提供的另一个有趣的操作允许通过使用多个连续的动作来同时指定要替换的文本和应用更改的行范围。

示例配置:

nmap <leader>s <plug>(SubversiveSubstituteRange)
xmap <leader>s <plug>(SubversiveSubstituteRange)

nmap <leader>ss <plug>(SubversiveSubstituteWordRange)

添加此映射后,如果您执行 <leader>s<动作1><动作2>,然后在状态栏的提示中输入一些文本,那么由 动作1 给出的文本将被我们在提示中输入的文本替换,替换范围为 动作2 提供的每一行。另外,我们也可以在可视模式下选择 动作1,然后按 <leader>s<动作2> 来达到相同的效果。

这可以非常强大。例如,您可以执行 <leader>siwip 来替换光标下当前单词在光标所在段落中的所有实例。或执行 <leader>sl_ 来替换当前行上光标下字符的所有实例。

<leader>ss 映射用作替换光标下当前单词的快捷方式。例如,这允许您执行 <leader>ssip 来替换当前段落中光标下的单词。请注意,这匹配的是完整单词,因此与 <leader>siwip 不同(后者不要求每个匹配都有单词边界)。

让我们看看它的实际效果:

范围替换示例

在这个 gif 中,我们首先通过执行 <leader>ssom 然后在提示中输入 bar 来重命名本地 foo 参数(注意 om 是一个自定义动作,表示 "outer c# method",不是由这个插件提供的)。另外请注意,因为我们使用的是 <leader>ss,所以 _foos 文本不受影响,因为它不匹配完整的单词。在这种情况下这很有用,因为我们只想在函数内重命名参数。

之后我们切换到可视模式,选择 _foos 中的 foo 部分,然后执行 <leader>sie,再次在提示中输入 barie 再次是一个自定义动作,表示 entire buffer(参见下一节了解详情)。

之后我们移动到 AddFoo 中的 Foo 部分,执行 <leader>seie 并再次输入 Bar。然后最后对全大写的 FOOS 做同样的操作。

请注意,如果您使用的是 neovim,您可以启用 inccommand 选项,以在输入替换内容时获得实时预览(相当于将 g:subversivePromptWithActualCommand 设置为 1)。

还要注意,这个动作是可重复的。如果您在一个段落中运行 <leader>siwip,然后移动到另一个段落,再按 .,那么相同的替换将应用于光标下的新段落。

自定义文本对象

请注意,要充分利用这些映射,除了内置的文本对象(如当前段落 ip、当前句子 is 或当前行 _)之外,添加自定义文本对象会很有帮助。自定义文本对象,如当前缩进级别、当前方法、当前类、整个缓冲区、当前滚动页面等,都可以在这里提供很大帮助。

例如,对 Subversive 非常有用的几个简单动作是:

" ie = 整个缓冲区内部
onoremap ie :exec "normal! ggVG"<cr>

" iv = 缓冲区中当前可见的文本
onoremap iv :exec "normal! HVL"<cr>

还有其他提供大量自定义文本对象的插件,我建议您看一看。

确认每个替换

对于许多替换,您可以依赖高亮预览来了解正在替换的内容。但如果您要在整个文件中进行较大的替换,您可能想确认每一个替换。您可以使用以下映射来实现这一点:

nmap <leader>cs <plug>(SubversiveSubstituteRangeConfirm)
xmap <leader>cs <plug>(SubversiveSubstituteRangeConfirm)
nmap <leader>css <plug>(SubversiveSubstituteWordRangeConfirm)

这些映射的工作方式与上面的 <leader>s 映射相同,只是会逐个确认每个替换。

问题

  • 如果我不想使用提示,而想直接用寄存器的值替换怎么办?

    如果您为上述任何替换动作提供一个显式的寄存器,它将不会提示,而是直接使用给定寄存器的内容。例如,"a<leader>siwip 将立即用寄存器 a 的内容替换当前段落中光标下当前单词的所有实例。

    如果这还不够,您还可以使用以下插件代替:

    nmap <leader>s <plug>(SubversiveSubstituteRangeNoPrompt)
    xmap <leader>s <plug>(SubversiveSubstituteRangeNoPrompt)
    
    nmap <leader>ss <plug>(SubversiveSubstituteWordRangeNoPrompt)
    

    这些插件的工作方式与之前的插件完全相同,只是不会提示,而是使用默认寄存器。

  • 如果我只想删除而不是替换怎么办?

    您可以通过将黑洞寄存器传递给范围替换命令之一来实现这一点。例如:"_<leader>siwip"_<leader>csiwip(如果您想确认每个删除操作)。 遗憾的是,你不能直接在提示中输入一个空值,因为无法区分这个输入和通过 Escape 键取消(除非你将 g:subversivePromptWithActualCommand 设置为 1,那样就可以正常工作)

设置

  • g:subversivePromptWithCurrent - 当设置为 1 时,提示将包含正在被替换的文本。如果你想对其进行编辑,这可能会很有用。默认值:0
  • g:subversiveCurrentTextRegister - 设置后,指定的寄存器将被填充为正在被替换的文本。这可以作为 g:subversivePromptWithCurrent 的替代方案,这样你可以在提示中按 <c-r>r(假设你设置为 'r')来编辑它,否则直接输入就可以进行完全替换。
  • g:subversivePromptWithActualCommand - 当设置为 1 时,它将提示原生 vim 替换命令,而不是仅提示替换文本。资深 vim 用户可能更喜欢这种方式,因为他们可以自行调整各种替换标志。默认值:0
  • g:subversivePreserveCursorPosition - 当设置为 1 时,应用替换时光标不会移动。默认值为 0,以匹配正常的 vim 行为。

与 abolish.vim 的集成

如果你也安装了 vim-abolish,那么你可以考虑添加类似以下的映射:

nmap <leader><leader>s <plug>(SubversiveSubvertRange)
xmap <leader><leader>s <plug>(SubversiveSubvertRange)

nmap <leader><leader>ss <plug>(SubversiveSubvertWordRange)

这将表现得与 <leader>s 相同,只是它将执行 abolish 的 'subvert' 而不是使用 vim 内置的替换命令。这将应用替换并保留原始单词的大小写。例如:

Abolish 示例

在这个例子中,我们将光标移到 foo 上,然后执行 <leader><leader>seie,然后输入 bar,这将替换所有 foo 的实例,不管大小写如何。

这可以是一种非常方便的快速重命名方式。

正如你所预期的,<leader><leader>ss 映射的工作方式类似,只是它只匹配包含单词边界的完整单词。

同样,还有一些替代性的插件,如果你喜欢的话,它们将使用默认寄存器而不是提示:

nmap <leader><leader>s <plug>(SubversiveSubvertRangeNoPrompt)
xmap <leader><leader>s <plug>(SubversiveSubvertRangeNoPrompt)

nmap <leader><leader>ss <plug>(SubversiveSubvertWordRangeNoPrompt)

与 yoink 的集成

请注意,如果你在 vim-subversive 旁边安装了 vim-yoink,那么粘贴后的 yoink 交换功能也将自动与 subversive(单一动作)替换一起工作。换句话说,假设使用默认映射,你可以执行 siw,然后按 <c-n> / <c-p> 在 yoink 历史中的不同复制内容之间切换。

Subversive 还提供了一个插件来替换可视模式下的粘贴,以便在那里也提供粘贴后的交换:

xmap s <plug>(SubversiveSubstitute)
xmap p <plug>(SubversiveSubstitute)
xmap P <plug>(SubversiveSubstitute)

现在,如果你在可视模式下按 p,你可以像在普通模式下粘贴时一样在不同的复制内容之间切换。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号