Use the system trash with ZSH terminal
20 Aug 2012When you start using the terminal as your main file explorer instead of a GUI one, you soon discover two important things.
First, it is much faster to browse accross your filesystem, copying and moving files in the terminal that it is with your mouse. This is hard to believe at first (how can writing text on a dull black screen be faster than drag'n'dropping ?) but it is nonetheless true (after a bit of practice, sure).
The second thing is that it is also much much easier to *permanently delete very important files *as deleting a file through the terminal has no trash bin nor any other safeguard mechanism.
Scripting a rm replacement
At first, I scripted my own rm rm
replacement that was manually moving files to ~/.local/share/Trash/files
(the common Trash directory) instead of deleting them. But it was a bit naive and couldn't really work on removable drives nor provide a "restore" mechanism.
Fortunatly, the trash-cli
package on Ubuntu provides a set of methods to deal with the trash from the command line. They have very explicit names such as trash
, list-trash
, restore-trash
or empty-trash
.
ZSH aliases
I had to resort to quite a bit of ZSH tweaking to make it a perfect rm
replacement. First, I added a simple alias for the rm
command.
alias rm='trash'
Then I also wanted to change the default rmdir
command. I could have used the same type of alias (alias rmdir='trash'
) but I would have lost the builtin ZSH autocompletion of directories zsh provides with rmdir
.
When you define aliases with ZSH, you can choose if you want it to autocomplete based on the right hand side of your alias (NO_COMPLETE_ALIASES
) or the left hand side (COMPLETE_ALIASES
). Yes, the name of the options seem wrong to me too, but this is actually how it works.
I prefer setting NO_COMPLETE_ALIASES
so I can use the correct autocompletion on my commands with my aliases, but for the rmdir
case this was proving to be an issue.
rmdir autocompletion
So, I started writing my own rmdir
implementation in a custom script. This was merely a wrapper to rmdir
but putting it in its own script allowed me to change its name and thus changing its autocomplete method.
I named it better-rmdir
, and put it in my $PATH
. Here is the code
#!/usr/bin/zsh
trash $@
As you can see, this is just a wrapper, taking the initial arguments and passing them to trash
.
But I also created a file named _better-rmdir
and put it in my $FPATH
(this is where ZSH goes looking to autocomplete methods). I just copied the code of the original _directories
method (that you can probably find in /usr/share/zsh/functions/Completion/Unix/
), and adapted it to fit my newly created better-rmdir
#compdef better-rmdir
local expl
_wanted directories expl directory _files -/ "$@" -
And finally, I added an alias (alias rmdir='better-rmdir'
) and everytime I ask for an autocomplete on rmdir
it actually looks for the autocomplete of better-rmdir
, which is the code contained in _better-rmdir
and which in turn return only directories.
Now I have complete rm
and rmdir
commands in my terminal that move files to the trash.
Want to add something ? Feel free to get in touch on Twitter : @pixelastic