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 查找第一次出现, 并且光标会移动到匹配的末尾
调整查找模式的大小写敏感性

单次查找设置
查找模式下输入**\cXXXX**忽略大小写查找 XXXX, \CXXXX 区分查找 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 thesis 被错误匹配到,> <本身不匹配字符,但是可以表示前、后只单词的边界(前后是空格、文章的开头、结尾什么的)
使用 <,> 界定单词边界
查找句子中单词 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