##// END OF EJS Templates
Merge pull request #12588 from mskar/vim_cursor...
Matthias Bussonnier -
r26161:40472930 merge
parent child
Show More
@@ -12,8 +12,19 from IPython.utils.py3compat import input
12 from IPython.utils.terminal import toggle_set_term_title, set_term_title, restore_term_title
12 from IPython.utils.terminal import toggle_set_term_title, set_term_title, restore_term_title
13 from IPython.utils.process import abbrev_cwd
13 from IPython.utils.process import abbrev_cwd
14 from traitlets import (
14 from traitlets import (
15 Bool, Unicode, Dict, Integer, observe, Instance, Type, default, Enum, Union,
15 Bool,
16 Any, validate
16 Unicode,
17 Dict,
18 Integer,
19 observe,
20 Instance,
21 Type,
22 default,
23 Enum,
24 Union,
25 Any,
26 validate,
27 Float,
17 )
28 )
18
29
19 from prompt_toolkit.enums import DEFAULT_BUFFER, EditingMode
30 from prompt_toolkit.enums import DEFAULT_BUFFER, EditingMode
@@ -142,6 +153,25 class TerminalInteractiveShell(InteractiveShell):
142 help="Add shortcuts from 'emacs' insert mode to 'vi' insert mode.",
153 help="Add shortcuts from 'emacs' insert mode to 'vi' insert mode.",
143 ).tag(config=True)
154 ).tag(config=True)
144
155
156 modal_cursor = Bool(
157 True,
158 help="""
159 Cursor shape changes depending on vi mode: beam in vi insert mode,
160 block in nav mode, underscore in replace mode.""",
161 ).tag(config=True)
162
163 ttimeoutlen = Float(
164 0.01,
165 help="""The time in milliseconds that is waited for a key code
166 to complete.""",
167 ).tag(config=True)
168
169 timeoutlen = Float(
170 0.5,
171 help="""The time in milliseconds that is waited for a mapped key
172 sequence to complete.""",
173 ).tag(config=True)
174
145 autoformatter = Unicode(None,
175 autoformatter = Unicode(None,
146 help="Autoformatter to reformat Terminal code. Can be `'black'` or `None`",
176 help="Autoformatter to reformat Terminal code. Can be `'black'` or `None`",
147 allow_none=True
177 allow_none=True
@@ -19,6 +19,7 from prompt_toolkit.filters import (has_focus, has_selection, Condition,
19 from prompt_toolkit.key_binding.bindings.completion import display_completions_like_readline
19 from prompt_toolkit.key_binding.bindings.completion import display_completions_like_readline
20 from prompt_toolkit.key_binding import KeyBindings
20 from prompt_toolkit.key_binding import KeyBindings
21 from prompt_toolkit.key_binding.bindings import named_commands as nc
21 from prompt_toolkit.key_binding.bindings import named_commands as nc
22 from prompt_toolkit.key_binding.vi_state import InputMode, ViState
22
23
23 from IPython.utils.decorators import undoc
24 from IPython.utils.decorators import undoc
24
25
@@ -160,6 +161,32 def create_ipython_shortcuts(shell):
160 for keys, cmd in keys_cmd_dict.items():
161 for keys, cmd in keys_cmd_dict.items():
161 kb.add(*keys, filter=focused_insert & ebivim)(cmd)
162 kb.add(*keys, filter=focused_insert & ebivim)(cmd)
162
163
164 def get_input_mode(self):
165 if sys.version_info[0] == 3:
166 app = get_app()
167 app.ttimeoutlen = shell.ttimeoutlen
168 app.timeoutlen = shell.timeoutlen
169
170 return self._input_mode
171
172 def set_input_mode(self, mode):
173 shape = {InputMode.NAVIGATION: 2, InputMode.REPLACE: 4}.get(mode, 6)
174 cursor = "\x1b[{} q".format(shape)
175
176 if hasattr(sys.stdout, "_cli"):
177 write = sys.stdout._cli.output.write_raw
178 else:
179 write = sys.stdout.write
180
181 write(cursor)
182 sys.stdout.flush()
183
184 self._input_mode = mode
185
186 if shell.editing_mode == "vi" and shell.modal_cursor:
187 ViState._input_mode = InputMode.INSERT
188 ViState.input_mode = property(get_input_mode, set_input_mode)
189
163 return kb
190 return kb
164
191
165
192
@@ -341,4 +368,4 if sys.platform == 'win32':
341 return
368 return
342 except ClipboardEmpty:
369 except ClipboardEmpty:
343 return
370 return
344 event.current_buffer.insert_text(text.replace('\t', ' ' * 4))
371 event.current_buffer.insert_text(text.replace("\t", " " * 4))
@@ -41,12 +41,14 def multi_filter_str(flt):
41 log_filters = {'_AndList': 'And', '_OrList': 'Or'}
41 log_filters = {'_AndList': 'And', '_OrList': 'Or'}
42 log_invert = {'_Invert'}
42 log_invert = {'_Invert'}
43
43
44 class _DummyTerminal(object):
44 class _DummyTerminal:
45 """Used as a buffer to get prompt_toolkit bindings
45 """Used as a buffer to get prompt_toolkit bindings
46 """
46 """
47 handle_return = None
47 handle_return = None
48 input_transformer_manager = None
48 input_transformer_manager = None
49 display_completions = None
49 display_completions = None
50 editing_mode = "emacs"
51
50
52
51 ipy_bindings = create_ipython_shortcuts(_DummyTerminal()).bindings
53 ipy_bindings = create_ipython_shortcuts(_DummyTerminal()).bindings
52
54
General Comments 0
You need to be logged in to leave comments. Login now