ctrl+shift+p filters: :st2 :st3 :win :osx :linux
Browse

Terminus

by randy3k ST3

Bring a real terminal to Sublime Text

Details

Installs

  • Total 65K
  • Win 31K
  • Mac 17K
  • Linux 18K
Jul 13 Jul 12 Jul 11 Jul 10 Jul 9 Jul 8 Jul 7 Jul 6 Jul 5 Jul 4 Jul 3 Jul 2 Jul 1 Jun 30 Jun 29 Jun 28 Jun 27 Jun 26 Jun 25 Jun 24 Jun 23 Jun 22 Jun 21 Jun 20 Jun 19 Jun 18 Jun 17 Jun 16 Jun 15 Jun 14 Jun 13 Jun 12 Jun 11 Jun 10 Jun 9 Jun 8 Jun 7 Jun 6 Jun 5 Jun 4 Jun 3 Jun 2 Jun 1 May 31 May 30 May 29
Windows 81 80 82 84 78 83 96 115 89 73 82 86 107 79 84 86 84 92 88 100 90 80 76 86 76 79 99 88 85 109 77 79 86 97 110 88 77 78 110 103 110 99 86 70 84 89
Mac 21 32 31 32 34 41 36 40 28 25 30 30 35 36 31 30 27 31 37 27 45 28 31 30 30 49 42 55 49 21 32 48 39 44 46 25 28 36 39 40 37 38 42 35 30 36
Linux 38 36 45 38 43 55 54 52 26 34 41 48 49 39 44 25 40 32 39 48 36 55 32 33 48 43 31 52 28 33 30 36 46 43 52 40 28 41 49 53 49 45 41 40 32 43

Readme

Source
raw.​githubusercontent.​com

Bring a real terminal to Sublime Text

The first cross platform terminal for Sublime Text.

Unix shell Cmd.exe
Terminal in panel Support showing images

This package is heavily inspired by TerminalView. Compare with TerminalView, this has

  • Windows support
  • continuous history
  • easily customizable themes (see Terminus Utilities)
  • unicode support
  • 256 colors support
  • better xterm support
  • terminal panel
  • imgcat support (PS: it also works on Linux / WSL)

Installation

Package Control.

Getting started

Shell configurations

Terminus comes with several shell configurations. The settings file should be quite self explanatory.

User Key Bindings

You may find these key bindings useful. To edit, run Preferences: Terminus Key Bindings. Check the details for the arguments of terminus_open below.

  • toggle terminal panel
[
    { 
        "keys": ["alt+`"], "command": "toggle_terminus_panel"
    }
]
  • open a terminal view at current file directory
[
    { 
        "keys": ["ctrl+alt+t"], "command": "terminus_open", "args": {
            "cwd": "${file_path:${folder}}"
        }
    }
]

or by passing a custom cmd, say ipython

[
    { 
        "keys": ["ctrl+alt+t"], "command": "terminus_open", "args": {
            "cmd": "ipython",
            "cwd": "${file_path:${folder}}"
        }
    }
]
  • open terminal in a split view by using Origami's carry_file_to_pane
[
    {
        "keys": ["ctrl+alt+t"],
        "command": "terminus_open",
        "args": {
            "post_window_hooks": [
                ["carry_file_to_pane", {"direction": "down"}]
            ]
        }
    }
]
  • ctrl-w to close terminal

Following keybinding can be considered if one wants to use ctrl+w to close terminals.

{ 
    "keys": ["ctrl+w"], "command": "terminus_close", "context": [{ "key": "terminus_view"}]
}

User Commands in Palette

  • run Preferences: Terminus Command Palette. Check the details for the arguments of terminus_open below
[
    {
        "caption": "Terminus: Open Default Shell at Current Location",
        "command": "terminus_open",
        "args"   : {
            "cwd": "${file_path:${folder}}"
        }
    }
]

or by passing custom cmd, say ipython

[
    {
        "caption": "Terminus: Open iPython",
        "command": "terminus_open",
        "args"   : {
            "cmd": "ipython",
            "cwd": "${file_path:${folder}}",
            "title": "iPython"
        }
    }
]
  • open terminal in a split tab by using Origami's carry_file_to_pane
[
    {
        "caption": "Terminus: Open Default Shell in Split Tab",
        "command": "terminus_open",
        "args": {
            "post_window_hooks": [
                ["carry_file_to_pane", {"direction": "down"}]
            ]
        }
    }
]

Terminus Build System

It is possible to use Terminus as a build system. The target terminus_exec is a drop in replacement of the default target exec. It takes exact same arguments as terminus_open except that their default values are set differently.

terminus_cancel_build is used to cancel the build when user runs cancel_build triggered by ctrl+c (macOS) or ctrl+break (Windows / Linux).

The following is an example of build system define in project settings that run a python script

{
    "build_systems":
    [
        {
            "name": "Hello World",
            "target": "terminus_exec",
            "cancel": "terminus_cancel_build",
            "cmd": [
                "bash", "-c", "echo helloworld"
            ],
            "working_dir": "$folder"
        }
    ]
}

The same Hello World example could be specified via a .sublime-build file. Instead of cmd, user could also specify shell_cmd. In macOS and linux, a bash shell will be invoked; and in Windows, cmd.exe will be invoked.

{
    "target": "terminus_exec",
    "cancel": "terminus_cancel_build",
    "shell_cmd": "echo helloworld",
    "working_dir": "$folder"
}

Alt-Left/Right to move between words (Unix)

  • Bash: add the following in .bash_profile or .bashrc “ if [ ”$TERM_PROGRAM" == “Terminus-Sublime” ]; then bind '“\e[1;3C”: forward-word' bind '“\e[1;3D”: backward-word' fi
- Zsh: add the following in `.zshrc`

if [ “$TERM_PROGRAM” = “Terminus-Sublime” ]; then bindkey “\e[1;3C” forward-word bindkey “\e[1;3D” backward-word fi

Some programs, such as julia, do not recognize the standard keycodes for `alt+left` and `alt+right`. You could
bind them to `alt+b` and `alt+f` respectively
```json
[
    { "keys": ["alt+left"], "command": "terminus_keypress", "args": {"key": "b", "alt": true}, "context": [{"key": "terminus_view"}] },
    { "keys": ["alt+right"], "command": "terminus_keypress", "args": {"key": "f", "alt": true}, "context": [{"key": "terminus_view"}] }
]

Terminus API

  • A terminal could be opened using the command terminus_open with
window.run_command(
    "terminus_open", {
        "config_name": None,     # the shell config name, use `None` for the default config
        "cmd": None,             # the cmd to execute
        "shell_cmd": None,       # a script to execute in a shell
                                 # bash on Unix and cmd.exe on Windows
        "cwd": None,             # the working directory
        "working_dir": None,     # alias of "cwd"
        "env": {},               # extra environmental variables
        "title": None,           # title of the view, let terminal configures it if leave empty
        "panel_name": None,      # the name of the panel if terminal should be opened in panel
        "focus": True,           # focus to the panel
        "tag": None,             # a tag to identify the terminal
        "file_regex": None       # the `file_regex` pattern in sublime build system
                                 # see https://www.sublimetext.com/docs/3/build_systems.html
        "line_regex": None       # the `file_regex` pattern in sublime build system
        "pre_window_hooks": [],  # a list of window hooks before opening terminal
        "post_window_hooks": [], # a list of window hooks after opening terminal
        "post_view_hooks": [],   # a list of view hooks after opening terminal
        "auto_close": True,      # auto close terminal if process exits successfully
        "cancellable": False,     # allow `cancel_build` command to terminate process
        "timeit": False          # display elapsed time when the process terminates
    }
)

The fields cmd and cwd understand Sublime Text build system variables.

  • the setting view.settings().get("terminus_view.tag") can be used to identify the terminal and

  • keybind can be binded with specific tagged terminal

{
        "keys": ["ctrl+alt+w"], "command": "terminus_close", "context": [
            { "key": "terminus_view.tag", "operator": "equal", "operand": "YOUR_TAG"}
        ]
    }
  • text can be sent to the terminal with
window.run_command(
    "terminus_send_string", 
    {
        "string": "ls\n",
        "tag": "<YOUR_TAG>"        # ignore this or set it to None to send text to the first terminal found
        "visible_only": False      # send to visible panels only, default is `False`. Only relevent when `tag` is None
    }
)

If tag is not provided or is None, the text will be sent to the first terminal found in the current window.

FAQ

Memory issue

It is known that Terminus sometimes consumes a lot of memory after extensive use. It is because Sublime Text keeps an infinite undo stack. There is virtually no fix unless upstream provides an API to work with the undo stack. Meanwhile, users could execute Terminus: Reset to release the memory.

Color issue when maximizing and minimizing terminal

It is known that the color of the scrollback history will be lost when a terminal is maximized or minimized from or to the panel. There is no fix for this issue.

Terminal panel background issue

If you are using DA UI and your terminal panel has weired background color, try playing with the setting panel_background_color in DA UI: Theme Settings.

{
    "panel_background_color": "$background_color"
}

Cmd.exe rendering issue in panel

Due to a upstream bug (may winpty or cmd.exe?), there may be arbitrary empty lines inserted between prompts if the panel is too short. It seems that cmder and powershell are not affected by this bug.

Acknowledgments

This package won't be possible without pyte, pywinpty and ptyprocess.