vim-search
Search
查找命令
普通模式下按 /
进入查找模式,输入完查找字符串后按回车键开始查找 (中间可以按 ESC
键退出查找模式,返回普通模式)
/
中输入的查找模式从上往下扫,如果稻苗到文件结尾,会提示类似 已经查找到文件结尾,再从开头继续查找
普通模式下按 ?
进入反向的查找模式
重复上一次查找:输入查找模式后,按 n
继续当前方向查找下一个匹配的地方,N
反向查找下一个匹配的地方
如果是 /
的查找模式,n
查找文本后一处匹配,N
查找文本前一处匹配
如果是 ?
的查找模式,N
查找文本后一处匹配,n
查找文本前一处匹配
重复历史中的查找:输入 /
或 ?
进入查找模式后,按 <Up>
或者 <Down>
键来查找历史查找记录,选择需要的查找历史后回车即可继续选中的历史查找
高亮查找匹配
在 ~/.vimrc
中设置 set hlsearch
来开启查找模式下的高亮显示
有的时候查找结果会非常多 (比如查找了空格, 字母 a 之类的), 导致满屏全是高亮文本,根本无法继续操作了,这时候 需要临时关闭高亮选项
- 输入
:noh
或者:nohlsearch
来临时关闭高亮选项 - 当然,你也可以查找一个根本找不到的字符串来取消高亮 (比如
/slfcfwaeihfcqweuif
) - 按键更少的做法是制作快捷键,将
nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>
加入~/.vimrc
即可 <C-l>
在终端(linux or osx) 里面是清除终端病重绘显示屏
的功能,和clear
命令效果一样,设置完了只要在 vim 界面里面按<C-l>
即可清除高亮
在执行查找前预览第一处匹配
默认情况下我们正在输入查找模式的情况下,vim 不会进行查找,只有输入 <CR>
之后才会开始查找
在 ~/.vimrc
中添加 set incsearch
后开启增量查找模式 该模式让 vim 根据已输入的文本,预览第一处匹配
访问寄存器的内容并插入到命令行
将光标偏移到查找匹配的结尾
使用替换模式可以完成效果::%s/lang/language/g
/lang/e
查找第一次出现, 并且光标会移动到匹配的末尾
调整查找模式的大小写敏感性
单次查找设置
查找模式下输入**\c
XXXX**忽略大小写查找 XXXX
, \C
XXXX 区分查找 XXXX
智能查找
在 ~/.vimrc
添加 set smartcase
即可智能查找:如果输入的单词都是小写,则使用大小写不明感查找;一旦输入的单词有一个是大写,则按照大小写敏感查找
完全匹配字符串时,使用 \V
查找
如果我们不想使用正则表达式查找,而是 完全匹配字符串
查找,就是用 \v
\V
= very nomagic
在下图文本里面查找 a.k.a
- 如果使用
/a.k.a
,则匹配到的是backward
- 因为
.
是特殊字符,能匹配任意一个字符 - 查找到
backward
之后按n
建也能跳到a.k.a
- 或者直接转义搜
/a\.k\.a
- 启用 very nomagic 模式匹配
/\Va.k.a
可以直接搜,比上面的方便
按正则表达式查找时,使用 \v
模式开关
与 Perl 相比,Vim 正则表达式的语法风格更接近 POSIX。对于已经熟悉 Perl 正则表达式的程序员来说,这是一个令人失望的消息。但是,通过使用 very magic 模式开关,就可以让 Vim 采用我们更为熟悉的正则表达式语法了。
使用圆括号 ()
获取子匹配
如果我们需要获取查找模式匹配的部分字符串,可以使用子匹配 子匹配和替换模式经常搭配使用:匹配某个短语,只保留其中的某一个子匹配
去除文本中连续出现的单词
/\v<(\w+)\_s+\1>
可以完成需求- 上面命令中
\1
就是第一个圆括号之间匹配到的内容,表示匹配一个单词(\w+)之后再匹配一些空格(\_s),然后再匹配前一个单词
- 子匹配最多可以有 9 个
\1
->\9
\0
表示整个匹配<
和>
是用来匹配单词边界,可以防止the the
sis 被错误匹配到,> <
本身不匹配字符,但是可以表示前、后只单词的边界(前后是空格、文章的开头、结尾什么的)
使用 <
,>
界定单词边界
查找句子中单词 the
的所有出现地方
/the
会错误的匹配these
,their
/v<the>
可以正确匹配到所有单词 the- 在 very magic 模式下,
<
,>
表示单词边界 <
,>
是零宽度元字符
, 本身不匹配字符,仅表示 单词与围绕此单词的空白字符(或者标点符号)之间的边界- 注意: 如果在 very magic 模式下面需要匹配
<
,>
,则需要转义 (/\v\<
)
Substitute
:[range]s/{pattern}/{string}/[flags]
%
表示每一行都执行该替换操作- {pattern} 表示待替换的字符串的正则表达式
- {string} 表示替换成的字符串
- [flags](标志位)候选有:
- g 表示当前行, 全部执行替换
- c 表示每查找到一处,替换前都需要确认
- l 替换此处匹配后退出
- a 替换此处与之后的所有的匹配
- n 表示只统计匹配的数量,不进行替换
- e 表示不显示错误提示(没有找到 pattern)
- &表示使用上一次替换模式使用的标志位
- 在替换域中有一些特殊字符,包括:
符号 | 描述 |
---|---|
\r |
插入换行符 |
\t |
插入制表符 |
\\ |
插入反斜杠 |
\1 |
插入第一个子匹配(第一个括号包住的内容) |
\2 |
插入第二个子匹配(最多到 \9 ) |
\0 |
插入匹配模式的所有内容 |
& |
插入匹配模式的所有内容 |
~ |
使用上一次调用 替换命令 时的 |
操作 | 快捷键 |
---|---|
在一行内替换头一个字符串 old 为新的字符串 new | :s/old/new |
在一行内替换所有的字符串 old 为新的字符串 new | :s/old/new/g |
在两行内替换所有的字符串 old 为新的字符串 new | :#,#s/old/new/g |
:n1,n2s/old/new/g | |
在文件内替换所有的字符串 old 为新的字符串 new | :%s/old/new/g |
进行全文替换时询问用户确认每个替换需添加 c 标志 | :%s/old/new/gc |
重复上一次 Substitute 命令
假设我们想把所有的
target
替换为replacement
,但是错误执行了:s/target/replacement/g
。
后续我们只需要执行 g&
即可达到效果。
g&
等价于:%s//~/&
,用同样的标志位、同样的替换字符串、同样的查 找模式以及新的执行范围 %,重复上一次 substitute 命令- 之后遇到除了没加
%
之外,其他都对的替换命令时,之后执行g&
即可
假设我们需要下面第二个 applyName....
的子块中的 Name
字符串替换为 Number
- 如果我们执行
:%s/Name/Number/g
,会 错误的 把所有的Name
替换成Number
- 发生上述错误后,我们使用
u
回退,然后高亮选中第二个子块,最后执行:'<,'>&&
即可:&&
中第一个&
是一个 Ex 命令,表示重复上一次替换命令;第二个&
表示重复上一次替换命令的标志位- 选中模式中已选择部分区域后,按
:
会自动进入:'<,'>
,其中'<
表示光标选中的第一行,'>
表示光标选中 - 类似的,
:%&&
表示作用于整个文件
中划线转驼峰
%s/-(\w)/\u\1/gi