Compare commits

..

No commits in common. "efe7bdbb6d1781ef703fa0923a969b04bf71f8ec" and "faa41d83cacd09b08f4facb0959dbb50ee93391c" have entirely different histories.

4 changed files with 76 additions and 464 deletions

View file

@ -1,372 +0,0 @@
---
.title = "Devlog 2026",
.date = @date("2026-02-13"),
.author = "CJ van den Berg",
.layout = "devlog.shtml",
.draft = false,
---
[]($section.id('about'))
## About this Devlog
I try to keep a log of major (and some minor) changes and new features
going into flow as I work on them.
You can [subscribe to this page via
RSS]($link.page('devlog').alternative('rss')) and find more devlog entries
in the [archive](/devlog/).
# [Release 0.7.0 🎉]($section.id("2026-02-13T09:21:56+01:00"))
We kick off the new Year with a major release!
[]($video.asset('2026-02-13_flow-0.7.0_teaser.mp4').controls(true))
## Completion
Flow now has full **inline auto completion** support! There is a new
dropdown UI with support for insert and replace completion styles while
editing inline. An info popup box can display completion and hover
documentation and there are commands to toggle modes and styles
interactively.
There are three completion trigger modes available:
- `manual` - completion is triggered via keybind to the `completion` command
- `automatic` - completion is triggered whenever a trigger character is inserted
- `every_keystroke` - completion is triggered on every insert operation
Trigger characters are provided by the current document's LSP. Note that a
completion request may not always return results and in that case no
completion UI will be shown. Completion items that insert LSP snippets are
now supported and the next snippet tab stop can be selected with the `tab`
key. There are two keybind modes for inline completion. `standard` mode
will steal the `up/down` and `enter` keys from the main editor and
`noninvasive` mode that will not. `noninvasive` mode requires that you use
the alternate keybindings `ctrl+n`/`ctrl+p` to pick a completion item
and `tab` to select it. These keybindings also work in `standard` mode.
The original palette style completion UI is also still available and may be
selected with the `toggle_completion_style` command.
#### Keybinds:
- `ctrl+space` or `ctrl+.` - manually trigger completion
- `ctrl+space` (when completing) - toggle info box, info panel or no info
- `up`, `down`, `ctrl+p`, `ctrl+n` - pick a completion item from the list
- `enter`, `tab` - select and insert a completion
- `esc` - cancel completion
- `ctrl+k r` - toggle insert or replace completion mode
- `alt+f9` - select next completion dropdown UI widget style
- `shift+alt+f9` - select next info box widget style
Configuration options:
- `completion_trigger`
- `completion_style`
- `completion_insert_mode`
- `completion_info_mode`
- `dropdown_keybinds` - `standard` or `noninvasive`
- `dropdown_limit`
## Vertical Splits
Flow Control can now show multple editors in vertical, side by side, views.
Each split can have it's own tab bar and tabs may be moved between splits
with mouse or keyboard commands. Commands or palettes that navigate to
files now have an "alternate" mode that will open the file in a new split
if it is not already open.
#### Keybinds:
- `ctrl+\` - add_split
- `ctrl+k w` - close_split
- `ctrl+1` to `ctrl+8` - focus_split
- `ctrl+page_down` - select tab right
- `ctrl+page_up` - select tab left
- `ctrl+shift+page_down` - move tab right
- `ctrl+shift+page_up` - move tab left
- `shift+enter` - (palette or command) navigate to file in a new split
## Centered View
When only one split is open on a wide screen you can now center the view.
The width of the centered view is controllable with keybinds and/or the
`centered_view_width` configuration option.
#### Keybinds:
- `ctrl+k x` - toggle centered view
- `alt+-` - shrink centered view
- `alt+=` - expand centered view
## Horizontal scrolling
Horizontal scrolling with a horizontal mouse wheel is now supported. Also,
scrolling the regular vertical mouse wheel with the `shift` key pressed
will now scroll horizontally. Fast scroll (hold the 'alt' key) is also
supported for horizontal scrolling.
## Git Diffs
Diff markers in the editor gutter are now based on the git HEAD commit if
the current project is a git repository. Also, the new commands
`goto_next_change` and `goto_prev_change` will move the primary cursor to
the next/previous marker in the gutter.
#### Keybinds:
- `alt+f5` - goto_next_change
- `alt+shift+f5` - goto_prev_change
## Blame
Git blame information for the current line is displayed in the remaining on
the line. This can be toggled with the `toggle_inline_vcs_blame` command.
#### Keybinds:
- `ctrl+shift+g alt+b` - toggle_inline_vcs_blame
## Variable Expansions
Tasks and `filter` bindings may now use variable expansions in their
arguments. Variable names to be expanded should be wrapped in `{{` and
`}}`.
The following variables are available in this release:
- `{{project}}` - The path to the current project directory
- `{{file}}` - The path to the current file
- `{{line}}` - The line number of the primary cursor
- `{{column}}` - The column of the primary cursor
- `{{selection}}` - The current selection of the primary cursor
- `{{selections}}` - All current selections seperated by NL characters
- `{{selectionsZ}}` - All current selections separated by NULL characters
- `{{indent_mode}}` - The current indent mode (`tabs` or `spaces`)
- `{{indent_size}}` - The current indent size (in columns)
- `{{blame_commit}}` - The blame commit ID for the line at the primary cursor (if there is one)
## Highlight References
Added support for the LSP `textDocument/documentHighlight` request as the
`highlight_references` command. Flow will automatically mark the results of
this query as matches so you can use the the `goto_next_match` and
`goto_prev_match` commands to navigate them. `highlight_references` is also
available as an idle action for automatic reference highlighting (See the
Idle Actions secion below)
#### Keybinds:
- `ctrl+k i`
## Auto Run Commands, Auto Backups & Session Saving
`auto_run_commands` and `auto_run_time_seconds` can be used to configure
commands that will run automatically like a cron job. `save_session` and
`save_session_quiet` commands were also added to make auto run useful as a
backup tool.
The default configuration for `auto_run_commands` is `save_session_quiet`
and the default for `auto_run_time_seconds` is 120, so in the (rare!) event
of a flow crash you can return to flow with minimal data loss with `flow
--restart-session`.
The `save_session_and_quit` command was also added for when you want to
manuall exit and restart flow with `flow --restart-session`.
## Idle Actions & Commands
Idle actions & commands run whenever the user pauses their interaction with
flow. Actions are specific functions designed to run on idle. At the moment
just `hover` and `highlight_references`. These actions have commands to
toggle them interactively. The idle timeout is configured with the
`input_idle_time_ms` option.
## Find Mode
There are now three find modes. Exact match, case folded (insensitive)
and auto mode. Auto mode (the new default) selects to do an exact match
search or case folded search depending on whether the query term contains
case foldable characters or not. So if you enter a lowercase search term
you get a case insensitive search. Also, auto find mode (which searches as
soon as you select something) now has a command (and a keybind) to toggle
it on/off.
#### Keybinds:
- `alt+c` (in find mode) - toggle exact or case folded search mode
- `alt+f3` - toggle auto find mode
## Key Hints
There is a new key hints overlay that displays all currently available
keybindings. It can be explicitly activated with `alt+f1` or `ctrl+?`, and
will be automatically displayed when an incomplete keybinding sequence is
waiting for additional input. The key hints overlay is invisible to mouse
events and can be active in any flow input mode or submode.
#### Keybinds:
- `alt+f1` or `ctrl+?` - show/hide the key hints overlay
- `shift+f1` or `ctrl+alt+?` - next key hints page
- `shift+alt+f9` - next widget style for key hints
## Restart with Sudo
You can now restart the flow session with `sudo` to save files with root
permissions. The current session, with unsaved file content (but currently
not undo info), is first saved and then automatically restored when flow is
restarted by sudo. If the `sudo` command fails for any reason the saved
flow session can be reloaded as usual with `flow --restart-session`. Flow
now displays a red lock symbol in the status bar and a (configurable)
warning message on the home screen when running with root permissions.
## Symlinks
Flow can now follow symlinks when writing files and scanning the project
tree. New options `retain_symlinks`, `follow_directory_symlinks` and
`maximum_symlink_depth` control symlink behavior. Symlink following on file
save (`retain_symlinks`) is now enabled by default.
`follow_directory_symlinks` when scanning the project tree is not enabled
by default.
## Symbols Palette
Added support for the LSP `textDocument/documentSymbol` request with a
palette interface to browse and filter symbols in the current document.
#### Keybinds:
- `ctrl+shift+o` - open the symbols palette
- `enter` - jump to the highlighted symbol
- `shift+enter` - select the highlighted symbol
- `up/down/pgup/pgdn/home/end` - browse the symbols list
- `anything else` - filter the symbols list with a fuzzy search
- `esc` - cancel and return to original document location
## Project switching
Switching projects without exiting Flow Control (`ctrl+r`) now restores
open tabs and splits making for a much smoother multi-project workflow.
## Last Palette
You can now re-open the last used palette with the `last_palette` command.
This restores the state of the palette when last used, which is very
useful, for example, for browsing through multiple files that match a fuzzy
query.
#### Keybinds:
- `ctrl+,` - open lasted used palette
- [helix] `space '` - open lasted used palette
## Goto Matching Bracket
Added the classic goto matching bracket command.
#### Keybinds:
- flow - `ctrl+shift+\`
- emacs - `C-M-p C-M-n`
- vim - `%`
- helix - `mm`
## Reflow text
The `reflow` command can soft wrap paragraphs of text. There is basic
detection of the line prefix to aid in reflowing indented or commented
blocks of text. Blank lines are preserved as paragraph boundaries. The
default line width for `reflow` is configured with the `reflow_width`
config option and can also be specified for the current, and any following,
`reflow` operation with an integer command parameter. (`alt+1`, etc.)
#### Keybinds:
- `alt+q` - reflow paragraph
## LSP Configuration
The `open_lsp_config_global` and `open_lsp_config_project` will open a json
file where you can add LSP configuration that is sent to the LSP on startup
via the LSP `initializationOptions` init request field. Project and global
configurations are not merged in anyway and project config overrides global
config entirely. The project (and global) LSP configuration is stored in
the flow configuration directory, even for project specific config.
## Language support changes
- Set default lua formatter to stylua
- Set ty as default lsp for python
- Update ziggy and superhtml
## Helix mode
- Added switch_to_lowercase
- Add cursors with selections for selected lines (Alt+s)
- maw and maW support
- miw and miW support
## Themes
- Changed the default theme to the more modern ayu-mirage
- Added selenized theme
- Added ethereal theme
## Misc minor features and new commands
- add gutter_width_mode and gutter_width_minimum/maximum config options
- add more modes to linenumstate status bar widget
- add uuidgen keybind
- add option to disable sgr pixel mode support
- add show_bottom_bar_grip config option
- make expand_selection and shrink_selection multicursor aware
- add option to align inline diagnostics to the left
- add toggle_command_logging command
- add select_to_line_vim command
- make goto in flow select mode select to line
- map kp_ movement keys as regular keys if the kp_ variants are not explicitly mapped
- add panel border to logview
- subscribe to keybind_match events in inputview and display them
- add ignore_filter_stderr config option
- add config option keybind_mode with workaround ignore_alt_text_modifiers
- add show_local_diagnostics_in_panel config option
- add whitespace_mode external
- add modes_can_change_cursor configuration option
- add results count to generic palette
- add results count to open_recent palette
- add scrollbar_auto_hide config option
- add pane_style config option
- add option to disable modal dim effect
- add switch_input_mode command to change keybind mode in a mini mode
- add value type descriptions to config files
- enable indent whitespace_mode by default
- bind open_config to alt+f5
- add FLOW_CONFIG_DIR env var to override configuration directory
- propagate indent guides across blank lines
- add path segment completion to open_recent palette
## Contributors
Many, many thanks to all who contributed to this release!
- CJ van den Berg
- Igor Támara
- Miguel Granero
- Danylo Kondratiev
- Jakob Ingvast
- Palanix
- Ian Johnson
- Janne Hellsten
- xdBronch

View file

@ -25,25 +25,26 @@ individually.
## Searching ## Searching
Press ctrl+f to search this help file. Type a search term and press Press ctrl+f to search this help file. Type a search term and press
ctrl+n/ctrl+p or f3/shift+f3 to jump through the matches. Press Enter to ctrl+n/ctrl+p or f3/shift+f3 to jump through the matches. Press Enter
exit find mode at the current match or Escape to return to your starting to exit find mode at the current match or Escape to return to your
point. starting point.
## Messages and logs ## Messages and logs
Messages of issues regarding tasks that are not accomplished, like trying Messages of issues regarding tasks that are not accomplished, like
to close flow with unsaved files, as well as other information are shown trying to close flow with unsaved files, as well as other information
briefly in the bottom status bar; most recent messages can be seen in the are shown briefly in the bottom status bar; most recent messages can
log view too, to open it, use ctrl+shift+p > `View log`; it's possible to be seen in the log view too, to open it, use ctrl+shift+p > `View log`;
make it taller dragging the toolbar with the mouse up or downwards. it's possible to make it taller dragging the toolbar with the mouse
up or downwards.
## Input Modes ## Input Modes
Flow Control supports multiple input modes that may be changed Flow Control supports multiple input modes that may be changed
interactively at runtime. The current input mode (and some other settings) interactively at runtime. The current input mode (and some other
is persisted in the configuration file automatically. settings) is persisted in the configuration file automatically.
- f4 => Cycle major input modes (flow, emacs, vim, helix,...) - f4 => Cycle major input modes (flow, emacs, vim, helix,...)
@ -51,9 +52,9 @@ The current input mode is displayed at the left side of the statusbar.
- ctrl+shift+p or alt+x => Show the command palette - ctrl+shift+p or alt+x => Show the command palette
The command palette allows you to fuzzy search and select commands to run. The command palette allows you to fuzzy search and select commands to run. It
It also shows any available keybind that may be used to run the command also shows any available keybind that may be used to run the command without
without opening the palette. opening the palette.
- ctrl+f2 => Show all available commands and keybinds - ctrl+f2 => Show all available commands and keybinds
@ -63,16 +64,16 @@ will insert the command name into the current document instead of executing
it. This is very useful for editing keybinding definition files. it. This is very useful for editing keybinding definition files.
Run the `Edit keybindings` command to save the current keybinding mode to a Run the `Edit keybindings` command to save the current keybinding mode to a
file in the configuration `keys` directory and open it for editing. Save file in the configuration `keys` directory and open it for editing. Save your
your customized keybinds under a new name in the same directory to create customized keybinds under a new name in the same directory to create an
an entirely new keybinding mode that can be selected with `f4`. Delete the entirely new keybinding mode that can be selected with `f4`. Delete the
keybinding file from the configuration `keys` directory to revert the mode keybinding file from the configuration `keys` directory to revert the mode
to it's built-in definition (if there is one). Changes to keybinding files to it's built-in definition (if there is one). Changes to keybinding files
will take effect on restart. will take effect on restart.
Keybinding modes may inherit all non-conflicting keybindings from another Keybinding modes may inherit all non-conflicting keybindings from another mode
mode by adding an `inherit` option to the `settings` section of the keybind by adding an `inherit` option to the `settings` section of the keybind file
file like this: like this:
```json ```json
{ {
@ -86,9 +87,9 @@ file like this:
This allows you to make only minor additions/changes to an existing builtin This allows you to make only minor additions/changes to an existing builtin
mode without copying the whole mode and is easier to keep up-to-date. mode without copying the whole mode and is easier to keep up-to-date.
Additionally, individual sub-modes may inherit all non-conflicting Additionally, individual sub-modes may inherit all non-conflicting keybindings
keybindings from another sub-mode of the same mode by adding an `inherit` from another sub-mode of the same mode by adding an `inherit` option to the
option to the sub-mode section like this: sub-mode section like this:
``` ```
"normal": { "normal": {
@ -107,44 +108,43 @@ Multiple inheritance is supported with the `inherits` options like this:
### Flow mode ### Flow mode
The default input mode, called just flow, is based on common GUI The default input mode, called just flow, is based on common GUI
programming editors. It most closely resembles Visual Studio Code, but also programming editors. It most closely resembles Visual Studio Code, but
takes some inspiration from Emacs and others. This mode focuses on powerful also takes some inspiration from Emacs and others. This mode focuses
multi cursor support with a find -> select -> modify cycle style of on powerful multi cursor support with a find -> select -> modify
editing. cycle style of editing.
See the `ctrl+f2` palette when flow mode is selected to see the full list See the `ctrl+f2` palette when flow mode is selected to see the full
of keybindings for this mode. list of keybindings for this mode.
### Vim mode ### Vim mode
The vim modes, shown as NORMAL, INSERT or VISUAL in the status bar, follow The vim modes, shown as NORMAL, INSERT or VISUAL in the status bar,
the basic modal editing style of vim. The basics follow vim closely, but follow the basic modal editing style of vim. The basics follow vim
more advanced vim functions (e.g. macros and registers) are not supported closely, but more advanced vim functions (e.g. macros and registers)
(yet). Keybindings from flow mode that do not conflict with vim keybindings are not supported (yet). Keybindings from flow mode that do not conflict
also work in vim mode. with vim keybindings also work in vim mode.
### Helix mode ### Helix mode
The helix modes, shown as NOR, INS or SEL in the status bar, follow the The helix modes, shown as NOR, INS or SEL in the status bar, follow
basic modal editing style of helix. The basics are being adapted closely, the basic modal editing style of helix. The basics are being adapted
more advanced functions (e.g. surround, macros, selections, registers) are closely, more advanced functions (e.g. surround, macros, selections,
not supported (yet). Usual keybinding with LSPs are used for tasks like 'go registers) are not supported (yet). Usual keybinding with LSPs are
to definition', 'go to reference' and 'inline documentation' featuring used for tasks like 'go to definition', 'go to reference' and
inline diagnostics. Keybindings from flow mode that do not conflict with 'inline documentation' featuring inline diagnostics. Keybindings
helix keybindings also work in helix mode. from flow mode that do not conflict with helix keybindings also work in
helix mode.
(work in progress) (work in progress)
## Mouse Commands ## Mouse Commands
Mouse commands are NOT rebindable and are not listed in the command Mouse commands are NOT rebindable and are not listed in the command palette.
palette.
- Left Click => - Left Click =>
Clear all cursors and selections and the place cursor at the mouse Clear all cursors and selections and the place cursor at the mouse pointer
pointer
- Double Left Click => - Double Left Click =>
Select word at mouse pointer Select word at mouse pointer
@ -182,10 +182,11 @@ palette.
## Configuration ## Configuration
Configuration is stored in the standard location Configuration is stored in the standard location
`${XDG_CONFIG_HOME}/flow/config`. This is usually `~/.config/flow/config`. `${XDG_CONFIG_HOME}/flow/config`. This is usually
`~/.config/flow/config`.
The default configuration will be written the first time Flow Control is The default configuration will be written the first time
started and looks similar to this: Flow Control is started and looks similar to this:
``` ```
frame_rate 60 frame_rate 60
theme "default" theme "default"
@ -202,22 +203,23 @@ animation_max_lag 150
Most of these options are fairly self explanatory. Most of these options are fairly self explanatory.
`theme`, `input_mode` and `show_whitespace` are automatically persisted `theme`, `input_mode` and `show_whitespace` are automatically
when changed interactively with keybindings. persisted when changed interactively with keybindings.
`frame_rate` can be tuned to control the maximum number of frames rendered. `frame_rate` can be tuned to control the maximum number
of frames rendered.
`animation_max_lag` controls the maximum amount of time allowed for `animation_max_lag` controls the maximum amount of time allowed
rendering scrolling animations. Set to 0 to disable scrolling animation for rendering scrolling animations. Set to 0 to disable scrolling
altogether. animation altogether.
File types may be configured with the `Edit file type configuration` File types may be configured with the `Edit file type configuration` command.
command. You can also create a new file type by adding a new `.conf` file You can also create a new file type by adding a new `.conf` file to the
to the `file_type` directory. Have a look at an existing file type to see `file_type` directory. Have a look at an existing file type to see what options
what options are available. are available.
## Flags and options ## Flags and options
As every respectable terminal program, flow provide various invoking As every respectable terminal program, flow provide various invoking
options that among others, will allow you to inspect various aspects of the options that among others, will allow you to inspect various aspects of
running session. Feel free to run `flow --help` to explore them. the running session. Feel free to run `flow --help` to explore them.

View file

@ -15,66 +15,48 @@ Flow Control is under active development, but very stable.
## 🚀 Features ## 🚀 Features
- **Lightning Fast** TUI with ≤6ms frame times, **low latency** input - **Lightning Fast** TUI with ≤6ms frame times, **low latency** input handling
handling and smooth **animated scrolling** and smooth **animated scrolling**
- Intuitive UI with **tabs**, **scrollbars** and **palettes** with full
- Intuitive UI with **tabs**, **splits**, **scrollbars** and **palettes** **mouse** support for all UI elements
with full **mouse** support for all UI elements
- Support for more than **70 programming languages**, **zero - Support for more than **70 programming languages**, **zero
configuration** needed, via **tree-sitter** powered syntax highlighting configuration** needed, via **tree-sitter** powered syntax highlighting
- **Language Server Protocol** pre configured support for most language servers
- **Language Server Protocol** pre configured support for most language
servers with support for inline auto completion, symbol lookup, goto
definition, highlight references, hover and more
- Powerful **multi-cursor** editing and integrated **clipboard history** - Powerful **multi-cursor** editing and integrated **clipboard history**
- Powerful configurable keybinding system that supports **modal** and - Powerful configurable keybinding system that supports **modal** and
**non-modal** editing styles **non-modal** editing styles
- Multiple pre-configured **keybinding modes** - Multiple pre-configured **keybinding modes**
- Flow Control - GUI IDE style bindings (similar to vscode) - Flow Control - GUI IDE style bindings (similar to vscode)
- Emacs - Emacs
- Vim - Vim
- Helix - Helix
- User created - User created
- Hybrid rope/piece-table buffer system, edit **very large files** with - Hybrid rope/piece-table buffer system, edit **very large files** with
**thousands of cursors** **thousands of cursors**
- Infinite **undo** (at least until you run out of ram) - Infinite **undo** (at least until you run out of ram)
- Full **unicode** support, including support for the kitty text sizing protocol
- Full **unicode** support, including support for the kitty text sizing - Plenty of **themes** included and support for vscode themes via the flow-themes project
protocol - Runs on **Linux, FreeBSD, MacOS, Windows and Android** (under termux) with
easy **cross-compilation** to all supported targets
- Plenty of **themes** included and support for vscode themes via the
flow-themes project
- Runs on **Linux, FreeBSD, MacOS, Windows and Android** (under termux)
with easy **cross-compilation** to all supported targets
## Requirements ## Requirements
- A modern terminal with **24bit color** and, ideally, **kitty keyboard - A modern terminal with **24bit color** and, ideally, **kitty keyboard
protocol** support. **Kitty**, **Foot** and **Ghostty** are the protocol** support. **Kitty**, **Foot** and **Ghostty** are the recommended
recommended terminals at this time. **Zellij** also works well. Most terminals at this time. **Zellij** also works well. Most other terminals will
other terminals will work, but likely with reduced functionality. work, but likely with reduced functionality.
- **NerdFont** support. Either via terminal font fallback or a patched font.
- **NerdFont** support. Either via terminal font fallback or a patched
font.
- A **UTF-8** locale - A **UTF-8** locale
## 🛣️ Roadmap ## 🛣️ Roadmap
See our [devlog](/devlog/2026) for on-going updates from the development See our [devlog](/devlog/2025) for on-going updates from the development team.
team.
### In Development ### In Development
- LSP completion support
- Persistent undo/redo - Persistent undo/redo
- File watcher integration - File watcher integration