Allow including config files matching glob patterns in conf files

Fixes #4533
This commit is contained in:
Kovid Goyal 2022-01-18 16:28:19 +05:30
parent f9a4b6bb0d
commit 6a2522452f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 30 additions and 19 deletions

View File

@ -79,6 +79,9 @@ Detailed list of changes
- macOS: Allow opening text files, images and directories with kitty when - macOS: Allow opening text files, images and directories with kitty when
launched using "Open with" in Finder (:iss:`4460`) launched using "Open with" in Finder (:iss:`4460`)
- Allow including config files matching glob patterns in :file:`kitty.conf`
(:iss:`4533`)
- Shell integration: Fix bash integration not working when ``PROMPT_COMMAND`` - Shell integration: Fix bash integration not working when ``PROMPT_COMMAND``
is used to change the prompt variables (:iss:`4476`) is used to change the prompt variables (:iss:`4476`)

View File

@ -25,12 +25,14 @@ character. This works only if the ``#`` character is the first character
in the line. in the line.
You can include secondary config files via the :code:`include` directive. If You can include secondary config files via the :code:`include` directive. If
you use a relative path for include, it is resolved with respect to the you use a relative path for :code:`include`, it is resolved with respect to the
location of the current config file. Note that environment variables are location of the current config file. Note that environment variables are
expanded, so :code:`${USER}.conf` becomes :file:`name.conf` if expanded, so :code:`${USER}.conf` becomes :file:`name.conf` if
:code:`USER=name`. For example:: :code:`USER=name`. Also, you can use :code:`globinclude` to include files
matching a shell glob pattern. For example::
include other.conf include other.conf
globinclude kitty.d/**/*.conf
.. note:: Syntax highlighting for :file:`kitty.conf` in vim is available via .. note:: Syntax highlighting for :file:`kitty.conf` in vim is available via

View File

@ -170,24 +170,30 @@ def parse_line(
log_error(f'Ignoring invalid config line: {line}') log_error(f'Ignoring invalid config line: {line}')
return return
key, val = m.groups() key, val = m.groups()
if key == 'include': if key in ('include', 'globinclude'):
val = os.path.expandvars(os.path.expanduser(val.strip())) val = os.path.expandvars(os.path.expanduser(val.strip()))
if not os.path.isabs(val): if key == 'globinclude':
val = os.path.join(base_path_for_includes, val) from pathlib import Path
try: vals = tuple(map(lambda x: str(os.fspath(x)), Path(base_path_for_includes).glob(val)))
with open(val, encoding='utf-8', errors='replace') as include: else:
with currently_parsing.set_file(val): if not os.path.isabs(val):
_parse(include, parse_conf_item, ans, accumulate_bad_lines) val = os.path.join(base_path_for_includes, val)
except FileNotFoundError: vals = (val,)
log_error( for val in vals:
'Could not find included config file: {}, ignoring'. try:
format(val) with open(val, encoding='utf-8', errors='replace') as include:
) with currently_parsing.set_file(val):
except OSError: _parse(include, parse_conf_item, ans, accumulate_bad_lines)
log_error( except FileNotFoundError:
'Could not read from included config file: {}, ignoring'. log_error(
format(val) 'Could not find included config file: {}, ignoring'.
) format(val)
)
except OSError:
log_error(
'Could not read from included config file: {}, ignoring'.
format(val)
)
return return
if not parse_conf_item(key, val, ans): if not parse_conf_item(key, val, ans):
log_error(f'Ignoring unknown config key: {key}') log_error(f'Ignoring unknown config key: {key}')