最近の.vimrc

いつも気がついたら.vimrc編集、って感じなのでずいぶんカオスってきた。
で、色々と直してたのだけど、ついでにさらしてみるのもいいかと思ってさらしてみた。
まぁ、前に一度さらしてるのだが。
加えてちょこちょことおすすめ設定をば。


ということで、.vimrc全体。

syntax on
filetype plugin on
filetype indent on

" set {{{1
set title
set nocompatible
set noinsertmode
set ruler
set wildmode=list:longest
set wildmenu
set showmatch
set matchpairs+=<:>
set matchtime=3
set hidden
set nowrap
set list
set listchars=tab:\ \ ,trail:_,precedes:<,extends:>
set laststatus=2
set cmdheight=1
set showmode
set smartindent
set autoindent
set incsearch
set hlsearch
set wrapscan
set encoding=utf-8
set backspace=indent,start,eol
set fileformats=unix,dos,mac
set laststatus=2
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8p
set showcmd
set nrformats-=octal
set tags=./tags,../tags,~/tags
set viewdir=~/.backup/view
set backupdir=~/.backup/vim
set backup
set foldmethod=marker
set foldlevel=15
set completeopt+=longest
if exists('&ambiwidth')
	set ambiwidth=single
endif
let g:netrw_liststyle=1

" 自動文字コード判別 {{{1
set fileencoding=utf-8
set fileencodings=iso-2022-jp,utf-8,euc-jp,sjis
if has('autocmd')
	function! AU_ReCheck_FENC()
		if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
			let &fileencoding=&encoding
		endif
	endfunction
	autocmd BufReadPost * call AU_ReCheck_FENC()
endif

" 自動バックアップ {{{1
if has( "autocmd" )
	autocmd BufWritePre * call UpdateBackupFile()
	function! UpdateBackupFile()
		let dir = strftime("~/.backup/vim/%Y/%m/%d", localtime())
		if !isdirectory(dir)
			let retval = system("mkdir -p ".dir)
			let retval = system("chown 500:500 ".dir)
		endif
		exe "set backupdir=".dir
		unlet dir

		let time = strftime("%H_%M_%S", localtime())
		exe "set backupext=.".time
	endfunction
endif

" mapping {{{1
map <C-E>n :tabnew<CR>
map <C-E>o :tabe
map <C-E>c :tabc
map <C-E><Right> :tabn<CR>
map <C-E><Left> :tabp<CR>

nmap n nzz
nmap N Nzz
nmap * *zz
nmap # #zz
nmap g* g*zz
nmap g# g#zz
nmap j gj
nmap k gk

nmap <ESC><ESC> :nohl<CR><ESC>

nmap \gc :cc<CR>
nmap \gp :cp<CR>
nmap \gP :cfirst<CR>
nmap \gn :cn<CR>
nmap \gN :clast<CR>

map \mm :set aw \| make \| set noaw<CR>
map \mn :set aw \| make clean \| make \| set noaw<CR>

map <C-T><C-T> :tabnew \| Explore<CR>
map <C-T><C-Y> :tabn<CR>
map <C-T><C-R> :tabp<CR>
map <C-T><C-G> :tabc<CR>
map! <C-T><C-T> <ESC>:tabnew \| Explore<CR>
map! <C-T><C-Y> <ESC>:tabn<CR>
map! <C-T><C-R> <ESC>:tabp<CR>
map! <C-T><C-G> <ESC>:tabc<CR>

map <C-E><C-E> :Explore<CR>
map! <C-E><C-E> <ESC>:Explore<CR>

map <C-P> <C-N>

if has( "clipboard" )
	vmap \d "+d
	vmap \D "+D
	vmap \y "+y
	vmap \Y "+Y
	vmap \p "+p
	vmap \P "+P
	nmap \d "+d
	nmap \D "+D
	nmap \y "+y
	nmap \Y "+Y
	nmap \p "+p
	nmap \P "+P
endif

" Color関係 {{{1
hi Pmenu ctermbg=4
hi PmenuSel ctermbg=1
hi PMenuSbar ctermbg=4
highlight Comment ctermfg=6

highlight ZenkakuSpace cterm=underline
match ZenkakuSpace / /

" ファイル毎の設定 {{{1
if has( "autocmd" )
	autocmd FileType ruby set ts=2 sw=2 sts=2
	autocmd FileType actionscript :set dictionary=~/.vim/dict/actionscript3.dict
	autocmd FileType tex :set dictionary=~/.vim/dict/tex.dict
	autocmd FileType lecturememo :set dictionary=~/.vim/dict/tex.dict
	set complete+=k
endif

" errorformat関係 {{{1
if has( "autocmd" )
	autocmd filetype haskell set errorformat=
	autocmd filetype haskell set errorformat+=%f:%l:%c:\ %m
	autocmd filetype haskell set errorformat+=%f:%l:%c:
	autocmd filetype prolog set errorformat=
	autocmd filetype prolog set errorformat+=ERROR:\ %f:%l:%c:\ %m
endif
set errorformat+=%D%*\\a[%*\\d]:\ ディレクトリ\ `%f'\ に入ります
set errorformat+=%X%*\\a[%*\\d]:\ ディレクトリ\ `%f'\ から出ます

" いろいろ {{{1
if has( "autocmd" )
	autocmd BufReadPost *
				\ if line("'\"") > 0 && line("'\"") <= line("$") |
				\   exe "normal! g`\"" |
				\ endif
endif

if has( "autocmd" ) && exists( "+omnifunc" )
	autocmd Filetype *
				\   if &omnifunc == "" |
				\           setlocal omnifunc=syntaxcomplete#Complete |
				\   endif
endif

" plugin設定 {{{1
" autodate {{{2
let autodate_format="%Y/%m/%d %H:%M:%S"
" autocomplpop {{{2
let g:AutoComplPop_NotEnableAtStartup=1

まずはsetの類。

先頭にまとめて書いちゃってます。
default onなやつも書いちゃったりしてるので無駄多いかも。

set title
set nocompatible
set noinsertmode
set ruler
set wildmode=list:longest
set wildmenu
set showmatch
set matchpairs+=<:>
set matchtime=3
set hidden
set nowrap
set list
set listchars=tab:\ \ ,trail:_,precedes:<,extends:>
set laststatus=2
set cmdheight=1
set showmode
set smartindent
set autoindent
set incsearch
set hlsearch
set wrapscan
set encoding=utf-8
set backspace=indent,start,eol
set fileformats=unix,dos,mac
set laststatus=2
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8p
set showcmd
set nrformats-=octal
set tags=./tags,../tags,~/tags
set viewdir=~/.backup/view
set backupdir=~/.backup/vim
set backup
set foldmethod=marker
set foldlevel=15
set completeopt+=longest
if exists('&ambiwidth')
	set ambiwidth=single
endif
let g:netrw_liststyle=1

個人的お気に入りはwildmode,wildmenu,statusline,completeopt
statuslineは一番下にでるステート行。
他人のvimいじってると時々違和感...(д
wild系とcompleteoptはほとんど趣味。
bashになれすぎなせいかlongest*1じゃないとイヤ。


あと小ネタ系でいくならmatchpairsとかnrformatsかな?
matchpairsは%コマンドとかの挙動に'<','>'のペアを加える。
nrformatsは-=octalすることでC-AやらC-X*2の挙動を変える。
デフォだと0始まりは8進数と認識されてしまうのだが8進数とか普段使わないし。


友人らの間で以外に知られてなかったのがlistとlistchars。
タブやら行末の半角スペース、あとnowrapの時の左右の省略記号を変えられる。
行末の半角スペースは結構気になるのでアンダーバーを表示させてる。


setじゃないけど、g:netrw_liststyleは変えておくと便利かも。
:Exploreのデフォの表示を変える。
Explore画面でiを押す度に表示が変わるのだが、iを押すのもめんどい。
ということで最初から詳細表示に。

自動文字コード判別

set fileencoding=utf-8
set fileencodings=iso-2022-jp,utf-8,euc-jp,sjis
if has('autocmd')
	function! AU_ReCheck_FENC()
		if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
			let &fileencoding=&encoding
		endif
	endfunction
	autocmd BufReadPost * call AU_ReCheck_FENC()
endif

えっと、空ファイルを開いたような時とかはutf-8になるように。
そのくらいかな?

自動バックアップ

一押し設定。
というか、俺これなかったら死亡するわ。
プログラマ必見。は言い過ぎか。
でもかなりイイ。

if has( "autocmd" )
	autocmd BufWritePre * call UpdateBackupFile()
	function! UpdateBackupFile()
		let dir = strftime("~/.backup/vim/%Y/%m/%d", localtime())
		if !isdirectory(dir)
			let retval = system("mkdir -p ".dir)
			let retval = system("chown 500:500 ".dir)
		endif
		exe "set backupdir=".dir
		unlet dir

		let time = strftime("%H_%M_%S", localtime())
		exe "set backupext=.".time
	endfunction
endif

バッファが上書きされる直前にバックアップを取る。
というか、バックアップファイルの名前を変えて前のが上書きされないようにする。
途中chmod 500:500してるのはsudoとかで権限が変わってたりする時用。
もっとスマートな解決策が欲しいところ。


時々見かけるのはCursorHoldを使ってる.vimrc。
んー。BufWritePreでいい気がするのだが...。
ナニカ意味があるのかな?
あとmkdirは-pオプションを使うと便利。
さすがに秒までディレクトリ作るとくどいので、時分秒は拡張子にくっつけてみた。
良い感じ(//)


こんなん書いたらハードディスクの容量つぶれるYO
とかいう人がいそうだけど、ファイル消失の恐怖に比べれば安いもの。
ないと不安になる。

mapping

多分.vimrcの中で一番個性がでる部分。

map <C-E>n :tabnew<CR>
map <C-E>o :tabe
map <C-E>c :tabc
map <C-E><Right> :tabn<CR>
map <C-E><Left> :tabp<CR>

nmap n nzz
nmap N Nzz
nmap * *zz
nmap # #zz
nmap g* g*zz
nmap g# g#zz
nmap j gj
nmap k gk

nmap <ESC><ESC> :nohl<CR><ESC>

nmap \gc :cc<CR>
nmap \gp :cp<CR>
nmap \gP :cfirst<CR>
nmap \gn :cn<CR>
nmap \gN :clast<CR>

map \mm :set aw \| make \| set noaw<CR>
map \mn :set aw \| make clean \| make \| set noaw<CR>

map <C-T><C-T> :tabnew \| Explore<CR>
map <C-T><C-Y> :tabn<CR>
map <C-T><C-R> :tabp<CR>
map <C-T><C-G> :tabc<CR>
map! <C-T><C-T> <ESC>:tabnew \| Explore<CR>
map! <C-T><C-Y> <ESC>:tabn<CR>
map! <C-T><C-R> <ESC>:tabp<CR>
map! <C-T><C-G> <ESC>:tabc<CR>

map <C-E><C-E> :Explore<CR>
map! <C-E><C-E> <ESC>:Explore<CR>

map <C-P> <C-N>

if has( "clipboard" )
	vmap \d "+d
	vmap \D "+D
	vmap \y "+y
	vmap \Y "+Y
	vmap \p "+p
	vmap \P "+P
	nmap \d "+d
	nmap \D "+D
	nmap \y "+y
	nmap \Y "+Y
	nmap \p "+p
	nmap \P "+P
endif

普段使うのは\g系と\m系、あとclipboard系。
あとは書いただけで使わないなぁ。
\mは:make関係で、\g系がその後のエラー箇所めぐり用。
vim+makeの使いやすさは異常。
は例のごとくid:viverのところから。
地味に便利。この地味さがまたよし。


clipboard関係はvimを+clipboardでコンパイルしておくと使える小技。
Linuxの(というかXの?)クリップボードへ/から、カット、ヤンク、プットができる。
set pasteもいいけど、"+pのほうがスマートだ。

ところでhas( "clipboard" )でいいのかな?
まぁ、動いてるからいいとしよう。

Color関係

色とか。見やすい色がいいのだけどどうも色は苦手(д

hi Pmenu ctermbg=4
hi PmenuSel ctermbg=1
hi PMenuSbar ctermbg=4
highlight Comment ctermfg=6

highlight ZenkakuSpace cterm=underline
match ZenkakuSpace / /

上四つは普通に色変えてるだけ。
たしか補完リストとコメントの色。
なんで記法が微妙に違うか、っていうとコピペ元*3が違うからw


で、下のは個人的お気に入りその二。
プログラマの大敵、全角スペース。
その全角スペースをhighlightします。
とりあえずunderlineつけてるだけなんだけど、いっそ背景色を変えてしまった方がいいかも。
あ、いっちゃんしたの二個のスラッシュの間は、件の全角スペースです。
便利便利。

ファイル毎の設定

if has( "autocmd" )
	autocmd FileType ruby set ts=2 sw=2 sts=2
	autocmd FileType actionscript :set dictionary=~/.vim/dict/actionscript3.dict
	autocmd FileType tex :set dictionary=~/.vim/dict/tex.dict
	autocmd FileType lecturememo :set dictionary=~/.vim/dict/tex.dict
	set complete+=k
endif

rubyのtab幅は2だろ!というid:viver氏の言葉によりtab幅2です。
あとactionscriptはなんか前書いた気がする。
tex.dictはたしかfindでみっけた.texファイルをひたすらsedして、バックスラッシュ始まりの言葉を拾ってきたカタマリ。
lecturememoはPCでノートテイクする用。
ま、あんま使ってないけど。
とりあえず自分が分かればいいので、授業で出てきた数式はなんちゃってtex記法でかいてる。

errorformat関係

vim+makeをよりよい環境にするためのもうワンステップ。
以外と認知度低めかも。errorformat。

if has( "autocmd" )
	autocmd filetype haskell set errorformat=
	autocmd filetype haskell set errorformat+=%f:%l:%c:\ %m
	autocmd filetype haskell set errorformat+=%f:%l:%c:
	autocmd filetype prolog set errorformat=
	autocmd filetype prolog set errorformat+=ERROR:\ %f:%l:%c:\ %m
endif
set errorformat+=%D%*\\a[%*\\d]:\ ディレクトリ\ `%f'\ に入ります
set errorformat+=%X%*\\a[%*\\d]:\ ディレクトリ\ `%f'\ から出ます

あんま試してなかったりするw
ghcのエラーメッセージは、形式がgccとずいぶん違うんで:makeすると、時々ご乱心する。

元のerrorformatだとコロンが入ってると問答無用でファイルと認識する。
ので、"Declared at: hoge.hs"なんていうとんでもないファイルを編集しようとしてまうのだ。

ということで、一旦errorformatを空にしてやって新たに定義を追加。
%E,%Cとか使って複数行エラーを拾ってもやってもいいのだが、エラーメッセージが長すぎて使いづらくなるので断念。
まぁ、いざとなれば:cwindowつかえばいいさ。
prologも同様。あんま使わないけど。


あと下の二行は日本語化されたgcc(というかmakeか?)でもちゃんとディレクトリ移動できりょうに追加してみた。
まぁ、これまたあまり使わないなぁ...。

いろいろ

もはや適当ッス

if has( "autocmd" )
	autocmd BufReadPost *
				\ if line("'\"") > 0 && line("'\"") <= line("$") |
				\   exe "normal! g`\"" |
				\ endif
endif

if has( "autocmd" ) && exists( "+omnifunc" )
	autocmd Filetype *
				\   if &omnifunc == "" |
				\           setlocal omnifunc=syntaxcomplete#Complete |
				\   endif
endif

前者は前回終了したカーソル位置を復元するもの。
たしかmandrivavimは最初から有効だったような...。何でかいてあるんだろう。
後者は、えっと、なんだけ?
なんかomnicompまわりっぽいけど...。
いつ書いたんだ?これ?
分からない(苦笑

plugin設定

まぁ、あとはpluginの設定とか。

" autodate {{{2
let autodate_format="%Y/%m/%d %H:%M:%S"
" autocomplpop {{{2
let g:AutoComplPop_NotEnableAtStartup=1

ということで、

ざっとこんな感じです。

まぁ、何かの参考になれば。

*1:longest: 候補のうち、先頭に共通部分があれば補完して一覧を表示する方法

*2:C-A,C-X: カーソル下に数字があればインクリメント/デクリメントする

*3:コピペ元 : →id:viver