diff --git a/IPython/lib/editorhooks.py b/IPython/lib/editorhooks.py new file mode 100644 index 0000000..b878fc5 --- /dev/null +++ b/IPython/lib/editorhooks.py @@ -0,0 +1,120 @@ +""" 'editor' hooks for common editors that work well with ipython + +They should honor the line number argument, at least. + +Contributions are *very* welcome. +""" + +import os +import pipes +import subprocess +from IPython.core.error import TryNext + + +def install_editor(template, wait=False): + """Installs the editor that is called by IPython for the %edit magic. + + This overrides the default editor, which is generally set by your EDITOR + environment variable or is notepad (windows) or vi (linux). By supplying a + template string `run_template`, you can control how the editor is invoked + by IPython -- (e.g. the format in which it accepts command line options) + + Parameters + ---------- + template : basestring + run_template acts as a template for how your editor is invoked by + the shell. It should contain '{filename}', which will be replaced on + invokation with the file name, and '{line}', $line by line number + (or 0) to invoke the file with. + wait : bool + If `wait` is true, wait until the user presses enter before returning, + to facilitate non-blocking editors that exit immediately after + the call. + """ + + # not all editors support $line, so we'll leave out this check + # for substitution in ['$file', '$line']: + # if not substitution in run_template: + # raise ValueError(('run_template should contain %s' + # ' for string substitution. You supplied "%s"' % (substitution, + # run_template))) + + def call_editor(self, filename, line=0): + if line is None: + line = 0 + cmd = template.format(filename=pipes.quote(filename), line=line) + print ">", cmd + proc = subprocess.Popen(cmd, shell=True) + if wait and proc.wait() != 0: + raise TryNext() + if wait: + raw_input("Press Enter when done editing:") + + get_ipython().set_hook('editor', call_editor) + get_ipython().editor = template + + +# in these, exe is always the path/name of the executable. Useful +# if you don't have the editor directory in your path +def komodo(exe=u'komodo'): + """ Activestate Komodo [Edit] """ + install_editor(exe + u' -l {line} {filename}', wait=True) + + +def scite(exe=u"scite"): + """ SciTE or Sc1 """ + install_editor(exe + u' {filename} -goto:{line}') + + +def notepadplusplus(exe=u'notepad++'): + """ Notepad++ http://notepad-plus.sourceforge.net """ + install_editor(exe + u' -n{line} {filename}') + + +def jed(exe=u'jed'): + """ JED, the lightweight emacsish editor """ + install_editor(exe + u' +{line} {filename}') + + +def idle(exe=u'idle'): + """ Idle, the editor bundled with python + + Parameters + ---------- + exe : str, None + If none, should be pretty smart about finding the executable. + """ + if exe is None: + import idlelib + p = os.path.dirname(idlelib.__filename__) + # i'm not sure if this actually works. Is this idle.py script + # guarenteed to be executable? + exe = os.path.join(p, 'idle.py') + install_editor(exe + u' {filename}') + + +def mate(exe=u'mate'): + """ TextMate, the missing editor""" + # wait=True is not required since we're using the -w flag to mate + install_editor(exe + u' -w -l {line} {filename}') + + +# ########################################## +# these are untested, report any problems +# ########################################## + + +def emacs(exe=u'emacs'): + install_editor(exe + u' +{line} {filename}') + + +def gnuclient(exe=u'gnuclient'): + install_editor(exe + u' -nw +{line} {filename}') + + +def crimson_editor(exe=u'cedt.exe'): + install_editor(exe + u' /L:{line} {filename}') + + +def kate(exe=u'kate'): + install_editor(exe + u' -u -l {line} {filename}') diff --git a/IPython/quarantine/ipy_editors.py b/IPython/quarantine/ipy_editors.py deleted file mode 100644 index 59075af..0000000 --- a/IPython/quarantine/ipy_editors.py +++ /dev/null @@ -1,91 +0,0 @@ -""" 'editor' hooks for common editors that work well with ipython - -They should honor the line number argument, at least. - -Contributions are *very* welcome. -""" - -from IPython.core import ipapi -from IPython.core.error import TryNext -ip = ipapi.get() - -# We no longer bundle Itpl. If you update this module, you should use advanced -# string formatting instead. -from IPython.external.Itpl import itplns -import os - -def install_editor(run_template, wait = False): - """ Gets a template in format "myeditor bah bah $file bah bah $line" - - $file will be replaced by file name, $line by line number (or 0). - Installs the editor that is called by IPython, instead of the default - notepad or vi. - - If wait is true, wait until the user presses enter before returning, - to facilitate non-blocking editors that exit immediately after - the call. - """ - - def call_editor(self, file, line=0): - if line is None: - line = 0 - cmd = itplns(run_template, locals()) - print ">",cmd - if os.system(cmd) != 0: - raise TryNext() - if wait: - raw_input("Press Enter when done editing:") - - ip.set_hook('editor',call_editor) - - -# in these, exe is always the path/name of the executable. Useful -# if you don't have the editor directory in your path - -def komodo(exe = 'komodo'): - """ Activestate Komodo [Edit] """ - install_editor(exe + ' -l $line "$file"', wait = True) - -def scite(exe = "scite"): - """ SciTE or Sc1 """ - install_editor(exe + ' "$file" -goto:$line') - -def notepadplusplus(exe = 'notepad++'): - """ Notepad++ http://notepad-plus.sourceforge.net """ - install_editor(exe + ' -n$line "$file"') - -def jed(exe = 'jed'): - """ JED, the lightweight emacsish editor """ - install_editor(exe + ' +$line "$file"') - -def idle(exe = None): - """ Idle, the editor bundled with python - - Should be pretty smart about finding the executable. - """ - if exe is None: - import idlelib - p = os.path.dirname(idlelib.__file__) - exe = p + '/idle.py' - install_editor(exe + ' "$file"') - -def mate(exe = 'mate'): - """ TextMate, the missing editor""" - install_editor(exe + ' -w -l $line "$file"') - -# these are untested, report any problems - -def emacs(exe = 'emacs'): - install_editor(exe + ' +$line "$file"') - -def gnuclient(exe= 'gnuclient'): - install_editor(exe + ' -nw +$line "$file"') - -def crimson_editor(exe = 'cedt.exe'): - install_editor(exe + ' /L:$line "$file"') - -def kate(exe = 'kate'): - install_editor(exe + ' -u -l $line "$file"') - - -