Edited at

macOSで環境構築する【zsh, vim, tex, python】


はじめに

環境がごちゃごちゃしてきたので, macOSを一旦初期化して再インストールしたので自分なりの環境構築の仕方を備忘録として書いてみたもです.

< 環境 >

OS
version
date

macOS Mojave
10.14.3
2019/02/07


brewをinstallしよう

macOSを使っていてbrewを使わないことはないでしょう. HomebrewはmacOS用のパッケージマネージャーです. Linuxでいうapt-getのようなもの.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

参考 : https://brew.sh/index_ja


iterm2をinstallしよう

defalutのターミナルでも良いですが, テーマなどいろいろカスタマイズできるのでiterm2を使っている人も多いかと思います.

DL先 : https://www.iterm2.com/downloads.html


bashからzshに変更しよう

defalutのshellはbashになっています. bashも使いやすいですが, zshはもっと使いやすいです. 特に補完機能が最強で, ハマります. installしましょう.

$ brew install zsh

この時点で, $ zsh と打てばzshに切り替わります. が, それでは面倒なのでログインshellをzshに変更します.

chsh(change shell)します.

$ chsh -s /bin/zsh

これ, 打ち間違えるとログイン出来なくなる可能性もあるので気をつけましょう.

ターミナルを再起動すると, zshになっていると思います.

$ echo $SHELL で現在のshellが返ってくるのでそれでも確認できるでしょう.

次にzshの設定をしましょう. フレームワークPreztoを使います. やろうと思えばあれこれ自分でshellの設定を書いてカスタマイズ出来るんでしょうが, 僕にはそこまで興味ないので誰かが作ってくれたものをありがたく使わせてもらいます.

# preztoレポジトリのクローン

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

# 設定ファイルの作成
$ setopt EXTENDED_GLOB
$ for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

これでターミナルを再起動すると見た目がかなり変わっていることに気づくと思います.

次はテーマの変更です.

# テーマ一覧

$ prompt -l

# テーマをプレビュー
$ prompt -p <テーマ名>

# すべてのテーマをプレビュー
$ prompt -p

# テーマを適用(再起動したら戻る)
$ prompt <テーマ名>

ここで気に入ったものを選んでおきます. ~/.zpreztorcを書き換えます.


~/.preztorc

(中略)

zstyle ':prezto:module:prompt' theme 'テーマ名'

大体のthemeはこれでOKなのですが,Powerlineはthemeをinstallする必要があります.

# themeファイルの配置

$ curl https://raw.github.com/davidjrice/prezto_powerline/master/prompt_powerline_setup > ~/.zprezto/modules/prompt/functions/prompt_powerline_setup

Powerlineはフォントの関係上, このままでは表記が崩れてしまいます. Powerline専用のフォントをinstallします.

# tapでリポジトリを追加する

$ brew tap sanemat/font

# フォントのinstall
$ brew install ricty --with-powerline

# 展開
$ cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/

# キャッシュの削除
$ fc-cache -vf

後は, iterm2のフォントをRichy Discord Regular for PowerlineにすればOKです.


zshenvの設定しよう

aliasなどを設定しましょう. 自分は現在このような中身になっています.


~/.zshenv

#

# Executes commands at the start of an interactive session.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#

# Source Prezto.
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
fi

# Customize to your needs...
# PATHを通す
export PATH="/usr/local/bin:$PATH"

# Beep音をなくす
setopt no_beep

# Ctrl+Dでログアウトしてしまうことを防ぐ
setopt IGNOREEOF

# 日本語を使用
export LANG=ja_JP.UTF-8

# 色を使用
autoload -Uz colors
colors

# 補完
autoload -Uz compinit
compinit

# 他のターミナルとヒストリーを共有
setopt share_history

# ヒストリーに重複を表示しない
setopt histignorealldups

HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000

# コマンドミスを修正
setopt correct
# 補完後、メニュー選択モードになり左右キーで移動が出来る
zstyle ':completion:*:default' menu select=2

# 補完で大文字にもマッチ
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

# alias
alias lst='ls -ltr'
alias l='ls -ltr'
alias la='ls -a'
alias ll='ls -l'
alias vi='vim'
alias vz='vim ~/.zshenv'
alias vv='vim ~/.vimrc'
alias c='clear'
alias sz='source ~/.zshenv'
alias sv='source ~/.vimrc'
alias mkdir='mkdir -p'
alias rm='rm -i'
alias ..='cd ..'

function tex() {
platex $1.tex &&
dvipdfmx -p $2 $1.dvi &&
open $1.pdf &&
}

function pycheck() {
pycodestyle --show-source --show-pep8 $1;
pydocstyle --ignore=D100,D203,D212 $1;
}



vimの設定をしよう(後日Update予定)

まずは.vimrcを設定しましょう. 自分はNeoBundleを使っています.

# プラグインのinstall

$ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh > install.sh
$ sh ./install.sh

# キャッシュの削除
$ rm -rf install.sh

次に, $ touch ~/.vimrc でinit fileを作成し,


~/.vimrc

" *************************

"
Init file for vim.
" 2018/12/23 update yuji.
"
< https://github.com/yuji1997/initfiles >
" *************************

"Bundle Scripts-----------------------------
if &compatible
set nocompatible
endif

" Required:
set runtimepath+=/Users/user/.vim/bundle/neobundle.vim/

" Required:
call neobundle#begin(expand('/Users/user/.vim/bundle'))

" Let NeoBundle manage NeoBundle
"
Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" Add or remove your Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'ctrlpvim/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'
NeoBundle 'nanotech/jellybeans'
NeoBundle 'romainl/Apprentice'
NeoBundle 'jacoborus/tender.vim'
NeoBundle 'lervag/vimtex'

NeoBundle 'Shougo/neocomplete.vim'
" Disable AutoComplPop.
let g:acp_enableAtStartup = 0
" Use neocomplete.
let g:neocomplete#enable_at_startup = 1
"
Use smartcase.
let g:neocomplete#enable_smart_case = 1
" Set minimum syntax keyword length.
let g:neocomplete#sources#syntax#min_keyword_length = 3

" Define dictionary.
let g:neocomplete#sources#dictionary#dictionaries = {
\ 'default' : '',
\ 'vimshell' : $HOME.'/.vimshell_hist',
\ 'scheme' : $HOME.'/.gosh_completions'
\ }

" Define keyword.
if !exists('g:neocomplete#keyword_patterns')
let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '
\h\w*'

" Plugin key-mappings.
inoremap <expr><C-g> neocomplete#undo_completion()
inoremap <expr><C-l> neocomplete#complete_common_string()

" <TAB>: completion.
inoremap <expr><TAB> pumvisible() ? "
\<C-n>" : "\<TAB>"

" Enable omni completion.
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags

" Enable heavy omni completion.
if !exists('g:neocomplete#sources#omni#input_patterns')
let g:neocomplete#sources#omni#input_patterns = {}
endif

" For perlomni.vim setting.
" https://github.com/c9s/perlomni.vim
let g:neocomplete#sources#omni#input_patterns.perl = '
\h\w*->\h\w*\|\h\w*::'

NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }

" Required:
call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
"
NeoBundleCheck

"End NeoBundle Scripts-------------------------

" paste
nnoremap ,i :<C-u>set paste<Return>i
autocmd InsertLeave * set nopaste

set showcmd
" スワップファイルは使わない
set noswapfile

set clipboard+=unnamed

"===== 表示設定 =====
set number "行番号の表示
set title "
編集中ファイル名の表示
set showmatch "括弧入力時に対応する括弧を示す
set list "
タブ、空白、改行を可視化
set visualbell "ビープ音を視覚表示
set laststatus=2 "
ステータスを表示
set ruler "カーソル位置を表示
set lines=100 "
Windowの縦幅を指定
set columns=200 "Whindowの横幅を指定
syntax on "
コードに色をつける

"===== 文字、カーソル設定 =====
set fenc=utf-8 "
文字コードを指定
set virtualedit=onemore "カーソルを行末の一つ先まで移動可能にする
set autoindent "
自動インデント
set smartindent "オートインデント
set tabstop=4 "
インデントをスペース2つ分に設定
set shiftwidth=4 "自動的に入力されたインデントの空白を2つ分に設定
set listchars=tab:▸
\ ,eol:↲,extends:❯,precedes:❮ "不可視文字の指定
set whichwrap=b,s,h,l,<,>,[,],~ "行頭、行末で行のカーソル移動を可能にする
"
let &t_ti.="\e[5 q" "カーソルの形状を変更

"===== 検索設定 =====
set ignorecase "大文字、小文字の区別をしない
set smartcase "
大文字が含まれている場合は区別する
set wrapscan "検索時に最後まで行ったら最初に戻る
set hlsearch "
検索した文字を強調
set incsearch "インクリメンタルサーチを有効にする

"===== マウス設定 =====
set mouse=a
set ttymouse=xterm2

"===== キー入力 =====
"
入力モード時のカーソル移動
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-h> <Left>
inoremap <C-l> <Right>

" 矢印キーを無効にする
noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>
inoremap <Up> <Nop>
inoremap <Down> <Nop>
inoremap <Left> <Nop>
inoremap <Right> <Nop>

"jキーを二度押しでESCキー
inoremap <silent> jj <Esc>
inoremap <silent> っj <ESC>
inoremap <C-x> <C-h>
nnoremap x X
nnoremap X x
nnoremap a A
nnoremap A a
noremap <S-h> ^
noremap <S-l> $
nnoremap <CR> A<CR><ESC>
nnoremap == gg=G''
nnoremap <C-c><C-c> : <C-u>nohlsearch<cr><Esc>
set backspace=indent,eol,start

"===== その他 =====
"
履歴を10000件保存
set history=10000

syntax enable
set
background=dark
colorscheme tender

if &term !~ "xterm-color"

autocmd BufEnter * if bufname("") !~ "^?[A-Za-z0-9?]*://" | silent! exe '!echo -n "^[k[`basename %`]^[??"' | endif

autocmd VimLeave * silent! exe '!echo -n "^[k`dirs`^[??"'

endif

" http://inari.hatenablog.com/entry/2014/05/05/231307
""""""""""""""""""""""""""""""
"
全角スペースの表示
""""""""""""""""""""""""""""""
function! ZenkakuSpace()
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=darkgray
endfunction

if has('syntax')
augroup ZenkakuSpace
autocmd!
autocmd ColorScheme * call ZenkakuSpace()
autocmd VimEnter,WinEnter,BufRead * let w:m1=matchadd('ZenkakuSpace', ' ')
augroup END
call ZenkakuSpace()
endif

"https://sites.google.com/site/fudist/Home/vim-nihongo-ban/-vimrc-sample
""""""""""""""""""""""""""""""
"
挿入モード時、ステータスラインの色を変更
""""""""""""""""""""""""""""""
let g:hi_insert = 'highlight StatusLine guifg=darkblue guibg=darkyellow gui=none ctermfg=blue ctermbg=yellow cterm=none'

if has('syntax')
augroup InsertHook
autocmd!
autocmd InsertEnter * call s:StatusLine('Enter')
autocmd InsertLeave * call s:StatusLine('Leave')
augroup END
endif

let s:slhlcmd = ''
function! s:StatusLine(mode)
if a:mode == 'Enter'
silent! let s:slhlcmd = 'highlight ' . s:GetHighlight('StatusLine')
silent exec g:hi_insert
else
highlight clear StatusLine
silent exec s:slhlcmd
endif
endfunction

function! s:GetHighlight(hi)
redir => hl
exec 'highlight '.a:hi
redir END
let hl = substitute(hl, '[\r\n]', '', 'g')
let hl = substitute(hl, 'xxx', '', '')
return hl
endfunction

hi Comment ctermfg=DarkRed
hi LineNr ctermfg=White
hi MatchParen ctermfg=LightGreen ctermbg=blue

autocmd BufNewFile *.tex 0r ~/.vim/template/std.tex


をコピペします. ただし, 上部の"user"を自分の名前に変えてください.

ザッと特徴を述べると,


  • jjでnormal modeに切り替え

  • returnでnormal modeのまま空白行挿入

  • 十字キー無効化

  • xはカーソル左文字, Xはカーソル文字の削除(x, Xの入れ替え)

  • aで末端からinsert mode

  • yヤンクとクリップボードの連携(後述のvim installが必要)

  • ペースト時のインデントの整形

  • swapファイルの無効化

といった感じです. jjで切り替えはもはやvimを使う上で必須ですね〜. いちいちescなんて押していられません.

vimを起動し, :NeoBundleInstall とするとpackageのinstallが始まります.

defalutのvimではclipboardと連携していません. そこで新たなvimをinstallします.

$ brew install vim

ここでdefalutのvimの名前を変更しようと

$ sudo mv /usr/bin/vim /usr/bin/old_vim                            

mv: rename /usr/bin/vim to /usr/bin/old_vim: Operation not permitted

となり, 弾かれます.

これはシステムの保護で以下のようにして直せます. まず再起動します. この時に, command + Rを押し続けて, リカバリーモードで起動します. 上のメニュー画面からターミナルを起動し,

$ csrutil disable

とします. その後, $ reboot としてから名前を変えてみましょう.

# 名前の変更

$ sudo mv /usr/bin/vim /usr/bin/old_vim

# 新しいvimを使えるようにする
$ sudo ln /usr/local/Cellar/vim/8.1.0001/bin/vim /usr/bin


pythonをinstallしよう

python2系はmacOSにdefaultでinstallされていますが, python3系はinstallされていません.

pythonには/usr/local/bin/に入れる方法とanacondaやpyenvなどの仮想環境を構築する方法の2つやり方があります.

自分だけが使う場合は前者のシステムに直接入れる方法で良いと思います. 後者は環境がごちゃごちゃになっても切り替えが出来たり, バージョンを複数持てるというメリットがあります. 機械学習などでライブラリを使いたい場合, 最新のpythonのバージョンでは上手く動かない場合があったりします. そのような時にあれこれいじれるというメリットはあります. デメリットとしては一部のライブラリと相性が悪いことがあって泥沼にはまる時があることです. Worldのラッパであるpyreaperをanacondaの下でinstallしようとしたところ, 相性が悪くinstallできませんでした.

どちらも構築しておいて, 基本は仮想環境で, installが上手くいかない場合はシステムで実装する, というのが最適でしょうか?

とりあえず, 前者のシステムに直接入れるやり方でinstallします.

$ brew install python3

これで最新のpythonが入ります. 2019/02/07現在, python3.7.2が入りました. これでpip3も入ります.

後はNumPy, Pandasなどのよく使うライブラリを導入しておきましょう.

$ which python3                                                    

/usr/local/bin/python3

$ python3 --version
Python 3.7.2

$ which pip3
/usr/local/bin/pip3

$ pip3 --version
pip 18.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

$ pip3 list
Package Version
---------- -------
pip 18.1
setuptools 40.6.3
wheel 0.32.3

次に解析toolを導入します. PEP8に準拠した解析toolとしてpycodestyleとpydocstyleをinstallします.

$ pip install pycodestyle

$ pip install pydocstyle

ところで, pydocstyleには何故かお互いに衝突するエラーがあります.

D212とD213 https://stackoverflow.com/questions/45990301/pep257-d212-and-d213-conflicts

D203とD211 https://github.com/PyCQA/pydocstyle/issues/141

自分はD203とD212をignoreしています. また, D100はファイルごとのdocをつけましょうという警告ですが, 自分はいらないと思っているのでこれもignoreしています. これらは, ~/.zshenvの


~/.zshenv

function pycheck() {

pycodestyle --show-source --show-pep8 $1;
pydocstyle --ignore=D100,D203,D212 perceptron.py $1;
}

で書いています.


vim+texの環境を構築しよう

理系ならば当然使っているtex. これをこの機にvimと連携させてみましょう.

まずは, texのinstallから.

# GUIなしでinstall

$ brew cask install mactex-no-gui

# TeX Live のパッケージ管理ツールの更新
$ sudo tlmgr update --self --all

# defalutをa4用紙に設定する
$ sudo tlmgr paper a4

理由は分かりませんが, $ sudo tlmgr update --self --all$ sudo tlmgr paper a4は上手く行かない時があります. ターミナルを再起動したり, 何度か実行してみたら上手くいきました.

次にtexのコンパイルの設定をします. tex → dvi → pdfの流れで実行します. これを1つのコマンドで行えるようにshellに書き込みます.


~/.zshrc

(中略)

function tex() {
platex $1.tex &&
dvipdfmx -p $2 $1.dvi &&
open $1.pdf &&
}

これで, $ tex filename papersizeとすることでコンパイルしてプレビューするところまで出来ます.

vimで書きながらコンパイルを試す場合, :!tex filename papersizeとすれば出来ます.

(.zshrcだけにaliasやfunctionを書くとvimのshellで読み込まれません. .zshenvにも書きましょう.)

次にtexのテンプレートを書いていきます. 特にヘッダーなどは使うことがないので余白をなるべく削った形にしました. これを, ~/.vim/template/に作成します.


~/.vim/template/std.tex

\documentclass[8pt, b5paper]{jsarticle}

\usepackage{setspace}
\usepackage{ulem}
\usepackage{layout}
\usepackage[dvipdfmx]{graphicx}
\usepackage{bm}

% ##### Margin Setting #####
\setlength{\topmargin}{-15.4truemm}
\setlength{\headheight}{0truemm}
\setlength{\headsep}{0truemm}
\setlength{\marginparwidth}{0truemm}
\setlength{\textwidth}{\paperwidth}
\addtolength{\textwidth}{-1truein}
\setlength{\textheight}{\paperheight}
\addtolength{\textheight}{-30truemm}
\setlength{\hoffset}{-0.5truein}
\setlength{\footskip}{10truemm}

\newcommand{\f}[2]{\displaystyle \frac{#1}{#2}}
\newcommand{\itg}[4]{\int_{#1}^{#2} {#3}\;d{#4}}
\newcommand{\di}[2]{\frac{d{#1}}{d{#2}}}
\newcommand{\ddi}[2]{\frac{d{#1}}{d{#2}}}
\newcommand{\pa}[2]{{\frac{\partial{#1}}{\partial{#2}}}}
\newcommand{\ppa}[2]{\frac{\partial ^2{#1}}{\partial{#2}^2}}
\newcommand{\s}[3]{\sum_{#1}^{#2}{#3}}
\newcommand{\limit}[3]{\lim_{{#1}\to{#2}}{#3}}
\newcommand{\fr}[2]{\begin{itembox}[l]{#1}{#2}\end{itembox}}
\newcommand{\scr}[2]{\begin{screen}{#1}{#2}\end{screen}}
\newcommand{\ctr}[1]{\begin{center}{#1}\end{center}}
\newcommand{\doubleline}{\uuline{\hspace{\textwidth}}}

\begin{document}

\end{document}


このテンプレートは, .vimrcでautocmd BufNewFile *.tex 0r ~/.vim/template/std.tex

としていることで読み込まれます. 他にも, C言語などのint main(){}などのテンプレートも作っても良いかもしれません.


カーソル, キーボードを設定しよう

システム環境設定 > トラックパッド でカーソルの速さを速くします. また, タップでクリック動作になるように変更します.

システム環境設定 > キーボード でキーのリピート, リピート入力認識までの時間のどちらも速めて高速移動できるようにします.

また, 入力ソースで, "¥"キーで入力する文字を" \ (バックスラッシュ)"にします.


オススメのApp


Magnet

https://itunes.apple.com/jp/app/magnet-マグネット/id441258766?mt=12

画面をAppごとに綺麗に分割するのに非常に便利です. これがないとマルチタスクしづらいです.


Mathpix Snipping Tool

https://itunes.apple.com/jp/app/mathpix-snipping-tool/id1349670778?mt=12

スクリーンショットで撮ったものをlatex形式に変換する優れものです. 精度が結構良いので理系は必須です.


Clipy

https://clipy-app.com

コピーの履歴をたくさん保存しておけるものです. あ,何回か前にコピーしたやつもう一回ペーストしたい...なんて時に使います.

後はスニペットを編集することでよく使うもの(メアドなど)も瞬時にペースト出来ます.


Googleのバックアップと同期

https://www.google.com/intl/ja_ALL/drive/download/backup-and-sync/

基本的にはGoogle Driveに全てバックアップを常に取っています. このAppを使うと自動で同期してくれるので非常に楽です.

どのフォルダを同期するかなど 設定していないと非常に重くなってしまうので設定はしっかりした方が良いです.

自分はMacBookAirの128GBで容量がかなり少ないので, SanDiskの小型USBを常につけて基本的にそちらに保存し, これとGoogle Driveを同期させています. そうすれば容量は食わないし, 環境を汚すことがないので.


もしもMacintosh HDを削除してしまったら...?

初期化する際に誤ってHDを消してしまったらどうするのか...

ちなみに僕はやってしまいました...

起動しても永遠に「?」マークのアイコンが点滅を繰り返すばかり...

僕の症状の場合は以下で解決できました.

自己責任で試してみてくださいね!


  1. 起動時にcommand + R押し続けてリカバリーモードにする.

  2. おそらく地球儀が回っているアイコンが出て, 何十分か待たされます.

  3. 何故か英語表記になりました. とりあえずWi-Fiに接続します.
    (OS reinstallを選び, 進めたところでinstallするHDが選択肢に出てこない. 本来ならここに"Macintosh HD"が出るはず. これをやると何故か後戻りできず強制終了すると再度2から始まるので注意.)

  4. disk utilityを選び, Apple SSDのところでパーティションの分割をする. 基本はMaxの容量を, Mac OS Extended (Journaled)を選択して名前を"Macintosh HD"にする.

  5. OS reinstallを選ぶとinstallするHDに4で作成したHDが出てくるはず.

  6. installする. ただし, OSはOS X El Capitanしかない. 仕方なくこれをinstallする.

  7. installしてから再度upgradeの形でmacOS Mojaveをinstallする. これも1.5時間くらい待たされる.

なんだかんだで3時間以上食います. 消さないように気をつけましょう...