Cactus File Manager (cfm) is a TUI file manager with the goal of being simple, easy, and bloat-free, utilizing Vi-inspired keybinds. Whether or not you should use it depends on whether or not you like the name, dev, or screenshot, just like with all software.
Note: the screenshot above has a non-default pointer and no alternative views enabled.
Demo showing off deletion, undo, marks, and basic navigation.
To configure cfm before building, you should copy
and then modify it to suit your needs. Each option is explained within the file.
If you build cfm without creating a config, it will create a default one for
There are some options which cfm will attempt to use environment variables for.
$OPENER. If you want to specify a specific
option just for cfm, it will first try to find these variables prefixed with
$CFM_. For example, if your
$EDITOR is set to vim but you want to tell
cfm to use emacs, you could use
export CFM_EDITOR='emacs'. If you installed
cfm via a package manager, or if you are using the default configuration, you
can specify these environment variables to configure cfm without rebuilding.
cfm uses a temporary directory for its deleted files (to enable undo and
cut/paste). If it’s not set in
config.h, then cfm will attempt to use the
$CFM_TMP environment variable. If this is not set either, then
will be used. If a temporary directory is not specified in any way or it cannot
create the directory it is attempting to use, cfm will disable undo and
CD_ON_CLOSE is not enabled at compile-time, cfm will look for
$CFM_CD_ON_CLOSE environment variable, which should contain the path to a
file where cfm should write its current working directory when quit with
When building from source, you should get the source for the latest
release and then run
the extracted source.
First, download the latest release’s source.
sudo make install. You can specify a
DESTDIR like with many
makefiles. By default,
/usr/local/, but if you wish to install
/usr, you can do
sudo make install PREFIX=/usr.
At the moment, cfm is available from the following sources (not all maintained by me):
If you find a bug, please create an issue on GitHub.
The functions of some keys may be dependent on values set in
|q, Esc||Quit cfm|
|Q||Quit cfm, saving its working directory to the file specified in
|h||Go up a directory1|
|PgDn, J||Move down by one full screen|
|PgUp, K||Mode down by one full screen|
|~||Navigate to user home directory|
|/||Navigate to the system root directory|
|l||Enter directory, or open file in
|dd||Delete currently selected file or directory (there is no confirmation, be careful), backing it up to the
|Alt+dd||Works the same as dd, but is always permanent, even if a
|T||Creates a new file, opening
|M||Creates a new directory, opening
|R||Renames a file, opening
|gg||Move to top|
|G||Move to bottom|
|m, Space||Mark for deletion|
|D||Delete marked files (does not touch unmarked files)|
|u||Undo the last deletion operation (if cfm was unable to access/create its trash directory
|X||Cut the current file or directory (to be pasted again with p)|
|yy||Copy the current file or directory (to be pasted again with p)|
|p||Paste the previously copied or cut file or directory|
|e||Open file or directory in
|o||Open file or directory in
|.||Toggle visibility of hidden files (dotfiles)|
|Return||Works like o if
|Tab||Switches to the next view|
|\`||Switches to the previous view|
|1…0||Switches to view N, up to the number specified by
1 The arrow keys work the same as hjkl.
2 The available characters for filenames are
._- by default, which is POSIX “fully portable filenames” plus spaces. If
you wish, you can disable spaces by setting
ALLOW_SPACES to 0.
stdout are not attached to a TTY, cfm will read commands from
stdin until either EOF is reached or it does not read any more data. This can
be used to script operations. All errors will be printed to
stderr and are
fatal. In scripting mode, cfm will never draw to the screen. Note: in
non-interactive mode, cfm will NOT backup files on deletion. This means that you
cannot use dd followed by u! All deletions made in
non-interactive mode will be final.
$ cat script.txt jjljjjkyyhp $ cfm <script.txt
This example is equivalent to performing the following operations in a normal cfm instance: