|
|
import IPython.ipapi
|
|
|
ip = IPython.ipapi.get()
|
|
|
|
|
|
import win32api
|
|
|
import win32ui
|
|
|
import win32console
|
|
|
import dde
|
|
|
import os
|
|
|
import scitedirector
|
|
|
|
|
|
|
|
|
def setHook(synchronize_with_editor):
|
|
|
ip.set_hook("synchronize_with_editor", synchronize_with_editor)
|
|
|
|
|
|
|
|
|
def findFilename(filename):
|
|
|
if not os.path.isabs(filename):
|
|
|
filename = os.path.join(os.getcwd(), filename)
|
|
|
|
|
|
if os.path.isfile(filename):
|
|
|
return filename
|
|
|
|
|
|
return ""
|
|
|
|
|
|
|
|
|
def runCommand(path, command, arguments, asynchronous = True):
|
|
|
line = ''
|
|
|
if asynchronous:
|
|
|
line += 'start '
|
|
|
|
|
|
try:
|
|
|
line += win32api.GetShortPathName(os.path.join(path, command) + ".exe") + " "
|
|
|
except:
|
|
|
print 'could not find: "%s"' % (os.path.join(path, command) + ".exe")
|
|
|
return -1
|
|
|
|
|
|
line += arguments
|
|
|
r = os.system(line)
|
|
|
return r
|
|
|
|
|
|
|
|
|
def sleep(milliseconds):
|
|
|
win32api.Sleep(milliseconds)
|
|
|
|
|
|
|
|
|
def restoreConsoleFocus():
|
|
|
h = win32console.GetConsoleWindow()
|
|
|
console_window = win32ui.CreateWindowFromHandle(h)
|
|
|
console_window.SetForegroundWindow()
|
|
|
|
|
|
|
|
|
|
|
|
# This is the most simple example of hook:
|
|
|
class GVimHook:
|
|
|
def __init__(self, path, wakeup_duration):
|
|
|
self.path = path
|
|
|
self.wakeup_duration = wakeup_duration
|
|
|
|
|
|
def __call__(self, ip, filename, lineno, columnno):
|
|
|
filename = findFilename(filename)
|
|
|
|
|
|
if not filename:
|
|
|
return
|
|
|
|
|
|
runCommand(self.path, 'gvim', '--remote-silent +%d "%s"' % (lineno, filename))
|
|
|
|
|
|
sleep(self.wakeup_duration)
|
|
|
|
|
|
restoreConsoleFocus()
|
|
|
|
|
|
|
|
|
def gvim(path = r"C:\Program Files\vim\vim71", wakeup_duration = 100):
|
|
|
synchronize_with_editor = GVimHook(path, wakeup_duration)
|
|
|
setHook(synchronize_with_editor)
|
|
|
|
|
|
|
|
|
class EmacsHook:
|
|
|
def __init__(self, path, wakeup_duration, start_duration):
|
|
|
self.path = path
|
|
|
self.wakeup_duration = wakeup_duration
|
|
|
self.start_duration = start_duration
|
|
|
|
|
|
def __call__(self, ip, filename, lineno, columnno):
|
|
|
filename = findFilename(filename)
|
|
|
|
|
|
if not filename:
|
|
|
return
|
|
|
|
|
|
r = runCommand(self.path, "emacsclient", '-n +%d:%d "%s" 2>nul' % (lineno, columnno, filename), False)
|
|
|
if r != 0:
|
|
|
runCommand(self.path, 'runemacs', '--quick -f server-start +%d:%d "%s"' % (lineno, columnno, filename))
|
|
|
sleep(self.start_duration)
|
|
|
else:
|
|
|
sleep(self.wakeup_duration)
|
|
|
|
|
|
restoreConsoleFocus()
|
|
|
|
|
|
|
|
|
def emacs(path = r"C:\Program Files\emacs\bin", wakeup_duration = 100, start_duration = 2000):
|
|
|
synchronize_with_editor = EmacsHook(path, wakeup_duration, start_duration)
|
|
|
setHook(synchronize_with_editor)
|
|
|
|
|
|
|
|
|
class SciteHook:
|
|
|
def __init__(self, path, wakeup_duration, start_duration):
|
|
|
self.path = path
|
|
|
self.wakeup_duration = wakeup_duration
|
|
|
self.start_duration = start_duration
|
|
|
|
|
|
def __call__(self, ip, filename, lineno, columnno):
|
|
|
filename = findFilename(filename)
|
|
|
|
|
|
if not filename:
|
|
|
return
|
|
|
|
|
|
scites = scitedirector.findWindows()
|
|
|
if not scites:
|
|
|
runCommand(self.path, "scite", '"-open:%s" -goto:%d' % (filename.replace("\\", "/"), lineno))
|
|
|
|
|
|
sleep(self.start_duration)
|
|
|
restoreConsoleFocus()
|
|
|
else:
|
|
|
scite = scites[0]
|
|
|
scitedirector.sendCommand(scite, 'open:%s' % filename.replace("\\", "/"))
|
|
|
scitedirector.sendCommand(scite, "goto:%d" % lineno)
|
|
|
|
|
|
|
|
|
def scite(path = r"C:\Program Files\SciTE Source Code Editor", wakeup_duration = 100, start_duration = 500):
|
|
|
synchronize_with_editor = SciteHook(path, wakeup_duration, start_duration)
|
|
|
setHook(synchronize_with_editor)
|
|
|
|
|
|
|
|
|
class NodePadPlusPlusHook:
|
|
|
def __init__(self, path, wakeup_duration):
|
|
|
self.path = path
|
|
|
self.wakeup_duration = wakeup_duration
|
|
|
|
|
|
def __call__(self, ip, filename, lineno, columnno):
|
|
|
filename = findFilename(filename)
|
|
|
|
|
|
if not filename:
|
|
|
return
|
|
|
|
|
|
runCommand(self.path, "notepad++", '"%s" -n%d' % (filename, lineno))
|
|
|
|
|
|
sleep(self.wakeup_duration)
|
|
|
|
|
|
restoreConsoleFocus()
|
|
|
|
|
|
|
|
|
def notepadplusplus(path = r"C:\Program Files\Notepad++", wakeup_duration = 100):
|
|
|
synchronize_with_editor = NodePadPlusPlusHook(path, wakeup_duration)
|
|
|
setHook(synchronize_with_editor)
|
|
|
|
|
|
|
|
|
class PsPadHook:
|
|
|
def __init__(self, path, wakeup_duration):
|
|
|
self.path = path
|
|
|
self.wakeup_duration = wakeup_duration
|
|
|
|
|
|
def __call__(self, ip, filename, lineno, columnno):
|
|
|
filename = findFilename(filename)
|
|
|
|
|
|
if not filename:
|
|
|
return
|
|
|
|
|
|
runCommand(self.path, "pspad", '"%s" -%d' % (filename, lineno))
|
|
|
|
|
|
sleep(self.wakeup_duration)
|
|
|
|
|
|
restoreConsoleFocus()
|
|
|
|
|
|
|
|
|
def pspad(path = r"C:\Program Files\PSPad editor", wakeup_duration = 100):
|
|
|
synchronize_with_editor = PsPadHook(path, wakeup_duration)
|
|
|
setHook(synchronize_with_editor)
|
|
|
|
|
|
|
|
|
# This is an example of DDE hook:
|
|
|
class UltraEditHook:
|
|
|
def __init__(self, path, wakeup_duration, start_duration):
|
|
|
self.path = path
|
|
|
self.wakeup_duration = wakeup_duration
|
|
|
self.start_duration = start_duration
|
|
|
|
|
|
def __call__(self, ip, filename, lineno, columnno):
|
|
|
filename = findFilename(filename)
|
|
|
|
|
|
if not filename:
|
|
|
return
|
|
|
|
|
|
server = dde.CreateServer()
|
|
|
server.Create("myddeserver")
|
|
|
conversation = dde.CreateConversation(server)
|
|
|
try:
|
|
|
conversation.ConnectTo("uedit32", "System")
|
|
|
conversation.Exec(r'[open("%s/%d"])' % (filename, lineno))
|
|
|
|
|
|
sleep(self.wakeup_duration)
|
|
|
except:
|
|
|
runCommand(self.path, 'uedit32', '"%s/%d"' % (filename, lineno))
|
|
|
|
|
|
sleep(self.start_duration)
|
|
|
|
|
|
server.Shutdown()
|
|
|
|
|
|
restoreConsoleFocus()
|
|
|
|
|
|
|
|
|
def ultraedit(path = r"C:\Program Files\IDM Computer Solutions\UltraEdit-32", wakeup_duration = 10, start_duration = 2000):
|
|
|
synchronize_with_editor = UltraEditHook(path, wakeup_duration, start_duration)
|
|
|
setHook(synchronize_with_editor)
|
|
|
|