Show More
@@ -1222,6 +1222,8 b' class IPCompleter(Completer):' | |||||
1222 | pre = self.magic_escape |
|
1222 | pre = self.magic_escape | |
1223 | pre2 = pre+pre |
|
1223 | pre2 = pre+pre | |
1224 |
|
1224 | |||
|
1225 | explicit_magic = text.startswith(pre) | |||
|
1226 | ||||
1225 | # Completion logic: |
|
1227 | # Completion logic: | |
1226 | # - user gives %%: only do cell magics |
|
1228 | # - user gives %%: only do cell magics | |
1227 | # - user gives %: do both line and cell magics |
|
1229 | # - user gives %: do both line and cell magics | |
@@ -1229,11 +1231,23 b' class IPCompleter(Completer):' | |||||
1229 | # In other words, line magics are skipped if the user gives %% explicitly |
|
1231 | # In other words, line magics are skipped if the user gives %% explicitly | |
1230 | # |
|
1232 | # | |
1231 | # We also exclude magics that match any currently visible names: |
|
1233 | # We also exclude magics that match any currently visible names: | |
1232 | # https://github.com/ipython/ipython/issues/4877 |
|
1234 | # https://github.com/ipython/ipython/issues/4877, unless the user has | |
|
1235 | # typed a %: | |||
|
1236 | # https://github.com/ipython/ipython/issues/10754 | |||
1233 | bare_text = text.lstrip(pre) |
|
1237 | bare_text = text.lstrip(pre) | |
1234 | global_matches = self.global_matches(bare_text) |
|
1238 | global_matches = self.global_matches(bare_text) | |
1235 | matches = lambda magic: magic.startswith(bare_text) \ |
|
1239 | if not explicit_magic: | |
1236 | and magic not in global_matches |
|
1240 | def matches(magic): | |
|
1241 | """ | |||
|
1242 | Filter magics, in particular remove magics that match | |||
|
1243 | a name present in global namespace. | |||
|
1244 | """ | |||
|
1245 | return ( magic.startswith(bare_text) and | |||
|
1246 | magic not in global_matches ) | |||
|
1247 | else: | |||
|
1248 | def matches(magic): | |||
|
1249 | return magic.startswith(bare_text) | |||
|
1250 | ||||
1237 | comp = [ pre2+m for m in cell_magics if matches(m)] |
|
1251 | comp = [ pre2+m for m in cell_magics if matches(m)] | |
1238 | if not text.startswith(pre2): |
|
1252 | if not text.startswith(pre2): | |
1239 | comp += [ pre+m for m in line_magics if matches(m)] |
|
1253 | comp += [ pre+m for m in line_magics if matches(m)] |
@@ -589,6 +589,24 b' def test_magic_completion_shadowing():' | |||||
589 | text, matches = c.complete("mat") |
|
589 | text, matches = c.complete("mat") | |
590 | nt.assert_equal(matches, ["%matplotlib"]) |
|
590 | nt.assert_equal(matches, ["%matplotlib"]) | |
591 |
|
591 | |||
|
592 | def test_magic_completion_shadowing_explicit(): | |||
|
593 | """ | |||
|
594 | If the user try to complete a shadowed magic, and explicit % start should | |||
|
595 | still return the completions. | |||
|
596 | """ | |||
|
597 | ip = get_ipython() | |||
|
598 | c = ip.Completer | |||
|
599 | ||||
|
600 | # Before importing matplotlib, %matplotlib magic should be the only option. | |||
|
601 | text, matches = c.complete("%mat") | |||
|
602 | nt.assert_equal(matches, ["%matplotlib"]) | |||
|
603 | ||||
|
604 | ip.run_cell("matplotlib = 1") | |||
|
605 | ||||
|
606 | # After removing matplotlib from namespace, the magic should still be | |||
|
607 | # the only option. | |||
|
608 | text, matches = c.complete("%mat") | |||
|
609 | nt.assert_equal(matches, ["%matplotlib"]) | |||
592 |
|
610 | |||
593 | def test_magic_config(): |
|
611 | def test_magic_config(): | |
594 | ip = get_ipython() |
|
612 | ip = get_ipython() |
General Comments 0
You need to be logged in to leave comments.
Login now