バッファ切り替え時に発生する autocmd のイベントって無いのかな?
autocmd BufNewFile,BufRead *.tt inoremap [ [%%]<ESC>hi
とかってやりたいのですが、perl ファイルを開いた後に、TT ファイルを開くと "inoremap [" の設定が上書きされてしまい、perl ファイルを開いているバッファに戻った時に、すごく困る。
bp とか bn で発生する autocmd のイベントは無いのかなぁ?
上記の場合、毎回、関数を呼び出して &syntax の値を参照して処理を分岐しても良いのですが・・・下記の場合だと、困る。
autocmd Syntax perl,ruby set softtabstop=4 | set shiftwidth=4 | set tabstop=4 autocmd Syntax html,xhml,yaml,javascript set softtabstop=2 | set shiftwidth=2 | set tabstop=2
どこかで質問してみよう・・・
訂正
softtabstop、shiftwidth、tabstop は、バッファ毎に設定できるので、問題なかった。
最終的に下記のような感じに。
タブの設定
autocmd BufNewFile,BufRead * call SetTab() function SetTab() if &syntax == 'javascript' || &syntax == 'html' || &syntax == 'xhtml' || &syntax == 'css' || &syntax == 'tt2html' || &syntax == 'yaml' || &syntax == 'vim' execute 'set softtabstop=2 | set shiftwidth=2 | set tabstop=2' else execute 'set softtabstop=4 | set shiftwidth=4 | set tabstop=4' endif endf
括弧の設定
inoremap ( ()<ESC>i inoremap { {}<ESC>i inoremap [ <C-R>=AddPair('[')<CR> inoremap < <C-R>=AddPair('<')<CR> function AddPair(char) if a:char == '[' if &syntax == 'tt2html' return "[%%]?<LEFT>?<LEFT>" else return "[]?<LEFT>" endif elseif a:char == '<' if &syntax == 'html' || &syntax == 'xhtml' || &syntax == 'tt2html' || &syntax == 'vim' return "<>?<LEFT>" else return '<' endif endif endf inoremap ) <C-R>=ClosePair(')')<CR> inoremap } <C-R>=ClosePair('}')<CR> inoremap ] <C-R>=ClosePair(']')<CR> inoremap > <C-R>=ClosePairHtml('>')<CR> function ClosePair(char) if getline('.')[col('.') - 1] == a:char return "?<RIGHT>" else return a:char endif endf function ClosePairHtml(char) if &syntax == 'html' || &syntax == 'xhtml' || &syntax == 'tt2html' || &syntax == 'vim' return ClosePair(a:char) else return a:char endif endf nmap ( i(<ESC>lxea)<ESC> nmap { i{<ESC>lxea}<ESC> nmap [ i[<ESC>lxea]<ESC> vmap ( v`<I<CR><ESC>k0i(<ESC>lx`>o)<CR><ESC> vmap { v`<I<CR><ESC>k0i{<ESC>lx`>o}<CR><ESC> vmap [ v`<I<CR><ESC>k0i[<ESC>lx`>o]<CR><ESC> nmap ' i'<ESC>ea'<ESC> nmap " i"<ESC>ea"<ESC>
シンタックスの設定
map ,t :call SyntaxCheck()<CR> function SyntaxCheck() execute ':w' if &syntax == 'perl' execute ':!perl -cw %' elseif &syntax == 'ruby' execute ':!ruby -cW %' elseif &syntax == 'javascript' execute ':!~/bin/js_checker.pl %' elseif &syntax == 'yaml' execute ':!~/bin/yaml_checker.pl %' endif endf map ,r :w<CR>:!~/bin/reload_firefox.sh<CR>
コメントアウトの設定
map ,c :call CommentOut()<CR> function CommentOut() if &syntax == 'perl' || &syntax == 'ruby' || &syntax == 'sh' || &syntax == 'yaml' execute ':s/^/#/' elseif &syntax == 'javascript' execute ':s/^/?/?//' elseif &syntax == 'vim' execute ':s/^/"/' elseif &syntax == 'html' || &syntax == 'xhtml' || &syntax == 'tt2html' execute ':s/^?(.*?)$/<!-- ?1 -->/' endif execute ':nohlsearch' endf
マルチラインのコメントアウトは、vmap を使って実現しており、関数の呼び出し方法がよく解らないので放置
autocmd Syntax perl,ruby vmap ,b v`<I<CR><ESC>k0i=begen<ESC>`>o=end<CR><ESC> autocmd Syntax javascript vmap ,b v`<I<CR><ESC>k0i/*<ESC>`>o*/<CR><ESC> autocmd Syntax html,xhtml,tt2html vmap ,b v`<I<CR><ESC>k0i<!--<ESC>`>o--><CR><ESC>
これを、どうにかしたい・・・。今度こそ、どこかで聞こう・・・orz
更に訂正
vmap ,b "zdi/*<C-R>z*/<ESC>
とかでいけそう。
もっと考えよう。