2011-04-13

Emacs 23.3のフォント設定

以前書いたとおり、今はEmacs 23.3にinline_patchを充てて幸せな生活をおくっています。ついでにmacemacsjp MLでフォントの設定関係の話題があったのを思い出したので、参考にしつつ、フォント周りを見なおしてみました。

参考にしたサイトはid:setoryoheiさんとsakitoさんのサイトです。参考というか、id:setoryoheiさんの設定例(2)をまるっとコピーして、必要な文字セットをsakitoさんのサイトから拾ってきただけなんですが。。。

というわけで、今は英字をMenloで日本語をヒラギノ角ゴ ProNで指定して、こんな感じでやっています。


;; http://d.hatena.ne.jp/setoryohei/20110117
;; 設定例2
(let* ((size 12) ; ASCIIフォントのサイズ [9/10/12/14/15/17/19/20/...]
       (asciifont "Menlo") ; ASCIIフォント
       ;; (jpfont "TakaoExGothic")             ; 日本語フォント
       (jpfont "Hiragino Kaku Gothic ProN") ; 日本語フォント
       (h (* size 10))
       (fontspec (font-spec :family asciifont))
       (jp-fontspec (font-spec :family jpfont)))
  (set-face-attribute 'default nil :family asciifont :height h)
  ;; http://sakito.jp/moin/moin.cgi/EmacsFont を参考にして必要そうなものを追加
  (set-fontset-font nil 'jisx0201                 jp-fontspec)
  (set-fontset-font nil 'latin-jisx0201           jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0208        jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0208-1978   jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0212        jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0213-1      jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0213-2      jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0213-a      jp-fontspec)
  (set-fontset-font nil 'japanese-jisx0213.2004-1 jp-fontspec)
  (set-fontset-font nil 'katakana-sjis            jp-fontspec)
  (set-fontset-font nil 'cp932-2-byte             jp-fontspec)
  (set-fontset-font nil 'cp932                    jp-fontspec)
  (set-fontset-font nil '(#x3040 . #x309f)        jp-fontspec) ; ひらがな
  (set-fontset-font nil '(#x30a0 . #x30ff)        jp-fontspec) ; カタカナ
  (set-fontset-font nil '(#xff00 . #xffef)        jp-fontspec) ; 半角・全角系
  (set-fontset-font nil '(#x0370 . #x03FF)        fontspec)    ; ギリシャ文字 
)
;; フォントサイズの比を設定
(setq face-font-rescale-alist
 '(("^-apple-hiragino.*" . 1.2)
   (".*osaka-bold.*" . 1.2)
   (".*osaka-medium.*" . 1.2)
   (".*courier-bold-.*-mac-roman" . 1.0)
   (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
   (".*monaco-bold-.*-mac-roman" . 0.9)
   ("-cdac$" . 1.3)))


で、実際にはこんな感じで描画されます。

実はコメントアウトしているところからわかるかもしれませんが、Emacs 23.2まではタカオ フォントを愛用していました。ただ、タカオ フォントでは一部の文字について対応されていなかったので、ちょっと残念な感じになっていました。(特に、TwitterのTLを表示するときとか。。。)

なんか、Emacsのバージョンを上げるたびにフォントの設定を書き換えているような気がしますが、今の内容で結構満足しているので、しばらくはこのままにしておきたいなぁ。。。

2011-04-11

emacsでMXMLとactionscript3を編集できるようにする (あるいはmumamoの使い方)

ググッても特にあんまり情報がなかったので、晒します。勘違いしていたり、もっといい方法があったら教えてください。

きちんとAdobeにお金を払うと、Flex BuilderというFlexの統合開発環境を手に入れることができますが、とりあえず、Flexを使ってみたいという場合はオープンソースで公開されているFlex SDKを使うのが吉だと思います。まぁ、本気でFlexの開発をするんだったらFlex Builderは必須だと思いますけど。そういえば、Flexの統合開発環境ではFlex Developerというのもあるらしいですけど、Windows向けなのでよく知りません。

で、Flex SDKにはコンパイルするためのツールはありますが、コードはテキストエディタを使って書く必要があります。コードアシストがないテキストエディタでコードを書くのは苦行にしかならないので、Emacsでなんとかしようと思うわけですが、如何せん情報がない。

一番困ったのが、MXMLファイルの中にactionscript3のコードを混ぜて書くときのメジャーモードの切り替えです。世の中にはactionscript3用のメジャーモードなんてのもあるんですが、asファイルで分けることを前提として書かれているようなので、ちょっと厳しい。

で、nXhtmlに含まれるmumamoという、1つのバッファに複数のメジャーモードを共存させるelispを使って環境を整えました。

まずはactionscript3用のメジャーモードはここのを使いました。

で、あとはmumamoを使うためにnXhtmlのautostart.elをloadしたあとに以下のようにします。

;; actionsript-modeの登録
(autoload 'actionscript-mode "actionscript-mode" "Major mode for editing actionscript3." t)
(add-to-list 'auto-mode-alist '("\\.as?\\'" . actionscript-mode))

;; actionscript切り替え用chunk
(defun mumamo-chunk-mxml-script (pos min max)
  "`<![CDATA['から`]]>'までをactionsript-modeとする"
  (mumamo-quick-static-chunk pos min max "<![CDATA[" "]]>" nil 'actionscript-mode nil))

;; mxmlはxml-mode、asはactionscript-modeを使用する
(define-mumamo-multi-major-mode mxml-actionscript-mumamo-mode
  "Flex開発でMXMLとactionscript3を共存させる"
  ("Flex Development" nxml-mode (mumamo-chunk-mxml-script)))

mxmlとactionscript3に限らず、以下のようにmumamoを使えるようにすれば幸せになれるかもしれません。

  • 共存させたいメジャーモードを切り替えるためのchunkを定義する
  • 共存させたいメジャーモードをdefine-mumamo-multi-major-modeを使って元になるメジャーモードに組み込こむ

2011-03-24

emacs23.3をinline_patch付きでビルドしてみた

めでたくemacs 23.3がリリースされました。inline_patchのリリースアナウンスは出ていませんが、一応svnレポジトリにコミットされているみたいです。今回からは今までのパッチの他にCocoa Emacsのピコピコ問題([Macemacsjp-users 1678]から始まるスレッド)とxcode4でビルドするためのパッチが同梱されているようです。

僕の環境では必要ない(Mac OS X 10.6 + Xcode3)環境なのですが、一応xcode4でビルドするためのパッチも当てました。ビルドの手順は下記の通り。ちなみに、inline_patchのリビジョンは574です。

% mkdir -p ~/src/emacs23.3
% cd ~/src/emacs23.3
% wget http://ftp.gnu.org/gnu/emacs/emacs-23.3.tar.bz2
% svn co http://svn.sourceforge.jp/svnroot/macemacsjp/inline_patch/trunk inline_patch-svn
% tar xjf emacs-23.3.tar.bz2
% cd emacs-23.3
% patch -p 0 < ../inline_patch-svn/emacs-inline.patch

% patch -p 0 < ../inline_patch-svn/font.patch

% patch -p 0 < ../inline_patch-svn/xcode4.patch

% ./configure --with-ns --without-x

% make bootstrap

% make install


今のところ、問題なく使えています。ただし、3/21にコミットがおこなわれたりしているので、リリースのアナウンスが出てからおもむろに使い始めるのが正しいと思います。

2011-02-08

Elecom社製USB-シリアル変換ケーブル(UC-SGT)をMac OS X 10.6で使う

Emacs関連のポストが続いたり、Mac Book Proを買って浮かれポンチなポストをしたりしていますが、本業はインフラよりのネットワークエンジニアだったりします。で、本業で使うかどうかは別として、シリアルケーブルはネットワークエンジニアの嗜みとして使えるようにしておくべきでしょう、というポストです。

まず、僕が所有しているUSB-シリアル変換ケーブルはElecom社のUC-SGTという製品です。こいつは自分がM1の時に買ったので、かれこれ8年くらいの付き合いです。

Elecom社のサイトではWindows向けのドライバは提供されていますが、Mac向けのドライバは提供されていません。ただし、UC-SGTはProlific社のPL2303というチップを積んでいて、Prolific社のサイトではMac向けのドライバが提供されています。

というわけで、Prolific社製のドライバをUC-SGTでも使えるように導入してみます。

まず、何はなくとも本家からドライバをダウンロードして、インストールします。インストール直後にUC-SGTを挿してもMac君は認識してくれません。Mac君に認識してもらうためには /System/Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist というファイルを編集する必要があります。編集する内容は下記のとおりです。

--- /System/Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist.orig 2010-03-25 16:47:26.000000000 +0900
+++ /System/Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist 2010-12-25 23:22:35.000000000 +0900
@@ -24,7 +24,7 @@
2.0.0
IOKitPersonalities

- 067B_2303
+ 056E_5003

CFBundleIdentifier
com.prolific.driver.PL2303
@@ -37,9 +37,9 @@
bInterfaceNumber
0
idProduct
- 8963
+ 20483
idVendor
- 1659
+ 1390


OSBundleLibraries
ようするに、ベンダーIDとプロダクトIDをUC-SGTにあわせる感じです。

あとは、念のため ProlificUsbSerial.kext を再読込みさせておきます。

% sudo kextunload /System/Library/Extensions/ProlificUsbSerial.kext
% sudo kextload /System/Library/Extensions/ProlificUsbSerial.kext


これで、UC-SGTを挿すと /dev/tty.usbserial として使えるようになります。あとはそのあたりに転がっているシリアルコンソールを持つ箱に挿して遊んでください。

ちなみに、ドライバをアンインストールするには以下のようにすると良いハズです。

% kextunload /System/Library/Extension/ProlificUSBSrial.kext
% sudo rm -fr /System/Library/Extension/ProlificUSBSrial.kext
% sudo rm -fr /private/var/db/receipts/com.prolific.driver.PL2303.bom
% sudo rm -fr /private/var/db/receipts/com.prolific.driver.PL2303.plist

mac os xだったらbrowse-url-browser-functionはopenでしょう

ということで、以下の設定を適当なところに追加して幸せになりました。

(setq browse-url-browser-function 'browse-url-generic)
(setq browse-url-generic-program
(if (file-exists-p "/usr/bin/open")
"/usr/bin/open"))

2011-01-28

emacsでネットワークインターフェイスにアドレスが付いているときだけ実行するようなelisp (改)

emacsでネットワークインターフェイスにアドレスが付いているときだけ実行するようなelispでゴニョゴニョしたelispだけど、ちょっとダサいので、dolistを使って書きなおしてみた。で、書きなおした結果がこう。
(setq network-interface-names '("en0" "en1")) ; ネットワークインターフェイスの名前のリスト
(dolist (currnet-network-interface-name network-interface-names)
(if (car (network-interface-info currnet-network-interface-name))
(progn
;; ネットワークアドレスが付いているネットワークインターフェイスを検出したら実行する処理を書く
(return t))))
全部の処理が終わったら(return t)でdolistを抜けます。

あー、スッキリした。

2011-01-25

anything-config.elで定義されている、anything-c-find-files-icons-directoryでコケる (解決編)

先日の問題は解決しました。ちょっと不恰好だけですけど、以下のパッチをanything-config.elに当てるとひとまず解決です。

--- anything-config.el.orig 2011-01-21 23:13:54.000000000 +0900
+++ anything-config.el 2011-01-25 16:46:04.000000000 +0900
@@ -737,7 +737,9 @@

(defcustom anything-c-find-files-icons-directory
(and (window-system)
- (concat (car image-load-path) "tree-widget/default"))
+ (dolist (i image-load-path)
+ (if (file-directory-p (expand-file-name "tree-widget/default" (eval i)))
+ (return (expand-file-name "tree-widget/default" (eval i))))))
"*Default path where to find files and directory icons."
:type 'string
:group 'anything-config)

問題が起きる条件は下記のとおり。
  • OS : Fedora 14
  • Emacs : emacs-23.2-7.fc14.x86_64
  • Mew : emacs-mew-6.3-2.fc14.x86_64
  • anything-config.el : 0.4.1
で、問題の原因は下記のとおり。
  • anything-config.elで定義されているanything-c-find-files-icons-directoryでimage-load-pathの先頭にあるmew-icon-directoryが文字列ではないため、concatが失敗している
  • 問題のimage-load-pathの先頭にあるmew-icon-directoryはemacs-mewパッケージに含まれる/usr/share/site-lisp/site-start.d/mew-init.elで追加されている
というわけで、この問題を解決するだけだったら、(car image-load-path)(eval (car image-load-path))するだけで良いはずです。カンがいい人はわかると思いますが、オリジナルのanything-config.elの処理だと、環境が違うとanything-c-find-files-icons-directoryの結果が違い、かつ、実在しないディレクトリを指す可能性があります。というわけで、冒頭のようなパッチを書きましたとさ。
本当は2回も(expand-file-name "tree-widget/default" (eval i))しているところがダサいので、何とかしたい気もするんですが、動くからいいや。

2011-01-22

anything-config.elで定義されている、anything-c-find-files-icons-directoryでコケる

世間の流れから3周ぐらい遅れて、ちょっとした思いつきでanythingを使い始めることにした。

導入はauto-install.elを入れて、auto-install-batchでanythingを指定して、(require 'anything-startup)をemacsの設定ファイルに書けばよいだけ。簡単ですね。

で、さっくり導入を終わらせていざemacsを立ち上げてみると、エラーで止まってしまう。emacsで吐かせたエラーは下記のとおり。
Debugger entered--Lisp error: (wrong-type-argument sequencep mew-icon-directory)
concat(mew-icon-directory "tree-widget/default")
(and (window-system) (concat (car image-load-path) "tree-widget/default"))
eval((and (window-system) (concat (car image-load-path) "tree-widget/default")))
custom-initialize-reset(anything-c-find-files-icons-directory (and (window-system) (concat (car image-load-path) "tree-widget/default")))
custom-declare-variable(anything-c-find-files-icons-directory (and (window-system) (concat (car image-load-path) "tree-widget/default")) ("/home/nabeo/site-lisp/auto-install/anything-config.elc" . -7216) :type string :group anything-config)
require(anything-config)
eval-buffer(# nil "/home/nabeo/site-lisp/auto-install/anything-startup.el" nil t) ; Reading at buffer position 376
load-with-code-conversion("/home/nabeo/site-lisp/auto-install/anything-startup.el" "/home/nabeo/site-lisp/auto-install/anything-startup.el" nil t)
require(anything-startup)
eval((require (quote anything-startup)))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp nil nil)
どうやら、anything-config.elの中で定義されているanything-c-find-files-icons-directoryの部分でコケているらしい。で、肝心の定義部分は下記のとおり。
(defcustom anything-c-find-files-icons-directory
(and (window-system)
(concat (car image-load-path) "tree-widget/default"))
"*Default path where to find files and directory icons."
:type 'string
:group 'anything-config)
僕の環境ではemacsが起動直後の時にimage-load-pathdescribe-variableで調べると、下記のように定義されていた。
(mew-icon-directory "/usr/share/emacs/site-lisp/ess/etc/icons" "/usr/share/emacs/23.2/etc/images/" data-directory load-path)

mew-icon-directoryはemacs-mew-6.3.2-2.fc14.x86_64 に含まれる /usr/share/emacs/site-lisp/site-start.d/mew-init.el でimage-load-pathに下記のように追加されていた。
;; Bug#606772
(add-to-list 'image-load-path 'mew-icon-directory)
元々、mewはthunderbirdからwanderlustに移行する時に incm が必要だったからいれているだけで、特に使っていないからアンインストールしても問題はないんだけど、できるならanything-config.elを修正したいなぁ。

というか、concatて変数をきちんと展開してくれないのか?

2011-01-17

GeekToolの設定

別エントリで書いていたGeekToolの設定。
  • uptime
    #!/bin/sh
    uptime| \
    awk '{printf "Uptime: " $3 " " $4 " " $5 " "}'; top -l 1 | \
    awk '/PhysMem/ {printf "RAM : " $8 ", " }' ; top -l 2 | \
    awk '/CPU usage/ && NR > 5 {print $6, $7=":", $8, $9="user", $10, $11="sys", $12, $13}' 2> /dev/null

  • ps
    ps -axr -o %cpu,%mem,user,comm | head -n 21
  • getaddr
    #!/bin/bash
    echo "Active Network Interfaces"
    for netif in `netstat -rn -f inet | awk '{print $6}' | sort | uniq`;do
    echo ${netif} | egrep "en|ppp" > /dev/null 2>&1
    if [ $? -eq 0 ]; then
    echo -n ${netif}" : "
    ipconfig getifaddr ${netif}
    fi
    done

  • resolv.conf
    cat /var/run/resolv.conf | egrep '^(nameserver|domain)'
  • df
    df -Hg -T smbfs,hfs,fusefs,msdos,afpfs,cd9660
  • Time (calendar)
    LC_ALL=C date +%H:%M:%S
  • day (calendar)
    LC_ALL=C date +%a.%B.%d
  • calendar
    LC_ALL=C cal | sed "s/^/ /;s/$/ /;s/ $(date +%e) / $(date +%e | sed 's/./#/g') /"
  • sockstat
    #!/bin/sh
    echo "socket status"
    lsof -i | awk '{print $1,"\t",$5,$8,$9,$10}'

  • Battery Status
    echo "Battery Status" ; pmset -g ps | tail -n 1 | tr -d ";" | awk '{print "Percentage: " $2, "\n" "Status: " $3}'
  • AirPort Status
    echo 'AirPort Status' ; /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | egrep "(\ SSID)|Rate|channel" | sort | awk '{print $1, $2}'

Mac OS X 10.6 (Snow Leopard)に入れたアプリケーション

昨年末に自宅で使用するMacBook Pro 13inchを購入したので、メモがわりにエントリをつくっておく。

まずは/Applicationsに入れたアプリケーション。

  • ClamXav.app
    • アンチウイルスアプリケーション
    • 今は2系のベータが取れているので、そっちを入れる
  • Alfred.app
    •  ランチャーソフト
  • coral.app
    • 後述のEmacs.appからプリンタに印刷するときに使う
  • Cyberduck.app
    • FTPクライアントアプリケーション
  • Dropbox.app
    • クラウド(笑)型ファイル共有サービスのクライアントアプリケーション
  • GitX.app
    • gitのGUIフロントエンド
  • Google Chrome.app
    • Webブラウザ
    • FirefoxやSafariよりも便利
  • Growl.app
    • 各種アプリケーションの通知をしてくれる
  • iTerm.app (iTerm2)
    • ターミナルエミュレータ
    • iTerm.appよりも便利
  • iPhone 構成ユーティリティ
    • iPadのメンテナンスに必要
  • OpenOffice.org.app
    • http://www.openoffice.org/ と http://www.documentfoundation.org/download/ に別れた
  • SimpleCap.app
    • スクリーンショット用
  • Transmission.app
    • BitTorrentクライアント
  • VLC.app
    • 強力なメディアプレイヤ
  • X11.app (XQuartz)
    • Leopardの時はデフォルトのX11.appはバギーだったけど、SnowLeopardはどうなんだろう
    • とりあえず、入れておく
  • OnyX
    • とりあえず、入れておく
  • Xcode
    •  紳士の嗜み(笑)
  • Cocoa Emacs
    • 自前でビルドする
    • inline-patchをあてる
    • 自前で入れたelisp
      • auctex
      • bbdb
      • elscreen関連
      • lookup
      • navi2ch
      • w3m
      • wanderlust
      • apel
      • flim
      • semi
プリファレンスパネルにインストールする分。
    • GeekTool
      • Desktopに各種情報を表示できる
      • 設定内容は別エントリを立てる

    2011-01-16

    emacsでネットワークインターフェイスにアドレスが付いているときだけ実行するようなelisp

    Emacs の init.el でネットワークインターフェイスにアドレスが付いているときだけある関数を実行したいときはどーするんだ、という疑問からリファレンスを引き引き作ってみた。

    まず、Emacs 23.2で使える elisp の標準関数としてnetwork-interface-infoという関数が用意されている。この関数はマニュアルでは下記のように説明されている。

    network-interface-info is a built-in function in `C source code'.

    (network-interface-info IFNAME)

    Return information about network interface named IFNAME.
    The return value is a list (ADDR BCAST NETMASK HWADDR FLAGS),
    where ADDR is the layer 3 address, BCAST is the layer 3 broadcast address,
    NETMASK is the layer 3 network mask, HWADDR is the layer 2 addres, and
    FLAGS is the current flags of the interface.
    ようするに引数にネットワークインターフェイスの名前を指定すると、指定したネットワークインターフェイスの情報が取れる、というわけですな。

    で、今回はあるネットワークインターフェイスにアドレスが付いているときに特定の処理をしたいので、以下のような処理をどこかに噛ます必要があります。(currnet-network-interface-nameはネットワークインターフェイスの名前)

    (if (car (network-interface-info currnet-network-interface-name))
    (progn
    ;; ネットワークアドレスが付いているネットワークインターフェイスを検出したら実行する処理を書く
    )

    Emacs 23.2にはnetwork-interface-listという関数が用意されていて、この関数を使えば、ネットワークインターフェイスのリストが取れるようなことが書いてあるんだけど、僕の環境ではちゃんと意図したとおりの結果を返してくれなかった。というわけで、ネットワークインターフェイスのリストは自前で定義して下記のようにしました。

    (setq network-interface-names '("en0" "en1")) ; ネットワークインターフェイスの名前のリスト
    (while network-interface-names
    (setq currnet-network-interface-name (car network-interface-names))
    (if (car (network-interface-info currnet-network-interface-name))
    (progn
    ;; ネットワークアドレスが付いているネットワークインターフェイスを検出したら実行する処理を書く
    (setq network-interface-names ())))
    (setq network-interface-names (cdr network-interface-names)))

    まぁ、こんなもんでしょ。