From: j8takagi Date: Wed, 30 Jan 2013 04:29:22 +0000 (+0900) Subject: いろいろ変更 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5593635b87ce81aa51c7bc3c503b94388a0b84d7;p=exopen-mode.git いろいろ変更 --- diff --git a/.gitignore b/.gitignore index 3d5ab83..c531d98 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -exopen.elc +*.elc diff --git a/Makefile b/Makefile index 43ddd67..657a0e5 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -TARGETS := exopen.el +TARGETS := exopen-mode.el INSTALLDIR := ~/.emacs.d/dev .PHONY: install @@ -13,5 +13,8 @@ $(addsuffix c,$(TARGETS)): install: $(TARGETS) $(addsuffix c,$(TARGETS)) $(INSTALL) $^ $(INSTALLDIR)/ +clean: + $(RM) *.elc + %.elc: %.el $(COMPILE.el) $< diff --git a/exopen-mode.el b/exopen-mode.el new file mode 100644 index 0000000..0e0ffec --- /dev/null +++ b/exopen-mode.el @@ -0,0 +1,154 @@ +;;; exopen-mode.el + +;; Copyright (C) 2013 j8takagi + +;; Author: j8takagi +;; Keywords: Emacs 外部プログラム + +;; This file is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This file is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +;; Boston, MA 02110-1301 USA + +;;; Commentary: + +;; Emacsからの外部プログラム呼び出しを支援するマイナーモードです。 + +;; ■動作環境 +;; Linux、Mac OS X、WindowsのいずれかのWindowシステム上 + +;; ■インストール方法 +;; 1. LOAD-PATHで指定されているディレクトリにこのファイルをコピーする +;; +;; 2. Emacsの設定ファイル(~/.emacs.d/init.el など)に以下の行を追加する +;; +;; (require 'exopen-mode) + +;; Windowシステム上でEmacsが動作している場合、exopen-mode は自動的に有効になります。 +;; +;; ■使い方 + +;; ■hook + +;; マイナーモードの定義 + (easy-mmode-define-minor-mode exopen-mode + "minor mode for opening fle in external program." + ;; 初期値 +(display-graphic-p) + ;; モード行の表示 + "" + ;; マイナーモード用キーマップの初期値 + '(("\C-x\C-\M-f" . exopen-find-file))) + +;; exopen-std-cmd: OSやWindowで設定された関連付けをもとに +;; ファイルを開くプログラムコマンド +(defvar exopen-std-cmd nil) + +;; Window別にexopen-std-cmdを設定する +(setq exopen-std-cmd + (cond + ((eq window-system 'x) "xdg-open") + ((eq window-system 'ns) "open") + ((eq window-system 'w32) "cmd.exe /c start"))) + +;; exopen-modeでの拡張子とプログラムの関連付けリスト +(defvar exopen-suffix-cmd) + +;;; ファイルを外部プログラムでオープン +;;; exopen-std-cmdで指定されたプログラムを使用 +(defun exopen-file (file) + "open file in external program" + (let ((process-connection-type nil) (cmd)) + (setq cmd (cdr(assoc (file-name-extension file 1) exopen-suffix-cmd))) + (if (null cmd) + (setq cmd exopen-std-cmd)) + (start-process "exopen" nil cmd file) + (message (concat "exopen: " cmd " " file " at " (format-time-string "%Y/%m/%d %H:%M:%S" (current-time)))))) + +;;; バッファで開いているファイルを外部プログラムでオープン +(defun exopen-buffer-file () + "open buffer file in 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 buffer file of other extension in external program" + (let (afile) + (if (not buffer-file-name) + (error "This buffer is not visiting a file")) + (setq afile (concat (file-name-sans-extension (buffer-file-name)) suffix)) + (if (file-exists-p afile) + (exopen-file afile) + (error (concat afile ": file not found"))))) + +;;; 指定したファイルと同名のPDFファイルを外部プログラムでオープン +(defun exopen-buffer-pdffile () + "open pdf file in external program" + (interactive) + (exopen-buffer-file-suffix ".pdf")) + +;;; バッファファイルと同名のDVIファイルを外部プログラムでオープン +(defun exopen-buffer-dvifile () + "open dvi file in external program" + (interactive) + (exopen-buffer-file-suffix ".dvi")) + +;;; バッファファイルと同名のHTMLファイルを外部プログラムでオープン +(defun exopen-buffer-htmlfile () + "open html file in external program" + (interactive) + (exopen-buffer-file-suffix ".html")) + +;;; find-or-bufferがnilの場合はプロンプトで指定したファイル、 +;;; nil以外の場合はバッファのファイルを外部プログラムでオープン +(defun exopen-find-file(&optional find-or-buffer) + "open buffer file or find-file in external program" + (interactive "P") + (let ((afile)) + (if (null find-or-buffer) + (progn + (setq afile (expand-file-name + (read-file-name "Find external open file: " buffer-file-name))) + (if afile + (exopen-file afile) + (error "file not found"))) + (exopen-buffer-file) + ))) + +;;; dired-modeからファイルやディレクトリーを開く +(require 'dired) +(add-hook 'dired-mode-hook + (function + (lambda () + ;; カーソル下のファイルやディレクトリーを外部プログラムで開く + (defun dired-exopen-file () + "Open file mentioned on this line in external program" + (interactive) + (exopen-file (dired-get-filename))) + + ;; 現在のディレクトリーを外部プログラムで開く + (defun dired-exopen-curdir () + "Open current directory in external program" + (interactive) + (exopen-file (expand-file-name dired-directory))) + + ;; キーバインド + (define-key dired-mode-map "r" 'dired-exopen-file) + (define-key dired-mode-map "\C-cr" 'dired-exopen-file) + (define-key dired-mode-map "\C-c." 'dired-exopen-curdir)))) + +(provide 'exopen-mode) +;;; exopen-mode.el ends here diff --git a/exopen.el b/exopen.el deleted file mode 100644 index d573160..0000000 --- a/exopen.el +++ /dev/null @@ -1,97 +0,0 @@ -;; マイナーモードの定義 - (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))))