Emacsから外部プログラムでファイルを開くためのマイナーモード
authorj8takagi <j8takagi@nifty.com>
Tue, 29 Jan 2013 07:31:45 +0000 (16:31 +0900)
committerj8takagi <j8takagi@nifty.com>
Tue, 29 Jan 2013 07:31:45 +0000 (16:31 +0900)
.gitignore [new file with mode: 0644]
Makefile [new file with mode: 0644]
exopen.el [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..3d5ab83
--- /dev/null
@@ -0,0 +1 @@
+exopen.elc
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..43ddd67
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,17 @@
+TARGETS := exopen.el
+INSTALLDIR := ~/.emacs.d/dev
+
+.PHONY: install
+
+EMACS := emacs
+COMPILE.el := $(EMACS) -batch -f batch-byte-compile
+INSTALL := install
+INSTALLFLAG :=
+
+$(addsuffix c,$(TARGETS)):
+
+install: $(TARGETS) $(addsuffix c,$(TARGETS))
+       $(INSTALL) $^ $(INSTALLDIR)/
+
+%.elc: %.el
+       $(COMPILE.el) $<
diff --git a/exopen.el b/exopen.el
new file mode 100644 (file)
index 0000000..d573160
--- /dev/null
+++ b/exopen.el
@@ -0,0 +1,97 @@
+;; マイナーモードの定義
+ (easy-mmode-define-minor-mode exopen-mode
+   "外部プログラムでファイルを開くためのマイナーモード。"
+ ;; 初期値
+ t
+ ;; on の時のモード行への表示
+ ""
+ ;; マイナーモード用キーマップの初期値
+ '(("\C-x\C-\M-f" . exopen-find-file)))
+
+;; exopen-cmd: OSまたはWindowsシステムで設定された
+;; 関連付けをもとにファイルを開くプログラムコマンド
+(defvar exopen-cmd nil)
+
+;; OS別にexopen-cmdを設定する
+(setq exopen-cmd
+      (cond
+       ((eq system-type 'gnu/linux) "xdg-open")
+       ((eq system-type 'darwin) "open")
+       ((eq system-type 'windows-nt) "cmd.exe /c start")))
+
+
+;;; ファイルを外部プログラムでオープン
+;;; exopen-cmdで指定されたプログラムを使用。
+;;; Mac OS Xではopen、Linux
+(defun exopen-file (file &optional program)
+  "Open file with external program"
+  (if (null program)
+      (setq program exopen-cmd))
+  (let ((process-connection-type nil))
+    (start-process "external open" nil program file)))
+
+;;; バッファで開いているファイルを外部プログラムでオープン
+(defun exopen-buffer-file ()
+  "Open the buffer file with external program"
+  (interactive)
+  (if buffer-file-name
+      (exopen-file buffer-file-name)
+    (error "This buffer is not visiting a file")))
+
+;;; 指定したファイルと同名で拡張子が異なるファイルを外部プログラムでオープン
+(defun exopen-buffer-file-suffix (suffix)
+  "Open the buffer file of other extension with external program"
+  (let (myfile)
+    (if (not buffer-file-name)
+        (error "This buffer is not visiting a file"))
+    (setq myfile (concat (file-name-sans-extension (buffer-file-name)) suffix))
+    (if (file-exists-p myfile)
+        (exopen-file myfile)
+      (error (concat myfile ": file not found")))))
+
+;;; 指定したファイルと同名のPDFファイルを外部プログラムでオープン
+(defun exopen-buffer-pdffile ()
+  "find .pdf file and open program associated by OS"
+  (interactive)
+  (exopen-buffer-file-suffix ".pdf"))
+
+;;; 指定したファイルと同名のDVIファイルを外部プログラムでオープン
+(defun exopen-buffer-dvifile ()
+  "find .dvi file and open program associated by OS"
+  (interactive)
+  (exopen-buffer-file-suffix ".dvi"))
+
+;;; バッファファイルと同名のHTMLファイルを外部プログラムでオープン
+(defun exopen-buffer-htmlfile ()
+  "find .html file and open program associated by OS"
+  (interactive)
+  (exopen-buffer-file-suffix ".html"))
+
+;;; 指定したファイルを外部プログラムでオープン
+(defun exopen-find-file()
+  "find-file and open with external program"
+  (interactive)
+  (let ((file))
+    (setq file (read-file-name "Find external open file: " buffer-file-name))
+    (if file
+        (exopen-file (expand-file-name file))
+      (error "file not found"))))
+
+;;; dired-modeからファイルやディレクトリーを開く
+(add-hook 'dired-mode-hook
+          (function
+           (lambda ()
+             ;; カーソル下のファイルやディレクトリーを関連付けられたプログラムで開く
+             (defun dired-exopen-file ()
+               "Open the current file with external program"
+               (interactive)
+               (exopen-file (dired-get-filename)))
+
+             ;; 現在のディレクトリーを関連付けられたプログラムで開く
+             (defun dired-cd-exopen ()
+               "Open current directory with external program"
+               (interactive)
+               (exopen-file (expand-file-name dired-directory)))
+
+            (define-key dired-mode-map (kbd "R") 'dired-exopen-file)
+            (define-key dired-mode-map (kbd "C-c .") 'dired-cd-exopen))))