Spaces:
Runtime error
Runtime error
""" '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 shlex | |
import subprocess | |
import sys | |
from IPython import get_ipython | |
from IPython.core.error import TryNext | |
from IPython.utils import py3compat | |
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 | |
invocation 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=shlex.quote(filename), line=line) | |
print(">", cmd) | |
# shlex.quote doesn't work right on Windows, but it does after splitting | |
if sys.platform.startswith('win'): | |
cmd = shlex.split(cmd) | |
proc = subprocess.Popen(cmd, shell=True) | |
if proc.wait() != 0: | |
raise TryNext() | |
if wait: | |
py3compat.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 | |
# guaranteed 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}') | |