Top / MLMemo

はじめに

ML で気付いた面白い,興味深い情報をメモするページ.

何でもかんでもごちゃまぜなので,私以外に役立たないかも.

メールアドレスに関連する部分は削除しています.

Emacs 本体関連については,EmacsChangelog を参照のこと.

Meadow-develop

平成17年3月14日(月)

New setup.exe

From: "M.Fujii"
Subject: Re: [MD:6382] new netinstall
Date: Sun, 13 Mar 2005 23:18:42 +0900

藤井です。

From: "M.Fujii"
Subject: Re: [MD:6382] new netinstall
Date: Sun, 13 Mar 2005 23:02:44 +0900 (JST)
> > 藤井さんは Meadow の commit 権限持ってるんですよね??
> > じゃあ netinstall repository もアクセスできるはずなので。
> > (URL は Meadow の隣りです)
> 
> ありがとうございます。遅ればせながら、ソースを commit しました。

commit したソースは一応動作するところまで作成しました。

インストール作業が単にファイルを展開するだけで良いパッケージならば、い
ままでどうりのパッケージと setup.ini が用意されていれば動作します。

あとの作業としては、こんなところだと思います。
  - 外見の調整
  - 日本語版
  - 機能改善・デバッグ

以下長文ですが、変更した。setup.exe についてまとめました。

<<< 実装の方針 >>>

なお、現状は従来の netinstall の仕組みをそのままキープするのではなく、
Cygwin setup の持つ機構をそのまま利用する方向で実装されています。

このあたりは、パッケージ作成者やユーザの皆さんとの議論を踏まえて改善し
ていければと思っています。

<<< ビルド方法 >>>

Cygwin を利用します。bash から以下のようにビルドできます。

$ ./configure -C --host=i686-pc-mingw32 --build=i686-pc-cygwin \
   'CC=gcc -mno-cygwin' 'CXX=g++ -mno-cygwin'
$ make

<<< ディレクトリ構成 >>>

ディレクトリ構成は以下のように、Meadow のバージョン番号を含まないツリー
となります。

Meadow
  + bin
  + bitmap
  + data
  + etc
  + info
  + leim
  + lisp
  + lock
  + packages        ------------- Netinstall用のdir
  |  + etc
  |  + info
  |  + lisp
  |    + default.el  ------------ auto-autoloads.elをロードする
  |  + pkginfo      
  |  |  + $PKGNAME   ------------ パッケージ名
  |  |  |  + MANIFEST  ---------- file list (?)
  |  |  |  + Makefile.pkg ------- makefile for package
  |  |  |  + _pkginfo     ------- オリジナル Elisp URL.
  |  |  |  + auto-autoloads.el -- パッケージ個々のdefault設定
  |  |    ...
  |  + postinstall  ------------- インストール後処理スクリプトを置く(New!!)
  |  + preremove  --------------- インストール前処理スクリプトを置く(New!!)
  |  + setup        ------------- Netinstall install DB and log
  + site-lisp

<<< パッケージの作り直しについて >>>

現状では、info 関連以外のパッケージはそのままでも利用可能です。
info 関連のパッケージは、スクリプト実行について従来の処理を実装してい
ないので、作り直しが必要です。

<<< レジストリの書き込み >>>

以下に書き込みます。

HKEY_LOCAL_MACHINE\Software\GNU\Meadow\netinstall3

したがって、setup.exe 本体の実行には Administrators (もしくは Power
Users) 権限を持つユーザで実行する必要があります。(従来どおり)

<<< スクリプト実行について >>>

以下のようにスクリプトをインストール後、アンインストール前にそれぞれ実
行することができます。バッチファイルが実行されるとき、カレントディレク
トリは Meadow のインストールディレクトリに設定されています。

[ インストール後のスクリプト実行について ]

パッケージに packages/postinstall/*.bat が存在すれば、インストール後
に実行されます。拡張子が bat であれば、ファイル名は任意です。
なお、実行されたスクリプトはファイル名末尾に .done が付加されます。

従来のインストール後処理は実装されていません。

[ アンインストール前のスクリプト実行について ]

アンインストール前に c:/Meadow/packages/preremove/<パッケージ名>.bat 
の呼び出しを試みます。インストール時に上記ファイルが展開されていればそ
れが実行されます。
なお、実行されたスクリプトはファイル名末尾に .done が付加されます。

従来のアンインストール前処理は実装されていません。

<<< MANIFEST について >>>

パッケージのアンインストール時にはパッケージ中の MANIFEST ファイルは参
照されません。setup.exe が自前で管理します。

<<< setup.ini について >>>

依存関係なども記述できます。
文法などについては以下を参照下さい。

http://sourceware.org/cygwin-apps/setup-head.ini.html

<<< 既知のバグ >>>

インストールの最後の画面で Meadow の install.exe を実行するかどうかを
選択できるようにしています。
現状この機能の実行時に問題があり、install.exe を -s オプション付きで起
動して、スタートメニューへのアイコン登録をしないようにさせています。

オプションなしで起動した場合には、以下のような問題が発生します。

この画面から Meadow の install.exe を実行すると、スタートメニューにア
イコンを登録するあたりで install.exe が固まります。setup.exe も 
install.exe の終了を待っているので同じく固まります。

とりあえず install.exe が動作している DOS 窓で CTRL-C で終了させる。
setup.exe 自体は一応終了するですが、しばらくすると Windows が不安定に
なり、再起動せざるを得なくなります。

以上です。

平成17年3月09日(水)

ImageMagick? のパスについて

パスに "c:\program files\imagemagick-6.0.1-q16"; のように""で囲うとエラーになる という話.

From: Eisaku YAMAGUCHI
Subject: Re: [MD:6321] Meadow2.10 netinstall pretest
Date: Tue, 08 Mar 2005 23:06:14 +0900

山口です.

Meadow-2.10とImageMagicの最新版の確認が取れていない状況でのレポートと
いうことで,少々気が引けております.

From: Shuichi KITAGUCHI
Subject: Re: [MD:6321] Meadow2.10 netinstall pretest
Date: Fri, 04 Mar 2005 00:28:42 +0900 (JST)
> 
> 北口です。
> 
> ImageMagickの対応はざっと終わったのですが、

SVNの昨年末のsource treeの状況で,Meadow-2.0/2.10-dev/2.20-devの環境で,
ImageMagicがうまく使えない状況が確認できておりました.

具体的には,ImageMagicをインストールした後の,環境変数PATHの設定で,

PATH> c:\program files\imagemagick-6.0.1-q16;...

を

PATH> "c:\program files\imagemagick-6.0.1-q16";...

と云う具合いに,double quoteで囲んでしまうと,ImageMagicが使われず,
BMP以外の画像データが取り扱えないMeadowになってしまうというものです.
Windowsで,spaceを含むPATHを設定する場合に,double quoteで囲うというの
は,良く使われるものだと認識しておりますが,ユーザが手動で環境変数PATHを
修正した場合には,確実にハマると思います.
# ハマって,気付いて脱出するまでに随分時間がかかりました...

ImageMagicをどのように呼び出しているのか等,確認を取ってからと思いつつ,
未だ確認できていないのが情けないところなのですが,対応可能であれば,
是非お願いしたく思います.

に対して

From: Shuichi KITAGUCHI
Subject: Re: [MD:6321] Meadow2.10 netinstall pretest
Date: Wed, 09 Mar 2005 00:55:45 +0900

北口です。

# へぇ、そーなんだ...

> 具体的には,ImageMagicをインストールした後の,環境変数PATHの設定で,
> 
> PATH> c:\program files\imagemagick-6.0.1-q16;...
> 
> を
> 
> PATH> "c:\program files\imagemagick-6.0.1-q16";...
> 
> と云う具合いに,double quoteで囲んでしまうと,ImageMagicが使われず,
> BMP以外の画像データが取り扱えないMeadowになってしまうというものです.
> Windowsで,spaceを含むPATHを設定する場合に,double quoteで囲うというの
> は,良く使われるものだと認識しておりますが,ユーザが手動で環境変数PATHを
> 修正した場合には,確実にハマると思います.
> # ハマって,気付いて脱出するまでに随分時間がかかりました...

このように設定すると、LoadLibrary()自体が失敗する(Windows自身が
エラーを返す)ようです。なので、どうしようもありません。

ちなみにコマンドプロンプトでは同じディレクトリにあるconvert.exeや
display.exeを実行できますが、たぶん.exeの検索時に特別なことをやって
いるんだと思います(前も似たようなのありましたし)。

# この辺、いつもはっきりしないのが気持ち悪いんですが、どこかに詳しい
# 仕様がありませんかねぇ?

最近はこんな感じ、

  d:\home\kit>set HOGE=a a a a
  
  d:\home\kit>set | grep HOGE
  HOGE=a a a a

みたいですから、囲まずにそのまま書いたらいいのかな、と思います。

ImageMagick?

うぅん,ImageMagick? ってバージョンアップも激しいし,厄介な存在なんだなぁ.

From: Eisaku YAMAGUCHI
Subject: Re: [MD:6381] Fw: [SA14466] Imagemagick Filename Handling Format String Vulnerability
Date: Wed, 09 Mar 2005 00:44:22 +0900

山口です.

From: Shuichi KITAGUCHI
Subject: Re: [MD:6381] Fw: [SA14466] Imagemagick Filename Handling Format String Vulnerability
Date: Wed, 09 Mar 2005 00:04:29 +0900 (JST)
> 
> 北口です。
> 
> とてもタイミングがいいのですが、
> 
> > 最近,またImageMagicにsecurity holeが見つかりましたので,ImageMagic-6.2.0-3
> > 以降にしておく必要があるようです.
> >   c.f. http://secunia.com/advisories/14466/
> 残念ながら6.2.0-3も駄目みたいです。
>   http://www.gentoo.org/security/en/glsa/glsa-200503-11.xml

これ,小生が例示したSecuniaのものと同じ脆弱性のようにも見えるのですが...

同様のものに,Ubuntu Linux 4.10のAdvisoriesがあります.
  c.f. http://secunia.com/advisories/14476/

これでは,6.2.0-5以降にしろと言ってる訳でして...

結局,distribution毎の対応対応時期にリリースされているImageMagicの
Revisionに応じて,変動しているように思います.
これはあくまで,Ubuntu Linuxと,Gentoo Linuxとの状況を観察してみた限り
の主観的な感想なのですけれど...

困ったことに,ImageMagicのWebを斜め読みしてみた限りでは,security hole
の記述が見当たりませんし,source archiveの更新されているファイルの中を
あたってみても,やはりsecurity holeの記述が明示されていないようなのです.

そのあたりを考慮して,先のメイルではUbuntu Linux, Gentoo Linux,
ImageMagicの三者のSecurity holeに関する情報を総合すると,6.2.0-3以降で
対応ということらしいと小生が読み取ったとお考え下さい.

> # 今使っているのは6.2.0-3なので、アウトです...

あら.-5とか-6じゃなかったのですね.;-)

> 悩ましいところです。

他の,distributionも近々に対応することでしょうし,この手のsecurity情報
を観察しつつ判断するのも一案と思います.

p.s.
ImageMagicのdiffを見て,「これぢゃどのrevisionでsecurity holeの対策が
されたのか確認するのも一苦労ぢゃん(三河弁)」と思っちゃいました.

平成17年3月07日(月)

ImageMagick?

次期バージョンは ImageMagick?-6.2.0-Q16 かな.

From: 小関 吉則 (KOSEKI Yoshinori)
Subject: Re: [MD:6293] Meadow-2.10 リリース提案
Date: Mon, 07 Mar 2005 00:41:45 +0900

<<途中省略>>

じゃあ、こうしましょう。
北口さんの使っている
ImageMagick-6.2.0-Q16-windows-dll.exe を
(今使ってるものか現時点の最新のもどちらにするかはおまかせし
ます)

http://www.meadowy.org/meadow/dists/snapshot/

に置いてください。(md5値も)
netinstall package もそれで作ります。
(Meadow-2.10 ではこの ImageMagick を使ってくださいと Web に書
く)

もし ImageMagick-6.2.0-Q16-windows-dll.exe なのに API が変る
なんてことがあればその時考えましょう。
(リリースするって時にソースの差分確認が必要かもしれませんが)

setup.exe

おぉ,ついにきたかぁ.期待してます.

From: "M.Fujii"
Subject: [MD:6378] Re: Meadow2.10 netinstall pretest
Date: Mon, 07 Mar 2005 20:25:32 +0900

藤井です。

# meadow-develop に振ります。

From: 小関 吉則 (KOSEKI Yoshinori) <kose@meadowy.org>
Subject: Re: Meadow2.10 netinstall pretest
Date: Wed, 23 Feb 2005 17:44:12 +0900
> でも改良するよりもまっさらに cygwin の setup.exe を移植し直
> した方が近道だと考えているのです。
> 
> 考えてはいるのですが全然手をつけてません。どなたか「できたよ!」
> と言ってくれないかしら。という状態なのです。すみません。

まだできていませんが、一応表明だけ。
# 表明しないとやらなくなってしまうおそれが多々あるので。

2.10 リリース直前になってそんなこと表明すんなとか言われそうですが、
Cygwin の setup.exe (2.457.2.2) をベースにあらたな netinstall の作成を
開始しました。

ベースにしたソース:
http://cygwin.com/setup/current/setup-2.457.2.2.tar.bz2

現状は以下のような感じです。

[現状できていること]
- パッケージのダウンロード
- パッケージのインストール
- パッケージのアンインストール

# もちろん cygwin の setup.exe と基本機能は変わらないので、パッケージ
# の依存関係なども記述可能です。

[現状まだできていないこと]
- 外見の調整
- インストール時/アンインストール時のスクリプト自動実行
- install.exe や ImageMagick のセットアップの自動実行

なお、インストール時/アンインストール時のスクリプト実行には、現状では 
Cygwin setup の postinstall/preremove などの機構がそのまま使えるはずで
す(未検証)。しかし、この機構を利用する場合には info 関係のパッケージは
作り直しが必要になるでしょう。

まだソース差分などは公開していませんが、近々どこかに置いておこうかと思
います。御意見などありましたら、反映したいと思いますので、リプライお願
いします。

# もし、私が知らないだけで、プロジェクトが着々と進行中だったらごめんな
# さい。

以上です。

Meadow-users-jp

平成17年3月08日(火)

ImageMagick?Meadow

From: 小関 吉則 (KOSEKI Yoshinori)
Subject: Re: Meadow2.10 netinstall pretest

>>>>> In [meadow-users-jp : No.6317] 
>>>>> “kose” = 小関 吉則 (KOSEKI Yoshinori) wrote:
kose> 近日中に Meadow-2.10 (ASAGAO) based on Emacs-21.4 をリリース
kose> します。リリース前のプリテストとして Netinstall パッケージも
kose> 準備中です。

Meadow-2.10dev-20050306-1-pkg 以降では ImageMagick-6.2.0-Q16 
が必要です。その新しい ImageMagick に対応した 
setup-2.10.7.exe をリリースしました。

今まで使っている ImageMagick を「プログラムの追加と削除」か
らアンインストールを行い、setup-2.10.7.exe を実行し、
ImageMagick もインストールしてください。

ImageMagick が古いままだと toolbar がきちんと表示されずに
 □ になります。

なお ImageMagick を自分で入れる場合にはバージョンを合わせて
ください。Netinstall でパッケージしたものは
http://www.meadowy.org/meadow/dists/snapshot/ImageMagick-6.2.0-Q16-windows-dll.exe
です。

fj.gnu.emacs

平成17年3月19日(土)

ポイント位置

Subject: buffer 内の位置を読み込む方法は
Newsgroups: fj.editor.emacs
Date: Thu, 08 Jul 2004 11:06:41 +0900

(point) は、現在のカーソルの位置を返します。これとは違って、
つぎのような関数がないでしょうか。

  その関数を実行すると、それ以降キーを監視して、

       * 矢印キー あるいは、C-n, C-p, C-b, C-f だったら、その矢
         印キーあういは C-n, C-p, C-b, C-f をタイプしたときの通
         常の動作にしたがってカーソル位置が変更される。
    
       * それ以外のキーを押したら、そのときのカーソル位置を返す。

ちょっと自分で書いてみたのですが、不十分です。

  (defun read-movement ()
    (let (p (pos nil))
      (setq p (read-char))
      (cond 
       ((eq p 14); C-n
        (next-line 1))
       ((eq p 16); C-p
        (next-line -1))
       ((eq p 6); C-f
        (forward-char 1))
       ((eq p 2); C-b
        (forward-char -1))
       (t
        (setq pos (point))))
      pos))

  (defun get-point ()
    (interactive)
    (let ((p nil))
      (while (not p)
        (setq p (read-movement)))
      (message "%d" p)))

get-point が、求める関数のつもりですが、つぎの点で不十分です。

  * 矢印キーには対応できていない。read-movement 関数で使用してい
    る read-char ではダメ。

  * ミニバッファに押したキーに関する情報がエコーされるのが嫌。

こういうときに使用する関数がすでにあれば教えてください。上に書い
たコードを直せばよいのなら、その方法を教えていただけないでしょうか。
From: Seiichi Namba
Subject: Re: buffer 内の位置を読み込む方法は
Newsgroups: fj.editor.emacs
Date: Thu, 08 Jul 2004 12:52:18 +0900

難波と申します。

現在、投稿記事がちゃんと出ていかないようなので、失礼ながらメールで。

 さん writes:

> get-point が、求める関数のつもりですが、つぎの点で不十分です。
> 
>   * 矢印キーには対応できていない。read-movement 関数で使用してい
>     る read-char ではダメ。
> 
>   * ミニバッファに押したキーに関する情報がエコーされるのが嫌。
> 
> こういうときに使用する関数がすでにあれば教えてください。上に書い
> たコードを直せばよいのなら、その方法を教えていただけないでしょうか。

カーソルキー(理論的にはマウスも)の対応は read-char のかわりに
read-event でご希望通りになると思いますが、

キーストロークのエコーに関しては、echo-keystrokes を一時 nil にする、
たとえば

(defun my-read-event ()
  (interactive)
  (let (echo-keystrokes)
    (setq junk
	  (read-char))))

とでもするんですかね。

一度 elisp のマニュアル(info)の read-char の前後を読んでおくと
いいでしょう。

なお、C-n, C-p などは、あまり変える人はいないと思うのでそんな感じで良
いと思いますが、互換性を高めるのであれば、これらにキーバインドされてい
るコマンドを調べて呼ぶようにするといいかもしれません。


普段は自分で書いた skk の互換品

 http://www.asahi-net.or.jp/~pi9s-nnb/lousy/

を使っていますが、この物件に入っている lkk-mclick.el には
キー操作を盗んで何かやる処理が書いてあります。上記の
「キーバインドを調べて…」の処理も入ってたと思います。

実際、lkk-mclick.el では、キーボードのダブルクリック(トリプル、クワド
ラプル…)を実現したかった([double-C-SPC] で save-buffer,
[double-M-SPC] で FEP のトグル、のように)訳ですが、もし参考になれば。


もし私の記事が出ていってなければ、この内容は発表してもらって構いません。
From: Katsumi Yamaoka
Subject: Re: buffer 内の位置を読み込む方法は
Newsgroups: fj.editor.emacs
Date: Thu, 08 Jul 2004 13:06:44 +0900

;; 難波さんの記事は配送されてきましたよ。:)

>>>>> In <uk6xf45hq.fsf@tonewin.kuciv.kyoto-u.ac.jp>
>>>>>	ms@wr.kuciv.kyoto-u.ac.jp wrote:

> (point) は、現在のカーソルの位置を返します。これとは違って、
> つぎのような関数がないでしょうか。

>   その関数を実行すると、それ以降キーを監視して、

>        * 矢印キー あるいは、C-n, C-p, C-b, C-f だったら、その矢
>          印キーあういは C-n, C-p, C-b, C-f をタイプしたときの通
>          常の動作にしたがってカーソル位置が変更される。

>        * それ以外のキーを押したら、そのときのカーソル位置を返す。

> ちょっと自分で書いてみたのですが、不十分です。

[...]

> get-point が、求める関数のつもりですが、つぎの点で不十分です。

>   * 矢印キーには対応できていない。read-movement 関数で使用してい
>     る read-char ではダメ。

read-event ではいかがでしょうか?  C-p => 16, ↑ => up

>   * ミニバッファに押したキーに関する情報がエコーされるのが嫌。

      (setq p (read-char))

の代わりに

      (setq p (let ((echo-keystrokes 0)) (read-event)))

のようにして キーを読むときだけ echo-keystrokes の値を 0 に束縛
するとか。

キーを読んで何かする関数の代わりに、Emacs 流のマイナーモードを書
いてみました。M-x get-point-mode RET で開始、q で終了です。

--8<---------------cut here---------------start------------->8---
(defvar get-point-mode-map nil)

(if get-point-mode-map
    nil
  (let ((map (make-sparse-keymap))
	(commands '(backward-char forward-char next-line previous-line))
	command keys key)
    (define-key map [t] (lambda nil
			  (interactive)
			  (message "%s" (point))))
    (define-key map "q" (lambda nil
			  (interactive)
			  (call-interactively 'get-point-mode)))
    (while commands
      (setq command (car commands)
	    commands (cdr commands)
	    keys (where-is-internal command global-map))
      (while keys
	(setq key (car keys)
	      keys (cdr keys))
	(define-key map key command)))
    (setq get-point-mode-map map)))

(define-minor-mode get-point-mode
  "Show point in the echo area."
  nil " Get-Point" get-point-mode-map)
--8<---------------cut here---------------end--------------->8---

define-minor-mode でもって get-point-mode というトグル・コマンド
(関数) を生成させます。そのマイナーモードが ON のとき、通常のキー
マップの代わりに get-point-mode-map が使われます。プログラム中の

(define-key map [t] コマンド)

における [t] というキーは、特にコマンドを割り振っていない全部の
キーを指します。

;; こうして眺めると、過去に先達の皆さんから教わったことの集大成
;; だなあ。:)
Subject: Re: buffer 内の位置を読み込む方法は
Newsgroups: fj.editor.emacs
Date: Fri, 09 Jul 2004 16:51:18 +0900

難波さん、山岡さん、ありがとうございました。

いろいろ御教示いただきましたが、まず、read-event と 
echo-keystrokes を使用して、

@begin{get-point} ----------------------------------------------
(defun get-point ()
  (interactive)
  (let ((p nil))
    (while (not p)
      (let (key (pos nil))
	(setq key (let ((echo-keystrokes 0)) (read-event)))
	(cond 
	 ((or (eq key 14) (eq key 'down)); C-n
	  (next-line 1))
	 ((or (eq key 16) (eq key 'up)); C-p
	  (next-line -1))
	 ((or (eq key 6) (eq key 'right)); C-f
	  (forward-char 1))
	 ((or (eq key 2) (eq key 'left)); C-b
	  (forward-char -1))
	 (t
	  (setq pos (point))))
	(setq p pos)))
    p))
@end{get-point} ------------------------------------------------

として、関数 get-point を使用すれば、buffer 内の位置を対話的に指
定できることを確認しました。

カーソル移動のキー定義を一般的に書く方法も御教示頂きましたので、
これから書き直していきたいと思っています。

fj

平成17年3月20日(日)

最終行の改行

From: kobayasi-remove-me-
Subject: 最終行の行末処理用の hook	関数
Date: Wed, 13 Feb 2002 14:31:03 +0900

Path: caraway.media.kyoto-u.ac.jp!news.media.kyoto-u.ac.jp!onodera-news!newsfeed.media.kyoto-u.ac.jp!news.ks-and-ks.ne.jp!omega.ks-and-ks.ne.jp!news.merry.xmath.ous.ac.jp!news.xmath.ous.ac.jp!ns04b!nd-osa01.ocn.ad.jp!nd-wst01.ocn.ad.jp!newssv.kcn.ne.jp!kobayasi Lines: 40 NNTP-Posting-Host: tra2c234.kcn.ne.jp Mime-Version: 1.0 X-Trace: newssv.kcn.ne.jp 1013578263 241 211.130.177.234 (13 Feb 2002 05:31:03 GMT) X-Complaints-To: usenet@kcn.ne.jp NNTP-Posting-Date: 13 Feb 2002 05:31:03 GMT

こばやしです。

*Emacs系では,最終行の行末に改行コードを入れないと,最終行が不正な行に
なるみたいで,保存のたびに改行したかどうか確かめるのが面倒なので,ファ
イルの保存時に自動的に改行コードを入れるような hook 関数を作ってみまし
た。

学生にファイルを作らせると,どうも最終行で改行せずにそこで止めてしまい,
コンパイルが通らない,最後の行が印刷されない,などのトラブルに見回れて
いました。それで「最終行を入力したあとは改行するように」「ファイルを保
存する時にファイルの最後で改行しておくように」と指示すると,「無駄に」
空行が出来たりして,「無駄な」プリントアウトが出来てしまいかねません。
#指示の仕方が悪い,というのもありますが...それはおいといて。

そこで,こんな hook 関数を作ってみたのでありました。

ファイルの保存時の hook 関数には何種類かあるみたいですが,これでいいの
でしょうか?

;;;
;;; ファイルの保存時に最終行の行末に改行を入れる
;;;
(defun fix-end-of-file ()
  (save-excursion
    (goto-char (point-max))
    (if (not (= (current-column) 0))
        (progn
          (setq old-val next-line-add-newlines)
          (setq next-line-add-newlines t)
          (next-line 1)
          (setq next-line-add-newlines old-val)))))

;;;
;;; 上記hook用関数の登録
;;;
(add-hook 'write-file-hooks 'fix-end-of-file)

--
こばやし
From: kashima
Subject: Re: 最終行の行末処理用の hook	関数
Date: Wed, 13 Feb 2002 15:01:50 +0900

> *Emacs系では,最終行の行末に改行コードを入れないと,最終行が不正な行に
> なるみたいで,保存のたびに改行したかどうか確かめるのが面倒なので,ファ
> イルの保存時に自動的に改行コードを入れるような hook 関数を作ってみまし
> た。

(setq require-final-newline t) ではどうですか?

elisp:Saving Buffers を参照のこと.

HTMLでの改行

From: Taka Fukuda
Subject: Japanese text in HTML
Newsgroups: fj.editor.xemacs
Date: Sun, 23 Sep 2001 06:55:02 +0900

    福田です。

    HTML の日本語のテキストに陽に改行を入れると、ブラウザで
    表示させた時にそれが半角の空白に置き換わりますが、これを
    何とかやめさせる方法は無いものでしょうか。

    改行を入れずに段落全部を一行にすれば良いのでしょうが(実
    際に多くの人がこうしているみたい)、そうすると、XEmacs 
    でソースを編集する時に、とてもみにくいですよね。ソースで
    は XEmacs の auto-fill を使い、ブラウザの表示では、余計
    な切れ目を無くしたい、という事です。

    アドバイスお待ちしてます。
    
-- 
--- つれづれなるままにそのひぐらし
--- 					             福田 孝康
--- http://www02.u-page.so-net.ne.jp/jb3/fukuda (9/22 updated)

に対して,

From: Daiki Ueno
Subject: Re: Japanese text in HTML
Newsgroups: fj.editor.xemacs
Date: Wed, 26 Sep 2001 17:23:40 +0900
Message-ID: <m2d74eicmr.fsf@deisui.bug.org>

>>>>> In <11378.1001359724@insigna.ie.u-ryukyu.ac.jp> 
>>>>>	 (Shinji KONO) wrote:

> このニュースグループの答えとしては、Emacs lisp で解くのが
> 正しそう...

編集中の見た目とは異なる形式で保存したいという、最初の要求とは少しずれて
しまいますが、PSGML を利用していて単に変換したいだけなら、以下のような感
じでしょうか。

;; カーソルを適当なところに置いて M-x html-strip-whitespace とします。
;; 多分、batch 版も簡単に書けそうですが。

(defun html-mark-whitespace-1 (limit)
  (while (re-search-forward "[^\\cs>]\\(\\s-+\\)[^\\ce<]" limit t)
    (if (and (char-in-category-p
	      (char-before (match-beginning 1)) ?j)
	     (char-in-category-p
	      (char-after (match-end 1)) ?j))
	(put-text-property
	 (match-beginning 1)(match-end 1)
	 'html-strip-whitespace t))))

(defun html-mark-whitespace (element)
  (while element
    (if (or (sgml-element-empty element)
	    (equal (downcase
		    (symbol-name (sgml-element-name element)))
		   "pre"))
	(goto-char (sgml-element-end element))
      (goto-char (sgml-element-stag-end element))
      (when (sgml-element-content element)
	(html-mark-whitespace-1
	 (sgml-element-start (sgml-element-content element)))
	(html-mark-whitespace (sgml-element-content element))))
    (html-mark-whitespace-1
     (if (sgml-element-next element)
	 (sgml-element-start (sgml-element-next element))
       (sgml-element-etag-start (sgml-element-parent element))))
    (setq element (sgml-element-next element))))

(defun html-strip-whitespace (point)
  (interactive "d")
  (let ((element (sgml-find-context-of point))
	next)
    (html-mark-whitespace
     (if (sgml-element-parent element)
	 element
       (sgml-element-content element)))
    (goto-char point)
    (while (setq next (next-single-property-change
		       (point) 'html-strip-whitespace))
      (if (get-text-property (point) 'html-strip-whitespace)
	  (delete-region (point) next)
	(goto-char next)))))
-- 
Daiki Ueno

当然,Emacs 以外のフィルタを用意するって方法もあります.

From: Seiichi Namba
Subject: Re: Japanese text in HTML
Newsgroups: fj.editor.xemacs
Date: Mon, 24 Sep 2001 14:39:07 +0900
Message-ID: <9omgts$ivl$1@sn.asahi-net.email.ne.jp>

Taka Fukuda <> さん writes:

> > 編集するソース(a)と、実際に使う HTML(b) を別にして、(a)->(b)
> > への filter を記述しています。結構やるべきことがあるので、
> > その方がいいみたい。
> 
>     成程。さしつかえなければ、そのフィルターを参考にさせて頂
>     けないでしょうか。

ご指摘の html の行末に関する問題は、

 ・emacs で編集中は好きな位置に改行を入れたい。
 ・最終形では1段落一行(DOS のテキストファイル的な)にしたい。

という問題と考えていいですか。

DOS の上で microemacs を使い始めたころ、DOS のテキストファイル形式と、
emacs の前提としている unix 的なテキストファイルの形式の不一致を
吸収するため、下記のようなフィルタを書きました。仕様は

 入力ストリーム中の n (n=1,2…) 個の連続する改行の数を n-1 に
 減らしたり (lf -)、n+1 に増やしたりする (lf +) する

というようなものです。
たとえば、lf - [file] で連続する改行の数を1つづつ減らします(
1個のものは0個に、2個のものは1個に、… 3、4個以上
の連続はループで適当に処理しているようです)。
lf + [file] では逆に増やします(ダブルスペースを作る時に使ってた)。
引数無しの場合は cat と同じのようです。

私は DOS ユーザにテキスト原稿を渡す時は、
好きな位置に改行を入れて書き(段落の終りは改行2個)、
最終形を作る時に lf - を通したものを渡しています。

ご要望は html なのでそれと合うのかどうか判りませんが。

どうも面妖なマクロを使ってテキトーに書いてあるので読み易くはないですな。

私は lf - の出力は別ファイルに落してますが、emacs の上で処理したい時は
C-x h C-u M-| lf - RET
とでもすれば良いかな…。

当時 DOS の上で書いたので C ですが、どなたか 上の仕様の perl 版
(ruby/bison 何でもいいですが)か何か書いていただけると幸いです。
コンパイルは cc -o lf -s lf.c みたいな感じでいいでしょう。

なお、逆に DOS ユーザからテキストを貰う時は

#!/usr/bin/sed -f
s/\([、。】]]\)/\1\
/g

のような事をしています。実際にはこれの elisp 版(query-replace-regexp)を
使ってますが。

/*
 * Name:        lf.c
 * Synopsys:    lf {+|-} [file]
 * Description: Increases (+) or decrease (-) 
 *              continuous occurance
 *              of newline (\n) in stream.
 * Warning:     Using queer preprocessor macro. See #define.
 * 2/16/90 S.Namba
 */
#include    <stdio.h>
#include    <string.h>
#define     std_err(s)  fputs((s),stderr)
const char  dst='\n';   /* extern var : target */

/*==================================*
 * Subroutines.  Filter main bodies
 *==================================*/
#define IfNotDst    if((c=getc(stm))==EOF)break;\
                                else if (c != dst)
/*
 * Increaser:
 * increases target occurance.
 */
void
incr(stm)
FILE    *stm;
{
    int c;
    while(1)
        IfNotDst        putchar(c);                 /* not target */
        else IfNotDst{  putchar(dst); putchar(dst); /* 1+1 */
                        putchar(c); }               
        else IfNotDst{ putchar(dst); putchar(dst);  /* 2+1 */
                    putchar(dst); putchar(c); }
        else    { putchar(dst); putchar(dst);       /* 3+1 */
                    putchar(dst); putchar(dst); }   /* 4th is by loop */
    putchar(dst);                                   /* last one */  
    putchar(dst);                                   /* one more */
}

/*
 * Decreaser:
 * decreases target occurance.
 */
void
decr(stm)
FILE    *stm;
{
    int c;
    while(1)
        IfNotDst putchar(c);        /* not target */
        else IfNotDst  putchar(c);      /* 1-1 */
        else IfNotDst{ putchar(dst);    /* 2-1 */
                            putchar(c);}    
        else    { putchar(dst); 
                            putchar(dst);}  /* 3-1 */
    putchar(dst);                                   /* last one */
}

/*
 * Concatenator:
 * just copies in-to-out
 * like 'cat' command.
 */
void
cat(stm)
FILE    *stm;
{
    int c;
    while ((c=getc(stm)) != EOF)
        putchar(c);
}

int
main(ac, av)
int ac;
char **av;
{ 
    char *progname = av[0];
    void (*func)();     /* function selector */

    FILE *fp;           /* stream pointer */
    int     i;

#if 0
    strlwr(progname);   /* unix style */
#endif
    /*
     * Args control.
     * No err out.
     */  
    func = cat;             /* for safty */
    for ( ;ac>1 && (av[1][0]=='+'||av[1][0]=='-'); ac--, av++)
        switch (av[1][0]) {
            case '+':       /* no line no. print */
                func=incr;
                break;
            case '-':       /* no line no. print */
                func=decr;
                break;
            default:
                break;
        }   
    /*
     * Handles multi file.
     */
    if (ac == 1)
        (*func)(stdin);
    else for (i = 1; i < ac; i++) {
        if ((fp=fopen(av[i],"r")) == NULL) {
            std_err(progname);
            std_err(": can't open ");
            std_err(av[1]);
            std_err("\n");
            exit(1);
        } else {
            (*func)(fp);
            fclose(fp);
        }
    }
    exit(0);
}

From:  (Inaba Hiroto)
Subject: Re: Japanese text in HTML
Newsgroups: fj.editor.xemacs, fj.comp.lang.perl
Date: Wed, 26 Sep 2001 00:25:39 +0900
Message-ID: <20010926002539inaba@st.rim.or.jp>

稲葉です。fj.comp.lang.perlを加えました。

fj.editor.xemacs の <9omgts$ivl$1@sn.asahi-net.email.ne.jp> の
記事において 2001年09月24日(月) 14時39分07秒頃、
Seiichi Namba <>さんは書きました。

>DOS の上で microemacs を使い始めたころ、DOS のテキストファイル形式と、
>emacs の前提としている unix 的なテキストファイルの形式の不一致を
>吸収するため、下記のようなフィルタを書きました。仕様は
>
> 入力ストリーム中の n (n=1,2…) 個の連続する改行の数を n-1 に
> 減らしたり (lf -)、n+1 に増やしたりする (lf +) する
>
>というようなものです。
	:
>当時 DOS の上で書いたので C ですが、どなたか 上の仕様の perl 版
>(ruby/bison 何でもいいですが)か何か書いていただけると幸いです。

細かい仕様までは追ってないのですが、以下のようなのでどうでしょう?
#動作チェックしてません。すみません。

#!/usr/local/bin/perl -w
my $mode = (defined($ARGV[0]) and $ARGV[0] =~ /^[+-]$/) ? shift : "";
if ($mode eq "-") {
  s/(.)\n/$1/, print while <>;
}elsif ($mode eq "+") {
  s/(.)$/$1\n/, print while <>;
} else {
  print while <>;
}

#もちろんrubyでもpythonでも同様に書けるでしょう。
#多分nawkでも。
---
稲葉 浩人

dired を色付け

2ちゃんねるでも見たような...

From: 金田 浩司
Subject: dired に色付けよ
Newsgroups: fj.editor.emacs
Date: Sat, 04 Sep 2004 13:38:21 +0900
Message-ID: <chbgru$2l06$1@news1.wakwak.com>

こんにちは
emacs-21 で dired 使っていて、ふと、ファイルを色分け表示
したいと思って調べてみたけど、見つけられなかったんで、
見よう見まねで書いてみました。
昔 mule 辺りの頃は hilit19 とかで結構簡単にできたと思うんですが。

elisp 久々なんで、もっとうまい書き方できるかもしれませんが、
つーか、ひょっとして簡単に実現する方法あるかもしんないけど、
一応投稿します。

;;;;; dired でファイル名を拡張子によって色分け表示
(defface my-source-file1-face	'((t (:foreground "NavyBlue"))) nil)
(defface my-source-file2-face	'((t (:foreground "brown4"))) nil)
(defface my-archive-file-face	'((t (:foreground "gray40" :weight bold))) nil)
(defface my-binary-file-face	'((t (:foreground "gray45"))) nil)
(defface my-image-file-face	'((t (:foreground "green4"))) nil)
(defface my-audio-file-face	'((t (:foreground "magenta3"))) nil)
(defface my-movie-file-face	'((t (:foreground "cyan4"))) nil)
(defvar my-source-file1-face	'my-source-file1-face)
(defvar my-source-file2-face	'my-source-file2-face)
(defvar my-archive-file-face	'my-archive-file-face)
(defvar my-binary-file-face	'my-binary-file-face)
(defvar my-image-file-face	'my-image-file-face)
(defvar my-audio-file-face	'my-audio-file-face)
(defvar my-movie-file-face	'my-movie-file-face)
(set-face-font 'my-archive-file-face (face-font 'bold))

(add-hook 'dired-mode-hook '(lambda ()
  (font-lock-add-keywords major-mode
    (list
     '("\\.\\(c\\|cpp\\|C\\)$"
       (".+" (dired-move-to-filename) nil (0 my-source-file1-face)))
     '("\\.\\(h\\|H\\|hpp\\|sh\\|el\\|pl\\)$"
       (".+" (dired-move-to-filename) nil (0 my-source-file2-face)))
     '("\\.\\(tar\\|gz\\|tgz\\|zip\\|bz2\\|tbz\\|rpm\\|lzh\\|Z\\)$"
       (".+" (dired-move-to-filename) nil (0 my-archive-file-face)))
     '("\\.\\(bin\\|out\\|o\\|core\\|a\\|so\\|dbg\\|elc\\|com\\|exe\\)$"
       (".+" (dired-move-to-filename) nil (0 my-binary-file-face)))
     '("\\.\\(jpe?g\\|png\\|gif\\|bmp\\|tiff?\\|p[pgb]m\\|xpm\\|xbm\\|xwd\\)$"
       (".+" (dired-move-to-filename) nil (0 my-image-file-face)))
     '("\\.\\(mp3\\|midi\\|wav\\|aw\\|au\\|aif\\)$"
       (".+" (dired-move-to-filename) nil (0 my-audio-file-face)))
     '("\\.\\(mpe?g\\|rm\\|avi\\|wmv\\|mov\\|qt\\)$"
       (".+" (dired-move-to-filename) nil (0 my-movie-file-face)))
     )
    t)))
  ; ※ `completion-ignored-extensions' のファイルは `font-lock-string-face'
  ;    で色付けされちゃう

Emacs 21.3.1 でテスト
____________________________________________
 金田 浩司 <> [検印廃止]

From: [375] 373 <sage>
Date: 05/02/21 23:35:24
(【叩かれて】Emacs Lisp道場【強くなれ】)


昔の「自慢の.emacsを貼り付けよう」スレのように活気付く事を祈って。
dired とか ibuffer で色を付けて、長いファイル名があってもそれなりに見やすくしてみる。

まずは dired:
(defun dired-font-lock-information-matcher (limit)
  "dired でまん中へんに色を付けてみる matcher。"
  (when (dired-move-to-filename nil limit)
    (let (end)
      (backward-char)
      (setq end (point-marker))
      (progn (beginning-of-line)
             (forward-sexp (if (looking-at dired-re-mark) 2 1))
             (forward-char))
      (store-match-data (list (point-marker) end)))
    (forward-line)))

  (font-lock-add-keywords
   'dired-mode
   '((dired-font-lock-information-matcher . font-lock-constant-face)))

From: [377] 373 <sage>
Date: 05/02/22 00:21:53
(【叩かれて】Emacs Lisp道場【強くなれ】)


dircolors 使うやつができたっぽい。

(require 'dircolors)
(font-lock-add-keywords
 'dired-mode
 (mapcar (lambda (x)
           (list
            (format "\\(%s\\)$"
                    (mapconcat (lambda (ext)
                                 (if (stringp ext)
                                     (format "\\.%s" ext)
                                   (format ".*%s.*" (cadr ext))))
                               (car x)
                               "\\|"))
            `(".+" (dired-move-to-filename) nil (0 ',(cadr x)))))
         dircolors-extension))

といったところ.


リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: Fri, 28 Dec 2007 17:21:44 JST (3559d)