node-fzf
fzf inspired fuzzy CLI list selection 🎀
Easy to use
CLI usage
npm install -g node-fzf
nfzf
find . | nfzf | xargs cat | less
mpv "`find ~/Dropbox/music | nfzf --exact --keep-right`" --no-audio-display
alias merge="git branch | nfzf | xargs git merge"
alias checkout="git branch | nfzf | xargs git checkout"
API usage
promises
const nfzf = require( 'node-fzf' )
const opts = {
list: [ 'whale', 'giraffe', 'monkey' ],
mode: 'fuzzy' || 'normal',
query: '',
selectOne: false,
height: 0,
prelinehook: function ( index ) { return '' },
postlinehook: function ( index ) { return '' }
}
;( async function () {
const result = await nfzf( opts )
const { selected, query } = result
if( !selected ) {
console.log( 'No matches for:', query )
} else {
console.log( selected.value )
console.log( selected.index )
console.log( selected.value === opts.list[ selected.index ] )
}
} )()
setInterval( function () {
opts.list.push( 'foobar' )
opts.update( list )
}, 1000 )
callbacks
const nfzf = require( 'node-fzf' )
const list = [ 'whale', 'giraffe', 'monkey' ]
const api = nfzf( list, function ( result ) {
const { selected, query } = result
if( !selected ) {
console.log( 'No matches for:', query )
} else {
console.log( selected.value )
console.log( selected.index )
console.log( selected.value === list[ selected.index ] )
console.log( list === api )
console.log( list.update === api.update )
}
} )
setInterval( function () {
list.push( 'foobar' )
api.update( list )
}, 1000 )
Keyboard
<ctrl-s> switch between search modes (fuzzy, normal/exact)
<ctrl-j>,<ctrl-n>,down scroll down
<ctrl-k>,<ctrl-p>,up scroll up
<ctrl-d> scroll down by page size
<ctrl-u> scroll up by page size
<ctrl-a> jump to start of input
<ctrl-e> jump to end of input (and toggles --keep-right)
<esc>,<ctrl-q>,<ctrl-c> cancel
<return>,<ctrl-m> trigger callback/promise with current selection and exit
<ctrl-w> delete last word from input
<ctrl-b> jump back a word
<ctrl-f> jump forward a word
<backspace> delete last input character
About
fzf inspired fuzzy CLI list selection thing for node.
Why
easy fuzzy list selection UI for NodeJS CLI programs.
How
Mostly cli-color for dealing with the terminal rendering
and ttys to hack the ttys to simultaneously
read from non TTY stdin and read key inputs from TTY stdin -> So that we can get piped input while
also at the same time receive and handle raw keyboard input.
Used by
yt-play
yt-search
Similar
fzf even though it doesn't work in NodeJS directly is all-in-all a better tool than this piece of crap :) Highly recommend~
ipt - similar node based solution
Test
npm test