Perl Casual #02でVimについてお話しさせて頂きました - iDeaList::Writing にあった Vim の紹介スライド、その中にあった Vim スクリプトを誠に勝手ながら添削してみました。
スライドは以下。
http://www.slideshare.net/acotie/perl-casual2
"TT用 syntax au BufEnter *.tt,*.cfm execute ":setlocal filetype=html" "test code用 syntax au BufEnter *.t execute ":setlocal filetype=perl"http://www.slideshare.net/acotie/perl-casual2/30
まず、この場合 execute は必要ないです。execute が必要になるのは、
- 式(変数や関数) の結果の文字列を実行したい場合
- 制御文字を入れたい場合
- "\
" など
- "\
くらい。くらいと言う割にはそれなりに必要なことがあるんだけど。
加えて、ファイルタイプを追加したい場合はよほど特殊な事情がない限りは BufReadPost,BufNewFile を使います。
"TT用syntax au BufReadPost,BufNewFile *.tt,*.cfm :setlocal filetype=html "test code用syntax au BufReadPost,BufNewFile *.t :setlocal filetype=perl
あと、ファイルタイプの追加は正式には ~/.vim/ftdetect/* 以下に上記の内容を書いたファイルを置いておきます。詳しくは :help ftdetect を参照。
…のだけど、ファイル分離するの面倒って場合は vimrc に書いても概ね問題ないです。ただその場合は(この場合に限らず autocmd を使っている箇所では) augroup を設定した方がいいです。詳しくはvimrc基礎文法最速マスターで。
"ファイルタイプ別辞書ファイル autocmd FileType c,cpp,perl set cindent autocmd FileType ruby :set dictionary=~/.vim/plugin/ruby.vim autocmd FileType perl :set dictionary+=~/.vim/dict/perl_function.dict autocmd FileType perl :compiler perlhttp://www.slideshare.net/acotie/perl-casual2/32
これらの設定では :setlocal を使うべき。詳細は http://vim-users.jp/2009/05/hack15/ を参照。
あと、:set dictionary=~/.vim/plugin/ruby.vim これって多分何かの間違いだよね…? そうだと言って!
"perltidy map ,pt <ESC>:%! perltidy<CR> map ,ptv <ESC>:%'<, '>! perltidy<CR> ":w + !perl command map <F4> :w !perl<CR> "!perl command map <F5> :!perl %<CR>http://www.slideshare.net/acotie/perl-casual2/36
この手の map は noremap を使った方がいいです。これもvimrc基礎文法最速マスターを参照。
2 個目の ,ptv のところ、 :%'<, '> となってますが、% は範囲指定でバッファ全体、'<,'>も範囲指定でビジュアルモードで最後に選択した範囲で、範囲を2つ指定しているので、これでは動かないはず。% を消す必要があります。詳しくは http://vim-users.jp/2009/06/hack30/ を参照。
map <C-Down> <C-w>j map <C-Up> <C-w>k map <C-Left> <C-w>h map <C-Right> <C-w>l map <C-j> <C-W>j<C-w>_ map <C-k> <C-W>k<C-w>_ map <C-h> <C-w>h<C-w>_ map <C-l> <C-w>l<C-w>_ map <F6> :split<C-M> " cycle fast through buffers ... nnoremap <C-n> :bn<CR> nnoremap <C-p> :bp<CR>http://www.slideshare.net/acotie/perl-casual2/37
ここも noremap を使うってことで、それはさっき言ったからいいとして、完全に余談なんだけど、
iab PSIMPLE <ESC>:r ~/.vim/tmpl/perl_simple.pl<CR> iab PMODULE <ESC>:r ~/.vim/tmpl/perl_module.pl<CR> iab PSUB <ESC>:r ~/.vim/tmpl/perl_sub.pl<CR> iab PHREF $hash_name->{namae} iab PFOREACH foreach my $element (@nanigasi){ iab PFOR for ( my $i=1; $i <= 100; $i++ ){ iab PRINT print $i, "\n";http://www.slideshare.net/acotie/perl-casual2/38
:iabbrev には実は :inoreabbrev ってのもあって、map と同じ理由でこちらを使った方が良い。あと abbrev でも map と同様に