Vdebug.vimをソース中にマルチバイト文字が含まれていても動作させる
結論
Vdebug.vimのvimui.pyに以下のpatchを当てれば、とりあえずマルチバイト文字を表示しようとしてもクラッシュしなくなる。
ただし、正しい画面表示が得られるわけではない。
ついでに色々なところのエンコーディングがutf-8以外だった場合にどうなるかは分からない。
経緯
ある日テストが落ちて、さあ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を送っておいて下さい。