Show More
@@ -458,7 +458,7 b' class IPythonWidget(FrontendWidget):' | |||||
458 | # 'IPythonWidget' protected interface |
|
458 | # 'IPythonWidget' protected interface | |
459 | #--------------------------------------------------------------------------- |
|
459 | #--------------------------------------------------------------------------- | |
460 |
|
460 | |||
461 | def _edit(self, filename, line=None): |
|
461 | def _edit(self, filename, line=None, editor_template=None): | |
462 | """ Opens a Python script for editing. |
|
462 | """ Opens a Python script for editing. | |
463 |
|
463 | |||
464 | Parameters: |
|
464 | Parameters: | |
@@ -469,18 +469,28 b' class IPythonWidget(FrontendWidget):' | |||||
469 | line : int, optional |
|
469 | line : int, optional | |
470 | A line of interest in the file. |
|
470 | A line of interest in the file. | |
471 | """ |
|
471 | """ | |
|
472 | ||||
|
473 | # this is a template sent by the kernel, which overrides | |||
|
474 | # what we might have configured here | |||
|
475 | if editor_template: | |||
|
476 | self.editor_line = editor_template | |||
|
477 | ||||
472 | if self.custom_edit: |
|
478 | if self.custom_edit: | |
473 | self.custom_edit_requested.emit(filename, line) |
|
479 | self.custom_edit_requested.emit(filename, line) | |
474 | elif not self.editor: |
|
480 | elif (not self.editor and not self.editor_line): | |
475 | self._append_plain_text('No default editor available.\n' |
|
481 | self._append_plain_text('No default editor available.\n' | |
476 | 'Specify a GUI text editor in the `IPythonWidget.editor` ' |
|
482 | 'Specify a GUI text editor in the `IPythonWidget.editor` ' | |
477 |
'configurable |
|
483 | 'configurable, or by calling one of the `IPython.lib.editorhooks` ' | |
|
484 | 'to enable the %edit magic') | |||
478 | else: |
|
485 | else: | |
479 | try: |
|
486 | try: | |
480 | filename = '"%s"' % filename |
|
487 | filename = '"%s"' % filename | |
481 | if line and self.editor_line: |
|
488 | if line and self.editor_line: | |
482 | command = self.editor_line.format(filename=filename, |
|
489 | command = self.editor_line.format(filename=filename, | |
483 | line=line) |
|
490 | line=line) | |
|
491 | elif not line and self.editor_line: | |||
|
492 | command = self.editor_line.format(filename=filename, | |||
|
493 | line=0) | |||
484 | else: |
|
494 | else: | |
485 | try: |
|
495 | try: | |
486 | command = self.editor.format() |
|
496 | command = self.editor.format() | |
@@ -529,7 +539,7 b' class IPythonWidget(FrontendWidget):' | |||||
529 | # arguments. |
|
539 | # arguments. | |
530 |
|
540 | |||
531 | def _handle_payload_edit(self, item): |
|
541 | def _handle_payload_edit(self, item): | |
532 | self._edit(item['filename'], item['line_number']) |
|
542 | self._edit(item['filename'], item['line_number'], item['editor_template']) | |
533 |
|
543 | |||
534 | def _handle_payload_exit(self, item): |
|
544 | def _handle_payload_exit(self, item): | |
535 | self._keep_kernel_on_exit = item['keepkernel'] |
|
545 | self._keep_kernel_on_exit = item['keepkernel'] |
@@ -22,7 +22,7 b' def install_editor(template, wait=False):' | |||||
22 | ---------- |
|
22 | ---------- | |
23 | template : basestring |
|
23 | template : basestring | |
24 | run_template acts as a template for how your editor is invoked by |
|
24 | run_template acts as a template for how your editor is invoked by | |
25 | the shell. It should contain '{file}', which will be replaced on |
|
25 | the shell. It should contain '{filename}', which will be replaced on | |
26 | invokation with the file name, and '{line}', $line by line number |
|
26 | invokation with the file name, and '{line}', $line by line number | |
27 | (or 0) to invoke the file with. |
|
27 | (or 0) to invoke the file with. | |
28 | wait : bool |
|
28 | wait : bool | |
@@ -39,44 +39,44 b' def install_editor(template, wait=False):' | |||||
39 | # run_template))) |
|
39 | # run_template))) | |
40 |
|
40 | |||
41 |
|
41 | |||
42 | def call_editor(self, file, line=0): |
|
42 | def call_editor(self, filename, line=0): | |
43 | if line is None: |
|
43 | if line is None: | |
44 | line = 0 |
|
44 | line = 0 | |
45 | cmd = template.format(file=file, line=line) |
|
45 | cmd = template.format(filename=filename, line=line) | |
46 | print ">", cmd |
|
46 | print ">", cmd | |
47 | if os.system(cmd) != 0: |
|
47 | proc = subprocess.Popen(cmd, shell=True) | |
|
48 | if wait and proc.wait() != 0: | |||
48 | raise TryNext() |
|
49 | raise TryNext() | |
49 | if wait: |
|
50 | if wait: | |
50 | raw_input("Press Enter when done editing:") |
|
51 | raw_input("Press Enter when done editing:") | |
51 |
|
52 | |||
52 | get_ipython().set_hook('editor', call_editor) |
|
53 | get_ipython().set_hook('editor', call_editor) | |
53 |
|
|
54 | get_ipython().editor = template | |
|
55 | ||||
54 |
|
56 | |||
55 | # in these, exe is always the path/name of the executable. Useful |
|
57 | # in these, exe is always the path/name of the executable. Useful | |
56 | # if you don't have the editor directory in your path |
|
58 | # if you don't have the editor directory in your path | |
57 |
|
59 | def komodo(exe=u'komodo'): | ||
58 |
|
||||
59 | def komodo(exe='komodo'): |
|
|||
60 | """ Activestate Komodo [Edit] """ |
|
60 | """ Activestate Komodo [Edit] """ | |
61 | install_editor(exe + ' -l {line} "{file}"', wait=True) |
|
61 | install_editor(exe + u' -l {line} "{filename}"', wait=True) | |
62 |
|
62 | |||
63 |
|
63 | |||
64 | def scite(exe="scite"): |
|
64 | def scite(exe=u"scite"): | |
65 | """ SciTE or Sc1 """ |
|
65 | """ SciTE or Sc1 """ | |
66 | install_editor(exe + ' "{file}" -goto:{line}') |
|
66 | install_editor(exe + u' "{filename}" -goto:{line}') | |
67 |
|
67 | |||
68 |
|
68 | |||
69 | def notepadplusplus(exe='notepad++'): |
|
69 | def notepadplusplus(exe=u'notepad++'): | |
70 | """ Notepad++ http://notepad-plus.sourceforge.net """ |
|
70 | """ Notepad++ http://notepad-plus.sourceforge.net """ | |
71 | install_editor(exe + ' -n{line} "{file}"') |
|
71 | install_editor(exe + u' -n{line} "{filename}"') | |
72 |
|
72 | |||
73 |
|
73 | |||
74 | def jed(exe='jed'): |
|
74 | def jed(exe=u'jed'): | |
75 | """ JED, the lightweight emacsish editor """ |
|
75 | """ JED, the lightweight emacsish editor """ | |
76 | install_editor(exe + ' +{line} "{file}"') |
|
76 | install_editor(exe + u' +{line} "{filename}"') | |
77 |
|
77 | |||
78 |
|
78 | |||
79 | def idle(exe='idle'): |
|
79 | def idle(exe=u'idle'): | |
80 | """ Idle, the editor bundled with python |
|
80 | """ Idle, the editor bundled with python | |
81 |
|
81 | |||
82 | Parameters |
|
82 | Parameters | |
@@ -86,17 +86,17 b" def idle(exe='idle'):" | |||||
86 | """ |
|
86 | """ | |
87 | if exe is None: |
|
87 | if exe is None: | |
88 | import idlelib |
|
88 | import idlelib | |
89 | p = os.path.dirname(idlelib.__file__) |
|
89 | p = os.path.dirname(idlelib.__filename__) | |
90 | # i'm not sure if this actually works. Is this idle.py script guarenteed |
|
90 | # i'm not sure if this actually works. Is this idle.py script guarenteed | |
91 | # to be executable? |
|
91 | # to be executable? | |
92 | exe = os.path.join(p, 'idle.py') |
|
92 | exe = os.path.join(p, 'idle.py') | |
93 | install_editor(exe + ' "{file}"') |
|
93 | install_editor(exe + u' "{filename}"') | |
94 |
|
94 | |||
95 |
|
95 | |||
96 | def mate(exe='mate'): |
|
96 | def mate(exe=u'mate'): | |
97 | """ TextMate, the missing editor""" |
|
97 | """ TextMate, the missing editor""" | |
98 | # wait=True is not required since we're using the -w flag to mate |
|
98 | # wait=True is not required since we're using the -w flag to mate | |
99 | install_editor(exe + ' -w -l {line} "{file}"') |
|
99 | install_editor(exe + u' -w -l {line} "{filename}"') | |
100 |
|
100 | |||
101 |
|
101 | |||
102 | # ########################################## |
|
102 | # ########################################## | |
@@ -104,17 +104,17 b" def mate(exe='mate'):" | |||||
104 | # ########################################## |
|
104 | # ########################################## | |
105 |
|
105 | |||
106 |
|
106 | |||
107 | def emacs(exe='emacs'): |
|
107 | def emacs(exe=u'emacs'): | |
108 | install_editor(exe + ' +{line} "{file}"') |
|
108 | install_editor(exe + u' +{line} "{filename}"') | |
109 |
|
109 | |||
110 |
|
110 | |||
111 | def gnuclient(exe='gnuclient'): |
|
111 | def gnuclient(exe=u'gnuclient'): | |
112 | install_editor(exe + ' -nw +{line} "{file}"') |
|
112 | install_editor(exe + u' -nw +{line} "{filename}"') | |
113 |
|
113 | |||
114 |
|
114 | |||
115 | def crimson_editor(exe='cedt.exe'): |
|
115 | def crimson_editor(exe=u'cedt.exe'): | |
116 | install_editor(exe + ' /L:{line} "{file}"') |
|
116 | install_editor(exe + u' /L:{line} "{filename}"') | |
117 |
|
117 | |||
118 |
|
118 | |||
119 | def kate(exe='kate'): |
|
119 | def kate(exe=u'kate'): | |
120 | install_editor(exe + ' -u -l {line} "{file}"') |
|
120 | install_editor(exe + u' -u -l {line} "{filename}"') |
@@ -321,10 +321,16 b' class KernelMagics(Magics):' | |||||
321 | # directory of client and kernel don't match |
|
321 | # directory of client and kernel don't match | |
322 | filename = os.path.abspath(filename) |
|
322 | filename = os.path.abspath(filename) | |
323 |
|
323 | |||
|
324 | try: | |||
|
325 | editor = self.shell.editor | |||
|
326 | except AttributeError: | |||
|
327 | editor = None | |||
|
328 | ||||
324 | payload = { |
|
329 | payload = { | |
325 | 'source' : 'IPython.zmq.zmqshell.ZMQInteractiveShell.edit_magic', |
|
330 | 'source' : 'IPython.zmq.zmqshell.ZMQInteractiveShell.edit_magic', | |
326 | 'filename' : filename, |
|
331 | 'filename' : filename, | |
327 | 'line_number' : lineno |
|
332 | 'line_number' : lineno, | |
|
333 | 'editor_template' : editor | |||
328 | } |
|
334 | } | |
329 | self.shell.payload_manager.write_payload(payload) |
|
335 | self.shell.payload_manager.write_payload(payload) | |
330 |
|
336 |
General Comments 0
You need to be logged in to leave comments.
Login now