"These're nifflers," said Hagrid, when the class had gathered around. "Yeh find 'em down mines mostly. They like sparkly stuff...useful little treasure detectors."
Nifflers are fluffy, mole-like creatures that like to dig for treasure. Vim-Niffler, on the other hand, is a fast, lightweight, fuzzy, file finder for Vim and is heavily inspired by FZF.
I made Vim-Niffler because all the other fuzzy file finders I tried were either too slow without caching (Unite, CtrlP), too complicated (Unite), had a hideous codebase (CtrlP), or didn't support opening the fuzzy finder in the current window (FZF).
If I had known about g:ctrlp_user_command="ag %s" and g:ctrlp_use_caching=0
I probably would have never made Niffler, but now that I have it's nice to have
a small, legible codebase that makes adding new features/changing core
functionality a breeze.
Niffler differs from other fuzzy file finders in that it doesn't perform a fuzzy search by default. Instead it searches for an exact match of the text typed but you can insert a "fuzzy character" to specify which part of the query should match any string of characters. This works exactly like the "*" wildcard character in most shells:
izzbuwill matchfizzbuzzbut notfizzbazbuzzizz*buwill matchfizzbuzzandfizzbazbuzz
The default fuzzy char is * but can be changed with g:niffler_fuzzy_char
The beginning and end of the query are fuzzy by default but you can use ^ and
$ to specify an exact match at either end:
^fizzwill matchfizzbazbuzzbut notbuzzfizzbazbuzz$will matchfizzbazbuzzbut notbazbuzzfizz
Specify a command to be run on the open file by appending a ":" to the end of the search query.
iz*buz:45will open a filefizzbazbuzzand jump to line 45iz*buz:diffthiswill open a filefizzbazbuzzand add the file to the diff windows
Niffler has several different modes:
| Command | Description |
|---|---|
Niffler |
Fuzzy file search |
NifflerMRU |
Fuzzy file search on MRU cache |
NifflerBuffer |
Fuzzy file search on buffer list |
NifflerTags |
Fuzzy tag search on ctags list |
NifflerTselect |
Fuzzy tag search on matching tags |
NifflerTjump |
Fuzzy tag search on matching tags, jump directly if only one match |
The Niffler command takes any number of optional arguments and has the following structure:
Niffler [-vcs] [DIRECTORY]
- -vcs: search from git root directory of current file
- Directory to search from
-
The
NifflerTagscommand can optionally take a % as argument to only search for tags in the current file. -
The
NifflerTselectcommand can be used to replace the built-in:tselectcommand and filter a list of matching tags.nnoremap <silent> g] :NifflerTselect<CR>
-
The
NifflerTjumpcommand can similarly be used to replace the built-in:tjumpcommand. The command will jump directly to a tag if there is only one match and otherwise will present a list of matching tags to filternnoremap <silent> g<C-]> :NifflerTjump<CR>
| Key | Action |
|---|---|
<C-K>, <C-P>, <Up> |
Move up one line in the candidate list |
<C-J>, <C-N>, <Down> |
Move down one line in the candidate list |
<C-A> |
Scroll to the beginning of the line |
<C-E> |
Scroll to the end of the line |
<C-R> |
Insert the contents of a register |
<C-X>, <Left> |
Mark multiple selections for opening |
<CR>, <Right> |
Open selection in current window |
<C-S> |
Open selection in new horizontal split |
<C-V> |
Open selection in new vertical split |
<C-T> |
Open selection in new tab window |
<Esc>, <C-[>, <C-C> |
Quit Niffler |
niffler#custom()- Create customized lists of candidates to filter through
g:niffler_user_command- Custom file indexing command, use %s in place of the target directory
- i.e.
let g:niffler_user_command = 'ag %s -g ""'
g:niffler_ignore_extensions- List of file extensions to exclude from Niffler results
- Ignored when
g:niffler_user_commandis non-empty
g:niffler_ignore_dirs- List of directories to exclude from Niffler results
- Helpful for large directories that could slow Niffler down
- Ignored when
g:niffler_user_commandis non-empty
g:niffler_prompt- Prompt string for input
- The placeholder %s is replaced with the prompt text (optional)
- i.e.
let g:niffler_prompt = '%s $ '
g:niffler_marked_indicator- Indicator which is used to mark selected entries
- i.e.
let g:niffler_marked_indicator = 'x '
Niffler currently requires the grep, cut, and sed utilities for full
support. Niffler is not tested on Windows and its current level of support is
unknown.
- Pathogen
cd ~/.vim/bundle && git clone https://github.com/pgdouyon/vim-niffler.git
- Vundle
Plugin 'pgdouyon/vim-niffler'
- NeoBundle
NeoBundle 'pgdouyon/vim-niffler'
- Vim-Plug
Plug 'pgdouyon/vim-niffler'
- Manual Install
- Copy all the files into the appropriate directory under
~/.vimon *nix or$HOME/_vimfileson Windows
- Copy all the files into the appropriate directory under
Copyright (c) 2015 Pierre-Guy Douyon. Distributed under the MIT License.