{"id":13395521,"url":"https://github.com/dylanaraps/fff","last_synced_at":"2025-09-29T02:32:40.559Z","repository":{"id":38184869,"uuid":"153698336","full_name":"dylanaraps/fff","owner":"dylanaraps","description":"📁 A simple file manager written in bash.","archived":true,"fork":false,"pushed_at":"2024-02-29T19:41:14.000Z","size":430,"stargazers_count":4098,"open_issues_count":60,"forks_count":175,"subscribers_count":39,"default_branch":"master","last_synced_at":"2025-01-08T16:34:43.009Z","etag":null,"topics":["bash","file-manager","terminal","tui"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dylanaraps.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-18T23:09:21.000Z","updated_at":"2025-01-07T17:46:30.000Z","dependencies_parsed_at":"2022-07-14T04:10:36.302Z","dependency_job_id":"95354450-6170-4372-b5f5-13942fd55691","html_url":"https://github.com/dylanaraps/fff","commit_stats":{"total_commits":532,"total_committers":17,"mean_commits":"31.294117647058822","dds":0.05639097744360899,"last_synced_commit":"6f2dc6f3a003d24e8b3fd48b046241b486022ad5"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dylanaraps%2Ffff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dylanaraps%2Ffff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dylanaraps%2Ffff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dylanaraps%2Ffff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dylanaraps","download_url":"https://codeload.github.com/dylanaraps/fff/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234583683,"owners_count":18856280,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","file-manager","terminal","tui"],"created_at":"2024-07-30T17:02:04.163Z","updated_at":"2025-09-29T02:32:35.294Z","avatar_url":"https://github.com/dylanaraps.png","language":"Shell","readme":"# fff (*Fucking Fast File-Manager*)\n\n\u003ca href=\"https://asciinema.org/a/qvNlrFrGB3xKZXb6GkremjZNp\" target=\"_blank\"\u003e\u003cimg src=\"https://asciinema.org/a/qvNlrFrGB3xKZXb6GkremjZNp.svg\" alt=\"img\" height=\"210px\" align=\"right\"/\u003e\u003c/a\u003e\n\nA simple file manager written in `bash`.\n\n\u003ca href=\"https://travis-ci.org/dylanaraps/fff\"\u003e\u003cimg src=\"https://travis-ci.org/dylanaraps/fff.svg?branch=master\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/dylanaraps/fff/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/release/dylanaraps/fff.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://repology.org/metapackage/fff\"\u003e\u003cimg src=\"https://repology.org/badge/tiny-repos/fff.svg\" alt=\"Packaging status\"\u003e\u003c/a\u003e\n\n- It's Fucking Fast 🚀\n- Minimal (*only requires **bash** and coreutils*)\n- Smooth Scrolling (*using **vim** keybindings*)\n- Works on **Linux**, **BSD**, **macOS**, **Haiku** etc.\n- Supports `LS_COLORS`!\n- File Operations (*copy, paste, cut, **ranger style bulk rename**, etc*) \u003cimg src=\"https://i.imgur.com/tjIWUjf.jpg\" alt=\"img\" height=\"213px\" align=\"right\"/\u003e\n- Instant as you type search\n- Tab completion for all commands!\n- Automatic CD on exit (*see [setup](#cd-on-exit)*)\n- Works as a **file picker** in `vim`/`neovim` ([**link**](https://github.com/dylanaraps/fff.vim))!\n- **Display images with w3m-img!**\n- Supports `$CDPATH`.\n\n\n## Table of Contents\n\n\u003c!-- vim-markdown-toc GFM --\u003e\n\n* [Dependencies](#dependencies)\n* [Installation](#installation)\n    * [Distros](#distros)\n    * [Manual](#manual)\n    * [CD on Exit](#cd-on-exit)\n        * [Bash and Zsh](#bash-and-zsh)\n        * [Fish](#fish)\n* [Usage](#usage)\n* [Customization](#customization)\n* [Customizing the keybindings.](#customizing-the-keybindings)\n    * [Keybindings](#keybindings)\n    * [Disabling keybindings.](#disabling-keybindings)\n    * [Dealing with conflicting keybindings.](#dealing-with-conflicting-keybindings)\n    * [How to figure out special keys.](#how-to-figure-out-special-keys)\n* [Using `fff` in vim/neovim as a file picker](#using-fff-in-vimneovim-as-a-file-picker)\n* [Why?](#why)\n\n\u003c!-- vim-markdown-toc --\u003e\n\n\n## Dependencies\n\n- `bash 3.2+`\n- `coreutils`\n    - File operations.\n- `xdg-utils` (*optional*)\n    - Program handling (*non-text*).\n    - *Not needed on macos and Haiku.*\n    - *Customizable (if not using `xdg-open`): `$FFF_OPENER`.*\n\n**Dependencies for image display**\n\n- `w3m-img`\n- `xdotool` for X.\n- `fbset` for the framebuffer.\n\n\n## Installation\n\n### Distros\n\n- KISS Linux (based): `kiss b fff`\n- FreeBSD: `pkg install fff`\n- Haiku: `pkgman install fff`\n- macOS: `brew install fff`\n- Nix: `nix-env -iA fff`\n- Void Linux: `xbps-install -S fff`\n- Arch Linux: `pacman -S fff`\n\n### Manual\n\n1. Download `fff`.\n    - Release: https://github.com/dylanaraps/fff/releases/latest\n    - Git: `git clone https://github.com/dylanaraps/fff`\n2. Change working directory to `fff`.\n    - `cd fff`\n3. Run `make install` inside the script directory to install the script.\n    - **El Capitan**: `make PREFIX=/usr/local install`\n    - **Haiku**: `make PREFIX=\"$(finddir B_USER_NONPACKAGED_DIRECTORY)\" MANDIR='$(PREFIX)/documentation/man' DOCDIR='$(PREFIX)/documentation/fff' install`\n    - **OpenIndiana**: `gmake install`\n    - **MinGW/MSys**: `make -i install`\n    - **NOTE**: You may have to run this as root.\n\n**NOTE:** `fff` can be uninstalled easily using `make uninstall`. This removes all of files from your system.\n\n### CD on Exit\n#### Bash and Zsh\n```sh\n# Add this to your .bashrc, .zshrc or equivalent.\n# Run 'fff' with 'f' or whatever you decide to name the function.\nf() {\n    fff \"$@\"\n    cd \"$(cat \"${XDG_CACHE_HOME:=${HOME}/.cache}/fff/.fff_d\")\"\n}\n```\n#### Fish\n```sh\n# Add this to you config.fish or equivalent.\n# Fish don't support recursive calls so use f function\nfunction f\n    fff $argv\n    set -q XDG_CACHE_HOME; or set XDG_CACHE_HOME $HOME/.cache\n    cd (cat $XDG_CACHE_HOME/fff/.fff_d)\nend\n```\n\n## Usage\n\n```sh\nj: scroll down\nk: scroll up\nh: go to parent dir\nl: go to child dir\n\nenter: go to child dir\nbackspace: go to parent dir\n\n-: Go to previous dir.\n\ng: go to top\nG: go to bottom\n\n:: go to a directory by typing.\n\n.: toggle hidden files\n/: search\nt: go to trash\n~: go to home\ne: refresh current dir\n!: open shell in current dir\n\nx: view file/dir attributes\ni: display image with w3m-img\n\ndown:  scroll down\nup:    scroll up\nleft:  go to parent dir\nright: go to child dir\n\nf: new file\nn: new dir\nr: rename\nX: toggle executable\n\ny: mark copy\nm: mark move\nd: mark trash (~/.local/share/fff/trash/)\ns: mark symbolic link\nb: mark bulk rename\n\nY: mark all for copy\nM: mark all for move\nD: mark all for trash (~/.local/share/fff/trash/)\nS: mark all for symbolic link\nB: mark all for bulk rename\n\np: execute paste/move/delete/bulk_rename\nc: clear file selections\n\n[1-9]: favourites/bookmarks (see customization)\n\nq: exit with 'cd' (if enabled).\nCtrl+C: exit without 'cd'.\n```\n\n## Customization\n\n```sh\n# Show/Hide hidden files on open.\n# (Off by default)\nexport FFF_HIDDEN=1\n\n# Use LS_COLORS to color fff.\n# (On by default if available)\n# (Ignores FFF_COL1)\nexport FFF_LS_COLORS=1\n\n# Directory color [0-9]\nexport FFF_COL1=2\n\n# Status background color [0-9]\nexport FFF_COL2=7\n\n# Selection color [0-9] (copied/moved files)\nexport FFF_COL3=6\n\n# Cursor color [0-9]\nexport FFF_COL4=1\n\n# Status foreground color [0-9]\nexport FFF_COL5=0\n\n# Text Editor\nexport EDITOR=\"vim\"\n\n# File Opener\nexport FFF_OPENER=\"xdg-open\"\n\n# File Attributes Command\nexport FFF_STAT_CMD=\"stat\"\n\n# Enable or disable CD on exit.\n# (On by default)\nexport FFF_CD_ON_EXIT=0\n\n# CD on exit helper file\n# Default: '${XDG_CACHE_HOME}/fff/fff.d'\n#          If not using XDG, '${HOME}/.cache/fff/fff.d' is used.\nexport FFF_CD_FILE=~/.fff_d\n\n# Trash Directory\n# Default: '${XDG_DATA_HOME}/fff/trash'\n#          If not using XDG, '${HOME}/.local/share/fff/trash' is used.\nexport FFF_TRASH=~/.local/share/fff/trash\n\n# Trash Command\n# Default: 'mv'\n#          Define a custom program to use to trash files.\n#          The program will be passed the list of selected files\n#          and directories.\nexport FFF_TRASH_CMD=\"mv\"\n\n# Favourites (Bookmarks) (keys 1-9) (dir or file)\nexport FFF_FAV1=~/projects\nexport FFF_FAV2=~/.bashrc\nexport FFF_FAV3=~/Pictures/Wallpapers/\nexport FFF_FAV4=/usr/share\nexport FFF_FAV5=/\nexport FFF_FAV6=\nexport FFF_FAV7=\nexport FFF_FAV8=\nexport FFF_FAV9=\n\n# w3m-img offsets.\nexport FFF_W3M_XOFFSET=0\nexport FFF_W3M_YOFFSET=0\n\n# File format.\n# Customize the item string.\n# Format ('%f' is the current file): \"str%fstr\"\n# Example (Add a tab before files): FFF_FILE_FORMAT=\"\\t%f\"\nexport FFF_FILE_FORMAT=\"%f\"\n\n# Mark format.\n# Customize the marked item string.\n# Format ('%f' is the current file): \"str%fstr\"\n# Example (Add a ' \u003e' before files): FFF_MARK_FORMAT=\"\u003e %f\"\nexport FFF_MARK_FORMAT=\" %f*\"\n```\n\n## Customizing the keybindings.\n\n### Keybindings\n\nThis is the list of full keybindings along with their default values. You only need to modify the keybindings that you'd like to change from the default. `fff` will run perfectly fine without any of these defined.\n\n```sh\n### Moving around.\n\n# Go to child directory.\nexport FFF_KEY_CHILD1=\"l\"\nexport FFF_KEY_CHILD2=$'\\e[C' # Right Arrow\nexport FFF_KEY_CHILD3=\"\"      # Enter / Return\n\n# Go to parent directory.\nexport FFF_KEY_PARENT1=\"h\"\nexport FFF_KEY_PARENT2=$'\\e[D' # Left Arrow\nexport FFF_KEY_PARENT3=$'\\177' # Backspace\nexport FFF_KEY_PARENT4=$'\\b'   # Backspace (Older terminals)\n\n# Go to previous directory.\nexport FFF_KEY_PREVIOUS=\"-\"\n\n# Search.\nexport FFF_KEY_SEARCH=\"/\"\n\n# Spawn a shell.\nexport FFF_KEY_SHELL=\"!\"\n\n# Scroll down.\nexport FFF_KEY_SCROLL_DOWN1=\"j\"\nexport FFF_KEY_SCROLL_DOWN2=$'\\e[B' # Down Arrow\n\n# Scroll up.\nexport FFF_KEY_SCROLL_UP1=\"k\"\nexport FFF_KEY_SCROLL_UP2=$'\\e[A'   # Up Arrow\n\n# Go to top and bottom.\nexport FFF_KEY_TO_TOP=\"g\"\nexport FFF_KEY_TO_BOTTOM=\"G\"\n\n# Go to dirs.\nexport FFF_KEY_GO_DIR=\":\"\nexport FFF_KEY_GO_HOME=\"~\"\nexport FFF_KEY_GO_TRASH=\"t\"\nexport FFF_KEY_REFRESH=\"e\"\n\n### File operations.\n\nexport FFF_KEY_YANK=\"y\"\nexport FFF_KEY_MOVE=\"m\"\nexport FFF_KEY_TRASH=\"d\"\nexport FFF_KEY_LINK=\"s\"\nexport FFF_KEY_BULK_RENAME=\"b\"\n\nexport FFF_KEY_YANK_ALL=\"Y\"\nexport FFF_KEY_MOVE_ALL=\"M\"\nexport FFF_KEY_TRASH_ALL=\"D\"\nexport FFF_KEY_LINK_ALL=\"S\"\nexport FFF_KEY_BULK_RENAME_ALL=\"B\"\n\nexport FFF_KEY_PASTE=\"p\"\nexport FFF_KEY_CLEAR=\"c\"\n\nexport FFF_KEY_RENAME=\"r\"\nexport FFF_KEY_MKDIR=\"n\"\nexport FFF_KEY_MKFILE=\"f\"\nexport FFF_KEY_IMAGE=\"i\" # display image with w3m-img\n\n### Miscellaneous\n\n# Show file attributes.\nexport FFF_KEY_ATTRIBUTES=\"x\"\n\n# Toggle executable flag.\nexport FFF_KEY_EXECUTABLE=\"X\"\n\n# Toggle hidden files.\nexport FFF_KEY_HIDDEN=\".\"\n```\n\n### Disabling keybindings.\n\nYou can't unset keybindings by making their value `''`. What you need to do is change their value to `off`.\n\nExample:\n\n```sh\n# KEY_GO_TRASH was bound to 't', now its unset.\nexport FFF_KEY_GO_TRASH=\"off\"\n\n# KEY_MKFILE is now set to 't' and its original\n# keybinding is also unset 'f'.\nexport FFF_KEY_MKFILE=\"t\"\n```\n\n### Dealing with conflicting keybindings.\n\nWhen rebinding a key in `fff` make sure you don't have two bindings with the same value. You can avoid this by setting the other conflicting key-binding to something else or by changing its value to `off`.\n\n\n### How to figure out special keys.\n\nBelow is a tiny script I've written which will tell you the exact value to use. It automates the deciphering of special key escape sequences to the exact value `fff` needs. Save this to a file and run it. Give it a key-press and it'll spit out the exact value needed.\n\n```sh\n#!/usr/bin/env bash\n# Output the key-binding values for 'fff'.\nkey() {\n    case \"$1\" in\n        # Backspace.\n        $'\\b'|$'\\177')\n            printf '%s\\n' \"key: \\$'\\\\b' or \\$'\\\\177'\"\n        ;;\n\n        # Escape Sequences.\n        $'\\e')\n            read -rsn 2\n            printf '%s %q\\n' \"key:\" \"${1}${REPLY}\"\n        ;;\n\n        # Return / Enter.\n        \"\")\n            printf '%s\\n' \"key: \\\" \\\"\"\n        ;;\n\n        # Everything else.\n        *)\n            printf '%s %q\\n' \"key:\" \"$1\"\n        ;;\n    esac\n}\n\nread -srn 1 \u0026\u0026 key \"$REPLY\"\n```\n\n## Using `fff` in vim/neovim as a file picker\n\nSee: [**`fff.vim`**](https://github.com/dylanaraps/fff.vim)\n\n\n## Why?\n\n¯\\\\_(ツ)_/¯\n\n\u003csup\u003e\u003csub\u003edont touch my shrug\u003c/sub\u003e\u003c/sup\u003e\n","funding_links":[],"categories":["Shell","Table of Contents","Uncategorized","File Manager","bash","Tools","Packages","\u003ca name=\"file-manager\"\u003e\u003c/a\u003eFile manager"],"sub_categories":["Uncategorized","Bash","CLI Tools"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdylanaraps%2Ffff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdylanaraps%2Ffff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdylanaraps%2Ffff/lists"}