wb5/posts/fish-fm.md

63 lines
2.9 KiB
Markdown

# using the shell as a file picker for qutebrowser
2023-06-28
[Qutebrowser](https://github.com/qutebrowser/qutebrowser) is pretty great (thanks The-Compiler <3).
For those who don't know about it, it's essentially a Vim-like browser:
there's a bunch of cryptic shortcuts, but they maximize your efficiency.
The best part of Vim, which is replicated in Qutebrowser,
is the ability to do everything without taking your hands off the keyboard.
Anyways, an issue I had was that when uploading a file in Qutebrowser is that it calls on a normal GUI file picker.
This is probably a sane default, but the default file picker does not have Vim shortcuts (absolutely unusable!).
Now, you *could* use [ranger](https://github.com/ranger/ranger), or [vifm](https://github.com/vifm/vifm)
in the way described [here](https://reddit.baby/r/qutebrowser/comments/r9igqe/need_help_using_ranger_as_file_chooser/),
but that's boring.
Instead, as a masochist power user, I manage all my files exclusively in the shell,
and I wanted to have that experience in Qutebrowser.
So, I made a 25-line script `fish-fm` that does just that.
## demonstration
Here's an example usage of fish-fm.
First, when a website asks you to upload a file, qutebrowser opens a terminal window with fish-fm.
Then, you have a full fish shell in which
you can run `sxiv`, `mpv`, or any other command to inspect your files first.
This also includes all its features like history and autosuggestions.
Once you figure out what you want to upload, you then run `sel [file paths]`.
The great thing about this is that you can use any glob or even xargs with this command.
As a demo:
![](../public/img/fish-fm/term-thumb.jpg)
![](../public/img/fish-fm/discord-thumb.jpg)
### sxiv selection
Optionally, you can run `ssel [directory or file paths]`,
which uses sxiv to view your images.
Then, you can mark the images (see sxiv's man page), and those will be uploaded.
![](../public/img/fish-fm/sxiv.jpg)
## installation
+ Install the dependencies: qutebrowser, fish
+ Copy [fish-fm](https://github.com/dogeystamp/dots/blob/main/src/.local/bin/fish-fm) somewhere in your PATH.
+ Create a qutebrowser [config.py](https://github.com/qutebrowser/qutebrowser/blob/master/doc/help/configuring.asciidoc#configuring-qutebrowser-via-configpy).
Then, add these lines:
```
c.fileselect.handler = "external"
c.fileselect.multiple_files.command = ["st", "-e", "fish", "-C", "set -x OUTPUT {}; source ~/.local/bin/fish-fm"]
c.fileselect.single_file.command = ["st", "-e", "fish", "-C", "set -x OUTPUT {}; source ~/.local/bin/fish-fm"]
```
Depending on your terminal, you might have to edit these commands.
I personally use `st`; yours may be different.
The `{}` here is a placeholder for a temporary file where fish-fm writes its output.
This is necessary because terminals don't forward the stdout of their commands,
so fish-fm can't just print the files selected.
+ Your file picker is now a fish shell.