Skip to content

Add support for tmux control mode (#3656) #18928

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

joexue
Copy link

@joexue joexue commented May 20, 2025

Summary of the Pull Request

Let WT supports tmux control mode

References and Relevant Issues

#3656

Detailed Description of the Pull Request / Additional comments

Screenshot 2025-05-13 232209

Support:

  • Create/attach tmux session

  • Split pane vertical/horizontal

  • Window/panes size change

  • Remove pane/tab if remote pane exit or window exit

Improvements may do:

  • Merge the tmux menus/button with existing menu/button
  • Add the keyboard accelerators for tmux menus
  • Unicode support(the VTParser just pass part of characters in DCS mode
  • When attached a session, focus on the same focused tab/pane when detaching(backend is done, need to do some work frontend)
  • Test code

Tested by using tmux 3.4:
ssh to a machine has tmux or use wsl, then run
"tmux -CC" or "tmux -CC a"

Validation Steps Performed

PR Checklist

@microsoft-github-policy-service microsoft-github-policy-service bot added Issue-Feature Complex enough to require an in depth planning process and actual budgeted, scheduled work. Area-Extensibility A feature that would ideally be fulfilled by us having an extension model. Area-Interop Communication between processes Area-UserInterface Issues pertaining to the user interface of the Console or Terminal Product-Terminal The new Windows Terminal. labels May 20, 2025
@joexue

This comment was marked as outdated.

This comment has been minimized.

@joexue

This comment was marked as outdated.

@joexue

This comment was marked as outdated.

@joexue
Copy link
Author

joexue commented May 20, 2025

@microsoft-github-policy-service agree

@DHowett
Copy link
Member

DHowett commented May 20, 2025

whoa

@iDarshan
Copy link

This is a long-awaited feature! Thanks @joexue!

@BinaryShrub
Copy link

gif

@DHowett
Copy link
Member

DHowett commented May 23, 2025

FYI: I am working with reduced staffing at the moment, so reviews may be slow to come. I apologize for that.

@iDarshan
Copy link

iDarshan commented Jun 3, 2025

Is there a nightly build with this PR to test?

@carlos-zamora
Copy link
Member

Is there a nightly build with this PR to test?

Your best bet is to build this locally. Once it merges, it will be available on the Canary channel though.

@iDarshan
Copy link

iDarshan commented Jun 6, 2025

Is there a nightly build with this PR to test?

Your best bet is to build this locally. Once it merges, it will be available on the Canary channel though.

I tried to find the build guide, but couldn't find one. Do you have the link handy?

@joexue
Copy link
Author

joexue commented Jun 6, 2025

Is there a nightly build with this PR to test?

Your best bet is to build this locally. Once it merges, it will be available on the Canary channel though.

I tried to find the build guide, but couldn't find one. Do you have the link handy?

README.md ->Developer Guidance @iDarshan

@carlos-zamora
Copy link
Member

Hi @joexue! Thanks for doing this! I published a build for the team to test internally and we've got a few notes we want to share with you 😊

  • Notes/Reactions:
    • Settings menu item is gone from the dropdown
    • It makes your existing window a special "tmux only" window; it disables the menu, but it doesn't disable the key bindings, so you can still split in non-tmux panes
    • Scrollbars are gone? I guess scrolling is server side
  • Requested changes:
    • [Bug] can't type in an older pane after splitting panes
    • tmux tabs should not be draggable into a new window
    • Add a setting to Profile > "Terminal Emulation" page that disables this (it should be disabled by default)
    • Bug: Closing a tab/pane will not kill the instance on the server side
    • Add a feature flag to features.xml (Guidance)
    • [Architectural notes] We should see if we can't just model a tmux pane as a connection so we don't need to pump output into the terminal from the App layer

Overall, this is a really exciting feature and we're excited to see it land! Let us know if you need any guidance or additional comments on any of the thoughts above. 😊

CC @DHowett @lhecker @zadjii-msft

@joexue
Copy link
Author

joexue commented Jun 12, 2025

Hi @joexue! Thanks for doing this! I published a build for the team to test internally and we've got a few notes we want to share with you 😊

  • Notes/Reactions:

    • Settings menu item is gone from the dropdown
    • It makes your existing window a special "tmux only" window; it disables the menu, but it doesn't disable the key bindings, so you can still split in non-tmux panes
    • Scrollbars are gone? I guess scrolling is server side

Scrollbars are gone is by design, I put the comment in the code, since we want to make local panes size match remote(tmux) panes size, but each split, tmux just lost 1 character to use it as separator, if we have side scrollbars, we cannot make two side's size match. To meet this, the padding size is changed too.

As the menu, it is because I tried to touch as less code as I can to do the job. So give the tmux a separate UI system. I described in the PR, this could be improved and should integrated into the present UI/menu system.
But, I think we can skip this ugly stage, directly change the code to make the tmux control mode work with present UI/menu system. I will address this, those +button/flyout splitting menus specifically for tmux will be gone.

  • Requested changes:

    • [Bug] can't type in an older pane after splitting panes

I did not see this bug, to help me to reproduce it here, could you describe your env? how do you connect to tmux server? what is the tmux version?

  • tmux tabs should not be draggable into a new window

Sure, let me fix it.

  • Add a setting to Profile > "Terminal Emulation" page that disables this (it should be disabled by default)

Sure, let me look it.

  • Bug: Closing a tab/pane will not kill the instance on the server side

This is by design, remote pane should close by quit it's app. but this is arguable, if we think close local pane should close remote pane too, it is easy and feasible.

  • Add a feature flag to features.xml (Guidance)

Sure. Fair enough.

  • [Architectural notes] We should see if we can't just model a tmux pane as a connection so we don't need to pump output into the terminal from the App layer

Please provide the idea, I can try to implement it.

Overall, this is a really exciting feature and we're excited to see it land! Let us know if you need any guidance or additional comments on any of the thoughts above. 😊

CC @DHowett @lhecker @zadjii-msft

Thanks!

Since this PR is a bit big, another option is we split it into two or three parts to make it easy to review and integrate. Such as
part 1: infra libs(parser, TermControl, Terminal, ControlCore)
part 2: TmuxControl
part 3: integrating and UI/Menu

What do you think, split it or just keep as it is?

@joexue
Copy link
Author

joexue commented Jun 17, 2025

@carlos-zamora @DHowett @lhecker @zadjii-msft
All comments are addressed, please try again.

Thanks

This comment has been minimized.

This comment has been minimized.

@joexue joexue force-pushed the tmux_cc_pr branch 2 times, most recently from 54c2bac to 4817698 Compare June 20, 2025 01:35
joexue added 2 commits June 23, 2025 22:25
Address comments round 1

1 typo fix
2 add the feature for tmux control
3 add the configuration for tmux control
4 change to use present menu/ui/action for tmux control
5 disable draging the tmux control tab
6 close backend panes/windows if close panes/tabs locally
7 fix the bug that cannot input after split the pane
Copy link

@check-spelling-bot Report

🔴 Please review

See the 📂 files view, the 📜action log, or 📝 job summary for details.

❌ Errors and Notices Count
ℹ️ candidate-pattern 1
❌ forbidden-pattern 1

See ❌ Event descriptions for more information.

These words are not needed and should be removed foob fuzzyfinder lstrcmpi oob

Forbidden patterns 🙅 (1)

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

Should be ; otherwise or . Otherwise

https://study.com/learn/lesson/otherwise-in-a-sentence.html

, [Oo]therwise\b
Pattern suggestions ✂️ (1)

You could add these patterns to .github/actions/spelling/patterns/fc0a06c3b6cae2ede1326eef202a800244365ebd.txt:

# Automatically suggested patterns

# hit-count: 1 file-count: 1
# lower URL escaped characters
%[0-9a-f][a-f](?=[a-z]{2,})

Alternatively, if a pattern suggestion doesn't make sense for this project, add a #
to the beginning of the line in the candidates file with the pattern to stop suggesting it.

✏️ Contributor please read this

By default the command suggestion will generate a file named based on your commit. That's generally ok as long as you add the file to your commit. Someone can reorganize it later.

If the listed items are:

  • ... misspelled, then please correct them instead of using the command.
  • ... names, please add them to .github/actions/spelling/allow/names.txt.
  • ... APIs, you can add them to a file in .github/actions/spelling/allow/.
  • ... just things you're using, please add them to an appropriate file in .github/actions/spelling/expect/.
  • ... tokens you only need in one place and shouldn't generally be used, you can add an item in an appropriate file in .github/actions/spelling/patterns/.

See the README.md in each directory for more information.

🔬 You can test your commits without appending to a PR by creating a new branch with that extra change and pushing it to your fork. The check-spelling action will run in response to your push -- it doesn't require an open pull request. By using such a branch, you can limit the number of typos your peers see you make. 😉

If the flagged items are 🤯 false positives

If items relate to a ...

  • binary file (or some other file you wouldn't want to check at all).

    Please add a file path to the excludes.txt file matching the containing file.

    File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

    ^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

  • well-formed pattern.

    If you can write a pattern that would match it,
    try adding it to the patterns.txt file.

    Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

    Note that patterns can't match multiline strings.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area-Extensibility A feature that would ideally be fulfilled by us having an extension model. Area-Interop Communication between processes Area-UserInterface Issues pertaining to the user interface of the Console or Terminal Issue-Feature Complex enough to require an in depth planning process and actual budgeted, scheduled work. Product-Terminal The new Windows Terminal.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add support for tmux Control Mode
5 participants