Rethink Vim

gVimは使わない。

Vimmerになりまだ半年たっていないがWindowsのgVimにイライラ来ていたので自分のVim環境について考え直してみる。

WindowsからはCygwinで、MacからはiTremで使うことによりどこでも大体同じ環境でコーディングできるようにする。(MacVimは卒業する。)

.vimrcはHg管理下に置く。
ついでに.vimperatorrcも管理したいのでWindowsではシンボリックリンクを作成しておくことにする。(Macでは同じ場所にあるので大丈夫)

>> mklink /d "作成場所パス" "参照先パス"

でおk。(ただし、管理者権限でcmdを起動しないとダメだった)
Win7:シンボリックリンクについての詳細は
Windows7(vista)の便利機能シンボリックリンクでデータをDドライブへ逃がす - consbiol のエコ日記

Mac OS X 10.6.8 : シンボリックリンク
UNIX や Linux でシンボリックリンクを作成・削除するコマンド。 | btmup Blog
UNIXの部屋 コマンド検索:ln (*BSD/Linux)

zshは必須。
CygwinではByobu、iTermではtmuxを使うことにする。

フォントはゆたぽんです。見やすいしなごみます。
font ゆたぽん(コーディング) フォント

基本的な設定

マウスのドラッグで選択すると行番号が入ってしまうので
クリップボードへコピーがうまくいかない。
行番号の表示をマッピングしてさくっと切り替えてコピーすることに。

"viとの互換を取らない
set nocompatible
"行番号の表示
set number
"タイトルをウィンドウ枠に表示
set title
"ルーラーを表示(ステータスバーにカーソル位置を表示)
set ruler
"入力中のコマンドをステータスに表示する
set showcmd
"括弧対応表示
set showmatch
"ステータスラインを常に表示
set laststatus=2
"バックスペースに関する設定
"indent : 行頭の空白削除
"eol    : 改行の削除
"start  : 挿入モードでの削除
set backspace=indent,eol,start
"タブの幅
set ts=4 sw=4 sts=0
"新しい行を直前の行と同じインデントにする
set autoindent
"tabを空白に置き換えない
set noexpandtab
"オートインデントを有効にする
set cindent
"バックアップファイルを作成しない
set nobackup
"スワップファイルを作成しない
set noswapfile
"Syntax HighLight
syntax on
"見づらい色を変更する(背景が黒の場合見づらいので)
hi Comment ctermfg=cyan
hi Directory ctermfg=cyan
hi SpecialKey ctermfg=cyan
hi Constant ctermfg=red
hi WarningMsg ctermfg=red

"色の確認用コマンド
command! HighLightList so $VIMRUNTIME/syntax/hitest.vim
command! ColorList so $VIMRUNTIME/syntax/colortest.vim
"ビープ音を鳴らさない
set vb t_vb=
"ClipBoardの利用
set clipboard&
set clipboard+=unnamed
set clipboard+=autoselect
set clipboard=unnamed
" 検索のハイライト
set hlsearch
" <ESC>×2で検索の解除
nmap <ESC><ESC> :nohlsearch<CR><ESC>
"最後までサーチすると先頭に戻る
set wrapscan
"大文字小文字の区別をしない
set ignorecase
"検索文字列に大文字があった場合に反映
set incsearch
"分割画面切り替えキーバインド
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-h> <C-w>h
nnoremap <C-l> <C-w>l
"長い文章を折り返さない
set nowrap
"他で書き換えられたら自動で読み直す
set autoread
"保存しなくてもバッファを切り替えることができる
set hidden
"vimrcをいつでも簡単に(rce/rcs)
nmap rc [vimrc]
nnoremap <silent> [vimrc] :<C-u>e $MYVIMRC<CR>
nnoremap <silent> [vimrc]v :<C-u>vs $MYVIMRC<CR>
nnoremap <silent> [vimrc]s :<C-u>sp $MYVIMRC<CR>
nnoremap <silent> [vimrc]r :<C-u>source $MYVIMRC<CR>
"vimrcを自動更新
augroup vimrc
    autocmd!
    autocmd BufWritePost $MYVIMRC source $MYVIMRC
augroup END
" tabnewをいつでも簡単に
nnoremap <silent> tn :<C-u>tabnew<CR>
" KaoriyaのCdCurrent的なものを<Space> + cdで
command! -nargs=? -complete=dir -bang CD  call s:ChangeCurrentDir('<args>', '<bang>')
function! s:ChangeCurrentDir(directory, bang)
    if a:directory == ''
        lcd %:p:h
    else
        execute 'lcd' . a:directory
    endif
    if a:bang == ''
        pwd
    endif
endfunction
"Change current directory.
nnoremap <silent> <Space> cd :<C-u>CD<CR>
"行番号の表示/非表示をマッピング
"(クリップボードが使えないときのコピー用)
nnoremap <silent> non :<C-u>set nonumber<CR>
nnoremap <silent> setn :<C-u>set number<CR>
"helpで:help
nnoremap <silent> help :<C-u>help<CR>
"vimdiffにコマンド(Diff)を割り振る
"2ファイルをまとめて指定するときはデフォルトのvimdiff
command! -nargs=1 -complete=file Diff vertical diffsplit <args>

Python

Pythonを快適に編集できるようvimを設定する - 玉虫色に染まれ!
Hashnote - Vimを最強のPython IDEにする
を参考に。

augroup Python_Coding
    au FileType python call s:python_setting()
augroup END

function! s:python_setting()
    "インデント
    setl autoindent
    setl smartindent cinwords=if,elif,else,for,while,try,except,finally,def,cl
    setl expandtab tabstop=4 shiftwidth=4 softtabstop=4
    "PEP 8 長い行をハイライトする
    set textwidth=0
    if exists('&colorcolumn')
        set colorcolumn&
        set colorcolumn=+1
        setl textwidth=80
    endif
    setl textwidth=80
    setl colorcolumn=80
    "インデントでたためるようになる
    setl foldmethod=indent
    setl foldlevel=99
endfunction

Pythonのファイルの時だけ設定を変更したいのでsetl(setlocal)を使う。

PEP 8は80文字以上の行をハイライトする設定。以下を参考に作成。
Vim-users.jp - Hack #217: 横幅が長いコードをハイライトする

使ってないけど便利そうなもの

  • pysmell
    • pythonの補間をサポート。
    • easy-install or pipでpysmellを入れておかないと使えない。
  • pyflakes
    • gVimでないと使えない。

プラグイン

neobundle

プラグイン管理にはneobundleを使う。

filetype plugin indent off

if has('vim_starting')
    set runtimepath+=~/.vim/neobundle
    call neobundle#rc(expand('~/.vim/bundle'))
endif

NeoBundle 'https://github.com/Shougo/neocomplcache.git'
NeoBundle 'https://github.com/Shougo/vimshell.git'
NeoBundle 'https://github.com/Shougo/vimproc.git'
NeoBundle 'https://github.com/Shougo/vimfiler.git'
NeoBundle 'https://github.com/Shougo/unite.vim.git'
NeoBundle 'https://github.com/thinca/vim-quickrun.git'
NeoBundle 'https://github.com/scrooloose/nerdtree.git'
NeoBundle 'https://github.com/mattn/multi-vim.git'
NeoBundle 'https://github.com/mattn/zencoding-vim.git'
NeoBundle 'https://github.com/mattn/zencoding-vim.git'
NeoBundle 'https://github.com/scrooloose/nerdcommenter.git'
NeoBundle 'https://github.com/vim-scripts/YankRing.vim.git'
NeoBundle 'https://github.com/vim-scripts/Pydiction.git'

filetype plugin indent on

neocomplecache/neosnippet

あるVimmerのブログ: neocomplcache Ver.7の新機能とその設計思想について
neocom ver7から併用になった。

NeoBundle 'https://github.com/Shougo/neocomplcache.git'
NeoBundle 'https://github.com/Shougo/neosnippet.git'

入れてみたが、"//"と入力すると長いことフリーズし"ユーザ定義補完 (^U^N^P) パターンは見つかりませんでした"とのメッセージが出て再びそこにカーソルを動かすと(ry

という現象が起こり、解決するにもneocomの中身はよくわからないのでペンディング。きっといつか解決されるだろう。

ver6.1に戻すことに。neocomローカルリポジトリにて。

git revert [ver 6.1のコミットハッシュコード]

READMEにあるものを大体そのまま使ってる。

" Disable AutoComplPop.
let g:acp_enableAtStartup = 0
" Use neocomplcache.
let g:neocomplcache_enable_at_startup = 1
" Use smartcase.
let g:neocomplcache_enable_smart_case = 1
" Use camel case completion.
let g:neocomplcache_enable_camel_case_completion = 1
" Use underbar completion.
let g:neocomplcache_enable_underbar_completion = 1
" Set minimum syntax keyword length.
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*'

" Define dictionary.
let g:neocomplcache_dictionary_filetype_lists = {
    \ 'default' : '',
    \ 'vimshell' : $HOME.'/.vimshell/command_history',
    \ }

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

" Plugin key-mappings.
imap <C-k>     <Plug>(neocomplcache_snippets_expand)
smap <C-k>     <Plug>(neocomplcache_snippets_expand)
inoremap <expr><C-g>     neocomplcache#undo_completion()
inoremap <expr><C-l>     neocomplcache#complete_common_string()

" SuperTab like snippets behavior.
"imap <expr><TAB> neocomplcache#sources#snippets_complete#expandable() ? "\<Plug>(neocomplcache_snippets_expand)" : pumvisible() ? "\<C-n>" : "\<TAB>"

" Recommended key-mappings.
" <CR>: close popup and save indent.
inoremap <expr><CR>  neocomplcache#smart_close_popup() . "\<CR>"
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
" <C-h>, <BS>: close popup and delete backword char.
inoremap <expr><C-h> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><BS> neocomplcache#smart_close_popup()."\<C-h>"
inoremap <expr><C-y>  neocomplcache#close_popup()
inoremap <expr><C-e>  neocomplcache#cancel_popup()

" AutoComplPop like behavior.
"let g:neocomplcache_enable_auto_select = 1

" Shell like behavior(not recommended).
"set completeopt+=longest
"let g:neocomplcache_enable_auto_select = 1
"let g:neocomplcache_disable_auto_complete = 1
"inoremap <expr><TAB>  pumvisible() ? "\<Down>" : "\<TAB>"
"inoremap <expr><CR>  neocomplcache#smart_close_popup() . "\<CR>"

vimproc

vimfilerの項にあるリンクにコンパイル方法があるのでそこを参考に。
OSごとにmakefileが用意されているので、合っているものを選んでコンパイルして使う。
以下のプラグインはこれがないと動かないもの多数。

vimshell

シームレスな。

nnoremap <silent> vs :<C-u>VimShell<CR>
nnoremap <silent> vp :<C-u>VimShellPop<CR>

quickrun

\r。
これがないとVim使う意味がないくらい活躍している。

unite

Unite vim

"インサートモードで開始しない
let g:unite_enable_start_insert=0
"file_mruの高速化
let g:unite_source_file_mru_filename_format = ''
"キーマッピング
nmap f [unite]
nnoremap <silent> [unite]b :<C-u>Unite buffer<CR>
nnoremap <silent> [unite]f :<C-u>Unite file<CR>
nnoremap <silent> [unite]m :<C-u>Unite file_mru<CR>
nnoremap <silent> [unite]c :<C-u>Unite bookmark<CR>
nnoremap <silent> [unite]a :<C-u>UniteBookmarkAdd<CR>
nnoremap <silent> [unite]r :<C-u>Unite -buffer-name=register register<CR>

augroup MyUnite
    autocmd FileType unite call s:unite_setting()
augroup END

function! s:unite_setting()
    "<ESC>でuniteを終了(消えるのに1秒くらいかかる)
    nmap <buffer> <ESC> <Plug>(unite_exit)
    "分割して開く
    nnoremap <silent> <buffer> <expr> <C-s> unite#do_action('split')
    inoremap <silent> <buffer> <expr> <C-s> unite#do_action('split')
    nnoremap <silent> <buffer> <expr> <C-v> unite#do_action('vsplit')
    inoremap <silent> <buffer> <expr> <C-v> unite#do_action('vsplit')
endfunction

vimfiler

vimfilerとUniteでVimをファイラとして使用する方法 | karakaram-blog
uniteと連携することにより更なるパワーを引き出せるようなので。"fi"でIDE風に開く。q(QUIT) or Q(HIDE)で消える。
操作方法も上記のリンクに。

"vimデフォルトのエクスプローラをvimfilerで置き換える
let g:vimfiler_as_default_explorer = 1
"セーフモードを無効にした状態で起動する
let g:vimfiler_safe_mode_by_default = 0
"現在開いているバッファのディレクトリを開く
nnoremap <silent> fe :<C-u>VimFilerBufferDir -quit<CR>
"現在開いているバッファをIDE風に開く
nnoremap <silent> fi :<C-u>VimFilerBufferDir -split -simple -winwidth=35 -no-quit

"デフォルトのキーマッピングを変更
augroup vimrc
    autocmd FileType vimfiler call s:vimfiler_my_settings()
augroup END
function! s:vimfiler_my_settings()
    nmap <buffer> q <Plug>(vimfiler_exit)
    nmap <buffer> Q <Plug>(vimfiler_hide)
endfunction

nerdtree

Ctrl-eで開いたり、隠したりできるように。下のリンクを参考に。
Hunting Field: [vim] NERDTreeをもっと使いやすくするための設定

" vim実行時に引数なしなら、NERDTreeを実行する
let file_name = expand("%:p")
if has('vim_starting') &&  file_name == ""
    autocmd VimEnter * call ExecuteNERDTree()
endif

" カーソルが外れているときは自動的にnerdtreeを隠す
function! ExecuteNERDTree()
    "b:nerdstatus = 1 : NERDTree 表示中
    "b:nerdstatus = 2 : NERDTree 非表示中

    if !exists('g:nerdstatus')
        execute 'NERDTree ./'
        let g:windowWidth = winwidth(winnr())
        let g:nerdtreebuf = bufnr('')
        let g:nerdstatus = 1

    elseif g:nerdstatus == 1
        execute 'wincmd t'
        execute 'vertical resize' 0
        execute 'wincmd p'
        let g:nerdstatus = 2
    elseif g:nerdstatus == 2
        execute 'wincmd t'
        execute 'vertical resize' g:windowWidth
        let g:nerdstatus = 1

    endif
endfunction
noremap <c-e> :<c-u>:call ExecuteNERDTree()<cr>

使い方はNERDTree起動中に'?'を見れば全部書いてある。下のリンクにも書いてあるっぽい。
英語&英会話学習SNS開発記録 : vimプラグインのNERDTreeを自分好みにカスタマイズ。

multi-vim

Sublime Text2みたいなことができるネタ機能。

何かデモを見るとすごいことになっているように見える。

"Sublime Text2風な動きができるプラグイン
":Multi ^ で全テキストの前に文字を追加
":Multi $ で全テキストの後に文字を追加
":Multi hoge で指定文字hogeをまとめて編集
"2012/11現在非常にバグった動きをする
"・まとめて指定時削除の挙動がおかしい
"・neocomが割り込むと動作がバグる
"・実用性があるのか不明なので一応入れたがスル―
"・範囲指定ができない。。。

zencoding-vim

ZenCoding for Vim 導入方法(初心者さん向け) - sakurako_sの日記
タブインデントの設定だけする。

"タブインデントを使う
let g:user_zen_settings = { 'indentation':'    ' }

作成したmattnさんのページを参考に使い方を。全機能使えるわけではないので。
http://mattn.kaoriya.net/software/vim/20100306021632.htm

チートシートもあるので。
http://code.google.com/p/zen-coding/wiki/CheatSheets;title

実際に使ってみて参考にしたページ
Big Sky :: zen-coding for vim を pure vimscript だけで書いてみた。
Big Sky :: zen-codingの殆どの機能をzencoding.vimに取り込んだ。

NERD_commenter.vim

コメント処理をサポートしてくれる。
scrooloose/nerdcommenter · GitHub <- リポジトリ

使い方↓
VimのヤバすぎコメントプラグインNERD_comments.vim - ボクノス

独自のキーマッピングを使いたい。
http://nishikawasasaki.hatenablog.com/entry/20101226/1293374432

"デフォルトのキーバインドを無効に
let g:NERDCreateDefaultMappings = 0
"コメントアウトはCtrl+Cで
nmap <C-c> <Plug>NERDCommenterToggle
vmap <C-c> <Plug>NERDCommenterToggle

他にもいろいろできそうなのでDocumentを読んでみよう。

smooth_scroll.vim(リポジトリがないので拾ってくる)

これでプレゼンもバッチリ。

"<C-d>:半画面下にスクロール
"<C-u>:半画面上にスクロール
"<C-f>:全画面下にスクロール
"<C-b>:全画面上にスクロール

Vimで超スムーズスクロール - ナレッジエース
Vimでスムーズスクロール - ボクノス

pydiction

vim-scripts/Pydiction · GitHub <- github
http://www.vim.org/scripts/script.php?script_id=850 <- vim.org
とりあえず、デフォルトの辞書をneocomに登録。

" Define dictionary.
let g:neocomplcache_dictionary_filetype_lists = {
    \ 'default' : '',
    \ 'python' : $HOME.'/.vim/Pydiction/complete_dict',
    \ 'vimshell' : $HOME.'/.vimshell/command_history',
    \ }

Pydiction.pyというモジュールが入っていて、これからほしいライブラリの辞書を増やしていける。

Djangoには読み込めないモジュールがあるらしいので注意。詳細は下記のリンク。

Pythonの開発環境をvimに整える - やさしいデスマーチ

リポジトリ

Bitbuket - hg
Log in — Bitbucket

最近の情報はリポジトリへ。

gvim

使わないはずだが、gvimもvimperatorのエディタとして使ったりしたいので。簡単に。

" encording
set enc=utf-8
set fenc=utf-8
set fencs=iso-2022,utf-8,euc-jp,cp932
" Font
set guifont=ゆたぽん(コーディング):h16
" カラースキーマ
colorscheme desert
" ツールバーとかいらんな
set guioptions-=T
" About guioptions
" T : ツールバー表示
" m : メニュー表示
" ウィンドウの幅(フルスクリーンで)
set columns=9999
set lines=9999
winpos 0 0 
" フルスクリーンショートカットキー
nnoremap <silent> <C-f> :set fu<CR>
nnoremap <silent> <C-c> :set nofu<CR>

Tips

はてな記法はvimscriptまでハイライトできるとは

nnnoremap hoge hoge

.vimrcリロードには注意

Vim-users.jp - Hack #74: 簡単にvimrcを編集する
autocmd, += はリロード時に何度も追加されてしまうので以下のように記述する。

augroup MyAutoCmd
    autocmd!
augroup END
・・・・
autocmd MyAutoCmd FileType * set textwidth=0
autocmd MyAutoCmd FileType * set formatoptions-=ro
  1. =は以下のように。
set hoge_option&
set hoge_option+=piyo

function

function! s:hoge()
    "中身
endfunction

!はリロード可能な関数を表し、s:はローカル関数ということを表す。
Vim エディターのスクリプトの作成: 第 2 回 ユーザー定義関数

command

command! or mapを考えたところ':'を押さなくもいいmapをたくさん採用しているがcommandがイマイチわかってなかったのもある。
vimdiffが優秀なのでコマンドを割り当てる。

command! -nargs=1 -complete=file Diff vertical diffsplit <args>

commandの設定については以下を参考に。
Vim-users.jp - Hack #158: ユーザコマンドを定義する
Vimスクリプトの初心者がコマンドを定義してみた - 零客痩地

Color

Cygwinのデフォルトの背景では青文字は非常に見づらいので色を変更する。
(被害はコメント、NERDTree、SpecialKey)

Vimの色の設定は

:highlight

で見ることが可能。もっと見やすいのが良ければ

:source $VIMRUNTIME/syntax/hitest.vim

青になっているすべての設定を変更する。(darkredも変えた)

hi Comment ctermfg=cyan
hi Directory ctermfg=cyan
hi SpecialKey ctermfg=cyan
hi Constant ctermfg=red
hi WarningMsg ctermfg=red

vim/gvimの色設定について - fudist
vimカラーの微調整時のまとめ。 - connvoi_tyouの日記

すべての色が使えるわけではない

VimLで色指定する数値の一覧 | Inhale n' Exhale
上を参考にperlスクリプトを動かしてみて使える色をチェックしたが、一部しか使えない。

Vim上で使える色は

:so $VIMRUNTIME/syntax/colortest.vim

で確認することが可能。

とりあえずかぶってないcyanを使った(Identifierにdarkcyanが使われているが)

色が気になってきたのでvimrcに以下を追加する。

"色の確認用コマンド
command! HighLightList so $VIMRUNTIME/syntax/hitest.vim
command! ColorList so $VIMRUNTIME/syntax/colortest.vim

Folding

畳む。
vim-折り畳み操作

visual modeで選択し
zf
一段階であれば、畳み込んでいるところで
zc(close)
zo(open)

autoread

ファイルを切り替えたらautoloadが走るようにする。
Vim-users.jp - Hack #206: 外部で変更のあったファイルを自動的に読み直す

<>

vsplitの時、幅を変えられるようにした。

vimでvsplit(縦分割)の幅変更 - 綾小路龍之介の素人思考

Encoding

viで日本語の文字コードを自動判別 - 玉虫色に染まれ!
setlにすれば大丈夫?

setl encoding=utf-8
setl fileencodings=ucs-bom,iso-2022-jp-3,iso-2022-jp,eucjp-ms,euc-jisx0213,euc-jp,sjis,cp932,utf-8

zsh

リポジトリにはzshellの設定ファイルもあるので。
あまり深くzshの設定については知らないのでどこかにあった設定をそのまま使っている。

PATHはちゃんと設定しましょう($PATHがなかったorz)
http://d.hatena.ne.jp/tsaka/20060819/1162739565;title

Macはchshでログインシェルの変更ができる。
chsh -s /usr/bin/zsh
みたいな。
UNIXコマンド [chsh]
bash から zsh に乗り換えた【その仕事、蠍は留守です】