キモく生きよう

自己顕示欲の塊がキモくても個性出していくためのブログ

【初心者向け】Macにモダンなコマンドライン環境を構築【zsh&Prezto編】

MaczshとPreztoを導入してコマンドラインを快適にしようという記事です。

zshの記事なのにアイキャッチ画像がなんでVimやねんってツッコミはなしでお願いします。 【準備編】のアイキャッチがターミナルだったので、じゃあこっちはもうVimでええかーという感じです。

まだCommand Line ToolsとHomebrewが入っていない方はこちらを先に見てください。

kinchiki-it.hatenablog.jp


Vimのカスタマイズ

f:id:kinchiki:20160714033949p:plain


ここからは多少ファイルの編集もしていきます。 僕はCUI環境(GUI環境でも)のエディタにVimを使っているため、Vimで説明をしていきます。 Emacs派の人はもちろんここを飛ばしてください。

Vimってなに?」って人向けの簡単な説明ですが、VimEmacsと双璧をなす二大テキストエディタの一つです。 こんな言葉があります。

テキストエディタには三種類しか存在しない。 "Vim" か "Emacs" か "それ以外か" だ

この言葉は今僕が適当に考えました。 でも二大エディタっていうのはガチです。 SublimeText や AtomVisual Studio Code といったクロスプラットフォームのイケてるエディタもありますが、CUIでもGUIでも動く高速で超高機能な Vim と Emascが今後もずっと最強のエディタの座を血で血で争うことでしょう。


まずはVimの設定ファイルをちょっと編集しましょう。 ターミナルで

$ vim ~/.vimrc

と入力します。 するとVim~/.vimrc というファイルが開き、もしなかったら新規作成されます。 ~ (チルダと読みます)はUnix系でホームディレクトリ(Macの場合 /Users/<ユーザー名> )のことです。

.vimrcVimの設定ファイルでシェルの設定ファイルとかはファイル名の末尾に rc が付きます。 先頭の . は隠しファイルや隠しディレクトリを表しており、Finderや ls では表示されません。 ls は隠しファイルも表示するaオプションを付けた ls -a 実行すれば表示されます。

Finderに隠しファイルを表示したい場合は以下のサイトとかを参考にしてください。

pc-karuma.net


もしカレントディレクトリ(今いるディレクトリ)がホームディレクトリならパスの指定はせずファイル名だけでいいです。 カレントディレクトリすら分からない人は

$ pwd

というコマンドを入力してください。 そうするとカレントディレクトリの絶対パスが表示されます。 ホームディレクトリなら /Users/<ユーザー名> と表示されます。


ここからは全てホームディレクトリで作業してほしいのですが、そのために cd ~ なんて入力するのは情弱か馬鹿か無知かアホ初心者です。 cd と入力するだけでホームディレクトリに飛びます。 わざわざ ~ を入力する必要はありません。

$ vim .vimrc

パスの指定がない場合はカレントディレクトリのファイルを指定したことになります。


Vimは何も設定していない状態だと行番号すら表示されません。

f:id:kinchiki:20160714020549p:plain

それでは非常に使いづらいため .vimrc に色々書きます。 まず以下をコピーしてください。 Vim初心者の僕のvimrcですが、これだけでもかなり変わります。

"エンコーディング
"GUI版使ってるなら無効にした方がいいらしいです
set encoding=utf-8
scriptencoding utf-8

"vi互換をオフ
"これ記述しなくても互換はオフらしいです
set nocompatible

"カーソル位置表示
set ruler
"行番号表示
set number

"色
set background=dark
"カラーテーマは入れたら有効にしてください
"let g:hybrid_use_iTerm_colors = 1
"colorscheme hybrid

"行番号の色や現在行の設定
autocmd ColorScheme * highlight LineNr ctermfg=12
highlight CursorLineNr ctermbg=4 ctermfg=0
set cursorline
highlight clear CursorLine

"シンタックスハイライト
syntax enable

"オートインデント
set autoindent

"インデント幅
set shiftwidth=4
set softtabstop=4
set tabstop=4

"タブをスペースに変換
set expandtab
set smarttab

"ビープ音すべてを無効にする
set visualbell t_vb=

"長い行の折り返し表示
set wrap

"検索設定
"インクリメンタルサーチしない
set noincsearch
"ハイライト
set hlsearch
"大文字と小文字を区別しない
set ignorecase
"大文字と小文字が混在した検索のみ大文字と小文字を区別する
set smartcase
"最後尾になったら先頭に戻る
set wrapscan
"置換の時gオプションをデフォルトで有効にする
set gdefault


"不可視文字の設定
set list
set listchars=tab:>-,eol:↲,extends:»,precedes:«,nbsp:%

"コマンドラインモードのファイル補完設定
set wildmode=list:longest,full

"入力中のコマンドを表示
set showcmd

"クリップボードの共有
set clipboard=unnamed,autoselect

"カーソル移動で行をまたげるようにする
set whichwrap=b,s,h,l,<,>,~,[,]

"バックスペースを使いやすく
set backspace=indent,eol,start
set nrformats-=octal

set pumheight=10

"対応する括弧に一瞬移動
set showmatch
set matchtime=1
source $VIMRUNTIME/macros/matchit.vim " Vimの「%」を拡張する

"ウィンドウの最後の行もできるだけ表示
set display=lastline

"変更中のファイルでも保存しないで他のファイルを表示する
set hidden

"バックアップファイルを作成しない
set nobackup
"バックアップファイルのディレクトリ指定
set backupdir=$HOME/.vim/backup
"アンドゥファイルを作成しない
set noundofile
"アンドゥファイルのディレクトリ指定
set undodir=$HOME/.vim/backup
"スワップファイルを作成しない
set noswapfile



""""""""""""""""""""""""""""""



"カーソル移動
nnoremap j gj
nnoremap k gk
nnoremap gj j
nnoremap gk k
nnoremap <down> gj
nnoremap <up> gk
noremap <S-h> ^
noremap <S-j> }
noremap <S-k> {
noremap <S-l> $

";;でノーマルモード
inoremap ;; <esc>

"ノーマルモードのまま改行
nnoremap <CR> A<CR><ESC>
"ノーマルモードのままスペース
nnoremap <space> i<space><esc>

"rだけでリドゥ
nnoremap r <C-r>

"Yで行末までヤンク
nnoremap Y y$

"ESCキー2度押しでハイライトの切り替え
nnoremap <silent><Esc><Esc> :<C-u>set nohlsearch!<CR>


"ペースト時に自動インデントで崩れるのを防ぐ
if &term =~ "xterm"
    let &t_SI .= "\e[?2004h"
    let &t_EI .= "\e[?2004l"
    let &pastetoggle = "\e[201~"

    function XTermPasteBegin(ret)
        set paste
        return a:ret
    endfunction

    inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif


filetype plugin indent on


Vimにはモードという概念があり

という4つのモードがあります。

Vimは起動時ノーマルモードになっています。 以下の順序で編集してください。

  1. :set paste → Enter
  2. p
  3. G で最終行を確認
  4. :wq

まずは :set paste と入力してEnterを押してください。 そうするとペーストモードというのになるため、そこで p⌘+v で上の .vimrc を貼り付けてください。
貼り付けが終わったら念のため最初の行が全てきちんと貼り付けれているか、 G で最後の行まで移動して全てきちんと貼り付けできているか確認してください。 きちんと貼り付けできていなかったら i でインサートモードにして、足りない文字を入力してください。 インサートモードからは esc でノーマルモードに戻れます。
ノーマルモードで :wq と入力してEnterを押してVimを終了してください。 :w が上書き保存、 :q が終了で、この二つを連続して行っています。

Vimが終了しましたらもう一度 vim .vimrc と入力してVimを開いてみてください。 行番号や改行文字が表示されていると思います。

f:id:kinchiki:20160714020851p:plain

イカしてるううう!

zshの導入

ようやくここから本題のzshに入ります。

zsh自体についてはこういう記事とか見るといいと思います。 まず全部単純に読み物として面白いのでぜひ読んでみてください。 特にはてな技術発表会日記のページにある動画では高い技術力を持つはてな社員の方々の興奮ぶりからzshの凄さが分かります(笑)

zsh を使おう · GitHub
https://gist.github.com/mollifier/4979060

初めて Mac で zsh を使う人のためのチュートリアル - mollifier delta blog
http://mollifier.hatenablog.com/entry/2013/02/22/025415

漢のzsh (1) 最強のシェル、それは「zsh」 | マイナビニュース
http://news.mynavi.jp/column/zsh/001/

zshで究極のオペレーションを:連載|gihyo.jp … 技術評論社
http://gihyo.jp/dev/serial/01/zsh-book

5月15日の技術勉強会 - はてな技術発表会日記 - 機能変更、お知らせなど
http://hatena.g.hatena.ne.jp/hatenatech/20060517/1147833430

qiita.com


導入の参考記事は以下などです。

qiita.com

tbpgr.hatenablog.com


zshはシェルの一つで最強のシェルらしいです。 Macには最初から /bin に入っていますがバージョンが古いので、Homebrewを使って最新版を入れていきます。

まずは以下のコマンドで最新の情報を取ってきます。

$ brew update


そして以下のコマンドでzshをインストール。

$ brew install zsh


しかしログインシェル(ターミナル開いて起動するシェル)がbashのままなので、今入れた最新版のzshをログインシェルに設定します。 ログインシェルに指定するにはパスを /etc/shells に記述しなければならないため、まずはインストールしたzshのパスをVimで書き込みます。

もし「どうしてもVimじゃ無理!」って人は nano というCUIのエディタかGUIのエディタか echo と > や >> (リダイレクト)との組み合わせで頑張ってください。

$ sudo vim /etc/shells


パスワードを聞かれるため入力してください。 ファイルは多分以下の内容になっています。

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

ここに記述されている bash, csh, ksh... は全てシェルです。


以下の順序で編集してください。

  1. G
  2. o
  3. /usr/local/bin/zsh を手打ち or コピーして ⌘+vescp
  4. esc:wq

まず G で最終行にカーソルを移動させ、 o で新しい行を挿入してからインサートモードにします。 そこで /usr/local/bin/zsh を入力するかコピペしたら、 esc でノーマルモードに戻って :wq で終了です。


次に以下のコマンドでログインシェルを変更します。

$ chsh -s /usr/local/bin/zsh

これもパスワード聞かれるため入力してください。 これで次からターミナルを起動すると /usr/local/bin/zsh が起動します。 ターミナルを再起動して以下のコマンドを入力してみてください。

$ echo $SHELL

$SHELL は多分ログインシェルを表す環境変数/usr/local/bin/zsh と表示されると思います。

Preztoの導入

さあ残すはPreztoだけです。

ブラウザでもエディタでもIDEでもTwitterクライアントでもなんでもPCやスマホにかかわるものはカスタマイズしてなんぼだと思いますが、もちろんシェルもカスタマイズしてなんぼです。 しかし、シェルのカスタマイズとか初心者にはわけわかめですし、変なことやらかすとPCがヤバいことにもなりかねません。

そこでPreztoやoh-my-zshなどのフレームワークを用います。 これらは凄い人たちが作ったイケてる設定集みたいなもので、使うと簡単に良い感じに設定してくれます。

参考記事は以下などです。

qiita.com

dev.classmethod.jp

senta.me


Vimのとこでも書きましたが、ホームディレクトリ(~)で作業してください。 また、zshじゃないと以下の作業でできないもの(多分シェルスクリプト)があるためzshが動いてるか確認してください。 不安だったら

$ /usr/local/bin/zsh

と入力すればzshが起動します。


まず、もし今までにzshrcなどの設定ファイルを編集していた人は書き換えられてしまうので、以下のコマンドなどで他のディレクトリに移動させるなどしてください。

$ mkdir zsh_orig && mv .zlogin .zlogout .zprofile .zshenv .zshrc zsh_orig

mkdir コマンドで zsh_orig というディレクトリを作成、それが成功したら mv コマンドで5つのファイルを zsh_my に移動させます。 ディレクトリ名はなんでも構いません。


次にGitHubからクローンします。

$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

これはGitHubというGitのホスティングサービスのsorin-ionescuさんのpreztoというリポジトリを自分のローカル環境に複製します。 専門用語だらけですが、ここ説明するのはクソめんどいため、よく分からんという人はgitとかGitHubについて調べてください。 "${ZDOTDIR:-$HOME}/.zprezto" は多分 ~/.zprezto です。 そこにリポジトリをクローンしています。


次にシンボリックリンクというものを作成します。 以下のコマンドは四行ですが、一気に貼り付けるのか一行ずつ貼り付けるのかよく分かりません。 多分一気に貼り付けるやつです。 僕はたしか全部一気にやりましたが、多分どうやっても問題ないでしょう。

$ setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

これは多分シェルスクリプトですね。 for文でループさせてPreztoの各設定ファイルのシンボリックリンクをホームディレクトリに作成していると思います。 リンク先(実体)は ~/.zpreztorc/runcoms の各設定ファイルです。


ここまでできたらターミナルを再起動してみてください。 色々と変わっています。 特にTab補完が強力になってます。 zsh自体補完がめちゃくちゃ強力なので、自分で入力するのは最小限にしてできるだけTab押しまくりましょう!

シンボリックリンクls -l で確認できます。

[省略] .zlogin -> /Users/<ユーザー名>/.zprezto/runcoms/zlogin
[省略] .zlogout -> /Users/<ユーザー名>/.zprezto/runcoms/zlogout
[省略] .zpreztorc -> /Users/<ユーザー名>/.zprezto/runcoms/zpreztorc
[省略] .zprofile -> /Users/<ユーザー名>/.zprezto/runcoms/zprofile
[省略] .zshenv -> /Users/<ユーザー名>/.zprezto/runcoms/zshenv
[省略] .zshrc -> /Users/<ユーザー名>/.zprezto/runcoms/zshrc

-> の左がシンボリックリンクリンク元)、右が実体(リンク先)です。


次にテーマを変えてみましょう。 こういったコマンドもできるだけTab連打しましょう。

// テーマをプレビュー
$ prompt -p <テーマ名>
 
// すべてのテーマをプレビュー
$ prompt -p

テーマを(一時的に)適用
$ prompt <テーマ名>

僕が全てのテーマを試した結果、オススメは pure か steeef です。 プロンプトの前が一行空いているため見やすく、gitのカレントブランチを表示してくれたりコミットやプッシュがされているかのマークも表示されて使いやすいです。 画像のテーマはpureです。

f:id:kinchiki:20160714023741p:plain

全部は載ってないですがここでテーマが見れます。 どのテーマにするか決めたらPreztoの設定ファイルを開きます。

$ vim .zpreztorc


多分94行目か95行目が

zstyle ':prezto:module:prompt' theme 'sorin'

となっていると思います。

以下の手順で 'sorin' をあなたの好みのテーマに変えてください。

  1. 95gg
  2. L
  3. ci'
  4. テーマ名入力
  5. esc:wq

ci'''に囲まれた文字列を消してインサートモードになります。便利。

Lはvimrcに記述した <S-l> $ です。 もし .vimrc を編集してなかったらLを入力しても行末に移動しませんので、その時は$でカーソル移動してください。

それ以外はもうさすがに説明省きます。


モジュールにかんしては参考記事を見てください。 osx , homebrew , git あたりは追加しとくといいかもしれないですね。


長くなりましたが、以上でzshとPreztoの導入完了です。 お疲れ様でした!


...丁寧に説明するのはとても疲れました。

catとzshが動き続けてる問題

僕はターミナルにiTerm2を使っています。

www.iterm2.com

なにかプロセスが動いているときにタブやウィンドウを閉じようとすると確認が出る設定にしているのですが、なにも動いてなくても「catとzshが動いてるけど閉じていいの?」と聞かれます。 ウザいです。

f:id:kinchiki:20160714225425p:plain

なんで cat が動いてんだよ!
つーか zsh は動いてるに決まってんだろ!
cat なんかはすぐに終了するコマンドですよね? ターミナルだと確認はされないのですが、ウィンドウを見る限りだと cat と zsh が動いています。

f:id:kinchiki:20160714024031p:plain

確認出ない設定にするのは困るので、なんとかしたいですがググっても分かりませんでした。 解決方法が分かる方は教えてください。

おまけ

Macに最初から入っているgitとVimも古いのでHomebrewで新しいバージョンを入れましょう。

Homebrew使う時はまず

$ brew update

で更新です。

gitは

$ brew install git

だけで完了です。


Vimは以下が参考記事です。

sandragon.hatenablog.com

qiita.com

qiita.com


まず Vim のインストール時になんかのオプション付けるために Lua というプログラミング言語を入れてください。

$ brew install lua

次に

$ brew install vim --with-lua

で完了です。

Preztoが .zprofile で通してくれてるはずですが、もしパスが通っていなかったり読み込む順番に問題があったら上や下の参考記事を参考にパスを .zprofile に記述してください。

パスは rc ファイルよりも profile ファイルに記述する方が良いらしいです。 bashですが以下参考。 zshはpath_helperがどうのこうのとかでどっちが良いかはよく分かりませんが .zprofile でダメだったら .zshrc に書けばいいんじゃないですかね(適当)

qiita.com


もしかしたら /etc/paths に記述する方がいいかもしれません。 よく調べてないためどっちがいいかは知りません。

$ sudo vim /etc/paths

優先したい(先に読みに行かせたい)パス(この場合 /usr/local/bin )を上に記述してください。

パスは

$ echo $PATH

で確認できます。

/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin

こんな感じで /usr/local/bin があり、かつ /bin/usr/bin よりも先に記述してあればOKです。


GUI版のMacVim-KaoriYaはこちらからどうぞ。

GitHub - splhack/macvim-kaoriya: MacVim-KaoriYa
https://github.com/splhack/macvim-kaoriya


MacVimにかんするこの記事はぜひ一度見てほしいです。

Macを購入したら絶対に導入したい!私が3年間で厳選した超オススメアプリ10選! - かなりすごいブログ
http://blog.supermomonga.com/articles/vim/startdash-with-mac.html





僕は【準備編】でこんなこと書いてあります。

多分次の記事でイケてるテーマやフォントの導入方法やイケてるターミナルアプリのiTerm2とかも紹介します。

めんどいため紹介しません。 iTermやVimのテーマはHybrid、フォントはRictyがええと思います。

Ricty入れる手順の最後の方で以下のコマンドがありますが、説明してるページ通りに打つのではなくあなたがインストールしたRictyのバージョンに合わせてください。

$ cp -f /usr/local/Cellar/ricty/<バージョン>/share/fonts/Ricty*.ttf ~/Library/Fonts/


cocopon.me

qiita.com

gaiax-techegg.hatenablog.com


最後に僕が設定しているエイリアスで汎用的なものを紹介します。 よかったら zshrc に追加してください。 zshにしかない(?)グローバルエイリアス(gオプション)めちゃ便利です。 まだ設定してないですがsオプションもめちゃ便利らしいです。

# lsのエイリアス
alias la='ls -A'
alias lg='ls -Agh'
alias ll='ls -Ahl'
# 隠しファイルのみ表示
alias ld='ls -dh .*'
alias lld='ls -ldh .*'

# 確認
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# 省略
alias v=vim
alias e=echo
alias th=touch

# sudo の後のコマンドでエイリアスを有効にするらしい
alias sudo='sudo '

# コマンドラインから起動
alias xcode='open -a /Applications/Xcode.app'

# クリップボードにコピー
alias pb='pbcopy <'
alias -g C='| pbcopy'#個人的にこれがクソ便利です

# 出力からgrep
alias -g G='| grep'

# 設定ファイルをどっからでもすぐ開く
alias -g zrc='~/.zshrc'
alias -g vrc='~/.vimrc'
alias -g gvrc='~/.gvimrc'

# git関連お好みで
alias g=git
alias gad='git add'
alias gau='git add -u'
alias gaa='git add -A'
alias gc='git commit -m'
alias gl='git log --oneline'
alias gs='git status -sb'


# 設定即反映
alias sz='source ~/.zshrc'#これもクソ便利です

# Preztoアップデート
alias preup='cd ~/.zprezto && git pull && git submodule update --init --recursive ; cd -'

おわりに

zshとPreztoはどうでしょうか。 bashに比べてかなり便利だと思ってもらえたら嬉しいですね。

もしbashと違いがよく分かんないって方はコマンドラインに相当うんこ慣れていないと思うので、もっと使ってあげてください。 いうて僕もシェルスクリプトとか全然使えない初心者なんですが、それでもzshは素晴らしいと思いましたまる

それではまた。