##// END OF EJS Templates
fix editorhooks typo...
Min RK -
Show More
@@ -0,0 +1,37 b''
1 """Test installing editor hooks"""
2 import sys
3
4 try:
5 import mock
6 except ImportError:
7 from unittest import mock
8
9 import nose.tools as nt
10
11 from IPython import get_ipython
12 from IPython.lib import editorhooks
13
14 def test_install_editor():
15 called = []
16 def fake_popen(*args, **kwargs):
17 called.append({
18 'args': args,
19 'kwargs': kwargs,
20 })
21 editorhooks.install_editor('foo -l {line} -f {filename}', wait=False)
22
23 with mock.patch('subprocess.Popen', fake_popen):
24 get_ipython().hooks.editor('the file', 64)
25
26 nt.assert_equal(len(called), 1)
27 args = called[0]['args']
28 kwargs = called[0]['kwargs']
29
30 nt.assert_equal(kwargs, {'shell': True})
31
32 if sys.platform.startswith('win'):
33 expected = ['foo', '-l', '64', '-f', 'the file']
34 else:
35 expected = "foo -l 64 -f 'the file'"
36 cmd = args[0]
37 nt.assert_equal(cmd, expected)
@@ -1,128 +1,129 b''
1 1 """ 'editor' hooks for common editors that work well with ipython
2 2
3 3 They should honor the line number argument, at least.
4 4
5 5 Contributions are *very* welcome.
6 6 """
7 7 from __future__ import print_function
8 8
9 9 import os
10 10 import pipes
11 11 import shlex
12 12 import subprocess
13 import sys
13 14
14 15 from IPython import get_ipython
15 16 from IPython.core.error import TryNext
16 17 from IPython.utils import py3compat
17 18
18 19
19 def install_editor(template_list, wait=False):
20 def install_editor(template, wait=False):
20 21 """Installs the editor that is called by IPython for the %edit magic.
21 22
22 23 This overrides the default editor, which is generally set by your EDITOR
23 24 environment variable or is notepad (windows) or vi (linux). By supplying a
24 25 template string `run_template`, you can control how the editor is invoked
25 26 by IPython -- (e.g. the format in which it accepts command line options)
26 27
27 28 Parameters
28 29 ----------
29 30 template : basestring
30 31 run_template acts as a template for how your editor is invoked by
31 32 the shell. It should contain '{filename}', which will be replaced on
32 33 invokation with the file name, and '{line}', $line by line number
33 34 (or 0) to invoke the file with.
34 35 wait : bool
35 36 If `wait` is true, wait until the user presses enter before returning,
36 37 to facilitate non-blocking editors that exit immediately after
37 38 the call.
38 39 """
39 40
40 41 # not all editors support $line, so we'll leave out this check
41 42 # for substitution in ['$file', '$line']:
42 43 # if not substitution in run_template:
43 44 # raise ValueError(('run_template should contain %s'
44 45 # ' for string substitution. You supplied "%s"' % (substitution,
45 46 # run_template)))
46 47
47 48 def call_editor(self, filename, line=0):
48 49 if line is None:
49 50 line = 0
50 51 cmd = template.format(filename=pipes.quote(filename), line=line)
51 52 print(">", cmd)
52 53 # pipes.quote doesn't work right on Windows, but it does after splitting
53 54 if sys.platform.startswith('win'):
54 55 cmd = shlex.split(cmd)
55 56 proc = subprocess.Popen(cmd, shell=True)
56 57 if wait and proc.wait() != 0:
57 58 raise TryNext()
58 59 if wait:
59 60 py3compat.input("Press Enter when done editing:")
60 61
61 62 get_ipython().set_hook('editor', call_editor)
62 63 get_ipython().editor = template
63 64
64 65
65 66 # in these, exe is always the path/name of the executable. Useful
66 67 # if you don't have the editor directory in your path
67 68 def komodo(exe=u'komodo'):
68 69 """ Activestate Komodo [Edit] """
69 70 install_editor(exe + u' -l {line} {filename}', wait=True)
70 71
71 72
72 73 def scite(exe=u"scite"):
73 74 """ SciTE or Sc1 """
74 75 install_editor(exe + u' {filename} -goto:{line}')
75 76
76 77
77 78 def notepadplusplus(exe=u'notepad++'):
78 79 """ Notepad++ http://notepad-plus.sourceforge.net """
79 80 install_editor(exe + u' -n{line} {filename}')
80 81
81 82
82 83 def jed(exe=u'jed'):
83 84 """ JED, the lightweight emacsish editor """
84 85 install_editor(exe + u' +{line} {filename}')
85 86
86 87
87 88 def idle(exe=u'idle'):
88 89 """ Idle, the editor bundled with python
89 90
90 91 Parameters
91 92 ----------
92 93 exe : str, None
93 94 If none, should be pretty smart about finding the executable.
94 95 """
95 96 if exe is None:
96 97 import idlelib
97 98 p = os.path.dirname(idlelib.__filename__)
98 99 # i'm not sure if this actually works. Is this idle.py script
99 100 # guarenteed to be executable?
100 101 exe = os.path.join(p, 'idle.py')
101 102 install_editor(exe + u' {filename}')
102 103
103 104
104 105 def mate(exe=u'mate'):
105 106 """ TextMate, the missing editor"""
106 107 # wait=True is not required since we're using the -w flag to mate
107 108 install_editor(exe + u' -w -l {line} {filename}')
108 109
109 110
110 111 # ##########################################
111 112 # these are untested, report any problems
112 113 # ##########################################
113 114
114 115
115 116 def emacs(exe=u'emacs'):
116 117 install_editor(exe + u' +{line} {filename}')
117 118
118 119
119 120 def gnuclient(exe=u'gnuclient'):
120 121 install_editor(exe + u' -nw +{line} {filename}')
121 122
122 123
123 124 def crimson_editor(exe=u'cedt.exe'):
124 125 install_editor(exe + u' /L:{line} {filename}')
125 126
126 127
127 128 def kate(exe=u'kate'):
128 129 install_editor(exe + u' -u -l {line} {filename}')
General Comments 0
You need to be logged in to leave comments. Login now