[xyzzy:03988] den8-go-out
- Subject: [xyzzy:03988] den8-go-out
- From: Toy <s5087@xxxxxxxxxxxxxxxxxxxxx>
- X-mailer: Denshin 8 Go V321.2b5
- X-yzzy-version: 0.2.0.121.2
den8 + xyzzy 使いのみなさん,こんにちは。Toy です。
メールの本文の中から URL やメールアドレスを抽出して,ブラウ
ザを呼びだしたり,クリップボードにコピーしたりするものを作っ
てみました。しばらく使ってみて,自分の中ではまあまあ使えるネ
タかな?と思ったのでちょっと恥ずかしいですが公開してみます。
ちなみに,みなさんはこういうときどうしているのでしょうか?
いろいろ無駄な部分とかあるかもしんないですが,なにかありまし
たらぜひぜひ指摘してやってください。m(_ _)m
[いじれる変数]
初期化ファイルあたりに書いていただけるといいかも
● メールアドレス抽出
1. おれは電子メールアドレスもほしいんじゃー!
(setq *toy-den8-get-email-address* 1)
2. おれは電子メールアドレスもほしいんじゃー!
でも頭に mailto 付けてもらえる?
(setq *toy-den8-get-email-address* 2)
● クリップボード
kill-ring をいじっちゃいやーん
(setq *toy-den8-copy-to-clipboard* t)
(注意) mailto なしのメールアドレスについては,Go out ボタン
を押しても,自動的にクリップボードにコピーされます。
みなさんのお役にたてるといいな。
P.S. [xyzzy:02621] の stay-here 環境をお持ちの方は,
; for stay-here
(defun my-den8-go-out ()
(interactive)
(my-den8-stay-here
(toy-den8-go-out)))
ってな感じでどうぞ。
---------------------------------------------------->(ここから)
;;
;; toy-den8-go-out
;;
(require "den8view")
; 電子メールアドレスも吸い取る
; (0: いらん,1: ほしいっす,2: じゃ mailto の方向で…)
(defvar *toy-den8-get-email-address* 0)
; kill-ring をいじっちゃいやーん
(defvar *toy-den8-copy-to-clipboard* nil)
; 各プロトコルのヘッダ
(defvar *toy-den8-protocol-header*
"\\(http\\|https\\|ftp\\|news\\|nntp\\|wais\\|telnet\\|mailto\\|gopher\\|rlogin\\)")
; お出かけですか?
(defun toy-den8-go-out ()
(interactive)
(let ((lines nil) ; 読み込んだ行のリスト
(URL-list nil)) ; 読み込んだ URL のリスト
; URL リストの生成
(pop-to-buffer "*Den8 View*")
(save-excursion
(goto-char (point-min))
; ヘッダの部分はパス
(scan-buffer "--------" :tail t)
(save-restriction
(narrow-to-region (point) (point-max))
; URL の吸い出し
(while (not (eobp))
(unless (scan-buffer
(concat "\\("
*toy-den8-protocol-header*
"://[-a-zA-Z0-9_/~.#@%?&=;+(),'$!*:]*\\|[-a-zA-Z0-9_.]+@[-a-zA-Z0-9_.]+\\)")
:regexp t)
(return))
(goto-char (match-end 0))
(let ((picked (buffer-substring (match-beginning 0)(match-end 0))))
(if (string-match
(concat *toy-den8-protocol-header* ".*") picked)
(setq URL-list (cons picked URL-list))
(case *toy-den8-get-email-address*
(1 (setq URL-list (cons picked URL-list)))
(2 (setq URL-list (cons (concat "mailto:" picked) URL-list)))))))))
; URL リストの整理
(setq URL-list (sort (uniq URL-list) #'string-lessp))
; エラーメッセージ
(and (null URL-list)
(error "URL がなっしん"))
; ダイアログ作成
(multiple-value-bind (result data)
(dialog-box '(dialog 0 0 282 100
(:caption "Go out for a walk")
(:font 9 "MS Pゴシック")
(:control
(:listbox list nil #x50b10101 7 7 207 86)
(:button IDOK "Go out (&G)" #x50010001 223 7 52 16)
(:button IDCANCEL "Cancel" #x50010000 223 26 52 16)
(:button IDCLIP "Clip it! (&C)" #x50010000 223 45 52 16)))
(list (cons 'list URL-list)
(cons 'list 0))
'((list :column (1 30) :must-match t :enable (IDOK open))))
; ブラウザの呼び出し
(when result
(let ((URL (cdar data))) ; 選択された URL
(cond ((and (eq result 'IDOK)
(string-match
(concat *toy-den8-protocol-header* ".*") URL))
(shell-execute URL t))
((or (eq result 'IDCLIP)
(eq result 'IDOK))
(if *toy-den8-copy-to-clipboard*
(copy-to-clipboard URL)
(progn
(setq *clipboard-newer-than-kill-ring-p* nil
*kill-ring-newer-than-clipboard-p* t)
(ed::kill-new URL))))))))))
; リストから重複を取り除く
; Thanx to Tomoaki Ohno
(defun uniq (%list)
(cond ((null %list) nil)
(t (cons (car %list)
(uniq (remove (car %list) %list :test #'equal))))))
---------------------------------------------------->(ここまで)
----
Toy
E-mail : s5087@xxxxxxxxxxxxxxxxxxxxx