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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions