1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
#!/usr/bin/env python
"""
A simple application that shows a Pager application.
"""
from pygments.lexers.python import PythonLexer
from prompt_toolkit.application import Application
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.layout.containers import HSplit, Window
from prompt_toolkit.layout.controls import FormattedTextControl
from prompt_toolkit.layout.dimension import LayoutDimension as D
from prompt_toolkit.layout.layout import Layout
from prompt_toolkit.lexers import PygmentsLexer
from prompt_toolkit.styles import Style
from prompt_toolkit.widgets import SearchToolbar, TextArea
# Create one text buffer for the main content.
_pager_py_path = __file__
with open(_pager_py_path, "rb") as f:
text = f.read().decode("utf-8")
def get_statusbar_text():
return [
("class:status", _pager_py_path + " - "),
(
"class:status.position",
f"{text_area.document.cursor_position_row + 1}:{text_area.document.cursor_position_col + 1}",
),
("class:status", " - Press "),
("class:status.key", "Ctrl-C"),
("class:status", " to exit, "),
("class:status.key", "/"),
("class:status", " for searching."),
]
search_field = SearchToolbar(
text_if_not_searching=[("class:not-searching", "Press '/' to start searching.")]
)
text_area = TextArea(
text=text,
read_only=True,
scrollbar=True,
line_numbers=True,
search_field=search_field,
lexer=PygmentsLexer(PythonLexer),
)
root_container = HSplit(
[
# The top toolbar.
Window(
content=FormattedTextControl(get_statusbar_text),
height=D.exact(1),
style="class:status",
),
# The main content.
text_area,
search_field,
]
)
# Key bindings.
bindings = KeyBindings()
@bindings.add("c-c")
@bindings.add("q")
def _(event):
"Quit."
event.app.exit()
style = Style.from_dict(
{
"status": "reverse",
"status.position": "#aaaa00",
"status.key": "#ffaa00",
"not-searching": "#888888",
}
)
# create application.
application = Application(
layout=Layout(root_container, focused_element=text_area),
key_bindings=bindings,
enable_page_navigation_bindings=True,
mouse_support=True,
style=style,
full_screen=True,
)
def run():
application.run()
if __name__ == "__main__":
run()
|