バッファ切り替え時に発生する 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>

とかでいけそう。
もっと考えよう。