LoginSignup
19
18

More than 3 years have passed since last update.

macOSで[zsh, vim, tex, python]の環境構築をしよう!

Last updated at Posted at 2019-02-08

はじめに

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

本記事ではmacOSでやっていますが, Ubuntuでも同様に出来るはずです.
brew install を適宜 sudo apt install などにすれば出来ると思います.
そのうち暇になったらubuntu版も組み込みたいと思います.

< 環境 >

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です.
私はPowerline使っていませんが.

zshrcの設定しよう(Update済み)

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

~/.zshrc
#
# 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 ~/.zshrc'
alias vv='vim ~/.vimrc'
alias c='clear'
alias sz='source ~/.zshrc'
alias sv='source ~/.vimrc'
alias mkdir='mkdir -p'
alias rm='rm -i'
alias ..='cd ..'
alias jn='jupyter-notebook'


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

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

function mkdircd() {
    mkdir -p $1; cd ./$1
}

# prompt setting
autoload -Uz vcs_info
zstyle ':vcs_info:*' formats '[%b]'
zstyle ':vcs_info:*' actionformats '[%b|%a]'

bindkey -v
source ~/anaconda3/etc/profile.d/conda.sh

precmd () {
  # 1行あける
  print
}

#zshプロンプトにモード表示####################################
function zle-line-init zle-keymap-select {
  case $KEYMAP in
    vicmd)
    PROMPT="%{$reset_color%}%~(%{$fg_bold[red]%}NORMAL%{$reset_color%}%{%})\$%{$reset_color%} "
    ;;
    main|viins)
    PROMPT="%{$reset_color%}%(%{$fg_bold[cyan]%}INSERT%{$reset_color%}%{%})\$%{$reset_color%} "
    ;;
  esac
  zle reset-prompt
  vcs_info
}
zle -N zle-line-init
zle -N zle-keymap-select

bindkey -M viins 'jj' vi-cmd-mode

僕は下で述べる通り, 基本はvimを使います.
なのでterminalもvimのキーバインドです.
この設定ではnormal modeとinsert modeを可視化してくれます.

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
" ***** pluginの設定
" Bundle Scripts-----------------------------
if &compatible
  set nocompatible
endif

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

" Required:
call neobundle#begin(expand('~/.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 'altercation/vim-colors-solarized'
NeoBundle 'lervag/vimtex'
NeoBundle 'plasticboy/vim-markdown'
NeoBundle 'kannokanno/previm'
NeoBundle 'tyru/open-browser.vim'
NeoBundle 'Shougo/neocomplete.vim'
NeoBundle 'surround.vim'
NeoBundle 'Yggdroot/IndentLine'
NeoBundle 'itchyny/lightline.vim'
NeoBundle 'Shougo/vimfiler.vim'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'scrooloose/nerdtree'
NeoBundle 'davidhalter/jedi-vim'
NeoBundle 'ervandew/supertab'

" 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
" End NeoBundle Scripts-------------------------


" paste
nnoremap ,i :<C-u>set paste<Return>i
autocmd InsertLeave * set nopaste
set showcmd
set noswapfile
set clipboard+=uunnamedplus,nnamed

" yank + change
nnoremap cip ciw<C-r>0<ESC>

" ***** 外観の設定
set number 
set showmatch 
set list 
set laststatus=2
set ruler
set showmode
set cursorcolumn
set cursorline
highlight CursorLine ctermbg=darkcyan
highlight Cursorcolumn ctermbg=darkcyan
highlight Cursorcolumn ctermfg=White
set title
set whichwrap=b,s,h,l,<,>,[,],~
set scrolloff=5
set fenc=utf-8 
set virtualedit=onemore
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set listchars=tab:▸\ ,eol:,extends:,precedes:hi LineNr ctermfg=Black
hi MatchParen ctermfg=LightGreen ctermbg=blue

" 色の設定
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

" 全角スペースの表示
function! ZenkakuSpace()
    highlight ZenkakuSpace cterm=underline ctermfg=red 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


" ***** 検索関連
set ignorecase
set smartcase 
set wrapscan 
set hlsearch 
set incsearch 
nnoremap <expr> / _(":%s/<Cursor>/&/gn")

" 検索時にその数も表示する
function! s:move_cursor_pos_mapping(str, ...)
    let left = get(a:, 1, "<Left>")
    let lefts = join(map(split(matchstr(a:str, '.*<Cursor>\zs.*\ze'), '.\zs'), 'left'), "")
    return substitute(a:str, '<Cursor>', '', '') . lefts
endfunction

function! _(str)
    return s:move_cursor_pos_mapping(a:str, "\<Left>")
endfunction


" ***** カーソル移動関連
set mouse=a
set ttymouse=xterm2
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-h> <Left>
inoremap <C-l> <Right>
inoremap <silent> jj <Esc>
inoremap <silent>j <ESC>
noremap <C-h> ^
noremap <C-l> $

" ***** その他
nnoremap <C-s> <Nop>
nnoremap <S-u><S-u> vu 
nnoremap <S-u> vU 
nnoremap cw ciw
nnoremap yw yiw
nnoremap dw diw
nnoremap z zz
nnoremap <C-x> "_X
nnoremap <S-x> "_x
noremap <S-H> ^
noremap <S-L> $
nnoremap ; :
nnoremap <CR> A<CR><ESC>
nnoremap <C-c><C-c> : <C-u>nohlsearch<cr><Esc>
nnoremap C c$
nnoremap Y y$
nnoremap O :!open .
nnoremap F :VimFiler
noremap G Gzz
nnoremap <silent><C-e> :NERDTreeToggle<CR>
let mapleader = ","
set backspace=indent,eol,start
syntax enable
set history=10000
au BufRead,BufNewFile *.md set filetype=markdown
highlight jediFat ctermbg=darkblue
highlight Pmenu ctermfg=Black
autocmd BufNewFile *.tex 0r ~/.vim/template/std.tex

をコピペします.
ザッと特徴を述べると,

  • jj でnormal modeに切り替え
  • return でnormal modeのまま空白行挿入
  • ctrl-h,j,k,l でinsert modeでも移動
  • shift-u でカーソル上文字を大文字化
  • shift-u shift-u (2回)カーソル上文字を小文字化
  • / で検索した際にヒット数も記載
  • ctrl-c ctrl-c (2回)でハイライト解除
  • ctrl-h,l , shift-h,lでnormal modeで文の先頭, 文末に移動
  • Y,C でカーソル以降の文字をヤンク, ペースト(D と同じ感覚)
  • yw, dw, cw でカーソルが単語のどの位置に合ってもその単語全体を対象とする
  • yw で単語をヤンクし, cip でカーソル内単語をヤンクした文字で置き換える
  • shift-x はカーソル左文字, ctrl-X はカーソル文字の削除, レジスタに登録しない
  • 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

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

Mathpix Snipping Tool

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

追記 2019/11/25
アカウント制になり, 無料で使える回数が月50回になっていました.
残念です...

Clipy

コピーの履歴をたくさん保存しておけるものです. あ,何回か前にコピーしたやつもう一回ペーストしたい...なんて時に使います.
後はスニペットを編集することでよく使うもの(メアドなど)も瞬時にペースト出来ます.
vimであればこれを使うよりレジスタ機能を使ったほうが良さそうですが.

Googleのバックアップと同期

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

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

初期化する際に誤ってHDを消してしまったらどうするのか...
ちなみに僕はやってしまいました...

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

こちらにまとめてあるので自己責任で参考にしてみてください.

19
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18