kitty @ ls: Show only environment variables that are different for each window, by default.

Makes the output much less noisy, and env vars that are common across
all windows are useless for selection/identification purposes.
This commit is contained in:
Kovid Goyal 2021-04-13 08:44:11 +05:30
parent 05fb09f56c
commit 958d4d8a6a
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 30 additions and 3 deletions

View File

@ -46,6 +46,9 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
- Double clicking on empty tab bar area now opens a new tab (:iss:`3201`)
- kitty @ ls: Show only environment variables that are different for each
window, by default.
- When passing a directory or a non-executable file as the program to run to
kitty opens it with the shell or by parsing the shebang, instead of just failing.

View File

@ -3,7 +3,7 @@
# License: GPLv3 Copyright: 2020, Kovid Goyal <kovid at kovidgoyal.net>
import json
from typing import Any, Dict, Optional
from typing import Any, Dict, List, Optional, Set, Tuple
from kitty.constants import appname
@ -15,7 +15,7 @@ from .base import (
class LS(RemoteCommand):
'''
No payload
all_env_vars: Whether to send all environment variables for ever window rather than just differing ones
'''
short_desc = 'List all tabs/windows'
@ -28,10 +28,16 @@ class LS(RemoteCommand):
' running the command inside a kitty window, that window can be identified by the :italic:`is_self` parameter.\n\n'
'You can use these criteria to select windows/tabs for the other commands.'
)
options_spec = '''\
--all-env-vars
type=bool-set
Show all environment variables in output not just differing ones.
'''
argspec = ''
def message_to_kitty(self, global_opts: RCOptions, opts: Any, args: ArgsType) -> PayloadType:
pass
return {'all_env_vars': opts.all_env_vars}
def response_from_kitty(self, boss: Boss, window: Optional[Window], payload_get: PayloadGetType) -> ResponseType:
@ -47,6 +53,24 @@ class LS(RemoteCommand):
finally:
if window is not None:
window.serialize_callback = orig_callback
if not payload_get('all_env_vars'):
all_env_blocks: List[Dict[str, str]] = []
common_env_vars: Set[Tuple[str, str]] = set()
for osw in data:
for tab in osw.get('tabs', ()):
for w in tab.get('windows', ()):
env: Dict[str, str] = w.get('env', {})
frozen_env = set(env.items())
if all_env_blocks:
common_env_vars &= frozen_env
else:
common_env_vars = frozen_env
all_env_blocks.append(env)
if common_env_vars and len(all_env_blocks) > 1:
remove_env_vars = {k for k, v in common_env_vars}
for env in all_env_blocks:
for r in remove_env_vars:
env.pop(r, None)
return json.dumps(data, indent=2, sort_keys=True)