Date: 2009-12-04
Tags: python

Windowsでpyreadlineを使うとCtrl+H押下時にカーソルが進む

この問題はWindows上でIPythonを便利に使おうとすると発現するんじゃないかなと思います。必ず起きるのかどうかは知りませんが、この問題で困ったことがある人は自分以外に一人しか知らないので、レアな組み合わせなんでしょうね...。でももしかしたら Zopeのdebugコンソールをipython化する を見てやってみようという人が出てくるかも。

現象としては、Backspaceキー押下時にはちゃんとカーソルの前の文字が削除されてカーソルも1文字左に移動するのに、Ctrl+H押下時には、カーソルの前の文字は消えるもののカーソル自体は右に1つ進む、という状況になります。

この問題は以下のパッチで修正出来ます。Ctrl+H押下時にはBackspaceと同等に動作するように書き換えています:

--- pyreadline/keysyms/keysyms.py.orig
+++ pyreadline/keysyms/keysyms.py
@@ -119,6 +119,10 @@
         char = chr(VkKeyScan(ord(char)) & 0xff)
     elif control:
         char=chr(keycode)
+    if control and ord(char)==8 and keycode==72:
+        keycode=8
+        control=False
+        state &= 0xfffffff7
     try:
         keyname=code2sym_map[keycode]
     except KeyError:

問題と解決方法は2年以上前に把握していたんですが、某所で書いたもののバグ報告していなかったので、 IPython: Ctrl+H erase previous character, but cursor goes forward. というタイトルでバグ報告してみました(ちょっと失敗してますが..)。こんなまずい英語でもpatchが付いてれば分かってくれるかなー。分かってくれると良いなー。