diff options
author | Robin Jarry <robin@jarry.cc> | 2022-09-30 14:12:07 +0200 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2022-10-01 15:47:25 +0200 |
commit | 45bff8851509432f6b5a21360ce67a7b2ca55eb5 (patch) | |
tree | 9290e56c3483a60b04d321837ac609c404a38768 /lib | |
parent | 92ba132d70fe1d9afabe3cf4f23376025ccff897 (diff) | |
download | aerc-45bff8851509432f6b5a21360ce67a7b2ca55eb5.tar.gz |
open: allow overriding default program
Instead of xdg-open (or open on MacOS), allow forcing a program to open
a message part. The program is determined in that order of priority:
1) If :open has arguments, they will be used as command to open the
attachment. If the arguments contain the {} placeholder, the
temporary file will be substituted, otherwise the file path is added
at the end of the arguments.
2) If a command is specified in the [openers] section of aerc.conf for
the part MIME type, then it is used with the same rules of {}
substitution.
3) Finally, fallback to xdg-open/open with the file path as argument.
Update the docs and default config accordingly with examples.
Fixes: https://todo.sr.ht/~rjarry/aerc/64
Co-authored-by: Jason Stewart <support@eggplantsd.com>
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Tim Culverhouse <tim@timculverhouse.com>
Acked-by: Moritz Poldrack <moritz@poldrack.dev>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/open.go | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/lib/open.go b/lib/open.go index a189980a..e091d913 100644 --- a/lib/open.go +++ b/lib/open.go @@ -4,16 +4,48 @@ import ( "fmt" "os/exec" "runtime" + "strings" "git.sr.ht/~rjarry/aerc/logging" ) func XDGOpen(uri string) error { - openBin := "xdg-open" - if runtime.GOOS == "darwin" { - openBin = "open" + return XDGOpenMime(uri, "", nil, nil) +} + +func XDGOpenMime( + uri string, mimeType string, + openers map[string][]string, args []string, +) error { + if len(args) == 0 { + // no explicit command provided, lookup opener from mime type + opener, ok := openers[mimeType] + if ok { + args = opener + } else { + // no opener defined in config, fallback to default + if runtime.GOOS == "darwin" { + args = append(args, "open") + } else { + args = append(args, "xdg-open") + } + } + } + + i := 0 + for ; i < len(args); i++ { + if strings.Contains(args[i], "{}") { + break + } + } + if i < len(args) { + // found {} placeholder in args, replace with uri + args[i] = strings.Replace(args[i], "{}", uri, 1) + } else { + // no {} placeholder in args, add uri at the end + args = append(args, uri) } - args := []string{openBin, uri} + logging.Infof("running command: %v", args) cmd := exec.Command(args[0], args[1:]...) out, err := cmd.CombinedOutput() |