dbcli / mycli

A Terminal Client for MySQL with AutoCompletion and Syntax Highlighting.
http://mycli.net
Other
11.32k stars 656 forks source link

`<` and `>` keys break MyCLI in vi mode #1124

Closed dbedrenko closed 10 months ago

dbedrenko commented 11 months ago

Version: 1.26.1 Steps to reproduce:

  1. Use the default config file and set key_bindings = vi
  2. Run mycli and press <

This is the error I get:

Connecting to socket /var/run/mysqld/mysqld.sock, owned by user mysql
MariaDB 11.0.2
mycli 1.26.1
Home: http://mycli.net
Bug tracker: https://github.com/dbcli/mycli/issues
Thanks to the contributor - orpharion bestheneme

Unhandled exception in event loop:
  File "/usr/lib/python3.11/asyncio/events.py", line 80, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/lib/python3.11/site-packages/prompt_toolkit/input/vt100.py", line 162, in callback_wrapper
    callback()
  File "/usr/lib/python3.11/site-packages/prompt_toolkit/application/application.py", line 712, in read_from_input_in_context
    context.copy().run(read_from_input)
  File "/usr/lib/python3.11/site-packages/prompt_toolkit/application/application.py", line 692, in read_from_input
    self.key_processor.process_keys()
  File "/usr/lib/python3.11/site-packages/prompt_toolkit/key_binding/key_processor.py", line 272, in process_keys
    self._process_coroutine.send(key_press)
  File "/usr/lib/python3.11/site-packages/prompt_toolkit/key_binding/key_processor.py", line 187, in _process
    self._call_handler(matches[-1], key_sequence=buffer[:])
  File "/usr/lib/python3.11/site-packages/prompt_toolkit/key_binding/key_processor.py", line 322, in _call_handler
    handler.call(event)
  File "/usr/lib/python3.11/site-packages/prompt_toolkit/key_binding/key_bindings.py", line 124, in call
    result = self.handler(event)
             ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mycli/key_bindings.py", line 96, in _
    cursorpos_relative = b.cursor_position / len(b.text)
                         ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~

Exception division by zero
Press ENTER to continue...
MariaDB danb@(none):(none)>

Actually in vi insert mode pressing '<' seems to execute some sort of "prettify" library on the input, e.g. if you have this on your prompt with the cursor after having and press <:

 select * from `Person` where Person.id in (select max(id) from Person group by Email having );

Instead of inserting a < it says on the status line

" Unprettify failed to parse statement Right-arrow to complete suggestion".

So in summary, I can't insert a < nor >.

rolandwalker commented 11 months ago

Hi! I introduced this feature many months ago. But I thought someone else had fixed the issues with vi bindings. Will review. It is simple enough to revert the feature in vi mode.

dbedrenko commented 11 months ago

Thank you, and thank you for such a handy application!

In the mean time I found a workaround: pasting '<' and '>' from clipboard does not trigger the prettify feature.

rolandwalker commented 11 months ago

Indeed the bindings were removed in #1089; it seems we are just overdue for a release.

dbedrenko commented 11 months ago

Ah I see, that's too bad :( I think I will stick with the current version to keep the vi bindings as it's too much of a pain editing input in the other modes. Thanks for looking into it anyway.

rolandwalker commented 11 months ago

Sorry, I meant that the < issue is fixed and will propagate out if we do a release today.

rolandwalker commented 10 months ago

https://github.com/dbcli/mycli/releases/tag/v1.27.0

1.27.0 is on PyPi now, and includes the primitive fix of just disabling the prettify functionality in vi-mode. Later we should find someone who understand vi bindings well enough to enable it the right way. Sorry this went unreleased for a while.

dbedrenko commented 10 months ago

Works great now! Big thank you!