##// END OF EJS Templates
Make sure that if synchronization is with .pyc file the corresponding .py file is used for the synchronization.
Make sure that if synchronization is with .pyc file the corresponding .py file is used for the synchronization.

File last commit:

r1330:8215c621
r1330:8215c621
Show More
ipy_synchronize_with.py
217 lines | 6.3 KiB | text/x-python | PythonLexer
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):
filename = os.path.splitext(filename)
if filename[1] == ".pyc":
filename = (filename[0], ".py")
filename = "".join(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)