おもてなしの空間 このページをアンテナに追加 RSSフィード





このページの情報が多少なりとお役に立てれば、相応の寄付を頂けますと励みになります。 ソフトウエアの改訂や機能追加などのご依頼があれば、寄付をはずんでいただけますと、その気になるかもしれません。(無保証です)
寄付のお願い
メッセージ

2006年07月09日(日)

amt2006-07-09

[][] emacsバッチモードで使う

● 問題

僕の環境では nkf での文字コード変換がイマイチの品質で、信頼できない。

emacs の set-buffer-file-coding-system 関数は確実に動作するので、鶏に牛刀の感もあるが、emacsバッチモードを使ってみることにする。

● とりあえず書いてみた。

当面の目的である、コード変換の処理は次のようになる。

for f in *.ixl; do emacs -batch \
-eval "(un-define-debian)" \
-eval '(set-language-environment "Japanese")' \
-visit $f \
-eval "(set-buffer-file-coding-system 'utf-8-unix)" \
-eval "(save-buffer-as-coding-system 'utf-8-unix t)" ; done ;

●無意味な繰替えしの回避

これで一応動くんだけれど、繰返しで毎回 emacs を起動して言語環境初期設定するのはバカみたい。

という訳で、無駄な動作を回避する版を作ってみる。

tmp=/tmp/${PPID}_${LINENO}.el ; \
echo "(un-define-debian)" > $tmp ; \
echo  '(set-language-environment "Japanese")' >> $tmp ; \
for f in *.ixl ; \
  do echo "(find-file\""${f}"\")" >> $tmp ; \
     echo "(set-buffer-file-coding-system 'utf-8-unix)"  >> $tmp ; \
     echo "(save-buffer-as-coding-system 'utf-8-unix)"  >> $tmp ; \
     echo "(kill-buffer (current-buffer))"  >> $tmp ; \
  done ; \
emacs -batch -l $tmp  

なんかちょっと不細工にも程がある、というコードだな。

こーいうのは書いていても全く楽しくない。

本当はヒアドキュメントを使いたかったんだけれど、対話的にヒアドキュメントを使うと EOF で入力待ちが終ってしまうので、ヒアドキュメントにダイナミックに追記していく、という使い方が出来ない。(※これは僕の誤解であった、小江戸らぐMLで聞いてきて、高橋さんにそれで無問題である)と教えてもらった。

●ヒアドキュメントを使ってみた

シェル関数でヒアドキュメントを使ったものを書いてみた

utf8-via-emacs () {
tmp=/tmp/${PPID}_${LINENO}.el
cat > $tmp <<- EOF 
	(un-define-debian)
	(set-language-environment "Japanese")
EOF
for f in $*
do cat >> $tmp <<- EOF-Delta
	(find-file  "${f}")
	(set-buffer-file-coding-system 'utf-8-unix)
	(save-buffer-as-coding-system 'utf-8-unix 64)
	(kill-buffer (current-buffer))
EOF-Delta
done
emacs -batch -l $tmp 
rm $tmp ; }

●Gnuclient を使ってみた

ここまで作ってきたもので、何が具合が悪いか、というと、emacs を立ち上げるのに時間が掛るのが困る。どうせ emacs なんて常に動かしているんだから、動いている emacs プロセスを使ってやればいいじゃん、とふと思いつき、gnuclient の man を眺めると、ちゃんと -batch オプションあるじゃん

という訳で、emacs が動いている時は、gnuclient を使うようにした版も書いてみた。

↑にくらべるとリーダビリティは大部悪いんだが、劇的に早く動くようになった、やっと満足。

utf8-via-emacs () {
tmp=/tmp/${PPID}_${LINENO}.el

if [ `ps --no-headers -C emacs | wc -l` -gt 0 ] 
    then # emacs が動いていたら gnuclient を使う
    EMACS=gnuclient
    # カレントバッファの退避処理 括弧を閉じるのに注意
    cat > $tmp << EOF 
(save-current-buffer
EOF
else
    EMACS=emacs # そーでなかったら、emacs をバッチモードで使う
# この場合日本語初期設定をしないといけない
    cat > $tmp << EOF 
; 日本語初期設定
(un-define-debian)
(set-language-environment "Japanese")
EOF
fi

for f in $*
  do ff=`pwd`/$f
  cat >> $tmp << EOF-Delta
(let ((cb (find-file "${ff}")))
 (set-buffer-file-coding-system 'utf-8-unix)
 (save-buffer-as-coding-system 'utf-8-unix 64)
 (kill-buffer cb)) 
EOF-Delta
done 
# gnuclient を使う場合、save-current-buffer マクロの括弧を閉じる
if [ gnuclient = $EMACS ] ; then cat >> $tmp << EOF-end 
)
EOF-end
fi

$EMACS -batch -l $tmp 
rm $tmp ; }

● 感想

非常に簡単なものではあるが、ダイナミックにコードを生成するプログラムになってしまった。

シェルでこういうことをするのは始めてだけれど、ヒアドキュメントを使えばとってもきれいに書けることが判った。ちょっと感動。

ところで、emacsバッチモードとインタラクティブな動作とでは微妙に動きが違う。

例えば、上の例では、save-buffer でセーブしたら、コーディングシステムはもとのままで変らない。

シェルスクリプト覚書

僕は対話モードシェルの動作を誤解していて、入力プロンプトが出現する度に、あたらしいサブプロセスが生成され、個々のプロンプトは兄弟なプロセスである、と誤解していた。

だって、↓のように、一時的にシェル変数を設定できるからね

$ LANG=C man

でもそれは、man を実行する時に、サブプロセスが生成されるからであって、プロンプト自体は、(特にshell や仮想ターミナルを明示的に起動しないかぎり、コンソールが起動されたときに起動されるシェルが一貫して出している筈である。

だからつまり、前のプロンプトで設定したシェル変数は、そのシェルの後のプロンプトから入力するコマンドで参照したり書換えたりすることが出来る。

こうやって書くとあたり前のことみたいだが、それを僕は誤解していた。

で、何がいいたいかというと、ヒアドキュメントのデリミッタの後の改行をエスケープすることは出来ないんだけれど、対話モードでヒアドキュメントを使っている時に、そこで改行しちゃって、新しい入力プロンプトから始めても実行上何の不都合もない、ということ。

つまりまとめると↓のようになる。


[Q] 対話的にシェルを使っていると、ヒアドキュメント の後の改行をエスケープ
   できません

[A] そこはエスケープしなくっても無問題です。
   プロンプトから引き続き普通にコマンドを入力して続ければいいでしょう。
   何が問題ですか?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/amt/20060709/BatchMode

[http://d.hatena.ne.jp/amt/mobile/:barcode]
■--このページについて--■

○日記開設以来のページビュー::4156803
○書いた人::逸見研一(いつみけんいち)
○mail::itsumi @ gmail.com
↑の@を半角に変更

○Skype(Voicemail)::itsumiken
いつみのカレンダー
いつみの進行管理New!
いつみの掲示板New!
ラジオ英会話上級公開ノート近日再編成
このページへリンクしているページ
このページを参照しているページ

アクセスログ

■--今読んでるモノ--■


※過去に読んだもののメモは こちら

■--今書いているモノ--■

external-filter-el20061224 着手
※過去に書き散らかしたものは こちら

■--謹製ソフトウエア--■

cmd2ftp20070118 公開
mininova_get20070102 改訂
del2bk20061223 改訂
Up2PB20061223 改訂
conv-el20061006 改訂!
pirate_get20060912 公開!
hatenahelper-mode.el

■--ほかのページ--■

おもてなしの空間 為替編20080428 発進!
アフィリエイト研究20061018 発進!
借りやすい消費者金融New!
中国株投資の証券会社選びNew!
おいでやすWiki
いつみの思いつき
いつみの予定
いつみのオープンノート
使ってみた Firefox extension
はてなフォトライフ(シンボリックな画像の倉庫)
del.icio.us
flickr
Orkut
Mixi
Facebook(実名で検索するとヒットします)New!

<< 2006/07 >>
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
最新コメント
■ 過去記事一覧 ■

■--お役立ち情報--■

html-helper-mode キーバインド
hatena-mode のキーバインド
はてな記法一覧
はてなダイアリー利用可能 html タグ

↓は、検索結果に、検索語に関連する広告が付いてくる検索窓です、面白いですよ

Google

. FLASH フラッシュ制作 携帯フラッシュ フラッシュゲーム