somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【Emacs】Windowsアプリに関連付けて実行

Emacsからディレクトリやテキスト、WordやExcelなどのWindowsアプリを実行すると、Emacs内で処理されます。

ディレクトリやテキストはEmacsで処理したほうが便利ですが、WordやExcelなどはバイナリの中身が表示されるだけで本来の用途できません。これを実現する方法があるようです。

ファイルを指定して実行する

まずは、コードです。

;; ファイルをウィンドウズの関連付けで開く
(defun my-file-open-by-windows (file)
  "ファイルをウィンドウズの関連付けで開く"
  (interactive "fOpen File: ")
  (message "Opening %s..." file)
  (cond *1
        )

        *2で実行しています。ほかの引数は、入出力とバッファへの表示なので今回は関係なさそうです。

call-processを使用して行われるコマンドは、以下と同じっぽいです。

cmd.exe "/c" "start" "" ファイルパス

convert-standard-filenameは引数をシステムにあったファイル名に変換します。特徴は以下のとおりです。

  • c:/⇒c:\
  • ~は変換されない
  • .で始まる隠しファイルは開ける

recentf-add-fileは、recentf.el関係のelispをインストールしていないと実行されないのでエラーが発生します。実際エラーになりましたが、本来の目的は実現できます。

dired(C-d)一覧から

Emacsにはdired用のmodeがあり、このモードに対するフック関数を登録します。

(add-hook 'dired-mode-hook 登録用関数)

関数はフック時だけに使用するので、無名関数(lamda())を使用します。。

# dired-mode-mapはdiredのキーマップ
(lambda ()
    (define-key dired-mode-map "好きなキー" 'my-file-open-by-windows))

参考

*1:not window-system) ; window-system⇒w32と表示される ) ((eq system-type 'windows-nt) ; XPではwindows-ntと表示される ; infile: 標準入力 ; destination: プロセスの出力先 ; display: ? (call-process "cmd.exe" nil 0 nil "/c" "start" "" (convert-standard-filename file

*2:eq system-type 'darwin) (call-process "open" nil 0 nil file) ) (t (call-process "xdg-open" nil 0 nil file) ) ) (recentf-add-file file) (message "Opening %s...done" file) )

関数を定義し、interactiveを使用してファイル名を引数にしています。

次にcondを使用して、環境ごとに振り分けているようです。windowsXPでは2つ目の条件に当てはまります。

call-processを使用して、cmd.exe(コマンドプロンプト)を引数あり("/c" "start" "" (convert-standard-filename file