MinaTech

innocent at every scene

gnupack 12 (Emacs)へのファイル関連付け

gnupack 12.03で関連付け問題は対応済み!ありがたい。
いつの間にかgnupack 12 (Emacs)のファイル関連付けが完璧になっている件
以下↓はgnupack 12.00時点の投稿。

gnupack 12が公開されたので早速試してみました。EmacsがCygwinバイナリに変更されたため、Windowsのファイルの関連付けで意外と苦労する羽目に・・・。
とりあえずうまくいった方法を書いておきます。もっとスマートな解決策がある気もするけど、Cygwin, Emacs, Windows間の文字コードの関連性がイマイチ分かっていなので。通りすがりの達人の人がいたら優しく教えてほしい。(^^;)


1. Cygwinへのrun.exeの導入
Cygwinのbash経由でemacsclientを起動しますが、これだとコマンドプロンプトが何個も開いてしまい邪魔。これを回避するために、Cygwinのrun.exe経由でCygwinなプログラムを呼び出せばいいらしい。gnupack 12にはrun.exeが導入されていないので、Cygwin本家のsetup-x86.exeかapt-cygを使って導入する。

# apt-cyg install run

2. 関連付け先のバッチファイルを用意
gnupackに同梱されているstartup_emacs.exeにファイルを関連付けてしまうと、ダブルクリックでEmacsを起動した場合、Emacs側で認識されるパスが /top/c:\User\xxxx\Desktop\hoge.txt というWindowsとCygwin形式がちゃんぽんになった形式になってしまう。これを回避するシェルスクリプトを別途用意し、バッチファイルからそのシェルスクリプトを呼び出す。このファイルはstartup_emacs.batとし、startup_emacs.exeがあるフォルダに格納する。以下コード。

@echo off

set GNUPACK_DIR=%~dp0
set CYGWIN_DIR=%GNUPACK_DIR%\app\cygwin\cygwin

REM 日本語ファイル名を%1でcygwinに渡そうとすると文字化けするので
REM 環境変数経由で渡す。
set TARGET_FILE=%1

REM Emacsが起動しているか調べる。
tasklist | find "emacs" > NUL
if ERRORLEVEL 1 (
    REM 日本語ファイル名の文字化け防止のため
    REM Emacsが起動していない場合は、emacsclientのALTERNATE_EDITORには頼らず
    REM gnupackのstartup_emacs.exeでEmacsを起動する。
    %GNUPACK_DIR%\startup_emacs.exe

    REM Emacsが起動するまで適当に待ち。
    timeout 3
)

REM シェルスクリプト側でemacsclientを起動する。
%CYGWIN_DIR%\bin\run.exe %CYGWIN_DIR%\bin\bash.exe /home/runemacsw.sh

Windowsでのテキストファイル等への関連付けは、startup_emacs.exeではなく、startup_emacs.batに対して行う。

3. emacsclientを呼び出すシェルスクリプトを用意する。
gnupackをインストールしたフォルダのhomeフォルダの下にrunemacsw.shを用意する。内容を以下の通り。

#!/bin/sh

# 場合によってはダブルコーテーションが含まれているので
# それを取り除く。
TARGET_FILE_TRIM=`echo $TARGET_FILE | sed -e 's/"//g'`

# Windows形式のパスをCygwin形式に変換
CYG_FULL_PATH=`cygpath -u $TARGET_FILE_TRIM`

# 一応、alternate editorを指定…
/app/cygwin/emacs/bin/emacsclient -n -a /app/cygwin/emacs/bin/runemacs.exe $CYG_FULL_PATH

これでWindows側で関連付けたファイルをダブルクリックすると、うまくEmacsが起動するはず。

コメントを残す

メールアドレスが公開されることはありません。

*