func (c *TextCommandGlue) Run(v *backend.View, e *backend.Edit) error { l := py.NewLock() defer l.Unlock() p0 := util.Prof.Enter("tc.run") defer p0.Exit() var ( pyv, pye, pyargs, obj py.Object err error ) if pyv, err = toPython(v); err != nil { return pyError(err) } defer pyv.Decref() if pye, err = toPython(e); err != nil { return pyError(err) } defer pye.Decref() if pyargs, err = c.CreatePyArgs(c.args); err != nil { return pyError(err) } defer pyargs.Decref() init := util.Prof.Enter("tc.init") if obj, err = c.inner.Base().CallFunctionObjArgs(pyv); err != nil { return pyError(err) } defer obj.Decref() init.Exit() // interrupt := true // defer func() { interrupt = false }() // go func() { // <-time.After(time.Second * 5) // if interrupt { // py.SetInterrupt() // } // }() exec := util.Prof.Enter("tc.exec") defer exec.Exit() if obj.Base().HasAttrString("run_") { // The plugin is probably trying to bypass the undostack... old := v.IsScratch() v.SetScratch(true) log.Finest("Discarded: %s", e) v.EndEdit(e) v.SetScratch(old) ret, err := obj.Base().CallMethodObjArgs("run_", pye, pyargs) if ret != nil { ret.Decref() } if err != nil { return pyError(err) } return nil } ret, err := obj.Base().CallMethodObjArgs("run__", pye, pyargs) if ret != nil { ret.Decref() } if err != nil { return pyError(err) } return nil }