OnAddrev内でevent.selを書き換えてもちっとも反映されないので何でだろうと思っていたら、event.selはclwindow.Addrevで設定されたっきり、実際のSetSelectionには使われていなかったというオチ。そんなわけでclwindowを改造してみた。


def Abbrev( self, str=None, sel=None, select=True ):
virtual_str = str
virtual_sel = sel
if str==None:
str = clcore.Edit_GetValue()
if sel==None:
sel = clcore.Edit_GetSelection()

event = clevent.Event()
event.str = str
event.sel = sel
event.candlist = []
event.omit_len = 0
clmode.OnAbbrev(event)

# show list. if there are one or more candidates
if len(event.candlist) > 0 :
list_offset = clcore.Edit_GetTextWidth( str[:event.omit_len] )
list.Popup( event.candlist, select, False, event.omit_len, list_offset, event.sel )
else :
clcore.List_Show(False)

# reflect virtual value
if len(event.candlist)<=0 or not select :
if virtual_str != None :
clcore.Edit_SetValue(str)
if virtual_sel != None :
clcore.Edit_SetSelection( event.sel[0], event.sel[1] )