#298 Add ability to chose matched rule

This commit is contained in:
nvbn
2015-07-28 22:04:27 +03:00
parent 4fc18cb4e7
commit 7933e963d8
10 changed files with 407 additions and 239 deletions
+88
View File
@@ -0,0 +1,88 @@
import sys
from getch import getch
from . import logs
SELECT = 0
ABORT = 1
PREVIOUS = 2
NEXT = 3
def read_actions():
"""Yields actions for pressed keys."""
buffer = []
ch = None
while True:
try:
try:
ch = getch()
except OverflowError: # Ctrl+C, KeyboardInterrupt will be reraised
pass
except KeyboardInterrupt:
yield ABORT
if ch in ('\n', '\r'): # Enter
yield SELECT
buffer.append(ch)
buffer = buffer[-3:]
if buffer == ['\x1b', '[', 'A']: # ↑
yield PREVIOUS
if buffer == ['\x1b', '[', 'B']: # ↓
yield NEXT
class CommandSelector(object):
def __init__(self, commands):
self._commands = commands
self._index = 0
self._on_change = lambda x: x
def next(self):
self._index = (self._index + 1) % len(self._commands)
self._on_change(self.value)
def previous(self):
self._index = (self._index - 1) % len(self._commands)
self._on_change(self.value)
@property
def value(self):
return self._commands[self._index]
def on_change(self, fn):
self._on_change = fn
fn(self.value)
def select_command(corrected_commands, settings):
"""Returns:
- the first command when confirmation disabled;
- None when ctrl+c pressed;
- selected command.
"""
if not corrected_commands:
logs.failed('No fuck given', settings)
return
selector = CommandSelector(corrected_commands)
if not settings.require_confirmation:
logs.show_corrected_command(selector.value, settings)
return selector.value
selector.on_change(lambda val: logs.confirm_text(val, settings))
for key in read_actions():
if key == SELECT:
sys.stderr.write('\n')
return selector.value
elif key == ABORT:
logs.failed('\nAborted', settings)
return
elif key == PREVIOUS:
selector.previous()
elif key == NEXT:
selector.next()