จะบอก mutt ว่าจะไม่รอให้โปรแกรมไฟล์แนบส่งคืนได้อย่างไร


9

ฉันใช้บรรทัดนี้สำหรับรูปภาพในmailcap:

image/*; eog %s &;

แต่ mutt ลบไฟล์ temp ทันทีและ eog ไม่สามารถโหลดได้
เมื่อฉันลบ&mutt รอให้ eog ถูกปิดจนกว่ามันจะหนีออกมาจากบรรทัดคำสั่ง

คำตอบ:


9

นี่คือสิ่งที่ฉันใช้:

.mailcap:

application/*; mkdir -p /tmp/mutt \; cp %s /tmp/mutt \; xdg-open /tmp/mutt/$(basename %s) &

.mutt / muttrc:

folder-hook . `rm -f /tmp/mutt/*`

ทุกครั้งที่มีความพยายามในการเปิดสิ่งที่แนบมามันจะถูกคัดลอกในไดเรกทอรีชั่วคราวโดยเฉพาะและการคัดลอกจะเปิดขึ้น
ทุกครั้งที่คุณเริ่มต้นmuttสำเนาที่ยังไม่บรรลุนิติภาวะจะถูกล้างออก

คุณอาจหรืออาจไม่ต้องการ&ที่ส่วนท้ายขึ้นอยู่กับคำสั่งที่คุณใช้ (บางเวอร์ชั่นxdg-openกำลังปิดกั้นในขณะที่บางรุ่นไม่ได้ปิดกั้น)

คุณสามารถใช้สิ่งนี้กับคำสั่งใด ๆ xdg-openเป็นเพียงตัวจัดการแบบครบวงจรที่สะดวกสบาย


นี่เป็นวิธีทั่วไปที่ยอดเยี่ยมในการแทนที่ mailcap! ขอบคุณ!
Profpatsch

ฉันต้องการ&after xdg-open ไม่สามารถเจ็บที่จะมีมันในกรณีใด ๆ ใช่มั้ย
Profpatsch

บางทีคุณอาจจะทำให้เป็นคำถาม: วิธีการแทนที่mailcapด้วยxdg-open? และคัดลอกคำตอบนั้น ฉันแน่ใจว่ามีบางคนที่มีคำถามนั้น
Profpatsch

2
สิ่งนี้จะไม่เป็นปัญหาหรือไม่ถ้าคุณเปิดแอปพลิเคชั่นหลายรายการโดยการเปลี่ยนโฟลเดอร์จะเป็นการลบข้อมูลใด ๆ ใน / tmp / mutt / โฟลเดอร์ ตั้งแต่ xdg-open อาจปิดกั้นหรือไม่ปิดกั้นฉันเพิ่งใช้แอปพลิเคชั่น (firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Derek Schrock

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันเพิ่งพบตอนนี้เพราะฉันเชี่ยวชาญในการตั้งค่า Mutt ทางออกของฉันคือใช้ของ Neomutt shutdown-hookแทน สิ่งนี้จะทำให้ tmp dir ว่างเมื่อ mutt ถูกปิด
เจริญเติบโต

3

คุณสามารถใช้คำสั่ง wrapper ที่:

  1. เปลี่ยนชื่อไฟล์
  2. รันวิวเวอร์ในเบื้องหลัง
  3. ล้างข้อมูลเมื่อผู้ดูกลับมาแทนที่จะปล่อยให้muttทำ

สิ่งที่ต้องการ:

#! /bin/sh -

TMPDIR=$(
  mutt -D 2> /dev/null |
    awk -F\" '
      $1 == "tmpdir=" {
        gsub("~", ENVIRON["HOME"], $2)
        print $2
        exit
      }'
)
[ -n "$TMPDIR" ] || exit
export TMPDIR

nargs=$#
nfiles=0
for i do
  case $i in
    ("$TMPDIR"/?*)
      new_file=$(mktemp -ut "XXXXX${i##*/}") &&
        mv -- "$i" "$new_file" &&
        nfiles=$(($nfiles + 1)) &&
        set -- "$new_file" "$@" "$new_file" &&
        continue
  esac
  set -- "$@" "$i"
done

run_command() (
  shift "$(($nargs + $nfiles))"
  exec "$@"
)

(
  run_command "$@"
  while [ "$nfiles" -gt 0 ]; do
    set -- "$@" "$1"
    shift
    nfiles=$(($nfiles - 1))
  done
  shift "$((2*$nargs))"
  rm -f -- "$@"
) &

และใส่สิ่งที่ชอบ:

image/*; muttv eog %s;

muttvสคริปต์ข้างต้นอยู่ที่ไหน

ด้านบนไม่มีข้อสันนิษฐานว่าชื่อไฟล์ปรากฏในรายการข้อโต้แย้งหรือตัวอักษรใดที่มี ... ซึ่งเป็นสาเหตุแรกที่เราถามmuttว่ามันtmpdirคืออะไร(ดังนั้นเราจึงใช้มันเพื่อกำหนดว่าไฟล์ใดดู )

ในกรณีส่วนใหญ่มันจะ overkill แม้ว่าและตามที่ Gilles ชี้ให้เห็นอาจไม่ทำงานถ้า tmpdir ถูกระบุว่าสัมพันธ์กับโฟลเดอร์กล่องจดหมายของคุณ

วิธีที่ง่ายกว่าคือ:

#! /bin/sh -
nargs=$#
eval "file=\${$nargs}"
newfile=$(dirname -- "$file")/new-$(basename -- "$file")
while [ "$nargs" -gt 1 ]; do
  set -- "$@" "$1"
  shift
  nargs=$(($nargs - 1))
done
shift
mv -- "$file" "$newfile" || exit
(
  "$@" "$newfile"
  rm -f -- "$newfile"
) &

แทนที่mvด้วยcpหากคุณไม่ต้องการแตะไฟล์ต้นฉบับที่ให้muttไว้


เอ้ยคุณเพิ่งเขียนสิ่งนั้นตั้งแต่ต้น? ฉันใช้เวลา 15 นาทีในการเข้าใจสิ่งที่คุณกำลังทำและแม้กระทั่งตอนนี้ฉันไม่แน่ใจเกี่ยวกับการทำงานของบางส่วน
Profpatsch

ไม่กับฉันเพราะ.muttrc tmpdir="=tmp"ทำไมไม่คว้าไดเรกทอรีจากชื่อไฟล์?
Gilles 'หยุดความชั่วร้าย'

@Gilles จุดดีเกี่ยวกับ "+", "=" ... จุดทั้งหมดคือการรับ tmpdir จาก mutt เพื่อให้เราทราบว่าข้อโต้แย้งใดคือชื่อไฟล์ สิ่งทั้งหมดเป็นเรื่องที่เกินความจริงเล็กน้อย แต่อย่างไรก็ตามใน 99% ของกรณีที่ชื่อไฟล์จะเกิดขึ้นเพียงครั้งเดียวและเป็นอาร์กิวเมนต์สุดท้ายและเราสามารถเปลี่ยนชื่อเป็นnew-$original
Stéphane Chazelas

อีกจุดหนึ่งคือสคริปต์รายการนี้ไม่ได้ถูกเรียกในนามของ mutt เสมอไปอาจเรียกได้ว่าในสถานการณ์ที่ไฟล์ไม่ใช่ไฟล์ชั่วคราวและต้องไม่ถูกลบ (ฉันมักจะโทรหาseeบรรทัดคำสั่งฉันไม่คิดว่ามันจะลบไฟล์แม้ว่ามันจะอยู่ใน/tmp!) วิธีแก้ไข: สร้างฮาร์ดลิงก์
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

@Gilles ฉันคิดถึง hardlink แต่สำหรับ mutt มันใช้งานไม่ได้เพราะหลังจากรันคำสั่งแล้ว mutt จะตัดทอนไฟล์ก่อนที่จะยกเลิกการลิงก์ (เปิดด้วย O_TRUNC และปิดฉันตรวจสอบแล้ว)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.