From 205949a79b7909d1ce5bdd8f70afdf219e0336f7 Mon Sep 17 00:00:00 2001 From: Artur Balabanov Date: Fri, 27 Jul 2018 16:44:38 +0100 Subject: Tab press on an empty line is interrupted as a \t character insert --- pgcli/key_bindings.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pgcli/key_bindings.py b/pgcli/key_bindings.py index 646e6f77..b7dca0f6 100644 --- a/pgcli/key_bindings.py +++ b/pgcli/key_bindings.py @@ -58,10 +58,18 @@ def pgcli_bindings(get_vi_mode_enabled, set_vi_mode_enabled): """ _logger.debug('Detected key.') b = event.cli.current_buffer - if b.complete_state: - b.complete_next() + + line_start = b.document.cursor_position + b.document.get_start_of_line_position() + line_end = b.document.cursor_position + b.document.get_end_of_line_position() + current_line = b.document.text[line_start:line_end] + + if current_line.strip(): + if b.complete_state: + b.complete_next() + else: + event.cli.start_completion(select_first=True) else: - event.cli.start_completion(select_first=True) + b.insert_text('\t', fire_event=False) @key_binding_manager.registry.add_binding(Keys.ControlSpace) def _(event): -- cgit v1.2.3 From 2870103d5d2f00e6b35c615592714266ca3223f4 Mon Sep 17 00:00:00 2001 From: Artur Balabanov Date: Fri, 27 Jul 2018 16:47:15 +0100 Subject: Docstring updated for the Tab key binding method --- pgcli/key_bindings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgcli/key_bindings.py b/pgcli/key_bindings.py index b7dca0f6..03e0a1e3 100644 --- a/pgcli/key_bindings.py +++ b/pgcli/key_bindings.py @@ -54,7 +54,7 @@ def pgcli_bindings(get_vi_mode_enabled, set_vi_mode_enabled): @key_binding_manager.registry.add_binding(Keys.Tab) def _(event): """ - Force autocompletion at cursor. + Force autocompletion at cursor on non-empty lines. """ _logger.debug('Detected key.') b = event.cli.current_buffer -- cgit v1.2.3 From 676b5e6ff667aaa4d8d6e721576f86aaf5300af0 Mon Sep 17 00:00:00 2001 From: Artur Balabanov Date: Fri, 27 Jul 2018 17:07:18 +0100 Subject: Add a config option -- expand_tab. If set, \t character will be replaced by 4 spaces when a key is pressed on an empty line --- pgcli/key_bindings.py | 6 ++++-- pgcli/main.py | 3 ++- pgcli/pgclirc | 3 +++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pgcli/key_bindings.py b/pgcli/key_bindings.py index 03e0a1e3..63f83a17 100644 --- a/pgcli/key_bindings.py +++ b/pgcli/key_bindings.py @@ -8,13 +8,15 @@ from .filters import HasSelectedCompletion _logger = logging.getLogger(__name__) -def pgcli_bindings(get_vi_mode_enabled, set_vi_mode_enabled): +def pgcli_bindings(get_vi_mode_enabled, set_vi_mode_enabled, expand_tab): """ Custom key bindings for pgcli. """ assert callable(get_vi_mode_enabled) assert callable(set_vi_mode_enabled) + tab_insert_text = ' ' * 4 if expand_tab else '\t' + key_binding_manager = KeyBindingManager( enable_open_in_editor=True, enable_system_bindings=True, @@ -69,7 +71,7 @@ def pgcli_bindings(get_vi_mode_enabled, set_vi_mode_enabled): else: event.cli.start_completion(select_first=True) else: - b.insert_text('\t', fire_event=False) + b.insert_text(tab_insert_text, fire_event=False) @key_binding_manager.registry.add_binding(Keys.ControlSpace) def _(event): diff --git a/pgcli/main.py b/pgcli/main.py index 4219930f..d254e0de 100644 --- a/pgcli/main.py +++ b/pgcli/main.py @@ -678,7 +678,8 @@ class PGCli(object): key_binding_manager = pgcli_bindings( get_vi_mode_enabled=lambda: self.vi_mode, - set_vi_mode_enabled=set_vi_mode) + set_vi_mode_enabled=set_vi_mode, + expand_tab=self.config['main'].as_bool('expand_tab')) def prompt_tokens(_): if self.dsn_alias and self.prompt_dsn_format is not None: diff --git a/pgcli/pgclirc b/pgcli/pgclirc index fd32752a..6cd35727 100644 --- a/pgcli/pgclirc +++ b/pgcli/pgclirc @@ -143,6 +143,9 @@ enable_pager = True # Use keyring to automatically save and load password in a secure manner keyring = True +# When the key is pressed on an empty line, use 4 spaces instead of \t +expand_tab = False + # Custom colors for the completion menu, toolbar, etc. [colors] Token.Menu.Completions.Completion.Current = 'bg:#ffffff #000000' -- cgit v1.2.3 From 632045487f459472a1527be7322afc2de24d71ed Mon Sep 17 00:00:00 2001 From: Artur Balabanov Date: Fri, 27 Jul 2018 17:15:32 +0100 Subject: Updated changelog --- changelog.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog.rst b/changelog.rst index 653d6f9b..ea222854 100644 --- a/changelog.rst +++ b/changelog.rst @@ -7,6 +7,8 @@ Bug fixes: * Fix for error retrieving version in Redshift (#922). (Thanks: `Irina Truong`_) * Adapt the query used to get functions metadata to PG11 (#919). (Thanks: `Lele Gaifax`_). * Fix for keyring not disabled properly (#920). (Thanks: `Irina Truong`_) +* Tab press on an empty line increases the indentation instead of triggering + the auto-complete pop-up. (Thanks: `Artur Balabanov`_) 1.10.2 ====== -- cgit v1.2.3 From 3cef794dd4441f13dfec50c696d66f0bbc322560 Mon Sep 17 00:00:00 2001 From: Artur Balabanov Date: Fri, 27 Jul 2018 18:08:03 +0100 Subject: PEP8 warnings fixed --- pgcli/key_bindings.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/pgcli/key_bindings.py b/pgcli/key_bindings.py index 63f83a17..71cc5712 100644 --- a/pgcli/key_bindings.py +++ b/pgcli/key_bindings.py @@ -9,9 +9,8 @@ _logger = logging.getLogger(__name__) def pgcli_bindings(get_vi_mode_enabled, set_vi_mode_enabled, expand_tab): - """ - Custom key bindings for pgcli. - """ + """Custom key bindings for pgcli.""" + assert callable(get_vi_mode_enabled) assert callable(set_vi_mode_enabled) @@ -55,23 +54,23 @@ def pgcli_bindings(get_vi_mode_enabled, set_vi_mode_enabled, expand_tab): @key_binding_manager.registry.add_binding(Keys.Tab) def _(event): - """ - Force autocompletion at cursor on non-empty lines. - """ + """Force autocompletion at cursor on non-empty lines.""" + _logger.debug('Detected key.') - b = event.cli.current_buffer + buff = event.cli.current_buffer + doc = buff.document - line_start = b.document.cursor_position + b.document.get_start_of_line_position() - line_end = b.document.cursor_position + b.document.get_end_of_line_position() - current_line = b.document.text[line_start:line_end] + line_start = doc.cursor_position + doc.get_start_of_line_position() + line_end = doc.cursor_position + doc.get_end_of_line_position() + current_line = doc.text[line_start:line_end] if current_line.strip(): - if b.complete_state: - b.complete_next() + if buff.complete_state: + buff.complete_next() else: event.cli.start_completion(select_first=True) else: - b.insert_text(tab_insert_text, fire_event=False) + buff.insert_text(tab_insert_text, fire_event=False) @key_binding_manager.registry.add_binding(Keys.ControlSpace) def _(event): -- cgit v1.2.3 From 77170407ad61370dda87c1ed3f24aa2a50cb4ccc Mon Sep 17 00:00:00 2001 From: Artur Balabanov Date: Sun, 29 Jul 2018 09:32:32 +0100 Subject: Access the current line directly from the Document instance instead of calculating it manually --- pgcli/key_bindings.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pgcli/key_bindings.py b/pgcli/key_bindings.py index 71cc5712..9b28d7e5 100644 --- a/pgcli/key_bindings.py +++ b/pgcli/key_bindings.py @@ -60,11 +60,7 @@ def pgcli_bindings(get_vi_mode_enabled, set_vi_mode_enabled, expand_tab): buff = event.cli.current_buffer doc = buff.document - line_start = doc.cursor_position + doc.get_start_of_line_position() - line_end = doc.cursor_position + doc.get_end_of_line_position() - current_line = doc.text[line_start:line_end] - - if current_line.strip(): + if doc.current_line.strip(): if buff.complete_state: buff.complete_next() else: -- cgit v1.2.3 From 7602998c81cdaff9d4d5c398c72e85e6da62a4bd Mon Sep 17 00:00:00 2001 From: Artur Balabanov Date: Sun, 29 Jul 2018 09:38:23 +0100 Subject: On the first line only autocomplete is always triggered, regardless of whether it's empty or not --- pgcli/key_bindings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgcli/key_bindings.py b/pgcli/key_bindings.py index 9b28d7e5..8c68be4f 100644 --- a/pgcli/key_bindings.py +++ b/pgcli/key_bindings.py @@ -60,7 +60,7 @@ def pgcli_bindings(get_vi_mode_enabled, set_vi_mode_enabled, expand_tab): buff = event.cli.current_buffer doc = buff.document - if doc.current_line.strip(): + if doc.on_first_line or doc.current_line.strip(): if buff.complete_state: buff.complete_next() else: -- cgit v1.2.3