読者です 読者をやめる 読者になる 読者になる

開発環境としてのMac OS Xカスタマイズ

Mac OS Xを使っていないプログラマは、時間の80%を無駄にしている、かどうかは知りませんが、堅いGUIUNIX系のコマンドラインツールを使えるMac OS Xは、開発環境として使いやすいことは確か。
が、デフォルトのままでは、Terminal.appで日本語が表示できないとか、lsやfindがGNU系じゃなくてBSD系だとか、要するにOSだってカスタマイズしてなんぼというわけであります。


というわけで、私のMac OS Xのカスタマイズをこのあたりに書いておきます。


※2008/2/3追記: Leopard版書きました > 開発環境としてのMac OS X Leopard

Terminal.app

Mac OS Xにはデフォルトで「ターミナル」(/Applications/Utilities/Terminal.app)が付いてきますが、これがデフォルトではまったくイケてない。主要な問題は以下の3点。

  • 日本語を表示できない
  • DeleteやHomeキーが使えない
  • 色が見にくい


まず日本語が表示できない問題は、Terminal.appの設定と、readlineの設定の2点に起因しているようです。

  1. Terminal.appの「ウィンドウ設定」をいじる(後述)
  2. ~/.inputrcを修正

で解決します。~/.inputrcは確かデフォルトでは存在しないので、vimemacsなどなどお好みのエディタで作成して、以下を記述。

set meta-flag on
set convert-meta off
set input-meta on
set output-meta on

続いてDeleteやHomeキーが使えないのは、これまたTerminal.appの設定と、readlineの設定。というわけで、

  1. Terminal.appの「ウィンドウ設定」(後述)
  2. ~/.inputrcの修正

で解決します。Terminal.appのウィンドウ設定は後述として、とりあえず~/.inputrcに以下を追記。

"\033[3~": delete-char


vimな方は~/.vimrcに↓これも書いておくと良いです。

map <C-[>[H <Home>
map! <C-[>[H <Home>
map <C-[>[F <End>
map! <C-[>[F <End>

色が見にくいのは、黒背景にすると青が見にくいし、白背景にすると黄色が見にくいし…。~/.dir_colorsや~/.vimrcで見にくい色を使わないようにするのも手ですが、TerminalColorsを使うのが最適です。これを入れると、Terminal.appでもANSIカラーを変更できるようになります。



さて、Terminal.appの設定ですが、お手軽な方法は↓このファイルを~/Library/Preferences/com.apple.Terminal.plistに上書きすればOKです。(元のファイルはバックアップをとっておいてください)
com.apple.Terminal.plist


手で設定する場合は、Terminal.appの「ウィンドウ設定」で↓を設定すればたぶんOK。

  • 「エミュレーション」で、「非ASCII文字をエスケープする」のチェックを外す
  • 「ディスプレイ」で、「日本語や中国語などにワイドグリフを使用する」にチェックを入れる
  • 「ディスプレイ」で、「ワイドグリフは2桁とカウントする」にチェックを入れる
  • 「カラー」と「ANSI Colors」で色をお好みに設定
  • 「キーボード」で、↓を追加
キー 修飾 操作 操作の内容
del(deleteを送出) なし 文字列をシェルへ送信する \033[3~
home なし 文字列をシェルへ送信する \033[H
end なし 文字列をシェルへ送信する \033[F
page up なし 文字列をシェルへ送信する \033[5~
page down なし 文字列をシェルへ送信する \033[6~

iTerm.app

iTermは、タブ機能つきのMac OS X用ターミナルエミュレータです。ANSIカラーも変更可能で、デフォルトで日本語も使用可(違ったかも?)

Terminal.appは止めてiTermを使えばいいのでは?とも思うわけですが、残念ながらiTermにも「ターミナル速度が遅い」という問題があります。
画面全体にiTermに表示して、vimでウィンドウを縦に分割して、なんてやっていると、スクロールが遅くて泣きそうになります。


というわけで、Terminal.appとiTermは場面に応じて使い分けるといい感じです。



MacPortsをホームディレクトリにインストール

最近やっとMacPortsを入れました。これはステキです。

ただ、dmgに入っているインストーラでインストールすると、/opt/local以下にインストールされるのが気に入らない。ホームディレクトリに入れて欲しい。というわけでMacPortsをソースからコンパイルして、$HOME/portsにインストールしてみました。以下その手順を。


まずreadlineの最新版を入れておきます。readlineを新しくしないとコンパイル時にエラーが出ます(でももしかしたらウチのMacだけかも?)。GPLがアレな場合はlibeditでも良いかも。

wget http://ftp.gnu.org/pub/gnu/readline/readline-5.2.tar.gz
wget http://ftp.gnu.org/pub/gnu/readline/readline-5.2-patches/readline52-00{1,2,3,4,5,6,7}
tar zxvf readline-5.2.tar.gz
cd readline-5.2
for p in ../readline52-*; do patch -p2 < $p; done
./configure --enable-multibyte --prefix=$HOME/ports
make -j3
make install 2>&1 | tee make-install-readline.log


続いてMacPortsをインストール。./configureの引数が長い。

wget http://svn.macports.org/repository/macports/downloads/MacPorts-1.5.0/MacPorts-1.5.0.tar.bz2
tar jxvf MacPorts-1.5.0.tar.bz2
cd MacPorts-1.5.0
LDFLAGS="-L$HOME/ports/lib" CFLAGS="-L$HOME/ports/lib" ./configure --prefix=$HOME/ports --with-included-sqlite3 --with-install-group=`id -g` --with-install-user=`id -u` --with-tclpackage=$HOME/ports/tcl
make -j3
make install 2>&1 | tee make-install-macports.log


環境変数で$TCLLIBPATHと$PATHを~/.bashrc(とか~/.zshrcとか~/.cshrc)で設定しておきます。

export TCLLIBPATH="$HOME/ports/tcl"
export PATH="$HOME/ports/bin:$PATH"


あとはport selfupdateしてお好みのパッケージをインストールパーティすればOKです。ユーザー権限でインストールできます。sudo要りません。

port selfupdate
port install coreutils +with_default_names
port install findutils
port install wget
port install ruby

QuickSilverがたまに暴走する

Mac OS Xの3大アプリと言えば、QuickSilverとKeynoteとiTermなんじゃないかと勝手に思ってます。Ensemble2とCotEditorも入れたい…それからAdiumとCyberduckとSSHKeychainと日めくりと…キリが無いですが、なにはともあれQuickSilver無いことには始まらないわけです。ランチャーなので。

QuickSilverは「マニュアルを読むたびに新機能が見つかる」タイプで、vimやscreenと似たものを感じます。各種機能はプラグインになっていて、かなりの数があります。


このQuickSilverですが、ATOKと干渉するのか、ATOKと共にCPU使用率をごっそり持って行って応答しなくなってしまうことがありました。検索しても全然出てこないので、ウチのMacだけかもしれないのですが…
QuickSilverのPreferencesで、Appearanceの中にある「Superflous visual effects」のチェックを外すと発症しなくなりました。QuickSilverを呼び出したときのエフェクトがなくなってちょっと寂しいのですが、エフェクトが無い分速くなるし、それもいいかなーなんて思ってます。



SSHKeychainをホームディレクトリに入れる

今まで.app単体で配布されていたSSHKeychainですが、最近インストーラ形式になってしまい、ホームディレクトリ以下にインストールできなくなりました。しょうがないので、インストーラをバラして.appを取り出します。(ソースからコンパイルするのもアリです)


まずはSSHKeychian.dmgをダウンロードしてきて、ディスクイメージをマウントします。
そうすると、↓こんな感じになってます。

$ find /Volumes/SSHKeychian
/Volumes/SSHKeychain
/Volumes/SSHKeychain/.DS_Store
/Volumes/SSHKeychain/SSHKeychain.pkg
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Archive.bom
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Archive.pax.gz
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Info.plist
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/PkgInfo
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/.DS_Store
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/BundleVersions.plist
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/background.gif
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/Description.plist
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/License.txt
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/ReadMe.txt
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/English.lproj/SSHKeychain.info
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/package_version
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/postinstall
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/postupgrade
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/SSHKeychain.bom
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/SSHKeychain.pax.gz
/Volumes/SSHKeychain/SSHKeychain.pkg/Contents/Resources/SSHKeychain.sizes


いわゆるMac OS Xのインストーラの実体は、拡張子がpkgのディレクトリ(いわゆるバンドル)のようです。
怪しいのは拡張子が.gzのSSHKeychain.pax.gz。こやつをfileコマンドで調べてみると、↓こうなります。

$ cd /Volumes/SSHKeychain/SSHKeychain.pkg/Contents
$ file Resources/SSHKeychain.pax.gz 
Resources/SSHKeychain.pax.gz: symbolic link to `../Archive.pax.gz'
$ file Archive.pax.gz 
Archive.pax.gz: gzip compressed data, from Unix


SSHKeychain.pax.gzは../Archive.pax.gzへのシンボリックリンクで、Archive.pax.gzは見たままgzipで圧縮されたデータのようです。というわけでArchive.pax.gzを展開します。

$ cp Archive.pax.gz ~/tmp
$ cd ~/tmp
$ gunzip Archive.pax.gz
$ file Archive.pax
Archive.pax: ASCII cpio archive (pre-SVR4 or odc)


Archive.paxはいわゆるold ASCIIタイプのcpioアーカイブのようなので、これをバラします。

$ cpio -ivd < Archive.pax
.
./.gdb_history./SSHKeychain.app
./SSHKeychain.app/Contents
…以下略…


めでたくSSHKeychain.appが出てきました。あとはこれを~/Applications/にでもコピーしておけばOK。