2015-01-05 00:46:58 +00:00
|
|
|
import logging
|
2016-05-05 18:10:59 +00:00
|
|
|
from prompt_toolkit.enums import EditingMode
|
2018-09-28 21:18:40 +00:00
|
|
|
from prompt_toolkit.key_binding import KeyBindings
|
2019-07-29 20:00:33 +00:00
|
|
|
from prompt_toolkit.filters import (
|
|
|
|
completion_is_selected,
|
2019-10-13 12:50:36 +00:00
|
|
|
is_searching,
|
2019-07-29 20:00:33 +00:00
|
|
|
has_completions,
|
|
|
|
has_selection,
|
2019-10-23 22:12:54 +00:00
|
|
|
vi_mode,
|
2019-07-29 20:00:33 +00:00
|
|
|
)
|
2014-12-11 08:26:32 +00:00
|
|
|
|
2022-09-08 22:14:42 +00:00
|
|
|
from .pgbuffer import buffer_should_be_handled, safe_multi_line_mode
|
2019-10-13 00:07:57 +00:00
|
|
|
|
2015-01-05 00:46:58 +00:00
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
2015-10-10 03:59:57 +00:00
|
|
|
|
2018-09-28 21:18:40 +00:00
|
|
|
def pgcli_bindings(pgcli):
|
2018-07-27 17:08:03 +00:00
|
|
|
"""Custom key bindings for pgcli."""
|
2018-09-28 21:18:40 +00:00
|
|
|
kb = KeyBindings()
|
2018-07-27 17:08:03 +00:00
|
|
|
|
2019-05-25 20:08:56 +00:00
|
|
|
tab_insert_text = " " * 4
|
2018-07-27 16:07:18 +00:00
|
|
|
|
2019-05-25 20:08:56 +00:00
|
|
|
@kb.add("f2")
|
2014-12-11 08:26:32 +00:00
|
|
|
def _(event):
|
2018-09-28 21:18:40 +00:00
|
|
|
"""Enable/Disable SmartCompletion Mode."""
|
2019-05-25 20:08:56 +00:00
|
|
|
_logger.debug("Detected F2 key.")
|
2018-09-28 21:18:40 +00:00
|
|
|
pgcli.completer.smart_completion = not pgcli.completer.smart_completion
|
2014-12-16 06:04:03 +00:00
|
|
|
|
2019-05-25 20:08:56 +00:00
|
|
|
@kb.add("f3")
|
2014-12-16 06:04:03 +00:00
|
|
|
def _(event):
|
2018-09-28 21:18:40 +00:00
|
|
|
"""Enable/Disable Multiline Mode."""
|
2019-05-25 20:08:56 +00:00
|
|
|
_logger.debug("Detected F3 key.")
|
2018-09-28 21:18:40 +00:00
|
|
|
pgcli.multi_line = not pgcli.multi_line
|
2014-12-19 16:21:59 +00:00
|
|
|
|
2019-05-25 20:08:56 +00:00
|
|
|
@kb.add("f4")
|
2015-02-13 06:29:00 +00:00
|
|
|
def _(event):
|
2018-09-28 21:18:40 +00:00
|
|
|
"""Toggle between Vi and Emacs mode."""
|
2019-05-25 20:08:56 +00:00
|
|
|
_logger.debug("Detected F4 key.")
|
2018-09-28 21:18:40 +00:00
|
|
|
pgcli.vi_mode = not pgcli.vi_mode
|
|
|
|
event.app.editing_mode = EditingMode.VI if pgcli.vi_mode else EditingMode.EMACS
|
2016-05-05 18:10:59 +00:00
|
|
|
|
2022-04-04 02:20:02 +00:00
|
|
|
@kb.add("f5")
|
|
|
|
def _(event):
|
|
|
|
"""Toggle between Vi and Emacs mode."""
|
|
|
|
_logger.debug("Detected F5 key.")
|
|
|
|
pgcli.explain_mode = not pgcli.explain_mode
|
|
|
|
|
2019-05-25 20:08:56 +00:00
|
|
|
@kb.add("tab")
|
2014-12-19 16:21:59 +00:00
|
|
|
def _(event):
|
2018-07-27 17:08:03 +00:00
|
|
|
"""Force autocompletion at cursor on non-empty lines."""
|
|
|
|
|
2019-05-25 20:08:56 +00:00
|
|
|
_logger.debug("Detected <Tab> key.")
|
2018-10-01 09:25:13 +00:00
|
|
|
|
|
|
|
buff = event.app.current_buffer
|
2018-07-27 17:08:03 +00:00
|
|
|
doc = buff.document
|
2018-07-27 15:44:38 +00:00
|
|
|
|
2018-07-29 08:38:23 +00:00
|
|
|
if doc.on_first_line or doc.current_line.strip():
|
2018-07-27 17:08:03 +00:00
|
|
|
if buff.complete_state:
|
|
|
|
buff.complete_next()
|
2018-07-27 15:44:38 +00:00
|
|
|
else:
|
2018-10-01 09:25:13 +00:00
|
|
|
buff.start_completion(select_first=True)
|
2015-05-02 15:01:57 +00:00
|
|
|
else:
|
2018-07-27 17:08:03 +00:00
|
|
|
buff.insert_text(tab_insert_text, fire_event=False)
|
2015-01-08 20:07:08 +00:00
|
|
|
|
2019-05-25 20:08:56 +00:00
|
|
|
@kb.add("escape", filter=has_completions)
|
2019-02-13 00:18:32 +00:00
|
|
|
def _(event):
|
|
|
|
"""Force closing of autocompletion."""
|
2019-05-25 20:08:56 +00:00
|
|
|
_logger.debug("Detected <Esc> key.")
|
2019-02-13 00:18:32 +00:00
|
|
|
|
|
|
|
event.current_buffer.complete_state = None
|
|
|
|
event.app.current_buffer.complete_state = None
|
|
|
|
|
2019-05-25 20:08:56 +00:00
|
|
|
@kb.add("c-space")
|
2015-04-29 01:11:28 +00:00
|
|
|
def _(event):
|
|
|
|
"""
|
|
|
|
Initialize autocompletion at cursor.
|
|
|
|
|
|
|
|
If the autocompletion menu is not showing, display it with the
|
|
|
|
appropriate completions for the context.
|
|
|
|
|
|
|
|
If the menu is showing, select the next completion.
|
|
|
|
"""
|
2019-05-25 20:08:56 +00:00
|
|
|
_logger.debug("Detected <C-Space> key.")
|
2015-05-02 15:01:57 +00:00
|
|
|
|
2018-09-28 21:18:40 +00:00
|
|
|
b = event.app.current_buffer
|
2015-05-02 15:01:57 +00:00
|
|
|
if b.complete_state:
|
|
|
|
b.complete_next()
|
|
|
|
else:
|
2018-09-28 21:18:40 +00:00
|
|
|
b.start_completion(select_first=False)
|
2015-04-29 01:11:28 +00:00
|
|
|
|
2019-05-25 20:08:56 +00:00
|
|
|
@kb.add("enter", filter=completion_is_selected)
|
2015-10-10 03:59:57 +00:00
|
|
|
def _(event):
|
2018-09-28 21:18:40 +00:00
|
|
|
"""Makes the enter key work as the tab key only when showing the menu.
|
|
|
|
|
|
|
|
In other words, don't execute query when enter is pressed in
|
|
|
|
the completion dropdown menu, instead close the dropdown menu
|
|
|
|
(accept current selection).
|
|
|
|
|
2015-10-10 03:59:57 +00:00
|
|
|
"""
|
2019-10-23 21:11:44 +00:00
|
|
|
_logger.debug("Detected enter key during completion selection.")
|
2015-10-10 03:59:57 +00:00
|
|
|
|
|
|
|
event.current_buffer.complete_state = None
|
2019-02-13 00:18:32 +00:00
|
|
|
event.app.current_buffer.complete_state = None
|
2015-10-10 03:59:57 +00:00
|
|
|
|
2019-10-13 00:07:57 +00:00
|
|
|
# When using multi_line input mode the buffer is not handled on Enter (a new line is
|
2019-10-13 12:50:36 +00:00
|
|
|
# inserted instead), so we force the handling if we're not in a completion or
|
|
|
|
# history search, and one of several conditions are True
|
2019-10-13 00:07:57 +00:00
|
|
|
@kb.add(
|
|
|
|
"enter",
|
2019-10-23 21:11:44 +00:00
|
|
|
filter=~(completion_is_selected | is_searching)
|
|
|
|
& buffer_should_be_handled(pgcli),
|
2019-10-13 00:07:57 +00:00
|
|
|
)
|
|
|
|
def _(event):
|
2019-10-23 21:11:44 +00:00
|
|
|
_logger.debug("Detected enter key.")
|
2019-10-13 00:07:57 +00:00
|
|
|
event.current_buffer.validate_and_handle()
|
|
|
|
|
2022-09-08 22:14:42 +00:00
|
|
|
@kb.add("escape", "enter", filter=~vi_mode & ~safe_multi_line_mode(pgcli))
|
2019-06-03 02:15:16 +00:00
|
|
|
def _(event):
|
|
|
|
"""Introduces a line break regardless of multi-line mode or not."""
|
|
|
|
_logger.debug("Detected alt-enter key.")
|
|
|
|
event.app.current_buffer.insert_text("\n")
|
|
|
|
|
2019-07-29 20:00:33 +00:00
|
|
|
@kb.add("c-p", filter=~has_selection)
|
|
|
|
def _(event):
|
|
|
|
"""Move up in history."""
|
|
|
|
event.current_buffer.history_backward(count=event.arg)
|
|
|
|
|
|
|
|
@kb.add("c-n", filter=~has_selection)
|
|
|
|
def _(event):
|
|
|
|
"""Move down in history."""
|
|
|
|
event.current_buffer.history_forward(count=event.arg)
|
|
|
|
|
2018-09-28 21:18:40 +00:00
|
|
|
return kb
|