* feat(layout): Support environment variables in cwd (#2288)
* add `shellexpand` as dependency
* expand environment variable in kdl parser's `parse_cwd()`
* Fix and enhance environment variable expansion.
* Return a proper `ConfigError` on failures.
* Replace raw cwd parsing with `parse_cwd()`.
* Add tests that verify correct expansions.
* Perform env var expansion in more contexts.
* feat(layout): Rewrite env var tests as snapshots.
* Update layout env var expansion test snapshot.
* init commit
* add default config to kdl file
* change the field from `default_cwd` to `override_cwd`
* change back to default_cwd
* fix test
* default cwd works without `default_shell`
* extend display char in tab
* Add action to list all tab names
* print tab names and remove logs
* change msg name, and handle Log in normal client
* fix log
* resolve code conflict
* change var name
* add snapshot test
* fix failed test case
* restore snapshot
* Revert "restore snapshot"
This reverts commit b97a9512ab106615a1a1e5882392a03a17cdf1a3.
* restore snapshot
* revert snapshot
* 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
* docs(changelog): layout fixes
* fix(messaging): cache hold pane messages by their tab_id if the tab is not ready (#2196)
* fix(messaging): cache hold pane messages by their tab_id if the tab is not ready
* style(fmt): rustfmt
* docs(changelog): open panes fix
* fix(layout): tab focus (#2197)
* fix(layout): tab focus
* style(fmt): rustfmt
* docs(changel0g): tab focus fix
* 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
* docs(changelog): new-tab cli layout folder fix
* fix(kdl): new-tab keybind looks in layout_dir for layouts (#2200)
* fix(themes): missing tokyo-night-dark theme
* fix(kdl): new-tab keybind also looks in layout_dir for layouts
* docs(changelog): new-tab keybind layout folder fix
* fix(cli): edit cwd (#2201)
* fix(cli): properly set cwd for edit panes
* fix(layouts): properly set cwd for edit panes
* style(fmt): rustfmt
* docs(changelog0
* fix(layouts): do not relayout twice on auto_layout (#2202)
* fix(layouts): do not relayout twice on auto_layout
* style(fmt): rustfmt
* fix(new-tab): get config parameters from config file (#2203)
* fix(cli): take default shell from config if it exists when opening new tab
* fix(cli): take layout dir from config when opening new tab if it exists
* style(fmt): rustfmt
* docs(changelog): new-tab config parameters
* fix(grid): only use background pending styling when deleting characters (#2204)
* docs(changelog): neovim underline fix
* feat(layouts): exact panes constraint (#2206)
* style(fmt): remove warnings
* fix(swap-layouts): introduce exact panes constraint
* fix(swap-layouts): improve floating pane swap layout ux
* style(fmt): rustfmt
* docs(changelog): exact panes constraint
* fix(pty): report no-cwd for empty path returned from sysinfo (#2213)
* fix(sixel): report pixel size in winsize change ioctl (#2212)
* fix(sixel): report pixel size in winsize change ioctl
* style(fmt): rustfmt
* docs(changelog): various fixes
* style(code): naming
* test(log): adjust query tab names test to look at the log message
* style(fmt): rustfmt
---------
Co-authored-by: Aram Drevekenin <aram@poor.dev>
Co-authored-by: Jae-Heon Ji <32578710+jaeheonji@users.noreply.github.com>
* Add unit test for plugin run location parsing
* Fix file plugin parsing for relative paths
* Update test to check for path with spaces
* Add a couple more tests
* fix(cli): take default shell from config if it exists when opening new tab
* fix(cli): take layout dir from config when opening new tab if it exists
* style(fmt): rustfmt
* 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
* 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
* 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
* 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
* 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
* 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`.
* 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
* 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
* 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
* 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!