##// END OF EJS Templates
editorhooks working with qtconsole
Robert McGibbon -
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 to enable the %edit magic')
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 ipython_widget.IPythonWidget.editor = template
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