Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Opening files in Vim using Fuzzy Search

People also ask

What is fuzzy file search?

The conventional searching approach is to apply an exact search, so that only files or directories that are a perfect match to the search string are displayed. A fuzzy search, on the other hand, performs an approximate search, and instead of identifying exact matches, displays matching results with each keystroke.

How do you do a fuzzy search?

Many search engines enable users to specifically request a fuzzy search in the search query by using a tilde (~) at the end of the word or term they want to search with fuzziness.

How do you find Neovim?

ctrl+f and f to open the search line and type what you want to search for. ctrl+f and n to search for matches of the word under the cursor. ctrl+f and p to search for the las search parten used in vim.


There are two great vim plugins for this.

ctrlp:

  • Written in pure VimL
  • Works pretty much everywhere
  • Supports custom finders for improved performance
  • Most popular fuzzy search plugin for Vim

Command-T:

  • Written in C, VimL and Ruby
  • Fast out of the box
  • Requires +ruby support in Vim
  • Recommends Vim version >= 7.3

EDIT:

I use CtrlP with ag as my custom finder and it's incredibly quick (even on massive projects) and very portable.

An example of using ag with CtrlP:

if executable('ag')
  " Use Ag over Grep
  set grepprg=ag\ --nogroup\ --nocolor

  " Use ag in CtrlP for listing files. Lightning fast and respects .gitignore
  let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
endif

CommandT for Vim is very much the comparable feature as in TextMate. My work flow is now

1) open up MacVim

2) :cd ~/my_project

3) (I have this mapped as described in the installation help)

4) C-v the file to open the file in a vertical split, or CR to open a new horizontal split.

5) to close the split, use :bd (buffer delete)

6) to switch to another buffer, I have BufferExplorer installed, so just \be and select

This workflow is comparable to TextMate, it takes a while to get used to, and I'm still learning.


What about http://www.vim.org/scripts/script.php?script_id=1984 Then there is http://github.com/jamis/fuzzy_file_finder .

Also see these blog posts: http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim and http://weblog.jamisbuck.org/2009/1/28/the-future-of-fuzzyfinder-textmate

HTH


Basic solution

Simply add this to your .vimrc

nnoremap <C-p> :find ./**/*

Pressing Ctrl+p will now allow you to fuzzyfind files in your current working directory and sub-directories thereof. Use the tab key to cycle through options.

Related solution

For those who want to keep it basic i.e. no plugins, this entertaining video shows another way to achieve fuzzy file find in vim.

They actually use

set path+=**
set wildmenu

in their .vimrc to find files in current sub-directories.

For example, with :find *Murph followd by tab, I would find the files KilianMurphy2012Why.R and KilianMurphy2014ROLE.R in subdir code which I can cycle through with the tab key. The first solution above has the advantage that the relative path is also shown.

Note that your current working directory will matter and that other files on your path (:set path?) will also be found with the this type of solution. The wildmenu option adds visual information and is not essential.

For a keyboard shortcut, add

nnoremap <C-p> :find *

to your .vimrc. Now you will be able to quickly search for files inside your project/current dir with Ctrl+p in normal mode.