From 6671dbf2b4c5c79bc118fa5f2d37c29d95734952 Mon Sep 17 00:00:00 2001 From: arza Date: Fri, 14 Jul 2023 23:56:26 +0300 Subject: Search ListCategory in any order of search terms --- qutebrowser/completion/models/listcategory.py | 4 +--- tests/unit/completion/test_listcategory.py | 5 +++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/qutebrowser/completion/models/listcategory.py b/qutebrowser/completion/models/listcategory.py index 1ca81cf5e..a8798ee55 100644 --- a/qutebrowser/completion/models/listcategory.py +++ b/qutebrowser/completion/models/listcategory.py @@ -61,9 +61,7 @@ class ListCategory(QSortFilterProxyModel): log.completion.warning(f"Trimming {len(val)}-char pattern to 5000") val = val[:5000] self._pattern = val - val = re.sub(r' +', r' ', val) # See #1919 - val = re.escape(val) - val = val.replace(r'\ ', '.*') + val = '(?=.*' + ')(?=.*'.join(map(re.escape, val.split())) + ')' rx = QRegularExpression(val, QRegularExpression.PatternOption.CaseInsensitiveOption) qtutils.ensure_valid(rx) self.setFilterRegularExpression(rx) diff --git a/tests/unit/completion/test_listcategory.py b/tests/unit/completion/test_listcategory.py index 39ccfa0b9..ea4584306 100644 --- a/tests/unit/completion/test_listcategory.py +++ b/tests/unit/completion/test_listcategory.py @@ -45,6 +45,11 @@ from qutebrowser.completion.models import listcategory [('foo', 'bar'), ('bar', 'foo'), ('bar', 'bar')], [('foo', 'bar'), ('bar', 'foo')], [('foo', 'bar'), ('bar', 'foo')]), + + ('foo bar', + [('foobar', ''), ('barfoo', ''), ('foobaz', '')], + [('barfoo', ''), ('foobar', '')], + [('foobar', ''), ('barfoo', '')]), ]) def test_set_pattern(pattern, before, after, after_nosort, model_validator): """Validate the filtering and sorting results of set_pattern.""" -- cgit v1.2.3-54-g00ecf From a0d1dd0f10bc72c9741370eaf1e4f75713ca5d42 Mon Sep 17 00:00:00 2001 From: arza Date: Sun, 22 Oct 2023 22:12:14 +0300 Subject: Add a comment --- qutebrowser/completion/models/listcategory.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qutebrowser/completion/models/listcategory.py b/qutebrowser/completion/models/listcategory.py index a8798ee55..353018d91 100644 --- a/qutebrowser/completion/models/listcategory.py +++ b/qutebrowser/completion/models/listcategory.py @@ -61,6 +61,10 @@ class ListCategory(QSortFilterProxyModel): log.completion.warning(f"Trimming {len(val)}-char pattern to 5000") val = val[:5000] self._pattern = val + + # Positive lookahead per search term. This means that all search terms must + # be matched but they can be matched anywhere in the string, so they can be + # in any order. For example "foo bar" -> "(?=.*foo)(?=.*bar)" val = '(?=.*' + ')(?=.*'.join(map(re.escape, val.split())) + ')' rx = QRegularExpression(val, QRegularExpression.PatternOption.CaseInsensitiveOption) qtutils.ensure_valid(rx) -- cgit v1.2.3-54-g00ecf