dotfilesでターミナル環境を一瞬で整える
概要
ITエンジニアであればターミナルに触れない日はないでしょう。僕の観測範囲内では、強いエンジニアでターミナル環境を整えていない人はいません。こういう基本的な所から効率化を怠らない姿勢が大事なんだと思います。
そんな真面目な理由は置いておいておくとしても、シンプルに、ターミナルはカッコいい方がいいですよね。
この記事では、shellやvimの環境をどの環境でも数コマンドで整えることができるようにするための、dotfilesを作っていきます。.zshrc、.vimrc など、ドットから始まる非表示ファイル群で構成されるため、dotfilesと呼ばれています。iTerm2やカラーテーマの導入は扱いません。
普段と異なる環境で作業する際に、毎回ターミナル環境を一から整えるのは大変です。dotfilesをgithubに置いておくことで、数コマンドで普段と同じターミナル環境を整えることができます。
今使ってる dotfiles でのターミナル起動が遅くてイライラするので、高速化も兼ねて、スクラッチから作成していきます。
成果物
今回作成したdotfilesのgithubリポジトリは以下です。
成果物のターミナル(iTerm2)操作の簡単な動画のgifを貼っておきます。(iTerm2で使っているテーマは solalized light で、文字色を若干いじっています。)
僕と全く同じ環境を整えたい方がいれば、以下を実行すれば良いです。MacOSとLinuxで検証済みです。vimについては、vimの初回実行時に .vimrc の内容が1分弱程度かけて反映されます。
$ git clone https://github.com/tkugimot/dotfiles.git
$ cd dotfiles
$ ./install.sh
$ zsh
手順
とりあえず必要なディレクトリを作ります。また、shellをzshに切り替えておきます。
$ mkdir dotfiles
$ cd dotfiles
$ git init
$ git remote add origin <githubのリポジトリ>
$ chsh -s $(which zsh)
次に、Prezto というzshフレームワークを導入していきます。以下の記事を読む限り、oh-my-zsh 等と比較してもかなり速いようです。
(bashと比較してzshがどう良いのかは、zshの機能をある程度活用してからでないと理解できません。ここは先人の知恵を借りて (思考停止して) 一旦フレームワークを入れておきます。)
$ cd ~/dotfiles
$ git submodule add -f https://github.com/sorin-ionescu/prezto.git .zprezto
$ git submodule update --init --recursive
$ setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
Prezto関連の設定は .zpreztorc に書きます。
$ cp ~/.zpreztorc .zpreztorc
$ ln -sf ~/dotfiles/.zpreztorc ~/.zpreztorc
$ vim .zpreztorc
.
.
.
zstyle ':prezto:module:prompt' theme 'pure' #ここを pure に書き換える。
これだけでは面白くないので、.zshrcもコピーして修正します。
$ cd dotfiles
$ cp ~/.zshrc .zshrc
$ ln -sf ~/dotfiles/.zshrc ~/.zshrc
$ vim .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
#以下を追加
export PURE_PROMPT_SYMBOL=🐶🍻
# path
export PATH=$HOME/bin:/usr/local/bin:$PATH
# alias
alias lsa="ls -la"
alias ls="ls -GF"
alias gls="gls --color"
# color
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=46;34:cd=43;34:su=41;30:sg=46;30:tw=42;30:ow=43;30'1;30:sg=46;30:tw=42;30:ow=43;30'
zsh関連の設定の最後に、cool-peco を入れておきます。
$ cd dotfiles
$ git submodule add https://github.com/ryoppy/cool-peco.git cool-peco
$ vim .zshrc
# cool-peco
# === cool-peco init ===
FPATH="$FPATH:$HOME/dotfiles/cool-peco"
autoload -Uz cool-peco
cool-peco
# ======================
bindkey '^r' cool-peco-history
alias cps=cool-peco-ps
alias gitc=cool-peco-git-checkout
alias gitl=cool-peco-git-log
alias pecoref="cat ~/.zshrc | grep -i cool-peco"
$ source .zshrc
次は vim の設定の方をやっていきます。NeoBundle を使います。
$ cd ~/dotfiles
$ git submodule add https://github.com/Shougo/neobundle.vim.git .vim/bundle/neobundle.vim
.vimrc を作成します。
$ vim .vimrc
# .vimrc
syntax on
set encoding=utf-8
set number
set tabstop=4
set softtabstop=4
set expandtab
set shiftwidth=4
set backspace=indent,eol,start
" pasteモード(,iでもペーストモードへ. ノーマルに戻るとインサートに戻す)
nnoremap ,i :<C-u>set paste<Return>i
autocmd InsertLeave * set nopaste
" マウス操作可能にする
set mouse=a
" マウスでドラッグ動作も可能にする
set ttymouse=xterm2
" クリップボード許可
" => http://qiita.com/Kumamon/items/3ca4ab80fc465d8eed7e
" => http://qiita.com/shoma2da/items/92ea8badcd4655b6106c
set clipboard=unnamed,autoselect
" 常にタブラインを表示
set showtabline=2
if has('vim_starting')
set nocompatible " Be iMproved
" Required:
set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
" Required:
call neobundle#begin(expand('~/.vim/bundle/neobundle.vim/'))
" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'
" My Bundles here:
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'tpope/vim-fugitive'
NeoBundle 'kien/ctrlp.vim'
NeoBundle 'flazz/vim-colorschemes'
NeoBundle 'scrooloose/nerdtree'
NeoBundle 'jistr/vim-nerdtree-tabs'
NeoBundle 'Shougo/neocomplete.vim'
NeoBundle 'nanotech/jellybeans.vim'
NeoBundle 'Shougo/neosnippet.vim'
NeoBundle 'Shougo/neosnippet-snippets'
NeoBundle 'thinca/vim-ref'
NeoBundle 'tomtom/tcomment_vim'
NeoBundle 'AndrewRadev/splitjoin.vim'
NeoBundle 'osyo-manga/vim-watchdogs'
NeoBundle 'mattn/emmet-vim'
" You can specify revision/branch/tag.
NeoBundle 'Shougo/vimshell', { 'rev' : '3787e5' }
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
nnoremap <silent><C-e> :NERDTreeToggle<CR>
map <C-n> <plug>NERDTreeTabsToggle<CR>
" 隠しファイルを表示する
let NERDTreeShowHidden = 1
" デフォルトでツリーを表示させる
let g:nerdtree_tabs_open_on_console_startup=1
" 他のバッファをすべて閉じた時にNERDTreeが開いていたらNERDTreeも一緒に閉じる。
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" Anywhere SID.
function! s:SID_PREFIX()
return matchstr(expand('<sfile>'), '<SNR>\d\+_\zeSID_PREFIX$')
endfunction
" Set tabline.
function! s:my_tabline() "{{{
let s = ''
for i in range(1, tabpagenr('$'))
let bufnrs = tabpagebuflist(i)
let bufnr = bufnrs[tabpagewinnr(i) - 1] " first window, first appears
let no = i " display 0-origin tabpagenr.
let mod = getbufvar(bufnr, '&modified') ? '!' : ' '
let title = fnamemodify(bufname(bufnr), ':t')
let title = '[' . title . ']'
let s .= '%'.i.'T'
let s .= '%#' . (i == tabpagenr() ? 'TabLineSel' : 'TabLine') . '#'
let s .= no . ':' . title
let s .= mod
let s .= '%#TabLineFill# '
endfor
let s .= '%#TabLineFill#%T%=%#TabLine#'
return s
endfunction "}}}
let &tabline = '%!'. s:SID_PREFIX() . 'my_tabline()'
set showtabline=2 " 常にタブラインを表示
" The prefix key.
nnoremap [Tag] <Nop>
nmap t [Tag]
" Tab jump
for n in range(1, 9)
execute 'nnoremap <silent> [Tag]'.n ':<C-u>tabnext'.n.'<CR>'
endfor
" t1 で1番左のタブ、t2 で1番左から2番目のタブにジャンプ
map <silent> [Tag]c :tablast <bar> tabnew<CR>
" tc 新しいタブを一番右に作る
map <silent> [Tag]x :tabclose<CR>
" tx タブを閉じる
map <silent> [Tag]n :tabnext<CR>
" tn 次のタブ
map <silent> [Tag]p :tabprevious<CR>
" tp 前のタブ
最後に、ここまでに作った環境を他の環境でも一瞬で作成できるようにするために、install.sh というシェルスクリプトを組みます。
#!/bin/zsh
# add submodule
git submodule update --init --recursive
# prezto
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
# symlink dotfiles
ln -sf ~/dotfiles/.zprezto ~/.zprezto
ln -sf ~/dotfiles/.vimrc ~/.vimrc
ln -sf ~/dotfiles/.zshrc ~/.zshrc
ln -sf ~/dotfiles/.zpreztorc ~/.zpreztorc
ln -sf ~/dotfiles/.vim ~/.vim
# change shell
chsh -s $(which zsh)
source ~/dotfiles/.zshrc
source ~/dotfiles/.zpreztorc
これで完成です。実行方法はこの記事の冒頭に書いた通りです。ターミナルの起動がかなり速くなったので満足です。今後は、.zshrcが環境依存な設定にならないように注意しながら、何か良いものを知ったら適宜追加していこうと思います。
おやすみなさい 😪