Commit Graph

490 Commits

Author SHA1 Message Date
Aram Drevekenin
52de5b7db0
fix(cli): new-tab now also looks in layout_dir for layouts (#2198)
* fix(cli): the new-tab action now also searches for layouts in the layout dir

* style(fmt): rustfmt

* fix(tests): add missing parameter to cli action
2023-02-26 22:11:08 +01:00
Aram Drevekenin
5bcc1bb382
fix(layout): various parser and ui fixes (#2191)
* fix(layout): error on nodes outside layout node

* fix(layout): move stacked property to pane

* fix(layout): various stack exceptions

* fix(ui): non-flexible stacked pane titles now take up their full length

* fix(ui): stack titles with no-pane-frames take up their proper length

* style(fmt): rustfmt
2023-02-25 11:16:11 +01:00
Aram Drevekenin
f1ff272b0b
feat(ui): swap layouts and stacked panes (#2167)
* relayout working with hard coded layout

* work

* refactor(layout): PaneLayout => TiledPaneLayout

* tests passing

* tests passing

* tests passing

* stacked panes and passing tests

* tests for stacked panes

* refactor(panes): stacked panes

* fix: focusing into stacked panes from the left/right

* fix(layouts): handle stacked layouts in the middle of the screen

* fix(pane-stack): focus correctly when coming to stack from above/below

* fix(stacked-panes): resize stack

* fix(stacked-panes): focus with mouse

* fix(stacked-panes): focus next pane

* fix(layout-applier): sane focus order

* fix(stacked-panes): better titles for one-liners

* fix(stacked-panes): handle moving pane location in stack

* fix(relayout): properly calculate display area

* fix(relayout): properly calculate rounding errors

* fix(stacked-panes): properly handle closing a pane near a stack

* fix(swap-layouts): adjust swap layout sort order

* feat(swap-layouts): ui + ux

* fix(swap-layouts): include base layout

* refactor(layout): remove unused method

* fix(swap-layouts): respect pane contents and focus

* work

* fix(swap-layouts): load swap layouts from external file

* fix(swap-layouts): properly truncate layout children

* fix(stacked-panes): allow stacked panes to become fullscreen

* fix(swap-layouts): work with multiple tabs

* fix(swap-layouts): embed/eject panes properly with auto-layout

* fix(stacked-panes): close last pane in stack

* fix(stacked-panes): move focus for all clients in stack

* fix(floating-panes): set layout damaged when moving panes

* fix(relayout): move out of unfitting layout when resizing whole tab

* fix(ui): background color for swap layout indicator

* fix(keybinds): add switch next layout in tmux

* fix(ui): swap layout indication in compact layout

* fix(compact): correct swap constraint

* fix(tests): tmux swap config shortcut

* fix(resizes): cache resizes so as not to confuse panes (eg. vim) with multiple resizes that it debounces weirdly

* feat(cli): dump swap layouts

* fix(ui): stacked panes without pane frames

* fix(ux): move pane forward/backwards also with floating panes

* refactor(lint): remove unused stuff

* refactor(tab): move swap layouts to separate file

* style(fmt): rustfmt

* style(fmt): rustfmt

* refactor(panes): various cleanups

* chore(deps): upgrade termwiz to get alt left-bracket

* fix(assets): merge conflicts of binary files

* style(fmt): rustfmt

* style(clippy): no thank you!

* chore(repo): remove garbage file
2023-02-17 12:05:50 +01:00
Thomas Linford
c161766fc9
chore(deps): update termwiz to v0.20.0 (#2169)
fix unparsed horizontal scroll escape sequences
2023-02-17 11:01:47 +01:00
Jae-Heon Ji
00cd33637b
feat: add args to new-tab action (#2072)
* fix(themes): missing tokyo-night-dark theme

* feat: add args to new-tab action

* fix: name can be set without layout

* feat: pass config options to action parser

* chore: remove unnecessary default values

* chore: update snapshots

* fix(status-bar): add exception for NewTab

* fix: update code review

* feat: add shallow_eq for action
2023-02-16 22:32:27 +09:00
har7an
5eb2d055ff
cleanups around "buffer full" error (#2136)
* server/os_i_o: Add fixme to IPC queue

between server and client, explaining why the queue has its current
length.

* utils/ipc: Don't advertise terminal emulators

and use a more generic phrasing instead. zellij as application isn't the
place to recommend specific terminals to use it with.

* style(comment): redraw-on-backpressure comment

---------

Co-authored-by: Aram Drevekenin <aram@poor.dev>
2023-02-09 19:40:23 +00:00
哇呜哇呜呀咦耶
99e8d56adb
feat(cli): add GoToTabName action to switch tab by name (#2120)
* Add `GoToTabName` action to switch tab by name

* rm blank file

* add --create option

* format

* add some doc

* add test case

* format

* add test case

* change variable name
2023-02-07 15:45:59 +01:00
Yves Biener
650aeb12be
feat: add ScrollToTop action (#2110) 2023-01-24 21:51:11 +09:00
har7an
beddfb77a8
Improve client disconnect handling (#2068)
* xtask/run: Use varargs when run with `-data-dir`

Previously any additional arguments passed on the command line were
ignored. Now they are appended to `cargo run ...` as documented.

* server/os_i_o: Improve error message when IPC dies

and display the last send/recv error to the user instead of a generic
"Buffer full" message.

* server/lib: Log error in `send_to_client!`

so we will know when an error occured while trying to send a message to
the client. The most likely cause for this is that the client buffer
filled up and hence we cannot send any new messages. While we still
disconnect the client as before, now we also write a log message that
explains the situation.

* utils/channel: Apply rustfmt

* server/lib: Detect when client responds too slow

and log a message before disconnecting it.

* server/os_i_o: Add retry queue to client senders

that is dynamically allocated on-demand and stores `ServerToClientMsg`
in case the regular IPC channel is currently full. This acts as a
dynamic buffer to hold and buffer messages for a while until the client
hopefully catches up.

Also write a message to the log to indicate when the client is
recognized to be too slow in handling server messages.

* server: apply rustfmt

* utils/ipc: Add session name to "Disconnect" error

* utils/ipc: Fix error message indent

* server/os_i_o: Undo IPC channel extension

via `Vec` and drastically increase the IPC message queue size instead.
Measurements didn't discover a drastic increase in RAM caused by this,
and it is a much easier fix for the problem at hand.

* CHANGELOG: Add PR #2068
2023-01-22 18:04:40 +00:00
har7an
b274fc5ab1
errors: handle missing plugin caches (#2093)
* server/plugins: Always recreate plugin folders

in case they aren't existent and don't mark errors to do so as
non-fatal. The latter masks the underlying cause when e.g. the `.cache`
folder is, for some reason, not writable by zellij (See #2092), whereas
the former fixes problems arising from the user having purged their
.cache/zellij folder entirely.

* utils/errors: Rewrite panic message

* changelog: Add PR #2093
2023-01-19 18:17:33 +00:00
Cason Adams
ad21f81ac0
add tmux close pane key (#2058)
* add tmux close pane key

* chore: update snapshots for new keybind

Co-authored-by: Jae-Heon Ji <atx6419@gmail.com>
2023-01-03 22:47:39 +09:00
Aram Drevekenin
02e80860a2 style(fmt): rustfmt 2022-12-24 16:29:54 +01:00
Aram Drevekenin
a0b0f0e852 style(clippy): fix clippy lint 2022-12-24 16:06:16 +01:00
Aram Drevekenin
799fa5de8d
Floating panes in layouts (#2047)
* work

* tests passing

* tests: floating panes in layouts

* panes(plugins): floating plugins working

* refactor(tab): layout applier

* style(comment): remove outdated

* style(fmt): rustfmt
2022-12-24 15:48:04 +01:00
Aram Drevekenin
1b5f3c52a4
fix(panes): show visual error when failing to resize panes (#2036)
* fix(panes): show visual error when failing to resize pane vertically/horizontally

* fix(resize): retry pane resize on rounding errors

* fix(resize): proper error when resizing other panes into fixed panes

* style(fmt): rustfmt
2022-12-19 12:48:43 +01:00
har7an
d1f50150f6
WIP: Use xtask as build system (#2012)
* xtask: Implement a new build system

xtask is a cargo alias that is used to extend the cargo build system
with custom commands. For an introduction to xtask, see here:
https://github.com/matklad/cargo-xtask/

The idea is that instead of writing makefiles, xtask requires no
additional dependencies except `cargo` and `rustc`, which must be
available to build the project anyway.

This commit provides a basic implementation of the `build` and `test`
subcommands.

* xtask/deps: Add 'which'

* xtask/test: Handle error when cargo not found

* xtask/flags: Add more commands

to perform different useful tasks. Includes:

- clippy
- format
- "make" (composite)
- "install" (composite)

Also add more options to `build` to selectively compile plugins or leave
them out entirely.

* xtask/main: Return error when cargo not found

* xtask/build: Add more subtasks

- `wasm_opt_plugins` and
- `manpage`

that perform other build commands. Add thorough documentation on what
each of these does and also handle the new `build` cli flags
appropriately.

* xtask/clippy: Add job to run clippy

* xtask/format: Add job to run rustfmt

* xtask/pipeline: Add composite commands

that perform multiple atomic xtask commands sequentially in a pipeline
sort of fashion.

* xtask/deps: Pin dependencies

* xtask/main: Integrate new jobs

and add documentation.

* xtask: Implement 'dist'

which performs an 'install' and copies the resulting zellij binary along
with some other assets to a `target/dist` folder.

* cargo: Update xflags version

* xtask: Measure task time, update tty title

* xtask: Update various tasks

* xtask: wasm-opt plugins in release builds

automatically.

* xtask/build: Copy debug plugins to assets folder

* xtask: Add 'run' subcommand

* xtask: Add arbitrary args to test and run

* xtask: Rearrange CLI commands in help

* xtask: Add deprecation notice

* docs: Replace `cargo make` with `xtask`

* github: Use `xtask` in workflows.

* xtask: Add support for CI commands

* xtask: Streamline error handling

* github: Use new xtask commands in CI

* xtask: Add 'publish' job

* xtask/publish: Add retry when publish fails

* xtask: Apply rustfmt

* xtask: Refine 'make' deprecation warning

* xtask: add task to build manpage

* contributing: Fix e2e commands

* xtask/run: Add missing `--`

to pass all arguments following `xtask run` directly to the zellij
binary being run.

* xtask: Stay in invocation dir

and make all tasks that need it change to the project root dir
themselves.

* xtask/run: Add `--data-dir` flag

which will allow very quick iterations when not changing the plugins
between builds.

* xtask/ci: Install dependencies without asking

* utils: Allow including plugins from target folder

* utils/assets: Reduce asset map complexity

* utils/consts: Update asset map docs

* xtask: Fix plugin includes

* xtask/test: Build plugins first

because the zellij binary needs to include the plugins.

* xtask/test: Fix formatting

* xtask: Add notice on how to disable it
2022-12-17 13:27:18 +00:00
Aram Drevekenin
6e93e8ffce hotfix: update plugins to the latest versions so we can develop 2022-12-15 09:55:27 +01:00
Aram Drevekenin
c3115a428e
fix(panes): show visual error when unable to split panes vertically/horizontally (#2025)
* fix(panes): show visual error when failing to split pane vertically/horizontally

* fix: lockfile
2022-12-14 22:26:48 +01:00
Andreas Hartmann
177cd20bea chore: Bump development version 2022-12-13 17:24:19 +01:00
Andreas Hartmann
5cd412bde0 chore(release): v0.34.4 2022-12-13 15:10:15 +01:00
Andreas Hartmann
962f37e767 chore: Bump development versions 2022-12-13 14:59:49 +01:00
Aram Drevekenin
67ac1190a7 chore(release): v0.34.3 2022-12-09 12:11:03 +01:00
Aram Drevekenin
0598a84e1f chore(version): patch version due to CI difficulties 2022-12-09 12:09:07 +01:00
Aram Drevekenin
934439eb3d chore(release): add plugins 2022-12-09 12:07:19 +01:00
Aram Drevekenin
fba273eebb chore(version): patch version due to CI difficulties 2022-12-09 12:01:20 +01:00
Aram Drevekenin
adab6b8363 chore(version): patch version due to CI difficulties 2022-12-09 11:44:36 +01:00
har7an
1e141aa7fe
HOTFIX: utils: Move plugins into new assets folder (#2003)
that is included in the utils to make builds pass.
2022-12-09 10:49:32 +00:00
har7an
36233439f9
HOTFIX: Feature/ignore asset map (#2002)
* utils: feature-gate asset map

to make publishing on crates.io possible without compile errors.

* setup: Fix asset_map feature
2022-12-09 10:17:28 +01:00
har7an
62eaea1583
Reimplement resize code (#1990)
* server/floating_panes: Start removing `unwrap`s

* server/panes: Remove more `unwrap`s

in floating panes code.

* utils/data: Unify `Direction` type

which was previously present in multiple locations.
Also start working on a new Resize Method (type `ResizeStrategy`), to
remove code duplication in the resize code.

* server: Implement new resize handling

with the `ResizeStrategy` type. Add a new action with the ability to
invoke it from the CLI. Take care to maintain backwards-compatibility in
terms of configuring the new resize mode.

* utils/layout: Add conversion for SplitDirection

from `data::Direction`.

* utils/data: Add impl for `Direction`

* server/panes: Rework tiled pane resizing

but it's currently still broken in a few regards and misses ability to
perform "regular" increase/decrease.

* server/panes/tiled_panes: Add debug assertion

to catch if the total area of all panes (in percent) is different from
100.0 at some point.

* server/panes/tiled/grid: Fix resize bug

caused by the fact that neighboring plugin panes previously weren't
filtered from resize operations, even though they cannot be resized at
all.

* utils/data: Add `invert` for `Resize`

* utils/data: Add member to `ResizeStrategy`

that controls whether we invert resize behavior when increasing size
towards a bounadry. This maintains current behavior.

* server/screen: Handle new attribute

in `ResizeStrategy`

* server/panes/resizer: Return `anyhow::Error`

* server/panes/tiled: Implement resize increase/decrease

without specifying a direction (towards all possible directions).
Currently broken in some cases.

* server/pane/tiled/grid: Don't return early

to preserve resize debug assertions.

* server/pane/tiled/grid: Fix resize bug

caused by checking for the wrong alignments in some cases. Also refactor
the code for looking up aligned panes.

* server/panes/tiled/grid: Cleanup code

and remove log statements and unused functions.

* server/panes/float/grid: Invert resize

if the floating pane is hitting a boundary already.

* plugins/status-bar: Add hints for new resize

* server: Use new resize method

* server: Fix tests

with new functions and result types.

* apply rustfmt

* utils: Apply rustfmt

* server/panes/floating: Fix resize increase

behavior which would previously, upon hitting a boundary, cause the pane
to invert the resize operation, which is wrong. Instead, it now does not
resize floating panes on an undirected resize "increase" in directions
where it hits boundaries.

* server/panes/tiled: Use correct resize increments

The values for the resize increments were previously wrong, causing many
of the tests to fail.

* server/panes/tiled: Fix resize checks

to correctly consider fixed-size panes.

* utils/assets/config: Update default config

with new keybindings for resize mode.

* server/panes/tiled: Fix resize check

* server/panes/tiled: Use shortener for `Direction`

type in `change_pane_size` function.

* server/panes/tiled: Restore resize behavior

for undirected resizes, to the way it was before this PR.

* server/panes/floating: Fix resize increment

for undirected resizes

* utils/data: Fix doctest

* utils: Fix test snapshots

for tests working with the default config

* changelog: Add PR #1990
2022-12-08 12:50:28 +00:00
Aram Drevekenin
f8a078c1a9
feat(ux): show loading screen (#1997)
* feat(ux): show loading prompt

* style(fmt): rustfmt
2022-12-07 15:03:58 +01:00
har7an
81287a276f
errors: Maintain caller location in to_log (#1994)
* utils/errors: Add caller location to `to_log`

by building the log record manually and filling in the callers file and
line manually. It is currently not possible to determine a callers
module, hence the module is now set to "???" in all log entries logged
this way. Nonetheless, the file and line number are sufficient to find
the logs source.

* utils/errors: Reimplement `to_log`

default implementation in the `LoggableError` trait.

* changelog: Add PR #1994

errors: Maintain caller location in `to_log`
2022-12-07 07:51:23 +00:00
Aram Drevekenin
b7adfcc581
refactor(plugins): fix plugin loading data flow (#1995) 2022-12-06 15:34:43 +01:00
har7an
11b0210de5
plugins: rework plugin loading (#1924)
* zellij: Move "populate_data_dir" to utils

and rewrite it to take a second, optional parameter. This allows
controlling whether only a specific asset should be installed. We do
this as preparation for being able to recover from a plugin version
mismatch error, where we will need to repopulate the data dir for
offending plugins.

* server/wasm_vm: Recover from PluginVersionMismatch

Adds a global plugin cache that stores, per plugin config, the wasmer
module associated with it. Make `start_plugin` take the pre-populated
module and create only the necessary modifications to the wasm env etc.

* utils: Fix formatting

* zellij: Delete non-existent module

* utils/shared: fix missing "set_permissions"

function when not on unix systems.

* server/wasm_vm: Don't populate cachedir

with serialized versions of the WASM plugins.

* utils/input/plugins: load wasm bytes from assets

for builtin plugin specifications. This foregoes any need to:

- Dump the plugin bytes to disk at all and
- subsequently read the plugin bytes from disk

* zellij: Disable default asset installation

which previously installed only the builtin plugins to disk. This is no
longer necessary because now we can load the builtin plugins directly
from the application binary.

* utils/input/plugins: Update docs

* utils/input/plugins: Add 'is_builtin' method

to `PluginConfig` that returns true if the plugin configuration refers
to a builtin plugin.

* wasm_vm: Remove plugin version mismatch handling

because a version mismatch in an internal plugin is now unfixable, with
the plugins being loaded from the running binary, and we have no control
over external plugins in the first place.

* cargo: Reintroduce feature flag

for `disable_automatic_asset_installation`

* utils/consts: Add `ASSET_MAP`

which currently contains the compiled WASM plugins.

* utils/shared: Fix clippy lint

* utils/errors: Add more `ZellijError` variants

* zellij: Make loading internal plugins optional

by reenabling the `disable_automatic_asset_installation` flag and
utilizing it for this purpose. Changes plugin search behavior to throw
better errors in case the builtin plugins cannot be found, depending on
the state of this feature.

* utils/errors: Apply rustfmt

* utils/setup: Allow dumping builtin plugins

to a specified folder on disk. This is meant to be an "escape hatch" for
users that have accidentally deleted the builtin plugins from disk (in
cases where the plugins aren't loaded from inside the zellij binary).

* utils/input/plugins: Update docs

* utils/setup: Add hint to `setup --check` output

when zellij was built without the `disable_automatic_asset_installation`
flag and will thus not read builtin plugins from the "PLUGIN DIR".

* utils/setup: Refine `setup --dump-plugins`

to dump to:

- The default "DATA DIR" when no option is provided with the argument,
  or
- The provided option, if existent

Also print a message to stdout with the destination folder that the
plugins are dumped to.

* server/wasm_vm: Ignore "NotFound" errors

when attempting to delete the non-existent plugin data directories. This
silences an error message that otherwise ends up in the logs when
quitting zellij.

* utils/errors: Extend "BuiltinPluginMissing" msg

to hint the user to the `zellij setup --dump-plugins` command to fix
their issues for them!

* utils/errors: Track caller in calls to `non_fatal`

which will hopefully, once closures can be annotated, allow us to
display the location of the call to `non_fatal` in log messages.

* utils/input/plugins: Fix plugin lookup

to prefer internal assets if available. It was previously broken because
sorting the paths vector before deduping it would bring the paths into a
wrong order, looking up in the plugin folder first.

Also print a log message when a plugin is being loaded from the internal
assets but exists on disk, too.

* Apply rustfmt

* make: build-e2e depends on wasm-opt-plugins

so it updates the assets when building the binary

* server/qwasm_vm: Remove var

* utils/consts: Add plugins from target folder

and include them in the asset map from there, too. Include plugins from
debug or release builds, depending on the build type.

* utils/consts: Take release plugins from assets

instead of the target/release folder. The latter will break
installations from crates.io, because we currently rely on including the
plugins we pre-compiled and distribute along with the binary.

* server/wasm_vm: Reintroduce .cache folder

to speedup subsequent application launches.

* cargo: Reorder workspace members

to improve behavior with `cargo make` with respect to compilation order.

* Makefile: restructure plugin tasks

* Makefile: Fix CI errors

* Makefile: More CI diagnosis

* github: Install wasm-opt in e2e test workflow

* Makefile: Build plugins for e2e-test target

* server/Wasm_vm: Reorder plugin folder creation

so no folders are created in the plugin cache when loading a plugin
fails due to not being present or similar.

* update plugins testcommit

* makefile: Change job order

* changelog: Add PR #1924
2022-11-22 20:06:02 +00:00
Aram Drevekenin
cc3ac25c74
fix(cli): measure cwd from cli client rather than the zellij server (#1947)
* fix(cli): measure cwd from cli client rather than the zellij server

* style(fmt): rustfmt
2022-11-16 16:25:01 +01:00
Aram Drevekenin
3d2a6d6a5a
refactor(plugins): change the data flow (#1934)
* refactor(plugins): do not block render loop

* refactor(plugins): cleanup

* style(fmt): rustfmt

* fix(plugins): various rendering pipeline fixes
2022-11-15 12:21:36 +01:00
har7an
342d1629d0
Errors: Ignore errors from async when quitting (#1918)
* utils/errors: Fix function order in `to_anyhow`

impl for `SendError`. Previously we attached the context to `anyhow!`,
which is wrong (because it doesn't create an `Err` type itself) and
leads to strange behavior where the error seemingly is immediately
panicked upon.

Instead, Wrap `anyhow!` into an `Err()` and then attach the context to
that. This achieves the intended goal and doesn't lead to premature
termination.

* server/terminal_bytes: Ignore error in `listen`

which occurs when quitting zellij with the `Ctrl+q` keybinding. At the
end of the `listen` function we break out of a loop and send a final
`Render` instruction to the Screen. However, when quitting zellij as
mentioned above, the Screen thread is likely dead already and hence we
cannot send it any Instructions. This causes an error in the async tasks
of the panes that handle reading the PTY input.

If we leave the error unhandled, we will have error messages in the log
whenever we quit zellij, even though the application exited normally.
Hence, we now send the final `Render` instruction but do not care
whether it is sent successfully or not.

This is a "workaround" for the fact that we cannot tell whether the
application is quitting or not.

* server/terminal_bytes: Add FIXME note

* changelog: Add PR #1918

don't log errors from async pane threads when quitting zellij
2022-11-12 10:18:15 +00:00
Aram Drevekenin
a71b2ae890 chore(version): bump development version 2022-11-10 11:48:09 +01:00
Jonathan LEI
cbec62c71a
chore(deps): bump termwiz to 0.19.0 (#1896)
* chore(deps): bump termwiz to 0.19.0

* chore: bump MSRV to 1.60
2022-11-09 17:24:41 +01:00
har7an
48bc2281c7
Fix: better error reporting when failing to load plugins (#1912) (#1914)
* utils/input/plugins: Return `Result` when loading

a plugin and failing to find it. Since we look up the plugin in multiple
locations, make sure we preserve each of these lookup failures and
report them to the user. This way the user can see what locations were
actually checked.

In addition, before performing the lookup, deduplicate the array of
locations to check. This prevents errors where we look up the same
plugin multiple times in the exact same locations, which can leave a bad
impression on anyone reading it who isn't familiar with the code.

* server/wasm_vm: Remove obsolete context

which was previouly required because the function it is attached to
returned only an `Option` instead of a `Result`.
2022-11-09 07:28:02 +00:00
Jonathan LEI
6c79ff9b31
fix: use temp_dir for getting temp folder (#1898) 2022-11-08 16:39:30 +01:00
raphCode
0477d93444
Do not advertise 24 bit color support unchecked (#1900)
* Fix bat syntax colors when using mosh

Original reason for this line according to Aram:
I set this variable as part of the Sixel support to get notcurses to
work properly. I tried communicating with the notcurses maintainers
about a workaround for this, but to no avail.

* Changelog

* Improve changelog message

* Remove empty function
2022-11-08 13:33:35 +01:00
Aram Drevekenin
9ebc9b74ee
fix(edit): treat cwd properly (#1904) 2022-11-03 11:06:37 +01:00
Jae-Heon Ji
ccc007eb15
fix(keybinds): remove space key from shared_except (#1884)
* fix(keybinds): remove space key from shared_except

* chore: update snapshots
2022-11-02 20:15:21 +09:00
har7an
e45a3e5826
errors: Don't unwrap in server::os_input_output (#1895)
* server/os_io: Redefine `ServerOsApi` result types

to use `anyhow::Result` instead. This mostly makes the need of custom
`SpawnTerminalError` obsolete (tbd in subsequent commits) and unifies
error handling across the application.

* utils/errors: Implement new `ZellijError` type

to replace any previously defined, isolated custom error types
throughout the application. Currently implements all error variants
found in `SpawnTerminalError`.

In the long term, this will allow zellij to fall back to a single error
type for all application-specific errors, instead of having different
error types per module.

* server/unit/screen: Impl new `ServerOsApi`

with updated `Result`-types.

* server/tab/unit: Impl new `ServerOsApi`

with updated `Result`-types.

* server/os_io: Impl new `ServerOsApi`

with updated `Result`-types.

* utils/ipc: Return `anyhow::Error` in `send`

rather than a `&'static str`, which isn't compatible with
`anyhow::Context`.

* server/tab: Handle `Result` in `resize_pty!`

which is returned due to the changed return types in `ServerOsApi`.

* server/tab: Handle new `Result`s

originating in the change to the `ServerOsApi` trait definition.

* server/screen: Handle new `Result`s

originating in the change to the `ServerOsApi` trait definition.

* server/panes/tiled: Handle new `Result`s

originating in the change to the `ServerOsApi` trait definition.

* server/panes/floating: Handle new `Result`s

originating in the change to the `ServerOsApi` trait definition.

* server/lib: Unwrap on new `Result`s

originating in the change to the `ServerOsApi` trait definition. The
functions here don't return a `Result` yet, this is better left to a
follow-up PR.

* server: Remove `SpawnTerminalError`

and make use of the new `ZellijError` instead. Make use of `anyhow`s
downcast capabilities to restore the underlying original errors where
necessary, as was done previously. This gives us the flexibility to
attach context information to all errors while still allowing us to
handle specific errors in greater detail.

* server/pty: Fix vars broken in rebase

* server/os_io: Remove last `SpawnTerminalError`

* changelog: Add PR #1895
2022-11-02 05:29:50 +00:00
Aram Drevekenin
abc700fc4d
feat(command-panes): allow to start suspended (#1887)
* feat(command-panes): allow panes to start suspended

* style(fmt): remove unused code

* style(fmt): rustfmt
2022-11-01 09:07:25 +01:00
Thomas Linford
855711ebb8
feat(mouse): allow toggling mouse mode at runtime (#1883) 2022-10-31 17:04:38 +01:00
Thomas Linford
ea86b2f4bc
fix: resolve setup --clean panic (#1882)
Do not use Config::default()

default() has empty plugins config and that does not work with the default layout.
Use Config::try_from() instead, since it already handles the clean flag.
Also, do not check the clean flag twice, it is already handled in Config::try_from.
2022-10-31 16:37:45 +01:00
Jae-Heon Ji
38d23d7218
feat: support multiple themes in one file (#1855)
* feat: support multiple themes in a one file

* chore: update example of multiple themes to gruvbox
2022-10-28 22:48:51 +09:00
Aram Drevekenin
c97b972383
feat(command-panes): optionally allow panes to be closed on exit (#1869)
* feat(cli): allow option to close command pane on exit

* feat(layouts): allow option to close command panes on exit

* style(fmt): rustfmt
2022-10-28 13:03:37 +02:00
Aram Drevekenin
5793af7655 chore(version): bump development version 2022-10-25 11:43:53 +02:00
Aram Drevekenin
88647ae275
fix(various): minor fixes before 32 (#1841)
* fix(layouts): point to layout documentation

* adjust shell completions

* comment about clear-defaults in the config
2022-10-24 19:21:03 +02:00
Jae-Heon Ji
2fc6cefb95
chore: add help to cli options (#1839) 2022-10-24 00:46:01 +09:00
har7an
75801bdb0e
plugins: Improve error handling on plugin version mismatch (#1838)
* server/tab: Don't panic in `Pane::render`

and do not crash the application on failure to receive a render update
from plugins any longer. Instead, will print a simple string with a hint
to check the application logs, where a more thorough error indication
can be found.

* utils/errors: re-export `anyhow::Error`

to create ad-hoc errors with custom error types, without having to wrap
them into a `context()` before to turn the into anyhow errors.

* plugins: Check plugin version on startup

and terminate execution with a descriptive error message in case the
plugin version is incompatible with the version of zellij being run.

* server/wasm_vm: Add plugin path in version error

so the user knows which plugin to look at in case they're using custom
plugins.

* server/wasm_vm: Check plugin version for equality

Previously we would accept cases where the plugin version was newer than
the zellij version, which doesn't make a lot of sense.

* server/wasm_vm: Prettier error handling

in call to `wasmer::Function::call` in case a plugin version mismatch
can occur.

* tile: Install custom panic handler

that will print the panic message to a plugins stdout and then call a
panic handler on the host that turns it into a real application-level
panic.

* tile: Catch errors in event deserialization

and turn them into proper panics. These errors are symptomatic of an
uncaught plugin version mismatch, for example when developing from main
and compiling zellij/the plugins from source. Normal users should never
get to see this error.

* utils/errors: Improve output in `to_stdout`

for anyhow errors. The default anyhow error formatting of `{:?}` is
already very good, and we just made it worse by trying to invent our own
formatting.

* tile: Reword plugin mismatch error message

* zellij: Apply rustfmt

* changelog: Add PR #1838

Improve error handling on plugin version mismatch.

* server/wasm_vm: Rephrase error in passive voice
2022-10-23 13:14:24 +00:00
Aram Drevekenin
e62bb93df3
fix(layouts): various bugs and better errors (#1831)
* fix(layout): error on percent size 0

* fix(command): better error on invalid commands

* fix(layouts): better error on unknown pane nodes

* fix(layouts): disallow certain template names

* style(fmt): rustfmt
2022-10-20 20:16:46 +02:00
har7an
a56723f7ce
errors: Don't panic in wasm_vm (#1827)
* server/wasm_vm: Compact module imports

* utils/errors: Impl `to_anyhow` for PoisonError

which is returned by calls to `lock` on various types of locks from
`std`. In our case, some of the locks we try to acquire in `wasm_vm` can
contain an `mpsc::Sender`, which is `!Send` and hence doesn't work with
`anyhow`. Turn the `PoisonError` into an error string instead and
returns that as `anyhow::Err`.

* wasm_vm: Remove calls to `unwrap`

in the WASM VM codes server API. Note that this doesn't include the
Plugin APIs. Mark the error as `fatal` in `server/lib`, where the wasm
thread is created.

This will cause zellij to report a proper error (and log it) when any of
the plugin-related functions fails. Unfortunately, this closes the
channel to the WASM thread. Hence, when loading the plugins upon startup
fails, the error reported in the terminal (visible to the user) hints
towards a call in `plugin_pane` being the culprit. However, the real
error will be contained in the logs.

Also add an error message and print it to the user in case that the
plugin failure was caused by a plugin version mismatch.

* server/wasm_vm: Restore panic on failure to load

plugins.

* server/wasm_vm: Add fix to plugin mismatch error

* server/panes/plugin_pane: Hint to logs

when failing to receive a message from the plugins for rendering pane
contents.
2022-10-20 15:49:04 +00:00
Aram Drevekenin
b94a626959
fix(command): better error when command not found (#1829)
* fix(command): better error when command not found

* fix(cli): open edit file from current cwd

* style(fmt): rustfmt?
2022-10-20 17:27:44 +02:00
Aram Drevekenin
e59b09a1b6
feat(layouts): allow defining a tab cwd (#1828) 2022-10-20 15:23:20 +02:00
Dan Näsman
2e70a4c672
allow dump_screen() to only dump the viewport (#1794)
* allow dump_screen() to only dump the viewport

* add additional implementations

* set full default as false
2022-10-19 22:49:13 +09:00
Aram Drevekenin
81081bc2c2
chore(deps): upgrade log4rs (#1814) 2022-10-19 09:23:56 +02:00
Aram Drevekenin
271abb3ea2
feat(cli): zellij run improvements (#1804)
* feat(cli): move command to the end of the cli arguments

* feat(cli): allow naming panes from the command line

* fix(cli): adjust actions after pane rename

* feat(cli): zellij run completions for fish

* feat(cli): zellij run completions for bash and zsh

* style(fmt): rustfmt

* fix(e2e): fix run test and snapshot

* style(fmt): rustfmt
2022-10-17 19:39:37 +02:00
har7an
f26e73ce03
Log thread_bus IPC messages only in debug mode (#1800)
* zellij: Add global `DEBUG_MODE` variable

that tells us whether zellij was started with the `--debug` CLI flag.

* utils/errors: Only log thread_bus message in debug

mode, and discard the message otherwise.

* utils/logging: Increase logsize to 16 MiB

per logfile, totaling 32 MiB of logs at most (in two files).

* zellij: Set global `DEBUG` variable in server

thread and make sure the value of the `--debug` CLI flag is propagated
to the server, too.

This means that to enable debug mode, the server must be started with
the `--debug` flag. This happens when the first client that starts the
zellij session has the `--debug` flag set, because it will be forwarded
to the server. Subsequent clients attaching to the same session with the
`--debug` flag specified **do not** override the value of the `DEBUG`
variable. Hence, if the server wasn't started in debug mode, this cannot
be changed.
2022-10-17 15:34:06 +00:00
Aram Drevekenin
efceb562de
feat(layouts): edit panes (#1799)
* feat(layouts): edit panes

* style(fmt): rustfmt
2022-10-14 17:44:23 +02:00
Aram Drevekenin
d074bb1cda
feat(layouts): global cwd (#1798)
* feat(layouts): allow defining a global cwd

* feat(layouts): allow passing global cwd from cli

* style(fmt): rustfmt

* fix(layouts): error on mixed cwd and pane children
2022-10-14 15:08:32 +02:00
Aram Drevekenin
bece86b95c
fix(layouts): various kdl layout issues and features (#1797)
* fix(layouts): error on non-bare children node

* refactor(layout): consolidate split direction parsing

* refactor(layout): remove unused import

* fix(layouts): log error when there is no room for layout

* fix(layout): error on size 0

* feat(layouts): allow pane templates to override template command attributes

* style(fmt): rustfmt
2022-10-13 13:55:16 +02:00
Aram Drevekenin
ad93a14000
fix(cli): use provided session-name (#1793) 2022-10-12 15:35:19 +02:00
Aram Drevekenin
536e0b7ca5
fix(layouts): duplicate layout definition error (#1792)
* fix(layouts): error on duplicate definitions

* style(fmt): rustfmt
2022-10-12 14:29:36 +02:00
Aram Drevekenin
a13aacf583
fix(layouts): error on mixed nodes (#1791)
* fix(layouts): error on mixed nodes

* style(fmt): rustfmt

* style(clippy): make clippy happy
2022-10-12 13:03:21 +02:00
Aram Drevekenin
c64bf5207a
feat(ux): rerun command pane (#1787)
* chore(config): default kdl keybindings config

* tests

* work

* refactor(config): move stuff around

* work

* tab merge layout

* work

* work

* layouts working

* work

* layout tests

* work

* work

* feat(parsing): kdl layouts without config

* refactor(kdl): move stuff around

* work

* tests(layout): add cases and fix bugs

* work

* fix(kdl): various bugs

* chore(layouts): move all layouts to kdl

* feat(kdl): shared keybidns

* fix(layout): do not count fixed panes toward percentile

* fix(keybinds): missing keybinds and actions

* fix(config): adjust default tips

* refactor(config): move stuff around

* fix(tests): make e2e tests pass

* fix(kdl): add verbose parsing errors

* fix(kdl): focused tab

* fix(layout): corret default_tab_template behavior

* style(code): fix compile warnings

* feat(cli): send actions through the cli

* fix(cli): exit only when action is done

* fix(cli): open embedded pane from floating pane

* fix(cli): send actions to other sessions

* feat(cli): command alias

* feat(converter): convert old config

* feat(converter): convert old layout and theme files

* feat(kdl): pretty errors

* feat(client): convert old YAML files on startup

* fix: various bugs and styling issues

* fix: e2e tests

* fix(screen): propagate errors after merge

* style(clippy): lower clippy level

* fix(tests): own session_name variable

* style(fmt): rustfmt

* fix(cli): various action fixes

* style(fmt): rustfmt

* fix(themes): loading of theme files

* style(fmt): rustfmt

* fix(tests): theme fixtures

* fix(layouts): better errors on unknown nodes

* fix(kdl): clarify valid node terminator error

* fix(e2e): adjust close tab test

* fix(e2e): adjust close tab test again

* style(code): cleanup some comments

* get command panes not to exit on command exit

* separate terminal pane_ids from raw_fds

* render frame according to exit status

* re-run command on enter and close pane on ctrl-c

* proper error when command is not found

* make ui nicer

* initial pane title for command panes

* fix pane override bug

* reap terminal_ids from os_input_output on pane close

* bool floating flag

* some ui tweaks

* fix tests

* make rustfmt happy

* e2e test for command pane

* fix various concurrency issues

* rename command to run in the cli

* rustfmt

* style(fmt): rustfmt

* fix(e2e): command => run

* fix(e2e): command => run in snapshot too!
2022-10-11 16:45:46 +02:00
Bohdan Ivashko
39f33a9a9a
zellij-server: improve thread_bus error handling (#1775)
* zellij-server: improve thread_bus error handling

* zellij-server/thread_bus: get rid of option.unwrap

* zellij-utils/errors.rs: generic error in to_anyhow
2022-10-07 09:04:08 +00:00
har7an
6715f4629c
Server: Remove panics in tab module (#1748)
* utils/errors: Add `ToAnyhow` trait

for converting `Result` types that don't satisfy `anyhow`s trait
constraints (`Display + Send + Sync + 'static`) conveniently.

An example of such a Result is the `SendError` returned from
`send_to_plugins`, which sends `PluginInstruction`s as message type.
One of the enum variants can contain a `mpsc::Sender`, which is `!Sync`
and hence makes the whole `SendError` be `!Sync` in this case. Add an
implementation for this case that takes the message and converts it into
an error containing the message formatted as string, with the additional
`ErrorContext` as anyhow context.

* server/tab: Remove calls to `unwrap()`

and apply error reporting via `anyhow` instead. Make all relevant
functions return `Result`s where previously a panic could occur and
attach error context.

* server/screen: Modify `update_tab!`

to accept an optional 4th parameter, a literal "?". If present, this
will append a `?` to the given closure verbatim to handle/propagate
errors from within the generated macro code.

* server/screen: Handle new `Result`s from `Tab`

and apply appropriate error context and propagate errors further up.

* server/tab/unit: `unwrap` on new `Result`s

* server/unit: Unwrap `Results` in screen tests

* server/tab: Better message for ad-hoc errors

created with `anyhow!`. Since these errors don't have an underlying
cause, we describe the cause in the macro instead and then attach the
error context as usual before `?`ing the error back up.

* utils/cargo: Activate `anyhow`s "backtrace" feature

to capture error backtraces at the error origins (i.e. where we first
receive an error and convert it to a `anyhow::Error`). Since we
propagate error back up the call stack now, the place where we `unwrap`
on errors doesn't match the place where the error originated. Hence, the
callstack, too, is quite misleading since it contains barely any
references of the functions that triggered the error.

As a consequence, we have 2 backtraces now when zellij crashes: One from
`anyhow` (that is implicitly attached to anyhows error reports), and one
from the custom panic handler (which is displayed through `miette`).

* utils/errors: Separate stack traces

in the output of miette. Since we record backtraces with `anyhow` now,
we end up having two backtraces in the output: One from the `anyhow`
error and one from the actual call to `panic`. Adds a comment explaining
the situation and another "section" to the error output of miette: We
print the backtrace from anyhow as "Stack backtrace", and the output
from the panic handler as "Panic backtrace". We keep both for the
(hopefully unlikely) case that the anyhow backtrace isn't existent, so
we still have at least something to work with.

* server/screen: Remove calls to `fatal`

and leave the `panic`ing to the calling function instead.

* server/screen: Remove needless macro

which extended `active_tab!` by passing the client IDs to the closure.
However, this isn't necessary because closures capture their environment
already, and the client_id needn't be mutable.

* server/screen: Handle unused result

* server/screen: Reintroduce arcane macro

that defaults to some default client_id if it isn't valid (e.g. when the
ScreenInstruction is sent via CLI).

* server/tab/unit: Unwrap new results
2022-10-06 06:46:18 +00:00
Aram Drevekenin
79bf6ab868
feat(config): switch to kdl (#1759)
* chore(config): default kdl keybindings config

* tests

* work

* refactor(config): move stuff around

* work

* tab merge layout

* work

* work

* layouts working

* work

* layout tests

* work

* work

* feat(parsing): kdl layouts without config

* refactor(kdl): move stuff around

* work

* tests(layout): add cases and fix bugs

* work

* fix(kdl): various bugs

* chore(layouts): move all layouts to kdl

* feat(kdl): shared keybidns

* fix(layout): do not count fixed panes toward percentile

* fix(keybinds): missing keybinds and actions

* fix(config): adjust default tips

* refactor(config): move stuff around

* fix(tests): make e2e tests pass

* fix(kdl): add verbose parsing errors

* fix(kdl): focused tab

* fix(layout): corret default_tab_template behavior

* style(code): fix compile warnings

* feat(cli): send actions through the cli

* fix(cli): exit only when action is done

* fix(cli): open embedded pane from floating pane

* fix(cli): send actions to other sessions

* feat(cli): command alias

* feat(converter): convert old config

* feat(converter): convert old layout and theme files

* feat(kdl): pretty errors

* feat(client): convert old YAML files on startup

* fix: various bugs and styling issues

* fix: e2e tests

* fix(screen): propagate errors after merge

* style(clippy): lower clippy level

* fix(tests): own session_name variable

* style(fmt): rustfmt

* fix(cli): various action fixes

* style(fmt): rustfmt

* fix(themes): loading of theme files

* style(fmt): rustfmt

* fix(tests): theme fixtures

* fix(layouts): better errors on unknown nodes

* fix(kdl): clarify valid node terminator error

* fix(e2e): adjust close tab test

* fix(e2e): adjust close tab test again

* style(code): cleanup some comments
2022-10-05 07:44:00 +02:00
har7an
e7bce6a106
Add docs about error handling (#1745)
* docs: Add ERROR_HANDLING

that explains how we plan to change error handling in zellij and invites
new contributors to join the fun. Details the currently existent error
handling capabilities and gives a bunch of examples taken from #1670.

* utils/errors: Shorten docblock

by moving previous content under "Help Wanted" to the new
`docs/ERROR_HANDLING` document and link to the document instead.
2022-09-27 07:28:09 +00:00
har7an
99e2bef8c6
Feature: Better error handling/reporting (#1670)
* utils: re-export "anyhow" unconditionally

even for wasm targets.

* utils/errors: Share wasm-compatible code

and move everything that can't run in wasm into a separate submodule.

* utils: Share "errors" module unconditionally

The module is now structured such that all code incompatible with wasm
targets lives in its own submodule that isn't included when compiling
for wasm targets.

* utils/errors: Add "Help wanted" doc section

that informs the reader about the endeavour to improve error handling
throughout the zellij code base.

* plugins: Handle errors returned by `zellij_tile`

now that the panic calls have been removed.

* utils/errors: Extend `anyhow::Result` with traits

that allow for easy/concise logging of `anyhow::Result` types and
panicking the application when they are fatal or non-fatal.

* utils/errors: Fix doctest

* utils/errors: Add prelude

that applications can import to conveniently access the error handling
functionality part of the module. Re-exports some parts and macros from
anyhow and the `LoggableError` and `FatalError` traits.

* server/screen: Adopt error handling

and make all fallible functions from the public API return a `Result`.
Append error contexts in all functions that can come across error types
to allow tracing where an error originates and what lead there.

* server/lib: Catch errors from `screen`

and make them `fatal`. This will log the errors first, before unwrapping
on the error type and panicking the application.

* server/unit/screen: Fix unit tests

and unwrap on the `Result` types introduced from the new error handling.

* utils/errors: Track error source

in calls to `fatal`, so we keep track of the location where the panic
really originates. Otherwise, any call to `fatal` will show the code in
`errors` as source, which of course isn't true.
Also change the error formatting and do not call `to_log` for fatal
errors anymore, because the panic is already logged and contains much
more information.

* utils/errors: Update `FatalError` docs

* plugins: Undo accidental modifications

* utils/errors: Improve module docs

explain some error handling facilities and the motivation behind using
them.

* server/screen: Remove `Result` from Infallible

functions that are part of the public API.
2022-09-09 13:21:03 +00:00
Aram Drevekenin
3f43a057cb chore(version): bump development version 2022-09-09 13:38:22 +02:00
Aram Drevekenin
a28d905d84 chore(release): v0.31.4 2022-09-09 13:00:24 +02:00
Thomas Linford
a58a5ca769
fix osc params 1024 byte limit (#1711)
* update vte to v0.11.0, and turn off it's default-features

* vte's default includes no_std, and in that case the osc params buffer is capped at 1024 bytes

* add changelog entry
2022-09-03 20:11:56 +02:00
Aram Drevekenin
d68d407d26
fix(router): gracefully handle client crashes (#1710)
* fix(router): gracefully handle client crashes

* style(comments): remove unused
2022-09-02 15:30:43 +02:00
Aram Drevekenin
639de16c5e chore(version): bump development version 2022-08-18 09:30:12 +02:00
Aram Drevekenin
588167f38e chore(release): v0.31.3 2022-08-18 08:55:21 +02:00
Aram Drevekenin
ac8a9d4b28 chore(version): bump development version 2022-08-17 11:46:46 +02:00
Aram Drevekenin
67011947e8 chore(release): v0.31.2 2022-08-17 11:07:34 +02:00
Aram Drevekenin
f4ad946497
fix(terminal): SGR/UTF8 mouse reporting in terminal panes (#1664)
* work

* work

* fix: selection mishandling

* style(fmt): rustfmt

* style(comments): remove outdated

* style(clippy): make clippy happy

* fix(mouse): off by one sgr/utf8 reporting

* style(fmt): rustfmt

* fix(mouse): correctly report drag event code

* fix(input): support mouse middle click

* style(fmt): rustfmt
2022-08-17 09:28:51 +02:00
Aram Drevekenin
0cedf39032 chore(version): bump development version 2022-08-02 18:46:32 +02:00
Aram Drevekenin
8ea0f85e95 chore(release): v0.31.1 2022-08-02 17:56:00 +02:00
Jae-Heon Ji
4e9ad2e694
fix: theme not loading without config (#1631) 2022-08-02 23:15:33 +09:00
Aram Drevekenin
a408c30669 chore(version): bump development version 2022-07-28 18:51:55 +02:00
har7an
f76b828209
fix(status-bar): reflect actual current keybindings (#1242)
* status-bar: first_line: Use more generic var names

Rename all `CtrlKey...` to the equivalent `Key...` to make the name less
specific. It implies that all key bindings use Ctrl as modifier key,
which needn't necessarily be the case.

* status-bar: first_line: Refactor `ctrl_keys`

Removes lots of code duplication by `Unselect`ing all keys by default
and only `Select`ing what is actually required for a given Input mode.

* utils: conditionally compile unix-specific code

In `zellij_utils`, the following modules each contained code that was
previously targeting only the unix platform:

- consts: Works with unix-specific filesystem attributes to set e.g.
  special file permissions. Also relies on having a UID.
- shared: Uses unix-specific filesystem attributes to set file
  permissions

These will never work when targeting wasm. Hence the concerning code
passages have been moved into private submodules that are only compiled
and re-exported when the target isn't `#[cfg(unix)]`. The re-export
makes sure that crates from the outside that use `zellij_utils` work as
before, since from their point of view nothing has changed.

* utils: Share more modules with wasm

that work on both wasm and unix natively. This requires factoring out
bits of code in the `setup` and `input` modules into a private submodule
that is re-exported when the compilation target is *not* "wasm". The
following modules are now available to the wasm target:

- cli
- consts
- data
- envs
- input (partial)
    - actions
    - command
    - configs
    - keybinds
    - layout
    - options
    - plugins
    - theme
- pane_size
- position
- setup (partial)
- shared

The remaining modules unavailable to wasm have dependencies on crates
that cannot compile against wasm, such as `async_std` or `termwiz`.

* utils/input/keybinds_test: Fix import

of the `CharOrArrow` struct which is now part of the `data` submodule.

* utils/layout: Use global serde crate

Previously the code was decorated with `#[serde(crate = "self::serde")]`
statements which cannot be shared with wasm. Use the regular serde
without specifying which serde is meant.

* utils/data: Implement `fmt::Display` for `Key`

so the Keybindings can be displayed via `format!` and friends in e.g.
the status bar.

* tile/prelude: Re-export `actions`

submodule of `zellij_utils` so the plugins can access the `ModeKeybinds`
struct with all of its members.

* utils/data: Fix `ModeInfo::keybinds` type

and transfer a vector of `(Key, Vec<Action>)` to the plugins so they can
parse it themselves, instead of passing strings around. Due to the
requirement of the `Eq` trait derive on `ModeInfo` this requires
deriving `Eq` on all the types included by `Key` and `Action` as well.

Note that `Action` includes the `layout::SplitSize` structure as a
member. We cannot derive `Eq` here since `SplitSize::Percent(f64)`
cannot satisfy `Eq` because `f64` doesn't implement this. So we add a
new type to hack around this limitation by storing the percentage as
`u64` internally, scaled by a factor of 10 000 and transforming it to
f64 when needed. Refer to the documentation of `layout::Percent` for
further information.

* utils/data: Make `Key` sortable

so the keybindings can be sorted after their keys.

* WIP: utils/input: Make keybinds accessible

when generating `ModeInfo` structs.

* utils/data: Handle unprintable chars in `Key`

when displaying via the `fmt::Display` trait. Handles `\t` and `\n` and
represents them as UTF-8 arrow glyphs.

* HACK: utils/layout: Use u64 for SplitSize::Percent

The previous workaround using a custom `Percent` type fails at the
absolute latest when confronted with user layouts, since these do not
know about the scaling factor and will thus break. It still breaks
currently because `Percent` now expects a u64 (i.e. `50`, not `50.0`)
but this is more easily explained and understood.

* status-bar: Add helper macros

that retrieve the key bound to execute a sequence of `Action` given a
specific Keybinding, and a shorthand that expands to
`Action::SwitchToMode(InputMode::Normal)` used for pattern matching with
the `matches!` macro.

* status-bar/first_line: Get shared superkey if any

from the `ModeKeybindings` in the current `ModeInfo` struct. If the
configured keybindings for switching the modes don't have a superkey in
common, do not print a common prefix.

* status-bar/first_line: Add key to KeyShortcut

which is the key that must be pressed in the current mode to execute the
given shortcut (i.e. switch to the given mode).

* status-bar/first_line: Dynamically set mode binds

Read the keybindings for switching the modes to print in the first line
from the actually configured keybindings for the current mode. Add some
logic to the code that:

- Prints only the "single letter" of the keybinding if all mode-switch
  shortcuts *share the same modifier key*,
- Or prints the whole keybinding (with modified) into each segment if
  there is no common modifier key.

* status-bar/second_line: Display configured binds

Instead of showing some hard-coded default values. For each mode, reads
the keybindings from the configured keybindings based on some sequence
of action. For example, the keybinding for `New` in the `Pane` menu is
now determined by looking into the configured keybindings and finding
what key is bound to the `Action::NewPane(None)` action.

If no keybinding is found for a given sequence of actions, it will not
show up in the segments either.

* WIP: utils/keybinds: Make key order deterministic

by using a BTreeMap which by default has all of its elements in sorted
order internally. As of currently this doesn't seem to impress the order
in which the keybindings are sent to the plugins, though.

* utils/data: Reorder `Key` variants

to have the Arrow keys sorted as "left", "down", "up", "right" in
accordance with the display in e.g. the status bar.

* status-bar/first_line: Fix inverted `matches!`

when trying to obtain the keybindings to switch between the input modes.
Its initial purpose was to filter out all ' ', '\n' and 'Esc'
keybindings for switching modes (As these are the default and not of
interest for the status bar display), but it was not negated and thus
only filtered out the aforementioned keys.

* status-bar: Don't get all modeswitch keybinds

but only those that are displayed in the status bar. This currently
excludes the keybindings for Entering the Pane/TabRename mode, Tmux mode
and Prompt mode. We must explicitly exclude these since they aren't
bound to the same Modifiers as the regular keys. Thus, if we e.g. enter
Pane or Tab mode, it will pick up the
`SwitchToMode(InputMode::TabRename)` action as being bound to `c`, hence
the `superkey` function cannot find a common modifier, etc. But we don't
display the `TabRename` input mode in the first line anyway, so we must
ignore it.

Therefore, we additionally add the keybinding to call the `Action::Quit`
action to terminate zellij to the vector we return. Also remove the
`(Key, InputMode)` tuple and convert the return type to a plain
`Vec<Key>`, since the never worked with the `InputMode` in the first
place.

* status-bar/first_line: Fix output for tight screen

Implement the "Squeezed" display variant where we do not display which
of the modes each keybinding switches to, but only the keybinding
itself.

* status-bar/second_line: Remove trailing " / "

* status-bar/second-line: Refactor key hints

Instead of determining the appropriate key hints for every case
separately (i.e. enough space to show all, show shortened, shot
best-effort), create a central function that returns for the current
`InputMode` a Vector with tuples of:

- A String to show in full-length mode
- A String to show in shortened/best-effort mode
- The vector of keys that goes with this key hint

This allows all functions that need the hints to iterate over the vector
and pick whatever hint suits them along with the Keys to display.

* status-bar/second-line: Implement shortened hints

* utils/data: Fix display for `Key::Alt`

which previously printed only the internal char but not the modifier.

* status-bar/first-line: Add hidden Tmux tile

that is only shown when in Tmux mode. Note that with the default config
this "breaks" the shared superkey display, because it correctly
identifies that one can switch to Scroll mode via `[`.

* status-bar: Print superkey as part of first line

Instead of first obtaining the superkey and then the rest of the first
line to display. This way we don't need to split up individual data
structures and carry a boolean flag around multiple functions.

It also has the advantage that when the available space is really tight,
the first line is entirely empty and doesn't display a stale superkey
without any other keybinding hints.

* status-bar: Rework keybinding theming

Previously there were individual functions to create the tiles in the
first line depending on whether:

- A tile was selected, unselected, unselected alternate (for theming) or disabled, and
- Tiles had full length or were displayed shortened

In the first case, the functions that previously handled the theming
only differed in what theme they apply to the otherwise identical
content. Since the theming information was drawn from a flat structure
that simulated hierarchy by giving hierarchical names to its theme
"members", this couldn't be handled in code. In the second case, some of
the theming information needed for the full-length shortcuts was
replicated for the shortened shortcuts.

Instead, rewrite the general Theming structure into a hierarchical one:
Adds a new structure `SegmentStyle` that contains the style for a single
segment depending on whether it is selected, unselected (alternate) or
disabled. Refactor the `first-line` module to use a single function to
generate either full-length or shortened tiles, that does functionally
the same but switches themes based on the selection status of the tile
it themes.

* status-bar/second-line: Return new `LinePart`s

from the `add_shortcut` function instead of modifying the input
parameters.

* status-bar/second-line: Implement adaptive behavior

and make the keyhints adapt when the screen runs out of space. The hints
first become shortened and when necessary partially disappear to display
a "..." hint instead.

* status-bar/second-line: Show float pane binding

based on the keycombination that's really bound to switching into the
"Pane" input mode.

* status-bar/get_keys_and_hints: Add more modes

for the keybindings in Tmux and the Pane/TabRename input modes.

* status-bar/second-line: Unify mode handling

and don't do extra shortcut handling for Tmux and the Pane/TabRename
modes any longer. Instead, assemble this like for all other modes from
the keybinding and hints vector.

* status-bar/first-line: Refactor common modifier

to a separate function so it can be used by other modules, too.

* status-bar/second-line: Display modifier in hints

when available. For example, for bindings to move between panes when in
PaneRename mode, now displays "Alt + <hjkl>" instead of
"<Alt+hAlt+j...>".

* utils/ipc: Remove `Copy` from `ClientAttributes`

 as preparation to add `Keybinds` as a member to the `ClientAttributes`
 struct. `Keybinds` contains a `HashMap`, for which the `std` doesn't
 derive `Copy` but only `Clone`.

* utils/input/keybinds: Fix import path

Import `Key` and `InputMode` directly from `data`.

* utils/ipc: Add `Keybinds` to `ClientAttributes`

so we can keep track, pre-client, of the configured key bindings and
pass them around further in the code.

* server/lib: Store `ClientAttributes` over `Style`

in `SessionMetadata` to be able to pass Keybindings to other places in
the code, too. Since `Style` is also a member of `ClientAttributes`,
this works with minimal modifications.

* utils/input: Change `get_mode_info` parameters

to take a `ClientAttributes` struct instead of merely the `Style`
information. This way we can get the `Style` from the
`ClientAttributes`, and also have access to the `keybinds` member that
stores the keybinding configuration.

* utils/ipc: Use `rmp` for serde of IPC messages

instead of `bincode`, which seemingly has issues (de)serializing
`HashMap`s and `BTreeMap`s since `deserialize_any` isn't implemented for
these types.

* fix(nix): remove `assets` from `gitignore`

Remove `assets` from the gitignore of the plugins themselves,
since every single plugin now depends on the asset being accessible
in its source directory.

* tests/e2e: Fix status bar in snapshots

to reflect the current state of the dynamic keybindings.

* status_bar/first_line: Don't show unbound modes

If switching to a specific mode isn't bound to a key, don't show a
tile/ribbon for it either. E.g. in `LOCKED` mode, this will only show
the tile for the `LOCK` mode and ignore all others.

* utils/data: Make 'Key::Char(' ') visible as "␣"

so the user doesn't only see a blank char but has an idea that the space
key is meant.

* status_bar/second_line: Remove extra hints

generated by the `hint_producing_function` that would tell the user in
every input mode how to get back to normal mode. Instead, add this as
keybinding to the general keybindings vector.

This removes some lines of duplicated code but most of all now applies
the correct theming to this keybinding. Additionally, previously the
`RenameTab` and `RenamePane` input modes would show the keybinding to
get back to normal mode twice and both of them were hardcoded. This
binding is now dynamically displayed based on what the user configured
as keybinding.

* utils/data: format unprintable chars as words

instead of unicode symbols. E.g. write "SPACE" instead of "␣".

* utils/data: Fix display for `Ctrl`/`Alt` keys

previously their "inner" chars would be displayed with a regular
`fmt::Display` for the `&str` type they are. This doesn't match what we
want to output. So instead we wrap the inner chars into `Key::Char`
before printing them.

* utils/data: Change order of `Key`s

so that e.g. for the default bindings in `Scroll` mode we prefer to show
`PgDn|PgUp` rather than the arrow keys these actions are bound to as
well.

* status_bar/first_line: Don't ignore default char

bindings by default. These include the '\n', ' ' and 'Esc' bindings that
by default lead back to `Normal` input mode from all the modes.
Previously we would unconditionally ignore them and consequently not
print the tile when in fact the user may have bound this particular
action to either of the keys.

Instead now we first ignore the keys mentioned and if we turn up with an
undefined binding, we consider these default keys as well so we get
*something* to display in any case.

* status_bar/first_line: Add space when no modifier

is shared between the keybindings. This way there isn't a stray arrow at
the very border of the screen, but it is spaced just like the tab-bar
and the second line is.

* status_bar/second_line: Print separators

between consecutive keys bound to specific actions. This allows the user
to visually differ between different keys.

* status_bar/main: Don't return modifier if empty

* status_bar/first_line: Don't suppress Disabled tiles

Disabled is a special state that the keybindings only assume in locked
mode. It turns the respective tiles grey to signal to the user that
these are currently inactive. With respect to users new to zellij, it
may appear confusing that when entering locked mode all the other tiles
disappear (which they do because they have no valid keybinding
assigned). Since we have no keybinding for them, we still display them
but without any associated key (i.e. as `<>` for the binding).

* status_bar/first_line: Don't print leading triangle

on first tile, when there is no shared superkey.

* status_bar/second_line: Add exceptions

for inter-key separators. Keeps groups of `hjkl` and arrow keys intact
(doesn't add separators between the keys) but separates all others.

* status_bar/main: Refactor `action_key`

to a regular function instead of a macro. It turns out that while being
able to match patterns is a nice feature, we completely rely on the keys
that drop out of the pattern found this way to be sorted in a sensible
way. Since we sort the key vectors in the necessary places after the
keys, and not the actions, this of course doesn't apply when the user
changes "hjkl" to "zjkl", which would then become "jklz". Now this is of
course wrong, because "z" still means "Move focus left", and not "Move
focus right".

With the function we now assume a slice of Actions that we match the
action vectors from the keybindings against to obtain the necessary
keys. In order to avoid ugly `into_iter().chain(...)` constructs we had
before we also add a new function `action_key_group` that takes a sliced
array of slices to get a whole group of keys to display.

* status_bar/first_line: Fix "triangle" for short tiles

since we do not want to display a colored triangle at the start of the
line when in sortened mode (just as we do for the long tiles now).
Also fix a bug that would make the triangle reappear when the first
keybinding to be displayed didn't have a key assigned and thus wouldn't
be displayed at all.

* status_bar/second_line: Fix typo

that would cause single `Ctrl+?` bindings for actions in the second line
to be displayed as `Ctrl + <Ctrl+?>`.

* status_bar/second_line: Fix char count

when displaying groups of keys in a binding with or without a separator.

* status_bar: Use new `action_key` fn

instead of the previous macro to obtain the keys to display in the
status bar in a fixed given order. Also fix the display "bug" where tab
switching would be shows as "ArrowLeft/ArrowDown" instead of
"ArrowLeft/ArrowRight".

* status_bar/second_line: Fix floating pane hint

that tells the user what keybinding to press to suppress the currently
active floating panes. This was previously hardcoded.

* utils: Send full keybinds in `ModeInfo`

instead of the currently active `ModeKeybinds` for the active input
mode. Some of the UI issues cannot be solved without having access to
*all* keybindings.

* utils: Refactor keybinds vec into type

to make clippy happy.

* status_bar/first_line: Remove needless borrows

* status_bar: Factor out printing keybindings

into a separate function that takes a vector of keys and a palette and
returns the painted key groups, with correct inter-character separation
where necessary and factoring out common modifier keys.

* status_bar/tip: Use real keybindings

instead of printing hard-coded messages to the user.

* status_bar: abort early when keyvector is empty

in `style_key_with_modifier`.

* status_bar/tip: Fix all keybindings

and make them dynamic given the keybindings really active in the current
session. Also display **UNBOUND** is some keybinding is missing from the
users config.

* status_bar: Go clippy!

* status_bar: Add documentation

and add a new exception group to `action_key_group` that ensures that
`hl` and `jk` won't be separated with `|`.

* status_bar/tip: Detect when key aren't bound

correctly and show "UNBOUND" as keyhint instead, then. Previously we
would only check the length of the whole keybinding segment, but that
isn't a good indicator since most of the bindings require changing modes
first, which already adds a variable number of letters to the segment.
However, there is not point in showing how to get to a certain mode, if
the binding needed in that mode doesn't exist.

* status_bar/first_line: Show bindings when locked

if the user has any configured.

* status_bar: Don't consider 'hl', 'jk' groups

that don't need a separator in between the letters.

* status_bar/second_line: Add "search" keybindings

for the new Search functionality.

* tests/e2e: Fix snapshots

with what the status bar now really displays.

* status_bar: Remove old comments

* status_bar/first_line: Rename 'long_tile'

to the more descriptive name 'mode_shortcut', which better describes
what this function does.

* status_bar/first_line: Fix spacing in simple UI

where the modifier would be shows as `Ctrl +`, without a trailing space.
This isn't an issue in regular mode, where we have the spacing from the
arrow gaps (`>>`) that "simulates" this effect.

* status_bar: Refactor  and rename `ctrl_keys`

so it doesn't rely on some "external" index for operation any more.

* status_bar: Add unit tests to shared functions

and fix a bug in the process where certain `Ctrl` keybindings would be
displayed wrong.

* status_bar/first_line: Rename functions

responsible for printing the long and short shortcut keyhint tiles. Also
add some documentation that explains their purpose and the arguments
they accept.

* status_bar/tips: Remove stray "/" in quicknav tip

* utils/layout: Remove old comments

introduced when rewriting `SplitSize::Percent` to not hold an `f64`
type.

* status_bar: Add "regex" as test dependency

We use regular expressions to strip all ANSI escape sequences in the
strings that are produced by the plugin functions during testing. We do
not test for the style information, but merely for the raw text.

* status_bar: Implement unit tests

* Makefile: Always run tests on host triple

This allows the unit tests for all plugins to be run on the host as well
(because their default compilation target is wasm32-wasi).

* tests/e2e: Add test for custom bindings

in the status bar. Makes sure that the modified bindings from a custom
configuration file are read and applied to the UI.

Co-authored-by: a-kenji <aks.kenji@protonmail.com>
2022-07-27 16:48:35 +02:00
raphCode
408f520e4c
Log every panic to the logfile (#1602)
* Add unified panic logging

* Remove redundant logging in client

* Add to changelog

* Improve changelog
2022-07-26 17:47:25 +02:00
Jae-Heon Ji
09481aac19
feat: support themes directory (#1577)
* feat: add serde struct for theme file

* feat: update client to load the theme palette

* feat: merge themes in the setup phase

* chore: delete debug message in test

* feat: add theme_dir options

* fix: boxing large enum variant
2022-07-24 21:30:58 +09:00
msirringhaus
bae1548495
feat(terminal): search panes (#1521)
* WIP: First draft of searching in panes.

* Add ability to highlight search-results in viewport and move forwards/backwards

* Clear search results when leaving search

* Search newly scrolled in lines and have live-search when entering search-term

* search_forward/backward() now doesn't get the needle again, since we already know it

* Use red and yellow from theme. No idea if we should introduce new 'search'-colors

* Implement moving the viewport for searches outside the current one.

* Implement hacky case-insensitivity (ASCII only at the moment)

* Implement wrap-search and prepare infrastructure for whole-word search

* Add a bunch of tests and an embarrasing amount of bugfixes

* Remember search selection when toggling case-sensitivity (if possible)

* New tab integration tests and make search work with floating panes

* Make highlights work with resize (not keeping the active-selection in most cases)

* Switch the search-algo a bit in order to make multi-line search work

* Don't forget active selection when nothing more is found, reflow found selections and scroll correctly

* Make all search-related function calls in plugin-pane No-ops

* Activate whole word search (ASCII only)

* Run cargo fmt

* Make clippy happy

* Remove unneeded transferred_rows_count

* Remove boilerplate and use macro instead

* Add explanatory comments

* Move search-related functions into SearchResults impl and try to remove duplicate code

* Move clearing of search-results upon mode-switch to appropriate place

* Jump to the first occurence while typing (EnterSearch), if none is found in the current viewport

* Always show needle and also show search modifiers in pane title

* Integration tests now use correct InputMode, so we can test the pane title when doing searches

* Move no-op implementation of search-functions from plugin-pane to pane-trait

* Move SearchResult to its own file

* Try to clean up search_row() a bit

* Make clippy happy

* fix: various typos (#1553)

Because they were wrong.

* flake.lock: Update (#1554)

Flake lock file updates:

• Updated input 'crate2nix':
    'github:kolloch/crate2nix/805cdaf084c859c2ea0c084b74f4527b0483f6aa' (2022-06-17)
  → 'github:kolloch/crate2nix/91f333aca414ee346bc5bdea76fe9938f73a15f9' (2022-07-01)
• Updated input 'flake-utils':
    'github:numtide/flake-utils/1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1' (2022-05-30)
  → 'github:numtide/flake-utils/bee6a7250dd1b01844a2de7e02e4df7d8a0a206c' (2022-06-24)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/3d7435c638baffaa826b85459df0fff47f12317d' (2022-06-16)
  → 'github:nixos/nixpkgs/0ea7a8f1b939d74e5df8af9a8f7342097cdf69eb' (2022-07-02)
• Updated input 'rust-overlay':
    'github:oxalica/rust-overlay/da04f39d50ad2844e97a44015048c2510ca06c2f' (2022-06-18)
  → 'github:oxalica/rust-overlay/bbba5e73a21c8c67d5fe1d4d8b3fde60ab6946cd' (2022-07-03)

* fix: fallback to default values when terminal rows/cols are 0 (#1552)

* fix: fallback to default values when terminal rows/cols = 0

* increase retry_pause for failing test

* e2e: load fixtures with cat

* use variable for fixture path

* docs(changelog): fix 0 rows or cols crash

* fix(ci): clippy (#1559)

Install `cargo-make` explicitly in the workflow,
even tough it should be cached from the previous steps.

There are some corner cases in which gh messes the caching up
and can't access it.

* add(nix): add `compact-bar` to the flake outputs (#1560)

The compact bar wasn't an output yet.

* refactor(crates): move shared contents from zellij tile to zellij utils (#1541)

* zellij-tile: Move `data` to zellij-utils

The rationale behind this is that all components of zellij access the
data structures defined in this module, as they define some of the most
basic types in the application. However, so far zellij-tile is treated
like a separate crate from the rest of the program in that it is the
only one that doesn't have access to `zellij-utils`, which contains a
lot of other data structures used throughout zellij.

This poses issues as discussed in
https://github.com/zellij-org/zellij/pull/1242 and is one of the reasons
why the keybindings in the status bar default plugin can't be updated
dynamically. It is also the main reason for why the keybindings are
currently passed to the plugin as strings: The plugins only have access
to `zellij-tile`, but since this is a dependency of `zellij-utils`, it
can't import `zellij-utils` to access the keybindings.
Other weird side-effect are that in some places `server` and `client`
have to access the `zellij-tile` contents "through" `zellij-utils`, as
in `use zellij_utils::zellij_tile::prelude::*`.

By moving these central data structures to one common shared crate
(`zellij-utils`), `zellij-tile` will be enabled to import `zellij-utils`
like `screen` and `client` already do. This will, next to other things,
allow dropping a lot of `std::fmt::Fmt` impls needed to convert core
data structures into strings and as a consequence, a lot of string
parsing in the first place.

* utils: Integrate new `data` module, bump rust ver

Integrates the `data` module that was previously part of `zellij-tile`
to allow sharing the contained data structures between all components of
zellij.

This allows `zellij-tile` to use `utils` as a dependency. However, since
`tile` is build against the wasm target, it cannot include all of
`zellij-utils`, since a lot of dependencies there cannot compile with
`wasm` as target (Examples include: termwiz, log4rs, async-std). Thus we
make all the dependencies that cannot compile against `wasm` optional
and introduce a new feature `full` that will compile the crate with all
dependencies. Along with this, modify `lib.rs` to include most of the
data structures only when compiling against the `full` feature.

This makes the compiles of `zellij-tile` lighter, as it doesn't include
all of `utils`. As a side effect, due to the dependency notation for the
optional dependencies (See
https://doc.rust-lang.org/cargo/reference/features.html#optional-dependencies),
we bump the rust toolchain version to 1.60.0.

* tile: Import `data` from zellij-utils

Add `zellij-utils` as a dependency to `zellij-tile` and allow us access
to the `data` module defined there. Update the re-export in the
`prelude` such that from all of the plugins points of view *absolutely
nothing changes*.

* utils: Fix `data` module dependency

Since the `data` module has been migrated from `zellij-tile` to
`zellij-utils`, we import it from `zellij-utils` directly now.
Also unify the imports for the `data` module members: We import all of
the through `data::` now, not through a mixture of `data::` and
`prelude::`.

* client: Fix `data` module dependency

Since the `data` module has been migrated from `zellij-tile` to
`zellij-utils`, we import it from `zellij-utils` directly now.
Also unify the imports for the `data` module members: We import all of
the through `data::` now, not through a mixture of `data::` and
`prelude::`.
Add the "full" feature flag to the `zellij-utils` dependency so it
includes all the components we need.

* server: Fix `data` module dependency

Since the `data` module has been migrated from `zellij-tile` to
`zellij-utils`, we import it from `zellij-utils` directly now.
Also unify the imports for the `data` module members: We import all of
the through `data::` now, not through a mixture of `data::` and
`prelude::`.
Add the "full" feature flag to the `zellij-utils` dependency so it
includes all the components we need.

* tests: Fix `data` module dependency

Since the `data` module has been migrated from `zellij-tile` to
`zellij-utils`, we import it from `zellij-utils` directly now.

* utils: Remove "full" feature

in favor of conditional compilation using `target_family`. Replace the
rust 1.60 method of specifying optional dependencies based on features
and optionally include the dependencies only when not building for wasm
instead. (I.e. `cfg(not(target_family = "wasm"))`)

* cargo: Update module dependencies

since `client`, `server` and `tile` now all depend on `utils` only.

* docs(changelog): crate refactor

* fix: typo (#1567)

* feat(terminal): sixel support (#1557)

* work

* work

* work

* work

* work

* more work

* work

* work

* work

* hack around stdin repeater

* refactor(sixel): rename sixel structs

* feat(sixel): render text above images

* fix(sixel): reap images once they're past the end of the scrollbuffer

* fix(sixel): display images in the middle of the line

* fix(sixel): render crash

* fix(sixel): react to SIGWINCH

* fix(sixel): behave properly in alternate screen mode

* fix(sixel): reap images on terminal reset

* feat(sixel): handle DECSDM

* fix(terminal): properly respond to XTSMGRAPHICS and device attributes with Sixel

* Add comment

* fix(sixel): hack for unknown event overflow until we fix the api

* feat(input): query terminal for all OSC 4 colors and respond to them in a buggy way

* fix(sixel): do not render corrupted image

* feat(input): improve STDIN queries

* fix(client): mistake in clear terminal attributes string

* fix(ansi): report correct number of supported color registers

* fix(sixel): reap images that are completely covered

* style(comment): fix name

* test(sixel): infra

* test(sixel): cases and fixes

* fix(sixel): forward dcs bytes to sixel parser

* refactor(client): ansi stdin parser

* refactor(output): cleanup

* some refactorings

* fix test

* refactor(grid): sixel-grid / sixel-image-store

* refactor(grid): grid debug method

* refactor(grid): move various logic to sixel.rs

* refactor(grid): remove unused methods

* fix(sixel): work with multiple users

* refactor(pane): remove unused z_index

* style(fmt): prepend unused variable

* style(fmt): rustfmt

* fix(tests): various apis

* chore(dependencies): use published version of sixel crates

* style(fmt): rustfmt

* style(fmt): rustfmt

* style(lint): make clippy happy

* style(lint): make clippy happy... again

* style(lint): make clippy happy... again (chapter 2)

* style(comment): remove unused

* fix(colors): export COLORTERM and respond to XTVERSION

* fix(test): color register count

* fix(stdin): adjust STDIN sleep times

* docs(changelog): sixel support

* flake.lock: Update (#1575)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* fix(ci): add new rust toolchain location to action (#1576)

* rust-toolchain: Update (#1578)

Co-authored-by: a-kenji <a-kenji@users.noreply.github.com>

* chore(nix): hide `nix` directory (#1579)

* chore(gblame): add move to git-blame-ignore-revs

This is not relevant for `git blame` messages.

* chore(docs): add more matrix links (#1581)

* fix: add usage comment to fish shell auto-start snippet (#1574) (#1583)

* docs(changelog): add usage comment to fish script

* Refactor match session name (#1582)

* docs(changelog): refactor get session name (#1582)

* fix(cli): let the exit message be different when detaching (#1573)

* Let the exit message be different when detaching

This patch changes the exit message printed to the user, so the user
does not get the impression that they fat-fingered an "exit" instead of
what was intended (a detach).

For this, the InputHandler::exit() function was refactored, to get the
reason as a parameter. As this function is not pub, this is considered
okay.

Signed-off-by: Matthias Beyer <mail@beyermatthias.de>

* Change detach message

This patch changes the detach message to be more in line with the other
messages zellij displays to the user.

Signed-off-by: Matthias Beyer <mail@beyermatthias.de>

* docs(changelog): detach message

* perf(terminal): better responsiveness (#1585)

* performance(pty): only buffer terminal bytes when screen thread is backed up

* style(fmt): rustfmt

* docs(changelog): performance improvement

* style(fmt): rustfmt

* fix(search): adjust foreground color for better readability

* style(fmt): rustfmt

* test(e2e): update snapshots from SCROLL to SEARCH

* Rename search directions to up/down

* Rename search-functions in tests as well

* Move all search-related functions out of grid.rs and into search.rs and reuse as much as possible

* Fix bug where searches that fall on the line-ending are highlighting the whole line

* Silence clippy on what I think is a false-positive

* fix(terminal): persist cursor hide/show through alternate screen (#1586)

* fix(terminal): persist cursor hide/show through alternate screen

* style(fmt): rustfmt

* style(clippy): make clippy happy

* docs(changelog): cursor show/hide alternate screen fix

* fix(editor): handle editor/visual/configured editor with arguments (#1587)

* fix(editor): handle editor/visual/configured editor with arguments

* style(fmt): rustfmt

* docs(changelog): editor with arguments

* fix(ci): quoting issues (#1589)

* fix(mouse): avoid forwarding click events on pane border (#1584)

* if left click is on pane border do not forward to application

* properly handle frames

* fix comment

* fix another comment

* add tests, fix edge case

* docs(changelog): mouse click on pane frame fix

* flake.lock: Update (#1592)

Flake lock file updates:

• Updated input 'crate2nix':
    'github:kolloch/crate2nix/2d20dec4ae330f39b0bebeb8eb4a201b58d2b82c' (2022-07-09)
  → 'github:kolloch/crate2nix/45d97c7ce62c3d53954743057ceb32e483c31acd' (2022-07-12)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/b39924fc7764c08ae3b51beef9a3518c414cdb7d' (2022-07-08)
  → 'github:nixos/nixpkgs/4a01ca36d6bfc133bc617e661916a81327c9bbc8' (2022-07-14)
• Updated input 'rust-overlay':
    'github:oxalica/rust-overlay/3dfc78e42a285caaf83633224a42e7fb7dde191b' (2022-07-10)
  → 'github:oxalica/rust-overlay/2cd36d4aef875867ee1d7963541ccb3ae50b358c' (2022-07-16)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* fix(search): clear search when entering input in non-search-mode

* fix(search): handle searching in updating viewport

Co-authored-by: Martin Sirringhaus <>
Co-authored-by: a-kenji <aks.kenji@protonmail.com>
Co-authored-by: Thomas Linford <tlinford@users.noreply.github.com>
Co-authored-by: Aram Drevekenin <aram@poor.dev>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: a-kenji <a-kenji@users.noreply.github.com>
Co-authored-by: Tassilo Horn <tsdh@gnu.org>
Co-authored-by: Jae-Heon Ji <32578710+jaeheonji@users.noreply.github.com>
Co-authored-by: Matthias Beyer <mail@beyermatthias.de>
2022-07-18 10:54:23 +02:00
Matthias Beyer
6e102c6084
fix(cli): let the exit message be different when detaching (#1573)
* Let the exit message be different when detaching

This patch changes the exit message printed to the user, so the user
does not get the impression that they fat-fingered an "exit" instead of
what was intended (a detach).

For this, the InputHandler::exit() function was refactored, to get the
reason as a parameter. As this function is not pub, this is considered
okay.

Signed-off-by: Matthias Beyer <mail@beyermatthias.de>

* Change detach message

This patch changes the detach message to be more in line with the other
messages zellij displays to the user.

Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
2022-07-12 12:17:24 +02:00
Tassilo Horn
8f0e82a0ea
fix: add usage comment to fish shell auto-start snippet (#1574) (#1583) 2022-07-12 10:27:46 +09:00
Aram Drevekenin
c89b416d76
feat(terminal): sixel support (#1557)
* work

* work

* work

* work

* work

* more work

* work

* work

* work

* hack around stdin repeater

* refactor(sixel): rename sixel structs

* feat(sixel): render text above images

* fix(sixel): reap images once they're past the end of the scrollbuffer

* fix(sixel): display images in the middle of the line

* fix(sixel): render crash

* fix(sixel): react to SIGWINCH

* fix(sixel): behave properly in alternate screen mode

* fix(sixel): reap images on terminal reset

* feat(sixel): handle DECSDM

* fix(terminal): properly respond to XTSMGRAPHICS and device attributes with Sixel

* Add comment

* fix(sixel): hack for unknown event overflow until we fix the api

* feat(input): query terminal for all OSC 4 colors and respond to them in a buggy way

* fix(sixel): do not render corrupted image

* feat(input): improve STDIN queries

* fix(client): mistake in clear terminal attributes string

* fix(ansi): report correct number of supported color registers

* fix(sixel): reap images that are completely covered

* style(comment): fix name

* test(sixel): infra

* test(sixel): cases and fixes

* fix(sixel): forward dcs bytes to sixel parser

* refactor(client): ansi stdin parser

* refactor(output): cleanup

* some refactorings

* fix test

* refactor(grid): sixel-grid / sixel-image-store

* refactor(grid): grid debug method

* refactor(grid): move various logic to sixel.rs

* refactor(grid): remove unused methods

* fix(sixel): work with multiple users

* refactor(pane): remove unused z_index

* style(fmt): prepend unused variable

* style(fmt): rustfmt

* fix(tests): various apis

* chore(dependencies): use published version of sixel crates

* style(fmt): rustfmt

* style(fmt): rustfmt

* style(lint): make clippy happy

* style(lint): make clippy happy... again

* style(lint): make clippy happy... again (chapter 2)

* style(comment): remove unused

* fix(colors): export COLORTERM and respond to XTVERSION

* fix(test): color register count

* fix(stdin): adjust STDIN sleep times
2022-07-08 17:19:42 +02:00
har7an
c26a6bcf56
refactor(crates): move shared contents from zellij tile to zellij utils (#1541)
* zellij-tile: Move `data` to zellij-utils

The rationale behind this is that all components of zellij access the
data structures defined in this module, as they define some of the most
basic types in the application. However, so far zellij-tile is treated
like a separate crate from the rest of the program in that it is the
only one that doesn't have access to `zellij-utils`, which contains a
lot of other data structures used throughout zellij.

This poses issues as discussed in
https://github.com/zellij-org/zellij/pull/1242 and is one of the reasons
why the keybindings in the status bar default plugin can't be updated
dynamically. It is also the main reason for why the keybindings are
currently passed to the plugin as strings: The plugins only have access
to `zellij-tile`, but since this is a dependency of `zellij-utils`, it
can't import `zellij-utils` to access the keybindings.
Other weird side-effect are that in some places `server` and `client`
have to access the `zellij-tile` contents "through" `zellij-utils`, as
in `use zellij_utils::zellij_tile::prelude::*`.

By moving these central data structures to one common shared crate
(`zellij-utils`), `zellij-tile` will be enabled to import `zellij-utils`
like `screen` and `client` already do. This will, next to other things,
allow dropping a lot of `std::fmt::Fmt` impls needed to convert core
data structures into strings and as a consequence, a lot of string
parsing in the first place.

* utils: Integrate new `data` module, bump rust ver

Integrates the `data` module that was previously part of `zellij-tile`
to allow sharing the contained data structures between all components of
zellij.

This allows `zellij-tile` to use `utils` as a dependency. However, since
`tile` is build against the wasm target, it cannot include all of
`zellij-utils`, since a lot of dependencies there cannot compile with
`wasm` as target (Examples include: termwiz, log4rs, async-std). Thus we
make all the dependencies that cannot compile against `wasm` optional
and introduce a new feature `full` that will compile the crate with all
dependencies. Along with this, modify `lib.rs` to include most of the
data structures only when compiling against the `full` feature.

This makes the compiles of `zellij-tile` lighter, as it doesn't include
all of `utils`. As a side effect, due to the dependency notation for the
optional dependencies (See
https://doc.rust-lang.org/cargo/reference/features.html#optional-dependencies),
we bump the rust toolchain version to 1.60.0.

* tile: Import `data` from zellij-utils

Add `zellij-utils` as a dependency to `zellij-tile` and allow us access
to the `data` module defined there. Update the re-export in the
`prelude` such that from all of the plugins points of view *absolutely
nothing changes*.

* utils: Fix `data` module dependency

Since the `data` module has been migrated from `zellij-tile` to
`zellij-utils`, we import it from `zellij-utils` directly now.
Also unify the imports for the `data` module members: We import all of
the through `data::` now, not through a mixture of `data::` and
`prelude::`.

* client: Fix `data` module dependency

Since the `data` module has been migrated from `zellij-tile` to
`zellij-utils`, we import it from `zellij-utils` directly now.
Also unify the imports for the `data` module members: We import all of
the through `data::` now, not through a mixture of `data::` and
`prelude::`.
Add the "full" feature flag to the `zellij-utils` dependency so it
includes all the components we need.

* server: Fix `data` module dependency

Since the `data` module has been migrated from `zellij-tile` to
`zellij-utils`, we import it from `zellij-utils` directly now.
Also unify the imports for the `data` module members: We import all of
the through `data::` now, not through a mixture of `data::` and
`prelude::`.
Add the "full" feature flag to the `zellij-utils` dependency so it
includes all the components we need.

* tests: Fix `data` module dependency

Since the `data` module has been migrated from `zellij-tile` to
`zellij-utils`, we import it from `zellij-utils` directly now.

* utils: Remove "full" feature

in favor of conditional compilation using `target_family`. Replace the
rust 1.60 method of specifying optional dependencies based on features
and optionally include the dependencies only when not building for wasm
instead. (I.e. `cfg(not(target_family = "wasm"))`)

* cargo: Update module dependencies

since `client`, `server` and `tile` now all depend on `utils` only.
2022-07-06 16:06:56 +02:00
a-kenji
e23bbfddaa
fix: various typos (#1553)
Because they were wrong.
2022-07-02 19:54:50 +02:00
raphCode
7cd355efaf
roll over logs / fix filling up /tmp with logs (#1548)
* roll over logs at 20 MB

* Change cap to 100 kB

* Add fix to changelog
2022-06-28 13:38:43 +02:00
a-kenji
7ed66d3e78
add(feature): unstable (#1542)
Add a feature `unstable`, which is intended to communicate the same
intent.

Gate: Send actions from cli with the `unstable` feature.
2022-06-25 21:48:00 +02:00
Ramon
b3fab84557
feat(theme): allow hex colors for themes (#1536)
* feat(theme): allow hex colors for themes

* feat(theme): allow hex strings to start with #

* fix: fix formatting issue

* fix: remove debug print statement

* fix: apply clippy suggestion for # code

Co-authored-by: ramonGonzEdu <rg2872079@gmail.com>
2022-06-24 12:05:34 +09:00
har7an
59d753dc2f
fix: Make key order consistent (#1539)
The order of the "arrow" keys is always left/down/up/right, make the
keybindings for the Scroll mode align with this ordering.
2022-06-23 21:41:57 +02:00
Jae-Heon Ji
8e2be2c61e
feat: add action to undo rename (#1513) 2022-06-18 09:58:42 +09:00
a-kenji
0b6001305b
feat: add capability to dispatch actions from cli (#1265)
* feat: add capability to dispatch actions from cli

Add capability to dispatch actions from the cli.

Can be invoked through `zellij action [actions]`

Automatically sends the action either to the current session,
or if there is only one session to the single session.

If there are multiple sessions, and no session is specified it will
error out.

Example:
1.
```
zellij action "[NewTab: , NewTab: ]"
```
2.
```
zellij -s fluffy-cat action '[NewPane: , WriteChars: "echo Purrr\n" ]'
```
3.
```
zellij -s fluffy-cat action '[ CloseTab, ]
```

* add: error message on malformed input

Add an error message on malformed input, for the `action`'s dispatch.
Rather than resulting in a panic.

* add: function to query the client id

* add: send specific actions to certain clients

Adds ability to send actions, that don't impact the server state
to all connected clients. For example `MoveFocus`

* add: client_id to non blocking actions

* chore(fmt): `cargo fmt`

* add: pick correct session, if there is exactly one

* add: use correct `client_id` for detach action

* add: make `[ ]` opaque to the user

* add: miette to toplevel to improve error message

* add: fake client reading configuration

Add the fake client reading configuration files,
this allows actions, that rely on configuration work
correctly. This is an intermediate solution, and should ideally not
be needed. It would be better if most of this state would be handled
by the server itself.

* chore(fmt): rustmt

* add: ability to detach multiple clients

Add ability to detach multiple clients at the same time.

* remove: obsolete functionality

* remove: unused functionality

* add: send correct action upon exiting

* chore(update): cargo update
2022-06-15 11:20:06 +02:00
a-kenji
f5a8f95307
chore(deps): update clap: 3.1.18 -> 3.2.2 (#1496) 2022-06-14 18:32:19 +02:00
a-kenji
298ea2d9b7
fix(cli): clear up tooltip information (#1488) 2022-06-11 15:57:25 +02:00
a-kenji
67d2673cae
add(style): add trailing comma in match blocks (#1483)
This makes it easier to distinguish from normal blocks
2022-06-10 20:03:13 +02:00
Kian-Meng Ang
16b53aa52f
docs: fix typos (#1481) 2022-06-10 23:37:55 +09:00
a-kenji
3ee214ef35
add(option): default_layout (#1467)
* add(option): `default_layout`

Add `option` `default_layout` / `default-layout`,
that allows specifying a different layout, that should
be loaded on start.

Eg:
```
default_layout: compact
```

* add(manpage): `default_layout`
2022-06-07 21:32:04 +02:00
a-kenji
f005c843d8
remove: obsolete comment (#1465) 2022-06-07 20:18:11 +02:00
a-kenji
0f24e684b6
chore(deps): update crossbeam (#1463)
There is a possible race condition in `0.8.0`.
2022-06-07 18:14:05 +02:00
raphCode
92c5c6cb03
Add logging to ipc receiver (#1459)
* Add logging to ipc receiver

* Add to changelog
2022-06-07 17:14:22 +02:00
Aram Drevekenin
6d15af04bd chore(version): bump development version 2022-06-07 15:38:56 +02:00
Cosmin Popescu
e1fcf3a6db
feat(scroll): edit scrollback with default editor (#1456)
* initial commit for opening the current buffer in an editor

* fix(editor): take hidden panes into consideration when manipulating tiled grid

* when closing an edit buffer, take the geometry of the replaced buffer from the closed buffer

* if the floating panels are displayed, don't add to hidden panels the current buffer

* strategy changing - put the panels inside a suppressed_panels HashMap instead of hidden_panels

* Revert "strategy changing - put the panels inside a suppressed_panels HashMap instead of hidden_panels"

This reverts commit c52a203a20.

* remove the floating panes by moving them to the tiled_panes in hidden_panels

* feat(edit): open editor to correct line and don't crash when none is set

* formatting

* feat(edit): use suppressed panes

* style(fmt): rustfmt and logs

* style(fmt): clean up unused code

* test(editor): integration test for suppressing/closing suppressed pane

* test(e2e): editor e2e test

* style(fmt): rustfmt

* feat(edit): update ui and setup

* style(fmt): rustfmt

* feat(config): allow configuring scrollback_editor explicitly

* style(fmt): rustfmt

* chore(repo): build after merging

Co-authored-by: Aram Drevekenin <aram@poor.dev>
2022-06-06 09:20:07 +02:00
a-kenji
d62e6fb57e
add(plugin): compact-bar & compact layout (#1450)
* add(plugin): `compact-bar` & `compact` layout

* add(nix): `compact-bar` plugin

* add(config): `compact-bar` to the config

* add(workspace): `compact-bar` to workspace members

* add(assets): `compact-bar`

* chore(fmt): rustfmt

* add(nix): add `compact-bar`

* add: compact layout to dump command

* nix(build): fix destination of copy command

* add(makefile): add `compact-bar` to `plugin-build`

* add(layout): `compact-bar` to layout

* add: install `compact-bar` plugin

* fix(test): update input plugin test

* fix(plugin): default colors for compact-bar
2022-06-03 11:14:38 +02:00
a-kenji
9dbec05ff9
fix: clarify help text (#1442) 2022-05-30 23:11:36 +02:00
Spyros Roum
2f58835f07
feat(cli): merge --layout and --layout-path (#1426)
* Merge --layout and --layout-path

* Fix e2e tests

* style(comment): reword help text

Co-authored-by: Aram Drevekenin <aram@poor.dev>
2022-05-28 12:20:41 +02:00
Jae-Heon Ji
f7c019743a
fix: add checking for missing extensions (#1432) 2022-05-24 13:09:01 +09:00
Cosmin Popescu
76d871294d
feat(actions): dump the terminal screen into a file (#1375)
* Initial commit for fixing #1353

* adding a new line between the lines_above and the viewport

* changes following code review

* implementing a test case for the dump screen

* implemented test case for dump_screen

* better regexp replace

* fixes following code review

* style(api): remove extraneous method in plugin pane

* style(fmt): rustfmt

* style(tests): fix method name

Co-authored-by: Aram Drevekenin <aram@poor.dev>
2022-05-20 11:22:40 +02:00
Thomas Linford
e663ef2db7
fix: ensure pty_writer thread closes (#1422) 2022-05-17 20:29:06 +02:00
Thomas Linford
e8f9559062
fix(pty): paste freeze with large amounts of text (#1383)
add pty writer thread to avoid screen thread blocking on unistd::write
2022-05-16 21:14:57 +02:00
Jae-Heon Ji
8c38b39ef6
fix: update to output error when using --layout (#1413) 2022-05-12 22:42:31 +09:00
Luke Stadem
a017a6512d
feat: Shows subcommand aliases in help text (#918) (#1409) 2022-05-10 16:36:57 +02:00
a-kenji
b56bfecdf0
fix: a small typo (#1390) 2022-05-10 09:01:18 +02:00
dependabot[bot]
fe9fa2d60a
build(deps): bump log from 0.4.16 to 0.4.17 (#1386)
Bumps [log](https://github.com/rust-lang/log) from 0.4.16 to 0.4.17.
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/log/commits/0.4.17)

---
updated-dependencies:
- dependency-name: log
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-05-09 18:32:36 +02:00
Aram Drevekenin
3177542674 chore(version): bump development version 2022-05-02 22:54:23 +02:00
Aram Drevekenin
a7ddfe1acc chore(release): v0.29.1 2022-05-02 22:31:08 +02:00
Aram Drevekenin
77e9dc93f7 chore(version): bump development version 2022-05-02 14:00:20 +02:00
Aram Drevekenin
0dc136ec5f
fix(compatibility): respond to bg and fg color ansi queries (#1358)
* fix(compatibility): respond to background/foreground queries

* style(fmt): rustfmt

* style(clippy): make clippy happy

* style(fmt): rustfmt

* style(fmt): remove unused code
2022-04-28 17:26:44 +02:00
Aram Drevekenin
7ba49658f7
fix(ipc): empty ipc msg crash (#1351)
* fix(ipc): recover from corrupted channel state

* style(fmt): rustfmt
2022-04-27 10:44:14 +02:00
Jae-Heon Ji
be0af7e69c
feat: support the command of auto-start script for shell (#1281) 2022-04-21 00:28:09 +09:00
Jae-Heon Ji
f2a7e73687
fix: minor system improvements (#1328) 2022-04-16 16:11:46 +09:00
Thomas Linford
198625b055
feat(copy): add copy_on_select option (#1298)
* feat(copy): add copy_on_select option

with default value of true, keep current behavior of automatically
copying selection to clipboard when done selecting.
with copy_on_select = false, on mouse release the selection remains, and
can be copied with the `Copy` action.

* add example to default.yaml

* add copy action example to default.yaml, cleanup

* fix updated tab tests

* fix selection changing while scrolling after release

* fix clippy warnings
2022-04-16 09:04:06 +02:00
Aram Drevekenin
bf21442186 chore(version): bump development version 2022-04-13 19:17:09 +02:00
Aram Drevekenin
3a2fee601a chore(package): patch version 2022-04-13 18:46:00 +02:00
Aram Drevekenin
85262ba8ad docs(config): add link to theme examples 2022-04-13 15:38:32 +02:00
Aram Drevekenin
25492b448d fix(ui): adjust default bg color 2022-04-13 15:36:04 +02:00
Aram Drevekenin
4f13307828 fix(ui): adjust default colors 2022-04-13 15:23:42 +02:00
Aram Drevekenin
19adb29be5 feat(signals): support XTWINOPS 14 and 16 (and query the terminal for them on startup and SIGWINCH) (#1316)
* feat(signals): get pixel info from terminal emulator

* feat(signals): query for pixel info on sigwinch

* feat(signals): reply to csi 14t and csi 16t

* style(fmt): rustfmt

* style(comments): remove outdated
2022-04-12 18:07:32 +02:00
Thomas Linford
ff5773bc6e
chore(deps): update termwiz to 0.16.0 (#1303) 2022-04-07 18:47:36 +02:00
Kunal Mohan
9f716487ca
Improve theme usage + add default ones (#1274)
* Remove gray from theme config and improve colors for dark themes

* improve theme usage

* Add new themes and minor fixes

* improve tokyo-night theme according to new changes

* Fix formatting

* change default black colour

* docs(CHANGELOG): #1274 improve themes
2022-04-02 03:19:42 +05:30
Aram Drevekenin
8439198636 chore(version): bump development version 2022-03-31 15:07:18 +02:00
dependabot[bot]
a4ad296875
build(deps): bump log from 0.4.14 to 0.4.16 (#1278)
Bumps [log](https://github.com/rust-lang/log) from 0.4.14 to 0.4.16.
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/log/commits)

---
updated-dependencies:
- dependency-name: log
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-28 10:40:45 +02:00
Aram Drevekenin
18ee784e2d
feat(ui): add navigation with alt + arrow keys (#1264)
* feat(ui): change from non-working alt-brackets to alt-arrows

* style(fmt): rustfmt

* fix: improve parsing of `alt` combination keys

The binding of the keys can now be specified with:

- Alt: 'c'
- Alt: Up
- Alt: Down
- Alt: Left
- Alt: Right

* chore(fmt): rustfmt

Co-authored-by: a-kenji <aks.kenji@protonmail.com>
2022-03-25 14:28:08 +01:00
Aram Drevekenin
7141779153
chore(deps): move from termion to termwiz for STDIN handling (#1249)
* fix(deps): switch from termion to termwiz for STDIN parsing

* style(fmt): clippy

* style(fmt): moar clippy

* style(fmt): rustfmt

* fix(tests): e2e mouse press

* style(fmt): rustfmt

* bring back polling

* fmt fmt fmt

* fix some e2e flakiness
2022-03-23 09:08:35 +01:00
Brooks Rady
9bfafde123
feat(ui): round frame corners (#1227)
* feat(ui): round frame corners

* Allow rounded_corners to be set without a palette

* Revert "Allow rounded_corners to be set without a palette"

This reverts commit 9271a4b545.

* fix(style): remove redundant code

* fix(style): clippy lints that somehow got missed

* feat(config): add ui config section
2022-03-22 14:58:16 +00:00
Jae-Heon Ji
ec319794a5
chore: bump nix version to 0.23.1 (#1234) 2022-03-17 21:29:20 +09:00
a-kenji
092926c5d8
fix(wasm_vm): use cache_dirs for ephemeral plugin data (#1230)
fix(wasm_vm): use `cache_dirs` for ephemeral plugin data

Use proper `cache_directories` by default, that users can be expected
to have proper write permissions for.

The directory is used for plugin hashes, and compilation data.
2022-03-17 11:57:38 +01:00
a-kenji
b0276dfd74
fix(feat): disable_automatic_asset_installation (#1226)
* fix(feat): `disable_automatic_asset_installation`

This fixes a regression in the feature system:
The asset installation didn't get turned off by the feature.

Add error logging to the install functions.

Properly show features in setup

disable `mkdir` in `wasm_vm` on `feature-disable-asset-installation`

Alternative:
    Is this even needed? We make sure the directory is there upon the
    normal asset installation.

fixes #1130
2022-03-17 11:40:09 +01:00
Aram Drevekenin
2e03692f5b chore(version): bump development version 2022-03-16 14:25:08 +01:00
Aram Drevekenin
9c7d13984f chore(release): v0.26.1 2022-03-16 14:03:07 +01:00
a-kenji
c2e388f339
fix: deprecated function in clap (#1225)
`CommandFactory::into_app()` is deprecated in
favor of `CommandFactory::command()`
2022-03-16 13:15:07 +01:00
Jae-Heon Ji
0b74604a9f
feat: improve error reporting system (#1038)
* feat: add draft a concept code

* feat: add err_ctx to diagnostic

* feat: optimize error report

* chore: add user-friendly help

* fix: manual merge lockfile from main
2022-03-13 20:46:03 +09:00
Aram Drevekenin
779679f53b chore(version): bump development version 2022-03-11 16:13:01 +01:00
a-kenji
21f7b5baa5
fix(config): allow POSIX style --config override (#1205)
Allow multiple `--config` flags, then use the latter.

Also allows similar behaviour for similar flags.

fixes: #310
2022-03-10 22:19:19 +01:00
Hoang Nguyen
58e816211e
fix(comp): typo in long option '--generate-completion' for fish (#1183) 2022-03-06 19:47:33 +01:00
a-kenji
d341f455ea
fix(comp): typo and add new option (#1178)
Use `-x` for exlusive options
2022-03-05 20:41:58 +01:00
a-kenji
e2ce261210
add(comp): dynamic completions for fish (#1176)
And infrastructure to make it possible
to add more dynamic completions for
different shells in the future.

eg:

```
zellij attach [completes-active-sessions]
zellij kill-session [completes-active-sessions]
```

fixes: #1030
2022-03-05 16:23:51 +01:00
a-kenji
cd4b8ae8b6
fix(layout): allow lowercase keys and values (#1160)
A layout needed to be specified as follows:
```
---
template:
  direction: Horizontal
  parts:
    - direction: Vertical
      body: true
    - direction: Vertical
      borderless: true
      split_size:
        Fixed: 1
```
now the same layout can be specified as:
```
---
template:
  direction: horizontal
  parts:
    - direction: vertical
      body: true
    - direction: vertical
      borderless: true
      split_size:
        fixed: 1
```
2022-03-03 14:08:51 +01:00
a-kenji
6d653e1521
add: set env var's from config and layout (#1154)
Add ability to set `ENVIRONMENT VARIABLES` from the
config and the layout files.

example:

```
env:
  ZELLIJ_CONFIG:
    DEFAULT
```

or

```
env:
  ZELLIJ_LAYOUT_NAME:
    BUILD_SESSION
```

If two keys conflict (configuration and layout), then the key
from the layout is used.

fixes: #1059
2022-03-01 15:47:52 +01:00
a-kenji
4f84c36024
fix: typo in error message (#1151) 2022-02-28 23:00:47 +01:00
Kerfuffle
e2081f2649
fix: Allow terminal title passthrough even when not drawing pane frames. (#1113)
* fix: Allow terminal title passthrough even when not drawing pane frames.

* Minor formatting fix.

* Handle case where the session name is not set.
2022-02-28 17:54:41 +01:00
Cason Adams
ca015ce9b6
add tmux ctrl+b d shortcut for detach (#1116) 2022-02-27 12:03:17 +01:00
Cason Adams
8577dfca02
add: a few extra tmux binding keys (#1098) 2022-02-24 10:19:02 +01:00
a-kenji
06184e8a32
add(conf): add action to send ^b (#1106)
add an action to send `^b` while in `tmux-mode`

fixes #1095
2022-02-24 04:58:27 +01:00
Jae-Heon Ji
a489194b55
fix: invalid assignment of client_id (#1052)
* feat: sync socket connection in

* chore: apply clippy

* chore: change message name
2022-02-23 23:50:49 +09:00
Aram Drevekenin
39eddd8b1c chore(version): bump development version 2022-02-22 13:36:39 +01:00
Aram Drevekenin
a0a0a7e5c4
feat(ux): tmux mode (#1073)
* work

* basic tmux move and functionality

* tmux mode ui

* rustfmt
2022-02-21 15:52:42 +01:00
Aram Drevekenin
821e7cbc5a
feat(ui): add floating panes (#1066)
* basic functionality

* close and reopen scratch terminal working

* embed/float and resize whole tab for floating and static floating panes

* move focus working

* fix focus change in floating panes

* move pane with mouse

* floating z indices

* tests and better resize algorithm

* starting to work on performance

* some performance experimentations

* new render engine

* reverse painters algorithm for floating panes

* fix frame buffering

* improve ux situation

* handle multiple new panes on screen without overlap

* adjust keybindings

* adjust key hints

* fix multiuser frame ui

* fix various floating/multiuser bugs

* remove stuff

* wide characters under floating panes

* fix wide character frame override

* fix non-frame boundaries interactions with floating panes

* fix selection character width

* fix title frame wide char overflow

* fix existing tests

* add tests

* refactor output out of tab

* refactor floating panes out of tab

* refactor tab

* moar refactoring

* refactorings and bring back terminal window title setting

* add frame vte output

* remove more unused stuff

* remove even more unused stuff

* you know the drill

* refactor floating panes and remove more stuffs

* refactor pane grids

* remove unused output caching

* refactor output

* remove unused stuff

* rustfmt

* some formatting

* rustfmt

* reduce clippy to normal

* remove comment

* remove unused

* fix closign pane

* fix tests
2022-02-18 21:10:06 +01:00
Thomas Linford
18709acde9
feat(copy): allow osc52 copy destination configuration (#1022)
add copy_cliboard  option to allow configuring copy destination to primary selection instead of default clipboard
2022-02-02 15:22:34 +01:00
Jae-Heon Ji
1d2e303926
feat: add focus attribute in layout (#958)
* feat(layout): add focus attribute in layout

* feat: add state of focus to tab

* chore: i love clippy

* test(layout): update focus options

* feat: add focus pane

* feat: apply focus-pane when layout is only loaded

* change the instruction name for focus-on-tab

* chore: apply cargo-fmt

* test: add e2e testcase
2022-02-01 02:19:21 +09:00
a-kenji
c82ee774ce
fix(config): warn on mode without actions (#1035)
Log with a warning, if the user finds himself in a mode,
that has no action associated with it.

fix #949
2022-01-31 16:24:06 +01:00
Marcin Puc
e58b67ce2e
chore(deps): update arg parsing to clap v3 (#1017)
* Update arg parsing to clap v3
* Ignore shell argument case
2022-01-23 20:59:03 +01:00
Jordan Callicoat
5f86dc4fd0
doc(config): add copy-command examples to default config (PR #996) (#1019) 2022-01-20 17:36:59 +01:00
Christophe Verbinnen
9cc2645db0
Add a copy command option (#996)
Usage: zellij options --copy-command "xclip -sel clip"

Co-authored-by: Christophe Verbinnen <christophev@knowbe4.com>
2022-01-15 12:38:45 +01:00
Aram Drevekenin
e06300f7db chore(version): bump development version 2022-01-05 11:14:15 +01:00
Kunal Mohan
e23d06b70d
Feature: Configurable scroll buffer (#936)
* Configurable scroll buffer

* Fix unit test failures

* Add scroll_buffer_size description in the default config file

* Fix config file
2022-01-04 23:24:05 +05:30
Aram Drevekenin
d4b14d7657
feat(keybinds): improve default keybindings (#991) 2022-01-04 17:24:18 +01:00
LordMZTE
9e74d8d617
fix(plugins): typo that gives plugins the wrong theme (#975) 2021-12-28 08:58:25 +01:00
Aram Drevekenin
ce8e898e6d chore(version): bump development version 2021-12-20 18:31:54 +01:00
Aram Drevekenin
6175d57702 chore(version): bump development version 2021-12-20 17:56:47 +01:00
Aram Drevekenin
ca8438b0aa
feat(collaboration): implement multiple users (#957)
* work

* feat(collaboration): implement multiple users

* style(cleanup): some leftovers
2021-12-20 17:31:07 +01:00
Aram Drevekenin
1a991ce7fb chore(version): bump development version 2021-12-14 17:32:02 +01:00
Aram Drevekenin
5f1f190a85 chore(version): bump development version 2021-12-13 16:19:37 +01:00
Kunal Mohan
c75bcbd937
Feature: Add pane names (#928)
* Read pane name from layout

* Update pane name at runtime

* Fix tests

* prefer and render pane name over pane title

* fix clippy errors

* fix after rebase
2021-12-09 23:30:40 +05:30
Aram Drevekenin
92bddf1b79
fix(plugins): support multiple users (#930)
* fix(plugins): support multiple clients

* fix(style): make clippy happy
2021-12-08 18:41:41 +01:00
Marcin Puc
56e85f87d6
fix(style): various internal refactorings 2021-12-07 10:24:42 +00:00
a-kenji
050fa8fd07
fix(config): unbind keys correctly (#925)
* turn off the merging of key bindings of layout and configuration
  files for now.

  In certain situations the keybindings would be overwritten.

  Fix #923
2021-12-04 16:06:20 +01:00
a-kenji
b78a6d4258
fix(assets): update config option examples (#920)
* update config option examples:
  ```
  no_pane_frames -> pane_frames
  no_mouse_mode -> mouse_mode
  ```

closes #916
2021-12-03 11:13:56 +01:00
Aram Drevekenin
cbe0d5405e
fix(compatibility): do not duplicate bracketed paste in chunked stdin input (#917)
* debug message

* fix attempt

* oops

* remove log message

* rustfmt

* style(clippy): make clippy happy

* style(clippy): make clippy happy again!
2021-12-02 18:35:55 +01:00
a-kenji
adee5e78a9
fix(theme): add gray to theme (#914)
fix #912

* Add `gray` to theme
2021-11-30 11:03:20 +01:00
Tw
d7e460a3d6
Fix: missing theme in config (#913)
Signed-off-by: Tw <wei.tan@intel.com>
2021-11-30 09:46:48 +01:00
Aram Drevekenin
1ee743156c chore(version): bump development version 2021-11-29 10:09:22 +01:00
Brooks J Rady
7cb165f0c2 fix(style): remove unused imports 2021-11-27 15:35:37 +00:00
Aram Drevekenin
6c6a4393f4
This adds a UI for multiple users in panes (behind a feature flag) (#897)
* feat(ui): multiple users in panes

* style(fmt): make rustfmt happy

* style(fmt): make clippy happy
2021-11-25 16:21:59 +01:00
a-kenji
cd55c86260
Feat: add esc to exit modes (#889)
* Add ability to return to normal mode from any mode,
  except for the locked mode, by pressing the escape key
  to the default keybindings

  fix #887
2021-11-23 12:42:15 +01:00
a-kenji
b861baa6a1
First attempt to provide an overlay prompt (#871) 2021-11-15 20:13:05 +01:00
a-kenji
f6813df0e8
fix(typo): fix setup --check (#869) 2021-11-15 14:41:19 +01:00
a-kenji
347e02ea35
feature(layout): add layout config (#866)
feature(layout): add layout config (#866)
* It is now possible to configure zellij through a layout:

  The config file and the layout file will be merged, on conflicting
  options the order is as follows:
  1. config options `zellij options`
  2. layout
  3. config

  Example:
```
---
template:
  direction: Horizontal
  parts:
    - direction: Vertical
      body: true
    - direction: Vertical
      borderless: true
      split_size:
        Fixed: 1
      run:
        plugin:
          location: "zellij:tab-bar"
default_shell: fish
```
2021-11-14 22:58:20 +01:00
a-kenji
bd8c834d7c
fix(options): handling and overwriting cli opts (#859)
* fix(options): handling ond verwriting cli opts

* previously it was only possible to turn off certain features with a
  command line option, now it is possible to also overwrite this
  behavior in a sane way, for that some breaking changes happened:

  following options got renamed and inverted:
  ```
  disable_mouse_mode -> mouse_mode
  no_pane_frames -> pane_frames
  ```

  following cli options got added:
  ```
  mouse-mode [bool]
  pane-frames [bool]
  simplified-ui [bool]
  ```

  the following cli flag got removed:
  ```
  simplified-ui
  ```

  They can be specified in the following way:
  ```
  zellij options --mouse-mode true
  ```
  in order to enable the mouse mode, even if it is turned off in the
  config file:
  ```
  mouse_mode: false
  ```

  The order is now as follows:
  1. corresponding flag (`disable-mouse-mode`)
  2. corresponding option (`mouse-mode`)
  3. corresponding config option (`mouse_mode`)

* add: options and flags for the same value conflict

* example:
  ```
  zellij options --mouse-mode true --disable-mouse-mode`
  ```
  ```
  $ error: The argument '--mouse-mode <mouse-mode>' cannot be used with '--disable-mouse-mode'
  ```
2021-11-11 17:13:34 +01:00
Aram Drevekenin
26bd80be2d chore(version): bump development version 2021-11-10 18:01:56 +01:00
Aram Drevekenin
0fec10b08b chore(release): v0.20.1 2021-11-10 17:54:39 +01:00
a-kenji
abbe3b237a
add(feature): toggle boolean options with cli flag (#855)
add the ability to toggle boolean options with a cli flag:

example:
    if the pane frames are turned off in the config file,
    then passing in the `--no-pane-frames` flag will toggle the
    pane frames on
2021-11-10 13:31:37 +01:00