vim-search

Search

查找命令

普通模式下按 / 进入查找模式,输入完查找字符串后按回车键开始查找 (中间可以按 ESC 键退出查找模式,返回普通模式)

/ 中输入的查找模式从上往下扫,如果稻苗到文件结尾,会提示类似 已经查找到文件结尾,再从开头继续查找

普通模式下按 ? 进入反向的查找模式

重复上一次查找:输入查找模式后,按 n 继续当前方向查找下一个匹配的地方,N 反向查找下一个匹配的地方

如果是 / 的查找模式,n 查找文本后一处匹配,N 查找文本前一处匹配

如果是 ? 的查找模式,N 查找文本后一处匹配,n 查找文本前一处匹配

重复历史中的查找:输入 /? 进入查找模式后,按 <Up> 或者 <Down> 键来查找历史查找记录,选择需要的查找历史后回车即可继续选中的历史查找

高亮查找匹配

~/.vimrc 中设置 set hlsearch 来开启查找模式下的高亮显示

有的时候查找结果会非常多 (比如查找了空格, 字母 a 之类的), 导致满屏全是高亮文本,根本无法继续操作了,这时候 需要临时关闭高亮选项

  1. 输入 :noh 或者 :nohlsearch 来临时关闭高亮选项
  2. 当然,你也可以查找一个根本找不到的字符串来取消高亮 (比如 /slfcfwaeihfcqweuif)
  3. 按键更少的做法是制作快捷键,将 nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l> 加入 ~/.vimrc 即可
  4. <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

  1. 如果使用 /a.k.a,则匹配到的是 backward
  2. 因为 . 是特殊字符,能匹配任意一个字符
  3. 查找到 backward 之后按 n 建也能跳到 a.k.a
  4. 或者直接转义搜 /a\.k\.a
  5. 启用 very nomagic 模式匹配 /\Va.k.a 可以直接搜,比上面的方便

按正则表达式查找时,使用 \v 模式开关

与 Perl 相比,Vim 正则表达式的语法风格更接近 POSIX。对于已经熟悉 Perl 正则表达式的程序员来说,这是一个令人失望的消息。但是,通过使用 very magic 模式开关,就可以让 Vim 采用我们更为熟悉的正则表达式语法了。

使用圆括号 () 获取子匹配

如果我们需要获取查找模式匹配的部分字符串,可以使用子匹配 子匹配和替换模式经常搭配使用:匹配某个短语,只保留其中的某一个子匹配

去除文本中连续出现的单词

  1. /\v<(\w+)\_s+\1> 可以完成需求
  2. 上面命令中 \1 就是第一个圆括号之间匹配到的内容,表示 匹配一个单词(\w+)之后再匹配一些空格(\_s),然后再匹配前一个单词
  3. 子匹配最多可以有 9 个 \1->\9
  4. \0 表示整个匹配
  5. <> 是用来匹配单词边界,可以防止 the thesis 被错误匹配到,> < 本身不匹配字符,但是可以表示前、后只单词的边界(前后是空格、文章的开头、结尾什么的)

使用 <,> 界定单词边界

查找句子中单词 the 的所有出现地方

  1. /the 会错误的匹配 thesetheir
  2. /v<the> 可以正确匹配到所有单词 the
  3. 在 very magic 模式下,<> 表示单词边界
  4. <,>零宽度元字符, 本身不匹配字符,仅表示 单词与围绕此单词的空白字符(或者标点符号)之间的边界
  5. 注意: 如果在 very magic 模式下面需要匹配 <,>,则需要转义 (/\v\<)

界定匹配的边界

Substitute

:[range]s/{pattern}/{string}/[flags]

  1. % 表示每一行都执行该替换操作
  2. {pattern} 表示待替换的字符串的正则表达式
  3. {string} 表示替换成的字符串
  4. [flags](标志位)候选有:
    1. g 表示当前行, 全部执行替换
    2. c 表示每查找到一处,替换前都需要确认
      1. l 替换此处匹配后退出
      2. a 替换此处与之后的所有的匹配
    3. n 表示只统计匹配的数量,不进行替换
    4. e 表示不显示错误提示(没有找到 pattern)
    5. &表示使用上一次替换模式使用的标志位
  5. 在替换域中有一些特殊字符,包括:
符号 描述
\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& 即可达到效果。

  1. g& 等价于 :%s//~/&,用同样的标志位、同样的替换字符串、同样的查 找模式以及新的执行范围 %,重复上一次 substitute 命令
  2. 之后遇到除了没加 % 之外,其他都对的替换命令时,之后执行 g& 即可

假设我们需要下面第二个 applyName.... 的子块中的 Name 字符串替换为 Number

  1. 如果我们执行 :%s/Name/Number/g,会 错误的 把所有的 Name 替换成 Number
  2. 发生上述错误后,我们使用 u 回退,然后高亮选中第二个子块,最后执行 :'<,'>&& 即可
    1. :&& 中第一个 & 是一个 Ex 命令,表示重复上一次替换命令;第二个 & 表示重复上一次替换命令的标志位
    2. 选中模式中已选择部分区域后,按 : 会自动进入 :'<,'>,其中 '< 表示光标选中的第一行,'> 表示光标选中
    3. 类似的,:%&& 表示作用于整个文件

中划线转驼峰

%s/-(\w)/\u\1/gi

Vim 驼峰转下划线 - 简书