From: j8takagi Date: Tue, 29 Jan 2013 07:31:45 +0000 (+0900) Subject: Emacsから外部プログラムでファイルを開くためのマイナーモード X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b5f14dd1ae58a03a5d7c7aa22d2a8f779d01da3;p=exopen-mode.git Emacsから外部プログラムでファイルを開くためのマイナーモード --- 6b5f14dd1ae58a03a5d7c7aa22d2a8f779d01da3 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d5ab83 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +exopen.elc diff --git a/Makefile b/Makefile new file mode 100644 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 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))))