Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/dylanaraps/fff
📁 A simple file manager written in bash.
https://github.com/dylanaraps/fff
bash file-manager terminal tui
Last synced: 3 months ago
JSON representation
📁 A simple file manager written in bash.
- Host: GitHub
- URL: https://github.com/dylanaraps/fff
- Owner: dylanaraps
- License: mit
- Archived: true
- Created: 2018-10-18T23:09:21.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2024-02-29T19:41:14.000Z (10 months ago)
- Last Synced: 2024-09-21T08:02:08.668Z (3 months ago)
- Topics: bash, file-manager, terminal, tui
- Language: Shell
- Homepage:
- Size: 420 KB
- Stars: 4,079
- Watchers: 39
- Forks: 173
- Open Issues: 60
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
- awesome-tuis - fff
- awesome-linux-minimalism - FFF - command line file manager written in bash (Uncategorized / Uncategorized)
- my-awesome-github-stars - dylanaraps/fff - 📁 A simple file manager written in bash. (Shell)
- awesome-starred - fff - 📁 A simple file manager written in bash. (Shell)
- awesome-linux-customization - **fff*** - simple file manager written by `bash`. (File Manager)
README
# fff (*Fucking Fast File-Manager*)
A simple file manager written in `bash`.
- It's Fucking Fast 🚀
- Minimal (*only requires **bash** and coreutils*)
- Smooth Scrolling (*using **vim** keybindings*)
- Works on **Linux**, **BSD**, **macOS**, **Haiku** etc.
- Supports `LS_COLORS`!
- File Operations (*copy, paste, cut, **ranger style bulk rename**, etc*)
- Instant as you type search
- Tab completion for all commands!
- Automatic CD on exit (*see [setup](#cd-on-exit)*)
- Works as a **file picker** in `vim`/`neovim` ([**link**](https://github.com/dylanaraps/fff.vim))!
- **Display images with w3m-img!**
- Supports `$CDPATH`.## Table of Contents
* [Dependencies](#dependencies)
* [Installation](#installation)
* [Distros](#distros)
* [Manual](#manual)
* [CD on Exit](#cd-on-exit)
* [Bash and Zsh](#bash-and-zsh)
* [Fish](#fish)
* [Usage](#usage)
* [Customization](#customization)
* [Customizing the keybindings.](#customizing-the-keybindings)
* [Keybindings](#keybindings)
* [Disabling keybindings.](#disabling-keybindings)
* [Dealing with conflicting keybindings.](#dealing-with-conflicting-keybindings)
* [How to figure out special keys.](#how-to-figure-out-special-keys)
* [Using `fff` in vim/neovim as a file picker](#using-fff-in-vimneovim-as-a-file-picker)
* [Why?](#why)## Dependencies
- `bash 3.2+`
- `coreutils`
- File operations.
- `xdg-utils` (*optional*)
- Program handling (*non-text*).
- *Not needed on macos and Haiku.*
- *Customizable (if not using `xdg-open`): `$FFF_OPENER`.***Dependencies for image display**
- `w3m-img`
- `xdotool` for X.
- `fbset` for the framebuffer.## Installation
### Distros
- KISS Linux (based): `kiss b fff`
- FreeBSD: `pkg install fff`
- Haiku: `pkgman install fff`
- macOS: `brew install fff`
- Nix: `nix-env -iA fff`
- Void Linux: `xbps-install -S fff`
- Arch Linux: `pacman -S fff`### Manual
1. Download `fff`.
- Release: https://github.com/dylanaraps/fff/releases/latest
- Git: `git clone https://github.com/dylanaraps/fff`
2. Change working directory to `fff`.
- `cd fff`
3. Run `make install` inside the script directory to install the script.
- **El Capitan**: `make PREFIX=/usr/local install`
- **Haiku**: `make PREFIX="$(finddir B_USER_NONPACKAGED_DIRECTORY)" MANDIR='$(PREFIX)/documentation/man' DOCDIR='$(PREFIX)/documentation/fff' install`
- **OpenIndiana**: `gmake install`
- **MinGW/MSys**: `make -i install`
- **NOTE**: You may have to run this as root.**NOTE:** `fff` can be uninstalled easily using `make uninstall`. This removes all of files from your system.
### CD on Exit
#### Bash and Zsh
```sh
# Add this to your .bashrc, .zshrc or equivalent.
# Run 'fff' with 'f' or whatever you decide to name the function.
f() {
fff "$@"
cd "$(cat "${XDG_CACHE_HOME:=${HOME}/.cache}/fff/.fff_d")"
}
```
#### Fish
```sh
# Add this to you config.fish or equivalent.
# Fish don't support recursive calls so use f function
function f
fff $argv
set -q XDG_CACHE_HOME; or set XDG_CACHE_HOME $HOME/.cache
cd (cat $XDG_CACHE_HOME/fff/.fff_d)
end
```## Usage
```sh
j: scroll down
k: scroll up
h: go to parent dir
l: go to child direnter: go to child dir
backspace: go to parent dir-: Go to previous dir.
g: go to top
G: go to bottom:: go to a directory by typing.
.: toggle hidden files
/: search
t: go to trash
~: go to home
e: refresh current dir
!: open shell in current dirx: view file/dir attributes
i: display image with w3m-imgdown: scroll down
up: scroll up
left: go to parent dir
right: go to child dirf: new file
n: new dir
r: rename
X: toggle executabley: mark copy
m: mark move
d: mark trash (~/.local/share/fff/trash/)
s: mark symbolic link
b: mark bulk renameY: mark all for copy
M: mark all for move
D: mark all for trash (~/.local/share/fff/trash/)
S: mark all for symbolic link
B: mark all for bulk renamep: execute paste/move/delete/bulk_rename
c: clear file selections[1-9]: favourites/bookmarks (see customization)
q: exit with 'cd' (if enabled).
Ctrl+C: exit without 'cd'.
```## Customization
```sh
# Show/Hide hidden files on open.
# (Off by default)
export FFF_HIDDEN=1# Use LS_COLORS to color fff.
# (On by default if available)
# (Ignores FFF_COL1)
export FFF_LS_COLORS=1# Directory color [0-9]
export FFF_COL1=2# Status background color [0-9]
export FFF_COL2=7# Selection color [0-9] (copied/moved files)
export FFF_COL3=6# Cursor color [0-9]
export FFF_COL4=1# Status foreground color [0-9]
export FFF_COL5=0# Text Editor
export EDITOR="vim"# File Opener
export FFF_OPENER="xdg-open"# File Attributes Command
export FFF_STAT_CMD="stat"# Enable or disable CD on exit.
# (On by default)
export FFF_CD_ON_EXIT=0# CD on exit helper file
# Default: '${XDG_CACHE_HOME}/fff/fff.d'
# If not using XDG, '${HOME}/.cache/fff/fff.d' is used.
export FFF_CD_FILE=~/.fff_d# Trash Directory
# Default: '${XDG_DATA_HOME}/fff/trash'
# If not using XDG, '${HOME}/.local/share/fff/trash' is used.
export FFF_TRASH=~/.local/share/fff/trash# Trash Command
# Default: 'mv'
# Define a custom program to use to trash files.
# The program will be passed the list of selected files
# and directories.
export FFF_TRASH_CMD="mv"# Favourites (Bookmarks) (keys 1-9) (dir or file)
export FFF_FAV1=~/projects
export FFF_FAV2=~/.bashrc
export FFF_FAV3=~/Pictures/Wallpapers/
export FFF_FAV4=/usr/share
export FFF_FAV5=/
export FFF_FAV6=
export FFF_FAV7=
export FFF_FAV8=
export FFF_FAV9=# w3m-img offsets.
export FFF_W3M_XOFFSET=0
export FFF_W3M_YOFFSET=0# File format.
# Customize the item string.
# Format ('%f' is the current file): "str%fstr"
# Example (Add a tab before files): FFF_FILE_FORMAT="\t%f"
export FFF_FILE_FORMAT="%f"# Mark format.
# Customize the marked item string.
# Format ('%f' is the current file): "str%fstr"
# Example (Add a ' >' before files): FFF_MARK_FORMAT="> %f"
export FFF_MARK_FORMAT=" %f*"
```## Customizing the keybindings.
### Keybindings
This 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.
```sh
### Moving around.# Go to child directory.
export FFF_KEY_CHILD1="l"
export FFF_KEY_CHILD2=$'\e[C' # Right Arrow
export FFF_KEY_CHILD3="" # Enter / Return# Go to parent directory.
export FFF_KEY_PARENT1="h"
export FFF_KEY_PARENT2=$'\e[D' # Left Arrow
export FFF_KEY_PARENT3=$'\177' # Backspace
export FFF_KEY_PARENT4=$'\b' # Backspace (Older terminals)# Go to previous directory.
export FFF_KEY_PREVIOUS="-"# Search.
export FFF_KEY_SEARCH="/"# Spawn a shell.
export FFF_KEY_SHELL="!"# Scroll down.
export FFF_KEY_SCROLL_DOWN1="j"
export FFF_KEY_SCROLL_DOWN2=$'\e[B' # Down Arrow# Scroll up.
export FFF_KEY_SCROLL_UP1="k"
export FFF_KEY_SCROLL_UP2=$'\e[A' # Up Arrow# Go to top and bottom.
export FFF_KEY_TO_TOP="g"
export FFF_KEY_TO_BOTTOM="G"# Go to dirs.
export FFF_KEY_GO_DIR=":"
export FFF_KEY_GO_HOME="~"
export FFF_KEY_GO_TRASH="t"
export FFF_KEY_REFRESH="e"### File operations.
export FFF_KEY_YANK="y"
export FFF_KEY_MOVE="m"
export FFF_KEY_TRASH="d"
export FFF_KEY_LINK="s"
export FFF_KEY_BULK_RENAME="b"export FFF_KEY_YANK_ALL="Y"
export FFF_KEY_MOVE_ALL="M"
export FFF_KEY_TRASH_ALL="D"
export FFF_KEY_LINK_ALL="S"
export FFF_KEY_BULK_RENAME_ALL="B"export FFF_KEY_PASTE="p"
export FFF_KEY_CLEAR="c"export FFF_KEY_RENAME="r"
export FFF_KEY_MKDIR="n"
export FFF_KEY_MKFILE="f"
export FFF_KEY_IMAGE="i" # display image with w3m-img### Miscellaneous
# Show file attributes.
export FFF_KEY_ATTRIBUTES="x"# Toggle executable flag.
export FFF_KEY_EXECUTABLE="X"# Toggle hidden files.
export FFF_KEY_HIDDEN="."
```### Disabling keybindings.
You can't unset keybindings by making their value `''`. What you need to do is change their value to `off`.
Example:
```sh
# KEY_GO_TRASH was bound to 't', now its unset.
export FFF_KEY_GO_TRASH="off"# KEY_MKFILE is now set to 't' and its original
# keybinding is also unset 'f'.
export FFF_KEY_MKFILE="t"
```### Dealing with conflicting keybindings.
When 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`.
### How to figure out special keys.
Below 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.
```sh
#!/usr/bin/env bash
# Output the key-binding values for 'fff'.
key() {
case "$1" in
# Backspace.
$'\b'|$'\177')
printf '%s\n' "key: \$'\\b' or \$'\\177'"
;;# Escape Sequences.
$'\e')
read -rsn 2
printf '%s %q\n' "key:" "${1}${REPLY}"
;;# Return / Enter.
"")
printf '%s\n' "key: \" \""
;;# Everything else.
*)
printf '%s %q\n' "key:" "$1"
;;
esac
}read -srn 1 && key "$REPLY"
```## Using `fff` in vim/neovim as a file picker
See: [**`fff.vim`**](https://github.com/dylanaraps/fff.vim)
## Why?
¯\\_(ツ)_/¯
dont touch my shrug