Modern line-oriented terminal emulator without support for TUIs.

Overview

saneterm

Modern line-oriented terminal emulator without support for TUIs.

saneterm demo

Motivation

Mainstream terminal emulators (urxvt, xterm, alacritty, …) support a standard known as ANSI escape sequences. This standard defines several byte sequences to provide special control functions for terminals emulators. This includes control of the cursor, support for different colors, et cetera. They are often used to implement TUIs, e.g. using the ncurses library.

Many of these escape sequences operate on rows and columns and therefore require terminal emulators to be built around a character grid were individual cells can be modified. Historically, this was very useful to implement UIs on physical terminals like the VT100. Nowadays this approach feels dated and causes a variety of problems. For instance, the concept of grapheme cluster as used in Unicode is largely incompatible with fixed-size columns. For this reason, terminal emulator supporting the aforementioned escape sequences can never fully support Unicode [1].

On the other hand, a terminal emulator not supporting ANSI escape sequences can never support existing TUIs. However, the idea behind saneterm is that terminals shouldn't be used to implement TUIs anyhow, instead they should focus on line-based CLIs. By doing so, a variety of features normally implemented in CLI programs themselves (like readline-keybindings) can be implemented directly in the terminal emulator.

Status

Silly, buggy, and incomplete prototype implementation.

Features

By focusing on line-based input in the terminal emulator a variety of things can be simplified and improved. saneterm is presently just a prototype and provides basic implementations of the following features:

  • Full Unicode support
  • Support for readline-like line editing keybindings
  • Editing history support directly in the terminal emulator
  • File name completions
  • Pager-like text handling (scrolling, searching, …)

Installation

This software has the following dependencies:

If these are installed run the following command to install saneterm:

$ python3 setup.py install --optimize=1

For development setups just run python3 -msaneterm.

Usage

Since many modern day shells use ANSI escape sequences heavily for providing editing features, your favorite shell might not directly work with saneterm. Simple shells like dash are known to work well though. You might also want to consider using a clean environment, to do so run the following command to start saneterm:

$ saneterm -- env -i dash

Configuration

The terminal appearance can be configured using Gtk's CSS feature. The saneterm window widget can be selected using the CSS selector #saneterm.

For example, to change the color scheme and employed font. Add the following to your gtk.css configuration file located at $XDG_CONFIG_HOME/gtk-3.0/gtk.css:

#saneterm textview {
	font-family: Terminus;
	font-size: 16px;
}

#saneterm textview text {
	background-color: #181818;
	color: #d8d8d8;

	/* change cursor color too */
	caret-color: #d8d8d8;
}

Keybindings can be configured using the same mechanism, see keys.py for the default keybindings.

FAQ

Q: How do I edit text on remote machines over SSH if my terminal emulator doesn't support visual editors?

A: This is an interesting problem since a lot of software relies on TUIs to be used over PTYs and SSH on remote machines. This is mostly also an inherit flaw of Unix as it hasn't been designed with networking and GUIs in mind. Plan 9 solves this problem through 9P file servers, but unfortunately it has not been widely adopted and we are stuck with Unix. In the Unix world potential solutions include CLI-based editors (e.g. ed) or network protocols tunneled over SSH connections (e.g. Emacs Tramp Mode).

Q: How do I use pagers (e.g. less(1)) without support for TUIs?

A: With saneterm pagers are not needed as paging functionality is implemented in the terminal emulator itself. For this reason, saneterm offers a scrollback buffer in which autoscrolling can be configured using the Gtk context menu. Furthermore, word wrapping can also be disabled using the same mechanism. A search feature is also implemented and can be activated using ctrl+f.

Q: Why is this written in Python and not X?

A: This software is presently just a silly prototype, Python is good for prototyping. Furthermore, Python has decent, somewhat well-documented bindings for Gtk.

Related Work

This work is heavily inspired by the Plan 9 terminal emulator, usage of which is further described in the rio(1) man page. This terminal emulator was also ported to Unix as part of plan9port.

There are also a few projects which seem to share the problem statement outlined in the Motivation but propose different solution. Most of which include continued support for TUIs and therefore don't benefit from other line-based editing features. Non-complete list:

License

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Dart Version Manager CLI implemented with Python and Typer.

Dart Version Manager Dart Version Manager CLI implemented with Python and Typer Usage: $ dvm [OPTIONS] COMMAND [ARGS]... Options: --install-completion

EducUp 6 Jun 26, 2022
A terminal client for connecting to hack.chat servers

A terminal client for connecting to hack.chat servers.

V9 2 Sep 21, 2022
Magnificent app which corrects your previous console command.

The Fuck The Fuck is a magnificent app, inspired by a @liamosaur tweet, that corrects errors in previous console commands. Is The Fuck too slow? Try t

Vladimir Iakovlev 75k Jan 02, 2023
A set of libraries and functions for simplifying automating Cisco devices through SecureCRT.

This is a set of libraries for automating Cisco devices (and to a lesser extent, bash prompts) over ssh/telnet in SecureCRT.

Matthew Spangler 7 Mar 30, 2022
Dead simple CLI tool to try Python packages - It's never been easier! :package:

try - It's never been easier to try Python packages try is an easy-to-use cli tool to try out Python packages. Features Install specific package versi

Timo Furrer 659 Dec 28, 2022
Use case: quick JSON processing/restructuring with jq without terminal

alfred-jq Alfred workflow to conveniently process JQ on clipboard based on a jq query Also available at: packal/jq Use case: quick JSON processing/res

T on Meta Mode 5 Sep 30, 2022
A simple and easy-to-use CLI parse tool.

A simple and easy-to-use CLI parse tool.

AbsentM 1 Mar 04, 2022
gcp-doctor - Diagnostics for Google Cloud Platform

gcp-doctor is a command-line diagnostics tool for GCP customers. It finds and helps to fix common issues in Google Cloud Platform projects. It is used to test projects against a wide range of best-pr

Google Cloud Platform 185 Dec 20, 2022
telescope.nvim is a highly extendable fuzzy finder over lists.

telescope.nvim is a highly extendable fuzzy finder over lists. Built on the latest awesome features from neovim core. Telescope is centered around modularity, allowing for easy customization.

nvim-telescope 8.4k Jan 05, 2023
vimBrain is a brainfuck-based vim-inspired esoteric programming language.

vimBrain vimBrain is a brainfuck-based vim-inspired esoteric programming language. vimBrainPy Currently, the only interpreter available is written in

SalahDin Ahmed 3 May 08, 2022
Automaton - python script to execute bash command based on changes in size of a file.

automaton python script to execute given command = everytime size of a given file changes,hence everytime a file is modified.(almost) download automa

asrar bhat 1 Jan 03, 2022
Make tree planting a part of your daily workflow. 🌳

Continuous Reforestation Make tree planting a part of your daily workflow. 🌳 A GitHub Action for planting trees within your development workflow usin

protontypes 168 Dec 22, 2022
Proman is a simple tool for managing projects through cli.

proman proman is a project manager. It helps you manage your projects from a terminal. The features are listed below. Installation Step 1: Download or

Arjun Somvanshi 2 Dec 06, 2021
Python CLI vm manager for remote access of docker images via noVNC

vmman is a tool to quickly boot and view docker-based VMs running on a linux server through noVNC without ssh tunneling on another network.

UCSD Engineers for Exploration 1 Nov 29, 2021
🌍 Harness the power of whatsmydns from the command-line.

chkdns Harness the power of whatsmydns from the command-line. Installing with pip pip install chkdns Run chkdns --host github.com Alternatively you ca

Craig Gumbley 3 Oct 29, 2022
This is a Command Line program to interact with your NFTs, Cryptocurrencies etc

This is a Command Line program to interact with your NFTs, Cryptocurrencies etc. via the ThirdWeb Platform. This is just a fun little project that I made to be able to connect to blockchains and Web3

Arpan Pandey 5 Oct 02, 2022
A simple note taker CLI program written in python

note-taker A simple note taker program written in python This allows you to snip your todo's, notes, and your tasks easily without extra charges Requi

marcusz 4 Nov 02, 2021
Collection of useful command line utilities and snippets to help you organise your workspace and improve workflow.

Collection of useful command line utilities and snippets to help you organise your workspace and improve workflow.

Dominik Tarnowski 3 Dec 26, 2021
Python implementation of SSH file transfer across servers.

SSH Transfer Python implementation of SSH file transfer across servers. Requirements paramiko=2.7.2 Usage Config Preparation Configure some informatio

Zhe Kong 1 Nov 23, 2021
A Python script for finding a food-truck based on latitude and longitude coordinates that you can run in your shell

Food Truck Finder Project Description This repository contains a Python script for finding a food-truck based on latitude and longitude coordinates th

1 Jan 22, 2022