2020-06-28 09:32:54 +02:00
|
|
|
|
#  foot
|
2019-08-08 22:35:55 +02:00
|
|
|
|
|
2020-04-24 20:57:23 +02:00
|
|
|
|
The fast, lightweight and minimalistic Wayland terminal emulator.
|
2020-12-25 12:39:57 +01:00
|
|
|
|
|
2021-10-10 17:51:23 +02:00
|
|
|
|
[](https://ci.codeberg.org/dnkl/foot)
|
2020-12-25 12:36:00 +01:00
|
|
|
|
[](https://gitlab.com/dnkl/foot/commits/master)
|
2020-12-25 12:39:57 +01:00
|
|
|
|
[](https://builds.sr.ht/~dnkl/foot?)
|
2020-12-25 12:36:40 +01:00
|
|
|
|
|
2020-12-22 10:53:57 +01:00
|
|
|
|
[](https://repology.org/project/foot/versions)
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-08-29 23:05:19 +02:00
|
|
|
|
## Index
|
|
|
|
|
|
|
|
|
|
|
|
1. [Features](#features)
|
2020-07-28 20:50:35 +02:00
|
|
|
|
1. [Installing](#installing)
|
2020-07-25 13:18:12 +02:00
|
|
|
|
1. [Configuration](#configuration)
|
2020-06-30 19:49:55 +02:00
|
|
|
|
1. [Troubleshooting](#troubleshooting)
|
2020-05-10 17:33:48 +02:00
|
|
|
|
1. [Why the name 'foot'?](#why-the-name-foot)
|
2019-08-29 23:12:39 +02:00
|
|
|
|
1. [Fonts](#fonts)
|
|
|
|
|
|
1. [Shortcuts](#shortcuts)
|
|
|
|
|
|
1. [Keyboard](#keyboard)
|
2020-01-01 15:14:19 +01:00
|
|
|
|
1. [Normal mode](#normal-mode)
|
|
|
|
|
|
1. [Scrollback search](#scrollback-search)
|
2019-08-29 23:12:39 +02:00
|
|
|
|
1. [Mouse](#mouse)
|
2020-01-10 20:48:48 +01:00
|
|
|
|
1. [Server (daemon) mode](#server-daemon-mode)
|
2021-02-07 11:38:52 +01:00
|
|
|
|
1. [URLs](#urls)
|
2020-01-20 18:44:55 +01:00
|
|
|
|
1. [Alt/meta](#alt-meta)
|
2020-02-21 19:11:03 +01:00
|
|
|
|
1. [Backspace](#backspace)
|
2020-11-11 18:37:28 +01:00
|
|
|
|
1. [Keypad](#keypad)
|
2020-02-15 21:02:18 +01:00
|
|
|
|
1. [DPI and font size](#dpi-and-font-size)
|
2020-04-04 13:56:55 +02:00
|
|
|
|
1. [Supported OSCs](#supported-oscs)
|
2020-07-24 17:50:48 +02:00
|
|
|
|
1. [Programmatically checking if running in foot](#programmatically-checking-if-running-in-foot)
|
2022-01-14 13:33:16 +01:00
|
|
|
|
1. [XTGETTCAP](#xtgettcap)
|
2020-07-20 17:35:17 +02:00
|
|
|
|
1. [Credits](#Credits)
|
2020-04-04 20:54:54 +02:00
|
|
|
|
1. [Bugs](#bugs)
|
2020-11-27 19:06:41 +01:00
|
|
|
|
1. [Contact](#contact)
|
2020-11-27 18:54:18 +01:00
|
|
|
|
1. [IRC](#irc)
|
|
|
|
|
|
1. [Mastodon](#mastodon)
|
2021-10-30 20:12:28 +02:00
|
|
|
|
1. [Sponsoring/donations](#sponsoring-donations)
|
2020-07-28 19:53:32 +02:00
|
|
|
|
1. [License](#license)
|
|
|
|
|
|
|
2019-08-29 23:05:19 +02:00
|
|
|
|
|
2019-08-29 22:55:49 +02:00
|
|
|
|
## Features
|
|
|
|
|
|
|
2020-10-06 21:15:56 +02:00
|
|
|
|
* Fast (see [benchmarks](doc/benchmark.md), and
|
|
|
|
|
|
[performance](https://codeberg.org/dnkl/foot/wiki/Performance))
|
2020-04-19 16:23:18 +02:00
|
|
|
|
* Lightweight, in dependencies, on-disk and in-memory
|
2019-08-29 22:55:49 +02:00
|
|
|
|
* Wayland native
|
|
|
|
|
|
* DE agnostic
|
2021-02-06 11:20:42 +01:00
|
|
|
|
* Server/daemon mode
|
2019-08-29 22:55:49 +02:00
|
|
|
|
* User configurable font fallback
|
2020-02-15 20:59:34 +01:00
|
|
|
|
* On-the-fly font resize
|
|
|
|
|
|
* On-the-fly DPI font size adjustment
|
2019-08-29 22:55:49 +02:00
|
|
|
|
* Scrollback search
|
2021-02-06 11:20:42 +01:00
|
|
|
|
* Keyboard driven URL detection
|
2019-08-29 22:55:49 +02:00
|
|
|
|
* Color emoji support
|
2021-01-14 15:12:10 +01:00
|
|
|
|
* IME (via `text-input-v3`)
|
2020-07-09 09:18:18 +02:00
|
|
|
|
* Multi-seat
|
2021-08-12 13:10:49 +01:00
|
|
|
|
* True Color (24bpp)
|
2020-05-16 14:16:38 +02:00
|
|
|
|
* [Synchronized Updates](https://gitlab.freedesktop.org/terminal-wg/specifications/-/merge_requests/2) support
|
2020-02-22 21:21:14 +01:00
|
|
|
|
* [Sixel image support](https://en.wikipedia.org/wiki/Sixel)
|
2019-08-29 22:55:49 +02:00
|
|
|
|
|
2020-02-22 22:04:28 +01:00
|
|
|
|

|
|
|
|
|
|
|
2020-07-28 20:50:35 +02:00
|
|
|
|
|
|
|
|
|
|
# Installing
|
|
|
|
|
|
|
|
|
|
|
|
See [INSTALL.md](INSTALL.md).
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-07-25 13:18:12 +02:00
|
|
|
|
## Configuration
|
|
|
|
|
|
|
2020-07-27 20:04:56 +02:00
|
|
|
|
**foot** can be configured by creating a file
|
2020-08-27 19:50:07 +02:00
|
|
|
|
`$XDG_CONFIG_HOME/foot/foot.ini` (defaulting to
|
|
|
|
|
|
`~/.config/foot/foot.ini`). A template for that can usually be found
|
2020-08-27 21:08:24 +02:00
|
|
|
|
in `/usr/share/foot/foot.ini` or
|
2020-08-27 19:50:07 +02:00
|
|
|
|
[here](https://codeberg.org/dnkl/foot/src/branch/master/foot.ini).
|
2020-07-25 13:18:12 +02:00
|
|
|
|
|
2020-08-27 19:50:07 +02:00
|
|
|
|
Further information can be found in foot's man page `foot.ini(5)`.
|
2020-07-25 13:18:12 +02:00
|
|
|
|
|
2020-02-22 22:04:28 +01:00
|
|
|
|
|
2020-06-30 19:49:55 +02:00
|
|
|
|
## Troubleshooting
|
2020-06-30 19:43:10 +02:00
|
|
|
|
|
2020-06-30 19:49:55 +02:00
|
|
|
|
See the [wiki](https://codeberg.org/dnkl/foot/wiki#user-content-troubleshooting)
|
2020-06-30 19:43:10 +02:00
|
|
|
|
|
|
|
|
|
|
|
2020-05-10 17:33:48 +02:00
|
|
|
|
## Why the name 'foot'?
|
|
|
|
|
|
|
|
|
|
|
|
I'm bad at names. Most of my projects usually start out as _foo
|
|
|
|
|
|
something_ (for example, [yambar](https://codeberg.org/dnkl/yambar)
|
|
|
|
|
|
was _f00bar_ for a while).
|
|
|
|
|
|
|
|
|
|
|
|
So why _foot_?
|
|
|
|
|
|
|
2020-05-10 17:36:15 +02:00
|
|
|
|
_foo terminal_ → _footerm_ → _foot_
|
2020-05-10 17:33:48 +02:00
|
|
|
|
|
|
|
|
|
|
Pretty bad, I know.
|
|
|
|
|
|
|
|
|
|
|
|
As a side note, if you pronounce the _foo_ part of _foot_ the same way
|
|
|
|
|
|
you pronounce _foobar_, then _foot_ sounds a lot like the Swedish word
|
|
|
|
|
|
_fot_, which incidentally means (you guessed it) _foot_.
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-08-08 22:35:55 +02:00
|
|
|
|
## Fonts
|
|
|
|
|
|
|
2019-08-29 23:00:49 +02:00
|
|
|
|
**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!
|
2019-08-08 22:35:55 +02:00
|
|
|
|
|
2019-08-11 15:55:23 +02:00
|
|
|
|
If a glyph cannot be found in _any_ of the user configured fallback
|
|
|
|
|
|
fonts, _then_ fontconfig's list is used.
|
|
|
|
|
|
|
2019-08-08 22:35:55 +02:00
|
|
|
|
|
|
|
|
|
|
## Shortcuts
|
|
|
|
|
|
|
2020-08-27 19:50:07 +02:00
|
|
|
|
These are the default shortcuts. See `man foot.ini` and the example
|
|
|
|
|
|
`foot.ini` to see how these can be changed.
|
2019-08-08 22:35:55 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Keyboard
|
|
|
|
|
|
|
2020-01-01 15:12:57 +01:00
|
|
|
|
#### Normal mode
|
|
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>shift</kbd>+<kbd>page up</kbd>/<kbd>page down</kbd>
|
|
|
|
|
|
: Scroll up/down in history
|
2019-08-29 22:46:26 +02:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>shift</kbd>+<kbd>c</kbd>
|
|
|
|
|
|
: Copy selected text to the _clipboard_
|
2019-08-29 22:48:25 +02:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>shift</kbd>+<kbd>v</kbd>
|
|
|
|
|
|
: Paste from _clipboard_
|
2019-08-29 22:48:25 +02:00
|
|
|
|
|
2020-10-10 23:36:41 +02:00
|
|
|
|
<kbd>shift</kbd>+<kbd>insert</kbd>
|
|
|
|
|
|
: Paste from the _primary selection_
|
|
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>shift</kbd>+<kbd>r</kbd>
|
|
|
|
|
|
: Start a scrollback search
|
2019-08-29 22:48:25 +02:00
|
|
|
|
|
2020-02-10 21:57:55 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>+</kbd>, <kbd>ctrl</kbd>+<kbd>=</kbd>
|
2020-03-06 23:12:45 +01:00
|
|
|
|
: Increase font size by 0,5pt
|
2020-02-09 11:34:51 +01:00
|
|
|
|
|
|
|
|
|
|
<kbd>ctrl</kbd>+<kbd>-</kbd>
|
2020-03-06 23:12:45 +01:00
|
|
|
|
: Decrease font size by 0,5pt
|
2020-02-09 11:34:51 +01:00
|
|
|
|
|
2020-02-10 21:57:55 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>0</kbd>
|
2020-02-09 11:34:51 +01:00
|
|
|
|
: Reset font size
|
|
|
|
|
|
|
2020-03-17 21:52:26 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>shift</kbd>+<kbd>n</kbd>
|
2020-08-15 11:27:17 +02:00
|
|
|
|
: Spawn a new terminal. If the shell has been [configured to emit the
|
|
|
|
|
|
OSC 7 escape
|
|
|
|
|
|
sequence](https://codeberg.org/dnkl/foot/wiki#user-content-how-to-configure-my-shell-to-emit-the-osc-7-escape-sequence),
|
|
|
|
|
|
the new terminal will start in the current working directory.
|
2020-03-17 21:52:26 +01:00
|
|
|
|
|
2021-02-06 11:18:35 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>shift</kbd>+<kbd>u</kbd>
|
|
|
|
|
|
: Enter URL mode, where all currently visible URLs are tagged with a
|
|
|
|
|
|
jump label with a key sequence that will open the URL.
|
|
|
|
|
|
|
2019-08-27 21:20:24 +02:00
|
|
|
|
|
2020-01-01 15:12:57 +01:00
|
|
|
|
#### Scrollback search
|
2019-08-27 21:20:24 +02:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>r</kbd>
|
|
|
|
|
|
: Search _backward_ for next match
|
2019-08-30 20:18:12 +02:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>s</kbd>
|
|
|
|
|
|
: Search _forward_ for next match
|
2019-08-30 20:18:12 +02:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>w</kbd>
|
|
|
|
|
|
: Extend current selection (and thus the search criteria) to the end
|
2019-12-03 19:23:56 +01:00
|
|
|
|
of the word, or the next word if currently at a word separating
|
|
|
|
|
|
character.
|
|
|
|
|
|
|
2020-01-01 17:01:34 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>shift</kbd>+<kbd>w</kbd>
|
2020-01-01 15:01:27 +01:00
|
|
|
|
: Same as <kbd>ctrl</kbd>+<kbd>w</kbd>, except that the only word
|
2019-12-03 19:43:45 +01:00
|
|
|
|
separating characters are whitespace characters.
|
|
|
|
|
|
|
2020-11-01 12:39:57 +01:00
|
|
|
|
<kbd>ctrl</kbd>+<kbd>v</kbd>
|
|
|
|
|
|
: Paste from clipboard into the search buffer.
|
|
|
|
|
|
|
|
|
|
|
|
<kbd>shift</kbd>+<kbd>insert</kbd>
|
|
|
|
|
|
: Paste from primary selection into the search buffer.
|
|
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>escape</kbd>, <kbd>ctrl</kbd>+<kbd>g</kbd>
|
|
|
|
|
|
: Cancel the search
|
2019-08-29 22:48:25 +02:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>return</kbd>
|
|
|
|
|
|
: Finish the search and copy the current match to the primary
|
2019-08-30 20:26:20 +02:00
|
|
|
|
selection
|
2019-08-08 22:35:55 +02:00
|
|
|
|
|
|
|
|
|
|
### Mouse
|
|
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>left</kbd> - **single-click**
|
|
|
|
|
|
: Drag to select; when released, the selected text is copied to the
|
2020-01-04 23:56:17 +01:00
|
|
|
|
_primary_ selection. This feature is **disabled** when client has
|
|
|
|
|
|
enabled _mouse tracking_.
|
2020-01-04 23:52:08 +01:00
|
|
|
|
: Holding <kbd>shift</kbd> enables selection in mouse tracking enabled
|
|
|
|
|
|
clients.
|
|
|
|
|
|
: Holding <kbd>ctrl</kbd> will create a block selection.
|
2020-01-04 14:47:20 +01:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>left</kbd> - **double-click**
|
|
|
|
|
|
: Selects the _word_ (separated by spaces, period, comma, parenthesis
|
2019-08-29 22:50:35 +02:00
|
|
|
|
etc) under the pointer. Hold <kbd>ctrl</kbd> to select everything
|
|
|
|
|
|
under the pointer up to, and until, the next space characters.
|
2019-08-29 22:48:25 +02:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>left</kbd> - **triple-click**
|
|
|
|
|
|
: Selects the entire row
|
2019-08-29 23:12:39 +02:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>middle</kbd>
|
|
|
|
|
|
: Paste from _primary_ selection
|
2019-11-03 12:24:14 +01:00
|
|
|
|
|
2020-04-04 12:09:30 +02:00
|
|
|
|
<kbd>right</kbd>
|
2020-07-31 06:07:42 +02:00
|
|
|
|
: Extend current selection. Clicking immediately extends the
|
|
|
|
|
|
selection, while hold-and-drag allows you to interactively resize
|
|
|
|
|
|
the selection.
|
2020-04-04 12:09:30 +02:00
|
|
|
|
|
2020-01-01 15:01:27 +01:00
|
|
|
|
<kbd>wheel</kbd>
|
|
|
|
|
|
: Scroll up/down in history
|
2019-11-03 12:24:14 +01:00
|
|
|
|
|
2019-08-29 23:12:39 +02:00
|
|
|
|
|
2020-01-10 20:48:48 +01:00
|
|
|
|
## Server (daemon) mode
|
2019-11-19 00:17:13 +01:00
|
|
|
|
|
|
|
|
|
|
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
|
2020-10-09 18:54:54 +02:00
|
|
|
|
process hosts multiple windows. All Wayland communication, VT parsing
|
|
|
|
|
|
and rendering is done in the server process.
|
|
|
|
|
|
|
|
|
|
|
|
New windows are opened by running `footclient`, which remains running
|
|
|
|
|
|
until the terminal window is closed, at which point it exits with the
|
|
|
|
|
|
exit value of the client process (typically the shell).
|
2019-11-19 00:17:13 +01:00
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-02-07 11:38:52 +01:00
|
|
|
|
## URLs
|
|
|
|
|
|
|
|
|
|
|
|
Foot supports URL detection. But, unlike many other terminal
|
|
|
|
|
|
emulators, where URLs are highlighted when they are hovered and opened
|
|
|
|
|
|
by clicking on them, foot uses a keyboard driven approach.
|
|
|
|
|
|
|
|
|
|
|
|
Pressing <kbd>ctrl</kbd>+<kbd>shift</kbd>+<kbd>u</kbd> enters _“URL
|
|
|
|
|
|
mode”_, where all currently visible URLs are underlined, and is
|
|
|
|
|
|
associated with a _“jump-label”_. The jump-label indicates the _key
|
|
|
|
|
|
sequence_ (e.g. **”AF”**) to use to activate the URL.
|
|
|
|
|
|
|
|
|
|
|
|
The key binding can, of course, be customized, like all other key
|
|
|
|
|
|
bindings in foot. See `show-urls-launch` and `show-urls-copy` in the
|
|
|
|
|
|
`foot.ini` man page.
|
|
|
|
|
|
|
|
|
|
|
|
`show-urls-launch` by default opens the URL with `xdg-open`. This can
|
|
|
|
|
|
be changed with the `url-launch` option.
|
|
|
|
|
|
|
|
|
|
|
|
`show-urls-copy` is an alternative to `show-urls-launch`, that changes
|
|
|
|
|
|
what activating an URL _does_; instead of opening it, it copies it to
|
|
|
|
|
|
the clipboard. It is unbound by default.
|
|
|
|
|
|
|
2021-02-13 11:45:54 +01:00
|
|
|
|
Jump label colors, the URL underline color, and the letters used in
|
|
|
|
|
|
the jump label key sequences can be configured.
|
2021-02-07 11:38:52 +01:00
|
|
|
|
|
|
|
|
|
|
|
2020-01-20 18:44:55 +01:00
|
|
|
|
## Alt/meta
|
|
|
|
|
|
|
|
|
|
|
|
By default, foot prefixes _Meta characters_ with ESC. This corresponds
|
|
|
|
|
|
to XTerm's `metaSendsEscape` option set to `true`.
|
|
|
|
|
|
|
2020-07-25 09:52:30 +02:00
|
|
|
|
This can be disabled programmatically with `\E[?1036l` (and enabled
|
2020-01-20 18:44:55 +01:00
|
|
|
|
again with `\E[?1036h`).
|
|
|
|
|
|
|
|
|
|
|
|
When disabled, foot will instead set the 8:th bit of meta character
|
|
|
|
|
|
and then UTF-8 encode it. This corresponds to XTerm's `eightBitMeta`
|
|
|
|
|
|
option set to `true`.
|
|
|
|
|
|
|
2020-07-25 09:52:30 +02:00
|
|
|
|
This can also be disabled programmatically with `rmm` (_reset meta
|
2020-01-20 18:44:55 +01:00
|
|
|
|
mode_, `\E[?1034l`), and enabled again with `smm` (_set meta mode_,
|
2020-03-06 20:10:04 +01:00
|
|
|
|
`\E[?1034h`).
|
2020-01-20 18:44:55 +01:00
|
|
|
|
|
|
|
|
|
|
|
2020-02-21 19:11:03 +01:00
|
|
|
|
## Backspace
|
|
|
|
|
|
|
|
|
|
|
|
Foot transmits DEL (`^?`) on <kbd>backspace</kbd>. This corresponds to
|
|
|
|
|
|
XTerm's `backarrowKey` option set to `false`, and to DECBKM being
|
|
|
|
|
|
_reset_.
|
|
|
|
|
|
|
|
|
|
|
|
To instead transmit BS (`^H`), press
|
|
|
|
|
|
<kbd>ctrl</kbd>+<kbd>backspace</kbd>.
|
|
|
|
|
|
|
|
|
|
|
|
Note that foot does **not** implement DECBKM, and that the behavior
|
|
|
|
|
|
described above **cannot** be changed.
|
|
|
|
|
|
|
|
|
|
|
|
Finally, pressing <kbd>alt</kbd> will prefix the transmitted byte with
|
|
|
|
|
|
ESC.
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-11-13 17:50:34 +01:00
|
|
|
|
## Keypad
|
2020-11-11 18:37:28 +01:00
|
|
|
|
|
|
|
|
|
|
By default, <kbd>Num Lock</kbd> overrides the run-time configuration
|
|
|
|
|
|
keypad mode; when active, the keypad is always considered to be in
|
|
|
|
|
|
_numerical_ mode. This corresponds to XTerm's `numLock` option set to
|
|
|
|
|
|
`true`.
|
|
|
|
|
|
|
|
|
|
|
|
In this mode, the keypad keys always sends either numbers (<kbd>Num
|
|
|
|
|
|
Lock</kbd> is **active**) or cursor movement keys (<kbd>Up</kbd>,
|
|
|
|
|
|
<kbd>Down</kbd>, <kbd>Left</kbd>, <kbd>Right</kbd>, <kbd>Page
|
|
|
|
|
|
Up</kbd>, <kbd>Page Down</kbd> etc).
|
|
|
|
|
|
|
|
|
|
|
|
This can be disabled programmatically with `\E[?1035l` (and enabled
|
|
|
|
|
|
again with `\E[?1035h`).
|
|
|
|
|
|
|
|
|
|
|
|
When disabled, the keypad sends custom escape sequences instead of
|
|
|
|
|
|
numbers, when in _application_ mode.
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-02-15 21:02:18 +01:00
|
|
|
|
## DPI and font size
|
2020-02-15 20:59:34 +01:00
|
|
|
|
|
|
|
|
|
|
Font sizes are apparently a complex thing. Many applications use a
|
|
|
|
|
|
fixed DPI of 96. They may also multiply it with the monitor's scale
|
|
|
|
|
|
factor.
|
|
|
|
|
|
|
|
|
|
|
|
This results in fonts with different **physical** sizes (i.e. if
|
|
|
|
|
|
measured by a ruler) when rendered on screens with different DPI
|
|
|
|
|
|
values. Even if the configured font size is the same.
|
|
|
|
|
|
|
|
|
|
|
|
This is not how it is meant to be. Fonts are measured in _point sizes_
|
|
|
|
|
|
**for a reason**; a given point size should have the same height on
|
|
|
|
|
|
all mediums, be it printers or monitors, regardless of their DPI.
|
|
|
|
|
|
|
2021-03-27 12:28:39 +01:00
|
|
|
|
Foot’s default behavior is to use the monitor’s DPI to size fonts when
|
2021-09-19 11:58:34 +02:00
|
|
|
|
output scaling has been disabled on **all** monitors. If at least one
|
|
|
|
|
|
monitor has output scaling enabled, fonts will instead by sized using
|
|
|
|
|
|
the scaling factor.
|
2020-02-15 20:59:34 +01:00
|
|
|
|
|
2021-03-27 12:28:39 +01:00
|
|
|
|
This can be changed to either **always** use the monitor’s DPI
|
2021-09-22 22:01:54 +02:00
|
|
|
|
(regardless of scaling factor), or to **never** use it, with the
|
2021-03-27 12:28:39 +01:00
|
|
|
|
`dpi-aware` option in `foot.ini`. See the man page, **foot.ini**(5)
|
|
|
|
|
|
for more information.
|
2020-02-15 20:59:34 +01:00
|
|
|
|
|
2021-03-27 12:28:39 +01:00
|
|
|
|
When fonts are sized using the monitor’s DPI, glyphs should always
|
|
|
|
|
|
have the same physical height, regardless of monitor.
|
|
|
|
|
|
|
|
|
|
|
|
Furthermore, foot will re-size the fonts on-the-fly when the window is
|
|
|
|
|
|
moved between screens with different DPIs values. If the window covers
|
|
|
|
|
|
multiple screens, with different DPIs, the highest DPI will be used.
|
2020-02-15 20:59:34 +01:00
|
|
|
|
|
|
|
|
|
|
_Note_: if you configure **pixelsize**, rather than **size**, then DPI
|
|
|
|
|
|
changes will **not** change the font size. Pixels are always pixels.
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-04-04 13:56:55 +02:00
|
|
|
|
## Supported OSCs
|
|
|
|
|
|
|
|
|
|
|
|
OSC, _Operating System Command_, are escape sequences that interacts
|
|
|
|
|
|
with the terminal emulator itself. Foot implements the following OSCs:
|
|
|
|
|
|
|
2020-04-04 13:58:05 +02:00
|
|
|
|
* `OSC 0` - change window icon + title (but only title is actually
|
2020-04-04 13:56:55 +02:00
|
|
|
|
supported)
|
2020-04-19 15:51:05 +02:00
|
|
|
|
* `OSC 2` - change window title
|
2020-04-04 13:58:05 +02:00
|
|
|
|
* `OSC 4` - change color palette
|
|
|
|
|
|
* `OSC 7` - report CWD
|
2021-05-26 22:44:56 +02:00
|
|
|
|
* `OSC 8` - hyperlink
|
2021-07-24 11:02:06 +02:00
|
|
|
|
* `OSC 9` - desktop notification
|
2020-04-04 13:58:05 +02:00
|
|
|
|
* `OSC 10` - change (default) foreground color
|
|
|
|
|
|
* `OSC 11` - change (default) background color
|
|
|
|
|
|
* `OSC 12` - change cursor color
|
2021-05-26 22:44:56 +02:00
|
|
|
|
* `OSC 17` - change highlight (selection) background color
|
|
|
|
|
|
* `OSC 19` - change highlight (selection) foreground color
|
2020-04-04 13:58:05 +02:00
|
|
|
|
* `OSC 52` - copy/paste clipboard data
|
|
|
|
|
|
* `OSC 104` - reset color palette
|
|
|
|
|
|
* `OSC 110` - reset default foreground color
|
|
|
|
|
|
* `OSC 111` - reset default background color
|
|
|
|
|
|
* `OSC 112` - reset cursor color
|
2021-07-23 21:09:49 +02:00
|
|
|
|
* `OSC 117` - reset highlight background color
|
2021-05-26 22:44:56 +02:00
|
|
|
|
* `OSC 119` - reset highlight foreground color
|
2020-04-04 13:58:29 +02:00
|
|
|
|
* `OSC 555` - flash screen (**foot specific**)
|
2021-05-26 22:44:56 +02:00
|
|
|
|
* `OSC 777` - desktop notification (only the `;notify` sub-command of
|
|
|
|
|
|
OSC 777 is supported.)
|
2020-04-04 13:56:55 +02:00
|
|
|
|
|
|
|
|
|
|
|
2020-07-24 17:50:48 +02:00
|
|
|
|
## Programmatically checking if running in foot
|
|
|
|
|
|
|
|
|
|
|
|
Foot does **not** set any environment variables that can be used to
|
|
|
|
|
|
identify foot (reading `TERM` is not reliable since the user may have
|
|
|
|
|
|
chosen to use a different terminfo).
|
|
|
|
|
|
|
|
|
|
|
|
You can instead use the escape sequences to read the _Secondary_ and
|
|
|
|
|
|
_Tertiary Device Attributes_ (secondary/tertiary DA, for short).
|
|
|
|
|
|
|
2020-10-09 18:52:28 +02:00
|
|
|
|
The tertiary DA response is always `\EP!|464f4f54\E\\`, where
|
2021-04-22 11:14:47 +02:00
|
|
|
|
`464f4f54` is `FOOT` in hex.
|
2020-07-24 17:50:48 +02:00
|
|
|
|
|
2020-10-09 18:52:28 +02:00
|
|
|
|
The secondary DA response is `\E[>1;XXYYZZ;0c`, where `XXYYZZ` is
|
|
|
|
|
|
foot's major, minor and patch version numbers, in decimal, using two
|
|
|
|
|
|
digits for each number. For example, foot-1.4.2 would respond with
|
2020-07-24 17:50:48 +02:00
|
|
|
|
`\E[>1;010402;0c`.
|
|
|
|
|
|
|
|
|
|
|
|
**Note**: not all terminal emulators implement tertiary DA. Most
|
|
|
|
|
|
implement secondary DA, but not all. All _should_ however implement
|
|
|
|
|
|
_Primary DA_.
|
|
|
|
|
|
|
|
|
|
|
|
Thus, a safe way to query the terminal is to request the tertiary,
|
|
|
|
|
|
secondary and primary DA all at once, in that order. All terminals
|
|
|
|
|
|
should ignore escape sequences they do not recognize. You will have to
|
|
|
|
|
|
parse the response (which in foot will consist of all three DA
|
|
|
|
|
|
responses, all at once) to determine which requests the terminal
|
|
|
|
|
|
emulator actually responded to.
|
|
|
|
|
|
|
2021-07-25 10:50:24 +02:00
|
|
|
|
Starting with version 1.7.0, foot also implements `XTVERSION`, to
|
|
|
|
|
|
which it will reply with `\EP>|foot(version)\E\\`. Version is
|
|
|
|
|
|
e.g. “1.8.2” for a regular release, or “1.8.2-36-g7db8e06f” for a git
|
|
|
|
|
|
build.
|
|
|
|
|
|
|
2020-07-24 17:50:48 +02:00
|
|
|
|
|
2022-01-14 13:33:16 +01:00
|
|
|
|
# XTGETTCAP
|
|
|
|
|
|
|
|
|
|
|
|
`XTGETTCAP` is an escape sequence initially introduced by XTerm, and
|
|
|
|
|
|
also implemented (and extended, to some degree) by Kitty.
|
|
|
|
|
|
|
|
|
|
|
|
It allows querying the terminal for terminfo
|
|
|
|
|
|
capabilities. Applications using this feature do not need to use the
|
|
|
|
|
|
classic, file-based, terminfo definition. For example, if all
|
|
|
|
|
|
applications used this feature, you would no longer have to install
|
|
|
|
|
|
foot’s terminfo on remote hosts you SSH into.
|
|
|
|
|
|
|
|
|
|
|
|
XTerm’s implementation (as of XTerm-370) only supports querying key
|
|
|
|
|
|
(as in keyboard keys) capabilities, and three custom capabilities:
|
|
|
|
|
|
|
|
|
|
|
|
* `TN` - terminal name
|
|
|
|
|
|
* `Co` - number of colors (alias for the `colors` capability)
|
|
|
|
|
|
* `RGB` - number of bits per color channel (different semantics from
|
|
|
|
|
|
the `RGB` capability in file-based terminfo definitions!).
|
|
|
|
|
|
|
|
|
|
|
|
Kitty has extended this, and also supports querying all integer and
|
|
|
|
|
|
string capabilities.
|
|
|
|
|
|
|
|
|
|
|
|
Foot supports this, and extends it even further, to also include
|
|
|
|
|
|
boolean capabilities. This means foot’s entire terminfo can be queried
|
|
|
|
|
|
via `XTGETTCAP`.
|
|
|
|
|
|
|
|
|
|
|
|
Note that both Kitty and foot handles **responses** to
|
|
|
|
|
|
multi-capability queries slightly differently, compared to XTerm.
|
|
|
|
|
|
|
|
|
|
|
|
XTerm will send a single DCS reply, with `;`-separated
|
|
|
|
|
|
capability/value pairs. There are a couple of issues with this:
|
|
|
|
|
|
|
|
|
|
|
|
* The success/fail flag in the beginning of the response is always `1`
|
|
|
|
|
|
(success), unless the very **first** queried capability is invalid.
|
|
|
|
|
|
* XTerm will not respond **at all** to an invalid capability, unless
|
|
|
|
|
|
it’s the first one in the `XTGETTCAP` query.
|
|
|
|
|
|
* XTerm will end the response at the first invalid capability.
|
|
|
|
|
|
|
|
|
|
|
|
In other words, if you send a large multi-capability query, you will
|
|
|
|
|
|
only get responses up to, but not including, the first invalid
|
|
|
|
|
|
capability. All subsequent capabilities will be dropped.
|
|
|
|
|
|
|
|
|
|
|
|
Kitty and foot on the other hand, send one DCS response for **each**
|
|
|
|
|
|
capability in the multi query. This allows us to send a proper
|
|
|
|
|
|
success/fail flag for each queried capability. Responses for **all**
|
|
|
|
|
|
queried capabilities are **always** sent. No queries are ever dropped.
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-07-20 17:35:17 +02:00
|
|
|
|
# Credits
|
2020-06-28 09:29:20 +02:00
|
|
|
|
|
2020-07-20 17:35:17 +02:00
|
|
|
|
* [Ordoviz](https://codeberg.org/Ordoviz), for designing and
|
2020-06-28 09:30:23 +02:00
|
|
|
|
contributing foot's [logo](icons/hicolor/48x48/apps/foot.png).
|
2020-06-28 09:29:20 +02:00
|
|
|
|
|
|
|
|
|
|
|
2020-11-13 17:50:34 +01:00
|
|
|
|
# Bugs
|
2020-04-04 20:54:54 +02:00
|
|
|
|
|
|
|
|
|
|
Please report bugs to https://codeberg.org/dnkl/foot/issues
|
|
|
|
|
|
|
2021-10-16 15:29:57 +02:00
|
|
|
|
Before you open a new issue, please search existing bug reports, both
|
|
|
|
|
|
open **and** closed ones. Chances are someone else has already
|
|
|
|
|
|
reported the same issue.
|
|
|
|
|
|
|
2020-04-04 20:54:54 +02:00
|
|
|
|
The report should contain the following:
|
|
|
|
|
|
|
2021-10-16 15:22:40 +02:00
|
|
|
|
- Foot version (`foot --version`).
|
|
|
|
|
|
- Log output from foot (start foot from another terminal).
|
|
|
|
|
|
- Which Wayland compositor (and version) you are running.
|
|
|
|
|
|
- If reporting a crash, please try to provide a `bt full` backtrace
|
|
|
|
|
|
with symbols.
|
|
|
|
|
|
- Steps to reproduce. The more details the better.
|
2020-06-09 17:44:03 +02:00
|
|
|
|
|
|
|
|
|
|
|
2020-11-27 19:06:41 +01:00
|
|
|
|
# Contact
|
2020-11-27 18:54:18 +01:00
|
|
|
|
|
|
|
|
|
|
## IRC
|
|
|
|
|
|
|
2021-05-24 19:07:53 +02:00
|
|
|
|
Ask questions, hang out, sing praise or just say hi in the `#foot`
|
|
|
|
|
|
channel on [irc.libera.chat](https://libera.chat). Logs are available
|
|
|
|
|
|
at https://libera.irclog.whitequark.org/foot.
|
2020-11-27 18:54:18 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Mastodon
|
2020-06-09 17:44:03 +02:00
|
|
|
|
|
|
|
|
|
|
Every now and then I post foot related updates on
|
2020-06-09 17:46:12 +02:00
|
|
|
|
[@dnkl@linuxrocks.online](https://linuxrocks.online/@dnkl)
|
2020-07-28 19:53:32 +02:00
|
|
|
|
|
|
|
|
|
|
|
2021-10-30 20:12:28 +02:00
|
|
|
|
# Sponsoring/donations
|
|
|
|
|
|
|
|
|
|
|
|
* GitHub Sponsors: https://github.com/sponsors/dnkl
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-07-28 19:53:32 +02:00
|
|
|
|
# License
|
|
|
|
|
|
|
2020-07-28 20:53:39 +02:00
|
|
|
|
Foot is released under the [MIT license](LICENSE).
|