vim-users.jp

Hack #221: MacVimで半透明処理が狂う問題に対処する

Posted at 2011/06/22
このエントリーをはてなブックマークに追加

問題

MacVimをお使いの方に捧げる記事です。

MacVimをはじめとするGUIのVimの特徴の一つとして、半透明具合をVimから操作できるという点があります。

transpacent vim

MacVimの場合、半透明具合は'transparency'で調整できます。0が不透明、100が完全に透明です。例えば20%の透明具合にするには、

:set transparency=20

とします。これは

:let &transparency = 20

としても同様の結果が得られます。現在の透明度の値を得たければ、変数&transparencyを参照してください。

MacVimにおける半透明処理はまだExperimentalで、Preferencesから以下のような設定を行う必要があります。

Preferences

まだExperimentalと主張していることからわかるように、半透明処理には既知のバグがあります。不特定のタイミングで、画面の一部が不透明になり、だんだんと不透明部分が全体に浸食していきます。

bug

見てのとおり、かなり深刻な問題かつ数多くのユーザに確認されつつも、この問題は数年間に渡り解決されないまま今に至っております。

対処

実は、オプション値'transparency'がいつのまにか勝手に書き変わっています。これを再び書き換えて<C-l>を打鍵するだけで、うまく再描画されます。

:set transparency=10

ただ、それ描画が狂う時点の前にどんな'transparency'を設定していたかその具体的な忘れている場合がほとんどでしょう。普段からset transparencyするときに常に同時にg:transparencyなどの変数にその値を格納しておき、そしてその値に戻ることができるようにKey mappingを設定するのがよいでしょう。

例として、筆者は半透明度の変更と、半透明再描画をそれぞれ以下のように割り当てています。すべて、~/.vimrcではなく~/.gvimrcです。

  • より透明にする: ↑

      nnoremap <up> :<C-u>call <SID>relative_tranparency(5)<Cr>
      inoremap <up> <C-o>:call <SID>relative_tranparency(5)<Cr>
    
  • より不透明にする: ↓

      nnoremap <down> :<C-u>call <SID>relative_tranparency(-5)<Cr>
      inoremap <down> <C-o>:call <SID>relative_tranparency(-5)<Cr>
    
  • 再描画: <esc><esc

      nnoremap <Esc><Esc> :<C-u>let &transparency = g:transparency<Cr><C-l>
    

ただし以下の関数を同じファイル内で定義しておくものとします。

function! s:relative_tranparency(diff)
  let &transparency = a:diff + &transparency
  let g:transparency = &transparency
endfunction

補足

筆者はもともと<esc><esc>:set nohlsearchの副作用を持たせるkey mappingをしていました。これを組み合わせため、筆者の設定は以下のようになっています。

    nnoremap <Esc><Esc> :<C-u>set nohlsearch<Cr>:let &transparency = g:transparency<Cr><C-l>
ujihisa

もどる
blog comments powered by Disqus