refactor(gui): refactor keymaps

Signed-off-by: Xuehai Pan <XuehaiPan@pku.edu.cn>
This commit is contained in:
Xuehai Pan 2022-09-27 22:52:33 +08:00
parent bc34725e06
commit 671033fce8
5 changed files with 118 additions and 90 deletions

View file

@ -14,6 +14,7 @@ from nvitop.gui.library.keybinding import (
SPECIAL_KEYS,
KeyBuffer,
KeyMaps,
normalize_keybinding,
)
from nvitop.gui.library.libcurses import libcurses, setlocale_utf8
from nvitop.gui.library.mouse import MouseEvent

View file

@ -212,6 +212,21 @@ def construct_keybinding(keys):
return ''.join(strings)
def normalize_keybinding(keybinding):
"""Normalize a keybinding to a string
>>> normalize_keybinding('lol<CR>')
'lol<Enter>'
>>> normalize_keybinding('x<A-Left>')
'x<A-Left>'
>>> normalize_keybinding('x<Alt><Left>')
'x<A-Left>'
"""
return construct_keybinding(parse_keybinding(keybinding))
class KeyMaps(dict):
def __init__(self, keybuffer=None):
super().__init__()
@ -224,6 +239,12 @@ class KeyMaps(dict):
self.used_keymap = keymap_name
self.keybuffer.clear()
def clear_keymap(self, keymap_name):
self[keymap_name] = {}
if self.used_keymap == keymap_name:
self.keybuffer.keymap = {}
self.keybuffer.clear()
def _clean_input(self, context, keys):
try:
pointer = self[context]

View file

@ -221,25 +221,27 @@ class EnvironScreen(Displayable): # pylint: disable=too-many-instance-attribute
def environ_move(direction):
self.move(direction=direction)
self.root.keymaps.bind('environ', 'r', refresh_environ)
self.root.keymaps.copy('environ', 'r', 'R')
self.root.keymaps.copy('environ', 'r', '<C-r>')
self.root.keymaps.copy('environ', 'r', '<F5>')
self.root.keymaps.bind('environ', '<Left>', environ_left)
self.root.keymaps.copy('environ', '<Left>', '<A-h>')
self.root.keymaps.bind('environ', '<Right>', environ_right)
self.root.keymaps.copy('environ', '<Right>', '<A-l>')
self.root.keymaps.bind('environ', '<C-a>', environ_begin)
self.root.keymaps.copy('environ', '<C-a>', '^')
self.root.keymaps.bind('environ', '<Up>', partial(environ_move, direction=-1))
self.root.keymaps.copy('environ', '<Up>', '<S-Tab>')
self.root.keymaps.copy('environ', '<Up>', '<A-k>')
self.root.keymaps.copy('environ', '<Up>', '<PageUp>')
self.root.keymaps.copy('environ', '<Up>', '[')
self.root.keymaps.bind('environ', '<Down>', partial(environ_move, direction=+1))
self.root.keymaps.copy('environ', '<Down>', '<Tab>')
self.root.keymaps.copy('environ', '<Down>', '<A-j>')
self.root.keymaps.copy('environ', '<Down>', '<PageDown>')
self.root.keymaps.copy('environ', '<Down>', ']')
self.root.keymaps.bind('environ', '<Home>', partial(environ_move, direction=-(1 << 20)))
self.root.keymaps.bind('environ', '<End>', partial(environ_move, direction=+(1 << 20)))
keymaps = self.root.keymaps
keymaps.bind('environ', 'r', refresh_environ)
keymaps.copy('environ', 'r', 'R')
keymaps.copy('environ', 'r', '<C-r>')
keymaps.copy('environ', 'r', '<F5>')
keymaps.bind('environ', '<Left>', environ_left)
keymaps.copy('environ', '<Left>', '<A-h>')
keymaps.bind('environ', '<Right>', environ_right)
keymaps.copy('environ', '<Right>', '<A-l>')
keymaps.bind('environ', '<C-a>', environ_begin)
keymaps.copy('environ', '<C-a>', '^')
keymaps.bind('environ', '<Up>', partial(environ_move, direction=-1))
keymaps.copy('environ', '<Up>', '<S-Tab>')
keymaps.copy('environ', '<Up>', '<A-k>')
keymaps.copy('environ', '<Up>', '<PageUp>')
keymaps.copy('environ', '<Up>', '[')
keymaps.bind('environ', '<Down>', partial(environ_move, direction=+1))
keymaps.copy('environ', '<Down>', '<Tab>')
keymaps.copy('environ', '<Down>', '<A-j>')
keymaps.copy('environ', '<Down>', '<PageDown>')
keymaps.copy('environ', '<Down>', ']')
keymaps.bind('environ', '<Home>', partial(environ_move, direction=-(1 << 20)))
keymaps.bind('environ', '<End>', partial(environ_move, direction=+(1 << 20)))

View file

@ -223,56 +223,58 @@ class MainScreen(DisplayableContainer): # pylint: disable=too-many-instance-att
def order_reverse():
sort_by(order=self.process_panel.order, reverse=(not self.process_panel.reverse))
self.root.keymaps.bind('main', 'q', quit)
self.root.keymaps.copy('main', 'q', 'Q')
self.root.keymaps.bind('main', 'a', partial(change_mode, mode='auto'))
self.root.keymaps.bind('main', 'f', partial(change_mode, mode='full'))
self.root.keymaps.bind('main', 'c', partial(change_mode, mode='compact'))
self.root.keymaps.bind('main', 'r', force_refresh)
self.root.keymaps.copy('main', 'r', 'R')
self.root.keymaps.copy('main', 'r', '<C-r>')
self.root.keymaps.copy('main', 'r', '<F5>')
keymaps = self.root.keymaps
self.root.keymaps.bind('main', '<PageUp>', partial(screen_move, direction=-1))
self.root.keymaps.copy('main', '<PageUp>', '[')
self.root.keymaps.copy('main', '<PageUp>', '<A-K>')
self.root.keymaps.bind('main', '<PageDown>', partial(screen_move, direction=+1))
self.root.keymaps.copy('main', '<PageDown>', ']')
self.root.keymaps.copy('main', '<PageDown>', '<A-J>')
keymaps.bind('main', 'q', quit)
keymaps.copy('main', 'q', 'Q')
keymaps.bind('main', 'a', partial(change_mode, mode='auto'))
keymaps.bind('main', 'f', partial(change_mode, mode='full'))
keymaps.bind('main', 'c', partial(change_mode, mode='compact'))
keymaps.bind('main', 'r', force_refresh)
keymaps.copy('main', 'r', 'R')
keymaps.copy('main', 'r', '<C-r>')
keymaps.copy('main', 'r', '<F5>')
self.root.keymaps.bind('main', '<Left>', host_left)
self.root.keymaps.copy('main', '<Left>', '<A-h>')
self.root.keymaps.bind('main', '<Right>', host_right)
self.root.keymaps.copy('main', '<Right>', '<A-l>')
self.root.keymaps.bind('main', '<C-a>', host_begin)
self.root.keymaps.copy('main', '<C-a>', '^')
self.root.keymaps.bind('main', '<C-e>', host_end)
self.root.keymaps.copy('main', '<C-e>', '$')
self.root.keymaps.bind('main', '<Up>', partial(select_move, direction=-1))
self.root.keymaps.copy('main', '<Up>', '<S-Tab>')
self.root.keymaps.copy('main', '<Up>', '<A-k>')
self.root.keymaps.bind('main', '<Down>', partial(select_move, direction=+1))
self.root.keymaps.copy('main', '<Down>', '<Tab>')
self.root.keymaps.copy('main', '<Down>', '<A-j>')
self.root.keymaps.bind('main', '<Home>', partial(select_move, direction=-(1 << 20)))
self.root.keymaps.bind('main', '<End>', partial(select_move, direction=+(1 << 20)))
self.root.keymaps.bind('main', '<Esc>', select_clear)
self.root.keymaps.bind('main', '<Space>', tag)
keymaps.bind('main', '<PageUp>', partial(screen_move, direction=-1))
keymaps.copy('main', '<PageUp>', '[')
keymaps.copy('main', '<PageUp>', '<A-K>')
keymaps.bind('main', '<PageDown>', partial(screen_move, direction=+1))
keymaps.copy('main', '<PageDown>', ']')
keymaps.copy('main', '<PageDown>', '<A-J>')
self.root.keymaps.bind('main', 'T', terminate)
self.root.keymaps.bind('main', 'K', kill)
self.root.keymaps.bind('main', '<C-c>', interrupt)
self.root.keymaps.copy('main', '<C-c>', 'I')
keymaps.bind('main', '<Left>', host_left)
keymaps.copy('main', '<Left>', '<A-h>')
keymaps.bind('main', '<Right>', host_right)
keymaps.copy('main', '<Right>', '<A-l>')
keymaps.bind('main', '<C-a>', host_begin)
keymaps.copy('main', '<C-a>', '^')
keymaps.bind('main', '<C-e>', host_end)
keymaps.copy('main', '<C-e>', '$')
keymaps.bind('main', '<Up>', partial(select_move, direction=-1))
keymaps.copy('main', '<Up>', '<S-Tab>')
keymaps.copy('main', '<Up>', '<A-k>')
keymaps.bind('main', '<Down>', partial(select_move, direction=+1))
keymaps.copy('main', '<Down>', '<Tab>')
keymaps.copy('main', '<Down>', '<A-j>')
keymaps.bind('main', '<Home>', partial(select_move, direction=-(1 << 20)))
keymaps.bind('main', '<End>', partial(select_move, direction=+(1 << 20)))
keymaps.bind('main', '<Esc>', select_clear)
keymaps.bind('main', '<Space>', tag)
self.root.keymaps.bind('main', ',', order_previous)
self.root.keymaps.copy('main', ',', '<')
self.root.keymaps.bind('main', '.', order_next)
self.root.keymaps.copy('main', '.', '>')
self.root.keymaps.bind('main', '/', order_reverse)
keymaps.bind('main', 'T', terminate)
keymaps.bind('main', 'K', kill)
keymaps.bind('main', '<C-c>', interrupt)
keymaps.copy('main', '<C-c>', 'I')
keymaps.bind('main', ',', order_previous)
keymaps.copy('main', ',', '<')
keymaps.bind('main', '.', order_next)
keymaps.copy('main', '.', '>')
keymaps.bind('main', '/', order_reverse)
for order in ProcessPanel.ORDERS:
self.root.keymaps.bind(
keymaps.bind(
'main', 'o' + order[:1].lower(), partial(sort_by, order=order, reverse=False)
)
self.root.keymaps.bind(
keymaps.bind(
'main', 'o' + order[:1].upper(), partial(sort_by, order=order, reverse=True)
)

View file

@ -558,28 +558,30 @@ class TreeViewScreen(Displayable): # pylint: disable=too-many-instance-attribut
def interrupt():
self.selection.interrupt()
self.root.keymaps.bind('treeview', '<Left>', tree_left)
self.root.keymaps.copy('treeview', '<Left>', '<A-h>')
self.root.keymaps.bind('treeview', '<Right>', tree_right)
self.root.keymaps.copy('treeview', '<Right>', '<A-l>')
self.root.keymaps.bind('treeview', '<C-a>', tree_begin)
self.root.keymaps.copy('treeview', '<C-a>', '^')
self.root.keymaps.bind('treeview', '<Up>', partial(select_move, direction=-1))
self.root.keymaps.copy('treeview', '<Up>', '<S-Tab>')
self.root.keymaps.copy('treeview', '<Up>', '<A-k>')
self.root.keymaps.copy('treeview', '<Up>', '<PageUp>')
self.root.keymaps.copy('treeview', '<Up>', '[')
self.root.keymaps.bind('treeview', '<Down>', partial(select_move, direction=+1))
self.root.keymaps.copy('treeview', '<Down>', '<Tab>')
self.root.keymaps.copy('treeview', '<Down>', '<A-j>')
self.root.keymaps.copy('treeview', '<Down>', '<PageDown>')
self.root.keymaps.copy('treeview', '<Down>', ']')
self.root.keymaps.bind('treeview', '<Home>', partial(select_move, direction=-(1 << 20)))
self.root.keymaps.bind('treeview', '<End>', partial(select_move, direction=+(1 << 20)))
self.root.keymaps.bind('treeview', '<Esc>', select_clear)
self.root.keymaps.bind('treeview', '<Space>', tag)
keymaps = self.root.keymaps
self.root.keymaps.bind('treeview', 'T', terminate)
self.root.keymaps.bind('treeview', 'K', kill)
self.root.keymaps.bind('treeview', '<C-c>', interrupt)
self.root.keymaps.copy('treeview', '<C-c>', 'I')
keymaps.bind('treeview', '<Left>', tree_left)
keymaps.copy('treeview', '<Left>', '<A-h>')
keymaps.bind('treeview', '<Right>', tree_right)
keymaps.copy('treeview', '<Right>', '<A-l>')
keymaps.bind('treeview', '<C-a>', tree_begin)
keymaps.copy('treeview', '<C-a>', '^')
keymaps.bind('treeview', '<Up>', partial(select_move, direction=-1))
keymaps.copy('treeview', '<Up>', '<S-Tab>')
keymaps.copy('treeview', '<Up>', '<A-k>')
keymaps.copy('treeview', '<Up>', '<PageUp>')
keymaps.copy('treeview', '<Up>', '[')
keymaps.bind('treeview', '<Down>', partial(select_move, direction=+1))
keymaps.copy('treeview', '<Down>', '<Tab>')
keymaps.copy('treeview', '<Down>', '<A-j>')
keymaps.copy('treeview', '<Down>', '<PageDown>')
keymaps.copy('treeview', '<Down>', ']')
keymaps.bind('treeview', '<Home>', partial(select_move, direction=-(1 << 20)))
keymaps.bind('treeview', '<End>', partial(select_move, direction=+(1 << 20)))
keymaps.bind('treeview', '<Esc>', select_clear)
keymaps.bind('treeview', '<Space>', tag)
keymaps.bind('treeview', 'T', terminate)
keymaps.bind('treeview', 'K', kill)
keymaps.bind('treeview', '<C-c>', interrupt)
keymaps.copy('treeview', '<C-c>', 'I')