カテゴリー別アーカイブ: Windows

Emacs からの make (Windows 上)

Windows だと make を実行するのがわりとめんどくさい。これはコマンドプロンプトとか PowerShell をとかを使ってるからで、bash とか使えばましになるのかもしれないけれど、複数のターミナルを表示させてその都度切り替えて使うってやり方が Windows と合ってないのかもしれない。

Emacs 使ってるんだから make の実行も Emacs からすればいいんだよね。どうすればよかったんだっけ?

あらかじめ Emacs の変数 compile-command に make を実行するコマンドを設定しておく。実行の際は M-x compile とすればよい。

;; make の設定
(setq compile-command "mingw32-make -k")

Windows 上の Emacs からの印刷

職場で Windows 上の Emacs から印刷したいんだけどと質問を受けた。

自分は UTF-8 のソースコードなどを印刷するときは、NetBSD で iconv で EUC-JP に変換してから a2ps-j に送って Postscript に変換、Windows の SumatraPDF (内部で ghostscript を呼び出している)で印刷という手順を踏んでるんだけど、めんどくさいよね。

Windows で動くフリーのテキスト印刷ツール (sprint とか)を試してみたけど、日本語が文字化けとかしてまともに動かない。結局 VisualStudio で印刷したら、ってその場をしのいだけど敗北感必至。

そこで Windows 上の Emacs のバッファを印刷する方法を調べてみた。

GNU 本家のマニュアルと日本語用の追加の設定によれば以下の通り。これで一応 M-x ps-print-buffer が動作する。メニューでいえば Postscript Print Buffer だ。

;; Windows での印刷設定
(setq ps-printer-name t)
(setq ps-multibyte-buffer (quote non-latin-printer))
;; なぜか両面印刷できない
(setq ps-lpr-command "C:/gs/gs9.14/bin/gswin32c.exe")
(setq ps-lpr-switches '("-q" "-dNOPAUSE" "-dBATCH"
                         "-sDEVICE=mswinpr2" -sPAPERSIZE=a4"))

しかしコメント欄に書いてるように、複数ページだとなぜか両面印刷できない。もちろんプリンタのプロパティで両面印刷をしている。同様の指摘はネットにもいくつか転がっていた。

直接印刷せずに、一旦ファイルに保存してから印刷すると両面印刷可能になる。ならば、gs を直接呼ぶんじゃなくてツールを咬ませばいいのではないか、ということでこれ。

;; Windows での印刷設定
(setq ps-printer-name t)
(setq ps-multibyte-buffer (quote non-latin-printer))
;; 直接 gs に送るとなぜか両面印刷できない
;; (setq ps-lpr-command "C:/gs/gs9.14/bin/gswin32c.exe")
;; (setq ps-lpr-switches '("-q" "-dNOPAUSE" "-dBATCH"
;;                         "-sDEVICE=mswinpr2" -sPAPERSIZE=a4"))
(setq ps-lpr-command "C:/Program Files/SumatraPDF/SumatraPDF.exe")
(setq ps-lpr-switches nil)

これで、ps-print-buffer を実行すると SumatraPDF が立ち上がるのでそこで印刷すればよい。SumatraPDF が終了するまで Emacs は操作できないが、まあ許容範囲かな。

あと、英数字と日本語の幅は 1:2 にはならない。日本語フォントの設定は mule.el でやっているようだが、印刷用の文字幅の調整は簡単にはできないようだ。

Hyper-V と NetBSD とタイムゾーン

Hyper-V で動かしている NetBSD のログ /var/log/messages を見ると、OS 起動直後の時計が9時間進んだ時刻となっている。

タイムゾーンの設定関係かとも思ったがそうではなく、起動直後は本当に9時間進んだ時刻になっていて、rc スクリプトでntpdate(8) が実行されてから正しい時刻になっているようだ。

調べてみると、Hyper-V の仮想マシンが独立したハードウェアクロック (RTC: Real Time Clock) を持たないため、常にホスト OS (Windows 2008 server) の時刻 (JST) が返されてしまうためらしい。 NetBSD は RTC が UTC であることを期待しているので、JST の時刻を UTC と誤解して解釈し、9時間進んだ時刻が設定されてしまう。

こうなると、起動直後から正しい時刻が設定されるようにするには NetBSD のカーネルにパッチを当てるという伝統的な対処をするしかない。(/etc/rc.d/rtclocaltime による対応では起動後に時刻を変更するので ntpdate で設定するのと大差ない)

# gdb --write /netbsd
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
...
This GDB was configured as "i386--netbsdelf"...
(gdb) set rtc_offset=-540
(gdb) quit

再起動時に有効になる。

アップデートするときにはパッチを当てることを忘れてそうだ。

NetBSD-6.0 on Hyper-V

NetBSD-6.0 がリリースされたので、 Hyper-V のゲストとしてインストールしてみた。

boot 時のオプションで SMP と ACPI を無効にしないとネットワークドライバ tlp(4) が機能しないのは 5.x までの時と同じ。

でも、 ACPI を無効にするとリブートが途中で止まって再起動できない。ACPI が有効だと再起動できる。

5.x のときは ACPI 無効でも再起動できたんだが、これだとちょっと使えないなぁ。