##// END OF EJS Templates
try to upload json reports (#13962)
try to upload json reports (#13962)

File last commit:

r28122:9741dd5f
r28160:1585c55e merge
Show More
__init__.py
599 lines | 16.8 KiB | text/x-python | PythonLexer
Matthias Bussonnier
Improve indentation of next line when using CTRL-o in terminal....
r23334 """
Module to define and register Terminal IPython shortcuts with
Thomas Kluyver
Fix a couple of rst roles causing Sphinx warnings
r23428 :mod:`prompt_toolkit`
Matthias Bussonnier
Improve indentation of next line when using CTRL-o in terminal....
r23334 """
# Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
Matthias Bussonnier
Misc review cleanup....
r28029 import os
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 import signal
import sys
Matthias Bussonnier
Misc review cleanup....
r28029 import warnings
krassowski
Allow to customize shortcuts
r28074 from dataclasses import dataclass
from typing import Callable, Any, Optional, List
Matthias Bussonnier
Improve indentation of next line when using CTRL-o in terminal....
r23334
Jonathan Slenders
Upgrade to prompt_toolkit 2.0
r24376 from prompt_toolkit.application.current import get_app
Matthias Bussonnier
Misc review cleanup....
r28029 from prompt_toolkit.key_binding import KeyBindings
krassowski
Allow to customize shortcuts
r28074 from prompt_toolkit.key_binding.key_processor import KeyPressEvent
Matthias Bussonnier
Misc review cleanup....
r28029 from prompt_toolkit.key_binding.bindings import named_commands as nc
krassowski
Restore shortcuts in documentation, define identifiers
r28010 from prompt_toolkit.key_binding.bindings.completion import (
display_completions_like_readline,
)
Martin Skarzynski
cursor shape changes with vi editing mode
r26113 from prompt_toolkit.key_binding.vi_state import InputMode, ViState
krassowski
Allow to customize shortcuts
r28074 from prompt_toolkit.filters import Condition
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642
krassowski
Allow to customize shortcuts
r28074 from IPython.core.getipython import get_ipython
Matthias Bussonnier
Misc review cleanup....
r28029 from IPython.terminal.shortcuts import auto_match as match
from IPython.terminal.shortcuts import auto_suggest
krassowski
Allow to customize shortcuts
r28074 from IPython.terminal.shortcuts.filters import filter_from_string
Fernando Perez
Tag windows-only function so it doesn't get picked up on *nix doc builds.
r22670 from IPython.utils.decorators import undoc
krassowski
Restore shortcuts in documentation, define identifiers
r28010
__all__ = ["create_ipython_shortcuts"]
Fernando Perez
Tag windows-only function so it doesn't get picked up on *nix doc builds.
r22670
krassowski
Allow to customize shortcuts
r28074 @dataclass
class BaseBinding:
command: Callable[[KeyPressEvent], Any]
keys: List[str]
Matthias Bussonnier
Misc review cleanup....
r28029
Jonathan Slenders
Upgrade to prompt_toolkit 2.0
r24376
krassowski
Allow to customize shortcuts
r28074 @dataclass
class RuntimeBinding(BaseBinding):
filter: Condition
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642
Thomas Kluyver
Allow configuring a function to handle return in the terminal...
r23580
krassowski
Allow to customize shortcuts
r28074 @dataclass
class Binding(BaseBinding):
# while filter could be created by referencing variables directly (rather
# than created from strings), by using strings we ensure that users will
# be able to create filters in configuration (e.g. JSON) files too, which
# also benefits the documentation by enforcing human-readable filter names.
condition: Optional[str] = None
satoru
Fix format
r27763
krassowski
Allow to customize shortcuts
r28074 def __post_init__(self):
if self.condition:
self.filter = filter_from_string(self.condition)
satoru
Fix #13654, improve performance of auto match for quotes...
r27762 else:
krassowski
Allow to customize shortcuts
r28074 self.filter = None
krassowski
Restore shortcuts in documentation, define identifiers
r28010
Martin Skarzynski
implement auto_match brackets and quotes based on randy3k/radian/
r27373
krassowski
Allow to customize shortcuts
r28074 def create_identifier(handler: Callable):
parts = handler.__module__.split(".")
name = handler.__name__
package = parts[0]
if len(parts) > 1:
final_module = parts[-1]
return f"{package}:{final_module}.{name}"
else:
return f"{package}:{name}"
Martin Skarzynski
implement auto_match brackets and quotes based on randy3k/radian/
r27373
krassowski
Allow to customize shortcuts
r28074 AUTO_MATCH_BINDINGS = [
*[
Binding(
cmd, [key], "focused_insert & auto_match & followed_by_closing_paren_or_end"
krassowski
Autosuggest: only navigate on edges of doc, show in multi-line doc
r28041 )
krassowski
Allow to customize shortcuts
r28074 for key, cmd in match.auto_match_parens.items()
],
*[
# raw string
Binding(cmd, [key], "focused_insert & auto_match & preceded_by_raw_str_prefix")
for key, cmd in match.auto_match_parens_raw_string.items()
],
Binding(
match.double_quote,
['"'],
"focused_insert"
" & auto_match"
" & not_inside_unclosed_string"
" & preceded_by_paired_double_quotes"
" & followed_by_closing_paren_or_end",
),
Binding(
match.single_quote,
["'"],
"focused_insert"
" & auto_match"
" & not_inside_unclosed_string"
" & preceded_by_paired_single_quotes"
" & followed_by_closing_paren_or_end",
),
Binding(
match.docstring_double_quotes,
['"'],
"focused_insert"
" & auto_match"
" & not_inside_unclosed_string"
" & preceded_by_two_double_quotes",
),
Binding(
match.docstring_single_quotes,
["'"],
"focused_insert"
" & auto_match"
" & not_inside_unclosed_string"
" & preceded_by_two_single_quotes",
),
Binding(
match.skip_over,
[")"],
"focused_insert & auto_match & followed_by_closing_round_paren",
),
Binding(
match.skip_over,
["]"],
"focused_insert & auto_match & followed_by_closing_bracket",
),
Binding(
match.skip_over,
["}"],
"focused_insert & auto_match & followed_by_closing_brace",
),
Binding(
match.skip_over, ['"'], "focused_insert & auto_match & followed_by_double_quote"
),
Binding(
match.skip_over, ["'"], "focused_insert & auto_match & followed_by_single_quote"
),
Binding(
match.delete_pair,
["backspace"],
"focused_insert"
" & preceded_by_opening_round_paren"
" & auto_match"
" & followed_by_closing_round_paren",
),
Binding(
match.delete_pair,
["backspace"],
"focused_insert"
" & preceded_by_opening_bracket"
" & auto_match"
" & followed_by_closing_bracket",
),
Binding(
match.delete_pair,
["backspace"],
"focused_insert"
" & preceded_by_opening_brace"
" & auto_match"
" & followed_by_closing_brace",
),
Binding(
match.delete_pair,
["backspace"],
"focused_insert"
" & preceded_by_double_quote"
" & auto_match"
" & followed_by_double_quote",
),
Binding(
match.delete_pair,
["backspace"],
"focused_insert"
" & preceded_by_single_quote"
" & auto_match"
" & followed_by_single_quote",
),
]
AUTO_SUGGEST_BINDINGS = [
Binding(
auto_suggest.accept_in_vi_insert_mode,
["end"],
"default_buffer_focused & (ebivim | ~vi_insert_mode)",
),
Binding(
krassowski
Improve documentation for shortcuts
r28076 auto_suggest.accept_in_vi_insert_mode,
["c-e"],
"vi_insert_mode & default_buffer_focused & ebivim",
),
Binding(auto_suggest.accept, ["c-f"], "vi_insert_mode & default_buffer_focused"),
Binding(
auto_suggest.accept_word,
["escape", "f"],
"vi_insert_mode & default_buffer_focused & ebivim",
krassowski
Allow to customize shortcuts
r28074 ),
Binding(
auto_suggest.accept_token,
["c-right"],
"has_suggestion & default_buffer_focused",
),
Binding(
auto_suggest.discard,
["escape"],
"has_suggestion & default_buffer_focused & emacs_insert_mode",
),
Binding(
auto_suggest.swap_autosuggestion_up,
["up"],
"navigable_suggestions"
" & ~has_line_above"
" & has_suggestion"
" & default_buffer_focused",
),
Binding(
auto_suggest.swap_autosuggestion_down,
["down"],
"navigable_suggestions"
" & ~has_line_below"
" & has_suggestion"
" & default_buffer_focused",
),
Binding(
auto_suggest.up_and_update_hint,
["up"],
"has_line_above & navigable_suggestions & default_buffer_focused",
),
Binding(
auto_suggest.down_and_update_hint,
["down"],
"has_line_below & navigable_suggestions & default_buffer_focused",
),
Binding(
auto_suggest.accept_character,
krassowski
Change the default for character complete to Alt+Right
r28075 ["escape", "right"],
krassowski
Allow to customize shortcuts
r28074 "has_suggestion & default_buffer_focused",
),
Binding(
auto_suggest.accept_and_move_cursor_left,
["c-left"],
"has_suggestion & default_buffer_focused",
),
Binding(
auto_suggest.accept_and_keep_cursor,
["c-down"],
"has_suggestion & default_buffer_focused",
),
Binding(
auto_suggest.backspace_and_resume_hint,
["backspace"],
"has_suggestion & default_buffer_focused",
),
]
SIMPLE_CONTROL_BINDINGS = [
krassowski
Improve documentation for shortcuts
r28076 Binding(cmd, [key], "vi_insert_mode & default_buffer_focused & ebivim")
krassowski
Allow to customize shortcuts
r28074 for key, cmd in {
Martin Skarzynski
add emacs keybindings to vi insert mode
r26067 "c-a": nc.beginning_of_line,
"c-b": nc.backward_char,
"c-k": nc.kill_line,
"c-w": nc.backward_kill_word,
"c-y": nc.yank,
"c-_": nc.undo,
krassowski
Allow to customize shortcuts
r28074 }.items()
]
Martin Skarzynski
add emacs keybindings to vi insert mode
r26067
krassowski
Allow to customize shortcuts
r28074 ALT_AND_COMOBO_CONTROL_BINDINGS = [
krassowski
Improve documentation for shortcuts
r28076 Binding(cmd, list(keys), "vi_insert_mode & default_buffer_focused & ebivim")
krassowski
Allow to customize shortcuts
r28074 for keys, cmd in {
Martin Skarzynski
add emacs keybindings to vi insert mode
r26067 # Control Combos
("c-x", "c-e"): nc.edit_and_execute,
("c-x", "e"): nc.edit_and_execute,
# Alt
("escape", "b"): nc.backward_word,
("escape", "c"): nc.capitalize_word,
("escape", "d"): nc.kill_word,
("escape", "h"): nc.backward_kill_word,
("escape", "l"): nc.downcase_word,
("escape", "u"): nc.uppercase_word,
("escape", "y"): nc.yank_pop,
("escape", "."): nc.yank_last_arg,
krassowski
Allow to customize shortcuts
r28074 }.items()
]
def add_binding(bindings: KeyBindings, binding: Binding):
bindings.add(
*binding.keys,
**({"filter": binding.filter} if binding.filter is not None else {}),
)(binding.command)
def create_ipython_shortcuts(shell, skip=None) -> KeyBindings:
"""Set up the prompt_toolkit keyboard shortcuts for IPython.
Martin Skarzynski
add emacs keybindings to vi insert mode
r26067
krassowski
Allow to customize shortcuts
r28074 Parameters
----------
shell: InteractiveShell
The current IPython shell Instance
skip: List[Binding]
Bindings to skip.
Returns
-------
KeyBindings
the keybinding instance for prompt toolkit.
"""
kb = KeyBindings()
skip = skip or []
for binding in KEY_BINDINGS:
skip_this_one = False
for to_skip in skip:
if (
to_skip.command == binding.command
and to_skip.filter == binding.filter
and to_skip.keys == binding.keys
):
skip_this_one = True
break
if skip_this_one:
continue
add_binding(kb, binding)
Martin Skarzynski
add emacs keybindings to vi insert mode
r26067
Martin Skarzynski
cursor shape changes with vi editing mode
r26113 def get_input_mode(self):
Matthias Bussonnier
remove last bits of pre-38 codepath....
r27154 app = get_app()
app.ttimeoutlen = shell.ttimeoutlen
app.timeoutlen = shell.timeoutlen
Martin Skarzynski
cursor shape changes with vi editing mode
r26113
return self._input_mode
def set_input_mode(self, mode):
shape = {InputMode.NAVIGATION: 2, InputMode.REPLACE: 4}.get(mode, 6)
cursor = "\x1b[{} q".format(shape)
ltrujello
Fixes #13472 by restoring user's terminal cursor
r27508 sys.stdout.write(cursor)
Martin Skarzynski
cursor shape changes with vi editing mode
r26113 sys.stdout.flush()
self._input_mode = mode
if shell.editing_mode == "vi" and shell.modal_cursor:
krassowski
Fix mypy job, fix issues detected by mypy
r28011 ViState._input_mode = InputMode.INSERT # type: ignore
ViState.input_mode = property(get_input_mode, set_input_mode) # type: ignore
krassowski
Allow to customize shortcuts
r28074
Jonathan Slenders
Upgrade to prompt_toolkit 2.0
r24376 return kb
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642
krassowski
Allow to customize shortcuts
r28074 def reformat_and_execute(event):
"""Reformat code and execute it"""
shell = get_ipython()
reformat_text_before_cursor(
event.current_buffer, event.current_buffer.document, shell
)
event.current_buffer.validate_and_handle()
Matthias Bussonnier
some more work
r25142 def reformat_text_before_cursor(buffer, document, shell):
krassowski
Restore shortcuts in documentation, define identifiers
r28010 text = buffer.delete_before_cursor(len(document.text[: document.cursor_position]))
Matthias Bussonnier
some more work
r25142 try:
formatted_text = shell.reformat_handler(text)
buffer.insert_text(formatted_text)
except Exception as e:
buffer.insert_text(text)
krassowski
Allow to customize shortcuts
r28074 def handle_return_or_newline_or_execute(event):
shell = get_ipython()
if getattr(shell, "handle_return", None):
return shell.handle_return(shell)(event)
else:
return newline_or_execute_outer(shell)(event)
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 def newline_or_execute_outer(shell):
def newline_or_execute(event):
"""When the user presses return, insert a newline or execute the code."""
b = event.current_buffer
d = b.document
if b.complete_state:
cc = b.complete_state.current_completion
if cc:
b.apply_completion(cc)
else:
b.cancel_completion()
return
Thomas Kluyver
Prefer execution when there's only a single line entered...
r23577 # If there's only one line, treat it as if the cursor is at the end.
# See https://github.com/ipython/ipython/issues/10425
if d.line_count == 1:
check_text = d.text
else:
krassowski
Restore shortcuts in documentation, define identifiers
r28010 check_text = d.text[: d.cursor_position]
Thomas Kluyver
Add shell.check_complete() method...
r24180 status, indent = shell.check_complete(check_text)
krassowski
Restore shortcuts in documentation, define identifiers
r28010
Matthias Bussonnier
some more work
r25142 # if all we have after the cursor is whitespace: reformat current text
# before cursor
krassowski
Restore shortcuts in documentation, define identifiers
r28010 after_cursor = d.text[d.cursor_position :]
Matthias Bussonnier
Fix auto formatting to be called only once....
r25753 reformatted = False
Matthias Bussonnier
update code to work with black more recent versions
r25242 if not after_cursor.strip():
Matthias Bussonnier
some more work
r25142 reformat_text_before_cursor(b, d, shell)
Matthias Bussonnier
Fix auto formatting to be called only once....
r25753 reformatted = True
krassowski
Restore shortcuts in documentation, define identifiers
r28010 if not (
d.on_last_line
or d.cursor_position_row >= d.line_count - d.empty_line_count_at_the_end()
):
Matthias Bussonnier
Undeprecate autoindent...
r24498 if shell.autoindent:
krassowski
Restore shortcuts in documentation, define identifiers
r28010 b.insert_text("\n" + indent)
Matthias Bussonnier
Undeprecate autoindent...
r24498 else:
krassowski
Restore shortcuts in documentation, define identifiers
r28010 b.insert_text("\n")
Matthias Bussonnier
Indent on new line by looking at the text before the cursor....
r23323 return
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642
krassowski
Restore shortcuts in documentation, define identifiers
r28010 if (status != "incomplete") and b.accept_handler:
Matthias Bussonnier
Fix auto formatting to be called only once....
r25753 if not reformatted:
reformat_text_before_cursor(b, d, shell)
Jonathan Slenders
Upgrade to prompt_toolkit 2.0
r24376 b.validate_and_handle()
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 else:
Matthias Bussonnier
Undeprecate autoindent...
r24498 if shell.autoindent:
krassowski
Restore shortcuts in documentation, define identifiers
r28010 b.insert_text("\n" + indent)
Matthias Bussonnier
Undeprecate autoindent...
r24498 else:
krassowski
Restore shortcuts in documentation, define identifiers
r28010 b.insert_text("\n")
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 return newline_or_execute
def previous_history_or_previous_completion(event):
"""
Control-P in vi edit mode on readline is history next, unlike default prompt toolkit.
If completer is open this still select previous completion.
"""
event.current_buffer.auto_up()
def next_history_or_next_completion(event):
"""
Control-N in vi edit mode on readline is history previous, unlike default prompt toolkit.
If completer is open this still select next completion.
"""
event.current_buffer.auto_down()
def dismiss_completion(event):
krassowski
Restore shortcuts in documentation, define identifiers
r28010 """Dismiss completion"""
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 b = event.current_buffer
if b.complete_state:
b.cancel_completion()
def reset_buffer(event):
krassowski
Restore shortcuts in documentation, define identifiers
r28010 """Reset buffer"""
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 b = event.current_buffer
if b.complete_state:
b.cancel_completion()
else:
b.reset()
def reset_search_buffer(event):
krassowski
Restore shortcuts in documentation, define identifiers
r28010 """Reset search buffer"""
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 if event.current_buffer.document.text:
event.current_buffer.reset()
else:
Jonathan Slenders
Upgrade to prompt_toolkit 2.0
r24376 event.app.layout.focus(DEFAULT_BUFFER)
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642
krassowski
Restore shortcuts in documentation, define identifiers
r28010
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 def suspend_to_bg(event):
krassowski
Restore shortcuts in documentation, define identifiers
r28010 """Suspend to background"""
Jonathan Slenders
Upgrade to prompt_toolkit 2.0
r24376 event.app.suspend_to_background()
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642
krassowski
Restore shortcuts in documentation, define identifiers
r28010
Maor Kleinberger
Fix ctrl-\ behavior...
r27599 def quit(event):
Matthias Bussonnier
Quit IPython on Ctrl-\ (SIGQUIT)...
r22739 """
krassowski
Restore shortcuts in documentation, define identifiers
r28010 Quit application with ``SIGQUIT`` if supported or ``sys.exit`` otherwise.
Maor Kleinberger
Fix ctrl-\ behavior...
r27599 On platforms that support SIGQUIT, send SIGQUIT to the current process.
On other platforms, just exit the process with a message.
Matthias Bussonnier
Quit IPython on Ctrl-\ (SIGQUIT)...
r22739 """
Maor Kleinberger
Fix ctrl-\ behavior...
r27599 sigquit = getattr(signal, "SIGQUIT", None)
if sigquit is not None:
os.kill(0, signal.SIGQUIT)
else:
sys.exit("Quit")
Matthias Bussonnier
Quit IPython on Ctrl-\ (SIGQUIT)...
r22739
krassowski
Restore shortcuts in documentation, define identifiers
r28010
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 def indent_buffer(event):
krassowski
Restore shortcuts in documentation, define identifiers
r28010 """Indent buffer"""
event.current_buffer.insert_text(" " * 4)
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642
krassowski
Allow to customize shortcuts
r28074 def newline_autoindent(event):
"""Insert a newline after the cursor indented appropriately.
Matthias Bussonnier
Improve indentation of next line when using CTRL-o in terminal....
r23334
Yann Pellegrini
Remove deprecated `newline_with_copy_margin`
r28122 Fancier version of former ``newline_with_copy_margin`` which should
Matthias Bussonnier
Improve indentation of next line when using CTRL-o in terminal....
r23334 compute the correct indentation of the inserted line. That is to say, indent
by 4 extra space after a function definition, class definition, context
manager... And dedent by 4 space after ``pass``, ``return``, ``raise ...``.
"""
krassowski
Allow to customize shortcuts
r28074 shell = get_ipython()
inputsplitter = shell.input_transformer_manager
b = event.current_buffer
d = b.document
Matthias Bussonnier
Improve indentation of next line when using CTRL-o in terminal....
r23334
krassowski
Allow to customize shortcuts
r28074 if b.complete_state:
b.cancel_completion()
text = d.text[: d.cursor_position] + "\n"
_, indent = inputsplitter.check_complete(text)
b.insert_text("\n" + (" " * (indent or 0)), move_cursor=False)
Matthias Bussonnier
Improve indentation of next line when using CTRL-o in terminal....
r23334
Carl Smith
Add shortcut to edit cell
r22851 def open_input_in_editor(event):
krassowski
Restore shortcuts in documentation, define identifiers
r28010 """Open code from input in external editor"""
Jonathan Slenders
Upgrade to prompt_toolkit 2.0
r24376 event.app.current_buffer.open_in_editor()
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642
krassowski
Restore shortcuts in documentation, define identifiers
r28010 if sys.platform == "win32":
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 from IPython.core.error import TryNext
krassowski
Restore shortcuts in documentation, define identifiers
r28010 from IPython.lib.clipboard import (
ClipboardEmpty,
tkinter_clipboard_get,
Matthias Bussonnier
Misc review cleanup....
r28029 win32_clipboard_get,
krassowski
Restore shortcuts in documentation, define identifiers
r28010 )
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642
Fernando Perez
Tag windows-only function so it doesn't get picked up on *nix doc builds.
r22670 @undoc
Thomas Kluyver
Pull shortcut definitions out to a separate module
r22642 def win_paste(event):
try:
text = win32_clipboard_get()
except TryNext:
try:
text = tkinter_clipboard_get()
except (TryNext, ClipboardEmpty):
return
except ClipboardEmpty:
return
Martin Skarzynski
cursor shape changes with vi editing mode
r26113 event.current_buffer.insert_text(text.replace("\t", " " * 4))
krassowski
Restore shortcuts in documentation, define identifiers
r28010
else:
@undoc
def win_paste(event):
krassowski
Allow to customize shortcuts
r28074 """Stub used on other platforms"""
krassowski
Restore shortcuts in documentation, define identifiers
r28010 pass
krassowski
Allow to customize shortcuts
r28074
KEY_BINDINGS = [
Binding(
handle_return_or_newline_or_execute,
["enter"],
"default_buffer_focused & ~has_selection & insert_mode",
),
Binding(
reformat_and_execute,
["escape", "enter"],
"default_buffer_focused & ~has_selection & insert_mode & ebivim",
),
Binding(quit, ["c-\\"]),
Binding(
previous_history_or_previous_completion,
["c-p"],
"vi_insert_mode & default_buffer_focused",
),
Binding(
next_history_or_next_completion,
["c-n"],
"vi_insert_mode & default_buffer_focused",
),
Binding(dismiss_completion, ["c-g"], "default_buffer_focused & has_completions"),
Binding(reset_buffer, ["c-c"], "default_buffer_focused"),
Binding(reset_search_buffer, ["c-c"], "search_buffer_focused"),
Binding(suspend_to_bg, ["c-z"], "supports_suspend"),
Binding(
indent_buffer,
["tab"], # Ctrl+I == Tab
"default_buffer_focused"
" & ~has_selection"
" & insert_mode"
" & cursor_in_leading_ws",
),
Binding(newline_autoindent, ["c-o"], "default_buffer_focused & emacs_insert_mode"),
Binding(open_input_in_editor, ["f2"], "default_buffer_focused"),
*AUTO_MATCH_BINDINGS,
*AUTO_SUGGEST_BINDINGS,
Binding(
display_completions_like_readline,
["c-i"],
"readline_like_completions"
" & default_buffer_focused"
" & ~has_selection"
" & insert_mode"
" & ~cursor_in_leading_ws",
),
Binding(win_paste, ["c-v"], "default_buffer_focused & ~vi_mode & is_windows_os"),
*SIMPLE_CONTROL_BINDINGS,
*ALT_AND_COMOBO_CONTROL_BINDINGS,
]