読者です 読者をやめる 読者になる 読者になる

Vim Loves Perl - Perl Casual#2 内のコードの添削をしてみた

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 が必要になるのは、

  1. 式(変数や関数) の結果の文字列を実行したい場合
  2. 制御文字を入れたい場合
    • "\" など

くらい。くらいと言う割にはそれなりに必要なことがあるんだけど。


加えて、ファイルタイプを追加したい場合はよほど特殊な事情がない限りは 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 perl
http://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/ を参照。


の箇所、もしこれが「保存してからperlコマンドを実行」を意図しているなら、期待通りには動きません。:w !{cmd} は、バッファの内容をコマンドの標準入力に渡して実行する、の意味なので、保存はされません。


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 を使うってことで、それはさっき言ったからいいとして、完全に余談なんだけど、 は基本的にどれを使っても同じです。どの書き方をするかは好みの問題。 についてはCUI版は当然として、GUI版では私の知る限りではと同じになってる。まあGUI版では同じである必要はないので今後変わるかも知れないけど。


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 と同様に を使ってバッファローカルな設定が作れるので、FileType と組み合わせれば perl 編集中時のみ有効な abbrev も設定できる。