Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Emacsからスクリプトを使って印刷をする。

130 views
Skip to first unread message

Yoshitaka Ikeda

unread,
Jun 22, 2006, 7:20:09 PM6/22/06
to
なんか、質問しようとしていろいろと設定しているうちにできちゃったので
とりあえずテクニカルな文書を残しておこう。

プリンタがつながっていないUNIXサーバにいつも遠隔からsshで
接続しているわけですが、プリンタ側でpdf化してメールで送るような
スクリプトを書いて印刷しようとしています。

テキストファイルをpdf化して送るスクリプトを書いて、
~/print-via-email.shとして700でおいてあります。

~/print-via-email.shの中身は、

#!/bin/sh
/usr/local/bin/nkf | /usr/local/bin/a2ps-j -p | /usr/local/bin/ps2pdf - - | \
/usr/bin/uuencode "printeroutput.pdf" | \
/usr/bin/mail -s "Printing from unix server" m...@mail.address

って感じです。単体テストではちゃんとPDFを生成して自分に
メールで送ってくるのを確認します。

さて、.emacsで
(setq lpr-command "/home/username/print_via_mail.sh")
ってやると、
M-x print-bufferで、テキストからPDFファイルを使ってメールで
送ってきてくれます。

---
ここから、質問。

これで印刷するとa2psでつく枠の部分でファイル名が「stdin」になります。
これをemacsで編集中のファイル名にしたい。
できれば送ってくるファイル名を "ファイル名.pdf"にしたいと思ってます。
どうすればいいものか、どなたか知恵をください。

--
--
I LOVE SNOOPY! でつ
Yoshitaka Ikeda mailto:ik...@4bn.ne.jp
My Honeypot: ho...@4bn.ne.jp <-don't send this address

OTA Takashi

unread,
Jun 22, 2006, 9:31:27 PM6/22/06
to
おおたです。
ikedaさんが2006年06月23日(金) 08時20分09秒に、
fj.editor.emacsに投稿した<861wtgn...@bsd2.4bn.ne.jp>の記事から

> さて、.emacsで
> (setq lpr-command "/home/username/print_via_mail.sh")
> ってやると、
> M-x print-bufferで、テキストからPDFファイルを使ってメールで
> 送ってきてくれます。

> これで印刷するとa2psでつく枠の部分でファイル名が「stdin」になります。


> これをemacsで編集中のファイル名にしたい。
> できれば送ってくるファイル名を "ファイル名.pdf"にしたいと思ってます。
> どうすればいいものか、どなたか知恵をください。

編集中のファイルの名前をとってきて,

(setq lpr-command (concat ("/home/username/print_via_mail.sh") (FILE)))

みたいな感じにして,print_via_mail.sh の方では

> #!/bin/sh
> /usr/local/bin/nkf | /usr/local/bin/a2ps-j -p

% a2ps --help
syntax: a2ps [switches] [files]
switches are:
-l @ label string
(略)

とあるので,こっちでは a2ps に -l でラベルをその FILE を
渡すようにすればいいんじゃないでしょうか.

# 昔々,某サイトでは label にログイン名を入れる an2ps というコマンドが
# あったそうじゃ…….

----- ニュースはみんなのために /|\ メールは個人のために ---- 太田尚志 -----
http://web.sfc.keio.ac.jp/~takot/ Msngr(NOT for mail): supertakot@hotmail.コム

Yoshitaka Ikeda

unread,
Jun 23, 2006, 1:07:35 AM6/23/06
to
OTA Takashi <takot...@sfc.keio.ac.jp> writes:

> おおたです。


>
> 編集中のファイルの名前をとってきて,
>
> (setq lpr-command (concat ("/home/username/print_via_mail.sh") (FILE)))
>
> みたいな感じにして,print_via_mail.sh の方では

ちょっと、引数調べてみると、
$1 : -J
$2 : ファイル名+Emacs Buffer
というのが勝手に負荷されている様です。

> > #!/bin/sh
> > /usr/local/bin/nkf | /usr/local/bin/a2ps-j -p
>
> % a2ps --help
> syntax: a2ps [switches] [files]
> switches are:
> -l @ label string
> (略)
>
> とあるので,こっちでは a2ps に -l でラベルをその FILE を
> 渡すようにすればいいんじゃないでしょうか.

/usr/local/bin/a2ps-j -l "$2"
って感じで入れてみたんですが、 Emacs Bufferの文字が入っちゃってちょっと
いや~んな感じ。
かといって、
/usr/local/bin/a2ps-j -l $2
とすると生成されません。たぶん
/usr/local/bin/a2ps-j -l ファイル名 Emacs Buffer
で、Emacsというファイルを変換しに行って失敗してると思われます。
#シェルスクリプト側で処理するのが正しいかな?

今は、とりあえず Emacs Bufferの文字が入ってるのを我慢してます。

ところで、
6 23 13:51 2006 print_via_mail.sh Emacs buffer Page 1
みたいな文字列が本文エリアに付加されていますが
これは、Emacsが付加してるんですよね?

Katsumi Yamaoka

unread,
Jun 26, 2006, 2:54:28 AM6/26/06
to
>>>>> In <86k678t...@bsd2.4bn.ne.jp>
>>>>> Yoshitaka Ikeda <ik...@4bn.ne.jp> wrote:

> 今は、とりあえず Emacs Bufferの文字が入ってるのを我慢してます。

> ところで、
> 6 23 13:51 2006 print_via_mail.sh Emacs buffer Page 1
> みたいな文字列が本文エリアに付加されていますが
> これは、Emacsが付加してるんですよね?

はいそうです。正確には lpr-page-header-program という変数の値で
ある pr コマンドが付加しています[1]。この辺りの ELisp のコードに
カスタマイズの余地はまったく無くて、好みの形式にするにはコードそ
のものを書き換えるしかないのですが、とりあえず " Emacs buffer"
をはぎ取るやつを一つ (.emacs などに入れて下さい)。

(defadvice print-buffer (around print-filename-in-page-headers activate)
"Print a file name in the page headers if the buffer visits a file."
(if buffer-file-name
(let ((title (file-name-nondirectory buffer-file-name))
(new-coords (print-region-new-buffer (point-min) (point-max))))
(apply 'call-process-region (car new-coords) (cdr new-coords)
lpr-page-header-program t t nil
(nconc (list "-h" title)
lpr-page-header-switches))
(setq ad-return-value
(print-region-1 (point-min) (point-max) lpr-switches nil)))
ad-do-it))

[1] 印刷するバッファの内容を「pr -h "バッファ名 Emacs buffer" -F」
に通したものを lpr-command で指定したコマンドにパイプします。
lpr.el 参照。
--
山岡

Yoshitaka Ikeda

unread,
Jun 26, 2006, 4:19:04 AM6/26/06
to
Katsumi Yamaoka <yam...@jpl.org> writes:
> はいそうです。正確には lpr-page-header-program という変数の値で
(snip)
> lpr.el 参照。

試してみましたが、まだついたままです。自分でも原因探求してみますが。

#ちなみに、M-x print-bufferだと *spool temp* Emacs buffer になって、
#M-x lpr-bufferだと print_via_mail.sh Emacs buffer となります。

Katsumi Yamaoka

unread,
Jun 26, 2006, 5:31:15 AM6/26/06
to
>>>>> In <864py8s...@bsd2.4bn.ne.jp>
>>>>> Yoshitaka Ikeda <ik...@4bn.ne.jp> wrote:

> 試してみましたが、まだついたままです。自分でも原因探求してみますが。

以前の記事を読み返して見るに、lpr-add-switches 変数の値が nil で
はないですね? これが nil だと lpr-command の第二引数としてタイ
トルが渡されませんから。このタイトルは "バッファ名 Emacs buffer"
のままです。このことをおっしゃっているのではないですか?
それから、たぶん関係無いですが、lpr-headers-switches 変数の値は
デフォルトの nil ですね?

(defadvice ...) のようなやり方で簡単に対処することは、不可能に思
えてきました。lpr.el を以下のように改造してしまうのが簡単でしょ
う。

--- lpr.el~ 2001-07-15 16:15:34 +0000
+++ lpr.el 2006-06-26 09:29:12 +0000
@@ -199,8 +199,8 @@
;; On some MIPS system, having a space in the job name
;; crashes the printer demon. But using dashes looks ugly
;; and it seems to annoying to do for that MIPS system.
- (let ((name (concat (buffer-name) " Emacs buffer"))
- (title (concat (buffer-name) " Emacs buffer"))
+ (let ((name (buffer-name))
+ (title (buffer-name))
;; Make pipes use the same coding system as
;; writing the buffer to a file would.
(coding-system-for-write (or coding-system-for-write

(変更した後で M-x byte-compile-file して下さい。正規版とは別の場
所に置いて、(load "/some/where/lpr") とするのも良いと思います。)

> #ちなみに、M-x print-bufferだと *spool temp* Emacs buffer になって、
> #M-x lpr-bufferだと print_via_mail.sh Emacs buffer となります。

上記の lpr.el 本体を改造するやり方ならば、lpr-buffer にも効果を
及ぼします。(ちなみに Emacs 21.3 とほぼ同じ 21.4 で試しています。)
--
山岡

Yoshitaka Ikeda

unread,
Jun 26, 2006, 5:55:27 AM6/26/06
to
Katsumi Yamaoka <yam...@jpl.org> writes:
> 以前の記事を読み返して見るに、lpr-add-switches 変数の値が nil で
> はないですね? これが nil だと lpr-command の第二引数としてタイ
> トルが渡されませんから。このタイトルは "バッファ名 Emacs buffer"
> のままです。このことをおっしゃっているのではないですか?

lpr-add-switchesはデフォルトのままです。たぶんnilではないです。

> それから、たぶん関係無いですが、lpr-headers-switches 変数の値は
> デフォルトの nil ですね?

これもデフォルトのままなので、たぶんnilです。


> (defadvice ...) のようなやり方で簡単に対処することは、不可能に思
(snip)>

> 上記の lpr.el 本体を改造するやり方ならば、lpr-buffer にも効果を
> 及ぼします。(ちなみに Emacs 21.3 とほぼ同じ 21.4 で試しています。)

この方法で試してみたら、うまく成功しました。
あとで、Summaryをまとめてみます。

--

0 new messages