Emacsから外部プログラムでファイルを開くためのマイナーモード
[exopen-mode.git] / exopen.el
1 ;; マイナーモードの定義
2  (easy-mmode-define-minor-mode exopen-mode
3    "外部プログラムでファイルを開くためのマイナーモード。"
4  ;; 初期値
5  t
6  ;; on の時のモード行への表示
7  ""
8  ;; マイナーモード用キーマップの初期値
9  '(("\C-x\C-\M-f" . exopen-find-file)))
10
11 ;; exopen-cmd: OSまたはWindowsシステムで設定された
12 ;; 関連付けをもとにファイルを開くプログラムコマンド
13 (defvar exopen-cmd nil)
14
15 ;; OS別にexopen-cmdを設定する
16 (setq exopen-cmd
17       (cond
18        ((eq system-type 'gnu/linux) "xdg-open")
19        ((eq system-type 'darwin) "open")
20        ((eq system-type 'windows-nt) "cmd.exe /c start")))
21
22
23 ;;; ファイルを外部プログラムでオープン
24 ;;; exopen-cmdで指定されたプログラムを使用。
25 ;;; Mac OS Xではopen、Linux
26 (defun exopen-file (file &optional program)
27   "Open file with external program"
28   (if (null program)
29       (setq program exopen-cmd))
30   (let ((process-connection-type nil))
31     (start-process "external open" nil program file)))
32
33 ;;; バッファで開いているファイルを外部プログラムでオープン
34 (defun exopen-buffer-file ()
35   "Open the buffer file with external program"
36   (interactive)
37   (if buffer-file-name
38       (exopen-file buffer-file-name)
39     (error "This buffer is not visiting a file")))
40
41 ;;; 指定したファイルと同名で拡張子が異なるファイルを外部プログラムでオープン
42 (defun exopen-buffer-file-suffix (suffix)
43   "Open the buffer file of other extension with external program"
44   (let (myfile)
45     (if (not buffer-file-name)
46         (error "This buffer is not visiting a file"))
47     (setq myfile (concat (file-name-sans-extension (buffer-file-name)) suffix))
48     (if (file-exists-p myfile)
49         (exopen-file myfile)
50       (error (concat myfile ": file not found")))))
51
52 ;;; 指定したファイルと同名のPDFファイルを外部プログラムでオープン
53 (defun exopen-buffer-pdffile ()
54   "find .pdf file and open program associated by OS"
55   (interactive)
56   (exopen-buffer-file-suffix ".pdf"))
57
58 ;;; 指定したファイルと同名のDVIファイルを外部プログラムでオープン
59 (defun exopen-buffer-dvifile ()
60   "find .dvi file and open program associated by OS"
61   (interactive)
62   (exopen-buffer-file-suffix ".dvi"))
63
64 ;;; バッファファイルと同名のHTMLファイルを外部プログラムでオープン
65 (defun exopen-buffer-htmlfile ()
66   "find .html file and open program associated by OS"
67   (interactive)
68   (exopen-buffer-file-suffix ".html"))
69
70 ;;; 指定したファイルを外部プログラムでオープン
71 (defun exopen-find-file()
72   "find-file and open with external program"
73   (interactive)
74   (let ((file))
75     (setq file (read-file-name "Find external open file: " buffer-file-name))
76     (if file
77         (exopen-file (expand-file-name file))
78       (error "file not found"))))
79
80 ;;; dired-modeからファイルやディレクトリーを開く
81 (add-hook 'dired-mode-hook
82           (function
83            (lambda ()
84              ;; カーソル下のファイルやディレクトリーを関連付けられたプログラムで開く
85              (defun dired-exopen-file ()
86                "Open the current file with external program"
87                (interactive)
88                (exopen-file (dired-get-filename)))
89
90              ;; 現在のディレクトリーを関連付けられたプログラムで開く
91              (defun dired-cd-exopen ()
92                "Open current directory with external program"
93                (interactive)
94                (exopen-file (expand-file-name dired-directory)))
95
96             (define-key dired-mode-map (kbd "R") 'dired-exopen-file)
97             (define-key dired-mode-map (kbd "C-c .") 'dired-cd-exopen))))