summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Slenders <jonathan@slenders.be>2015-05-02 17:01:57 +0200
committerAmjith Ramanujam <amjith.r@gmail.com>2015-05-11 13:29:45 -0700
commit5f8126c1799974f0bebad9390c025329c2343b36 (patch)
treefc18250b161fb552d27bad65b73cbaef44dbbefd
parente4f571970c8da2c4ac68f8b5fb751ff13cd3b154 (diff)
Upgrade to prompt-toolkit 0.34
-rw-r--r--pgcli/key_bindings.py13
-rwxr-xr-xpgcli/main.py44
-rw-r--r--pgcli/pgbuffer.py10
-rw-r--r--pgcli/pgclirc2
-rw-r--r--pgcli/pgcompleter.py2
-rw-r--r--pgcli/pgstyle.py30
-rw-r--r--pgcli/pgtoolbar.py35
-rw-r--r--setup.py2
8 files changed, 83 insertions, 55 deletions
diff --git a/pgcli/key_bindings.py b/pgcli/key_bindings.py
index 9955d149..c75c6349 100644
--- a/pgcli/key_bindings.py
+++ b/pgcli/key_bindings.py
@@ -42,7 +42,11 @@ def pgcli_bindings(vi_mode=False):
Force autocompletion at cursor.
"""
_logger.debug('Detected <Tab> key.')
- event.cli.current_buffer.complete_next()
+ b = event.cli.current_buffer
+ if b.complete_state:
+ b.complete_next()
+ else:
+ event.cli.start_completion(select_first=True)
@key_binding_manager.registry.add_binding(Keys.ControlSpace)
def _(event):
@@ -55,6 +59,11 @@ def pgcli_bindings(vi_mode=False):
If the menu is showing, select the next completion.
"""
_logger.debug('Detected <C-Space> key.')
- event.cli.current_buffer.complete_next(start_at_first=False)
+
+ b = event.cli.current_buffer
+ if b.complete_state:
+ b.complete_next()
+ else:
+ event.cli.start_completion(select_first=False)
return key_binding_manager
diff --git a/pgcli/main.py b/pgcli/main.py
index 77a3fa08..44eca2f7 100755
--- a/pgcli/main.py
+++ b/pgcli/main.py
@@ -10,13 +10,15 @@ from time import time
import click
import sqlparse
-from prompt_toolkit import CommandLineInterface, AbortAction, Exit
+from prompt_toolkit import CommandLineInterface, AbortAction
+from prompt_toolkit.shortcuts import create_default_layout, create_eventloop
from prompt_toolkit.document import Document
-from prompt_toolkit.layout import Layout
+from prompt_toolkit.filters import Always
+from prompt_toolkit.layout.processors import HighlightMatchingBracketProcessor
from prompt_toolkit.layout.prompt import DefaultPrompt
-from prompt_toolkit.layout.menus import CompletionsMenu
from prompt_toolkit.history import FileHistory
from pygments.lexers.sql import PostgresLexer
+from pygments.token import Token
from .packages.tabulate import tabulate
from .packages.expanded import expanded_table
@@ -25,7 +27,7 @@ from .packages.pgspecial import (CASE_SENSITIVE_COMMANDS,
import pgcli.packages.pgspecial as pgspecial
import pgcli.packages.iospecial as iospecial
from .pgcompleter import PGCompleter
-from .pgtoolbar import PGToolbar
+from .pgtoolbar import create_toolbar_tokens_func
from .pgstyle import style_factory
from .pgexecute import PGExecute
from .pgbuffer import PGBuffer
@@ -183,13 +185,12 @@ class PGCli(object):
raise RuntimeError(message)
document = cli.read_input(
initial_document=Document(sql, cursor_position=len(sql)),
- on_exit=AbortAction.RAISE_EXCEPTION)
+ )
continue
return document
def run_cli(self):
pgexecute = self.pgexecute
- prompt = '%s> ' % pgexecute.dbname
logger = self.logger
original_less_opts = self.adjust_less_opts()
@@ -201,27 +202,36 @@ class PGCli(object):
print('Mail: https://groups.google.com/forum/#!forum/pgcli')
print('Home: http://pgcli.com')
- layout = Layout(before_input=DefaultPrompt(prompt),
- menus=[CompletionsMenu(max_height=10)],
- lexer=PostgresLexer,
- bottom_toolbars=[PGToolbar(key_binding_manager)])
+ def prompt_tokens(cli):
+ return [(Token.Prompt, '%s> ' % pgexecute.dbname)]
+
+ get_toolbar_tokens = create_toolbar_tokens_func(key_binding_manager)
+ layout = create_default_layout(lexer=PostgresLexer,
+ reserve_space_for_menu=True,
+ get_prompt_tokens=prompt_tokens,
+ get_bottom_toolbar_tokens=get_toolbar_tokens,
+ extra_input_processors=[
+ HighlightMatchingBracketProcessor(),
+ ])
buf = PGBuffer(always_multiline=self.multi_line, completer=completer,
- history=FileHistory(os.path.expanduser('~/.pgcli-history')))
- cli = CommandLineInterface(style=style_factory(self.syntax_style),
+ history=FileHistory(os.path.expanduser('~/.pgcli-history')),
+ complete_while_typing=Always())
+ cli = CommandLineInterface(create_eventloop(),
+ style=style_factory(self.syntax_style),
layout=layout, buffer=buf,
- key_bindings_registry=key_binding_manager.registry)
+ key_bindings_registry=key_binding_manager.registry,
+ on_exit=AbortAction.RAISE_EXCEPTION)
try:
while True:
- cli.layout.before_input = DefaultPrompt(prompt)
- document = cli.read_input(on_exit=AbortAction.RAISE_EXCEPTION)
+ document = cli.read_input()
# The reason we check here instead of inside the pgexecute is
# because we want to raise the Exit exception which will be
# caught by the try/except block that wraps the pgexecute.run()
# statement.
if quit_command(document.text):
- raise Exit
+ raise EOFError
try:
document = self.handle_editor_command(cli, document)
@@ -319,7 +329,7 @@ class PGCli(object):
query = Query(document.text, successful, mutating)
self.query_history.append(query)
- except Exit:
+ except EOFError:
print ('Goodbye!')
finally: # Reset the less opts back to original.
logger.debug('Restoring env var LESS to %r.', original_less_opts)
diff --git a/pgcli/pgbuffer.py b/pgcli/pgbuffer.py
index 0dbf43d3..2687a5f6 100644
--- a/pgcli/pgbuffer.py
+++ b/pgcli/pgbuffer.py
@@ -1,10 +1,16 @@
from prompt_toolkit.buffer import Buffer
+from prompt_toolkit.filters import Condition
class PGBuffer(Buffer):
def __init__(self, always_multiline, *args, **kwargs):
self.always_multiline = always_multiline
- is_multiline = lambda doc: self.always_multiline and not _multiline_exception(doc.text)
- super(PGBuffer, self).__init__(*args, is_multiline=is_multiline, **kwargs)
+
+ @Condition
+ def is_multiline():
+ doc = self.document
+ return self.always_multiline and not _multiline_exception(doc.text)
+
+ super(self.__class__, self).__init__(*args, is_multiline=is_multiline, **kwargs)
def _multiline_exception(text):
text = text.strip()
diff --git a/pgcli/pgclirc b/pgcli/pgclirc
index c6e15cc0..932356e5 100644
--- a/pgcli/pgclirc
+++ b/pgcli/pgclirc
@@ -29,7 +29,7 @@ table_format = psql
# Syntax Style. Possible values: manni, igor, xcode, vim, autumn, vs, rrt,
# native, perldoc, borland, tango, emacs, friendly, monokai, paraiso-dark,
# colorful, murphy, bw, pastie, paraiso-light, trac, default, fruity
-syntax_style = native
+syntax_style = default
# Enables vi-mode
vi = False
diff --git a/pgcli/pgcompleter.py b/pgcli/pgcompleter.py
index 6ddad72f..c17e2b4d 100644
--- a/pgcli/pgcompleter.py
+++ b/pgcli/pgcompleter.py
@@ -1,4 +1,4 @@
-from __future__ import print_function
+from __future__ import print_function, unicode_literals
import logging
from prompt_toolkit.completion import Completer, Completion
from .packages.sqlcompletion import suggest_type
diff --git a/pgcli/pgstyle.py b/pgcli/pgstyle.py
index 6816a67b..33ceb2ee 100644
--- a/pgcli/pgstyle.py
+++ b/pgcli/pgstyle.py
@@ -1,6 +1,7 @@
from pygments.token import Token
from pygments.style import Style
from pygments.util import ClassNotFound
+from prompt_toolkit.styles import default_style_extensions
import pygments.styles
@@ -11,19 +12,22 @@ def style_factory(name):
style = pygments.styles.get_style_by_name('native')
class PGStyle(Style):
- styles = {
- Token.Menu.Completions.Completion.Current: 'bg:#00aaaa #000000',
- Token.Menu.Completions.Completion: 'bg:#008888 #ffffff',
- Token.Menu.Completions.ProgressButton: 'bg:#003333',
- Token.Menu.Completions.ProgressBar: 'bg:#00aaaa',
- Token.SelectedText: '#ffffff bg:#6666aa',
- Token.IncrementalSearchMatch: '#ffffff bg:#4444aa',
- Token.IncrementalSearchMatch.Current: '#ffffff bg:#44aa44',
- Token.Toolbar: 'bg:#440044 #ffffff',
- Token.Toolbar.Status: 'bg:#222222 #aaaaaa',
- Token.Toolbar.Status.Off: 'bg:#222222 #888888',
- Token.Toolbar.Status.On: 'bg:#222222 #ffffff',
- }
+ styles = {}
+
styles.update(style.styles)
+ styles.update(default_style_extensions)
+ styles.update({
+ Token.Menu.Completions.Completion.Current: 'bg:#00aaaa #000000',
+ Token.Menu.Completions.Completion: 'bg:#008888 #ffffff',
+ Token.Menu.Completions.ProgressButton: 'bg:#003333',
+ Token.Menu.Completions.ProgressBar: 'bg:#00aaaa',
+ Token.SelectedText: '#ffffff bg:#6666aa',
+ Token.IncrementalSearchMatch: '#ffffff bg:#4444aa',
+ Token.IncrementalSearchMatch.Current: '#ffffff bg:#44aa44',
+ Token.Toolbar: 'bg:#440044 #ffffff',
+ Token.Toolbar: 'bg:#222222 #aaaaaa',
+ Token.Toolbar.Off: 'bg:#222222 #888888',
+ Token.Toolbar.On: 'bg:#222222 #ffffff',
+ })
return PGStyle
diff --git a/pgcli/pgtoolbar.py b/pgcli/pgtoolbar.py
index 3a35be4d..0b8846e1 100644
--- a/pgcli/pgtoolbar.py
+++ b/pgcli/pgtoolbar.py
@@ -1,34 +1,33 @@
-from prompt_toolkit.layout.toolbars import Toolbar
-from prompt_toolkit.layout.utils import TokenList
from pygments.token import Token
-class PGToolbar(Toolbar):
- def __init__(self, key_binding_manager, token=None):
- self.key_binding_manager = key_binding_manager
- token = token or Token.Toolbar.Status
- super(PGToolbar, self).__init__(token=token)
+def create_toolbar_tokens_func(key_binding_manager, token=None):
+ """
+ Return a function that generates the toolbar tokens.
+ """
+ token = token or Token.Toolbar
- def get_tokens(self, cli, width):
- result = TokenList()
- result.append((self.token, ' '))
+ def get_toolbar_tokens(cli):
+ result = []
+ result.append((token, ' '))
if cli.buffers['default'].completer.smart_completion:
- result.append((self.token.On, '[F2] Smart Completion: ON '))
+ result.append((token.On, '[F2] Smart Completion: ON '))
else:
- result.append((self.token.Off, '[F2] Smart Completion: OFF '))
+ result.append((token.Off, '[F2] Smart Completion: OFF '))
if cli.buffers['default'].always_multiline:
- result.append((self.token.On, '[F3] Multiline: ON '))
+ result.append((token.On, '[F3] Multiline: ON '))
else:
- result.append((self.token.Off, '[F3] Multiline: OFF '))
+ result.append((token.Off, '[F3] Multiline: OFF '))
if cli.buffers['default'].always_multiline:
- result.append((self.token,
+ result.append((token,
' (Semi-colon [;] will end the line)'))
- if self.key_binding_manager.enable_vi_mode:
- result.append((self.token.On, '[F4] Vi-mode'))
+ if key_binding_manager.enable_vi_mode:
+ result.append((token.On, '[F4] Vi-mode'))
else:
- result.append((self.token.On, '[F4] Emacs-mode'))
+ result.append((token.On, '[F4] Emacs-mode'))
return result
+ return get_toolbar_tokens
diff --git a/setup.py b/setup.py
index 800b91a2..2397610b 100644
--- a/setup.py
+++ b/setup.py
@@ -25,7 +25,7 @@ setup(
install_requires=[
'click >= 3.2',
'Pygments >= 2.0', # Pygments has to be Capitalcased. WTF?
- 'prompt_toolkit==0.26',
+ 'prompt_toolkit==0.36',
'psycopg2 >= 2.5.4',
'sqlparse == 0.1.14'
],