CUIの開発環境

眠れない。こんな時ははてな日記でも書いてみる。
仕事でプログラミングする必要があるときは、Windows OS上の某ほげほげStudioでやってる。コンパイルやらリンクやらこまけぇことは良いんだよとばかりに、コーディング以外のことはIDE任せにできるので楽だけど、IDEに頼らないで開発できるようになっておくことも重要だと思うのですよ。
っちゅーことで、家では zsh + screen + emacs という三種の神器(らしい)でもって、CUI環境でもスムーズに開発できるように慣れてみんとす。このエントリの対象読者は主に僕。あと、これからmac上のCUIの環境で開発しようとしている人(たぶん)。

zsh

macのデフォルトのシェルはbashだけど、様々な改良が施されたzshというシェルがナウなヤングにバカウケらしい。bashすら使えてないし、zshのどこが凄いかは全く知らないけど、ここはひとつzsh使ってみっか。
Windowsしか使ってないと非力なDOSシェルしか知らない(なんか今はPowerShellとかいうのがあるらしい。よく知らん。)ので、「は?シェル?なにそれ美味しいの?」とかなりかねない。かくいう自分もシェルスクリプトをガシガシ書いたことがないので偉そうなこと言えないけど。
でもWindowsユーザでシェルでコマンド打って何かやる、ということは技術者以外ほとんどないだろうし、DOSシェルのスクリプトをガシガシ書くような人だとUNIX系のシェルも熟知してるだろうし、WindowsPowerShellも知ってるだろうから、本当にこの記事は誰得的なくぁwせdrftgyふじこlp;否!俺得です。
そんな、カーネルへの命令を解釈する部分とも言えるシェルがDOSシェルしかないWindowsと違い、UNIX系のOSでは、bashやらzshやらcshやらtshやら他にもいくつかあって、そん中から自分が好きなシェルを選べるという訳ですな。で、そのシェルを動かすアプリがターミナル。シェルはOSの機能を実行するためのインタプリタと言えるんじゃないんかな。

関係ないけど、Schemeインタプリタのgoshとかmoshって韻を踏んでるのかな。

screen

例えて言うなら、ブラウザやテキストエディタのタブをシェルで使えるようにしたようなもん。シェルで実行した命令はその処理が完了しないと次の命令を受け付けてくれないけど、タブ(screenの用語ではwindowと言うらしい)を切り替えれば、なんということでしょう!そこにはウッドデッキプロンプトが!バックグラウンドでやれば話しは別だけど。
例えば、emacsでコーディングしてるとき、コンパイルしたくなったら、いったんemacsを終了して、シェルのプロンプトまで戻ってこないといけない。だけどscreenなら、あるwindowでシェルのプロンプト出しといて、他のwindowではemacs起動して、コンパイルしたくなったらwindowを切り替えてgccするだけ。超簡単。例が適切ではなかったかも知れないが、とりあえず色々美味しいことがある【要出典】らしいから、とりあえず使っとく。
emacs上でコンパイルするとか、コンパイルするようなemacs lispを書いといてそれをemacsから呼び出すとか、そもそもターミナル上でエディタを動かさないとか言う輩は帰れ!とっとと帰りやがれ!おととい来やがれ!

そこっ!M-x makeとか言っちゃダメ!(;´Д`)
...では、とりあえずインストールから。といってもMacPortsに丸投げ。

zshとscreenのインストール

今のmacだとzshはデフォルトで入っているらしいけど、日本語があやしいとかそんなんだった気がするから、MacPortsでsearchで探して、それらしいのをinstall。4.3以降ならUTF-8にも対応しているので日本語OKだった思う。自分のはzsh-devel @4.3.10。んで、~/.zshrc作って色々設定しときましょう。(←投げやり)

screenもデフォルトで入ってたっけな?覚えてないけど、これもMacPortsにある(と思う)から入ってなかったら適当にinstall(←いい加減)。できたら~/.screenrcに色々設定書いとく(←投げやり)。自分の.screenrcはこんな感じ。意味を理解して書いてるわけじゃないので注意。

defkanji utf-8
defencoding utf-8
encoding utf-8 utf-8
escape ^]v
hardstatus on
hardstatus alwayslastline "screen | %w | %u %= %m/%d %D %c"

コマンド文字はどっかサイトに倣って ^] にしている。

MacPortsに関してはMacPortsでステキなUNIXツールをインストール - はこべにっき ♨などを参照されたし。

zshをデフォルトのシェルにする

zshをインストールしただけだとデフォルトのシェルはbashのままなので、デフォルトがzshになるように設定してやる必要がある。以下のサイトを参考にテケトーに。chshでの編集方法が全然分からずちょっと苦労したけど、こいつはviというエディタらしい。僕みたいにviの知識が皆無な人は事前にちょっと調べておいた方が吉。

macで他にやっておきたい設定

C-[SPC]がSpotlightに取られている件

emacsで範囲指定するときにC-[SPC]がSpotlightに取られてて働かないので「システム環境設定」の「Spotlight」からキーを変更。自分は空いてそうなC-[F12]にしている。mark setをC-@でやる人は設定の必要なし。

commandキーがメタキーとして働かない件

Escを使えば良いんだろうけど今までAltキーだったりしたので。commandをメタキーにするにはパッチ的なものを当てないとだめらしい。
ターミナルではoptキーをメタキーとして使うための設定があるけど、このパッチを当てると、optとcommandを入れ替えることができる。つまり、commandをメタキーとして使えるようになる。※ただしイケメンターミナルに限る。

  1. SIMBL というアプリケーションを入れる
  2. ~/Library/Application Support/SIMBL/Plugins/ というフォルダを作成する
  3. SwapOptCmd.zip をダウンロードして展開する
  4. ↑で出てきたSwapOptCmd.bundle というファイルを上記フォルダに置く
  5. ターミナル.app を再起動
  6. ターミナル.app の環境設定で「メタキーとして option キーを使用」にチェック
Mac のターミナル.app で Emacs を使う場合に Command を Meta キーとして使うメモ - ryskosn log
ターミナル上のemacsからOSのクリップボードを利用できるようにする

emacsは独自のキルリングという仕組みを使っているから、emacs上でコピー(キル)した内容を他のアプリに貼付けられない。Carbon Emacsとか使えばできそうだけど、screenと併用したい僕として容認できない!断じて!認めん!ということで、調べてやってみた。
1. ~/.zshrcに以下を追記

alias pbcopy="nkf -w | __CF_USER_TEXT_ENCODING=0x$(printf %x $(id -u)):0x08000100:14 pbcopy"

あれ?pbpasteに関しては文字エンコーディングのこと考えなくていいのかな...。


2. ~/.emacs.el等に以下を追記

(when (string-match "apple-darwin" system-configuration)
  ;; paste
  (defun copy-from-osx ()
    (shell-command-to-string "pbpaste"))
  ;; copy
  (defun paste-to-osx (text &optional push)
    (let ((process-connection-type nil))
      (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
        (process-send-string proc text)
        (process-send-eof proc))))

  (setq interprogram-cut-function 'paste-to-osx)
  (setq interprogram-paste-function 'copy-from-osx))


3. ターミナルとemacsを再起動
(゚д゚)ウマー
でもこれやると、キルリングはどうなっちゃうんだろう。

もうテキストエディタは一本化してしまいたい的なアレで。結局は他のアプリにペーストしたいがためにやるんだけど、じゃあもうブラウザもメーラーemacs上で...
ヽ(;´Д`)ノemacsコワイヨ〜