Help us understand the problem. What is going on with this article?

OS X 11.11 El Capitanでターミナル環境を整える (Homebrew+zsh+tmux+vim)

More than 3 years have passed since last update.

はじめに

10月頃に思い切ってEl Capitanにしたものの、あまりの不具合の多さに1日でYosemiteにTime machineしたのは苦い思い出。。。
大分不具合も落ち着いた様なので再度El Captain移行をチャレンジした時の記録です。

参考文献にも記載した「ターミナルマルチプレクサ tmux をカスタマイズする」の内容をかなり参考にしています。(ありがとうございます)

完成図

tmux_attach-session.png

こんな感じのターミナルをセットアップします。

環境

  • OS X 11.11 El Capitan 11.11.2
  • ターミナル.app 2.6.1 (361.1)
  • Homebrew 0.9.5
  • zsh 5.2
  • tmux 2.1
  • vim 7.4.979

カラースキームを揃えよう

各ツールでカラースキームを揃えた方が見やすいと思います。
個人的にSolarizedのDarkが気に入っているので、各ツール用に作られたSolarizedなカラースキームで揃えていきます。

環境構築

ターミナルをセットアップ

カラースキーム設定をするだけ。

  1. ターミナルで実行下記を実行してターミナル.app用Solarizedなプロファイルをダウンロード

    ターミナルで実行
    $ curl -o ~/Downloads/Solarized\ Dark.terminal https://raw.githubusercontent.com/tomislav/osx-terminal.app-colors-solarized/master/Solarized%20Dark.terminal && open ~/Downloads/
    
  2. ターミナル上でキーボードのCommand+,を押下して環境設定を開きプロファイルタブをクリック

  3. リスト下部の歯車をクリックしてダウンロードフォルダ内にあるSolarized Dark.terminalを選択して開く
    terminal.app_profile_load.png

  4. プロファイルを読み込み後、デフォルトをクリックしておく
    terminal.app_profile_load2.png

  5. プロファイル名のSolarized Darkをダブルクリックすると、プロファイルが設定された新しいターミナルウインドウが開く

Homebrewをセットアップ

  1. ターミナルでインスト-ルシェルを実行

    ターミナルで実行
    $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
  2. Xcodeもコマンドライン・デベロッパ・ツールも何れもインストールされていない場合、コマンドライン・デベロッパ・ツールのインストール画面が表示されるので、問題なければインストールをクリック
    terminal.app_commandline-developertools.png

  3. Command Line Tools使用許諾契約 が表示されるので、内容を確認して同意するをクリック

  4. インストールが完了したら、ターミナルに戻ってReturnキーを押下

  5. 管理者パスワードの入力を求められるので、入力してReruenキーを押下でインストール開始
    terminal.app_adminpass.png

  6. Installation successful!と表示されたらインストール完了

  7. brew --versionコマンドでバージョン確認

    ターミナルで実行
    $ brew --version
    Homebrew 0.9.5 (git revision e043; last commit 2015-12-28)
    
  8. コマンド類をインストール

    ターミナルで実行
    $ brew update
    $ brew install zsh zsh-completions tmux
    $ brew install vim --override-system-vi
    $ brew install reattach-to-user-namespace # tmuxとOSXのクリップボード共有で利用
    

zshをセットアップ

  1. Homebrewでインストールしたzshを標準シェルへ設定する

    ターミナルで実行
    $ sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells"
    $ chsh -s /usr/local/bin/zsh
    
  2. zsh設定管理ツールoh-my-zshをセットアップ

    ターミナルで実行
    $ curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
    
  3. 個別設定ファイルの設置

    • 設定ファイルは~/.oh-my-zsh/custom/配下に*.zshファイルを置くと自動的にロードされる
    • テーマファイルは~/.oh-my-zsh/theme/配下に*.zsh-themeファイルを置くと自動的にロードされる
    ターミナルで実行
    $ vi ~/.oh-my-zsh/custom/setting.zsh
    
    ~/.oh-my-zsh/custom/setting.zsh
    # ========================
    # oh-my-zsh settings
    # ========================
    
    # 読み込むテーマを指定
    ZSH_THEME="prompt"
    
    # カラーを有効化
    autoload -Uz colors
    colors
    
    # 文字コード
    LANG=ja_JP.UTF-8
    LC_CTYPE=ja_JP.UTF-8
    LANG=ja_JP.UTF-8
    LC_ALL=ja_JP.UTF-8
    
    # ページャー
    PAGER=less
    
    # 履歴の件数
    HISTSIZE=500000
    SAVEHIST=500000
    
    # 重複した履歴を保存しない
    setopt hist_ignore_dups
    
    # 履歴を共有する
    setopt share_history
    
    # 高機能なワイルドカード展開を使用する
    setopt extended_glob
    
    # ウインドウ名の表示
    set -g set-titles on
    set -g set-titles-string '#W'
    
    # 補完
    ## for zsh-completions
    fpath=(/usr/local/share/zsh-completions $fpath)
    
    ## 補完機能を有効にする
    autoload -Uz compinit
    compinit -u
    
    ## 補完で小文字でも大文字にマッチさせる
    zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
    
    ## ../ の後は今いるディレクトリを補完しない
    zstyle ':completion:*' ignore-parents parent pwd ..
    
    ## sudo の後ろでコマンド名を補完する
    zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \
                       /usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin
    
    ## ps コマンドのプロセス名補完
    zstyle ':completion:*:processes' command 'ps x -o pid,s,args'
    
    # 日本語ファイル名を表示可能にする
    setopt print_eight_bit
    
    # '#' 以降をコメントとして扱う
    setopt interactive_comments
    
    # ディレクトリ名だけでcdする
    setopt auto_cd
    
    # 賢いmvを有効にする
    autoload zmv
    
    # エイリアス
    export CLICOLOR=1
    alias vi='vim'
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    alias mkdir='mkdir -p'
    alias sudo='sudo '
    alias ls='ls -G -F'
    
    # C で標準出力をクリップボードにコピーする
    ## mollifier delta blog : http://mollifier.hatenablog.com/entry/20100317/p1
    if which pbcopy >/dev/null 2>&1 ; then
        alias -g C='| pbcopy'
    fi
    
    # Sublime Text 3 エイリアス
    alias subl='/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl'
    
    ターミナルで実行
    $ vi ~/.oh-my-zsh/custom/tmux.zsh
    
    ~/.oh-my-zsh/custom/tmux.zsh
    # tmux用zsh設定ファイル
    ## http://qiita.com/b4b4r07/items/01359e8a3066d1c37edc
    function is_exists() { type "$1" >/dev/null 2>&1; return $?; }
    function is_osx() { [[ $OSTYPE == darwin* ]]; }
    function is_screen_running() { [ ! -z "$STY" ]; }
    function is_tmux_runnning() { [ ! -z "$TMUX" ]; }
    function is_screen_or_tmux_running() { is_screen_running || is_tmux_runnning; }
    function shell_has_started_interactively() { [ ! -z "$PS1" ]; }
    function is_ssh_running() { [ ! -z "$SSH_CONECTION" ]; }
    
    function tmux_automatically_attach_session()
    {
        if is_screen_or_tmux_running; then
            ! is_exists 'tmux' && return 1
    
            if is_tmux_runnning; then
                echo "${fg_bold[red]} _____ __  __ _   ___  __ ${reset_color}"
                echo "${fg_bold[red]}|_   _|  \/  | | | \ \/ / ${reset_color}"
                echo "${fg_bold[red]}  | | | |\/| | | | |\  /  ${reset_color}"
                echo "${fg_bold[red]}  | | | |  | | |_| |/  \  ${reset_color}"
                echo "${fg_bold[red]}  |_| |_|  |_|\___//_/\_\ ${reset_color}"
            elif is_screen_running; then
                echo "This is on screen."
            fi
        else
            if shell_has_started_interactively && ! is_ssh_running; then
                if ! is_exists 'tmux'; then
                    echo 'Error: tmux command not found' 2>&1
                    return 1
                fi
    
                if tmux has-session >/dev/null 2>&1 && tmux list-sessions | grep -qE '.*]$'; then
                    # detached session exists
                    tmux list-sessions
                    echo -n "Tmux: attach? (y/N/num) "
                    read
                    if [[ "$REPLY" =~ ^[Yy]$ ]] || [[ "$REPLY" == '' ]]; then
                        tmux attach-session
                        if [ $? -eq 0 ]; then
                            echo "$(tmux -V) attached session"
                            return 0
                        fi
                    elif [[ "$REPLY" =~ ^[0-9]+$ ]]; then
                        tmux attach -t "$REPLY"
                        if [ $? -eq 0 ]; then
                            echo "$(tmux -V) attached session"
                            return 0
                        fi
                    fi
                fi
    
                if is_osx && is_exists 'reattach-to-user-namespace'; then
                    # on OS X force tmux's default command
                    # to spawn a shell in the user's namespace
                    tmux_config=$(cat $HOME/.tmux.conf <(echo 'set-option -g default-command "reattach-to-user-namespace -l $SHELL"'))
                    tmux -f <(echo "$tmux_config") new-session && echo "$(tmux -V) created new session supported OS X"
                else
                    tmux new-session && echo "tmux created new session"
                fi
            fi
        fi
    }
    tmux_automatically_attach_session
    
    ターミナルで実行
    $ vi ~/.oh-my-zsh/themes/prompt.zsh-theme
    
    ~/.oh-my-zsh/themes/prompt.zsh-theme
    ## Default shell configuration set prompt
    case ${UID} in
    ## root
    0)
    PROMPT="%B%{${fg[magenta]}%}#%{${reset_color}%}%b "
    PROMPT2="%B%{${fg[magenta]}%}#%{${reset_color}%}%b "
    RPROMPT="[%~]"
    SPROMPT="%B%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%}%b "
    #[ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
    PROMPT="[%{${fg[white]}%}${USER}]${PROMPT}"
    ;;
    ## user
    *)
    PROMPT="%{${fg[magenta]}%}%%%{${reset_color}%} "
    PROMPT2="%{${fg[magenta]}%}%%%{${reset_color}%} "
    RPROMPT="[%~]"
    SPROMPT="%{${fg[red]}%}%r is correct? [n,y,a,e]:%{${reset_color}%} "
    #[ -n "${REMOTEHOST}${SSH_CONNECTION}" ] &&
    PROMPT="[%{${fg[white]}%}${USER}]${PROMPT}"
    ;;
    esac
    

tmuxをセットアップ

  1. 設定ファイルを配置

    ターミナルで実行
    $ vi ~/.tmux.conf
    
    ~/.tmux.conf
    # ==========================
    # tmux settings
    # color : https://github.com/seebi/tmux-colors-solarized
    # ==========================
    
    # prefixキーをC-zに変更する
    unbind C-z
    set -g prefix C-z
    
    # デフォルトキーバインドを解除する
    unbind C-b
    
    # キーストロークのディレイを減らす
    set -sg escape-time 1
    
    # ウィンドウのインデックスを1から始める
    set -g base-index 1
    
    # ペインのインデックスを1から始める
    setw -g pane-base-index 1
    
    # 設定ファイルをリロードする
    bind r source-file ~/.tmux.conf \; display "Reloaded!"
    
    # C-z*2でtmux内のプログラムにC-zを送る
    bind C-z send-prefix
    
    # | でペインを縦に分割する
    bind | split-window -h
    
    # - でペインを横に分割する
    bind - split-window -v
    
    # Vimのキーバインドでペインを移動する
    bind h select-pane -L
    bind j select-pane -D
    bind k select-pane -U
    bind l select-pane -R
    bind -r C-h select-window -t :-
    bind -r C-l select-window -t :+
    bind -r Space select-window -t :+
    
    # Vimのキーバインドでペインをリサイズする
    bind -r H resize-pane -L 5
    bind -r J resize-pane -D 5
    bind -r K resize-pane -U 5
    bind -r L resize-pane -R 5
    
    # マウス操作を有効にする
    setw -g mouse
    
    # 256色端末を使用する
    set -g default-terminal "screen-256color"
    
    # ウィンドウリストの色を設定する
    setw -g window-status-fg cyan
    setw -g window-status-bg default
    setw -g window-status-attr dim
    # アクティブなウィンドウを目立たせる
    setw -g window-status-current-fg white
    setw -g window-status-current-bg red
    setw -g window-status-current-attr bright
    
    # ペインボーダーの色を設定する
    set -g pane-border-fg green
    set -g pane-border-bg black
    # アクティブなペインを目立たせる
    set -g pane-active-border-fg white
    set -g pane-active-border-bg yellow
    
    # コマンドラインの色を設定する
    set -g message-fg white
    set -g message-bg black
    set -g message-attr bright
    
    # ステータスバーを設定する
    ## ステータスバーの色を設定する
    set -g status-fg colour255
    set -g status-bg colour238
    ## ステータスバーを下部に表示する
    set -g status-position top
    ## 左右のステータスバーの長さを決定する
    set-option -g status-left-length 40
    set-option -g status-right-length 40
    ## 左パネルを設定する
    set -g status-left "#[fg=colour255,bg=colour241]S:#S #[fg=yellow]W:#I #[fg=cyan]P:#P #[default]"
    ## 右パネルを設定する
    set -g status-right "#[fg=colour255,bg=colour241] Host: #h [%Y-%m-%d(%a) %H:%M] #[default]"
    ## window-status のフォーマットを指定する。
    set-window-option -g window-status-format " #I: #W "
    ## カレントウィンドウの window-status のフォーマットを指定する
    set-window-option -g window-status-current-format "#[fg=colour255,bg=colour27,bold] #I: #W #[default]"
    ## ステータスバーのUTF-8サポートを有効にする
    set -g status-utf8 on
    ## リフレッシュの間隔を設定する(デフォルト 15秒)
    set -g status-interval 1
    ## ウィンドウリストの位置を中心寄せにする
    set -g status-justify centre
    ## ヴィジュアルノーティフィケーションを有効にする
    setw -g monitor-activity on
    set -g visual-activity on
    
    # コピーモードを設定する
    ## viのキーバインドを使用する
    setw -g mode-keys vi
    ## vim <=> tmux 間でクリップボード利用を可能にする
    ### 事前にbrewしておく-> brew install reattach-to-user-namespace
    set-option -g default-command "reattach-to-user-namespace -l $SHELL"
    ## コピーモードの操作をvi風に設定する
    bind-key v copy-mode \; display "Copy mode!"
    bind-key -t vi-copy v begin-selection
    bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
    unbind -t vi-copy Enter
    bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
    ## Prefix+p でペースト
    ## クリップボードにも保存されているので Cmd-v でもペースト可能
    bind-key p paste-buffer
    

vimをセットアップ

  1. フォルダの作成

    ターミナルで実行
    $ mkdir ~/.vim/colors
    $ mkdir ~/.vim/backup
    
  2. vim用Solarizedカラースキームをダウンロード

    ターミナルで実行
    $ git clone https://github.com/altercation/vim-colors-solarized
    $ mv ./vim-colors-solarized/colors/solarized.vim ~/.vim/colors/
    $ rm -rf ./vim-colors-solarized
    
  3. 設定ファイルを配置

    ターミナルで実行
    $ vi ~/.vimrc
    
    ~/.vimrc
    "--------------------
    "" vim settings
    "--------------------
    "" Theme
    syntax enable
    set background=dark
    colorscheme solarized
    
    ""新しい行のインデントを現在行と同じにする
    set autoindent
    
    "バックアップファイルのディレクトリを指定する
    set backupdir=$HOME/.vim/backup
    
    "クリップボードをWindowsと連携する
    set clipboard=unnamed
    
    "vi互換をオフする
    set nocompatible
    
    "スワップファイル用のディレクトリを指定する
    set directory=$HOME/.vim/backup
    
    "タブの代わりに空白文字を指定する
    set expandtab
    
    "タブ幅の設定
    set tabstop=4
    
    "変更中のファイルでも、保存しないで他のファイルを表示する
    set hidden
    
    "インクリメンタルサーチを行う
    set incsearch
    
    "行番号を表示する
    set number
    
    "閉括弧が入力された時、対応する括弧を強調する
    set showmatch
    
    "新しい行を作った時に高度な自動インデントを行う
    set smarttab
    
    "新しい行を作った時に高度な自動インデントを行う
    set smarttab
    
    " grep検索を設定する
    set grepformat=%f:%l:%m,%f:%l%m,%f\ \ %l%m,%f
    set grepprg=grep\ -nh
    
    " 検索結果のハイライトをEsc連打でクリアする
    nnoremap <ESC><ESC> :nohlsearch<CR>
    
    " vimgrepやgrep した際に、cwindowしてしまう
    autocmd QuickFixCmdPost *grep* cwindow
    
    " エスケープシーケンスの表示 tab eol
    set list
    set listchars=tab:▸\ ,eol:¬
    
    " 全角スペースの表示
    function! ZenkakuSpace()
        highlight ZenkakuSpace cterm=reverse ctermfg=DarkGray gui=reverse guifg=DarkGray
    endfunction
    if has('syntax')
        augroup ZenkakuSpace
            autocmd!
            "ZenkakuSpace をカラーファイルで設定するなら、
            "次の行をコメントアウト
            autocmd ColorScheme       * call ZenkakuSpace()
            autocmd VimEnter,WinEnter * match ZenkakuSpace / /
        augroup END
        call ZenkakuSpace()
    endif
    

参考文献

ysaotome
ニッフニッフにしてやんよ。( ・ω・)=つ≡つ
http://sotm.jp
fjct
クラウド・IoT 関連サービスを開発・提供している企業です。(こちらは、富士通クラウドテクノロジーズの有志にて運営しております。)
https://fjct.fujitsu.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away