diff --git a/posts/fish-fm.md b/posts/fish-fm.md new file mode 100644 index 0000000..5626fcc --- /dev/null +++ b/posts/fish-fm.md @@ -0,0 +1,62 @@ +# 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. diff --git a/public/img/fish-fm/discord-thumb.jpg b/public/img/fish-fm/discord-thumb.jpg new file mode 100644 index 0000000..62db5e4 Binary files /dev/null and b/public/img/fish-fm/discord-thumb.jpg differ diff --git a/public/img/fish-fm/discord.jpg b/public/img/fish-fm/discord.jpg new file mode 100644 index 0000000..ccad33a Binary files /dev/null and b/public/img/fish-fm/discord.jpg differ diff --git a/public/img/fish-fm/sxiv.jpg b/public/img/fish-fm/sxiv.jpg new file mode 100644 index 0000000..407d984 Binary files /dev/null and b/public/img/fish-fm/sxiv.jpg differ diff --git a/public/img/fish-fm/term-thumb.jpg b/public/img/fish-fm/term-thumb.jpg new file mode 100644 index 0000000..171f982 Binary files /dev/null and b/public/img/fish-fm/term-thumb.jpg differ diff --git a/public/img/fish-fm/term.jpg b/public/img/fish-fm/term.jpg new file mode 100644 index 0000000..d86cd7e Binary files /dev/null and b/public/img/fish-fm/term.jpg differ