basyura's blog

あしたになったらほんきだす。

java のときだけ cp932 にする

windows + cygwin + gvim(windows) + vimshell + java(windows)

な環境で、

set encoding=utf-8
set termencoding=utf-8

としているのだけど、java (or javac) を叩くと文字化けしてしまう。

set termencoding=cp932

とすれば化けないのだけど他で困るので一時的に変えるようにしたい。で、hook を利用してみた。

call vimshell#hook#set('preexec'  , ['g:vimshell_preexec'])
call vimshell#hook#set('preprompt', ['g:vimshell_preprompt'])
" vim コマンド実行前処理
let s:is_vimshell_change_term_encoding = 0
function! g:vimshell_preexec(cmdline, context)
  " termencoding を変更するコマンドの場合
  if s:is_vimshell_change_termencoding_cmd(a:cmdline)
    set termencoding=cp932
    let s:is_vimshell_change_term_encoding = 1
  endif
  return a:cmdline
endfunction
" vim コマンド実行後
function! g:vimshell_preprompt(args, context)
  if s:is_vimshell_change_term_encoding
    set termencoding=utf-8
    let s:is_vimshell_change_term_encoding = 0
  endif
endfunction

preexec で変えて preprompt で戻す。preprompt の引数の内容がよく分からなかったのでスクリプト変数を使って termencoding の切り替えを判定する。
ちらっと試した感じでは問題なさそうなんだけどよう分からんとです。