Skip to content

Commit

Permalink
some more work on the blogpost and updated roadmap
Browse files Browse the repository at this point in the history
  • Loading branch information
imsnif committed Apr 10, 2024
1 parent c88fb9d commit e542d66
Show file tree
Hide file tree
Showing 39 changed files with 5,098 additions and 651 deletions.
44 changes: 30 additions & 14 deletions content/news/welcome-screen-pipes-filepicker.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,32 +14,46 @@ type:
# alttext: "An image of the Zellij session manager, showing a list of sessions it would be possible to switch to, as well as information about their tabs, panes and connected users"
weight: 10
---
Zellij 0.40.0 has just been released! [Grab it while it's hot!](https://github.com/zellij-org/zellij/v0.40.0)

Some highlights:
- [Welcome Screen](#welcome-screen)
- [New Filepicker](#new-strider--filepicker)
- [Pipes](#pipes)
- [Open Floating Panes at Specific Coordinates](#open-floating-panes-at-specific-coordinates)
- [Rearrange Tabs](#rearrange-tabs)
- [Disconnect other Clients](#disconnect-other-clients)
- [Plugin Aliases](#plugin-aliases)
- [New Possible Keys to Bind](#new-possible-keys-to-bind)
- [Performance Improvements](#performance-improvements)
- [Do you like Zellij?](#do-you-like-zellij-) ❤️

## Welcome Screen
{{<figure src="/img/welcome-screen.gif" width="800px;" alt="An image of the Zellij welcome screen">}}
This new release introduces the "welcome screen". The welcome screen is a friendly menu, intended to be run on terminal startup and allow users to either:
1. Start a new session (optionally with a specific name or in a chosen folder)
2. Attach to a running session
3. Resurrect an exited session

[Read more](TODO: LINK TO SCREENCAST)

## Pipes
Zellij pipes are a new way to send messages to plugins and allow plugins to communicate with each other.

Messages can be sent to plugins through the CLI: (eg. `zpipe my-plugin hi!`), from a keybinding or indeed from another plugin. A destination plugin that does not exist will be loaded on the first pipe message.

Pipes also integrate seamlessly with existing shell pipes, providing flow control and giving plugin authors the ability to visualize data from the command line, allow users to pause a command line pipe mid-stream on certain messages or on a keystroke. We believe this functionality will help utilize the full 2 dimensions of the terminal window as never before, popping up floating panes in certain conditions and creating a many-to-many windowed pipeline. We look forward to seeing what plugin authors come up with!

// TODO: filter demo
Learn more about [session management](/tutorials/session-management).

## New Strider / Filepicker
{{<figure src="/img/filepicker-zpipe.gif" width="800px;" alt="An image of the Zellij filepicker copying the dynamically selected file to a specific destination">}}
This release includes a complete rework of Zellij's built-in filepicker, Strider. The filepicker allows users to quickly browse through their filesystem, opening files in their default editor in new Zellij panes or opening a terminal in a specific location.

With the help of [pipes](#pipes), as seen in the above gif, one can use this filepicker to interactively choose a file or folder in the filesystem and print its path into `STDOUT`. For example: `zpipe filepicker | xargs -i cp {} my-chosen-file`.
With the help of [pipes](#pipes), one can use this filepicker to interactively choose a file or folder in the filesystem and pipe the result to another command through a traditional shell pipe. For example: `zpipe filepicker | xargs -i cp {} my-chosen-file`.

The filepicker can also be used from within other plugins to offload filepicking functionality rather than have the plugin implement it on its own. In fact, this is exactly what the welcome screen does in the example at the top of this post.

Learn more about [the filepicker](/tutorials/filepicker).

## Pipes
Zellij pipes are a new way to send messages to plugins and allow plugins to communicate with each other.

Messages can be sent to plugins through the CLI: (eg. `zpipe my-plugin hi!`), from a keybinding or indeed from another plugin. A destination plugin that does not exist will be loaded on the first pipe message.

Pipes also integrate seamlessly with existing shell pipes, providing flow control and giving plugin authors the ability to visualize data from the command line, allow users to pause a command line pipe mid-stream on certain messages or on a keystroke. We believe this functionality will help utilize the full 2 dimensions of the terminal window as never before, popping up floating panes in certain conditions and creating a many-to-many windowed pipeline. We look forward to seeing what plugin authors come up with!

## Open Floating Panes at Specific Coordinates
A much requested feature after the introduction of floating panes, was to be able to open floating panes at specific coordinates and at specific sizes. Ths is now possible from the CLI (either with fixed numbers or percentage of the viewport): `zellij run --width 50 --height 20% -x 10% -y 50%`, from other plugins or from a keybinding.

Expand All @@ -50,9 +64,11 @@ Thanks to a community contribution, it's now possible to change the position of
Zellij, as a true multiplayer application, allows more than one user to attach to a running session. When this happens, each user gets their own cursor and the UI indicates in which pane or tab they are focused. Since by necessity the smallest screen width/height is used in such cases, it is sometimes desirable to log out other users from the session. This is now possible through the `session-manager`: `Ctrl o` to open the session manager, and then `Ctrl x` to disconnect other users.

## Plugin Aliases
This version introduces "Plugin Aliases" which are a way to shorten the long plugin URLs (eg. `https://example.com/my-plugin.wasm`, or `file:/home/aram/code/plugin/my-plugin.wasm`) to something more memorable (eg. `filter` or `filepicker`). These aliases can be defined in the [configuration file](//TODO: LINK), and used wherever plugin URLs can be used: to launch plugins from the CLI, from layouts or from other plugins.
This version introduces "Plugin Aliases" which are a way to shorten the long plugin URLs (eg. `https://example.com/my-plugin.wasm`, or `file:/home/aram/code/plugin/my-plugin.wasm`) to something more memorable (eg. `filter` or `filepicker`). These aliases can be defined in the [configuration file](/documentation/configuration.html), and used wherever plugin URLs can be used: to launch plugins from the CLI, from layouts or from other plugins.

Aliases can also be a convenient way to swap in the built-in plugins for a custom implementation (eg. using the excellent [zjstatus](https://github.com/dj95/zjstatus), instead of the built-in `compact` bar). Indeed, the `filepicker` described above is an internal alias for the built-in `Strider` plugin, and can be swapped out for a custom implementation of the filepicker using the same [contract](/documentation/filepicker-alias.html).

Aliases can also be a convenient way to swap in the built-in plugins for a custom implementation (eg. using the excellent [zjstatus](//TODO: LINK), instead of the built-in `compact` bar). Indeed, the `filepicker` described above is an internal alias for the built-in `Strider` plugin, and can be swapped out for a custom implementation of the filepicker using the same [contract](//TODO: LINK TO DOCUMENTATION).
Read more about [Plugin Aliases](/documentation/plugin-aliases.html).

## New Possible Keys to Bind
Thanks to some community contributions, it is not possible to bind `Ctrl`/`Alt` + Function keys (eg. `Ctrl F1`), as well as `Ctrl Space`. We as Zellij maintainers are aware that colliding keybindings are a big problem for many users and intend to fully and finally address this issue in the next version.
Expand All @@ -62,7 +78,7 @@ This version introduces two major performance improvements:
* Line wrapping of extremely long (10M+) lines is now significantly faster thanks to a community contribution.
* Rendering of full-screen terminal applications is now much smoother thanks to the implementation of CSI 2026 (synchronized renders) in those terminals that support it.

# Do you like Zellij?
## Do you like Zellij? ❤️
Me too! So much so that I spend 100% of my time developing and maintaining it and have no other income.

Zellij will always be free and open-source. Zellij will never contain ads or collect your data.
Expand Down
29 changes: 18 additions & 11 deletions static/old-documentation/404.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js light">
<html lang="en" class="light" dir="ltr">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
Expand All @@ -11,7 +11,7 @@

<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff" />
<meta name="theme-color" content="#ffffff">

<link rel="icon" href="favicon.svg">
<link rel="shortcut icon" href="favicon.png">
Expand All @@ -32,7 +32,7 @@
<!-- Custom theme stylesheets -->

</head>
<body>
<body class="sidebar-visible no-js">
<div id="body-container">
<!-- Provide site root to javascript -->
<script>
Expand Down Expand Up @@ -62,31 +62,38 @@
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
var html = document.querySelector('html');
html.classList.remove('no-js')
html.classList.remove('light')
html.classList.add(theme);
html.classList.add('js');
var body = document.querySelector('body');
body.classList.remove('no-js')
body.classList.add('js');
</script>

<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">

<!-- Hide / unhide sidebar before it is displayed -->
<script>
var html = document.querySelector('html');
var body = document.querySelector('body');
var sidebar = null;
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
}
html.classList.remove('sidebar-visible');
html.classList.add("sidebar-" + sidebar);
sidebar_toggle.checked = sidebar === 'visible';
body.classList.remove('sidebar-visible');
body.classList.add("sidebar-" + sidebar);
</script>

<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div class="sidebar-scrollbox">
<ol class="chapter"><li class="chapter-item expanded "><a href="introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="installation.html"><strong aria-hidden="true">1.1.</strong> Installation</a></li><li class="chapter-item expanded "><a href="overview.html"><strong aria-hidden="true">1.2.</strong> Overview</a></li><li class="chapter-item expanded "><a href="integration.html"><strong aria-hidden="true">1.3.</strong> Integration</a></li><li class="chapter-item expanded "><a href="faq.html"><strong aria-hidden="true">1.4.</strong> FAQ</a></li></ol></li><li class="chapter-item expanded "><a href="commands.html"><strong aria-hidden="true">2.</strong> Commands</a></li><li class="chapter-item expanded "><a href="configuration.html"><strong aria-hidden="true">3.</strong> Configuration</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="options.html"><strong aria-hidden="true">3.1.</strong> Options</a></li><li class="chapter-item expanded "><a href="keybindings.html"><strong aria-hidden="true">3.2.</strong> Configuring Keybindings</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="keybindings-modes.html"><strong aria-hidden="true">3.2.1.</strong> Modes</a></li><li class="chapter-item expanded "><a href="keybindings-keys.html"><strong aria-hidden="true">3.2.2.</strong> Keys</a></li><li class="chapter-item expanded "><a href="keybindings-examples.html"><strong aria-hidden="true">3.2.3.</strong> Examples</a></li></ol></li><li class="chapter-item expanded "><a href="themes.html"><strong aria-hidden="true">3.3.</strong> Themes</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="theme-gallery.html"><strong aria-hidden="true">3.3.1.</strong> Theme Gallery</a></li></ol></li></ol></li><li class="chapter-item expanded "><a href="actions.html"><strong aria-hidden="true">4.</strong> Actions</a></li><li class="chapter-item expanded "><a href="layouts.html"><strong aria-hidden="true">5.</strong> Layouts</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="layouts-templates.html"><strong aria-hidden="true">5.1.</strong> Templates</a></li></ol></li><li class="chapter-item expanded "><a href="plugins.html"><strong aria-hidden="true">6.</strong> Plugins</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="plugin-overview.html"><strong aria-hidden="true">6.1.</strong> Overview</a></li><li class="chapter-item expanded "><a href="plugin-writing.html"><strong aria-hidden="true">6.2.</strong> Developing a Plugin</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="plugin-rust.html"><strong aria-hidden="true">6.2.1.</strong> Rust</a></li><li class="chapter-item expanded "><a href="plugin-zig.html"><strong aria-hidden="true">6.2.2.</strong> Zig</a></li><li class="chapter-item expanded "><a href="plugin-other.html"><strong aria-hidden="true">6.2.3.</strong> Other Languages</a></li></ol></li></ol></li><li class="chapter-item expanded "><a href="compatibility.html"><strong aria-hidden="true">7.</strong> Compatibility</a></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
<div class="sidebar-resize-indicator"></div>
</div>
</nav>

<!-- Track and set sidebar scroll position -->
Expand Down Expand Up @@ -117,9 +124,9 @@
<div id="menu-bar-hover-placeholder"></div>
<div id="menu-bar" class="menu-bar sticky">
<div class="left-buttons">
<button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<i class="fa fa-bars"></i>
</button>
</label>
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
<i class="fa fa-paint-brush"></i>
</button>
Expand Down
Loading

0 comments on commit e542d66

Please sign in to comment.