3 ;; Copyright (C) 2013 j8takagi
5 ;; Author: j8takagi <j8takagi@nifty.com>
6 ;; Keywords: Emacs 外部プログラム
8 ;; This file is free software; you can redistribute it and/or modify
9 ;; it under the terms of the GNU General Public License as published by
10 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; This file is distributed in the hope that it will be useful,
14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ;; GNU General Public License for more details.
18 ;; You should have received a copy of the GNU General Public License
19 ;; along with GNU Emacs; see the file COPYING. If not, write to the
20 ;; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
21 ;; Boston, MA 02110-1301 USA
25 ;; Emacsからの外部プログラム呼び出しを支援するマイナーモードです。
28 ;; Linux、Mac OS X、WindowsのいずれかのWindowシステム上
31 ;; 1. LOAD-PATHで指定されているディレクトリにこのファイルをコピーする
33 ;; 2. Emacsの設定ファイル(~/.emacs.d/init.el など)に以下の行を追加する
35 ;; (require 'exopen-mode)
37 ;; Windowシステム上でEmacsが動作している場合、exopen-mode は自動的に有効になります。
44 (easy-mmode-define-minor-mode exopen-mode
45 "minor mode for opening fle in external program."
51 '(("\C-x\C-\M-f" . exopen-find-file)))
53 ;; exopen-std-cmd: OSやWindowで設定された関連付けをもとに
55 (defvar exopen-std-cmd nil)
57 ;; Window別にexopen-std-cmdを設定する
60 ((eq window-system 'x) "xdg-open")
61 ((eq window-system 'ns) "open")
62 ((eq window-system 'w32) "cmd.exe /c start")))
64 ;; exopen-modeでの拡張子とプログラムの関連付けリスト
65 (defvar exopen-suffix-cmd nil)
68 ;;; exopen-std-cmdで指定されたプログラムを使用
69 (defun exopen-file (file)
70 "open file in external program"
71 (let ((process-connection-type nil) (cmd))
73 (setq cmd (cdr(assoc (file-name-extension file 1) exopen-suffix-cmd))))
75 (setq cmd exopen-std-cmd))
76 (start-process "exopen" nil cmd file)
77 (message (concat "exopen: " cmd " " file " at " (format-time-string "%Y/%m/%d %H:%M:%S" (current-time))))))
79 ;;; バッファで開いているファイルを外部プログラムでオープン
80 (defun exopen-buffer-file ()
81 "open buffer file in external program"
84 (exopen-file buffer-file-name)
85 (error "This buffer is not visiting a file")))
87 ;;; 指定したファイルと同名で拡張子が異なるファイルを外部プログラムでオープン
88 (defun exopen-buffer-file-suffix (suffix)
89 "open buffer file of other extension in external program"
91 (if (not buffer-file-name)
92 (error "This buffer is not visiting a file"))
93 (setq afile (concat (file-name-sans-extension (buffer-file-name)) suffix))
94 (if (file-exists-p afile)
96 (error (concat afile ": file not found")))))
98 ;;; 指定したファイルと同名のPDFファイルを外部プログラムでオープン
99 (defun exopen-buffer-pdffile ()
100 "open pdf file in external program"
102 (exopen-buffer-file-suffix ".pdf"))
104 ;;; バッファファイルと同名のDVIファイルを外部プログラムでオープン
105 (defun exopen-buffer-dvifile ()
106 "open dvi file in external program"
108 (exopen-buffer-file-suffix ".dvi"))
110 ;;; バッファファイルと同名のHTMLファイルを外部プログラムでオープン
111 (defun exopen-buffer-htmlfile ()
112 "open html file in external program"
114 (exopen-buffer-file-suffix ".html"))
116 ;;; find-or-bufferがnilの場合はプロンプトで指定したファイル、
117 ;;; nil以外の場合はバッファのファイルを外部プログラムでオープン
118 (defun exopen-find-file(&optional find-or-buffer)
119 "open buffer file or find-file in external program"
122 (if (null find-or-buffer)
124 (setq afile (expand-file-name
125 (read-file-name "Find external open file: " buffer-file-name)))
128 (error "file not found")))
132 ;;; dired-modeからファイルやディレクトリーを開く
134 (add-hook 'dired-mode-hook
137 ;; カーソル下のファイルやディレクトリーを外部プログラムで開く
138 (defun dired-exopen-file ()
139 "Open file mentioned on this line in external program"
141 (exopen-file (dired-get-filename)))
143 ;; 現在のディレクトリーを外部プログラムで開く
144 (defun dired-exopen-curdir ()
145 "Open current directory in external program"
147 (exopen-file (expand-file-name dired-directory)))
150 (define-key dired-mode-map "r" 'dired-exopen-file)
151 (define-key dired-mode-map "\C-cr" 'dired-exopen-file)
152 (define-key dired-mode-map "\C-c." 'dired-exopen-curdir))))
154 (provide 'exopen-mode)
155 ;;; exopen-mode.el ends here