Added a Typing Completer and an associated configuration page. eric7 release-10.3.0

Sat, 09 Sep 2023 17:43:15 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 09 Sep 2023 17:43:15 +0200
branch
eric7
changeset 59
fb361b396c68
parent 58
610af455ef9a
child 60
8056bdc6526e

Added a Typing Completer and an associated configuration page.

ChangeLog file | annotate | diff | comparison | revisions
PKGLIST file | annotate | diff | comparison | revisions
PluginKivy.epj file | annotate | diff | comparison | revisions
PluginProjectKivy.py file | annotate | diff | comparison | revisions
PluginProjectKivy.zip file | annotate | diff | comparison | revisions
ProjectKivy/CompleterKivy.py file | annotate | diff | comparison | revisions
ProjectKivy/CompleterKivyConfigWidget.py file | annotate | diff | comparison | revisions
ProjectKivy/CompleterKivyConfigWidget.ui file | annotate | diff | comparison | revisions
ProjectKivy/Documentation/source/Plugin_Project_Kivy.PluginProjectKivy.html file | annotate | diff | comparison | revisions
ProjectKivy/Documentation/source/Plugin_Project_Kivy.ProjectKivy.CompleterKivy.html file | annotate | diff | comparison | revisions
ProjectKivy/Documentation/source/Plugin_Project_Kivy.ProjectKivy.CompleterKivyConfigWidget.html file | annotate | diff | comparison | revisions
ProjectKivy/Documentation/source/index-Plugin_Project_Kivy.ProjectKivy.html file | annotate | diff | comparison | revisions
ProjectKivy/i18n/kivy_de.qm file | annotate | diff | comparison | revisions
ProjectKivy/i18n/kivy_de.ts file | annotate | diff | comparison | revisions
ProjectKivy/i18n/kivy_en.ts file | annotate | diff | comparison | revisions
ProjectKivy/i18n/kivy_es.ts file | annotate | diff | comparison | revisions
ProjectKivy/i18n/kivy_ru.ts file | annotate | diff | comparison | revisions
diff -r 610af455ef9a -r fb361b396c68 ChangeLog
--- a/ChangeLog	Sat Dec 31 16:27:50 2022 +0100
+++ b/ChangeLog	Sat Sep 09 17:43:15 2023 +0200
@@ -1,5 +1,9 @@
 ChangeLog
 ---------
+Version 10.3.0:
+- bug fix
+- added a Typing Completer and an associated configuration page
+
 Version 10.2.1:
 - bug fix
 
diff -r 610af455ef9a -r fb361b396c68 PKGLIST
--- a/PKGLIST	Sat Dec 31 16:27:50 2022 +0100
+++ b/PKGLIST	Sat Sep 09 17:43:15 2023 +0200
@@ -1,6 +1,9 @@
 PluginProjectKivy.py
 ProjectKivy/APIs/kivy.api
 ProjectKivy/APIs/kivy.bas
+ProjectKivy/CompleterKivy.py
+ProjectKivy/CompleterKivyConfigWidget.py
+ProjectKivy/CompleterKivyConfigWidget.ui
 ProjectKivy/Documentation/LICENSE.GPL
 ProjectKivy/KivyLexer.py
 ProjectKivy/__init__.py
diff -r 610af455ef9a -r fb361b396c68 PluginKivy.epj
--- a/PluginKivy.epj	Sat Dec 31 16:27:50 2022 +0100
+++ b/PluginKivy.epj	Sat Sep 09 17:43:15 2023 +0200
@@ -1,7 +1,7 @@
 {
   "header": {
     "comment": "eric project file for project PluginKivy",
-    "copyright": "Copyright (C) 2022 Detlev Offenbach, detlev@die-offenbachs.de"
+    "copyright": "Copyright (C) 2023 Detlev Offenbach, detlev@die-offenbachs.de"
   },
   "project": {
     "AUTHOR": "Detlev Offenbach",
@@ -11,10 +11,14 @@
           "AllowStarArgAny": false,
           "AllowUntypedDefs": false,
           "AllowUntypedNested": false,
+          "CheckFutureAnnotations": false,
           "DispatchDecorators": [
             "singledispatch",
             "singledispatchmethod"
           ],
+          "ExemptedTypingSymbols": [
+            ""
+          ],
           "ForceFutureAnnotations": false,
           "MaximumComplexity": 3,
           "MaximumLength": 7,
@@ -62,7 +66,7 @@
         "CopyrightAuthor": "",
         "CopyrightMinFileSize": 0,
         "DocstringType": "eric_black",
-        "EnabledCheckerCategories": "C, D, E, M, N, S, Y, W",
+        "EnabledCheckerCategories": "C, D, E, I, M, NO, N, S, Y, U, W",
         "ExcludeFiles": "*/Ui_*.py, */*_rc.py,",
         "ExcludeMessages": "C101,E265,E266,E305,E402,M201,M301,M302,M303,M304,M305,M306,M307,M308,M311,M312,M313,M314,M315,M321,M701,M702,M811,M834,N802,N803,N807,N808,N821,W293,W503,Y401,Y402",
         "FixCodes": "",
@@ -70,7 +74,10 @@
         "FutureChecker": "",
         "HangClosing": false,
         "ImportsChecker": {
-          "ApplicationPackageNames": [],
+          "ApplicationPackageNames": [
+            "ProjectKivy",
+            "eric7"
+          ],
           "BanRelativeImports": "",
           "BannedModules": []
         },
@@ -80,6 +87,17 @@
         "MaxCodeComplexity": 10,
         "MaxDocLineLength": 88,
         "MaxLineLength": 88,
+        "NameOrderChecker": {
+          "ApplicationPackageNames": [
+            "ProjectKivy",
+            "eric7"
+          ],
+          "CombinedAsImports": false,
+          "SortCaseSensitive": false,
+          "SortFromFirst": false,
+          "SortIgnoringStyle": false,
+          "SortOrder": "natural"
+        },
         "NoFixCodes": "E501",
         "RepeatMessages": true,
         "SecurityChecker": {
@@ -113,6 +131,19 @@
           "WeakKeySizeRsaMedium": "2048"
         },
         "ShowIgnored": false,
+        "UnusedChecker": {
+          "IgnoreAbstract": true,
+          "IgnoreDunderGlobals": true,
+          "IgnoreDunderMethods": true,
+          "IgnoreEventHandlerMethods": true,
+          "IgnoreLambdas": false,
+          "IgnoreNestedFunctions": false,
+          "IgnoreOverload": true,
+          "IgnoreOverride": true,
+          "IgnoreSlotMethods": true,
+          "IgnoreStubs": true,
+          "IgnoreVariadicNames": false
+        },
         "ValidEncodings": "latin-1, utf-8"
       }
     },
@@ -131,6 +162,7 @@
         ],
         "outputDirectory": "ProjectKivy/Documentation/source",
         "qtHelpEnabled": false,
+        "startDirectory": "",
         "useRecursion": true
       }
     },
@@ -141,7 +173,6 @@
       "*.epj": "OTHERS",
       "*.idl": "INTERFACES",
       "*.md": "OTHERS",
-      "*.proto": "PROTOCOLS",
       "*.py": "SOURCES",
       "*.py3": "SOURCES",
       "*.pyw": "SOURCES",
@@ -155,10 +186,12 @@
       "Makefile": "OTHERS",
       "README": "OTHERS",
       "README.*": "OTHERS",
-      "Ui_*.py": "SOURCES",
+      "Ui_*.py": "__IGNORE__",
       "makefile": "OTHERS"
     },
-    "FORMS": [],
+    "FORMS": [
+      "ProjectKivy/CompleterKivyConfigWidget.ui"
+    ],
     "HASH": "edc66a361a68c8b839b94476f35c5809077c7a5d",
     "IDLPARAMS": {
       "DefinedNames": [],
@@ -192,7 +225,7 @@
     ],
     "OTHERTOOLSPARMS": {
       "Black": {
-        "exclude": "/(\\.direnv|\\.eggs|\\.git|\\.hg|\\.mypy_cache|\\.nox|\\.tox|\\.venv|venv|\\.svn|\\.ipynb_checkpoints|_build|buck-out|build|dist|__pypackages__)/",
+        "exclude": "/(\\.direnv|\\.eggs|\\.git|\\.hg|\\.ipynb_checkpoints|\\.mypy_cache|\\.nox|\\.pytest_cache|\\.ruff_cache|\\.tox|\\.svn|\\.venv|\\.vscode|__pypackages__|_build|buck-out|build|dist|venv)/",
         "extend-exclude": "",
         "force-exclude": "",
         "line-length": 88,
@@ -200,6 +233,7 @@
         "skip-string-normalization": false,
         "source": "project",
         "target-version": [
+          "py312",
           "py311",
           "py310",
           "py39",
@@ -239,10 +273,13 @@
     "RESOURCES": [],
     "SOURCES": [
       "PluginProjectKivy.py",
+      "ProjectKivy/CompleterKivy.py",
+      "ProjectKivy/CompleterKivyConfigWidget.py",
       "ProjectKivy/KivyLexer.py",
       "ProjectKivy/__init__.py",
       "__init__.py"
     ],
+    "SOURCESDIR": "",
     "SPELLEXCLUDES": "",
     "SPELLLANGUAGE": "en_US",
     "SPELLWORDS": "",
diff -r 610af455ef9a -r fb361b396c68 PluginProjectKivy.py
--- a/PluginProjectKivy.py	Sat Dec 31 16:27:50 2022 +0100
+++ b/PluginProjectKivy.py	Sat Sep 09 17:43:15 2023 +0200
@@ -7,6 +7,7 @@
 Module implementing the Kivy project plug-in.
 """
 
+import contextlib
 import fnmatch
 import glob
 import os
@@ -16,13 +17,14 @@
 
 from eric7 import Preferences
 from eric7.EricWidgets.EricApplication import ericApp
+from eric7.QScintilla import Lexers, TypingCompleters
 
 # Start-of-Header
 name = "Kivy Project Plugin"
 author = "Detlev Offenbach <detlev@die-offenbachs.de>"
 autoactivate = True
 deactivateable = True
-version = "10.2.1"
+version = "10.3.0"
 className = "ProjectKivyPlugin"
 packageName = "ProjectKivy"
 shortDescription = "Project support for Kivy projects."
@@ -50,11 +52,20 @@
         return []
 
 
+def prepareUninstall():
+    """
+    Module function to prepare for an uninstallation.
+    """
+    Preferences.Prefs.settings.remove(ProjectKivyPlugin.PreferencesKey)
+
+
 class ProjectKivyPlugin(QObject):
     """
     Class implementing the Kivy project plugin.
     """
 
+    PreferencesKey = "Kivy"
+
     lexerAssociations = {
         "*.kv": "Pygments|Kivy",
         "*.kivy": "Pygments|Kivy",
@@ -80,6 +91,17 @@
         self.__ui = ui
         self.__initialize()
 
+        self.__typingDefaults = {
+            "EnabledTypingAids": True,
+            "InsertClosingBrace": True,
+            "SkipBrace": True,
+            "InsertQuote": True,
+            "AutoIndentation": True,
+            "ColonDetection": True,
+            "InsertBlankColon": True,
+            "InsertBlankComma": True,
+        }
+
         self.__translator = None
         self.__loadTranslator()
 
@@ -96,8 +118,6 @@
         @return tuple of None and activation status
         @rtype bool
         """
-        from eric7.QScintilla import Lexers
-
         self.__ericProject.registerProjectType(
             "Kivy",
             self.tr("Kivy"),
@@ -108,7 +128,7 @@
 
         try:
             # backward compatibility for eric7 < 22.12
-            from eric7.Project.ProjectBrowser import (
+            from eric7.Project.ProjectBrowser import (  # noqa: I101
                 FormsBrowserFlag,
                 OthersBrowserFlag,
                 SourcesBrowserFlag,
@@ -139,15 +159,25 @@
             ["*.kv", "*.kivy"],
         )
 
+        with contextlib.suppress(AttributeError):
+            # Typing Completer (eric7 > 23.9)
+            TypingCompleters.registerCompleter(
+                language="Pygments|Kivy",
+                createCompleterFunction=self.createTypingCompleter,
+                createConfigPageFunction=self.createTypingCompleterConfigWidget,
+            )
+
         return None, True
 
     def deactivate(self):
         """
         Public method to deactivate this plugin.
         """
-        from eric7.QScintilla import Lexers
+        self.__ericProject.unregisterProjectType("Kivy")
 
-        self.__ericProject.unregisterProjectType("Kivy")
+        with contextlib.suppress(AttributeError):
+            # Typing Completer (eric7 > 23.9)
+            TypingCompleters.unregisterTypingCompleter("Pygments|Kivy")
 
         Lexers.unregisterLexer("Pygments|Kivy")
         if self.KivyLexerKey in LEXERS:
@@ -228,6 +258,61 @@
         else:
             return None
 
+    def getTypingPreferences(self, key):
+        """
+        Public method to retrieve the typing completer settings.
+
+        @param key the key of the value to get
+        @type str
+        @return value of the requested setting
+        @rtype Any
+        """
+        return Preferences.toBool(
+            Preferences.Prefs.settings.value(
+                f"{self.PreferencesKey}/Typing/{key}", self.__typingDefaults[key]
+            )
+        )
+
+    def setTypingPreferences(self, key, value):
+        """
+        Public method to store the typing completer settings.
+
+        @param key the key of the setting to be set
+        @type str
+        @param value value to be set
+        @type Any
+        """
+        Preferences.Prefs.settings.setValue(
+            f"{self.PreferencesKey}/Typing/{key}", value
+        )
+
+    def createTypingCompleter(self, editor, parent=None):
+        """
+        Public method to create a typing completer object for the given editor.
+
+        @param editor reference to the editor object
+        @type Editor
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        @return reference to the instantiated typing completer object
+        @rtype CompleterKivy
+        """
+        from ProjectKivy.CompleterKivy import CompleterKivy
+
+        return CompleterKivy(self, editor, parent)
+
+    def createTypingCompleterConfigWidget(self):
+        """
+        Public method to create and populate the typing completer configuration widget.
+
+        @return instantiated and populated configuration widget
+        @rtype CompleterKivyConfigWidget
+        """
+        from ProjectKivy.CompleterKivyConfigWidget import CompleterKivyConfigWidget
+
+        widget = CompleterKivyConfigWidget(self)
+        return widget
+
 
 #
-# eflag: noqa = M801, M811
+# eflag: noqa = M801, M811, U200
diff -r 610af455ef9a -r fb361b396c68 PluginProjectKivy.zip
Binary file PluginProjectKivy.zip has changed
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/CompleterKivy.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProjectKivy/CompleterKivy.py	Sat Sep 09 17:43:15 2023 +0200
@@ -0,0 +1,179 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the Kivy typing completer.
+"""
+
+import re
+
+from PyQt6.Qsci import QsciScintilla
+
+from eric7.QScintilla.TypingCompleters.CompleterBase import CompleterBase
+
+
+class CompleterKivy(CompleterBase):
+    """
+    Class implementing the Kivy typing completer.
+    """
+
+    def __init__(self, plugin, editor, parent=None):
+        """
+        Constructor
+
+        @param plugin reference to the plugin object
+        @type ProjectKivyPlugin
+        @param editor reference to the editor object
+        @type Editor
+        @param parent reference to the parent object
+        @type QObject
+        """
+        super().__init__(editor, parent)
+
+        self.__plugin = plugin
+
+        self.__autoIndentationRe = re.compile(r"(?:\(|\[|{|:)(\s*)\r?\n")
+
+        self.readSettings()
+
+    def readSettings(self):
+        """
+        Public slot called to reread the configuration parameters.
+        """
+        self.setEnabled(self.__plugin.getTypingPreferences("EnabledTypingAids"))
+        self.__insertClosingBrace = self.__plugin.getTypingPreferences(
+            "InsertClosingBrace"
+        )
+        self.__skipBrace = self.__plugin.getTypingPreferences("SkipBrace")
+        self.__colonDetection = self.__plugin.getTypingPreferences("ColonDetection")
+        self.__autoIndentation = self.__plugin.getTypingPreferences("AutoIndentation")
+        self.__insertQuote = self.__plugin.getTypingPreferences("InsertQuote")
+        self.__insertBlankColon = self.__plugin.getTypingPreferences("InsertBlankColon")
+        self.__insertBlankComma = self.__plugin.getTypingPreferences("InsertBlankComma")
+
+    def charAdded(self, charNumber):
+        """
+        Public slot called to handle the user entering a character.
+
+        @param charNumber value of the character entered
+        @type int
+        """
+        char = chr(charNumber)
+        if char not in (
+            "{",
+            "}",
+            "[",
+            "]",
+            "(",
+            ")",
+            "<",
+            ">",
+            "'",
+            '"',
+            ":",
+            ",",
+            "\n",
+        ):
+            return  # take the short route
+
+        line, col = self.editor.getCursorPosition()
+
+        if self.__inComment(line, col):
+            return
+
+        # open parenthesis
+        # insert closing parenthesis
+        if char == "(" and self.__insertClosingBrace:
+            self.editor.insert(")")
+
+        # open curly bracket
+        # insert closing bracket
+        elif char == "{" and self.__insertClosingBrace:
+            self.editor.insert("}")
+
+        # open bracket
+        # insert closing bracket
+        elif char == "[" and self.__insertClosingBrace:
+            self.editor.insert("]")
+
+        # open tag bracket
+        # insert closing bracket
+        elif char == "<" and self.__insertClosingBrace:
+            self.editor.insert(">")
+
+        # closing parenthesis
+        # skip matching closing parenthesis
+        elif char in (")", "}", "]", ">"):
+            txt = self.editor.text(line)
+            if col < len(txt) and char == txt[col] and self.__skipBrace:
+                self.editor.setSelection(line, col, line, col + 1)
+                self.editor.removeSelectedText()
+
+        # colon
+        # 1. skip colon if not last character
+        # 2. insert blank if last character
+        elif char == ":":
+            text = self.editor.text(line)
+            if col < len(text) and char == text[col]:
+                if self.__colonDetection:
+                    self.editor.setSelection(line, col, line, col + 1)
+                    self.editor.removeSelectedText()
+            elif self.__insertBlankColon and col == len(text.rstrip()):
+                self.editor.insert(" ")
+                self.editor.setCursorPosition(line, col + 1)
+
+        # comma
+        # insert blank
+        elif char == "," and self.__insertBlankComma:
+            self.editor.insert(" ")
+            self.editor.setCursorPosition(line, col + 1)
+
+        # double quote
+        # insert double quote
+        elif char == '"' and self.__insertQuote:
+            self.editor.insert('"')
+
+        # quote
+        # insert quote
+        elif char == "'" and self.__insertQuote:
+            self.editor.insert("'")
+
+        # new line
+        # indent after line ending with ':'
+        elif char == "\n" and self.__autoIndentation:
+            txt = self.editor.text(line - 1)
+            match = self.__autoIndentationRe.search(txt)
+            if match is not None:
+                startBlanks = match.start(1)
+                endBlanks = match.end(1)
+                if startBlanks != -1 and startBlanks != endBlanks:
+                    # previous line ends with whitespace, e.g. caused by
+                    # blank insertion above
+                    self.editor.setSelection(line - 1, startBlanks, line - 1, endBlanks)
+                    self.editor.removeSelectedText()
+
+                self.editor.indent(line)
+                self.editor.setCursorPosition(line, 0)
+                self.editor.editorCommand(QsciScintilla.SCI_VCHOME)
+
+    def __inComment(self, line, col):
+        """
+        Private method to check, if the cursor is inside a comment.
+
+        @param line current line
+        @type int
+        @param col current position within line
+        @type int
+        @return flag indicating, if the cursor is inside a comment
+        @rtype bool
+        """
+        txt = self.editor.text(line)
+        if col == len(txt):
+            col -= 1
+        while col >= 0:
+            if txt[col] == "#":
+                return True
+            col -= 1
+        return False
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/CompleterKivyConfigWidget.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProjectKivy/CompleterKivyConfigWidget.py	Sat Sep 09 17:43:15 2023 +0200
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the configuration widget for the Kivy typing completer.
+"""
+
+from PyQt6.QtWidgets import QWidget
+
+from .Ui_CompleterKivyConfigWidget import Ui_CompleterKivyConfigWidget
+
+
+class CompleterKivyConfigWidget(QWidget, Ui_CompleterKivyConfigWidget):
+    """
+    Class documentation goes here.
+    """
+
+    def __init__(self, plugin, parent=None):
+        """
+        Constructor
+
+        @param plugin reference to the plugin object
+        @type ProjectKivyPlugin
+        @param parent reference to the parent widget (defaults to None)
+        @type QWidget (optional)
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+
+        self.__plugin = plugin
+
+        # set initial values
+        self.kivyGroup.setChecked(
+            self.__plugin.getTypingPreferences("EnabledTypingAids")
+        )
+        self.kivyInsertClosingBraceCheckBox.setChecked(
+            self.__plugin.getTypingPreferences("InsertClosingBrace")
+        )
+        self.kivySkipBraceCheckBox.setChecked(
+            self.__plugin.getTypingPreferences("SkipBrace")
+        )
+        self.kivyColonDetectionCheckBox.setChecked(
+            self.__plugin.getTypingPreferences("ColonDetection")
+        )
+        self.kivyAutoIndentationCheckBox.setChecked(
+            self.__plugin.getTypingPreferences("AutoIndentation")
+        )
+        self.kivyInsertQuoteCheckBox.setChecked(
+            self.__plugin.getTypingPreferences("InsertQuote")
+        )
+        self.kivyInsertBlankColonCheckBox.setChecked(
+            self.__plugin.getTypingPreferences("InsertBlankColon")
+        )
+        self.kivyInsertBlankCommaCheckBox.setChecked(
+            self.__plugin.getTypingPreferences("InsertBlankComma")
+        )
+
+    def save(self):
+        """
+        Public method to save the Kivy Typing Completer configuration.
+        """
+        self.__plugin.setTypingPreferences(
+            "EnabledTypingAids", self.kivyGroup.isChecked()
+        )
+        self.__plugin.setTypingPreferences(
+            "InsertClosingBrace", self.kivyInsertClosingBraceCheckBox.isChecked()
+        )
+        self.__plugin.setTypingPreferences(
+            "SkipBrace", self.kivySkipBraceCheckBox.isChecked()
+        )
+        self.__plugin.setTypingPreferences(
+            "ColonDetection", self.kivyColonDetectionCheckBox.isChecked()
+        )
+        self.__plugin.setTypingPreferences(
+            "AutoIndentation", self.kivyAutoIndentationCheckBox.isChecked()
+        )
+        self.__plugin.setTypingPreferences(
+            "InsertQuote", self.kivyInsertQuoteCheckBox.isChecked()
+        )
+        self.__plugin.setTypingPreferences(
+            "InsertBlankColon", self.kivyInsertBlankColonCheckBox.isChecked()
+        )
+        self.__plugin.setTypingPreferences(
+            "InsertBlankComma", self.kivyInsertBlankCommaCheckBox.isChecked()
+        )
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/CompleterKivyConfigWidget.ui
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProjectKivy/CompleterKivyConfigWidget.ui	Sat Sep 09 17:43:15 2023 +0200
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>CompleterKivyConfigWidget</class>
+ <widget class="QWidget" name="CompleterKivyConfigWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>528</width>
+    <height>426</height>
+   </rect>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QGroupBox" name="kivyGroup">
+     <property name="focusPolicy">
+      <enum>Qt::TabFocus</enum>
+     </property>
+     <property name="toolTip">
+      <string>Select to enable Kivy typing aids</string>
+     </property>
+     <property name="title">
+      <string>Enable Kivy typing aids</string>
+     </property>
+     <property name="checkable">
+      <bool>true</bool>
+     </property>
+     <property name="checked">
+      <bool>true</bool>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_4">
+      <item>
+       <widget class="QCheckBox" name="kivyInsertClosingBraceCheckBox">
+        <property name="toolTip">
+         <string>Select to insert a closing parenthesis</string>
+        </property>
+        <property name="text">
+         <string>Automatic parenthesis insertion</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="_2">
+        <item>
+         <spacer>
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeType">
+           <enum>QSizePolicy::Fixed</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>20</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QCheckBox" name="kivySkipBraceCheckBox">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="toolTip">
+           <string>Select to skip matching braces when typing</string>
+          </property>
+          <property name="text">
+           <string>Automatically skip matching braces when typing</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <spacer>
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>131</width>
+            <height>21</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+       </layout>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="kivyColonDetectionCheckBox">
+        <property name="toolTip">
+         <string>Select to skip a ':', if typed next to another ':'</string>
+        </property>
+        <property name="text">
+         <string>Automatic colon detection</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="kivyAutoIndentationCheckBox">
+        <property name="toolTip">
+         <string>Select to indent after typing 'return'</string>
+        </property>
+        <property name="text">
+         <string>Automatic indent after '(', '{', '[' and ':'</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="kivyInsertQuoteCheckBox">
+        <property name="toolTip">
+         <string>Select to insert the matching quote character</string>
+        </property>
+        <property name="text">
+         <string>Automatic quote insertion</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="kivyInsertBlankColonCheckBox">
+        <property name="toolTip">
+         <string>Select to insert a blank after ':'</string>
+        </property>
+        <property name="text">
+         <string>Automatic insertion of ' ' (blank) after ':'</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="kivyInsertBlankCommaCheckBox">
+        <property name="toolTip">
+         <string>Select to insert a blank after ','</string>
+        </property>
+        <property name="text">
+         <string>Automatic insertion of ' ' (blank) after ','</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <tabstops>
+  <tabstop>kivyGroup</tabstop>
+  <tabstop>kivyInsertClosingBraceCheckBox</tabstop>
+  <tabstop>kivySkipBraceCheckBox</tabstop>
+  <tabstop>kivyColonDetectionCheckBox</tabstop>
+  <tabstop>kivyAutoIndentationCheckBox</tabstop>
+  <tabstop>kivyInsertQuoteCheckBox</tabstop>
+  <tabstop>kivyInsertBlankColonCheckBox</tabstop>
+  <tabstop>kivyInsertBlankCommaCheckBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>kivyInsertClosingBraceCheckBox</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>kivySkipBraceCheckBox</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>133</x>
+     <y>52</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>143</x>
+     <y>79</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/Documentation/source/Plugin_Project_Kivy.PluginProjectKivy.html
--- a/ProjectKivy/Documentation/source/Plugin_Project_Kivy.PluginProjectKivy.html	Sat Dec 31 16:27:50 2022 +0100
+++ b/ProjectKivy/Documentation/source/Plugin_Project_Kivy.PluginProjectKivy.html	Sat Sep 09 17:43:15 2023 +0200
@@ -33,6 +33,10 @@
 <td><a href="#apiFiles">apiFiles</a></td>
 <td>Module function to return the API files made available by this plugin.</td>
 </tr>
+<tr>
+<td><a href="#prepareUninstall">prepareUninstall</a></td>
+<td>Module function to prepare for an uninstallation.</td>
+</tr>
 </table>
 <hr />
 <hr />
@@ -47,7 +51,7 @@
 <h3>Class Attributes</h3>
 
 <table>
-<tr><td>KivyLexerEntry</td></tr><tr><td>KivyLexerKey</td></tr><tr><td>lexerAssociations</td></tr>
+<tr><td>KivyLexerEntry</td></tr><tr><td>KivyLexerKey</td></tr><tr><td>PreferencesKey</td></tr><tr><td>lexerAssociations</td></tr>
 </table>
 <h3>Class Methods</h3>
 
@@ -75,6 +79,14 @@
 <td>Public method to activate this plugin.</td>
 </tr>
 <tr>
+<td><a href="#ProjectKivyPlugin.createTypingCompleter">createTypingCompleter</a></td>
+<td>Public method to create a typing completer object for the given editor.</td>
+</tr>
+<tr>
+<td><a href="#ProjectKivyPlugin.createTypingCompleterConfigWidget">createTypingCompleterConfigWidget</a></td>
+<td>Public method to create and populate the typing completer configuration widget.</td>
+</tr>
+<tr>
 <td><a href="#ProjectKivyPlugin.deactivate">deactivate</a></td>
 <td>Public method to deactivate this plugin.</td>
 </tr>
@@ -87,9 +99,17 @@
 <td>Public method to instantiate a Pygments Kivy lexer object.</td>
 </tr>
 <tr>
+<td><a href="#ProjectKivyPlugin.getTypingPreferences">getTypingPreferences</a></td>
+<td>Public method to retrieve the typing completer settings.</td>
+</tr>
+<tr>
 <td><a href="#ProjectKivyPlugin.lexerAssociationCallback">lexerAssociationCallback</a></td>
 <td>Public method to get the lexer association of the Kivy project type for a file.</td>
 </tr>
+<tr>
+<td><a href="#ProjectKivyPlugin.setTypingPreferences">setTypingPreferences</a></td>
+<td>Public method to store the typing completer settings.</td>
+</tr>
 </table>
 <h3>Static Methods</h3>
 
@@ -144,6 +164,55 @@
 bool
 </dd>
 </dl>
+<a NAME="ProjectKivyPlugin.createTypingCompleter" ID="ProjectKivyPlugin.createTypingCompleter"></a>
+<h4>ProjectKivyPlugin.createTypingCompleter</h4>
+<b>createTypingCompleter</b>(<i>editor, parent=None</i>)
+
+<p>
+        Public method to create a typing completer object for the given editor.
+</p>
+<dl>
+
+<dt><i>editor</i> (Editor)</dt>
+<dd>
+reference to the editor object
+</dd>
+<dt><i>parent</i> (QObject (optional))</dt>
+<dd>
+reference to the parent object (defaults to None)
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+reference to the instantiated typing completer object
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+CompleterKivy
+</dd>
+</dl>
+<a NAME="ProjectKivyPlugin.createTypingCompleterConfigWidget" ID="ProjectKivyPlugin.createTypingCompleterConfigWidget"></a>
+<h4>ProjectKivyPlugin.createTypingCompleterConfigWidget</h4>
+<b>createTypingCompleterConfigWidget</b>(<i></i>)
+
+<p>
+        Public method to create and populate the typing completer configuration widget.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+instantiated and populated configuration widget
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+CompleterKivyConfigWidget
+</dd>
+</dl>
 <a NAME="ProjectKivyPlugin.deactivate" ID="ProjectKivyPlugin.deactivate"></a>
 <h4>ProjectKivyPlugin.deactivate</h4>
 <b>deactivate</b>(<i></i>)
@@ -196,6 +265,32 @@
 QsciLexer
 </dd>
 </dl>
+<a NAME="ProjectKivyPlugin.getTypingPreferences" ID="ProjectKivyPlugin.getTypingPreferences"></a>
+<h4>ProjectKivyPlugin.getTypingPreferences</h4>
+<b>getTypingPreferences</b>(<i>key</i>)
+
+<p>
+        Public method to retrieve the typing completer settings.
+</p>
+<dl>
+
+<dt><i>key</i> (str)</dt>
+<dd>
+the key of the value to get
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+value of the requested setting
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+Any
+</dd>
+</dl>
 <a NAME="ProjectKivyPlugin.lexerAssociationCallback" ID="ProjectKivyPlugin.lexerAssociationCallback"></a>
 <h4>ProjectKivyPlugin.lexerAssociationCallback</h4>
 <b>lexerAssociationCallback</b>(<i>filename</i>)
@@ -224,6 +319,24 @@
 str
 </dd>
 </dl>
+<a NAME="ProjectKivyPlugin.setTypingPreferences" ID="ProjectKivyPlugin.setTypingPreferences"></a>
+<h4>ProjectKivyPlugin.setTypingPreferences</h4>
+<b>setTypingPreferences</b>(<i>key, value</i>)
+
+<p>
+        Public method to store the typing completer settings.
+</p>
+<dl>
+
+<dt><i>key</i> (str)</dt>
+<dd>
+the key of the setting to be set
+</dd>
+<dt><i>value</i> (Any)</dt>
+<dd>
+value to be set
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
@@ -255,4 +368,14 @@
 </dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
+<hr />
+<a NAME="prepareUninstall" ID="prepareUninstall"></a>
+<h2>prepareUninstall</h2>
+<b>prepareUninstall</b>(<i></i>)
+
+<p>
+    Module function to prepare for an uninstallation.
+</p>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
 </body></html>
\ No newline at end of file
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/Documentation/source/Plugin_Project_Kivy.ProjectKivy.CompleterKivy.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProjectKivy/Documentation/source/Plugin_Project_Kivy.ProjectKivy.CompleterKivy.html	Sat Sep 09 17:43:15 2023 +0200
@@ -0,0 +1,155 @@
+<!DOCTYPE html>
+<html><head>
+<title>Plugin_Project_Kivy.ProjectKivy.CompleterKivy</title>
+<meta charset="UTF-8">
+<link rel="stylesheet" href="styles.css">
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>Plugin_Project_Kivy.ProjectKivy.CompleterKivy</h1>
+
+<p>
+Module implementing the Kivy typing completer.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#CompleterKivy">CompleterKivy</a></td>
+<td>Class implementing the Kivy typing completer.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+<hr />
+<a NAME="CompleterKivy" ID="CompleterKivy"></a>
+<h2>CompleterKivy</h2>
+
+<p>
+    Class implementing the Kivy typing completer.
+</p>
+<h3>Derived from</h3>
+CompleterBase
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#CompleterKivy.__init__">CompleterKivy</a></td>
+<td>Constructor</td>
+</tr>
+<tr>
+<td><a href="#CompleterKivy.__inComment">__inComment</a></td>
+<td>Private method to check, if the cursor is inside a comment.</td>
+</tr>
+<tr>
+<td><a href="#CompleterKivy.charAdded">charAdded</a></td>
+<td>Public slot called to handle the user entering a character.</td>
+</tr>
+<tr>
+<td><a href="#CompleterKivy.readSettings">readSettings</a></td>
+<td>Public slot called to reread the configuration parameters.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="CompleterKivy.__init__" ID="CompleterKivy.__init__"></a>
+<h4>CompleterKivy (Constructor)</h4>
+<b>CompleterKivy</b>(<i>plugin, editor, parent=None</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>plugin</i> (ProjectKivyPlugin)</dt>
+<dd>
+reference to the plugin object
+</dd>
+<dt><i>editor</i> (Editor)</dt>
+<dd>
+reference to the editor object
+</dd>
+<dt><i>parent</i> (QObject)</dt>
+<dd>
+reference to the parent object
+</dd>
+</dl>
+<a NAME="CompleterKivy.__inComment" ID="CompleterKivy.__inComment"></a>
+<h4>CompleterKivy.__inComment</h4>
+<b>__inComment</b>(<i>line, col</i>)
+
+<p>
+        Private method to check, if the cursor is inside a comment.
+</p>
+<dl>
+
+<dt><i>line</i> (int)</dt>
+<dd>
+current line
+</dd>
+<dt><i>col</i> (int)</dt>
+<dd>
+current position within line
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+flag indicating, if the cursor is inside a comment
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
+<a NAME="CompleterKivy.charAdded" ID="CompleterKivy.charAdded"></a>
+<h4>CompleterKivy.charAdded</h4>
+<b>charAdded</b>(<i>charNumber</i>)
+
+<p>
+        Public slot called to handle the user entering a character.
+</p>
+<dl>
+
+<dt><i>charNumber</i> (int)</dt>
+<dd>
+value of the character entered
+</dd>
+</dl>
+<a NAME="CompleterKivy.readSettings" ID="CompleterKivy.readSettings"></a>
+<h4>CompleterKivy.readSettings</h4>
+<b>readSettings</b>(<i></i>)
+
+<p>
+        Public slot called to reread the configuration parameters.
+</p>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/Documentation/source/Plugin_Project_Kivy.ProjectKivy.CompleterKivyConfigWidget.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProjectKivy/Documentation/source/Plugin_Project_Kivy.ProjectKivy.CompleterKivyConfigWidget.html	Sat Sep 09 17:43:15 2023 +0200
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html><head>
+<title>Plugin_Project_Kivy.ProjectKivy.CompleterKivyConfigWidget</title>
+<meta charset="UTF-8">
+<link rel="stylesheet" href="styles.css">
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>Plugin_Project_Kivy.ProjectKivy.CompleterKivyConfigWidget</h1>
+
+<p>
+Module implementing the configuration widget for the Kivy typing completer.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#CompleterKivyConfigWidget">CompleterKivyConfigWidget</a></td>
+<td>Class documentation goes here.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+<hr />
+<a NAME="CompleterKivyConfigWidget" ID="CompleterKivyConfigWidget"></a>
+<h2>CompleterKivyConfigWidget</h2>
+
+<p>
+    Class documentation goes here.
+</p>
+<h3>Derived from</h3>
+QWidget, Ui_CompleterKivyConfigWidget
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#CompleterKivyConfigWidget.__init__">CompleterKivyConfigWidget</a></td>
+<td>Constructor</td>
+</tr>
+<tr>
+<td><a href="#CompleterKivyConfigWidget.save">save</a></td>
+<td>Public method to save the Kivy Typing Completer configuration.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="CompleterKivyConfigWidget.__init__" ID="CompleterKivyConfigWidget.__init__"></a>
+<h4>CompleterKivyConfigWidget (Constructor)</h4>
+<b>CompleterKivyConfigWidget</b>(<i>plugin, parent=None</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>plugin</i> (ProjectKivyPlugin)</dt>
+<dd>
+reference to the plugin object
+</dd>
+<dt><i>parent</i> (QWidget (optional))</dt>
+<dd>
+reference to the parent widget (defaults to None)
+</dd>
+</dl>
+<a NAME="CompleterKivyConfigWidget.save" ID="CompleterKivyConfigWidget.save"></a>
+<h4>CompleterKivyConfigWidget.save</h4>
+<b>save</b>(<i></i>)
+
+<p>
+        Public method to save the Kivy Typing Completer configuration.
+</p>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/Documentation/source/index-Plugin_Project_Kivy.ProjectKivy.html
--- a/ProjectKivy/Documentation/source/index-Plugin_Project_Kivy.ProjectKivy.html	Sat Dec 31 16:27:50 2022 +0100
+++ b/ProjectKivy/Documentation/source/index-Plugin_Project_Kivy.ProjectKivy.html	Sat Sep 09 17:43:15 2023 +0200
@@ -16,6 +16,14 @@
 <table>
 
 <tr>
+<td><a href="Plugin_Project_Kivy.ProjectKivy.CompleterKivy.html">CompleterKivy</a></td>
+<td>Module implementing the Kivy typing completer.</td>
+</tr>
+<tr>
+<td><a href="Plugin_Project_Kivy.ProjectKivy.CompleterKivyConfigWidget.html">CompleterKivyConfigWidget</a></td>
+<td>Module implementing the configuration widget for the Kivy typing completer.</td>
+</tr>
+<tr>
 <td><a href="Plugin_Project_Kivy.ProjectKivy.KivyLexer.html">KivyLexer</a></td>
 <td>Module implementing a Pygments lexer for the Kivy language.</td>
 </tr>
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/i18n/kivy_de.qm
Binary file ProjectKivy/i18n/kivy_de.qm has changed
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/i18n/kivy_de.ts
--- a/ProjectKivy/i18n/kivy_de.ts	Sat Dec 31 16:27:50 2022 +0100
+++ b/ProjectKivy/i18n/kivy_de.ts	Sat Sep 09 17:43:15 2023 +0200
@@ -1,21 +1,104 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0" language="de_DE" sourcelanguage="">
+<TS version="2.1" language="de_DE">
+  <context>
+    <name>CompleterKivyConfigWidget</name>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to enable Kivy typing aids</source>
+      <translation>Auswählen, um die Kivy Eingabehilfen zu aktivieren</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Enable Kivy typing aids</source>
+      <translation>Aktiviere Kivy Eingabehilfen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a closing parenthesis</source>
+      <translation>Auswählen, um eine schließende Klammer einzufügen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic parenthesis insertion</source>
+      <translation>Automatisch Klammern einfügen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to skip matching braces when typing</source>
+      <translation>Auswählen, um bei der Eingabe gleiche Klammern zu überspringen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatically skip matching braces when typing</source>
+      <translation>Gleiche Klammern bei der Eingabe automatisch überspringen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to skip a ':', if typed next to another ':'</source>
+      <translation>Select to skip a ':', if typed next to another ':'</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic colon detection</source>
+      <translation>Automatische Doppelpunkterkennung</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to indent after typing 'return'</source>
+      <translation>Auswählen, um nach einem Zeilenvorschub einzurücken</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic indent after '(', '{', '[' and ':'</source>
+      <translation>Automatische Einrückung nach '(', '{', '[' und ':'</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert the matching quote character</source>
+      <translation>Auswählen, um ein passendes Anführungszeichen einzufügen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic quote insertion</source>
+      <translation>Anführungszeichen automatisch einfügen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a blank after ':'</source>
+      <translation>Auswählen, um ein Leerzeichen nach ':' einzufügen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic insertion of ' ' (blank) after ':'</source>
+      <translation>Nach ':' automatisch ' ' (Leerzeichen) einfügen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a blank after ','</source>
+      <translation>Auswählen, um ein Leerzeichen nach ',' einzufügen</translation>
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic insertion of ' ' (blank) after ','</source>
+      <translation>Nach ',' automatisch ' ' (Leerzeichen) einfügen</translation>
+    </message>
+  </context>
   <context>
     <name>ProjectKivyPlugin</name>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="124" />
-      <location filename="../../PluginProjectKivy.py" line="104" />
+      <location filename="../../PluginProjectKivy.py" line="154" />
+      <location filename="../../PluginProjectKivy.py" line="123" />
       <source>Kivy</source>
       <translation>Kivy</translation>
     </message>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="127" />
+      <location filename="../../PluginProjectKivy.py" line="157" />
       <source>Kivy Files (*.kv *.kivy)</source>
       <translation>Kivy Dateien (*.kv *.kivy)</translation>
     </message>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="128" />
+      <location filename="../../PluginProjectKivy.py" line="158" />
       <source>Kivy Files (*.kv)</source>
       <translation>Kivy Dateien (*.kv)</translation>
     </message>
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/i18n/kivy_en.ts
--- a/ProjectKivy/i18n/kivy_en.ts	Sat Dec 31 16:27:50 2022 +0100
+++ b/ProjectKivy/i18n/kivy_en.ts	Sat Sep 09 17:43:15 2023 +0200
@@ -2,20 +2,103 @@
 <!DOCTYPE TS>
 <TS version="2.0">
   <context>
+    <name>CompleterKivyConfigWidget</name>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to enable Kivy typing aids</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Enable Kivy typing aids</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a closing parenthesis</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic parenthesis insertion</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to skip matching braces when typing</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatically skip matching braces when typing</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to skip a ':', if typed next to another ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic colon detection</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to indent after typing 'return'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic indent after '(', '{', '[' and ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert the matching quote character</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic quote insertion</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a blank after ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic insertion of ' ' (blank) after ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a blank after ','</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic insertion of ' ' (blank) after ','</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>ProjectKivyPlugin</name>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="124" />
-      <location filename="../../PluginProjectKivy.py" line="104" />
+      <location filename="../../PluginProjectKivy.py" line="154" />
+      <location filename="../../PluginProjectKivy.py" line="123" />
       <source>Kivy</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="127" />
+      <location filename="../../PluginProjectKivy.py" line="157" />
       <source>Kivy Files (*.kv *.kivy)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="128" />
+      <location filename="../../PluginProjectKivy.py" line="158" />
       <source>Kivy Files (*.kv)</source>
       <translation type="unfinished" />
     </message>
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/i18n/kivy_es.ts
--- a/ProjectKivy/i18n/kivy_es.ts	Sat Dec 31 16:27:50 2022 +0100
+++ b/ProjectKivy/i18n/kivy_es.ts	Sat Sep 09 17:43:15 2023 +0200
@@ -2,20 +2,103 @@
 <!DOCTYPE TS>
 <TS version="2.0" language="es_ES" sourcelanguage="">
   <context>
+    <name>CompleterKivyConfigWidget</name>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to enable Kivy typing aids</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Enable Kivy typing aids</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a closing parenthesis</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic parenthesis insertion</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to skip matching braces when typing</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatically skip matching braces when typing</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to skip a ':', if typed next to another ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic colon detection</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to indent after typing 'return'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic indent after '(', '{', '[' and ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert the matching quote character</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic quote insertion</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a blank after ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic insertion of ' ' (blank) after ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a blank after ','</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic insertion of ' ' (blank) after ','</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>ProjectKivyPlugin</name>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="124" />
-      <location filename="../../PluginProjectKivy.py" line="104" />
+      <location filename="../../PluginProjectKivy.py" line="154" />
+      <location filename="../../PluginProjectKivy.py" line="123" />
       <source>Kivy</source>
       <translation>Kivy</translation>
     </message>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="127" />
+      <location filename="../../PluginProjectKivy.py" line="157" />
       <source>Kivy Files (*.kv *.kivy)</source>
       <translation>Archivos Kivy (*.kv *.kivy)</translation>
     </message>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="128" />
+      <location filename="../../PluginProjectKivy.py" line="158" />
       <source>Kivy Files (*.kv)</source>
       <translation>Archivos Kivy (*.kv)</translation>
     </message>
diff -r 610af455ef9a -r fb361b396c68 ProjectKivy/i18n/kivy_ru.ts
--- a/ProjectKivy/i18n/kivy_ru.ts	Sat Dec 31 16:27:50 2022 +0100
+++ b/ProjectKivy/i18n/kivy_ru.ts	Sat Sep 09 17:43:15 2023 +0200
@@ -2,20 +2,103 @@
 <!DOCTYPE TS>
 <TS version="2.1" language="ru_RU">
   <context>
+    <name>CompleterKivyConfigWidget</name>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to enable Kivy typing aids</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Enable Kivy typing aids</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a closing parenthesis</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic parenthesis insertion</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to skip matching braces when typing</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatically skip matching braces when typing</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to skip a ':', if typed next to another ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic colon detection</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to indent after typing 'return'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic indent after '(', '{', '[' and ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert the matching quote character</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic quote insertion</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a blank after ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic insertion of ' ' (blank) after ':'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Select to insert a blank after ','</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CompleterKivyConfigWidget.ui" line="0" />
+      <source>Automatic insertion of ' ' (blank) after ','</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>ProjectKivyPlugin</name>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="124" />
-      <location filename="../../PluginProjectKivy.py" line="104" />
+      <location filename="../../PluginProjectKivy.py" line="154" />
+      <location filename="../../PluginProjectKivy.py" line="123" />
       <source>Kivy</source>
       <translation>Kivy</translation>
     </message>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="127" />
+      <location filename="../../PluginProjectKivy.py" line="157" />
       <source>Kivy Files (*.kv *.kivy)</source>
       <translation>Файлы Kivy (*.kv *.kivy)</translation>
     </message>
     <message>
-      <location filename="../../PluginProjectKivy.py" line="128" />
+      <location filename="../../PluginProjectKivy.py" line="158" />
       <source>Kivy Files (*.kv)</source>
       <translation>Файлы Kivy (*.kv)</translation>
     </message>

eric ide

mercurial