Technology moves fast! ⚡ Don't get left behind.🚶 Subscribe to our mailing list to keep up with latest and greatest in open source projects! 🏆


Subscribe to our mailing list

fasd

Command-line productivity booster, offers quick access to files and directories, inspired by autojump, z and v.

Subscribe to updates I use fasd


Statistics on fasd

Number of watchers on Github 3550
Number of open issues 89
Average time to close an issue 18 days
Main language Shell
Average time to merge a PR 4 days
Open pull requests 25+
Closed pull requests 3+
Last commit over 3 years ago
Repo Created over 7 years ago
Repo Last Updated over 1 year ago
Size 943 KB
Organization / Authorclvv
Contributors5
Page Updated
Do you use fasd? Leave a review!
View open issues (89)
View fasd activity
View on github
Fresh, new opensource launches 🚀🚀🚀
Trendy new open source projects in your inbox! View examples

Subscribe to our mailing list

Evaluating fasd for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)

Fasd

Fasd (pronounced similar to fast) is a command-line productivity booster. Fasd offers quick access to files and directories for POSIX shells. It is inspired by tools like autojump, z and v. Fasd keeps track of files and directories you have accessed, so that you can quickly reference them in the command line.

The name fasd comes from the default suggested aliases f(files), a(files/directories), s(show/search/select), d(directories).

Fasd ranks files and directories by frecency, that is, by both frequency and recency. The term frecency was first coined by Mozilla and used in Firefox (link).

Introduction

If you use your shell to navigate and launch applications, fasd can help you do it more efficiently. With fasd, you can open files regardless of which directory you are in. Just with a few key strings, fasd can find a frecent file or directory and open it with command you specify. Below are some hypothetical situations, where you can type in the command on the left and fasd will expand your command into the right side. Pretty magic, huh?

  v def conf       =>     vim /some/awkward/path/to/type/default.conf
  j abc            =>     cd /hell/of/a/awkward/path/to/get/to/abcdef
  m movie          =>     mplayer /whatever/whatever/whatever/awesome_movie.mp4
  o eng paper      =>     xdg-open /you/dont/remember/where/english_paper.pdf
  vim `f rc lo`    =>     vim /etc/rc.local
  vim `f rc conf`  =>     vim /etc/rc.conf

Fasd comes with some useful aliases by default:

alias a='fasd -a'        # any
alias s='fasd -si'       # show / search / select
alias d='fasd -d'        # directory
alias f='fasd -f'        # file
alias sd='fasd -sid'     # interactive directory selection
alias sf='fasd -sif'     # interactive file selection
alias z='fasd_cd -d'     # cd, same functionality as j in autojump
alias zz='fasd_cd -d -i' # cd with interactive selection

Fasd will smartly detect when to display a list of files or just the best match. For instance, when you call fasd in a subshell with some search parameters, fasd will only return the best match. This enables you to do:

mv update.html `d www`
cp `f mov` .

Install

Fasd is available in various package managers. Please check the wiki page for an up-to-date list.

You can also manually obtain a copy of fasd.

Download fasd 1.0.1 from GitHub: zip, tar.gz.

Fasd is a self-contained POSIX shell script that can be either sourced or executed. A Makefile is provided to install fasd and fasd.1 to desired places.

System-wide install:

make install

Install to $HOME:

PREFIX=$HOME make install

Or alternatively you can just copy fasd to anywhere you like (preferably under some directory in $PATH).

To get fasd working in a shell, some initialization code must be run. Put the line below in your shell rc.

eval "$(fasd --init auto)"

This will setup a command hook that executes on every command and advanced tab completion for zsh and bash.

If you want more control over what gets into your shell environment, you can pass customized set of arguments to fasd --init.

zsh-hook             # define _fasd_preexec and add it to zsh preexec array
zsh-ccomp            # zsh command mode completion definitions
zsh-ccomp-install    # setup command mode completion for zsh
zsh-wcomp            # zsh word mode completion definitions
zsh-wcomp-install    # setup word mode completion for zsh
bash-hook            # add hook code to bash $PROMPT_COMMAND
bash-ccomp           # bash command mode completion definitions
bash-ccomp-install   # setup command mode completion for bash
posix-alias          # define aliases that applies to all posix shells
posix-hook           # setup $PS1 hook for shells that's posix compatible
tcsh-alias           # define aliases for tcsh
tcsh-hook            # setup tcsh precmd alias

Example for a minimal zsh setup (no tab completion):

eval "$(fasd --init posix-alias zsh-hook)"

Note that this method will slightly increase your shell start-up time, since calling binaries has overhead. You can cache fasd init code if you want minimal overhead. Example code for bash (to be put into .bashrc):

fasd_cache="$HOME/.fasd-init-bash"
if [ "$(command -v fasd)" -nt "$fasd_cache" -o ! -s "$fasd_cache" ]; then
  fasd --init posix-alias bash-hook bash-ccomp bash-ccomp-install >| "$fasd_cache"
fi
source "$fasd_cache"
unset fasd_cache

Optionally, if you can also source fasd if you want fasd to be a shell function instead of an executable.

You can tweak initialization code. For instance, if you want to use c instead of z to do directory jumping, you can use the alias below:

alias c='fasd_cd -d'
# `-d` option present for bash completion
# function fasd_cd is defined in posix-alias

After you first installed fasd, open some files (with any program) or cd around in your shell. Then try some examples below.

Examples

f foo           # list frecent files matching foo
a foo bar       # list frecent files and directories matching foo and bar
f js$           # list frecent files that ends in js
f -e vim foo    # run vim on the most frecent file matching foo
mplayer `f bar` # run mplayer on the most frecent file matching bar
z foo           # cd into the most frecent directory matching foo
open `sf pdf`   # interactively select a file matching pdf and launch `open`

You should add your own aliases to fully utilize the power of fasd. Here are some examples to get you started:

alias v='f -e vim' # quick opening files with vim
alias m='f -e mplayer' # quick opening files with mplayer
alias o='a -e xdg-open' # quick opening files with xdg-open

If you're using bash, you have to call _fasd_bash_hook_cmd_complete to make completion work. For instance:

_fasd_bash_hook_cmd_complete v m j o

You could select an entry in the list of matching files.

Matching

Fasd has three matching modes: default, case-insensitive, and fuzzy.

For a given set of queries (the set of command-line arguments passed to fasd), a path is a match if and only if:

  1. Queries match the path in order.
  2. The last query matches the last segment of the path.

If no match is found, fasd will try the same process ignoring case. If still no match is found, fasd will allow extra characters to be placed between query characters for fuzzy matching.

Tips:

  • If you want your last query not to match the last segment of the path, append / as the last query.
  • If you want your last query to match the end of the filename, append $ to the last query.

How It Works

When you run fasd init code or source fasd, fasd adds a hook which will be executed whenever you execute a command. The hook will scan your commands' arguments and determine if any of them refer to existing files or directories. If yes, fasd will add them to the database.

Compatibility

Fasd's basic functionalities are POSIX compliant, meaning that you should be able to use fasd in all POSIX compliant shells. Your shell need to support command substitution in $PS1 in order for fasd to automatically track your commands and files. This feature is not specified by the POSIX standard, but it's nonetheless present in many POSIX compliant shells. In shells without prompt command or prompt command substitution (csh for instance), you can add entries manually with fasd -A. You are very welcomed to contribute shell initialization code for not yet supported shells.

Fasd has been tested on the following shells: bash, zsh, mksh, pdksh, dash, busybox ash, FreeBSD 9 /bin/sh and OpenBSD /bin/sh.

Synopsis

fasd [options] [query ...]
[f|a|s|d|z] [options] [query ...]
  options:
    -s         list paths with scores
    -l         list paths without scores
    -i         interactive mode
    -e <cmd>   set command to execute on the result file
    -b <name>  only use <name> backend
    -B <name>  add additional backend <name>
    -a         match files and directories
    -d         match directories only
    -f         match files only
    -r         match by rank only
    -t         match by recent access only
    -R         reverse listing order
    -h         show a brief help message
    -[0-9]     select the nth entry

fasd [-A|-D] [paths ...]
    -A    add paths
    -D    delete paths

Tab Completion

Fasd offers two completion modes, command mode completion and word mode completion. Command mode completion works in bash and zsh. Word mode completion only works in zsh.

Command mode completion is just like completion for any other commands. It is triggered when you hit tab on a fasd command or its aliases. Under this mode your queries can be separated by a space. Tip: if you find that the completion result overwrites your queries, type an extra space before you hit tab.

Word mode completion can be triggered on any command. Word completion is triggered by any command line argument that starts with , (all), f, (files), or d, (directories), or that ends with ,, (all), ,,f (files), or ,,d (directories). Examples:

$ vim ,rc,lo<Tab>
$ vim /etc/rc.local

$ mv index.html d,www<Tab>
$ mv index.html /var/www/

There are also three zle widgets: fasd-complete, fasd-complete-f, fasd-complete-d. You can bind them to keybindings you like:

bindkey '^X^A' fasd-complete    # C-x C-a to do fasd-complete (files and directories)
bindkey '^X^F' fasd-complete-f  # C-x C-f to do fasd-complete-f (only files)
bindkey '^X^D' fasd-complete-d  # C-x C-d to do fasd-complete-d (only directories)

Backends

Fasd can take advantage of different sources of recent / frequent files. Most desktop environments (such as OS X and Gtk) and some editors (such as Vim) keep a list of accessed files. Fasd can use them as additional backends if the data can be converted into fasd's native format. Below is a list of available backends.

`spotlight`
OSX spotlight, provides entries that are changed today or opened within the
past month

`recently-used`
GTK's recently-used file (Usually available on Linux)

`current`
Provides everything in $PWD (whereever you are executing `fasd`)

`viminfo`
Vim's editing history, useful if you want to define an alias just for editing
things in vim

You can define your own backend by declaring a function by that name in your .fasdrc. You can set default backend with _FASD_BACKENDS variable in our .fasdrc.

Fasd can mimic v's behavior by this alias:

alias v='f -t -e vim -b viminfo'

Tweaks

Some shell variables that you can set before sourcing fasd. You can set them in $HOME/.fasdrc

$_FASD_DATA
Path to the fasd data file, default "$HOME/.fasd".

$_FASD_BLACKLIST
List of blacklisted strings. Commands matching them will not be processed.
Default is "--help".

$_FASD_SHIFT
List of all commands that needs to be shifted, defaults to "sudo busybox".

$_FASD_IGNORE
List of all commands that will be ignored, defaults to "fasd ls echo".

$_FASD_TRACK_PWD
Fasd defaults to track your "$PWD". Set this to 0 to disable this behavior.

$_FASD_AWK
Which awk to use. Fasd can detect and use a compatible awk.

$_FASD_SINK
File to log all STDERR to, defaults to "/dev/null".

$_FASD_MAX
Max total score / weight, defaults to 2000.

$_FASD_SHELL
Which shell to execute. Some shells will run faster than others. fasd
runs faster with dash and ksh variants.

$_FASD_BACKENDS
Default backends.

$_FASD_RO
If set to any non-empty string, fasd will not add or delete entries from
database. You can set and export this variable from command line.

$_FASD_FUZZY
Level of "fuzziness" when doing fuzzy matching. More precisely, the number of
characters that can be skipped to generate a match. Set to empty or 0 to
disable fuzzy matching. Default value is 2.

$_FASD_VIMINFO
Path to .viminfo file for viminfo backend, defaults to "$HOME/.viminfo"

$_FASD_RECENTLY_USED_XBEL
Path to XDG recently-used.xbel file for recently-used backend, defaults to
"$HOME/.local/share/recently-used.xbel"

Debugging

If fasd does not work as expected, please file a bug report describing the unexpected behavior along with your OS version, shell version, awk version, sed version, and a log file.

You can set _FASD_SINK in your .fasdrc to obtain a log.

_FASD_SINK="$HOME/.fasd.log"

COPYING

Fasd is originally written based on code from z by rupa deadwyler under the WTFPL license. Most if not all of the code has been rewritten. Fasd is licensed under the MIT/X11 license.

fasd open issues Ask a question     (View All Issues)
  • over 2 years [FR] $_FASD_DATA should be allowed to be a symlink
  • over 2 years Case-sensitive matching
  • almost 3 years Blacklist directory from fasd
  • almost 3 years Make a new release
  • almost 3 years vim `f ...` command doesn't work when there's a space in the path
  • almost 3 years Problem with running on a mac
  • about 3 years avoid overwriting aliases which are already defined
  • about 3 years viminfo with neovim
  • about 3 years exit with non-zero code if no matches are found
  • about 3 years Dim:2: maximum nested function level reached
  • about 3 years Most recent files
  • over 3 years Paths not being added to history if HISTTIMEFORMAT is set in bash
  • over 3 years Paths not being added to history
  • over 3 years Option to return consider only matches under current $PWD
  • over 3 years Ksh93 Compatibility - Local Variables
  • over 3 years For certain paths, `<path>/foo; exit;` returns before running `<path>/foo`
  • over 3 years Unsanitized parentheses pair does surprising damage
  • over 3 years Unquoted command substitution in _fasd_prompt_func results in "no match" errors in bash when the failglob option is set in bash
  • over 3 years Problems loading fasd via oh-my-zsh / antigen
  • over 3 years fasd --add can't handle paths with the byte 0x5C ('\' backslash character)
  • almost 4 years Tab completion adds a space after completion
  • almost 4 years How do you uninstall?
  • almost 4 years fasd -f -e 'some_zsh_func' not working
  • almost 4 years hooks for fish :)
  • about 4 years Use Levenshtein distance to round to nearest matching file/dir
  • about 4 years Make sure correct env is invoked
  • about 4 years How does -D work
  • about 4 years Loading fasd breaks global alias for fzf
  • about 4 years Populate initial database from the shell history
  • about 4 years ksh: use zz and select the choice, it prompts the follow error, no problem for zsh
fasd open pull requests (View All Pulls)
  • Correct grammar mistake in README
  • Conform to XDG Base Directory Specification
  • fasd_cd: return 1 in case no dir was found
  • Fix unquoted command substitution in _fasd_prompt_func
  • Preserve exit code in bash hook
  • Allow Easy Installation Via Antigen
  • Fix issue 15 better
  • Rename `fasd` to `fad`
  • Correction of newline print statement in fasd_cd
  • Add fasd.plugin.zsh to be loaded by antigen.
  • Update example in README from j to z
  • Add an option (deactivated by default) to resolve symlinks.
  • Word splitting issues resolved
  • Fixes issue #21
  • install: preserve file timestamps
  • added support for symlinked data file
  • Clean Zsh-style plugin support
  • Cygwin bash speedups
  • Do not "eval" in zsh's _fasd_preexec
  • Fix minor typo in README.md
  • Adds option _FASD_NOCASE to force default matching to ignore case
  • Fix tcsh alias and hooks
  • exec the -e command, so we get the right tmux window title etc. :)
  • Fix issue #95
  • README: typo s/j/z/
fasd list of languages used
Other projects in Shell