search
LoginSignup
36
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

DIVE INTO CODE Advent Calendar 2016 Day 12

posted at

updated at

ぼくのかんがえたさいきょうのVim

Vimmerはモテるから、みんなVimmerになろう!
ソースは俺!!(白目

DIVE INTO CODE Advent Calendar 12日目 の記事です。

前提

  • For Rubyiest
  • 俺の方がつよいって方は挑戦受け付けます(訳:アドバイスください。お願いします(切実))
  • MacVim 使ってるので、GUIありきの機能が結構あります
  • 力尽きて導入方法とか端折ってるんで、リンク先を参照ください。。。
    • (コメントいただければ、お答えします)

ソース

ディレクトリ構成

$HOME
├ .vimrc  # vimのメイン設定ファイル
├ .gvimrc # gvimの設定ファイル
└ .vim/
     ├ filetype.vim    # 拡張子とファイルタイプを紐付ける設定ファイル
     ├ .backup/        # バックアップファイルの出力先
     ├ .swap/          # スワップファイルの出力先
     ├ .undo/          # UNDO履歴ファイルの出力先
     ├ bundle/         # プラグインの置き場所
     └ ftplugin/       # ファイルタイプ毎の設定ファイルの置き場所

.vimrc

こんな感じです。

詳細は後述

.vimrc
"-------------------------------------------------------------------------------
" NeoBundle:

" Note: Skip initialization for vim-tiny or vim-small.
if 0 | endif

if has('vim_starting')
  if &compatible
    set nocompatible               " Be iMproved
  endif

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

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

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

  " My Bundles here:
  " Refer to |:NeoBundle-examples|.
  " Note: You don't set neobundle setting in .gvimrc !

  " vimgrepの結果から置換
  NeoBundle 'thinca/vim-qfreplace'

  " previm
  NeoBundle 'kannokanno/previm'
  NeoBundle 'tyru/open-browser.vim'

  " 静的解析
  NeoBundle 'scrooloose/syntastic'

  " ドキュメント参照
  NeoBundle 'thinca/vim-ref'
  NeoBundle 'yuku-t/vim-ref-ri'

  " メソッド定義元へのジャンプ
  NeoBundle 'szw/vim-tags'

  " ブロックのendを自動で挿入
  NeoBundle 'tpope/vim-endwise'

  " ファイルをtree表示
  NeoBundle 'scrooloose/nerdtree'

  " indent for yaml
  NeoBundle 'chase/vim-ansible-yaml'

  " Railsプロジェクトのナビゲーション
  NeoBundle 'tpope/vim-rails'

  " コメントアウト
  NeoBundle 'tpope/vim-commentary'

  " カラースキーム
  NeoBundle 'cocopon/iceberg.vim'

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

"-------------------------------------------------------------------------------
" 編集に関する設定:

" タブの画面上での幅
set tabstop=4
" 自動インデントでずれる幅
set shiftwidth=4
" タブの代わりに空白文字を指定する
set expandtab
" 新しい行のインデントを現在行と同じにする
set autoindent

"-------------------------------------------------------------------------------
" ファイル操作に関する設定:

" バックアップファイル
"" 有効化
set backup
"" 出力先
set backupdir=~/.vim/.backup
" スワップファイル
"" 有効化
set swapfile
"" 出力先
set directory=~/.vim/.swap
" UNDOファイル
"" 有効化
set undofile
"" 出力先
set undodir=~/.vim/.undo

"-------------------------------------------------------------------------------
" 表示に関する設定:

" 行番号の表示
se nu

" 全角スペースの表示:
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

"-------------------------------------------------------------------------------
" NERDTree:

" .ファイルの表示(1: 表示)
let NERDTreeShowHidden=1
" ブックマークを表示 (1:表示)
let g:NERDTreeShowBookmarks=1
" 引数なしで起動した場合、NERDTreeを開く
" autocmd vimenter * if !argc() | NERDTree | endif
" 表示・非表示切り替え
nmap <silent> <C-n><C-t>      :NERDTreeToggle<CR>

"-------------------------------------------------------------------------------
" Previm:

let g:previm_open_cmd = 'open -a FirefoxDeveloperEdition'

augroup PrevimSettings
    autocmd!
    autocmd BufNewFile,BufRead *.{md,mdwn,mkd,mkdn,mark*} set filetype=markdown
augroup END

"-------------------------------------------------------------------------------
" rubocop:
" syntastic_mode_mapをactiveにするとバッファ保存時にsyntasticが走る
" active_filetypesに、保存時に syntastic を走らせるファイルタイプを指定する

let g:syntastic_mode_map = { 'mode': 'passive', 'active_filetypes': ['ruby'] }
let g:syntastic_ruby_checkers = ['rubocop']

"-------------------------------------------------------------------------------
" refe:
let g:ref_refe_cmd = $HOME.'/.rbenv/shims/refe' "refeコマンドのパス

"-------------------------------------------------------------------------------
" map:

" 検索結果のハイライトをEsc連打でクリアする
nnoremap <ESC><ESC> :nohlsearch<CR>
" 常にvery magicを利用
nnoremap / /\v
" タブ移動
nnoremap [t :tabprevious<CR>
nnoremap ]t :tabnext<CR>

" :ls + :buffer
cnoremap bb ls<CR>:buf
" 開いてるファイルのパスを表示 (Show Path)
cnoremap sp echo expand("%:p")<CR>
" 現在日時を入力 (yyyy/MM/dd)
cnoremap date <ESC>a<C-r>=strftime("%Y/%m/%d")<CR><ESC>
" 現在日時を入力 (yyyy/MM/dd hh:mm:ss)
cnoremap datetime <ESC>a<C-r>=strftime("%Y/%m/%d %H:%M:%S")<CR><ESC>

"-------------------------------------------------------------------------------
" その他設定:

" not ignore case.
se noic
" スペルチェック
set spell
set spelllang=en,cjk
" matchit.vim
runtime macros/matchit.vim
" color
colorscheme iceberg

NeoBundle について

NeoBundleは Vim のプラグインを管理するためのツールです。

.vimrc の、1行目から NeoBundleCheck までは この NeoBundle の設定とインストールするプラグインを定義しています。

Dein.vim に移行しないとな。。。(遠い目

プラグインについて

thinca/vim-qfreplace

vimgrep の検索結果に対して一括して置き換えを行うことができるプラグイン。

kannokanno/previm

マークダウンのプレビュー表示を行うプラグイン。

PrevimOpen.gif

tyru/open-browser.vim

上記のPrevimが依存しているプラグイン。

scrooloose/syntastic

ソースの静的解析を行ってくれるプラグイン。

rubocop などと組み合わせて利用する。

今回の設定だと、バッファの保存時に静的解析が走るようになっている。

synta.gif

thinca/vim-ref

rubyの1 リファレンスをvimから開くことができるようにしてくれるプラグイン。

調べたいメソッドやクラス名などにカーソルが当たっている状態で Shift + k で、そのリファレンスが開けます。

また、 Ref refe {調べたいメソッド名やクラス名} でも、検索できます。

explain.gif

szw/vim-tags

タグの生成やキーバインドの設定など、タグジャンプ機能の補助してくれる。

tpope/vim-endwise

class とか def とかの end を自動挿入してくれるプラグイン。

地味だけど超便利。

end.gif

scrooloose/nerdtree

IDE とか でお馴染みのサイドメニュー的なファイルエクスプローラ。

ブックマーク機能が便利。

NREDTree.gif

chase/vim-ansible-yaml

vim 標準の yaml のシンタックスハイライトやインデント制御が残念なので、このプラグインでいい感じにする。

tpope/vim-commentary

コメントアウト・非コメントアウトが簡単に行えるようになる。

gc.gif

cocopon/iceberg.vim

vimのシンタックスハイライトなどの色の設定です。

私のお気に入りは iceberg です。

モテるVimmerはカラースキームにこだわるんだぜ!

編集に関する設定

タブキーで半角スペースを入れるようにしたり、その際、スペースがいくつ入るのかなどの設定。

"-------------------------------------------------------------------------------
" 編集に関する設定:

" タブの画面上での幅
set tabstop=4
" 自動インデントでずれる幅
set shiftwidth=4
" タブの代わりに空白文字を指定する
set expandtab
" 新しい行のインデントを現在行と同じにする
set autoindent

ファイル操作に関する設定

ファイルのバックアップなどの設定

"-------------------------------------------------------------------------------
" ファイル操作に関する設定:

" バックアップファイル
"" 有効化
set backup
"" 出力先
set backupdir=~/.vim/.backup
" スワップファイル
"" 有効化
set swapfile
"" 出力先
set directory=~/.vim/.swap
" UNDOファイル
"" 有効化
set undofile
"" 出力先
set undodir=~/.vim/.undo
  • バックアップファイル
    • => 編集前のファイルを自動的にバックアップする。ファイルを誤って削除したり、誤った編集をしてしまっても、1つ前のバージョンであれば救出が可能になる
  • スワップファイル
    • => Vimが異常終了などして保存ができなかった際、データを復元するためのファイル
  • UNDOファイル
    • => Undo履歴が保存されている。このファイルがあると、ファイルを閉じた後でも、閉じる前のUndoを再現できる。

表示に関する設定

"-------------------------------------------------------------------------------
" 表示に関する設定:

" 行番号の表示
se nu

" 全角スペースの表示:
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

全角スペースの表示

全角スペースの強調表示するための関数の定義と呼び出し

スクリーンショット 2016-12-12 11.41.10.png

NERDTree

"-------------------------------------------------------------------------------
" NERDTree:

" .ファイルの表示(1: 表示)
let NERDTreeShowHidden=1
" ブックマークを表示 (1:表示)
let g:NERDTreeShowBookmarks=1
" 引数なしで起動した場合、NERDTreeを開く
" autocmd vimenter * if !argc() | NERDTree | endif
" 表示・非表示切り替え
nmap <silent> <C-n><C-t>      :NERDTreeToggle<CR>

Previm

以下の設定では、Firefox のディベロッパー版で開くようになってます。

"-------------------------------------------------------------------------------
" Previm:

let g:previm_open_cmd = 'open -a FirefoxDeveloperEdition'

augroup PrevimSettings
    autocmd!
    autocmd BufNewFile,BufRead *.{md,mdwn,mkd,mkdn,mark*} set filetype=markdown
augroup END

rubocop

Rubyの静的解析ツール rubocop 巡査の設定。

"-------------------------------------------------------------------------------
" rubocop:
" syntastic_mode_mapをactiveにするとバッファ保存時にsyntasticが走る
" active_filetypesに、保存時に syntastic を走らせるファイルタイプを指定する

let g:syntastic_mode_map = { 'mode': 'passive', 'active_filetypes': ['ruby'] }
let g:syntastic_ruby_checkers = ['rubocop']

refe

Rubyのリファレンスツール refe の設定。

"-------------------------------------------------------------------------------
" refe:
let g:ref_refe_cmd = $HOME.'/.rbenv/shims/refe' "refeコマンドのパス

キーバインドの設定

ショートカットやちょっとしたスクリプトのキーバインドを設定。

"-------------------------------------------------------------------------------
" map:

" 検索結果のハイライトをEsc連打でクリアする
nnoremap <ESC><ESC> :nohlsearch<CR>
" 常にvery magicを利用
nnoremap / /\v
" タブ移動
nnoremap [t :tabprevious<CR>
nnoremap ]t :tabnext<CR>

" :ls + :buffer
cnoremap bb ls<CR>:buf
" 開いてるファイルのパスを表示 (Show Path)
cnoremap sp echo expand("%:p")<CR>
" 現在日時を入力 (yyyy/MM/dd)
cnoremap date <ESC>a<C-r>=strftime("%Y/%m/%d")<CR><ESC>
" 現在日時を入力 (yyyy/MM/dd hh:mm:ss)
cnoremap datetime <ESC>a<C-r>=strftime("%Y/%m/%d %H:%M:%S")<CR><ESC>

その他

"-------------------------------------------------------------------------------
" その他設定:

" not ignore case.
se noic
" スペルチェック
set spell
set spelllang=en,cjk
" matchit.vim
runtime macros/matchit.vim
" color
colorscheme iceberg

以下の設定をしています。

  • 大文字/小文字の区別
  • スペルチェック機能の有効化
  • matchit2の有効化
  • 前述のカラースキームの有効化

スペルチェックの様子

typo.gif

スペルミスの警告の他にも修正案の提示や、適用、例外単語の追加などもできます!

.gvimrc

MacVim 用の設定ファイル。

主に見た目に関わること。

透過設定とかしてあげると最高にクールになるぜ!

スクリーンショット 2016-12-12 5.18.34.png

$$\style{color:red;}{\text{※ デスクトップが汚いことがバレます!}}$$

filetype.vim

ファイル名とファイルタイプの紐付けを行う。

vimのデフォルトでは定義されていない拡張子のファイルとかをここで定義してあげる。

下記の例では、yamlファイルに対して、プラグインで定義された ansible というファイルタイプを割り当てている。

augroup filetypedetect
  au BufRead,BufNewFile *.yaml setfiletype ansible
  au BufRead,BufNewFile *.yml  setfiletype ansible
augroup END

モテるVimmerになるにはまだまだ先は長い。。。

私は Vim を使い始めてから1年も経ってないビギナーなので、ぜひ本物のVimmerの方から「こんな便利なプラグインあるよ」とか、「そのキーバインドダメじゃね?」とかご意見いただけると嬉しいです。

また、この記事をきっかけに「Vim使ってみようかな」とかいう方が増えればいいなと思います。

最後に、本気でVimmer目指される方は、入門書として『実践Vim 思考のスピードで編集しよう!』をお勧めします!

Vim でいかに効率よくコーディングできるかや、Vimの苦手なこと(日本語入力とか)がよく分かります。


  1. 特定の言語に依存はしてないです。。。 

  2. classendifend など対応するブロックの先頭、終端にジャンプできる機能 

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
What you can do with signing up
36
Help us understand the problem. What are the problem?