#!/usr/bin/env bash # A simple utility script for neomutt to use your favorite cli # file manager to work with files in neomutt. # Can add attachments to emails or save attachments in a chosen directory. # # Use it as `neomutt-filer attach ` # or `neomutt-filer saveto ` # # Can be bound to neomutt macros like the following: # # macro compose A 'source "neomutt-filer attach"|' "Attach with file manager" # macro attach S 'source "neomutt-filer saveto"|' "Save attachment to dir" # # read more at the following GH issues: # https://github.com/neomutt/neomutt/issues/1515 -- switch folders with external program # https://github.com/neomutt/neomutt/issues/1669 -- attach files with fzf _file_picker() { if command -v vifm >/dev/null 2>&1; then vifm --choose-files - "$@" # yazi & ranger untested elif command -v yazi >/dev/null 2>&1; then yazi "$@" --chooser-file - elif command -v ranger >/dev/null 2>&1; then ranger --choosefiles - "$@" elif command -v fzf >/dev/null 2>&1; then fzf -m --prompt='Choose one/multiple file(s) to attach >' "$@" fi } _dir_picker() { if command -v vifm >/dev/null 2>&1; then vifm --choose-dir - --on-choose exit "$@" # yazi & ranger untested # elif command -v yazi >/dev/null 2>&1; then # yazi "$@" --chooser-file - # elif command -v ranger >/dev/null 2>&1; then # ranger --choosefiles - "$@" elif command -v fzf >/dev/null 2>&1; then find "$@" -type d -print | fzf --prompt='Choose dir >' fi } attachfile() { _file_picker "$@" | while IFS=$'\n' read -r attachment; do printf "push '%s'\n" "$attachment" done } savetodir() { _dir_picker "$@" | xargs printf "push '%sy'\n" } _usage() { echo """ Usage: neomutt-filer [options...] Subcommands: attach Pick files to attach saveto Pick a directory to save into """ } case "${1:-}" in attach) shift attachfile "$@" ;; saveto) shift savetodir "$@" ;; -h | --help | *) _usage ;; esac