diff --git a/office/.config/neomutt/maps b/office/.config/neomutt/maps index a3e79a6..d46c4d2 100644 --- a/office/.config/neomutt/maps +++ b/office/.config/neomutt/maps @@ -74,6 +74,10 @@ bind pager G bottom # markdown to html for composition macro compose ,m "F pandoc -s -f markdown -t html \ny^T^Utext/html; charset=UTF-8\n" "Convert from MD to HTML" +# attach and save file attachments +macro compose a 'source "neomutt-filer attach"|' "Attach with file manager" +macro attach s 'source "neomutt-filer saveto"|' "Save attachment to dir" + # since we unbound the original g bind index,pager r noop # to avoid accidentally sending replies bind index,pager rr group-reply diff --git a/office/.local/bin/neomutt-filer b/office/.local/bin/neomutt-filer new file mode 100755 index 0000000..02f6105 --- /dev/null +++ b/office/.local/bin/neomutt-filer @@ -0,0 +1,73 @@ +#!/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