ShellScript
emacs-lisp
rcs

Windows の Emacs で Shell Script を実行

Windows の Emacs で Shell Script を実行できるようにします。

1行目が "#!" で始まるいわゆる Shebang style のスクリプトが Windows の Emacs からでもそのまま実行できるようになります。勿論実行ビットは不要です。

RCS の ci / co 等がスクリプトになってしまい、 Windows の Emacs の VC からだと動かなくなってしまったのが再び動くようになります。

ついでに M-!eshell などからも実行できるようにしてあります。

shebang-exec.el をダウンロード

インストール

shebang-exec.el を load-path の下に置き init.el で以下のようにします。

sample
(when (eq system-type 'windows-nt)
  (require 'shebang-exec))

org-mode の info file export 等

makeinfo も Perl script になってしまいましたが、それも簡潔にスクリプト名だけで実行できるので Linux 等で書いた設定がそのまま持ってこれるのではないのでしょうか(未テスト)。

sample
(add-hook 'org-mode-hook #'(lambda () (push 'texinfo org-export-backends)))
(setq org-texinfo-info-process '("makeinfo --force -o %b.info %f"))

補足や注意点等

Emacs の版

対象(テスト)は以下の Emacs です(GNU のサイトで配布する Windows 版)。
nadvice で実装してあるので advice が以前のものしか無いとロード中(eval中)にエラーになります。

(version)
"GNU Emacs 25.3.1 (i686-w64-mingw32)
of 2017-09-18"

RCS のログメッセージが化けるとき

プロセスの文字コードを sjis にします。
この場合 sh が RCS を起動するので shsjis に指定します。

サンプルとして以下が現在の自分の設定ですが、この場合 sh だけでいいですが、詰めていないので余計なものもあります。
shbash 等他のシェルにもマッチします。
ちなみに touch chmod は wdired 対策です。

sample
(modify-coding-system-alist
 'process "sh\\|rcs\\|diff\\|c[io]\\|rlog\\|cvs\\|touch\\|chmod" '(undecided . sjis-unix))

古いサイトでは UTF-8 にしたいとき UTF-8 にするとありますが、
ここで指定するのはコマンドに渡す引数のコーディングなので Windows の場合 sjis にします。
引数で渡されるファイルの中身のコードは変換されないので UTF-8 でも EUC-JP でも関係ありません。

実行形式の判別

file-executable-p をフックして shebang file を eshell 等に実行可能に見せかけていますが、それとは別口の executable-find には同期していません。
なので file-executable-p で真であっても executable-find では真になるとは限りません。現実的にそちらまでフックする意味もないのでそのままにしてあります。

利用ライブラリ

shebang file かどうかと実行パス検索は eshell のライブラリを使って検知しています(Emacs標準附属)。
はじめは自作ルーチンでしたが、まったく同じことをしている殆ど同一のコードがあったので、サイズを小さくするためにそちらを使っています。

ちなみに eshell-search-path の方で "." をくっつけているのは "./" にしないと、意味がないバグのような気がするのですが...

  • 例: cal を起動すると 設定ファイルの .cal を起動しようとしてエラーになる。