mirror of
https://github.com/koloideal/Argenta.git
synced 2026-06-10 10:05:28 +03:00
final work on autocomplete
This commit is contained in:
+24
-50
@@ -1,58 +1,32 @@
|
||||
import readline
|
||||
import os
|
||||
|
||||
HISTORY_FILENAME = 'completer.hist'
|
||||
|
||||
def completer(text, state):
|
||||
matches = sorted(cmd for cmd in get_history_items() if cmd.startswith(text))
|
||||
if len(matches) > 1:
|
||||
common_prefix = matches[0]
|
||||
for match in matches[1:]:
|
||||
i = 0
|
||||
while i < len(common_prefix) and i < len(match) and common_prefix[i] == match[i]:
|
||||
i += 1
|
||||
common_prefix = common_prefix[:i]
|
||||
if state == 0:
|
||||
readline.insert_text(common_prefix[len(text):])
|
||||
readline.redisplay()
|
||||
return None
|
||||
elif len(matches) == 1:
|
||||
return matches[0] if state == 0 else None
|
||||
else:
|
||||
return None
|
||||
|
||||
readline.set_completer(completer)
|
||||
readline.parse_and_bind("tab: complete")
|
||||
|
||||
def get_history_items():
|
||||
return [readline.get_history_item(i) for i in range(1, readline.get_current_history_length() + 1)]
|
||||
|
||||
|
||||
class HistoryCompleter:
|
||||
|
||||
def __init__(self):
|
||||
self.matches = []
|
||||
return
|
||||
|
||||
def complete(self, text, state):
|
||||
response = None
|
||||
if state == 0:
|
||||
history_values = get_history_items()
|
||||
if text:
|
||||
self.matches = sorted(h
|
||||
for h in history_values
|
||||
if h and h.startswith(text))
|
||||
else:
|
||||
self.matches = []
|
||||
try:
|
||||
response = self.matches[state]
|
||||
except IndexError:
|
||||
response = None
|
||||
return response
|
||||
|
||||
|
||||
def inputing():
|
||||
if os.path.exists(HISTORY_FILENAME):
|
||||
readline.read_history_file(HISTORY_FILENAME)
|
||||
print(f'Максимальная длина файла истории: {readline.get_history_length()}')
|
||||
print(f'История запуска:{get_history_items()}')
|
||||
while True:
|
||||
try:
|
||||
while True:
|
||||
line = input('!("stop" to quit) Ввод текста: => ')
|
||||
if line == 'stop':
|
||||
break
|
||||
if line:
|
||||
print(f'Добавление "{line}" в файл истории.')
|
||||
finally:
|
||||
print(f'Конец записи истории: {get_history_items()}')
|
||||
readline.write_history_file(HISTORY_FILENAME)
|
||||
|
||||
|
||||
# Регистрация класса 'HistoryCompleter'
|
||||
readline.set_completer(HistoryCompleter().complete)
|
||||
|
||||
# Регистрация клавиши `tab` для автодополнения
|
||||
readline.parse_and_bind('tab: complete')
|
||||
|
||||
# Запрос текста
|
||||
inputing()
|
||||
line = input('> ')
|
||||
except EOFError:
|
||||
break
|
||||
Reference in New Issue
Block a user