vim的搜索与替换

在使用编辑器的过程当中,咱们会常常使用到搜索 / 替换,大部分编辑器能够经过快捷键呼出搜索框来搜索 / 替换,经过选择不一样的选项能够作到匹配大小写,精准匹配,模糊匹配等等。那么在vim中,这些操做该如何实现?本文将介绍在vim中经常使用的搜索文本,替换文本操做以及如何结合插件实现更强大的搜索。git

利用vim自带搜索

对于搜索当前打开文件,vim自带搜索功能足以应对,在Normal modal下键入/,便可进入搜索模式,此时输入想要搜索的单词而后回车,便可完成搜索,光标会跳到当前搜索到的第一个匹配的单词。按下n,光标跳到下一个匹配的单词,按下Nshift+n)光标会跳到上一个匹配的单词。github

除了在Normal modal下能够键入/开始搜索外,还能够键入如下符号开始搜索:golang

  • ?:与/相反,键入该符号后反向向上搜索
  • *:搜索当前光标所在单词,例如:若是当前光标所在单词是set,则至关于键入/\<set\>
  • #:搜索当前光标所在单词,至关于键入?\<set\>

其中\<是单词界定符,表示只匹配单词的开头,/>表示只匹配单词的末尾vim

此外vim搜索还支持正则,例如输入/se$表示搜索以se结尾的单词,输入/^se表示搜索以se开头的单词编辑器

高亮搜索结果

默认状况下,搜索的结果不会高亮,只是光标会跳到搜索到的单词,若是想要高亮搜索结果,能够在Normal modal下输入:set hlsearch,或者在.vimrc文件中设置:函数

" search result heighligh, when enter `:noh` in command line , clean heightlight set hlsearch 复制代码

这样设置后,在搜索完成后,全部的匹配文本都会高亮,想要取消搜索结果的高亮能够在Normal modal下输入:nohlsearch或其简写:nohui

搜索大小写敏感

在使用vim的搜索默认是大小写不敏感的,若是想要让vim搜索作到大小写敏感,能够在输入想要搜索的单词后面添加\C,对应的若是使用\c,则表示搜索大小写不敏感。spa

或者直接在.vimrc中添加设置:插件

" 开启大小写不敏感(默认值) set ignorecase " 开启智能推测
set smartcase
复制代码

开启智能推测后,若是输入的文本带有大写字母,vim会认为你当前搜索是区分大小写的,不然不区分大小写。即开启后,若是输入:Set,则只能搜索到Set,可是若是输入:set,则能够搜索到setSet命令行

vim中的替换

对于替换当前打开文件中的文本,vim提供以下语法:

:{做用范围}s/{目标字符}/{替换的字符}/{替换标志}
复制代码

做用范围:用于指定替换的范围,1,3表示替换第一行至第三行,1,$表示替换第一行到最后一行,也能够直接用%表示。 替换标志(能够组合使用):

  • c: confirm,每次替换前都会询问
  • e:不显示error
  • g: globe,不询问,整个替换
  • i: ignore,即不区分大小写

具体的用法能够查看下图(摘自Reddit):

  • :%s/remember/me/n命令不会替换任何东西。 只是告诉咱们若是咱们运行命令,受影响的行数。实际操做过程当中,在vim中运行该命令,显示89 matches on 89 lines

  • :%s/remember/me/&命令没看明白作什么用

利用插件在vim中搜索

有时候须要在整个项目中搜索文件或者文本,这类操做借助插件更方便一些。

提及vim中搜索文件,就必定会想到大名鼎鼎的ctrlp.vim,但该插件早已再也不维护(最近一次提交是在2015年11月30日),那是否还有其余替代插件呢?答案是有的,可使用fzf.vim。fzf.vim支持文件搜索,全局文本搜索,buffer搜索,git log搜索等,这里只介绍最经常使用的全局文本搜索和文件搜索。

首先使用vim-plug安装插件:

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
复制代码

从以上安装能够看到要想使用fzf.vim,须要首先安装fzf

fzf是一款golang编写的命令行模糊查找器,支持文件,命令等的模糊搜索。强烈建议使用,对于常常使用终端的同窗来讲太方便了。


备注:

若是要安装fzf,在macOS直接:brew install fzf便可。若是经过brew安装过fzf,则vim-plug的配置以下:

Plug '/usr/local/opt/fzf'
Plug 'junegunn/fzf.vim'
复制代码

安装完成后在.vimrc中添加以下配置:

" fzf " fzf use rg search config
let g:fzf_layout = { 'down': '~70%' }
command! -bang -nargs=* Rg
      \ call fzf#vim#grep(
      \   "rg --column --line-number --no-heading --color=always --smart-case "
      \   .(len(<q-args>) > 0 ? <q-args>: '""'),
      \   1,
      \   <bang>0 ? fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'up:60%')
      \   : fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'right:50%:hidden', '?'),
      \   <bang>0)
command! -bang -nargs=? -complete=dir Files
  \ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)

" fzf vim nnoremap <silent> <Leader>rg :Rg<CR> nnoremap <leader>b :Buffers<CR> nnoremap <C-p> :Files<CR> 复制代码

关于fzf.vim的配置有几点说明:

  • fzf_layout用于设置调用fzf搜索的窗口位置以及大小,能够设置leftrightdownup
  • fzf.vim内置fzf#vim#grep函数,支持调用第三方搜索,接收参数:fzf#vim#grep(command, [has_column bool], [spec dict], [fullscreen bool])
    • command:要运行的命令;
    • has_column:是否打印列号;
    • spec:展现预览窗口;
    • fullscreen:是否全屏,<bang>0是vim script,在vim命令中若是输入!<bang>0转换成1,不然为0;
  • 这里使用了ripgrep(由于听说vscode内的搜索就是基于这个作的,因此选择这个)做为fzf中默认的搜索。fzf#vim#with_preview用于配置展现预览窗口。配置好后在vim中输入:Rg就能够启动在整个项目搜索文本,:Files在整个项目中搜索文件。
  • 在使用fzf.vim搜索文本和文件的过程当中须要注意一点,搜索是基于你当前打开文件所在的文件夹去搜索。因此若是要在整个项目中搜索,就须要在项目根目录下打开一个文件进行搜索。这也相似于在vscode中,若是想搜索项目中特定文件夹中的文本,须要选择当前想要选择的文件夹。

以上配置就能够知足咱们平常开发中的搜索/替换文本,搜索文件等经常使用功能了。

相关文章
相关标签/搜索