diff --git a/kitty/utils.py b/kitty/utils.py index 0d0fc826c..a36f9e691 100644 --- a/kitty/utils.py +++ b/kitty/utils.py @@ -1215,14 +1215,22 @@ def key_val_matcher(items: Iterable[tuple[str, str]], key_pat: 're.Pattern[str]' def shlex_split(text: str, allow_ansi_quoted_strings: bool = False) -> Iterator[str]: s = Shlex(text, allow_ansi_quoted_strings) + yielded = False while (q := s.next_word())[0] > -1: yield q[1] + yielded = True + if not yielded: + yield '' def shlex_split_with_positions(text: str, allow_ansi_quoted_strings: bool = False) -> Iterator[tuple[int, str]]: s = Shlex(text, allow_ansi_quoted_strings) + yielded = False while (q := s.next_word())[0] > -1: yield q + yielded = True + if not yielded: + yield 0, '' def timed_debug_print(*a: Any, sep: str = ' ', end: str = '\n') -> None: diff --git a/kitty/window.py b/kitty/window.py index a80741d2e..8bbc5cac7 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -213,8 +213,7 @@ def compile_match_query(exp: str, is_simple: bool = True) -> MatchPatternType: def decode_cmdline(x: str) -> str: ctype, sep, val = x.partition('=') if ctype == 'cmdline': - with suppress(StopIteration): - return next(shlex_split(val, True)) + return next(shlex_split(val, True)) elif ctype == 'cmdline_url': from urllib.parse import unquote return unquote(val) diff --git a/kitty_tests/datatypes.py b/kitty_tests/datatypes.py index 41a22a5d5..f4c78c536 100644 --- a/kitty_tests/datatypes.py +++ b/kitty_tests/datatypes.py @@ -629,7 +629,7 @@ class TestDataTypes(BaseTest): r'x "ab"y \m': ((0, 'x'), (2, 'aby'), (8, 'm')), r'''x'y"\z'1''': ((0, 'xy"\\z1'),), r'\abc\ d': ((0, 'abc d'),), - '': (), ' ': (), ' \tabc\n\t\r ': ((2, 'abc'),), + '': ((0, ''),), ' ': ((0, ''),), ' \tabc\n\t\r ': ((2, 'abc'),), "$'ab'": ((0, '$ab'),), }.items(): actual = tuple(shlex_split_with_positions(q))