Skip to content

πŸ“‚ Implement multiple terminal sessions/tabsΒ #7

@kshivang

Description

@kshivang

Feature Description

Add support for multiple terminal sessions/tabs in a single window.

Current Status

❌ NOT IMPLEMENTED - Only single terminal instance supported

Legacy UI Capabilities

The legacy ui/ module has:

  • TerminalSession - Session management
  • TerminalWidget - Multiple terminal instances
  • Tab support for multiple shells
  • Session lifecycle management
  • TerminalWidgetListener for session events

Proposed Implementation

1. Tab Bar UI

  • Horizontal tab strip at top
  • "+" button to create new tab
  • "X" button on each tab to close
  • Tab titles (shell name or custom title)
  • Active tab highlighting

2. Session Management

data class TerminalTab(
    val id: String,
    val title: String,
    val terminal: JediTerminal,
    val ttyConnector: TtyConnector,
    val dataStream: BlockingTerminalDataStream
)

class SessionManager {
    val tabs: StateFlow<List<TerminalTab>>
    val activeTabId: StateFlow<String?>
    
    fun createNewTab(shell: String = "/bin/zsh")
    fun closeTab(id: String)
    fun switchToTab(id: String)
}

3. Keyboard Shortcuts

  • Ctrl+T / Cmd+T - New tab
  • Ctrl+W / Cmd+W - Close tab
  • Ctrl+Tab - Next tab
  • Ctrl+Shift+Tab - Previous tab
  • Ctrl+1-9 / Cmd+1-9 - Jump to tab N

4. Tab Lifecycle

  • Each tab has independent:
    • Terminal state
    • PTY connection
    • Scrollback buffer
    • Selection state

Priority

🟑 MEDIUM - Power users expect tabs, but can use OS terminal tabs as workaround

Files to Modify

  • compose-ui/src/desktopMain/kotlin/org/jetbrains/jediterm/compose/demo/Main.kt
  • Create new: compose-ui/src/desktopMain/kotlin/org/jetbrains/jediterm/compose/SessionManager.kt
  • Create new: compose-ui/src/desktopMain/kotlin/org/jetbrains/jediterm/compose/TabBar.kt

References

  • Legacy: ui/src/com/jediterm/terminal/ui/TerminalSession.java
  • Legacy: ui/src/com/jediterm/terminal/ui/TerminalWidget.java

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions