想必用过Vim的人都知道,在Vim里面,以下命令可以替换当前文件的内容:

:[range]s/{要被替换的模式}/{替换的内容}/[flags]

其中range指定替换命令生效的范围。flags指定替换的一些选项,常用的有:

  • c 替换前进行确认

  • g 如果缺乏该选项,只会替换第一个。一般我们所说的替换是全部替换,即加了g选项的替换。

  • i 忽略大小写

  • e 忽略错误

具体细节请:vert help substitude查看。

本文将以此为起点,介绍一些替换小技巧。写这篇文章,主要是分享个人的一些脑洞心得,顺便向接触过Vim的人安利下Vim的一些哲学。

实话实说,使用命令来替换有违于(大多数)程序员的习惯。一般提起“替换”,第一感觉都是按下某个快捷键,然后在某个窗口中输入“查找内容”,再输入“替换内容”,按确定。靠敲命令来替换,总会让人想起sed这样的老东西,想起它那咒文一样的指令(如果还想得起来的话)。

还好,Vim的映射机制让想起这一切不再困难。你仅需映射一份模板:

" 把下面映射添加到vimrc中
" 设置替换命令的模板
nnoremap <leader>s :%s///gc<left><left><left><left>
" :vert help c_<C-R>
" Ctrl-r " 插入最近一次复制/删除的文本
nnoremap <leader>sl :%s/<C-R>"/<C-R>"/gc<left><left><left>
" Ctrl-r Ctrl-w 插入当前光标下的词。
nnoremap <leader>sc :%s/\<<C-R><C-W>\>/<C-R><C-W>/gc<left><left><left>

这样就不用记住完整的替换命令了,仅需填两个空。是不是又回到了熟悉的“查找内容”/“替换内容”模式呢?

Vim哲学第N条:用映射消除重复的劳动。

一般在文本编辑的过程中,常常会有重复某几个步骤的情况。一个合格的Vimer应该学会用映射或其他机制来减少无益的操作。所谓时间就是生命,珍爱生命,从灵活使用映射开始。

" :vert help map 查看如何在Vim中使用映射
" :vert help recording 查看如何在Vim中使用录制

看了刚才的内容,应该不会对Vim里面的替换操作感到陌生了。接下更进一步,教多几个小技巧。

回顾替换命令:

:[range]s/{要被替换的模式}/{替换的内容}/[flags]

最前面的range也是有些门道的。range是Vim中的一个概念,表示文本的某个范围。常用的range有两种:一种是m,n,表示从第m行到第n行,其中.表示当前行,而$表示最未行;另一种是%,表示整个文件,等价于1,$。更多的形式请查看:vert help range

凭借这一点,我们可以实现指定替换的范围,减轻确认时的工作量。下面介绍个例子:

vnoremap <leader>s :s///gc<left><left><left><left>

这个跟前面的normal模式下的设置模板的映射很像,不过有两点不同。一点是,这是作用在visual模式下的映射;另一点是,这个模板里没有指定范围。在visual模式下使用命令,默认范围是当前选中的范围。(参见:vert help v_:

于是乎,我们可以这样使用:

  1. vi{选中当前大括号(代码块)里面的内容。

  2. <leader>s发动映射。

这么一来,替换将仅在当前大括号内生效。在替换局部变量时,比起全局替换,这样的替换方式无疑会更高效。

什么?你说你用Python?嗯,你可以考虑下借助第三方插件来选中代码块:

  • https://github.com/michaeljsmith/vim-indent-object

  • https://github.com/nelstrom/vim-textobj-rubyblock

  • https://github.com/kana/vim-textobj-user

Vim哲学第N+1条:用好组合技

很多情况下,替换操作涉及多个文件。由于缺乏项目管理的功能,编辑器在这方面自然比不上IDE。不过Vim还是支持对多个文件执行替换操作,虽说有点儿粗糙。Vim提供了名为argdo的机制,可以在多个文件上执行同样的命令。

" 在dataType.cpp和dataType.h中替换filename为fn
:args dataType.cpp dataType.h
" :vert help argdo
:argdo %s/filename/fn/gce | update

args命令接收文件列表,而argdo命令接收要执行命令,update则写入更新了的文件内容。(注意这里的|是用来连接%s/filename/fn/gcupdate成单一的参数,不是管道符)

关于args的更多内容,参见这篇文章:http://vimcasts.org/episodes/populating-the-arglist/

我们可以更进一步,实现全项目内的替换。假设你的项目用git作版本管理,那么通过git ls-files可以获取全部文件名。然后用grep -l pattern $(git ls-files)可以筛选出含有pattern的文件。接下来就是把这份文件列表传递给args:

" 查找整个项目中含有filename的文件,并作为参数传递给args
:args `grep -l filename $(git ls-files)`
:argdo %s/filename/fn/gce | update

就是这样。

Vim哲学第N+2条:善用外部命令来拓展Vim的能力

Vim替换小技巧(兼浅谈Vim哲学)相关推荐

  1. VIM使用小技巧-重新载入文件

    VIM使用小技巧-重新载入文件 - Anything的专栏 - 博客频道 - CSDN.NET VIM使用小技巧-重新载入文件 2012-03-02 23:37 348人阅读 评论(0) 收藏 举报 ...

  2. 丁小平:浅谈科学模型及突变论等问题

    作者:北京二十一世纪药理科学研究院 丁小平 科学的根本任务在于揭示规律,进而使人们可以遵循利用规律服务生产和生活.从揭示方式看,规律可以分为完成型规律和逼近型规律.所谓完成型规律,是人脑通过逻辑从有限 ...

  3. 【Linux】vim使用小技巧

    (图片来源于网络,侵删) Vim 使用技巧整理 Vim 是 VIMproved 的缩写,即 Vim 编辑器是 Vi 编辑器的改进版.Vim 采用模式编辑的理念,其提供多种操作模式,按键在不同的模式下作 ...

  4. 【linux】vim操作小技巧合集 vim命令如何使用教程

    vim命令 修改配置文件命令: # 打开 vim 文件名# 由普通模式进入命令模式 ( centos中) shift 和 : 一起按 ,例如不保存 输入q!i : 编辑命令(insert) 进入编辑模 ...

  5. eltable 无数据文案修改_软文文案修改技巧:浅谈文章写作修改的几个方法

    下面,就文章修改时应注意的方面浅谈自己的见解: 第一:着眼全篇,从整体到局部进行修改 一提到文章修改,有的同学可能就认为这简单,不就是看文中有没有错别字,病句嘛.于是一动笔就埋头于词句的修改中,对文章 ...

  6. 烦人的“小妖精”:浅谈小红点的设计

    导语 随着各类App的业务功能不断丰富,小红点已经成为互联网从业者们最常使用的运营工具之一,每当有新的运营内容或新功能上线,大家的做法往往是"在那放个红点就行了".然而简单粗暴的形 ...

  7. 新手入门之VIM 编辑小技巧

    一:命令状态下, 有如下一些常用命令: 新增:   a 光标后面添加文本             A 光标所在行末尾添加文本 插入:    i 光标前面插入文本             I 从光标所在 ...

  8. 一些使用Vim的小技巧

    7. 增加注释(一个操作应用在多行) 比如需要增加#或者是//这种注释: Ctrl + v 定位到开始行,然后选定需要的行,然后执行 I 命令,然后输入 # 或 //,然后按 Esc键两次,即可把注释 ...

  9. Linux系统编程之Vim使用小技巧---代码自动对齐,智能提示

    自动对齐:(gg=G) 在命令模式下(即非"插入"等编辑模式),先输入gg,这时候光标会移动到第一行第一个字符,然后按 "=" 号之后切换成大写,再按一下G,这 ...

最新文章

  1. 数据结构(五)位图算法
  2. 【直播讲座】用友摩天联合光环国际,听国学学项目管理
  3. 消灭星星网页版java代码,javascript实现消灭星星小游戏简单版
  4. js - (初中级)常见笔试面试题
  5. Qt setMargin()和setSpacing() 的含义
  6. 【转载】Jsoup设置代理ip访问
  7. 控制台出现Failed to bind properties under ‘spring.datasource‘ to javax.sql.DataSource
  8. HTTP404错误原因
  9. 经典论坛程序 Discuz! 回归
  10. (篇二)C语言动态分配内存、计算π的值
  11. Kubernetes 的CRI-O容器引擎中存在严重漏洞
  12. Ubuntu开机慢_开机计时1分30秒_A start job is running for dev-disk-by...
  13. js基础-10-url,src,href的理解
  14. PS黑作坊人像磨皮 精修 快速伪商业修图 插件 扩展面板
  15. poi导出使用HSSFWorkbook行数超出
  16. 行为识别阅读笔记(paper + parted code):Beyond Frame-level CNN Saliency-Aware 3-D CNN with LSTM for Video Acti
  17. httpServer / proxyServer / nginx 1.7.9
  18. 洛谷-P1478-陶陶摘苹果(升级版)
  19. 智能分拣解决方案市场现状研究分析报告 -
  20. Java-对象数组以及内存图解

热门文章

  1. js 字符串截取(包含中英文)
  2. php 自定义属性,HTML5的data-*自定义属性是什么-
  3. java调用权报表的代码_ireport5.6使用table组件,如何用table显示javaBean数据源
  4. Linux下安装ftp服务器异常,linux下安装ftp服务器
  5. java 网络实验_Java实验五网络编程与安全
  6. 通过一个端口读取多个按钮
  7. 基于蔡氏混沌电路进行非线性共振探究
  8. 利用反射光电管 ITR9909 制作节能信标光电感应开关
  9. 通用双谐振固态特斯拉驱动器 UD2.7
  10. 简单BP网络识别数码表字符