Contour - A modern C++ Terminal Emulator
IMPORANT: THIS PROJECT IS IN ALPHA STAGE & ACTIVE DEVELOPMENT
Purpose
contour
is a modern terminal emulator, for everyday use.
Features
-
β Available on all 3 major platforms, Linux, OS/X, Windows. -
β Emoji support (-:π π π πͺ :-) -
β Font ligatures support (such as in Fira Code). -
β Bold and italic fonts -
β GPU-accelerated rendering. -
β Vertical Line Markers (quickly jump to markers in your history!) -
β Blurred behind transparent background when using Windows 10 or KDE window manager on Linux. -
β Runtime configuration reload -
β 256-color and Truecolor support -
β Key binding customization -
β Color Schemes -
β Profiles (grouped customization of: color scheme, login shell, and related behaviours)
A word on vertical line markers
Suppose you type a lot in the terminal, and I bet you do. Some commands may have inconveniently long output and you need a way to conveniently scroll the terminal viewport up to the top of that command. This is what this feature is there for. You can easily walk up/down your markers like you'd walk up code folds or markers in VIM or other editors.
Set a mark:
echo -ne "\033[>M"
Example key bindings:
input_mapping:
- { mods: [Alt, Shift], key: 'k', action: ScrollMarkUp }
- { mods: [Alt, Shift], key: 'j', action: ScrollMarkDown }
It is recommended to integrate the marker into your command prompt, such as $PS1
in bash or sh to have automatic markers set.
CLI - Command Line Interface
Usage: contour [options]
Contour Terminal Emulator
Options:
-h, --help Displays this help.
-v, --version Displays version information.
-c, --config <PATH> Path to configuration file to load at startup
[~/.config/contour/conour.yml].
-p, --profile <NAME> Terminal Profile to load.
Example Configuration File
word_delimiters: " /\\()\"'-.,:;<>[email protected]#$%^&*+=[]{}~?|β"
default_profile: ubuntu_vm
profiles:
ubuntu_vm:
shell: "ssh ubuntu-vm"
terminal_size:
columns: 130
lines: 30
environment:
TERM: xterm-256color
COLORTERM: truecolor
fontSize: 12
font:
regular: "Fira Code"
bold: "Fira Code:style=bold"
italic: "Hack:style=italic"
bold_italic: "Hack:style=bold italic"
emoji: "emoji"
tab_width: 8
history:
limit: 8000
scroll_multiplier: 3
auto_scroll_on_update: true
cursor:
shape: block
blinking: true
background:
opacity: 0.9
blur: false
colors: google_dark
color_schemes:
google_dark:
cursor: '#b0b030'
selection: '#30c0c0'
default:
background: '#1d1f21'
foreground: '#c5c8c6'
normal:
black: '#1d1f21'
red: '#cc342b'
green: '#198844'
yellow: '#fba922'
blue: '#3971ed'
magenta: '#a36ac7'
cyan: '#3971ed'
white: '#c5c8c6'
bright:
black: '#969896'
red: '#cc342b'
green: '#198844'
yellow: '#fba922'
blue: '#3971ed'
magenta: '#a36ac7'
cyan: '#3971ed'
white: '#ffffff'
input_mapping:
- { mods: [Alt], key: Enter, action: ToggleFullscreen }
- { mods: [Control, Alt], key: S, action: ScreenshotVT }
- { mods: [Control, Shift], key: Equal, action: IncreaseFontSize }
- { mods: [Control, Shift], key: Minus, action: DecreaseFontSize }
- { mods: [Control, Shift], key: N, action: NewTerminal }
- { mods: [Control], mouse: WheelUp, action: IncreaseFontSize }
- { mods: [Control], mouse: WheelDown, action: DecreaseFontSize }
- { mods: [Alt], mouse: WheelUp, action: IncreaseOpacity }
- { mods: [Alt], mouse: WheelDown, action: DecreaseOpacity }
- { mods: [Shift], mouse: WheelUp, action: ScrollPageUp }
- { mods: [Shift], mouse: WheelDown, action: ScrollPageDown }
- { mods: [], mouse: WheelUp, action: ScrollUp }
- { mods: [], mouse: WheelDown, action: ScrollDown }
- { mods: [Shift], key: UpArrow, action: ScrollOneUp }
- { mods: [Shift], key: DownArrow, action: ScrollOneDown }
- { mods: [Shift], key: PageUp, action: ScrollPageUp }
- { mods: [Shift], key: PageDown, action: ScrollPageDown }
- { mods: [Shift], key: Home, action: ScrollToTop }
- { mods: [Shift], key: End, action: ScrollToBottom }
- { mods: [Alt, Shift], key: 'k', action: ScrollMarkUp }
- { mods: [Alt, Shift], key: 'j', action: ScrollMarkDown }
logging:
file: "/path/to/contour.log"
parse_errors: true
invalid_output: true
unsupported_output: true
raw_input: false
raw_output: false
trace_input: false
trace_output: false
Installing from source
Prerequisites Linux
This is tested on Ubuntu 19.04, but any recent Linux with latest C++17 compiler should do:
sudo apt install \
"g++-9" libfreetype6-dev qtbase5-dev libqt5gui5 extra-cmake-modules \
libfontconfig1-dev libharfbuzz-dev
To enable blur-behind feature on transparent background, you'll need the following packages:
sudo apt install libkf5windowsystem-dev
And set pass -DCONTOUR_BLUR_PLATFORM_KWIN=ON
to cmake when configuring the project.
In case you want to improve performance slightly and run at at least Linux, you can add -DLIBTERMINAL_EXECUTION_PAR=ON
to the cmake configuration and make sure to have libtbb-dev
installed beforehand.
Prerequisites Windows 10
For Windows, you must have Windows 10, 2018 Fall Creators Update, and Visual Studio 2019, installed. It will neither build nor run on any prior Windows OS, due to libterminal making use of ConPTY API.
vcpkg install freetype fontconfig harfbuzz qt5-base
Prerequisites Mac OS/X
brew install freetype fontconfig harfbuzz boost qt5
References
- VT510: VT510 Manual, see Chapter 5.
- ECMA-35: Character Code Structure and Extension Techniques
- ECMA-43: 8-bit Coded Character Set Structure and Rules
- ECMA-48: Control Functions for Coded Character Sets
- ISO/IEC 8613-6: Character content architectures
- xterm: xterm control sequences
- console_codes Linux console codes
- Summary of ANSI standards for ASCII terminals
- Text Terminal HOWTO (Chapter 7.2, PTY)