0%

OSXにHomebrewでtmuxとEmacs 24.4をインストールする

普段はクラウド上のUbuntuコンテナやLinux Mintをメインの作業環境にしています。最近Arduinoなどマイコンを操作していると、USBシリアル通信をするホストマシンとしてOSXで一通りの開発環境が必要になりました。いつものクラウド上と同じようなの開発環境とOSX上にも用意しようと思います。

ターミナルマルチプレクサ

byobu-configが起動しない

UbuntuやLinix Mintではターミナルマルチプレクサにbyobuを使っています。OSXにもHomebrewでインストールしたかったのですが、byobu-configが起動しません。

$ brew update
$ brew install byobu
$ byobu-config
ERROR: Could not import the python snack module

原因はnewtパッケージとPythonのモジュールにありそうです。

$ brew info newt
newt: stable 0.52.18 (bottled)
https://fedorahosted.org/newt/
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/newt.rb
==> Dependencies
Required: gettext ✔, popt ✔, s-lang ✔
==> Options
--with-python
Build with python support

byobu: Python crashes when executing the program on 10.9 #30252のissueを読むと、--with-pythonオプションを付けてビルドすればよいとか、単にupgradeするだけで良いとか嫌な予感がします。

$ brew update && brew upgrade
$ brew remove newt && brew install newt --with-python

newtの最新0.52.18のFormulaを読むと指定したオプションは使われないようです。そもそもPythonがクラッシュするissueの対応なので、OSX版のbyobuは現在不安定な感じです。

/usr/local/Library/Formula/newt.rb
class Newt < Formula
homepage 'https://fedorahosted.org/newt/'
url 'https://fedorahosted.org/releases/n/e/newt/newt-0.52.18.tar.gz'
...
def install
args = ["--prefix=#{prefix}", "--without-tcl"]
args << "--without-python" if build.without? 'python'
...
# don't link to libpython.dylib
# causes https://github.com/Homebrew/homebrew/issues/30252
# https://bugzilla.redhat.com/show_bug.cgi?id=1192286
s.gsub! "`$$pyconfig --ldflags`", '"-undefined dynamic_lookup"'
s.gsub! "`$$pyconfig --libs`", '""'
....

tmux

byobuの場合でもいつもtmuxだけなので直接使うことにします。byobuと一緒にtmuxが入っていますが再インストールしました。

$ brew remove byobu
$ brew remove tmux && brew install tmux
$ tmux -V
tmux 1.9a

最近はあまりカスタマイズしないで使うようにしているので.tmux.confもシンプルです。

  • prifixのキーバインドをC-tに変更
  • コピーモードはC-t sで入る
~/.tmux.conf
set -g prefix C-t
unbind C-b
bind C-t send-prefix
bind s copy-mode

ウインドウの移動ができることを確認します。

  • 前のウィンドウ移動: C-t p
  • 次のウィンドウ移動: C-t n

C-t sでコピーモードに入りスクロール移動ができることを確認します。

  • 上にスクロール移動: Up Arrow
  • 下にスクロール移動: Down Arrow
  • 1画面上にスクロール移動: Shift + fn + Up Arrow
  • 1画面下にスクロール移動: Shift + fn + Down Arrow
  • コピーモードを出る: q

Emacs

OSX YosemiteにデフォルトでインストールされているEmacsは22.1.1と少し古いです。

$ emacs --version
GNU Emacs 22.1.1

HomebrewからEmacsをインストールします。--with-cocoaオプションを付けてGUIのEmacs.appも合わせてビルドします。

$ brew update
$ brew install --with-cocoa emacs

バイナリのインストール先とバージョンを確認します。

$ ls -l /usr/local/bin/emacs
lrwxr-xr-x 1 mshimizu admin 30 3 19 16:43 /usr/local/bin/emacs -> ../Cellar/emacs/24.4/bin/emacs
$ which emacs
/usr/local/bin/emacs
$ emacs --version
GNU Emacs 24.4.1

Emacs.app

Emacs.appを/Applicationsにシムリンクを作ります。

$ brew linkapps emacs
Linking /usr/local/opt/emacs/Emacs.app
Finished linking. Find the links under /Applications.

GUIのEmacs.appの起動を確認します。

$ open /Applications/Emacs.app

Cask

Emacsのパッケージ管理はCaskを使います。OSXなのでHomebrewでもインストールできます。

$ brew install cask
$ cask --version
0.7.2

Caskファイル

~/.emacs.dディレクトリに移動してCaskファイルを作成します。

$ cd ~/.emacs.d/
$ cask init

作成されたCaskファイルにはパッケージがたくさん書いてあります。最初に必要なパッケージだけインストールします。Palletinit-loaderjs2-modeだけ定義します。

~/.emacs.d/Cask
(source gnu)
(source melpa)

(depends-on "pallet")
(depends-on "init-loader")

;; js2-mode
(depends-on "js2-mode")
(depends-on "ac-js2")

elispファイル

init.elの最初でcask.elを読み込みます。Homebrewでインストールした場合は、/usr/local/Cellar/cask/{version}/cask.elにあります。

~/.emacs.d/init.el
(require 'cask "/usr/local/Cellar/cask/0.7.2/cask.el")
(cask-initialize)
(require 'pallet)
(require 'init-loader)
(pallet-mode t)

(setq init-loader-show-log-after-init nil)
(init-loader-load "~/.emacs.d/inits")

init-loaderを使いelispは~/.emacs.d/initsに分割して書きます。

$ mkdir -p ~/.emacs.d/inits

削除キーとヘルプだけキーバインドを変更します。

~/.emacs.d/inits/00-keybindings.el
(define-key global-map "\C-h" 'delete-backward-char)
(define-key global-map "\M-?" 'help-for-help)

CUIがメインでメニューは邪魔なので消しました。

~/.emacs.d/inits/01-menu.el
(menu-bar-mode 0)

ファイルはバックアップを作らなかったり、タブの指定などを少し書きます。

~/.emacs.d/inits/02-files.el
(setq backup-inhibited t)
(setq next-line-add-newlines nil)
(setq-default tab-width 4 indent-tabs-mode nil)

Node.jsのプログラミング用にjs2-modeの設定をします。

~/.emacs.d/inits/03-js2-mode.el
(autoload 'js2-mode "js2-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))
(add-hook 'js2-mode-hook
'(lambda ()
(setq js2-basic-offset 4)))

(add-hook 'js-mode-hook 'js2-minor-mode)
(add-hook 'js2-mode-hook 'ac-js2-mode)

cask install

最終的に以下のようなファイルを作成しました。

$ tree -L 2
.
├── Cask
├── init.el
└── inits
├── 00-keybindings.el
├── 01-menu.el
├── 02-files.el
└── 03-js2-mode.el

cask installコマンドを実行して、Caskに定義したパッケージをインストールします。

$ cask install