Windows の Emacs で Shell Script を実行できるようにします。
1行目が "#!"
で始まるいわゆる Shebang style のスクリプトが Windows の Emacs からでもそのまま実行できるようになります。勿論実行ビットは不要です。
RCS の ci / co 等がスクリプトになってしまい、 Windows の Emacs の VC からだと動かなくなってしまったのが再び動くようになります。
ついでに M-!
や eshell
などからも実行できるようにしてあります。
インストール
shebang-exec.el を load-path
の下に置き init.el で以下のようにします。
(when (eq system-type 'windows-nt)
(require 'shebang-exec))
org-mode の info file export 等
makeinfo も Perl script になってしまいましたが、それも簡潔にスクリプト名だけで実行できるので Linux 等で書いた設定がそのまま持ってこれるのではないのでしょうか(未テスト)。
(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 を起動するので sh
を sjis
に指定します。
サンプルとして以下が現在の自分の設定ですが、この場合 sh
だけでいいですが、詰めていないので余計なものもあります。
sh
は bash
等他のシェルにもマッチします。
ちなみに touch chmod は wdired 対策です。
(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 を起動しようとしてエラーになる。