Gnus development mailing list
 help / color / mirror / Atom feed
From: Benjamin Rutt <rutt+news@cis.ohio-state.edu>
Subject: Re: request feedback on new function gnus-dired-attach
Date: Fri, 01 Feb 2002 20:25:53 -0500	[thread overview]
Message-ID: <wc3665gn07y.fsf@gamma.cis.ohio-state.edu> (raw)
In-Reply-To: <m3itaqx3iv.fsf@quimbies.gnus.org>

Lars Magne Ingebrigtsen <larsi@gnus.org> writes:

> Benjamin Rutt <rutt+news@cis.ohio-state.edu> writes:
>
>> Here is my latest version of gnus-dired.el, with your code included.
>> I think it's getting pretty close. 
>
> Hey; looks good.  Has the FSF been in touch with you (or vice versa)
> about paperwork?

I have now signed the relevant papers for the project 'Emacs Gnus' and
sent them back via snail mail to the FSF as of Monday of this week.
Now that the copyright issues are in order, I guess it is OK to look
at gnus-dired.el again.

I have pasted the latest version of gnus-dired.el below.  (The only
parts I've changed since it was last posted a month ago are a few
tidbits in the commentary, and also I added the convenience function
`turn-on-gnus-dired-mode'.)  Enabling gnus-dired now requires the
following lines in your ~/.gnus:

(require 'gnus-dired)
(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)

If there's a simpler way to turn it on, I'm all ears.  I'm guessing
not everyone would want to use this package (which also has the effect
of slightly polluting dired key bindings), so probably the above hook
should never be automatically added when gnus starts.

Feedback/criticism is welcome.

Also, if this file gets added to gnus, I'll be happy to write some
info documentation.  I think a new node "(gnus) Dired" under the
"Various" heirarchy is the proper place for a few choice words.  Is
there anywhere which might be better?

Thanks!  Here begins the code:

;;; gnus-dired.el --- utility functions where gnus and dired meet

;; Copyright (C) 1996, 1997, 1998, 1999, 2001
;;        Free Software Foundation, Inc.

;; Authors: Benjamin Rutt <brutt@bloomington.in.us>,
;;          Shenghuo Zhu <zsh@cs.rochester.edu>
;; Keywords: mail, news, extensions

;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:

;; This package provides utility functions for intersections of gnus
;; and dired.  To enable the gnus-dired-mode minor mode which will
;; have the effect of installing keybindings in dired-mode, place the
;; following in your ~/.gnus:

;; (require 'gnus-dired)
;; (add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)

;; Note that if you visit dired buffers before your ~/.gnus file has
;; been read, those dired buffers won't have the keybindings in
;; effect.  To get around that problem, you may want to add the above
;; statements to your ~/.emacs instead.

;;; Code:

(require 'dired)
(require 'gnus-ems)
(require 'gnus-msg)
(require 'gnus-util)
(require 'message)
(require 'mm-encode)
(require 'mml)

(defvar gnus-dired-mode nil
  "Minor mode for intersections of gnus and dired.")

(defvar gnus-dired-mode-map nil)

(unless gnus-dired-mode-map
  (setq gnus-dired-mode-map (make-sparse-keymap))

  (gnus-define-keys gnus-dired-mode-map
    "\C-c\C-a" gnus-dired-attach
    "\C-c\C-f" gnus-dired-find-file-mailcap))

(defun gnus-dired-mode (&optional arg)
  "Minor mode for intersections of gnus and dired.

\\{gnus-dired-mode-map}"
  (interactive "P")
  (when (eq major-mode 'dired-mode)
    (set (make-local-variable 'gnus-dired-mode)
	 (if (null arg) (not gnus-dired-mode)
	   (> (prefix-numeric-value arg) 0)))
    (when gnus-dired-mode
      (gnus-add-minor-mode 'gnus-dired-mode "" gnus-dired-mode-map)
      (gnus-run-hooks 'gnus-dired-mode-hook))))

;; Convenience method to turn on gnus-dired-mode.
(defsubst turn-on-gnus-dired-mode ()
  (gnus-dired-mode 1))

;; Method to attach files to a gnus composition.
(defun gnus-dired-attach (files-to-attach)
  "Attach dired's marked files to a gnus message composition.
If called non-interactively, FILES-TO-ATTACH should be a list of
filenames."
  (interactive
   (list
    (delq nil
	  (mapcar
	   ;; don't attach directories
	   (lambda (f) (if (file-directory-p f) nil f))
	   (nreverse (dired-map-over-marks (dired-get-filename) nil))))))
  (let ((destination nil)
	(files-str nil)
	(bufs nil))
    ;; warn if user tries to attach without any files marked 
    (if (null files-to-attach)
	(error "No files to attach")
      (setq files-str
	    (mapconcat
	     (lambda (f) (file-name-nondirectory f))
	     files-to-attach ", "))
      (setq bufs (message-buffers))
    
      ;; set up destination message buffer
      (if (and bufs
	       (y-or-n-p "Attach files to existing message buffer? "))
	  (setq destination
		(if (= (length bufs) 1)
		    (get-buffer (car bufs))
		  (completing-read "Attach to which message buffer: "
				   (mapcar
				    (lambda (b)
				      (cons b (get-buffer b)))
				    bufs)
				   nil t)))
	;; setup a new gnus message buffer
	(gnus-setup-message 'message (message-mail))
	(setq destination (current-buffer)))

      ;; set buffer to destination buffer, and attach files
      (set-buffer destination)
      (goto-char (point-max))		;attach at end of buffer
      (while files-to-attach
	(mml-attach-file (car files-to-attach)
			 (or (mm-default-file-encoding (car files-to-attach))
			     "application/octet-stream") nil)
	(setq files-to-attach (cdr files-to-attach)))
      (message "Attached file(s) %s" files-str))))

(autoload 'mailcap-parse-mailcaps "mailcap" "" t)

(defun gnus-dired-find-file-mailcap (&optional file-name arg)
  "In dired, visit FILE-NAME according to the mailcap file.
If ARG is non-nil, open it in a new buffer."
  (interactive (list
		(file-name-sans-versions (dired-get-filename) t)
		current-prefix-arg))
  (mailcap-parse-mailcaps)
  (if (and (file-exists-p file-name)
	   (not (file-directory-p file-name)))
      (let (mime-type method)
	(if (and (not arg)
		 (string-match "\\.[^\\.]+$" file-name)
		 (setq mime-type
		       (mailcap-extension-to-mime 
			(match-string 0 file-name)))
		 (stringp 
		  (setq method
			(cdr (assoc 'viewer 
				    (car (mailcap-mime-info mime-type 
							    'all)))))))
	    (let ((view-command (mm-mailcap-command method file-name nil)))
	      (message "viewing via %s" view-command)
	      (start-process "*display*"
			     nil
			     shell-file-name
			     shell-command-switch
			     view-command))
	  (find-file file-name)))
    (if (file-symlink-p file-name)
	(error "File is a symlink to a nonexistent target")
      (error "File no longer exists; type `g' to update Dired buffer"))))

(provide 'gnus-dired)
;;; gnus-dired.el ends here

-- 
Benjamin




  parent reply	other threads:[~2002-02-02  1:25 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-12-15  0:19 Benjamin Rutt
2001-12-15  5:25 ` Benjamin Rutt
2001-12-15  6:12 ` ShengHuo ZHU
2001-12-15  6:39   ` Benjamin Rutt
2001-12-15  8:17   ` Benjamin Rutt
2001-12-15 23:34   ` Benjamin Rutt
2001-12-29  0:40     ` Lars Magne Ingebrigtsen
2001-12-31  7:06       ` Benjamin Rutt
2001-12-31  7:47         ` Paul Jarc
2002-01-19 19:12         ` Lars Magne Ingebrigtsen
2002-01-20  0:39           ` Benjamin Rutt
2002-01-20  0:52             ` Lars Magne Ingebrigtsen
2002-02-02  1:25       ` Benjamin Rutt [this message]
2002-02-02  6:38         ` ShengHuo ZHU

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=wc3665gn07y.fsf@gamma.cis.ohio-state.edu \
    --to=rutt+news@cis.ohio-state.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).