[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
excel-file-mode
- From: TSUCHIYA Masatoshi <tsuchiya@xxxxxxxxxx>
- Date: Fri, 10 Jun 2005 12:30:08 +0900
- X-ml-name: emacs-w3m
- X-mail-count: 08174
仕事で,Microsoft Excel のファイルを大量に閲覧しなければいけない状況に
追い込まれたものですから,ほとんど auto-image-file-mode() 関連コードの
パクリなんですが.excel-file-mode なんてものを作ってみました.末尾のコー
ドを評価して,C-x C-f foo.xls RET としてみてください.
最初は,octet-file-mode にしようと思っていたのですが,
octet-suffix-type-alist に登録されている拡張子を全て handler で受け付
けてしまうと,auto-compression-mode とも衝突するし,*.html なファイル
を開けなくなってしまうし,と副作用が巨大すぎたので,Excel ファイルだけ
に特化させました.けれど,もっと一般的な方向に持っていけると面白いかな
あと思いますが,どうでしょうか.
--
土屋 雅稔 ( TSUCHIYA Masatoshi )
(defun excel-insert-file (file &rest visit beg end replace)
(prog1 (let ((coding-system-for-read 'binary))
(excel-file-call-underlying #'insert-file-contents
'insert-file-contents
file visit beg end replace))
(require 'w3m)
(require 'octet)
(let ((w3m-fill-column -1))
(octet-buffer))))
(defun excel-file-handler (operation &rest args)
"Filename handler for inserting Excel files.
OPERATION is the operation to perform, on ARGS.
See `file-name-handler-alist' for details."
(if (and (eq operation 'insert-file-contents)
excel-file-mode)
(apply #'excel-insert-file args)
;; We don't handle OPERATION, use another handler or the default
(apply #'excel-file-call-underlying operation operation args)))
(defun excel-file-call-underlying (function operation &rest args)
"Call FUNCTION with `excel-file-handler' and OPERATION inhibited.
Optional argument ARGS are the arguments to call FUNCTION with."
(let ((inhibit-file-name-handlers
(cons 'excel-file-handler
(and (eq inhibit-file-name-operation operation)
inhibit-file-name-handlers)))
(inhibit-file-name-operation operation))
(apply function args)))
(define-minor-mode excel-file-mode
"Toggle visiting of Excel files.
With prefix argument ARG, turn on if positive, otherwise off.
Returns non-nil if the new state is enabled."
:global t
:group 'octet
;; Remove existing handler
(let ((existing-entry
(rassq 'excel-file-handler file-name-handler-alist)))
(when existing-entry
(setq file-name-handler-alist
(delq existing-entry file-name-handler-alist))))
;; Add new handler, if enabled
(when excel-file-mode
(push (cons "\\.\\(xls\\|XLS\\)\\'" 'excel-file-handler)
file-name-handler-alist)))
(excel-file-mode 1)