A fast and lightweight Wayland terminal emulator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Daniel Eklöf 5cd8af44c6
meson: we now require -lm
23 hours ago
completions client/server: add -t,--term to footclient 1 month ago
doc doc: foot.1: mention that selection is kept after ending a scrollback search 6 days ago
scripts generate-alt-random-writes: reduce output size 2 months ago
subprojects fcft: update to 0.4.0 23 hours ago
.gitignore gitignore: makepkg generated directories (pkg + src) 1 week ago
.gitlab-ci.yml ci: run unit tests 2 weeks ago
.gitmodules fcft: use fcft instead of local copy of font.c/font.h 5 days ago
LICENSE add license 5 months ago
PKGBUILD PKGBUILD: require fcft 0.4.x 23 hours ago
README.md search: map ctrl+shift+w to match to end of word, spaces only 2 days ago
async.c async: add async_write(), a write primitive to write to a NONBLOCK:ing FD 1 month ago
async.h async: add async_write(), a write primitive to write to a NONBLOCK:ing FD 1 month ago
base64.c base64: implement encode() 4 months ago
base64.h base64: implement encode() 4 months ago
client.c server/client: harden reading of initialization data, and make async 1 month ago
commands.c commands: scrollback: don't scrollback if mouse tracking is enabled 6 days ago
commands.h scrollback: initial support for mouse scrolling 4 months ago
config.c config: trim leading spaces from fonts 23 hours ago
config.h fcft: use fcft instead of local copy of font.c/font.h 5 days ago
csi.c csi/vt: don't bad client data as errors 6 days ago
csi.h performance improvements 5 months ago
fdm.c tllist: is now an external "library", so use <> includes 2 weeks ago
fdm.h fdm: add fdm_event_add() and fdm_event_del() 1 month ago
foot.desktop desktop: clean up, remove unsupported entries 2 months ago
foot.info terminfo: add tab stop related entries, hts and tbc 2 weeks ago
footrc config: change default bright5 and bright 6 colors 2 months ago
generate-version.sh generate-version: redirect *both* stdout and stderr to /dev/null 1 week ago
grid.c grid: remove commented out code 3 months ago
grid.h search: wip: initial search matching 3 months ago
input.c input: discard canceled compose sequences 3 days ago
input.h input: input_repeat() takes a 'struct wayland' pointer 1 month ago
keymap.h keymap: add meta modifier mappings for keypad keys 3 months ago
log.c log: set syslog facility to LOG_DAEMON when run in server mode 2 weeks ago
log.h log: set syslog facility to LOG_DAEMON when run in server mode 2 weeks ago
main.c main: stop initializing a default set of fonts 1 day ago
meson.build meson: we now require -lm 23 hours ago
misc.c selection: break out isword() to a new file 3 days ago
misc.h selection: break out isword() to a new file 3 days ago
osc.c csi/ocs/vt: log unhandled/unrecognized sequences as debug messages 6 days ago
osc.h ocs: renamed parameter size -> required_size in osc_ensure_size() 4 months ago
render.c fcft: update to 0.3.0 2 days ago
render.h wayland: move reload_cursor_theme() and update_cursor_surface() to wayland 1 month ago
search.c search: match_to_end_of_word: reset end_col when done with a row 2 days ago
search.h search: wip: re-direct input while searching, and build a search buffer 3 months ago
selection.c selection: break out isword() to a new file 3 days ago
selection.h selection: document the asynchronous behavior of text_from_{primary,clipboard} 1 month ago
server.c Add missing includes 5 days ago
server.h server: implement a --server mode 1 month ago
shm.c fcft: include <fcft/fcft.h>, and use fcft/stride.h instead of local copy 5 days ago
shm.h shm: automatic buffer purging is now delayed one cycle 1 month ago
slave.c slave: restore signals before calling exec() 1 month ago
slave.h slave: set TERM environment variable in slave process 1 month ago
terminal.c term: determine cell width from the width of the space character 23 hours ago
terminal.h fcft: include <fcft/fcft.h>, and use fcft/stride.h instead of local copy 5 days ago
tokenize.c slave: break out command line tokenizer 4 months ago
tokenize.h slave: break out command line tokenizer 4 months ago
vt.c vt: don't try to move cursor outside the terminal 6 days ago
vt.h Rename: vt_to_slave() -> term_to_slave() 1 month ago
wayland.c wayland: include more output (monitor) details in the log output 23 hours ago
wayland.h wayland: include more output (monitor) details in the log output 23 hours ago

README.md

foot

foot is a fast Wayland terminal emulator.

Index

  1. Features
  2. Non-features
  3. What does not work?
  4. Fonts
  5. Shortcuts
    1. Keyboard
    2. Mouse
  6. Server mode
  7. Requirements
    1. Running
    2. Building
  8. Installing
    1. Arch Linux
    2. Other

Features

  • Fast (TODO insert benchmark results here)
  • Wayland native
  • DE agnostic
  • User configurable font fallback
  • Scrollback search
  • Color emoji support
  • “Server” mode (one master process, many windows)

Non-features

This is a non-exhaustive list of things some people might consider being important features (i.e. “must-haves”), that are unlikely to ever be supported by foot.

  • Tabs
  • Graphical elements (menu, buttons etc)

What does not work?

This is a list of known, but probably not all, issues:

  • Unicode combining characters

Examples: á, 👪🏼 (may not be displayed correctly in your browser/editor)

  • Reflow text on window resize

  • GNOME; might work, but without window decorations.

Strictly speaking, foot is at fault here; all Wayland applications must be able to draw their own window decorations (but foot is not).

However, most people want a uniform look and feel on their desktop, including the window decorations. For this reason, a Wayland application can request Server Side Decorations (SSD). GNOME will reply with a “I hear you, but sorry, I wont do that”.

Fonts

foot supports all fonts that can be loaded by freetype, including bitmap fonts and color emoji fonts.

Foot uses fontconfig to locate and configure the font(s) to use. Since fontconfig’s fallback mechanism is imperfect, especially for monospace fonts (it doesn’t prefer monospace fonts even though the requested font is one), foot allows you, the user, to configure the fallback fonts to use.

This also means you can configure each fallback font individually; you want that fallback font to use this size, and you want that other fallback font to be italic? No problem!

If a glyph cannot be found in any of the user configured fallback fonts, then fontconfig’s list is used.

Shortcuts

At the moment, all shortcuts are hard coded and cannot be changed. It is not possible to define new key bindings.

Keyboard

  • shift+page up/page down

Scroll up/down in history

  • ctrl+shift+c

Copy selected text to the clipboard

  • ctrl+shift+v

Paste from clipboard

  • ctrl+shift+r

Start a scrollback search

While doing a scrollback search, the following shortcuts are available:

  • ctrl+r

Search backward for next match

  • ctrl+s

Search forward for next match

  • ctrl+w

Extend current selection (and thus the search criteria) to the end of the word, or the next word if currently at a word separating character.

  • ctrl+shiftw

Same as ctrl+w, except that the only word separating characters are whitespace characters.

  • escape, ctrl+g

Cancel the search

  • return

Finish the search and copy the current match to the primary selection

Mouse

  • left - single-click

Drag to select; when released, the selected text is copied to the primary selection. Note that this feature is normally disabled whenever the client has enabled mouse tracking, but can be forced by holding shift.

  • left - double-click

Selects the word (separated by spaces, period, comma, parenthesis etc) under the pointer. Hold ctrl to select everything under the pointer up to, and until, the next space characters.

  • left - triple-click

Selects the entire row

  • middle

Paste from primary selection

  • wheel

Scroll up/down in history

Server mode

When run normally, foot is a single-window application; if you want another window, start another foot process.

However, foot can also be run in a server mode. In this mode, one process hosts multiple windows. Note that this is nothing like tabs. When first started in server mode, no windows are available.

You open new windows by running footclient. This is a small process that instructs the foot server to open a new terminal window. The client process remains running until the terminal window is closed. The exit value of the client process is that of the shell that was running in the terminal window.

The point of this mode is a) reduced memory footprint - all terminal windows will share fonts and glyph cache, and b) reduced startup time - loading fonts and populating the glyph cache takes time, but in server mode it only happens once.

The downside is a performance penalty; all windows’ input and output are multiplexed in the same thread (but each window will have its own set of rendering threads). This means that if one window is very busy with, for example, producing output, then other windows will suffer.

And of course, should the server process crash, all windows will be gone.

Typical usage would be to start the server process (foot --server) when starting your Wayland compositor (i.e. logging in to your desktop), and then run footclient instead of foot whenever you want to launch a new terminal.

Requirements

Running

  • fontconfig
  • freetype
  • pixman
  • wayland (client and cursor libraries)
  • xkbcommon
  • tllist, unless built as a subproject
  • fcft, unless built as a subproject

Building

In addition to the dev variant of the packages above, you need:

  • meson
  • ninja
  • wayland protocols
  • ncurses
  • scdoc

Installing

Arch Linux

Use makepkg to build the bundled PKGBUILD (run makepkg in the source root directory).

Note that it will do a profiling-guided build, and that this requires a running wayland session since it needs to run an intermediate build of foot.

Other

Foot uses meson. If you are unfamiliar with it, the official tutorial might be a good starting point.

I also recommend taking a look at the bundled Arch PKGBUILD file, to see how it builds foot.