Skip to content

here mode: send_keys for env vars and shell replacement diverges from teamocil and is unsafe #1030

@tony

Description

@tony

Problem

--here mode in tmuxp uses send_keys to inject infrastructure commands (cd, export, shell replacement) into the active pane. This has three failure modes:

  1. export is not POSIX-universal — it's a syntax error in fish, nu, and other non-bash/zsh shells
  2. Types into foreground programs — if the active pane is running vim, python, htop, etc., the cd/export commands are typed as input, corrupting the user's session
  3. Shell history pollutioncd and export commands appear in the user's shell history

What tmuxp does (3 categories of send_keys)

builder.py:695-727:

# 1. Directory change via send_keys
active_pane.send_keys(f"cd {shlex.quote(start_directory)}", enter=True)

# 2. Environment vars via send_keys (N calls, one per var)
_here_pane.send_keys(f"export {_ekey}={shlex.quote(str(_eval))}", enter=True)

# 3. Shell replacement via send_keys
_here_pane.send_keys(window_shell, enter=True)

What teamocil does (1 category of send_keys)

teamocil's --here only uses send_keys for cd — the one unavoidable case. Everything else uses tmux primitives:

  • Window rename: rename-window — tmux command, not send_keys
  • Directory (cd): send_keys cd "/path" — only send_keys usage
  • Pane splitting: split-window -c '/path' — tmux primitive with -c for directory
  • Environment vars: Not handled at all — no send_keys export
  • Shell replacement: Not handled — teamocil doesn't change the running shell

tmuxinator similarly never uses send_keys for infrastructure — only for user-specified pane commands. Directories use -c on new-window and splitw.

Impact

Categories 2 and 3 (export and window_shell) are tmuxp-specific — neither Ruby tool does this. They are the primary source of the POSIX shell assumption and the "types into vim" failure mode.

Proposed solutions

Two approaches, tracked as sub-issues:

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions