Làm thế nào để nói với mutt không chờ đợi một chương trình đính kèm trở lại?


9

Tôi sử dụng dòng này cho hình ảnh trong mailcap:

image/*; eog %s &;

nhưng mutt ngay lập tức xóa tệp tạm thời và eog không thể tải nó.
Khi tôi gỡ bỏ &mutt chờ cho eog được đóng lại cho đến khi nó thoát khỏi dòng lệnh.

Câu trả lời:


9

Đây là những gì tôi sử dụng:

.mailcap:

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

.mutt / muttrc:

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

Mỗi lần thử mở tệp đính kèm, nó sẽ được sao chép trong thư mục tạm thời dành riêng và bản sao được mở.
Mỗi khi bạn bắt đầu mutt, bất kỳ bản sao còn sót lại sẽ được dọn sạch.

Bạn có thể cần hoặc không cần &đến cuối, tùy thuộc vào lệnh bạn đã sử dụng. (Một số phiên bản xdg-openđang chặn, trong khi các phiên bản khác thì không.)

Không cần phải nói, bạn có thể sử dụng điều này với bất kỳ lệnh nào. xdg-openchỉ là một xử lý một cửa thuận tiện.


Đây là một cách tổng quát tuyệt vời để thay thế mailcap! Cảm ơn!
Profpatsch

Tôi cần &sau khi mở xdg. Không thể làm tổn thương để có nó ở đó trong mọi trường hợp, phải không?
Profpatsch

Có lẽ bạn có thể đặt một câu hỏi: Làm thế nào để thay thế mailcapbằng xdg-open? và sao chép câu trả lời đó Tôi chắc chắn có một số người với câu hỏi đó.
Profpatsch

2
Điều này sẽ không có vấn đề gì nếu bạn mở nhiều ứng dụng bằng cách thay đổi thư mục sẽ xóa sạch mọi thứ trong thư mục / tmp / mutt / của bạn. Vì xdg-open có thể hoặc không chặn tôi chỉ sử dụng ứng dụng (firefox) text/html; t=$(mktemp /tmp/XXXXXXXXXX) \; cp %s "$t" \; /bin/sh -c "firefox $t \; rm $t \;" &
Derek Schrock

Tôi biết đây là một câu hỏi cũ, nhưng tôi chỉ tìm thấy nó bây giờ vì tôi có ý định thiết lập Mutt. Giải pháp của tôi là sử dụng Neomutt's shutdown-hookthay thế; Điều này chỉ làm trống thư mục tmp khi tắt mutt.
Phát triển

3

Bạn có thể sử dụng lệnh bao bọc:

  1. đổi tên tập tin
  2. chạy trình xem trong nền
  3. làm sạch khi người xem đã trở lại thay vì cho phép muttlàm điều đó.

Cái gì đó như:

#! /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 -- "$@"
) &

Và đặt một cái gì đó như:

image/*; muttv eog %s;

Trong trường hợp muttvlà kịch bản ở trên.

Ở trên không có giả định về nơi (các) tên tệp xuất hiện trong danh sách các đối số hoặc ký tự chúng chứa ... Đó là lý do tại sao trước tiên chúng ta hỏi mutttmpdirlà gì (vì vậy chúng tôi sử dụng nó để xác định các tệp là gì xem ).

Trong hầu hết các trường hợp, nó sẽ là quá mức cần thiết và như Gilles chỉ ra có thể không hoạt động nếu tmpdir được chỉ định là có liên quan đến thư mục hộp thư của bạn.

Một cách đơn giản hơn sẽ là:

#! /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"
) &

Thay thế mvbằng cpnếu bạn không muốn chạm vào tệp gốc được cung cấp bởi mutt.


Trời ạ, bạn vừa mới viết nó từ đầu à? Tôi mất 15 phút để hiểu những gì bạn đang làm và thậm chí bây giờ tôi không chắc chắn về cách một số phần hoạt động chính xác.
Profpatsch

Thất bại với tôi .muttrctmpdir="=tmp". Tại sao không lấy thư mục từ tên tập tin?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles, điểm hay về "+", "=" ... Toàn bộ vấn đề là lấy tmpdir từ mutt để chúng tôi biết đối số nào là tên tệp. Toàn bộ điều này là hơi quá mức mặc dù trong 99% trường hợp tên tệp sẽ chỉ xảy ra một lần và là đối số cuối cùng, và chúng ta chỉ có thể đổi tên thànhnew-$original
Stéphane Chazelas

Một điểm khác là tập lệnh nhập này không phải luôn được gọi thay mặt cho mutt, nó có thể được gọi trong trường hợp tệp không phải là tệp tạm thời và không được xóa. (Tôi thường gọi seevào dòng lệnh, tôi không hy vọng nó sẽ xóa tệp, ngay cả khi nó nằm trong /tmp!) Giải pháp: tạo một liên kết cứng.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles, tôi nghĩ về liên kết cứng, nhưng đối với mutt, nó không hoạt động, vì sau khi chạy lệnh, mutt cắt tệp trước khi hủy liên kết. (mở bằng O_TRUNC và đóng, tôi đã xác minh nó).
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.