From 661c082c99710112884b88b6479876985260b342 Mon Sep 17 00:00:00 2001 From: Eliran Wong Date: Tue, 9 Jan 2024 20:46:52 +0000 Subject: [PATCH] v35.25; added fuzzy completer in terminal mode --- UniqueBibleAppVersion.txt | 2 +- file_manager.py | 4 ++-- latest_changes.txt | 3 +++ patches.txt | 16 ++++++++-------- util/LocalCliHandler.py | 16 ++++++++-------- util/TextEditorUtility.py | 10 +++++----- util/terminal_mode_dialogs.py | 4 ++-- util/terminal_system_command_prompt.py | 4 ++-- 8 files changed, 31 insertions(+), 28 deletions(-) diff --git a/UniqueBibleAppVersion.txt b/UniqueBibleAppVersion.txt index ae7d27cc8..7becae0d8 100755 --- a/UniqueBibleAppVersion.txt +++ b/UniqueBibleAppVersion.txt @@ -1 +1 @@ -35.25 +35.26 diff --git a/file_manager.py b/file_manager.py index deefc1a6f..9bb8d8976 100755 --- a/file_manager.py +++ b/file_manager.py @@ -1,7 +1,7 @@ import config, os, platform, subprocess from util.get_path_prompt import GetPath from prompt_toolkit.auto_suggest import AutoSuggestFromHistory -from prompt_toolkit.completion import WordCompleter +from prompt_toolkit.completion import WordCompleter, FuzzyCompleter from prompt_toolkit.application import run_in_terminal from prompt_toolkit.key_binding import KeyBindings from prompt_toolkit import PromptSession @@ -103,7 +103,7 @@ def _(_): indicator = "{0} {1} ".format(os.path.basename(os.getcwd()), "%") inputIndicator = [("class:indicator", indicator)] dirIndicator = "\\" if platform.system() == "Windows" else "/" - completer = WordCompleter(sorted(set(systemCommands + [f"{i}{dirIndicator}" if os.path.isdir(i) else i for i in os.listdir()]))) + completer = FuzzyCompleter(WordCompleter(sorted(set(systemCommands + [f"{i}{dirIndicator}" if os.path.isdir(i) else i for i in os.listdir()])))) auto_suggestion=AutoSuggestFromHistory() userInput = self.terminal_system_command_session.prompt(inputIndicator, style=self.promptStyle, key_bindings=this_key_bindings, auto_suggest=auto_suggestion, completer=completer).strip() #userInput = self.simplePrompt(inputIndicator=inputIndicator).strip() diff --git a/latest_changes.txt b/latest_changes.txt index 373b1ef05..484ec09af 100755 --- a/latest_changes.txt +++ b/latest_changes.txt @@ -1,3 +1,6 @@ +Changes in 35.25: +* added fuzzy completer in terminal mode + Changes in 35.25: * Add display word frequency menu plugin - https://github.com/eliranwong/UniqueBible/wiki/Display-Word-Frequency-Menu-Plugin diff --git a/patches.txt b/patches.txt index 1741c59de..8b47f9307 100755 --- a/patches.txt +++ b/patches.txt @@ -1213,7 +1213,6 @@ (33.07, "file", "util/get_path_prompt.py") (33.07, "file", "util/uba_command_prompt_key_bindings.py") (33.16, "file", "plugins/startup/customise_terminal_mode_commands.py") -(33.16, "file", "util/terminal_mode_dialogs.py") (33.20, "file", "util/PromptValidator.py") (33.25, "file", "util/LexicalData.py") (33.28, "file", ".gitignore") @@ -1290,7 +1289,6 @@ (33.93, "file", "htmlResources/material/action/task_alt/materialiconsoutlined/48dp/2x/outline_task_alt_black_48dp.png") (33.93, "folder", "plugins/menu/ToDo") (33.93, "file", "plugins/menu/ToDo/Readme.md") -(33.96, "file", "file_manager.txt") (33.96, "file", "gui/SimpleBrowser.py") (33.96, "file", "gui/WorkSpace.py") (33.96, "file", "gui/YouTubePopover.py") @@ -1353,19 +1351,16 @@ (35.06, "file", "plugins/menu/Bible Chat.py") (35.09, "file", "db/BiblesSqlite.py") (35.10, "file", "plugins/startup/highlightActiveVerse.py") -(35.10, "file", "util/terminal_system_command_prompt.py") (35.12, "file", "plugins/terminal/generate reference table from copied text.py") (35.12, "file", "plugins/terminal/generate reference table from latest content.py") (35.12, "file", "plugins/terminal/open html content with w3m.py") (35.13, "file", "util/CrossPlatform.py") -(35.13, "file", "util/TextEditorUtility.py") (35.16, "file", "util/VlcUtil.py") (35.19, "file", "startup/nonGui.py") (35.19, "file", "util/ConfigUtil.py") (35.20, "file", "util/TextUtil.py") (35.21, "file", "util/RemoteApiHandler.py") (35.22, "file", "util/RemoteCliHandler.py") -(35.22, "file", "util/LocalCliHandler.py") (35.23, "file", "util/checkup.py") (35.24, "file", "gui/MaterialMainWindow.py") (35.24, "file", "util/ShortcutUtil.py") @@ -1394,6 +1389,11 @@ (35.25, "file", "util/GitHubRepoInfo.py") (35.25, "file", "util/LanguageUtil.py") (35.25, "file", "util/TextCommandParser.py") -(35.25, "file", "patches.txt") -(35.25, "file", "latest_changes.txt") -(35.25, "file", "UniqueBibleAppVersion.txt") +(35.26, "file", "file_manager.txt") +(35.26, "file", "util/LocalCliHandler.py") +(35.26, "file", "util/terminal_mode_dialogs.py") +(35.26, "file", "util/terminal_system_command_prompt.py") +(35.26, "file", "util/TextEditorUtility.py") +(35.26, "file", "patches.txt") +(35.26, "file", "latest_changes.txt") +(35.26, "file", "UniqueBibleAppVersion.txt") diff --git a/util/LocalCliHandler.py b/util/LocalCliHandler.py index f70476331..b4d3e7c38 100644 --- a/util/LocalCliHandler.py +++ b/util/LocalCliHandler.py @@ -42,7 +42,7 @@ from prompt_toolkit.filters import Condition #from prompt_toolkit.application import run_in_terminal from prompt_toolkit.key_binding import KeyBindings, merge_key_bindings -from prompt_toolkit.completion import WordCompleter, NestedCompleter, ThreadedCompleter +from prompt_toolkit.completion import WordCompleter, NestedCompleter, ThreadedCompleter, FuzzyCompleter from prompt_toolkit.history import FileHistory from prompt_toolkit.styles import Style #from prompt_toolkit.auto_suggest import AutoSuggestFromHistory @@ -1088,9 +1088,9 @@ def getCommandCompleter(self): # Remove unexpected item suggestions.pop(":::", None) if config.terminalUseLighterCompleter: - completer = ThreadedCompleter(NestedCompleter.from_nested_dict(suggestions)) + completer = FuzzyCompleter(ThreadedCompleter(NestedCompleter.from_nested_dict(suggestions))) else: - completer = ThreadedCompleter(NestedCompleter.from_nested_dict(suggestions)) + completer = FuzzyCompleter(ThreadedCompleter(NestedCompleter.from_nested_dict(suggestions))) return completer def getTextCommandSuggestion(self, addDotCommandWordOnly=True): @@ -2065,7 +2065,7 @@ def searchablePrompt(self, inputIndicator="", multiline=False, default="", accep if not inputIndicator: inputIndicator = self.inputIndicator if completer is None and options: - completer = WordCompleter(options, ignore_case=True) + completer = FuzzyCompleter(WordCompleter(options, ignore_case=True)) if validator is None and numberOnly: validator=NumberValidator() result = inputPrompt( @@ -2100,7 +2100,7 @@ def getBibleVersion(self, defaultText=""): def getBibleVersions(self): self.print("(empty entry to select from a list)") - completer = WordCompleter(self.crossPlatform.textList, ignore_case=True) + completer = FuzzyCompleter(WordCompleter(self.crossPlatform.textList, ignore_case=True)) userInput = self.simplePrompt(default="_".join(config.compareParallelList), completer=completer, promptSession=self.terminal_multiple_bible_selection_session).strip() userInput = userInput.replace(" ", "") if not userInput: @@ -2112,7 +2112,7 @@ def getBibleVersions(self): def getStrongBibleVersions(self): self.print("(empty entry to select from a list)") - completer = WordCompleter(self.crossPlatform.strongBibles, ignore_case=True) + completer = FuzzyCompleter(WordCompleter(self.crossPlatform.strongBibles, ignore_case=True)) userInput = self.simplePrompt(default=config.concordance, completer=completer, promptSession=self.terminal_concordance_selection_session).strip() userInput = userInput.replace(" ", "") if not userInput: @@ -2124,7 +2124,7 @@ def getStrongBibleVersions(self): def getBibleBookRange(self, options=["ALL"], default_values=["ALL"]): self.print("(empty entry to select from a list)") - completer = WordCompleter(options, ignore_case=True) + completer = FuzzyCompleter(WordCompleter(options, ignore_case=True)) userInput = self.simplePrompt(default="ALL", completer=completer, promptSession=self.terminal_search_bible_book_range_session).strip() userInput = userInput.replace(" ", "") if not userInput: @@ -2510,7 +2510,7 @@ def startChat(): self.conversationStarted = False startChat() multilineInput = False - completer = WordCompleter(config.inputSuggestions, ignore_case=True) if config.inputSuggestions else None + completer = FuzzyCompleter(WordCompleter(config.inputSuggestions, ignore_case=True)) if config.inputSuggestions else None features = ( ".new", ".singleLineInput", diff --git a/util/TextEditorUtility.py b/util/TextEditorUtility.py index f8d5d2a08..b379aecc2 100755 --- a/util/TextEditorUtility.py +++ b/util/TextEditorUtility.py @@ -10,7 +10,7 @@ from util.VlcUtil import VlcUtil from install.module import * from prompt_toolkit.auto_suggest import AutoSuggestFromHistory -from prompt_toolkit.completion import WordCompleter +from prompt_toolkit.completion import WordCompleter, FuzzyCompleter from prompt_toolkit.application import run_in_terminal from prompt_toolkit.key_binding import KeyBindings from prompt_toolkit import prompt @@ -335,7 +335,7 @@ def googleTranslate(self, runOnSelectedText=True, defaultText=""): print("Translate from:") print("(enter a language code)") suggestions = codes - completer = WordCompleter(suggestions, ignore_case=True) + completer = FuzzyCompleter(WordCompleter(suggestions, ignore_case=True)) userInput = self.terminal_google_translate_from_language_session.prompt(self.inputIndicator, style=self.promptStyle, completer=completer).strip() if not userInput or userInput.lower() == config.terminal_cancel_action: return self.cancelAction() @@ -347,7 +347,7 @@ def googleTranslate(self, runOnSelectedText=True, defaultText=""): print("Translate to:") print("(enter a language code)") suggestions = codes - completer = WordCompleter(suggestions, ignore_case=True) + completer = FuzzyCompleter(WordCompleter(suggestions, ignore_case=True)) userInput = self.terminal_google_translate_to_language_session.prompt(self.inputIndicator, style=self.promptStyle, completer=completer).strip() if not userInput or userInput.lower() == config.terminal_cancel_action: return self.cancelAction() @@ -426,7 +426,7 @@ def tts(self, runOnSelectedText=True, defaultText=""): print("Enter a language code:") suggestions = shortCodes + codes suggestions = list(set(suggestions)) - completer = WordCompleter(suggestions, ignore_case=True) + completer = FuzzyCompleter(WordCompleter(suggestions, ignore_case=True)) default = config.ttsDefaultLangauge if config.ttsDefaultLangauge in suggestions else "" userInput = self.terminal_tts_language_session.prompt(self.inputIndicator, style=self.promptStyle, completer=completer, default=default).strip() if not userInput or userInput.lower() == config.terminal_cancel_action: @@ -665,7 +665,7 @@ def _(_): indicator = "{0} {1} ".format(os.path.basename(os.getcwd()), "%") inputIndicator = [("class:indicator", indicator)] dirIndicator = "\\" if platform.system() == "Windows" else "/" - completer = WordCompleter(sorted(set(systemCommands + [f"{i}{dirIndicator}" if os.path.isdir(i) else i for i in os.listdir()]))) + completer = FuzzyCompleter(WordCompleter(sorted(set(systemCommands + [f"{i}{dirIndicator}" if os.path.isdir(i) else i for i in os.listdir()])))) auto_suggestion=AutoSuggestFromHistory() userInput = self.terminal_system_command_session.prompt(inputIndicator, style=self.promptStyle, key_bindings=this_key_bindings, auto_suggest=auto_suggestion, completer=completer).strip() if userInput and not userInput == config.terminal_cancel_action: diff --git a/util/terminal_mode_dialogs.py b/util/terminal_mode_dialogs.py index 3360f47c9..ab9eb78e6 100644 --- a/util/terminal_mode_dialogs.py +++ b/util/terminal_mode_dialogs.py @@ -2,7 +2,7 @@ from prompt_toolkit.formatted_text import HTML from prompt_toolkit.styles import Style from prompt_toolkit.shortcuts import input_dialog, radiolist_dialog, checkboxlist_dialog, message_dialog -from prompt_toolkit.completion import WordCompleter +from prompt_toolkit.completion import WordCompleter, FuzzyCompleter from util.PromptValidator import NumberValidator from db.BiblesSqlite import Bible from db.ToolsSqlite import Book @@ -46,7 +46,7 @@ def __init__(self, parent) -> None: # a wrapper to standard input_dialog; open radiolist_dialog showing available options when user input is not a valid option. def searchableInput(self, title="Text Entry", text="Enter / Search:", default="", completer=None, options=[], descriptions=[], validator=None, numberOnly=False, password=False, ok_text="OK", cancel_text="Cancel"): if completer is None and options: - completer = WordCompleter(options, ignore_case=True) + completer = FuzzyCompleter(WordCompleter(options, ignore_case=True)) if validator is None and numberOnly: validator=NumberValidator() result = input_dialog( diff --git a/util/terminal_system_command_prompt.py b/util/terminal_system_command_prompt.py index 8d8a2a9e1..1e7534820 100755 --- a/util/terminal_system_command_prompt.py +++ b/util/terminal_system_command_prompt.py @@ -3,7 +3,7 @@ from util.prompt_shared_key_bindings import prompt_shared_key_bindings from prompt_toolkit.application import run_in_terminal from prompt_toolkit.key_binding import KeyBindings, merge_key_bindings -from prompt_toolkit.completion import WordCompleter +from prompt_toolkit.completion import WordCompleter, FuzzyCompleter from prompt_toolkit.auto_suggest import AutoSuggestFromHistory from prompt_toolkit.filters import Condition from prompt_toolkit.styles import Style @@ -100,7 +100,7 @@ def _(event): indicator = "{0} {1} ".format(os.path.basename(os.getcwd()), "%") inputIndicator = [("class:indicator", indicator)] dirIndicator = "\\" if platform.system() == "Windows" else "/" - completer = WordCompleter(sorted(set(systemCommands + [f"{i}{dirIndicator}" if os.path.isdir(i) else i for i in os.listdir()]))) + completer = FuzzyCompleter(WordCompleter(sorted(set(systemCommands + [f"{i}{dirIndicator}" if os.path.isdir(i) else i for i in os.listdir()])))) auto_suggestion=AutoSuggestFromHistory() userInput = self.terminal_system_command_session.prompt(inputIndicator, swap_light_and_dark_colors=Condition(lambda: not config.terminalResourceLinkColor.startswith("ansibright")), style=self.promptStyle, key_bindings=this_key_bindings, auto_suggest=auto_suggestion, completer=completer, bottom_toolbar=self.getToolBar(), default=self.systemCommandPromptEntry).strip() if self.addPath: