Vdebug.vimをソース中にマルチバイト文字が含まれていても動作させる

結論

Vdebug.vimのvimui.pyに以下のpatchを当てれば、とりあえずマルチバイト文字を表示しようとしてもクラッシュしなくなる。
ただし、正しい画面表示が得られるわけではない。
ついでに色々なところのエンコーディングがutf-8以外だった場合にどうなるかは分からない。

vimui.diff(Gist)

経緯

ある日テストが落ちて、さあVdebug.vimでdebugだ、と意気込む。
ブレークポイントをセットしてRun to cursorする。
すると、Vdebugがクラッシュする。

An error occured:  <type 'exceptions.UnicodeEncodeError'>
Traceback  (most recent call last):
  File  "/home/wolfdog/.dotfiles/.vim/bundle/vdebug/plugin/python/start_vdebug.py", line 39,  in run_to_cursor
    self.runner.run_to_cursor()
  File  "/home/wolfdog/.dotfiles/.vim/bundle/vdebug/plugin/python/vdebug/runner.py", line 254,  in run_to_cursor
    self.run()
  File  "/home/wolfdog/.dotfiles/.vim/bundle/vdebug/plugin/python/vdebug/runner.py", line 165,  in run
    self.refresh(res)
  File  "/home/wolfdog/.dotfiles/.vim/bundle/vdebug/plugin/python/vdebug/runner.py", line 113,  in refresh
    stack_res =  self.update_stack()
  File  "/home/wolfdog/.dotfiles/.vim/bundle/vdebug/plugin/python/vdebug/runner.py", line 293,  in update_stack
    self.ui.stackwin.accept_renderer(renderer)
  File  "/home/wolfdog/.dotfiles/.vim/bundle/vdebug/plugin/python/vdebug/ui/vimui.py", line 365,  in accept_renderer
    self.write(renderer.render())
  File  "/home/wolfdog/.dotfiles/.vim/bundle/vdebug/plugin/python/vdebug/ui/vimui.py", line 435,  in write
    Window.write(self, msg, after="normal gg")
  File  "/home/wolfdog/.dotfiles/.vim/bundle/vdebug/plugin/python/vdebug/ui/vimui.py", line 287,  in write
    self.buffer[:]  = str(msg).split('
  ')
  UnicodeEncodeError:  'ascii' codec can't encode characters in position 55-96: ordinal not in range(128)

エラーから、これは非ASCII文字をstr()でasciiにキャストしようとしているのが原因ではないかと当たりをつける。
実際のところ、(それほど珍しくはないこととして)テストメソッド名は日本語表記されていた。

強引に何とかする

かくして該当部分に強引なpatchを当てる。
vimui.diff(Gist)

--- a/plugin/python/vdebug/ui/vimui.py
+++ b/plugin/python/vdebug/ui/vimui.py
@@  -284,9  +284,13  @@  class  Window(vdebug.ui.interface.Window):
if return_focus:
prev_win = vim.eval('winnr()')
if  self.buffer_empty():
-  self.buffer[:]  = str(msg).split('\n')
+  if isinstance(msg, unicode):
+ msg = msg.encode('utf-8')
+  self.buffer[:]  = msg.split('\n')
else:
-  self.buffer.append(str(msg).split('\n'))
+  if isinstance(msg, unicode):
+ msg = msg.encode('utf-8')
+  self.buffer.append(msg.split('\n'))
self.command(after)
if return_focus:
vim.command('%swincmd W'  % prev_win)

これによって手元の環境では一応動作するようになった。
が、相変わらずtrace windowのメソッド名は文字化けを起こしているし、そもそも元々の文字エンコーディングがutf-8以外だった場合などにどうなるかは分かっていない。

そんなわけで、patchを送る気にもなれず、とりあえず動いたので良しということで使っている。
pythonとvimに詳しい人がいたらいい感じにしてpatchを送っておいて下さい。