summaryrefslogtreecommitdiffstats
path: root/readme.md
blob: 8fa797ad01703982a14faf487da432cf4c2b5bb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
# FM: a dired inspired TUI file manager

Written in rust.

[![fm-tui on crates.io][cratesio-image]][cratesio]
[![fm-tui on docs.rs](https://img.shields.io/docsrs/fm-tui/0.1.0)][docrs]

[cratesio-image]: https://img.shields.io/crates/v/fm-tui.svg
[cratesio]: https://crates.io/crates/fm-tui
[docsrs-badge]: https://img.shields.io/docsrs/fm-tui/0.1.0
[docrs]: https://docs.rs/fm-tui/0.1.0

```
FM : dired like file manager


Usage: fm [OPTIONS]

Options:
  -p, --path <PATH>      Starting path [default: .]
  -s, --server <SERVER>  Nvim server [default: ]
  -h, --help             Print help information
  -V, --version          Print version information
```

## Platform

Linux is the only supported platform.

- Version 0.1.20 doesn't compile on MacOS (see [#77](https://github.com/qkzk/fm/issues/77)).
- Version 0.1.21 fixes this bug but I can't test more since I don't own a mac :)

## Video

![fm](./fm.gif)

## Installation

```sh
cargo install fm-tui
```

## Usage

Start it from command line with no parameters :

```sh
fm
```

or with a path :

```sh
fm -p ~/Downloads
```

If you added the [recommanded function](#cd-on-quit) to your bashrc/zshrc, simply use `f` and you will cd to the last visited directory when exiting.

## Features

Some features depends on external programs to keep fm from being really bloated.

### Navigation

- Navigate with the arrows or the mouse (left select, right open, wheel)
  Basic vim keys are supported by default: hjkl, gG, Ctrl+U Ctrl+D, JK
- Open a file with o, enter or right click
- Execute a file with a custom command with e

### Moving

Many ways to jump somewhere :

- Alt+g: type the full address (with completion enabled),
- Ctrl+g: a predefined shortcut (default root folders, home and mount points, gitroot, config folder),
- Alt+j: by jumping to a flagged file,
- ': by creating your own marks and jumping to them

### File manipulation

- Flag files with `space` (\*: flag all, v: reverse, u: unflag)
- Copy / move / symlinks / delete / trash flagged files with c, p, s, x, X
- Create files, directory, rename with n, d, r
- Flag a bunch of file, change panel with TAB and move/copy them !
- Open the trash with Alt+o. x to remove permanently, enter to restore. Wipe the trash with Alt+x.
- Rename or create a bunch of file with B. Flag files, B, edit the names and save the file. The renaming is done.
  You can create nested files with `a/b/c` which will create every intermediate folder if needed.

### Shell

- Open a new shell in this directory with s
- Start a configured TUI application with S
- Execute a shell command with '!'. Expansions (%e ext, %n filename, %s filepath, %f flagged files, %d current directory) are supported.
  pipes and redirections aren't supported.

### Display

- Change display, removing details with Alt+e or display a single pane with Alt+d
- Preview most of files (text, highlighted code, binary, pdf, exif details, video/audio details, archives) with P
- Toggle the tree view with t. Fold selected folder with z. Unfold every folder with Z, fold every folder with Alt+z.
- Enter preview mode with Alt+P. Every file is previewed in the second pane.
- Filter the view (by extension, name, directory only, all files) with F
- Find files with / (with completion: Tab, enter to search), 
- flag files matching a regex with w

### Fuzzy finder

- Use the integrated fuzzy finder (forked version of skim, an fzf clone) with Ctrl+f to navigate quickly
- The same fuzzy finder can find specific lines in files with Ctrl+s
- Another fuzzy finder is available for your keybinds with Alt+h

### Neovim filepicker

When you open a file with i, it will send an event to Neovim and open it in a new buffer.
Recent versions of neovim export the RPC server address to an environment variable which is read if no argument
is provided.

It should always work, even outside of neovim.

It's also possible to pass the RPC server address with `fm -s address`.

### cd on quit

When leaving fm, it prints the last visited path.
If you add this function to your `zshrc` / `bashrc`, it will listen to stdout and cd to the last dir.

```bash
function f() {
  # start the fm filemanager, enabling cd on quit.
  dest=$(fm $@)
  if [[ ! -z $dest ]]
  then
   cd $dest
  fi
}
```

For fish users, this is the function to add to your `config.fish`

```bash
function f
  # start the fm filemanager, enabling cd on quit.
  set dest (fm $argv)
  if not test -z $dest
    cd $dest
  end
end
```

### Archives

- Decompress an archive by opening it (o, enter, right click)
- Compress flagged files with C. Pick the desired algorithm from a menu.

### Custom binds

You can bind any _unbound_ key to a shell command.

- pipe & redirections (| > >> <) aren't supported !
- the first word you type is the executable. Don't start your command with environment variables, it won't work.

Expansions :

- %e : extension
- %s : selected file (full path)
- %f : flagged files (full path)
- %n : selected filename
- %d : current directory

### More

- Copy a filename/filepath to clipboard with Ctrl+n, Ctrl+p
- Detect removable disks automatically and jump to them in a few keystrokes (Ctrl+g, up, enter)
- Drag and drop files (requires dragon-drop installed) with Alt+d
- Open and mount encrypted devices. Open the menu with Shift+e, mount with m, unmount with u.
- diff the first two flagged files / folders with D.
- Contol MOCP with Ctrl+arrows. Ctrl+Left, Ctrl+Right: previous or next song. Ctrl+Down: Toggle pause. Ctrl+Up: add current folder to playlist
- Set the selected image as wallpaper with W.
- _Experimental_ enter "command mode" with ':'. Type the name of a command and it will be executed.

Most of those features are inspired by ranger and alternatives (Midnight commander, nnn, lf etc.), the look and feel by dired.

## Default keybindings

Press `h` by default to display the help.
Your current keybindings are shown. Here are the default ones.

```


     Char('q'):      quit
     Char('h'):      help

     - Navigation -
     Left:           cd to parent directory
     Right:          cd to child directory
     Up:             one line up
     Down:           one line down
     Home:           go to first line
     End:            go to last line
     PageUp:         10 lines up
     PageDown:       10 lines down
     Tab:            cycle tab

     - Actions -
     Alt('f'):      toggle dual pane - if the width is sufficiant
     Alt('p'):       toggle a preview on the second pane
     Alt('e'):      toggle metadata on files
     Char('a'):      toggle hidden
     Char('s'):      shell in current directory
     Char('o'):      open the selected file
     Char('i'):      open in current nvim session
     Char('I'):      setup the nvim rpc address
     Char('P'):      preview this file
     Char('T'):       display infos about a media file
     Char('-'):      move back to previous dir
     Char('~'):      move to $HOME
     Char('M'):      mark current path
     Char('\''):     jump to a mark
     Char('f'):      search next matching element
     Ctrl('f'):      fuzzy finder
     Ctrl('s'):      fuzzy finder for line
     Ctrl('r'):      refresh view
     Ctrl('c'):      copy filename to clipboard
     Ctrl('p'):      copy filepath to clipboard
     Alt('d'):       dragon-drop selected file
     Alt('c'):       open the config file
     Char('W'):      set the selected file as wallpaper with nitrogen

     - Action on flagged files -
     Char(' '):      toggle flag on a file
     Char('*'):      flag all
     Char('u'):      clear flags
     Char('v'):      reverse flags
     Char('l'):      symlink to current dir
     Char('c'):      copy to current dir
     Char('p'):      move to current dir
     Char('x'):      delete files permanently
     Char('X'):      move to trash
     Char('C'):      compress into an archive
     Char('D'):      display the diff of the first 2 flagged files

     - Trash -
     Alt('o'):       Open the trash (enter to restore, del clear)
     Alt('x'):       Empty the trash

     - Tree -
     Navigate as usual. Most actions works as in 'normal' view.
     Char('t'):      Toggle tree mode
     Char('z'):      Fold a node
     Alt('z'):       Fold every node
     Char('Z'):      Unfold every node

     - MODES -
     Char('t'):      TREE
     Char('m'):      CHMOD
     Char('e'):      EXEC
     Char('d'):      NEWDIR
     Char('n'):      NEWFILE
     Char('r'):      RENAME
     Char('g'):      GOTO
     Char('w'):      REGEXMATCH
     Char('j'):      JUMP
     Char('O'):      SORT
     Char('H'):      HISTORY
     Char('G'):      SHORTCUT
     Char('E'):      ENCRYPTED DRIVE
         (m: open & mount,  u: unmount & close)
     Char('/'):      SEARCH
     Char(':'):      COMMAND
     Char('B'):      BULK
     Char('S'):      SHELL MENU
     Char('F'):      FILTER
         (by name "n name", by ext "e ext", only directories d or all for reset)
     Enter:  Execute mode then NORMAL
     Ctrl('q'):    NORMAL

     - MOC -
     Control MOC from your TUI
     CtrlUp:          Add a file or folder to the playlist
     CtrlLeft         Previous song
     CtrlDown:        Toggle play/pause. Start MOC if needed
     CtrlRight        Next song
```

## Configuration

Every configuration file is saved in `~/.config/fm/`

You can configure :

- **Colors** for non standard file types (directory, socket, char device, block device)
- **Keybindings**. Some should be left as they are, but all keybindings can be configured.
  use the provided config file as a default.
  Multiple keys can be bound the the same action.
- **Custom actions**. You can bind any key to a shell command.
  - don't use pipes or redirectons, they won't be parsed correctly
  - use an unset bind
  - %s is expanded to the selected path, %f is expanded to the flagged files (full paths).
  - See the [config](./config_files/fm/config.yaml) or an example.
- **Settings**. Do you whish to start with dual pane ? Do you wish to use basic or
  full display ?
- **Openers**. fm tries to be smart and open some files with a standard program.
  You can change that and use whatever installed program you want. Specify if it
  requires a shell to be run (like neovim) or not (like subl).
- **Marks**. Users can save about 100 differents marks to jump to, they're saved
  in your marks.config file. It's easier to let fm manage your marks, but if
  you made a mess or want to start over, simply delete the file or a single line.
- **TUI applications**. Some classic TUI applications like htop, glances, btop, lazygit are already there.
  Open the menu with `S` and pick the desired one. It will only work with a TUI application like HTOP,
  not a CLI application like bat.

## External dependencies

Most of the openers and tui applications are configurable from config files. Some are hardcoded if their command is quite specific or if I couldn't find a workaround.

- [lsblk](https://linux.die.net/man/8/lsblk): list encroytped devices
- [faillock](https://linux.die.net/man/8/faillock): reset failed sudo attempts
- [Cryptsetup](https://gitlab.com/cryptsetup/cryptsetup): decrypt & mount encrypted devices
- [Nitrogen](https://github.com/l3ib/nitrogen/): set up a wallpaper
- [MOC](https://moc.daper.net/) Music On Console allows you to play music from your terminal
- [Dragon-Drop](https://github.com/mwh/dragon) drag-and-drop a file from a terminal to a GUI application.
- [Ueberzug](https://github.com/LalleSX/ueberzug) display images in your terminal. Used to preview images. This one may be tricky to install from source since the original maintener nuked his project. It's still available in many package managers.
- [isoinfo](https://command-not-found.com/isoinfo) allow the content preview of an iso file
- [jupyter](https://jupyter.org/) preview jupyter notebooks by converting them to markdown
- [pandoc](https://pandoc.org) preview open documents by converting them to markdown with pandoc
- [fontimage](https://fontforge.org/docs/fontutils/fontimage.html) preview fonts by creating a thumbnail
- [rsvg-convert](https://github.com/brion/librsvg) preview svg by creating a thumbnail

## Contribution

Any help is appreciated.

I comment everything I do in [dev.md](development.md).

It's my first "published" program, so don't get upset by the code quality.