CodeIQ MAGAZINECodeIQ MAGAZINE

【図解】ゼロから始めるモダンなコマンドライン環境作り #iTerm2 #tmux #zsh

2014.01.24 Category:技術コラム Tag: , , ,

  • 165
  • このエントリーをはてなブックマークに追加
00

コマンドラインは開発において非常に重要なツールのひとつです。

この記事では、開発を効率化するコマンドライン環境作りをステップバイステップで解説します。
by 馬場美由紀 (CodeIQ中の人)

この記事で学ぶこと

この記事では下記の内容を紹介します。

  • コマンドラインの良さ
  • Macでどのターミナルを使うべきか、iTerm2の導入方法、使い方
  • 簡単なコマンドラインの基礎
  • Homebrewの導入方法
  • tmuxの導入方法、使い方
  • Zshとそのカスタマイズ
  • iTerm2とtmuxを組み合わせたタブ整理術

コマンドラインにあまり触れたことがない人でも、コマンドライン環境構築にチャレンジできるように配慮しながら基礎的なところから書きました。一方で、各章を独立して読めるように工夫しています。すでにコマンドラインを使いこなしている人は、必要なところだけかいつまんで読んでいただければと思います。

コマンドラインは自分の財産になる

コマンドラインの強み

GUI(Graphic User Interface)ツールと比べた時のコマンドラインの強みは、早くて軽く、小回りがきき、スクリプト化できることです。GUIツールは画面を描画するためにリソースを必要とします。一方、コマンドには画面がないため、コマンドは少ないリソースで動作します。

コマンドの中には細部にわたって振る舞いを設定できるものがあります。また、UNIXコマンドは入出力がテキストというシンプルな仕組みのため、全く別のコマンド同士を組み合わせることもできます。

コマンドはスクリプト化することができます。作業手順を自動化することに向いています。GUIでは作業記録を取ることは難しいですが、コマンドは履歴をすべてテキストで表現できるため、手順を伝えるときもシンプル、かつ明確に伝えることができます。

無人島に持って行くならIDEよりUNIXツール?

多くのプログラマが活用しているであろうツールとしてIDE(Integrated Development Environment; 統合開発環境)があります。IDEは開発・テスト・ビルド・デプロイなどを自動化してくれる強力なツールです。IDEとコマンドラインツールを比べた時どのような違いがあるのでしょうか?

Diomidis Spinellisは『プログラマが知るべき97のこと』の中でIDEとコマンドラインツールについて、「もし無人島にIDEかUNIXツールのどちらかしか持って行けないとしたら、私は迷うことなくUNIXツールを選びます」と断言して、その理由を述べています。ここでは、彼の主張を表にまとめました。

UNIXツールを選ぶ理由

IDE コマンドラインツール
ターゲット 特定の言語 テキスト形式になっているものは何でも
使えるコマンド 開発した人の考えたコマンド 自分の発想次第で何でもできる
代替手段 特定の作業をするための方法があらかじめ決まっていて、他の方法を使うことができない 自分の工夫次第で同じ作業をより効率的に行うことが可能

そして、彼は「既存のツールがどれも自分の希望に合わないという場合も、UNIXツールなら簡単に拡張できます」と結論付けています。この結論について、私も同意します。

GUIツールとコマンドラインツール

この記事を読んでいる人はすでに多くのGUIツールを使いこなしていることでしょう。GUIツールにも優れたツールが多くあります。そうしたツールに加えて、コマンドラインツールを使えるようになることはエンジニアとして大きな強みとなります。GUIツールでは小回りが効きにくいところを、コマンドラインツールでカバーすることもできるでしょう。全部GUIで済ませようとか、全部コマンドラインツールでやろうとせず、必要に応じてGUIツールとコマンドラインツールどちらも使っていくことが一番いいのかなと思います。

GUIツールコマンドラインツールの比較

GUIツール コマンドラインツール
簡単さ 直感的に操作できる 覚えるのが大変
早くて軽い リソースを多く必要とするものもある 省リソース
小回りがきく 制限的 組み合わせ自由
スクリプト化 しにくい しやすい

普段からコマンドに触れておくで「黒い画面」アレルギーを解消

コマンドラインツールの弱点は、初心者が覚えるまで時間がかかるということです。「黒い画面」という言葉を聞いたことがあるでしょうか? あまりコマンドラインに馴染んでいない人が、ターミナルのことを指すときに使う言葉だそうです。私も含め私の知り合いでターミナルを使っている人の多くはなぜか背景を黒にしています。「黒い画面」を最初に思いついた人は、ターミナルの見た目からつけたのでしょう。加えて、「黒」という言葉が「閉鎖的」「敷居が高い」「難しい」といった印象を喚起させて、ターミナルのことを的確に表現した言葉だと感心しています。

私自身もコマンドラインを使う前は、「難しい」「敷居が高い」「ギークの閉鎖的なツール」というイメージがあり、食わず嫌いしていました。「黒い画面」アレルギーと言ってもいいでしょう。仕事でLinuxサーバを保守しないといけなくなると、必要にかられて使うようになりました。使っていくと少しづつ慣れていき、自分のやり方に合わせてコマンドラインツールをカスタマイズしていく中で、無くてはならないものになりました。

この記事を読んでいる人の中で、「黒い画面」アレルギーを感じている人は、とにかくちょっとずつでもコマンドラインツールを使ってみるといいかと思います。知っている範囲で使うだけでも十分です。普段からコマンドに触れていく。その中で便利さに気づき、「黒い画面」に親しみを持てるようになっていくと思います。

コマンドラインは自分の財産になる

コマンドラインの強みは、早くて軽く、小回りがきき、スクリプト化できることでした。コマンドラインは使えば使うほど、便利になります。作業を自動化するスクリプトを書くこともできます。積み重ねていけば、コマンドラインは着実に自分の財産になっていきます。

コマンドラインを敬遠していた人は、この機会に試してみてはどうでしょうか?最初は小難しいかもしれませんが、やってみる価値は十分にあると思います。この記事では、全くコマンドを触った事ない人でもわかるように、出来る限り順を追って説明していきます。

iTerm2を使おう

iTerm2とは?

iTerm2(アイタームツー)はMac OS Xで動作するターミナルエミュレータです。iTerm2はGPLライセンスで公開されています。Macには付属のターミナルアプリがありますが、これと比べると、

  • 画面分割できる
  • ショートカットキーでターミナルを表示できる
  • キーワード検索ですべてハイライトする機能がある
  • ペースト履歴
  • 設定が細かくできる

など、かなり強化されているアプリと言えます。

なぜ、Mac?

開発者のOSといえば、もちろんWindowsやLinuxなど様々あると思いますが、オープンソースカンファレンスやプログラマのハッカソンなどのイベントに参加すると、Macユーザの多さに驚きます。Macを使っているエンジニアに聞いてみると、「iOSのアプリを開発したい」「Ruby, Python, PHP, Perl, Apacheがデフォルトで入っていて、開発環境としてすぐに使える」「多くのマシンから選ばなくていい、ラインナップが少ないので悩まなくて済む」「UIが気持ち良い」といった意見の他に「UNIXベースなのでUNIXのコマンドラインの資産が活用できるので開発にもってこい」という動機も聞かれました。

One Developer’s Switch from PC to Mac | Nettuts+の筆者のAndrew Burgessは、自身がWindowsからMacに移行した理由のひとつに「Unixであること」を挙げています。MacはパワフルなGUIを持つOSでありながら、UNIXとして扱うことができるバランスのとれたOSです。そういった点で、モダンなコマンドライン環境を作る上で、ひとつの選択肢となるのではないでしょうか。

iTerm2をインストールする

ここではiTerm2の導入方法を説明します。まず、iTerm2のサイトに行き、Downloadから入手します。普通のアプリと同じように /Applications に配置すればインストール完了です。

iTerm2を起動したら、メニューバーから「Check For Update」を選んび最新版にアップデートしてください。場合によっては、最新バージョンに一発でアップデートされないこともあるので、最新になるまで「Check For Update」からアップデートを繰り返す必要があります。

この記事で扱うiTerm2のバージョンは「Build 1.0.0.20140112」になります。

さっそくiTerm2でコマンドラインに触れてみよう

iTerm2の準備がととのったので、さっそくコマンドラインに触れてみようと思います。コマンドと一言に言っても様々なものがありますが、ここではファイルの作成・ディレクトリの作成などファイル操作に少しだけ触れてみます。

まず、デスクトップに移動してみましょう。ディレクトリの移動には cd コマンドを使います。cdはChange Directoryの略です。コマンドラインには自動補完という機能があります。cd Des のように途中まで入力してから tab キーを押すと残りの文字を補完してくれます。

コマンドの実行はリターンキーを押します。

次に現在どのディレクトリにいるのか確認してみます。この作業には pwd コマンドを使います。pwd と入力してリターンキーを押せば、現在のディレクトリが表示されます。ちなみに、この pwd は print working directory の略です。

スクリーンに文字がいっぱいになってきて、ごちゃごちゃしてきたら Ctrl L を押してみましょう。すると、今までの文字が上に送られ、画面がスッキリします。

それでは、デスクトップにファイルを作ってみます。ファイルを作る方法はいくつかありますが、ここでは touch コマンドを使います。本来このコマンドは「ファイルのタイムスタンプを変更する」ものですが、指定したファイル名が存在しないとき、ファイルを作ってくれるのです。

touch my-first-file.txt

コマンドを実行するとデスクトップにファイルができているはずです。

今度はディレクトリを作ってみましょう。ディレクトリを作るには mkdir コマンドを使います。名前からなんとなく察しがつくと思いますが、make directoryの略です。

mkdir my-first-dir

実行すると、デスクトップにディレクトリができていると思います。

コマンドラインで、ファイルやディレクトリを確認するときは、ls コマンドを使います。-l の部分は、詳しい情報を表示するというオプションになります。

スクリーンに文字を出力するには echo コマンドを使います。

echo "Hello World"

過去に実行したコマンドは「↑」矢印キーを押すと補完されます。

ここがUNIXコマンドの面白いところですが、コマンドの後ろに > をつけるだけでコマンドの出力結果をファイルに書き出すことができます。下記のコマンドを実行すると、さきほど作った my-first-file.txt に「Hello World」を書き込みます。

echo "Hello World" > my-first-file.txt

エディタでこのファイルを開いてみれば、Hello Worldと書き込まれているのを確認できますが、コマンドラインでも簡単に確認することができます。cat コマンドです。

cat my-first-file.txt

以上が簡単なコマンドラインの使い方でした。もっとコマンドを知りたい方は、「Unix コマンド」などで検索すると、数多くの情報が出てきます。

iTerm2の便利なタブ機能とウィンドウ分割機能を試そう

ここからはiTerm2の便利な機能を試してみましょう。数ある便利機能の中に、タブやウィンドウ分割など画面操作系の機能があります。

タブ機能

Command + T でタブを開くことができます。

ウィンドウ分割機能

Command + D でウィンドウ分割を分割できます。

分割した画面の移動は Command + [ または Command + ] でできます。

画面は上下にも分割できます。上下分割は Command + Shift + D です。

こうした画面分割機能は、ログを見ながら作業するなど「ながら作業」をするときに便利です。

Apacheのログを見ながらコマンドを入力する例

ちなみにタブやウィンドウを閉じるときは Command + W で閉じることができます。また、exit コマンドを実行しても同様に閉じることができます。

どこにいてもサッとターミナルを出し入れできるようにしよう!

開発しているとChromeで調べ物をしたり、Airmailで連絡を取り合ったり、Evernoteに備忘録を書いたりと、いろんなアプリを行ったり来たりします。いつでも簡単にターミナルに戻ってこれるようにしていないと、開発効率に悪影響が出てしまいます。iTerm2には、ショートカットキーでターミナルを表示できる機能があります。ここではその設定方法を見ていきましょう。

まず、iTerm2のメニューから「Preferences」を開きます。

Profileタブを開き、左下の「+」をクリックしてください。新規プロフィールが作成されます。プロフィールは好きに決めてしまって構いません。

次に、今作ったプロフィールをデフォルトにします。画面下の「Other Actions」から「Set as Default」を選択します。作ったプロフィール名の左に星アイコンが表示されているのを確認してください。

Windowタブを開き、StyleとRowsを設定します。Styleは「Top of Screen」を選択します。これは、モニタの上半分をターミナル表示領域として使うという設定になります。Rowsはターミナルの行数です。

最後にKeysタブを開いて、「Show/hide iTerm2 with a system-wide hotkey」にチェックを入れ、ホットキーを設定します。ここで指定したホットキーでいつでもiTerm2に帰ってこれるようになるわけです。

設定を反映するために、一度iTerm2を終了し、再度開きます。

開いてみると、モニタの上半分からiTerm2が表示された状態になっているはずです。

試しに、先ほどの手順で設定したホットキーを押してみてください。iTerm2のターミナルが表示されたり隠れたりできていれば設定OKです。もし機能してない場合は、他のショートカットキーとぶつかっている可能性があります。

HomebrewでUNIXの資産を享受しよう!

Homebrew(ホームブルー)とは、MacOSX用のパッケージ管理システムです。これを利用すると、Macにはなぜか入ってないコマンドを簡単にインストールすることができます。Linuxを使ったことある人なら、apt-getyum のMac版と言ったらわかるかと思います。

先ほども説明しましたが、Mac OS XはUNIXで作らているので、treewget などUNIXではおなじみのコマンドの資産を活用することができます。Homebrewをインストールして、UNIXコマンドをいつでも活用できる環境を整えておきましょう。

Homebrewのトップページ

Homebrewをインストールする

Xcodeをインストールしておく

Homebrewを使うには、Xcodeを入れておく必要があります。まだ入れてない人は、AppStoreアプリからインストールすることができます。

Xcodeをインストールしたら、Xcodeの「Preferences」から「Downloads」の中の「Command Line Tools」をダウンロードしておいてください。
※ MacOS X Mavericks の場合はXcodeではなく、ターミナルで「xcode-select –install」を実行すると「Command Line Tools」がインストールできます。

「Command Line Tools」がダウンロードされたら、Homebrewをインストールする環境が整ったことになります。

Homebrewをダウンロード&インストールする

Homebrewのサイトに行き、「Homebrewをインストール」のところに書いてあるコマンドをコピーして、ターミナルに貼り付けて実行します。


実行するとインストールをしていいかの確認が出るので、ENTERを押して続行します。

途中でパスワードを入力する必要があるので、自分のパスワードを入力してENTERを押します。

インストールを開始すると、必要なものをダウンロードしてきて配置してくれます。

インストールが完了したら、brew doctor コマンドでHomebrewに問題がないかチェックしてください。

場合によっては下記の画像のようにWarningが出ることがあります。その場合は、Warningを解消しておくことをおすすめします。

tmuxを使えばSSHが切れても大丈夫!

tmuxとは

tmuxはターミナルを多重化するツールです。難しく書きましたが、平たく言うと、ターミナルの中でターミナルを開くツールと考えるといいかもしれません。tmuxを使うと、ひとつの画面で複数の画面を持てるようになります。たとえば、tmuxが入っているサーバであれば、一つのSSH接続で、複数の画面を持てるということです。

また、tmux内の画面はバックグランドで動作したままにできます。つまり、SSHの接続が切れても、ログインしなおすと再開できたり、作業を中断して作業を再開が簡単にできるようになるといったメリットがあります。長時間かかる処理をサーバで行う場合などに、tmuxでそのコマンドを実行しておけば、SSHを切断して、終わった頃にまた見に来るなんてこともできます。もちろん、Macでもtmuxを普段から使っておけば、たとえiTerm2がクラッシュしても、ターミナルはバックグランドで存続し続けるので、作業の再開が容易になります。

tmuxをインストールする

tmuxをインストールするには先ほど導入したHomebrewから行うのが簡単です。

brew install tmux

デタッチ・アタッチ

tmuxの売りはターミナルを閉じずに作業を中断できることです。つまり、擬似ターミナルをバックグランドで動かしっぱなしにできるということです。バックグランドで動かしたままターミナルから抜けることを「デタッチ」と言います。逆にバックグランドで動かしていたターミナルを開き直すことを「アタッチ」と言います。では、「デタッチ」と「アタッチ」を実際にやってみましょう。

tmux コマンドを実行すると、tmuxの擬似ターミナルが立ち上がります。

擬似ターミナルを下記図はアタッチした状態です。ここで、好きなコマンドを打ってみてください。その後、Ctrl b を押してから d を押してデタッチします。

デタッチすると、もとのターミナルに戻ってきます。ここで tmux attach と打ってアタッチします。このコマンドは直近にデタッチしたターミナルにアタッチするという命令になります。

アタッチすると、先ほど入力したコマンドがそのまま残っていると思います。

Session・Window・Paneの概念

tmuxの概念として、Session・Window・Paneをおさえておく必要があります。

  • Session: 疑似端末の集合。1つ以上のWindowを持つ。tmuxにおいて、複数のSessionを作ることができる。
  • Window: 1画面のこと。複数のPaneに画面分割できる。(iTerm2でのタブにあたる)
  • Pane: 画面分割された1画面のこと。

Session・Window・Paneの集合関係

画面で見た時のSession・Window・Pane

実際に操作して、Session・Window・Paneがそれぞれどのように現れるか見てみましょう。

Windowを操作する

Ctrl b を押してから c を押すと新しいWindowが開きます。

Ctrl b を押してから n を押すとWindowが切り替わります。

なお、開いたWindowは通常のターミナル同様に exit コマンドで閉じることができます。

Paneを操作する

Ctrl b を押して、% キーを押すと、Windowが左右のPaneに分割されます

さらに、Ctrl bを押して " キーを押すと、Windowが上下のPaneに分割されます

PaneもWindow同様に exit コマンドで閉じることができます。

Sessionを操作する

tmux new -s セッション名 で名前をつけてSessionを作ることができます。

セッション名は画面左下に表示されます。

存在しているSessionの一覧を調べるには、tmux ls コマンドを使います。

Sessionは画面としては見えませんが、Windowを束ねるときに便利です。たとえば、プロジェクトごとにSessionを作ったり、ログ系のWindowをSessionでまとめたりとグルーピングするときに活用するといいかと思います。

tmuxの見た目をカスタマイズしよう

ホームディレクトリに移動します。この ~ (チルダ)はユーザのホームディレクトリのことです。Macであれば /Users/あなたのユーザ名/ を指します。

cd ~

ホームディレクトリにtmuxの設定ファイルを作ります。

touch .tmux.conf

作った設定ファイルをエディタで開きます。Macのアプリで開くには、open -a アプリ名 ファイル名 といったコマンドを実行します。open コマンドはマック固有のコマンドです。今回は、CotEditorで開きます。

open -a CotEditor .tmux.conf

下記の設定をコピー・ペーストして保存してください。

.tmux.confの内容

# ----------------- #
# ウィンドウの振る舞い #
# ----------------- #

## ウィンドウ番号1から開始する
set-option -g base-index 1

# マウスでスクロールできるようにする
set-window-option -g mode-mouse on
# これを有効にすると、MacでCommand+Cなどができなくなるが、
# Optionを押しながら範囲選択すると、コピーできる。

# ウィンドウ(タブ)を閉じた時、ウインドウ番号を付番をしなおす
set-option -g renumber-windows on

# ------------------- #
# ステータスバーの見た目 #
# ------------------- #

# 色コード: http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html

# 256色サポート
set-option -g default-terminal "xterm"

# ステータスバーの色
set -g status-fg colour253
set -g status-bg colour237

# 非アクティブなウィンドウの色
set-window-option -g window-status-fg default
set-window-option -g window-status-bg default

# アクティブなウィンドウの色
set-window-option -g window-status-current-fg colour16
set-window-option -g window-status-current-bg colour178

# ステータスバーの位置    
set-option -g status-position bottom

# ステータスバー左隅に出すもの
set -g status-left '#[fg=colour32, bold]#S'

# ステータスバー右隅に出すもの
set -g status-right ''

設定について詳しく知りたい人は Tmux – ArchWiki をご覧ください。

tmuxを起動しなおすと、見た目が若干変わっていることに気がつくと思います。

tmuxに入った状態で設定を再読み込みする場合は、下記のコマンドを実行するとすぐに反映されます。

tmux source-file .tmux.conf

tmuxで覚えておきたいキーバインド

  • Ctrl b d : デタッチする
  • Ctrl b c : 新しいWindowを作る
  • Ctrl b n : 次のWindowへ移動する
  • Ctrl b p : 前のWindowへ移動する
  • Ctrl b , : Windowに名前をつける
  • Ctrl b % : Windowを左右のPaneに分割する
  • Ctrl b : Windowを上下のPaneに分割する
  • Ctrl b o : Pane間を移動する
  • Ctrl b ? : ヘルプを表示する

サーバにもtmuxを入れておこう

今回はMacでtmuxをインストールする手順を紹介しましたが、SSHの接続が切れてもサーバのターミナルが終了しないようにするには、サーバにtmuxをインストールしておく必要があります。SSH切断に備えておきたい人や、サーバでの作業が多い人は、あらかじめtmuxをインストールしておくといいでしょう。

iTerm2とtmuxを統合して、もっと使いやすく!

tmuxのキーバインドを使えば、十分に操作することはできますが、もう少しキーのタイプ数を減らす工夫をしてみましょう。iTerm2では、ショートカットキーを設定できるので、その機能をつかってtmuxを操作できるします。今回作るショートカットキーは以下になります。

  • Ctrl + Shift + [, ]: Window移動
  • Ctrl + N: Windowを作る
  • Ctrl + T: Windowを作る
  • Ctrl + W: Windowを閉じる
  • Ctrl + Shift + %: Windowを分割する
  • Ctrl + ]: Pane移動

まず、iTerm2のPreferencesのProfilesタブを開き、自分のプロフィールを選択し、Keysタブを開きます。Keysタブの「+」ボタンを押して一つひとつショートカットキーを設定していきます。

Actionは「Send Hex Code」を選択してください。Hex Codeの値については「ショートカットキーとHex Codeの対応表」を参照してください。

キーとHex Codeの対応表

キー Hex Code 意味
Ctrl b 0x2 tmuxのバインドキー
n 0x6e 次のWindowに移動
p 0x70 前のWindowに移動
c 0x63 新しいWindowを作る
k 0x6b Windowを強制終了
% 0x25 Windowを左右分割
o 0x6f 次のPaneに移動

ショートカットキーとHex Codeの対応表

Keybord Shourcut Hex Code 動作 tmux のコマンド
Ctrl Shift ] 0x2 0x6e 次のWindowに移動 Ctrl b n
Ctrl Shift [ 0x2 0x70 前のWindowに移動 Ctrl b p
Ctrl N 0x2 0x63 新しいWindowを開く Ctrl b c
Ctrl T 0x2 0x63 同上 同上
Ctrl W 0x2 0x6b Windowを閉じる Ctrl b k (設定ファイルにて定義)
Ctrl Shift % 0x2 0x25 Windowを左右分割 Ctrl b %
Ctrl ] 0x2 0x6f 次のPaneに移動 Ctrl b o

ショートカットキーが追加されると、ショートカットキーのリストに表示されるので、確認してください。

以上の設定で、ショートカットキーを押すだけでtmuxのWindowを切り替えたりできるようになったかと思います。

Zshを入れてさらに快適なターミナル環境を!

シェルとは?

シェル(Shell)はUNIX/Linuxなどのカーネルにアクセスするためのインターフェイスをユーザに提供するソフトウェアのことです。ユーザは、このシェルを通してカーネルに命令を下したりすることができます。シェルという名前は、カーネルを包み込むことに由来するそうです。

Zshとは?

Zshはシェルのひとつです。MacもUNIX系で、いくつかシェルがデフォルトで入っています。Zshもデフォルトで同梱されており、Macユーザであればすぐに使うことができます。

Macにデフォルトで同梱されているシェル:

  • bash
  • csh
  • ksh
  • sh
  • tcsh
  • zsh

いくつか選択肢がある中で、Zshを私がおすすめする理由は、カスタマイズが細かくできるという点、補完が優れているという点です。jaguardesignstudioさんのスライド『Why Zsh is Cooler than Your Shell』で60枚に渡ってZshをおすすめする理由が書いてあるので、詳しい紹介はこちらに譲りたいと思います。

ちなみに、今までの解説画像で使っていたシェルはbashです。ここらはzshを使って解説していきます。

Zshをカスタマイズして便利さを引き出そう

Zshの設定は ~/.zshrc に設定ファイルを作って、そこに書いていきます。ちなみに、ファイル名が特殊ですが、UNIX/Linuxではプログラムの初期化ファイルをドットで始める習慣があります。このようなドット始まりのファイルを「ドットファイル」といい、ls コマンドでファイル一覧を出力した際に、デフォルトで非表示になります。ls -a オプションをつけることで、ドットファイルを表示することができます。 また、拡張子がありませんが、これもUNIXでファイルの種類をドットを使わずに表現する慣習があるためです。

Unix系OSではファイル名の終端でファイルの種類を表す慣習があり、一般にはsuffixと呼ぶが、必ずしもピリオドで区切るとは限らない。カンマで区切る「,v」や、特に区切り文字使わずに「-」や「~」や「rc」を付けるケースもある。
拡張子 – Wikipedia

touch コマンドで ~/.zshrc ファイルを作ります。

touch ~/.zshrc

CotEditorで開きます。

open -a CotEditor .zshrc

.zshrc には下記の設定をコピー・ペーストして保存してください。

この設定の詳細はコメントでも記してありますが、特徴をまとめると以下になります。

  • ディレクトリを移動すると自動で ls -1 する → ls する手間が省ける
  • 現在のディレクトリを表示する → pwd する手間を省ける
  • コマンドの実行時刻を表示 → 経過時間などの目安になる
  • Git管理下のディレクトリにいるときブランチ名を表示 → 現在のブランチがわかりやすい
  • コマンドの成功・失敗に応じて顔文字が変わる

.zshrcの中身

# -------------------------------------
# 環境変数
# -------------------------------------

# SSHで接続した先で日本語が使えるようにする
export LC_CTYPE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# エディタ
export EDITOR=/usr/local/bin/vim

# ページャ
export PAGER=/usr/local/bin/vimpager
export MANPAGER=/usr/local/bin/vimpager


# -------------------------------------
# zshのオプション
# -------------------------------------

## 補完機能の強化
autoload -U compinit
compinit

## 入力しているコマンド名が間違っている場合にもしかして:を出す。
setopt correct

# ビープを鳴らさない
setopt nobeep

## 色を使う
setopt prompt_subst

## ^Dでログアウトしない。
setopt ignoreeof

## バックグラウンドジョブが終了したらすぐに知らせる。
setopt no_tify

## 直前と同じコマンドをヒストリに追加しない
setopt hist_ignore_dups

# 補完
## タブによるファイルの順番切り替えをしない
unsetopt auto_menu

# cd -[tab]で過去のディレクトリにひとっ飛びできるようにする
setopt auto_pushd

# ディレクトリ名を入力するだけでcdできるようにする
setopt auto_cd

# -------------------------------------
# パス
# -------------------------------------

# 重複する要素を自動的に削除
typeset -U path cdpath fpath manpath

path=(
    $HOME/bin(N-/)
    /usr/local/bin(N-/)
    /usr/local/sbin(N-/)
    $path
)

# -------------------------------------
# プロンプト
# -------------------------------------

autoload -U promptinit; promptinit
autoload -Uz colors; colors
autoload -Uz vcs_info
autoload -Uz is-at-least

# begin VCS
zstyle ":vcs_info:*" enable git svn hg bzr
zstyle ":vcs_info:*" formats "(%s)-[%b]"
zstyle ":vcs_info:*" actionformats "(%s)-[%b|%a]"
zstyle ":vcs_info:(svn|bzr):*" branchformat "%b:r%r"
zstyle ":vcs_info:bzr:*" use-simple true

zstyle ":vcs_info:*" max-exports 6

if is-at-least 4.3.10; then
    zstyle ":vcs_info:git:*" check-for-changes true # commitしていないのをチェック
    zstyle ":vcs_info:git:*" stagedstr "<S>"
    zstyle ":vcs_info:git:*" unstagedstr "<U>"
    zstyle ":vcs_info:git:*" formats "(%b) %c%u"
    zstyle ":vcs_info:git:*" actionformats "(%s)-[%b|%a] %c%u"
fi

function vcs_prompt_info() {
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && echo -n " %{$fg[yellow]%}$vcs_info_msg_0_%f"
}
# end VCS

OK="^_^ "
NG="X_X "

PROMPT=""
PROMPT+="%(?.%F{green}$OK%f.%F{red}$NG%f) "
PROMPT+="%F{blue}%~%f"
PROMPT+="\$(vcs_prompt_info)"
PROMPT+="
"
PROMPT+="%% "

RPROMPT="[%*]"

# -------------------------------------
# エイリアス
# -------------------------------------

# -n 行数表示, -I バイナリファイル無視, svn関係のファイルを無視
alias grep="grep --color -n -I --exclude='*.svn-*' --exclude='entries' --exclude='*/cache/*'"

# ls
alias ls="ls -G" # color for darwin
alias l="ls -la"
alias la="ls -la"
alias l1="ls -1"

# tree
alias tree="tree -NC" # N: 文字化け対策, C:色をつける


# -------------------------------------
# キーバインド
# -------------------------------------

bindkey -e

function cdup() {
   echo
   cd ..
   zle reset-prompt
}
zle -N cdup
bindkey '^K' cdup

bindkey "^R" history-incremental-search-backward

# -------------------------------------
# その他
# -------------------------------------

# cdしたあとで、自動的に ls する
function chpwd() { ls -1 }

# iTerm2のタブ名を変更する
function title {
    echo -ne "\033]0;"$*"\007"
}

設定を保存したら、zshを起動するために zsh コマンドを実行します。

zshが起動すると見た目が一新されていることに気づくと思います。

デフォルトのbashと今回カスタムしたzshを並べてみました。デフォルトのbashに比べると、情報量も多く垢抜けた感じになります。

iTerm2を起動するたびに zsh を入力するのは面倒です。なので、自分のデフォルトシェルを zsh に変えてしまいましょう。デフォルトシェルを変更するには下記コマンドを実行します。パスワードを聞かれるので、自分のMacのパスワードを入力してください。

chsh -s /bin/zsh

以上で、zsh の便利さを引き出すための設定が完了です。zshは設定が柔軟で、さまざまな便利な設定がGitHubなどウェブ上で公開されています。他の人がどんな設定にしているか見てみると面白いかもしれません。

こうやってタブを整理しています

ここまではiTerm2やtmuxの使い方や設定方法について解説してきました。ここからは、私が普段行っているタブの整理術について紹介します。複数のプロジェクトや複数のサーバを受け持っていると、並行で作業するときにタブがどんどん増えていき、ごちゃごちゃしてきます。そこで、私は「画面ごとにひとつだけ役割を与える」ようにしてタブを整理するように心がけています。具体的には、下記のようなルールがあります。

  • ローカル環境の場合
    • 1プロジェクト = 1iTermタブ = 1tmux Session
    • 複数タブが必要な場合は、iTermのタブではなく、tmuxのWindowを複数開く
  • SSH接続の場合
    • 1SSH接続 = 1iTermタブ = 1tmux Session(サーバ側のtmux)
    • 複数タブが必要な場合は、iTermのタブではなく、tmuxのWindowを複数開く
  • iTermのタブに分かりやすい名前をつける
  • tmuxのWindow名に分かりやすい名前をつける

例えば、ローカルでプロジェクトAとプロジェクトBをターミナルで扱う場合、下記のようなタブ構成にしています。tmuxのWindowはいつも決まった形があるというよりは、開発の状況に合わせて増やしたり減らしたりします。

├── その他 : iTermタブ … どのプロジェクトとも関係ない雑多なコマンドを打つところ
├── プロジェクトA : iTermタブ、tmuxのSession
│   ├── Symfony2コンソール : tmuxのWindow
│   ├── ログ表示用 : tmuxのWindow
│   └── ソースコード : tmuxのWindow
└── プロジェクトB : iTermタブ、tmuxのSession
    ├── Selenium2 : tmuxのWindow
    ├── vagrant : tmuxのWindow
    ├── ログ出力用 : tmuxのWindow
    ├── ソースコード : tmuxのWindow
    └── テストコード : tmuxのWindow

iTerm2のタブ名を変更するために、先ほどの .zshrc にコマンドを定義してあります。設定ファイルの一番最後の title コマンドがそれです。title てすと のようにコマンドを打つだけで、iTerm2のタブ名を変更できます。なお、この関数は tmux に入ってしまうとうまく動作しないので注意してください。

iTerm2のタブ名を変更するコマンド

# iTerm2のタブ名を変更する
function title {
    echo -ne "\033]0;"$*"\007"
}

iTerm2のタブ名を変更するコマンドを実行した様子

iTerm2のデフォルト設定では現在のジョブ名がタブに出ますが、不要な人は設定で非表示にすることもできます。

複数タブを開いてタブ名をつけた状態の図

tmuxのWindow名は Ctrl b を押した後に , (カンマ) キーを押すとWindow名変更モードになります。

Window名を頻繁に設定するようになると、ショートカットキーが欲しくなると思います。その場合は、iTerm2とtmuxを統合のところで解説したのと同様に、ショートカットキーを設定することもできます。

Keybord Shourcut Hex Code 動作 tmux のコマンド
Ctrl , 0x2 0x2c Window名を変更する Ctrl b ,

iTerm2とtmuxでそれぞれタブ名・Window名を設定した状態の図

以上が、私が普段おこなっているタブの整理術でした。

まとめ

この記事では、コマンドラインを使うことの良さから始まり、MacでiTerm2を導入する方法とその使い方、シェルの簡単な操作方法、Homebrewの導入、tmuxの導入と使い方、iTermとtmuxの統合方法、zshのカスタマイズ、そしてタブの整理術について具体的に解説してきました。コマンドラインはエンジニアリングを効率化したり生産性を向上させたり楽しくしたりするツールだと思います。快適な環境を作っておくことで、ますますエンジニアリングがいいものになっていくでしょう。今回はほんの一部に触れただけですので、「もっといいものはないか?」と探求してみるといいのではないかと思います。

今回、時間の関係で紹介できなかったものとして、tmuxinatorがあります。これはtmuxを更に便利にするツールとして、tmuxのSession開始を自動化できるツールです。プロジェクトごとに決まったタブを開くときに使うと便利かと思います。また、Homebrewのリポジトリには2,600以上のコマンドが登録されています。この記事では、それらひとつひとつのコマンドを紹介できませんでした。次の機会に、tmuxinatorの使い方や、Homebrewでインストール可能なコマンドのうち、私が普段使っているコマンドや便利なコマンドを紹介できたらと思います。

Linux/Unixコマンドを駆使して、ミッションをクリアしよう!

野澤秀仁さんから、Linux/Unixコマンドに関する問題が出題中です。
基礎的なファイル操作がコマンドでできるかを評価する問題です。ぜひ挑戦してみてくださいね!

執筆者プロフィール 野澤 秀仁
自動UIテストを支援するTaaS「ShouldBee」の開発者。「エンジニアリングは創造的で楽しくあるべき」のために、テスト・運用など退屈な作業の自動化やドメイン駆動設計を実施する。
twitter: @suin
ブログ: http://blog.craftsman-software.com/

CodeIQコード銀行にあなたのコードを預けてみませんか?

  • CodeIQコード銀行ではあなたのコードを財産と考えます。
  • お預かりいただいたコードは、CodeIQコード銀行がしっかり評価し、フィードバックいたします。
  • 当コード銀行にお預けいただいたコードは、企業がみてスカウトをかける可能性があります。
  • 転職したい方や将来転職することを考えている方で、今の自分のスキルレベルを知りたい方はぜひ挑戦してみてください。
  • 企業からスカウトがきたら困る人は挑戦しないでください。

興味を持った方はこちらからチャレンジを!

  • 165
  • このエントリーをはてなブックマークに追加

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ