summaryrefslogtreecommitdiffstats
path: root/readme.md
blob: ba04def6e3e514a3c90b81921d32ff5424528889 (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
# 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
```

## 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

- Navigate with the arrows or the mouse (left select, right open, wheel)
- Open a file with o, enter or right click
- Execute a file with a custom command with e
- Copy / move / symlinks / delete with c, p, s, x
- Create files, directory, rename with n, d, r
- Open a new shell in this directory with s
- Flag a bunch of file, change panel with TAB and move/copy them !
- Many ways to jump somewhere :

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

- Change display, removing details or displaying a single pane.
- Preview most of files (text, highlighted code, binary, pdf, exif details, video/audio details, archives) with P
- Decompress an archive with Ctrl+x
- Copy a filename/filepath to clipboard with Ctrl+n, Ctrl+p
- Rename a bunch of file with B. Flag files, B, edit the names and save the file. The renaming is done.
- Use the integrated fuzzy finder (forked version of skim, an fzf clone) with Ctrl+f to navigate quickly
- Filter the view (by extension, name, directory only, all files) with F
- Find files with / (with completion), flag files matching a regex with w
- Detect removable disks automatically and jump to them in a few keystrokes (G, up, enter)

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

## 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 environement 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`.

This feature requires `nvim-send` to be installed (`cargo install nvim-send`)

## 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
}
```

## Default keybindings

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

```
fm: a dired like file manager. Keybindings.


     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 -
     Char('D'):      toggle dual pane - if the width is sufficiant
     Char('a'):      toggle hidden
     Char('s'):      shell in current directory
     Char('o'):      open the selected file
     Char('i'):      open in current nvim session
     Char('P'):      preview this file
     Char('T'):      display a thumbnail of an image
     Char('-'):      move back to previous dir
     Char('~'):      move to $HOME
     Char('M'):      mark current path
     Char('\''):     jump to a mark
     Ctrl('e'):      toggle metadata on files
     Ctrl('f'):      fuzzy finder
     Ctrl('r'):      refresh view
     Ctrl('c'):      copy filename to clipboard
     Ctrl('p'):      copy filepath to clipboard
     Alt('d'):       dragon-drop selected file

     - Action on flagged files -
     Char(' '):      toggle flag on a file
     Char('*'):      flag all
     Char('u'):      clear flags
     Char('v'):      reverse flags
     Char('c'):      copy to current dir
     Char('p'):      move to current dir
     Char('x'):      delete files
     Char('l'):      symlink files
     Char('B'):      bulkrename files

     - MODES -
     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('/'):      SEARCH
     Char('F'):      FILTER
         (by name "n name", by ext "e ext", only directories d or all for reset)
```

## 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.
- **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.

## 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.