优雅地在vim中查找替换

学着喜欢vim

Posted by Echo on December 9, 2018

在使用linux系统的时候,难免会接触到vim,而对于经常用IDE的我来说vim用起来很不便捷,为了让自己能够更顺畅地使用vim,用这篇博客来记录一些vim常用的功能。

查找

vim的查找功能很强大,意味着你可以很简单地使用,也可以做很复杂地操作。vim的功能一般都需要在normal模式下,查找也不例外,因此首先按下esc进入normal模式,接下来让我们开启查找之旅。

简单查找

输入/进入后向查找模式,再输入想查找的内容并回车,即可跳到第一个匹配,如:

/hello

接着,按下n查找后向下一个,N后向查找上一个,若是不方便切换大小写怎么办呢?贴心的vim还提供了另外一种输入?进行前向查找的功能,在这种模式下,按下n就是查找前向下一个,即上一个。

大小写敏感查找

对简单查找模式的指令进行简单改造即可,其后加上\c表示大小写不敏感查找(默认),\C表示大小写敏感查找,如:

/Hello\c

将会查找hello的所有大小写组合,比如hellohEllOHELLO等。

快速查找

有时候单词很长的时候手动输入非常麻烦,也很容易输错,当然可以使用模糊匹配,如使用通配符*等,但这个不能精确匹配,除非花时间去写一个正则表达式。

此时较为便捷的方式是,让光标停留在想要查找的单词任意一个字母上面,然后按下shift+*,即可快速选中该单词,并且也可以使用nN进行下一个或上一个的匹配。

替换

下面进入我们的重头戏:替换。替换的命令格式如下:

:[range]s/from/to/[flags]

其中:s是这个命令的主体,其余的都为参数。例如:%s/hello/hey/g会在全局范围(%)内查找hello,替换内容为hey,并且替换所有(g)。

下面我们来一一解释参数。

作用范围(range)

作用范围分为光标所在行,指定行,选区,所有行等,

[range] 有以下一些表示方法:
            不写range   :  默认为光标所在的行。
            .           :  光标所在的行。
            1           :  第一行。
            $           :  最后一行。
            33          :  第33行。
            'a          :  标记a所在的行(之前要使用ma做过标记)。
            .+1         :  当前光标所在行的下面一行。
            $-1         :  倒数第二行。(这里说明我们可以对某一行加减某个数值来
                            取得相对的行)。
            22,33       :  第22~33行。
            1,$         :  第1行 到 最后一行。
            1,.         :  第1行 到 当前行。
            .,$         :  当前行 到 最后一行。
            'a,'b       :  标记a所在的行 到标记b所在的行。
            %           :  所有行(与 1,$ 等价)。
            ?chapter?   :  从当前位置向上搜索,找到的第一个chapter所在的行。(
                            其中chapter可以是任何字符串或者正则表达式。
            /chapter/   :  从当前位置向下搜索,找到的第一个chapter所在的行。(
                            其中chapter可以是任何字符串或者正则表达式。

下面做一些示例。

光标所在行:

:s/hello/hey/g

指定行:

:233s/hello/hey/g    # 指定单行:第233行的所有hello替换为hey
:1,.s/hello/hey/g    # 指定多行:第1行到光标所在行的所有hello替换为hey
:.,+2s/hello/hey/g   # 指定多行:光标所在行到其后两行的所有hello替换为hey

选区:

Visual模式下(在Normal模式下按vVctrl+v即可进入)选择区域后输入:vim即可自动补全为:'<,'>

:'<,'>s/hello/hey/g  # 选区内的所有hello替换为hey

所有行:

:%s/hello/hey/g

替换标志(flags)

替换标志有:

[flags] 有以下一些表示方法:
            无      :  只对指定范围内的第一个匹配项进行替换。
            g       :  对指定范围内的所有匹配项进行替换。
            c       :  在替换前请求用户确认。
            e       :  忽略执行过程中的错误。
            i/I     :   大小写不敏感/敏感

这里所有的flags都可以组合使用。举个例子:

:%s/Hello/hey/gIc    # 大小写敏感替换全文所有Hello为hey,替换前请求确认

若设置了c的标志,则会在每一次匹配到Hello后,提示:

replace with hey (y/n/a/q/l/^E/^Y)?

按下y表示替换,n表示不替换,a表示替换所有,q表示退出查找模式, l表示替换当前位置并退出。^E^Y是光标移动快捷键,参考: Vim中如何快速进行光标移动

参考