mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-11-15 05:12:28 +01:00
The KDE docs were moved from komorebi-for-kde/ to docs/linux/ and the sources, nix files, scripts and schemas to komorebi-linux/, nix/linux/, scripts/linux/ and schemas/linux/, so every relative link that left docs/ (to sources, nix files, scripts, schemas, .envrc, rust-toolchain.toml, the old CI file) was broken, and the text named the old paths. Links were rewritten mechanically by resolving each broken target against the old location and mapping it to the new one; link texts and code-span paths were updated to the new paths (komorebi/src -> komorebi-linux/src, nix/ -> nix/linux/, scripts/ -> scripts/linux/, docs/ -> docs/linux/, schema.json -> schemas/linux/schema.json). The crate list of the README names komorebi-linux, komorebi-daemon and komorebi-version; `cargo install --path komorebi` becomes komorebi-daemon; the comparison paragraph of CONTRIBUTING.md says compare-gen.py is stale (it looks for the old sibling trees). URLs of the old GitHub repositories are left as they are (a release decision). COMPARE.md is left as it is (already marked stale). Verified: a link checker over every markdown file (outside cli/, nix/, tools/, old-ci) reports no broken link in docs/linux. Nothing was built.
170 lines
7.9 KiB
Markdown
170 lines
7.9 KiB
Markdown
# Running komorebi
|
|
|
|
`komorebi` is the daemon that tiles your windows, and `komorebic` is the command line you
|
|
control it with. This page covers starting and stopping the daemon, asking it what it is
|
|
doing, and reading its log.
|
|
|
|
## Getting the two programs
|
|
|
|
[Installing komorebi](../installation.md) covers NixOS, where the flake's module installs both
|
|
and starts the daemon with every Plasma session, and building them from source. In a checkout of
|
|
the repository, on Linux, `nix build` leaves them in `result/bin`, and `nix profile install .`
|
|
puts them on your `PATH`. Without nix, build them with the Rust toolchain that
|
|
`rust-toolchain.toml` selects:
|
|
|
|
```sh
|
|
cargo build --release --locked
|
|
export PATH="$PWD/target/release:$PATH"
|
|
```
|
|
|
|
With the NixOS module, the daemon is the user unit `komorebi.service`, which starts when you log
|
|
in to Plasma. `systemctl --user start komorebi` starts it again after a `komorebic stop`, and
|
|
`journalctl --user -u komorebi` shows what it wrote. Everything else on this page applies to it
|
|
as it is.
|
|
|
|
## Starting and stopping
|
|
|
|
[`komorebic start`](../cli/start.md) runs the `komorebi` on your `PATH` in the background,
|
|
and checks three seconds later that it is running. It tries three times. If `komorebi` has
|
|
not started by then, `komorebic start` runs it once more in the foreground and prints what
|
|
it wrote on its standard error, which explains why it did not start. When a `komorebi` is
|
|
running already, `komorebic start` does nothing.
|
|
|
|
`komorebi` manages the windows of the Plasma Wayland session it is started in: it connects
|
|
to KWin on the session bus and loads a script into it, so start it from a terminal in that
|
|
session. Outside a Plasma session it exits with an error that says what is missing, which
|
|
`komorebic start` prints. [`komorebic check`](checking-the-setup.md) says what is missing from the
|
|
session, and what is wrong with the configuration, without starting anything.
|
|
|
|
`--config` gives the daemon the `komorebi.json` to read
|
|
([Configuration](configuration.md) says where it looks otherwise), and
|
|
[`komorebic quickstart`](quickstart-and-autostart.md) writes one to start from:
|
|
|
|
```sh
|
|
komorebic start --config ~/mine.json
|
|
```
|
|
|
|
Everything after a `--` is passed to `komorebi`. `--fake-backend` runs it against an
|
|
in-memory desktop with one monitor and no windows instead of KWin, which is a way to try the
|
|
daemon and `komorebic` without a compositor:
|
|
|
|
```sh
|
|
komorebic start
|
|
komorebic start -- --log-level debug
|
|
komorebic start -- --fake-backend
|
|
```
|
|
|
|
[`komorebic stop`](../cli/stop.md) tells the daemon to stop. It brings back the windows it hid (the
|
|
back of a stack, [stacking windows](stacking-windows.md), and the windows behind a
|
|
[monocle](monocle.md)), removes the desktop they were hidden on, asks KWin to unload its script,
|
|
removes its socket and exits. Stopping the process with `SIGINT` or `SIGTERM` does the same.
|
|
|
|
## Key bindings
|
|
|
|
[Key bindings](keybindings.md) is the guide to key bindings, and to the NixOS module's
|
|
options for them; this section is a summary for a daemon started by hand.
|
|
|
|
komorebi reads key bindings from a file in the format of skhd, whkd or sxhkd. The daemon
|
|
looks for `skhdrc`, `whkdrc` or `sxhkdrc` in `~/.config/komorebi` (or in
|
|
`$KOMOREBI_CONFIG_HOME`) and takes the first it finds; `--keybindings FILE` names another,
|
|
with `--keybindings-format skhd|whkd|sxhkd` when its name does not end with one of those.
|
|
The daemon registers the keys with KDE itself and runs the command of each press:
|
|
|
|
```sh
|
|
komorebic start -- --keybindings ~/dotfiles/skhdrc
|
|
```
|
|
|
|
KDE can also run a binding with no komorebi process, as a static shortcut that shows in System
|
|
Settings: [`komorebic hotkeys compile`](../cli/hotkeys-compile.md) writes those, and
|
|
`--mode auto` writes every binding that can be one. Give the daemon the same mode, so that it
|
|
leaves those bindings to KDE:
|
|
|
|
```sh
|
|
komorebic hotkeys compile --mode auto
|
|
komorebic start -- --keybindings-mode auto
|
|
```
|
|
|
|
The daemon realizes the modes of an skhdrc (and the chains of an sxhkdrc that stay open)
|
|
itself: while a mode is active, only its keys are taken, and every other key reaches the
|
|
window as usual. The log says which mode the daemon is in after each change. A chord chain
|
|
of an sxhkdrc (`alt + w ; h`) works the same way: after `alt + w`, only the keys that can
|
|
come next and Escape are taken, until one of them is pressed or 3 seconds pass
|
|
(`--chord-timeout 1500` waits 1.5 seconds instead).
|
|
|
|
A binding that does something else in each application (skhd's `[ ... ]` list, whkd's
|
|
per-application list) takes its key only while an application it names has the focus, or
|
|
any application for a `*` or `Default` entry; everywhere else the key reaches the application.
|
|
A name matches the executable, the Wayland app id (`org.kde.konsole`) or the desktop entry of
|
|
the focused window, whatever the case. skhd and whkd name applications as macOS and Windows
|
|
do, so give the daemon the names they have on KDE:
|
|
|
|
```sh
|
|
komorebic start -- --app-alias firefox=firefox-esr,librewolf --app-alias Terminal=konsole
|
|
```
|
|
|
|
[`komorebic hotkeys state`](../cli/hotkeys-state.md) shows the keys komorebi has registered
|
|
with KDE and what the daemon's engine is doing (its mode, and the keys it holds), and
|
|
[`komorebic hotkeys reload`](../cli/hotkeys-reload.md) has the daemon read its key binding
|
|
file again. A daemon that is killed leaves its keys swallowed until it is started again;
|
|
`komorebic stop` gives them back, and so does
|
|
[`komorebic hotkeys release`](../cli/hotkeys-release.md), with or without a daemon, which the
|
|
NixOS module's unit runs after the daemon stops. When KWin restarts, the daemon registers the
|
|
keys again with the new KWin.
|
|
|
|
## Asking komorebi what it is doing
|
|
|
|
The daemon answers questions on its socket, and these commands print the answers:
|
|
|
|
- [`komorebic state`](../cli/state.md): every monitor, with its workspaces, their
|
|
containers and the windows in them, as JSON.
|
|
- [`komorebic monitor-information`](../cli/monitor-information.md): the id, the name and
|
|
the bounds of every monitor, as JSON.
|
|
- [`komorebic query`](../cli/query.md): one value, the answer to one question: the index of
|
|
the focused monitor, workspace, container or window, the layout of the focused workspace,
|
|
whether the focused container is a single window or a stack, or the version of the
|
|
daemon.
|
|
|
|
```sh
|
|
komorebic query focused-workspace-index
|
|
komorebic state | jq '.monitors.elements[0].workspaces.elements[0].containers.elements | length'
|
|
```
|
|
|
|
[`komorebic retile`](../cli/retile.md) tiles the windows of every monitor again, which puts
|
|
a window that was moved by hand back on its tile.
|
|
|
|
When the daemon is not running, these commands fail: there is no socket to write to.
|
|
|
|
A program that wants to know what komorebi does without asking can subscribe to its
|
|
notifications instead ([Subscribing to notifications](subscribing-to-notifications.md)).
|
|
|
|
## The socket and the data directory
|
|
|
|
The daemon listens on `komorebi.sock` in its data directory, `$XDG_RUNTIME_DIR/komorebi`
|
|
(the local data directory, `~/.local/share/komorebi`, when there is no runtime directory).
|
|
[`komorebic data-directory`](../cli/data-directory.md) prints the directory, if it exists.
|
|
|
|
## The log
|
|
|
|
The daemon logs to its standard output and to a file a day in `~/.local/share/komorebi`
|
|
(`$XDG_DATA_HOME/komorebi` when that is set): `komorebi.log.YYYY-MM-DD`, with colors, and
|
|
`komorebi_plaintext.log.YYYY-MM-DD`, without. The day is the UTC date.
|
|
|
|
[`komorebic log`](../cli/log.md) follows the file of the current day, with colors, until
|
|
you press Ctrl-C. The `--log-level` of `komorebi` sets how much is logged: `error`, `warn`,
|
|
`info` (the default), `debug` or `trace`.
|
|
|
|
## Shell completions
|
|
|
|
[`komorebic completions`](../cli/completions.md) prints a completion script for bash,
|
|
elvish, fish, PowerShell or zsh:
|
|
|
|
```sh
|
|
komorebic completions fish > ~/.config/fish/completions/komorebic.fish
|
|
komorebic completions bash > ~/.local/share/bash-completion/completions/komorebic
|
|
```
|
|
|
|
## Every command
|
|
|
|
[`docs/linux/cli/start.md`](../cli/start.md) has a page for every `komorebic` command, generated from its
|
|
help with `just docgen`.
|