XeFM’s core file operations — copy, move, duplicate, and rename — all share the same conflict handling and progress display. This document covers how each one works and the options you can configure.
For the complete list of key bindings, see the XeFM User Guide or press ? in XeFM.
Copy the selected file(s) to the other pane.
Directories are copied recursively. If a name already exists at the destination, XeFM asks how to resolve it (see Conflict resolution).
XeFM confirms before copying by default. To skip the confirmation:
CONFIRM_COPY = False # default: True
Move the selected file(s) to the other pane.
(With nothing selected, M instead prompts for a new directory name — see Create File Operations.)
XeFM confirms before moving by default:
CONFIRM_MOVE = False # default: True
Move works the same whether the source and destination are on the same disk, on two different disks, or on cloud storage such as Amazon S3.
Because the original is removed only after a verified copy, a failed move across disks or storage never deletes your source files. Directory moves work too — all contained files are moved recursively.
For S3 you need AWS credentials configured and the boto3 package installed.
Cross-storage transfers depend on your network speed, so test with small files
first when setting up a new storage backend.
Make an in-place copy of a file or directory — XeFM’s equivalent of Finder’s Duplicate (⌘D). The copy lands in the same directory as the original, automatically renamed so it never collides.
Select one or more items (or just place the cursor on one), then choose Duplicate from either:
When nothing is explicitly selected, the entry under the cursor is duplicated; afterward the cursor lands on the new copy.
There is no default keyboard shortcut. To add one, bind the
duplicate_files action in your config, e.g.:
KEY_BINDINGS['duplicate_files'] = ['Shift-D']
Copy to Other Pane (C) also duplicates: when both panes show the same directory, copying auto-renames exactly like Duplicate instead of erroring. (Move still refuses a same-directory target.)
Duplicates use the same ` (N)` scheme as “Keep both” conflict resolution:
| Original | Duplicate | Next duplicate |
|---|---|---|
report.pdf |
report (1).pdf |
report (2).pdf |
photos (folder) |
photos (1) |
photos (2) |
.bashrc (dotfile) |
.bashrc (1) |
.bashrc (2) |
archive.tar.gz |
archive.tar (1).gz |
archive.tar (2).gz |
The suffix is inserted before the last extension for files and appended for directories and extension-less names.
Duplicating shows a confirmation dialog by default. Turn it off for instant, Finder-like behavior:
CONFIRM_DUPLICATE = False # default: True
Directories are duplicated recursively, so the confirmation is a useful guard against duplicating a large tree by accident.
When a copy, move, or archive extraction would overwrite an existing file, XeFM stops and asks what to do instead of silently overwriting. The dialog offers:
Choosing Rename opens an input field pre-filled with the original name. Edit it to whatever you want and press Enter. If the new name also collides, the dialog reappears so you can overwrite, rename again, or cancel — this repeats until you pick a free name or cancel.
Renaming lets you keep both files (the original and the incoming one) rather than overwriting, which is a safer choice for important files.
When several files collide, XeFM walks through them one at a time. For each conflict you can Overwrite, Rename, or Skip that file — or choose Skip All to skip every remaining conflict at once. Files with no conflict are copied or moved automatically. Each conflict is handled individually; there is no automatic numbering or pattern-based batch renaming (for that, see Batch Rename).
Conflict resolution works across every storage type XeFM supports (local ↔ S3, and so on) and is available whenever the corresponding confirmation setting is enabled:
CONFIRM_COPY = True # copy conflicts
CONFIRM_MOVE = True # move conflicts
CONFIRM_EXTRACT_ARCHIVE = True # extraction conflicts
All three are on by default.
Copy and move operations show detailed, real-time progress — especially useful for large files or directories with many files. The UI stays responsive while the transfer runs in the background.
The progress dialog shows one overall bar and, below it, the files currently in flight:
Copy…
[███████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░]
12 / 100 items — 350.2M / 2.1G
photos/IMG_2041.jpg 8.1M / 24.5M
photos/IMG_2042.jpg 12.9M / 31.0M
notes.txt
video/trip.mov 310.5M / 1.4G
While an operation runs, normal input is blocked so you can’t move the cursor or start another command. Press ESC to cancel. Cancellation is checked between files and, for large files, at each chunk — so it may take a moment to stop at the next checkpoint. Partial files are removed cleanly, leaving nothing half-written behind.
This applies to remote transfers too: a slow upload to S3 or an SFTP server stops when you press ESC, rather than running to completion in the background. A cancelled S3 upload leaves no object behind and no partially uploaded pieces to be billed for; a cancelled download leaves no file on disk. An SFTP transfer stops within about half a second of the keypress.
Progress works across disks and storage types, so a move to an external drive gets the same per-file byte progress that a local copy, a cross-storage transfer, or an S3-to-S3 transfer does. No configuration is required — it is always on and adapts automatically to file size, file count, and terminal width.
create_directory (the same key as move_files, with
nothing selected), type a name, and press Enter.create_file, type a filename, and press Enter. The
new empty file opens immediately in your configured text editor.Both check that the current directory is writable and refuse to overwrite an existing name.
An operation never sends the cursor back to the top of the pane. After a delete, a copy, a move, a duplicate or a rename, the cursor is still on the file it was on — even though rows above it have come or gone, and even on a pane sorted by size or date, or sorted in reverse.
When the file under the cursor is the one that disappeared — you deleted it,
moved it out, or deleted a whole block of selected files — the cursor drops to
the entry that took its place, so repeating delete_files deletes down through
a directory. At the end of the listing it moves up to the new last entry
instead, and in a directory you have just emptied it returns to the top.
A rename keeps the cursor on the renamed file under its new name, whether you renamed one file or ran a batch rename over many, and a duplicate leaves the cursor on the new copy. The same holds for changes XeFM did not make itself: a file appearing or vanishing in a directory another program is writing to moves the rows, not your cursor.
The one place the cursor deliberately does return to the top is a filter change (;), which clears the selection and starts the narrowed listing fresh.