diff --git a/kitty/search_query_parser.py b/kitty/search_query_parser.py index 436a866de..54b1b289a 100644 --- a/kitty/search_query_parser.py +++ b/kitty/search_query_parser.py @@ -6,6 +6,8 @@ from gettext import gettext as _ from typing import Callable, Iterator, List, NamedTuple, Optional, Sequence, Set, Tuple, TypeVar, Union +from .types import run_once + class ParseException(Exception): @@ -115,13 +117,15 @@ class Token(NamedTuple): val: str -lex_scanner = getattr(re, 'Scanner')([ - (r'[()]', lambda x, t: Token(TokenType.OPCODE, t)), - (r'@.+?:[^")\s]+', lambda x, t: Token(TokenType.WORD, str(t))), - (r'[^"()\s]+', lambda x, t: Token(TokenType.WORD, str(t))), - (r'".*?((? Callable[[str], Tuple[List[Token], str]]: + return getattr(re, 'Scanner')([ # type: ignore + (r'[()]', lambda x, t: Token(TokenType.OPCODE, t)), + (r'@.+?:[^")\s]+', lambda x, t: Token(TokenType.WORD, str(t))), + (r'[^"()\s]+', lambda x, t: Token(TokenType.WORD, str(t))), + (r'".*?((? List[Token]: # lex scanner doesn't get confused. We put them back later. for k, v in REPLACEMENTS: expr = expr.replace(k, v) - tokens = lex_scanner.scan(expr)[0] + tokens = lex_scanner()(expr)[0] def unescape(x: str) -> str: for k, v in REPLACEMENTS: