Publish xplr book with intensive documentation

Closes: https://github.com/sayanarijit/xplr/issues/263
pull/270/head
Arijit Basu 3 years ago committed by Arijit Basu
parent b61bf9dcf2
commit 3e646b063b

@ -0,0 +1,33 @@
name: Book
on:
push:
branches:
- master
paths:
- 'docs/**'
jobs:
deploy_en:
name: Deploy book on gh-pages
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install mdBook
uses: peaceiris/actions-mdbook@v1
- name: Render book
run: |
mdbook build -d gh-pages docs/en
mkdir gh-pages
mv docs/en/gh-pages gh-pages/en
mv docs/index.html gh-pages
- name: Deploy
uses: peaceiris/actions-gh-pages@v2.5.1
with:
emptyCommits: true
keepFiles: false
env:
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
PUBLISH_BRANCH: gh-pages
PUBLISH_DIR: gh-pages

2
.gitignore vendored

@ -2,3 +2,5 @@
/flamegraph.svg
/perf.data
/perf.data.old
book/

@ -0,0 +1,6 @@
[book]
authors = ["Arijit Basu <sayanarijit@gmail.com>"]
title = "xplr book"
description = "A hackable, minimal, fast TUI file explorer"
src = "src"
language = "en"

@ -0,0 +1,19 @@
A hackable, minimal, fast TUI file explorer
===========================================
- [Introduction](introduction.md)
- [Quickstart](quickstart.md)
- [Install](install.md)
- [Post Install](post-install.md)
- [Configuration](configuration.md)
- [General Config](general-config.md)
- [Modes](modes.md)
- [Message](message.md)
- [Layouts](layouts.md)
- [Style](style.md)
- [Default Key Bindings](default-key-bindings.md)
- [TODO](todo.md)
- [Alternatives](alternatives.md)
- [Upgrade Guide](upgrade-guide.md)
- [Community](community.md)
- [Contribute](contribute.md)

@ -0,0 +1,19 @@
Alternatives
============
These are the alternative TUI/CLI file managers/explorers you might want to check out (in no particular order).
- [nnn](https://github.com/jarun/nnn/)
- [vifm](https://github.com/vifm/vifm)
- [ranger](https://github.com/ranger/ranger)
- [lf](https://github.com/gokcehan/lf)
- [joshuto](https://github.com/kamiyaa/joshuto)
- [fff](https://github.com/dylanaraps/fff)
- [mc](https://github.com/MidnightCommander/mc)
- [broot](https://github.com/Canop/broot)
- [hunter](https://github.com/rabite0/hunter)
- [noice](https://github.com/RichardHyde/noice)
- [clifm](https://github.com/pasqu4le/clifm)
- [clifm](https://github.com/leo-arch/clifm) (non curses)
[add more](community.md)

@ -0,0 +1,11 @@
Community
=========
Building an active community of awesome people and learning stuff together is
one of my reasons to publish this tool and maintain it. Hence, please feel free
to reach out via your preferred way.
- Real-time chat lovers can [**join our discord channel**](https://discord.gg/JmasSPCcz3).
- Forum discussion veterans can [**start a new GitHub discussion**](https://github.com/sayanarijit/xplr/discussions).
BTW I like Miyazaki and Shinkai works.

@ -0,0 +1,27 @@
Configuration
=============
xplr can be configured using [Lua](https://www.lua.org/) via a special file
named `init.lua`
([example](https://github.com/sayanarijit/xplr/blob/main/src/init.lua)), which
can be placed in `~/.config/xplr/` (user specific) or `/etc/xplr/` (global)
depending on the use case.
When a user specific configuration is available, the global configuration file
will be ignored.
However, it's also possible to place the file anywhere, with any name and use
the command-line argument `-c` / `--config` to specify its path explicitely. In
that case, both `~/.config/xplr/init.lua` and `/etc/xplr/init.lua` will be
ignored.
Loading Order
-------------
When xplr loads, it first executes the built-in
[init.lua](https://github.com/sayanarijit/xplr/blob/main/src/init.lua) to set
the default values. It is then overwritten by another config file, if found
using the following lookup order:
**--config /path/to/init.lua** > **~/.config/xplr/init.lua** > **/etc/xplr/init.lua**

@ -0,0 +1,34 @@
Create the customizable config file
-----------------------------------
```bash
mkdir -p ~/.config/xplr
version="$(xplr | grep ^version: | cut -d' ' -f 2)"
# When the app loads, press `#`
echo version = '"'${version:?}'"' > ~/.config/xplr/init.lua
```
Then
**[copy from here](https://github.com/sayanarijit/xplr/blob/main/src/init.lua)**
and remove / comment out what you don't want to customize.
> **Note:** You don't generally need to create the config file. You can use the
> default configuration for basic operations. However, creating the config file
> is recommended because the project is in its early stage and the defaults
> might change. Creating the config file will save you from unexpected behavior
> when you [upgrade](upgrade-guide.md).
> Also, the default configuration is very minimal (just enough to get you
> started) and you'll probably want to adjust it to suit your workflow.
Run
---
```
xplr
```

@ -0,0 +1,19 @@
If you like xplr, and want to contribute, that would be really awesome.
You can contribute to this project in the following ways
- Contribute your time and expertise (read [CONTRIBUTING.md](https://github.com/sayanarijit/xplr/blob/main/CONTRIBUTING.md) for instructions).
- **Developers:** You can help me improve my code, fix things, implement features etc.
- **Repository maintainers:** You can save the users from the pain of managing xplr in their system manually.
- **Code Reviewers:** Teach me your ways of code.
- **Designers:** You can make the logo even more awesome, donate stickers and blog post worthy pictures.
- **Bloggers, YouTubers & broadcasters:** You can help spread the word.
- Contribute by donating.
- You can [fuel me with coins of encouragement](https://opencollective.com/xplr) or [buy me a coffee](https://ko-fi.com/sayanarijit).
For further queries or concern related to `xplr`, [just ask us](community.md).
### Backers
<a href="https://opencollective.com/xplr#backer"><img src="https://opencollective.com/xplr/tiers/backer.svg?width=890" /></a>

@ -0,0 +1,258 @@
Default Key Bindings
====================
The default key binding is inspired by [vim](https://www.vim.org/) and slightly
overlaps with [nnn](https://github.com/jarun/nnn/), but it's supposed to be
customized as per user requirements.
When you press `?` in [default mode](#default), you can see the complete list
of [modes](modes.md) and the key mappings for each mode.
### default
key | remaps | action
--------------- | ------------------------- | ------
. | | show hidden
/ | ctrl-f | search
: | | action
? | | global help menu
G | | go to bottom
V | ctrl-a | select/unselect all
ctrl-c | | terminate
ctrl-i | tab | next visited path
ctrl-o | | last visited path
ctrl-r | | refresh screen
ctrl-u | | clear selection
ctrl-w | | switch layout
d | | delete
down | j | down
enter | | quit with result
f | | filter
g | | go to
h | left | back
k | up | up
l | right | enter
q | | quit
r | | rename
s | | sort
space | v | toggle selection
~ | | go home
[0-9] | | input
### recover
key | remaps | action
--------------- | ------------------------- | ------
ctrl-c | | terminate
esc | | escape
### filter
key | remaps | action
--------------- | ------------------------- | ------
R | | relative does not contain
backspace | | remove last filter
ctrl-c | | terminate
ctrl-r | | reset filters
ctrl-u | | clear filters
enter | esc | done
r | | relative does contain
### number
key | remaps | action
--------------- | ------------------------- | ------
backspace | | remove last character
ctrl-c | | terminate
ctrl-u | | remove line
ctrl-w | | remove last word
down | j | to down
enter | | to index
esc | | cancel
k | up | to up
[0-9] | | input
### go to
key | remaps | action
--------------- | ------------------------- | ------
ctrl-c | | terminate
esc | | cancel
f | | follow symlink
g | | top
x | | open in gui
### search
key | remaps | action
--------------- | ------------------------- | ------
backspace | | remove last character
ctrl-c | | terminate
ctrl-n | down | down
ctrl-p | up | up
ctrl-u | | remove line
ctrl-w | | remove last word
enter | esc | focus
left | | back
right | | enter
tab | | toggle selection
### selection ops
key | remaps | action
--------------- | ------------------------- | ------
c | | copy here
ctrl-c | | terminate
esc | | cancel
m | | move here
x | | open in gui
### action to
key | remaps | action
--------------- | ------------------------- | ------
! | | shell
c | | create
ctrl-c | | terminate
e | | open in editor
esc | | cancel
l | | logs
m | | toggle mouse
q | | quit options
s | | selection operations
[0-9] | | go to index
### create
key | remaps | action
--------------- | ------------------------- | ------
ctrl-c | | terminate
d | | create directory
esc | | cancel
f | | create file
### create file
key | remaps | action
--------------- | ------------------------- | ------
backspace | | remove last character
ctrl-c | | terminate
ctrl-u | | remove line
ctrl-w | | remove last word
enter | | create file
esc | | cancel
### create directory
key | remaps | action
--------------- | ------------------------- | ------
backspace | | remove last character
ctrl-c | | terminate
ctrl-u | | remove line
ctrl-w | | remove last word
enter | | create directory
esc | | cancel
### rename
key | remaps | action
--------------- | ------------------------- | ------
backspace | | remove last character
ctrl-c | | terminate
ctrl-u | | remove line
ctrl-w | | remove last word
enter | | rename
esc | | cancel
### delete
key | remaps | action
--------------- | ------------------------- | ------
D | | force delete
ctrl-c | | terminate
d | | delete
esc | | cancel
### sort
key | remaps | action
--------------- | ------------------------- | ------
! | | reverse sorters
E | | by canonical extension reverse
M | | by canonical mime essence reverse
N | | by node type reverse
R | | by relative path reverse
S | | by size reverse
backspace | | remove last sorter
ctrl-c | | terminate
ctrl-r | | reset sorters
ctrl-u | | clear sorters
e | | by canonical extension
enter | esc | done
m | | by canonical mime essence
n | | by node type
r | | by relative path
s | | by size
### filter
key | remaps | action
--------------- | ------------------------- | ------
R | | relative does not contain
backspace | | remove last filter
ctrl-c | | terminate
ctrl-r | | reset filters
ctrl-u | | clear filters
enter | esc | done
r | | relative does contain
### relative path does contain
key | remaps | action
--------------- | ------------------------- | ------
backspace | | remove last character
ctrl-c | | terminate
ctrl-u | | remove line
ctrl-w | | remove last word
enter | | apply filter
esc | | cancel
### relative path does not contain
key | remaps | action
--------------- | ------------------------- | ------
backspace | | remove last character
ctrl-c | | terminate
ctrl-u | | remove line
ctrl-w | | remove last word
enter | | apply filter
esc | | cancel
### switch layout
key | remaps | action
--------------- | ------------------------- | ------
1 | | default
2 | | no help menu
3 | | no selection panel
4 | | no help or selection
ctrl-c | | terminate
esc | | cancel

@ -0,0 +1,67 @@
General Config
==============
This is configuration exposed via the `xplr.config.general` API. It contains
the following fields:
enable_mouse
------------
Type: boolean
Set it to `true` enable scrolling using mouse.
show_hidden
-----------
Type: boolean
Set it to `true` to show hidden files.
read_only
---------
Type: boolean
Set it to `true` to use only a subset of selected operations that forbids
executing commands or performing write operations on the file-system.
disable_recover_mode
--------------------
Type: boolean
Set it to `true` when the special recover mode gets too annoying to appreciate
the good intentions. When enabled, typing the wrong keys won't result in any
action.
cursor.format
-------------
Type: nullable string
This is the shape of the cursor visible when the input buffer contains some string.
cursor.style
------------
Type: [Style](style.md)
Style of the cursor.
initial_layout
--------------
Type: string
The name of one of the defined [layouts](layouts.md) to use when xplr loads.
TODO: Continue documentation

@ -0,0 +1,217 @@
Install
=======
You can install xplr using one of the following ways. Each has their own
advantages and limitations.
For example, the [Direct Download](#direct-download),
[From crates.io](#from-a-hrefhttpscratesiocratesxplrcratesioa), and
[Build From Source](#build-from-source) methods allow the users to install the
latest possible version of xplr, but they have one common drawback - the user
will need to keep an eye on the releases, and manually upgrade xplr when a new
version is available.
One way to keep an eye of the releases is to
[watch the repository](https://github.com/sayanarijit/xplr/watchers).
Community Maintained Repositories
---------------------------------
xplr can be installed from one of the following community maintained
repositories:
[![packaging status](https://repology.org/badge/vertical-allrepos/xplr.svg)](https://repology.org/project/xplr/versions)
### Arch Linux
#### [Official Community Repo](https://archlinux.org/packages/community/x86_64/xplr)
```
sudo pacman -Syu xplr
```
#### [AUR](https://aur.archlinux.org/packages/?O=0&SeB=n&K=xplr&outdated=&SB=n&SO=a&PP=50&do_Search=Go)
Binary version:
```
paru -S xplr-bin
```
Git version:
```
paru -S xplr-git # git version
```
### Void Linux
#### [void-templates by shubham](https://github.com/shubham-cpp/void-pkg-templates)
### Nix(OS)
#### [Nixpkgs](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/misc/xplr)
```
nix-env -f https://github.com/NixOS/nixpkgs/tarball/master -iA xplr
```
### macOS
#### [MacPorts](https://ports.macports.org/port/xplr)
```
sudo port selfupdate
sudo port install xplr
```
#### [Homebrew](https://formulae.brew.sh/formula/xplr)
Stable branch:
```
brew install xplr
```
HEAD branch:
```
brew install --head xplr
```
### FreeBSD
#### [ports](https://cgit.freebsd.org/ports/plain/misc/xplr/)
```
cd /usr/ports/misc/xplr
make install
```
### NetBSD
#### [pkgsrc](https://pkgsrc.se/sysutils/xplr)
```
pkgin install xplr
```
Or build from source
```
cd /usr/pkgsrc/sysutils/xplr
make install
```
Direct Download
---------------
One can directly download the standalone binary from the
[releases](https://github.com/sayanarijit/xplr/releases).
Currently, the following options are available for direct download:
- [Linux](https://github.com/sayanarijit/xplr/releases/latest/download/xplr-linux.tar.gz)
- [macOS](https://github.com/sayanarijit/xplr/releases/latest/download/xplr-macos.tar.gz)
Command-line instructions:
```bash
platform="linux" # or "macos"
# Download
wget https://github.com/sayanarijit/xplr/releases/latest/download/xplr-$platform.tar.gz
# Extract
tar xzvf xplr-$platform.tar.gz
# Place in $PATH
sudo mv xplr /usr/local/bin/
```
From [crates.io](https://crates.io/crates/xplr)
-----------------------------------------------
Prerequisites:
- [Rust toolchain](https://www.rust-lang.org/tools/install),
- [gcc](https://gcc.gnu.org/)
- [make](https://www.gnu.org/software/make/)
Command-line instructions:
```bash
cargo install --force xplr
```
Build From Source
-----------------
Prerequisites:
- [git](https://git-scm.com/)
- [Rust toolchain](https://www.rust-lang.org/tools/install)
- [gcc](https://gcc.gnu.org/)
- [make](https://www.gnu.org/software/make/)
Command-line instructions:
```bash
# Clone the repository
git clone https://github.com/sayanarijit/xplr.git
cd xplr
# Build
cargo build --release --bin xplr
# Place in $PATH
sudo cp target/release/xplr /usr/local/bin/
```
Android
-------
### [Termux](https://termux.com/)
[![xplr-termuxfd3c398d3cf4bcbc.md.jpg](https://s3.gifyu.com/images/xplr-termuxfd3c398d3cf4bcbc.md.jpg)](https://gifyu.com/image/tF2D)
> Please note that xplr isn't heavily tested on Termux, hence things might
> need a little tweaking and fixing for a smooth usage experience.
- Install build dependencies
```bash
pkg install rustc cargo make
```
- Install `xplr`
```bash
cargo install --force xplr
```
- Setup storage
```bash
termux-setup-storage
```
- Setup config and runtime dir
```bash
export XDG_CONFIG_HOME="$PWD/storage/.config"
export XDG_RUNTIME_DIR="$PWD/storage/run"
mkdir -p "$XDG_CONFIG_HOME" "$XDG_RUNTIME_DIR"
```
- Run
```bash
~/.cargo/bin/xplr
```

@ -0,0 +1,15 @@
Introduction
============
`xplr` is a terminal UI based file explorer that aims to increase our terminal
productivity by being a flexible, interactive orchestrator for the ever growing
awesome command-line utilities that work with the file-system.
To achieve its goal, `xplr` strives to be a fast, minimal and more importantly,
hackable file explorer.
`xplr` is not meant to be a replacement for the standard shell commands or the
GUI file managers. Rather, it aims to integrate them all and expose an
intuitive, scriptable, keyboard controlled, real-time visual interface, also
being an ideal candidate for further integration, enabling the users to achieve
insane terminal productivity.

@ -0,0 +1 @@
# Key Bindings

@ -0,0 +1,225 @@
Layouts
=======
xplr layouts define the structure of the UI, i.e. how many panel we see,
placement and size of the panels, how they look etc.
This is configuration exposed via the `xplr.config.layouts` API. It contains
the following fields:
- [builtin](#builtin)
- [custom](#custom)
The users can switch between these layouts at run-time.
builtin
-------
Type: mapping of string and [Layout](#layout)
This is exposed by the `xplr.config.layouts.builtin` API.
xplr by default provides the following builtin layouts:
- [default](#default)
- [no_help](#no_help)
- [no_selection](#no_selection)
- [no_help_no_selection](#no_help_no_selection)
### default
Type: [Layout](#layout)
This is the default layout we see when we run xplr.
### no_help
Type: [Layout](#layout)
This layout hides the help menu.
### no_selection
Type: [Layout](#layout)
This layout hides the selection panel.
### no_help_no_selection
Type: [Layout](#layout)
This layout hides both the help menu and the selection panel.
custom
------
Type: mapping of string and [Layout](#layout)
This is exposed by the `xplr.config.layouts.custom` API.
It allows the users to define any custom layout.
Example:
```lua
xplr.config.layouts.custom.example = "Nothing"
xplr.config.general.initial_layout = "example"
-- when you load xplr, you should see a blank screen
```
Layout
------
A layout can be one of the following:
- ["Nothing"](#nothing)
- ["Table"](#table)
- ["InputAndLogs"](#inputandlogs)
- ["Selection"](#selection)
- ["HelpMenu"](#helpmenu)
- ["SortAndFilter"](#sortandfilter)
- { [Horizontal](#horizontal) = { config = [Layout Config](#layout-config), splits = { [Layout](#layout), ... } }
- { [Vertical](#vertical) = { config = [Layout Config](#layout-config), splits = { [Layout](#layout), ... } }
### Nothing
This layout contains a blank panel.
### Table
This layout contains the table displaying the files and directories in the
current directory.
### InputAndLogs
This layout contains the panel displaying the input prompt and logs.
### Selection
This layout contains the panel displaying the selected paths.
### HelpMenu
This layout contains the panel displaying the help menu for the current mode in
real-time.
### SortAndFilter
This layout contains the panel displaying the pipeline of sorters and filters
applied of the list of paths being displayed.
### Horizontal
This is a special layout that splits the panel into two horizontal parts.
It contains the following information:
- [config](#layout-config)
- [splits](#splits)
### Vertical
This is a special layout that splits the panel into two vertical parts.
It contains the following information:
- [config](#layout-config)
- [splits](#splits)
Layout Config
-------------
A layout config contains the following information:
- [margin](#margin)
- [horizontal_margin](#horizontal_margin)
- [vertical_margin](#vertical_margin)
- [constraints](#constraints)
### margin
Type: nullable integer
The width of the margin in all direction.
### horizontal_Margin
Type: nullable integer
The width of the horizontal margins. Overwrites the [margin](#margin) value.
### vertical_Margin
Type: nullable integer
The width of the vertical margins. Overwrites the [margin](#margin) value.
### constraints
Type: nullable list of [Constraint](#constraint)
The constraints applied on the layout.
Constraint
----------
A constraint can be one of the following:
- { Percentage = int }
- { Ratio = { int, int } }
- { Length = { int }
- { LengthLessThanScreenHeight = int }
- { LengthLessThanScreenWidth = int }
- { LengthLessThanLayoutHeight = int }
- { LengthLessThanLayoutWidth = int }
- { Max = int }
- { MaxLessThanScreenHeight = int }
- { MaxLessThanScreenWidth = int }
- { MaxLessThanLayoutHeight = int }
- { MaxthLessThanLayoutWidth = int }
- { Min = int }
- { MinLessThanScreenHeight = int }
- { MinLessThanScreenWidth = int }
- { MinLessThanLayoutHeight = int }
- { MinLessThanLayoutWidth = int }
TODO: document each constraint.
splits
------
Type: list of [Layout](#layout)
The list of child layouts to fit into the parent layout.
Example
-------
[![layout.png](https://s6.gifyu.com/images/layout.png)](https://gifyu.com/image/1X38)
```lua
xplr.config.layouts.builtin.default = {
Horizontal = {
config = {
margin = 1,
horizontal_margin = 2,
vertical_margin = 3,
constraints = {
{ Percentage = 50 },
{ Percentage = 50 },
}
},
splits = {
"Table",
"HelpMenu",
}
}
}
```

@ -0,0 +1,196 @@
Message
=======
You can think of xplr as a server. Just like web servers listen to HTTP
requests, xplr listens to messages.
See the
[**full list of messages**](https://docs.rs/xplr/latest/xplr/app/enum.ExternalMsg.html#variants)
that xplr can handle.
You can send messages to an xplr session in the following ways:
- Via [key bindings](modes.md#key-bindings)
- Via [Lua function calls](#lua-function-calls)
- Via shell using the [input pipe](#input-pipe)
Format
------
To send messages using [key bindings](modes.md#key-bindings) or
[Lua functions calls](#lua-functions-calls), these are represented in
[Lua](https://www.lua.org/) syntax. For example:
- "Quit"
- { FocusPath = "/path/to/file" }
- { Call = { command = "bash", args = { "-c", "read -p test" } } }
However, to send messages using the [input pipe](#input-pipe), they need to be
represented using
[YAML](http://yaml.org/) (or [JSON](https://www.json.org)) syntax. For example:
- Foo
- FocusPath: "/path/to/file"
- Call: { command: bash, args: ["-c", "read -p test"] }
Lua Function Calls
------------------
xplr allows users to define lua functions using the `xplr.fn.custom` Lua API.
These functions can be called using messages like `CallLua`, `CallLuaSilently`.
When called the function receives a [special argument](#calllua-argument) that
contains some useful information. The function can optionally return a list of
messages which will be handled by xplr.
Example:
```lua
-- Define the function
xplr.fn.custom.ask_name_and_greet = function(app)
print("What's your name?")
local name = io.read()
local greeting = "Hello " .. name .. "!"
local message = greeting .. " You are inside " .. app.pwd
return {
{ LogSuccess = message },
}
end
-- Map the function to a key (space)
xplr.config.modes.builtin.default.key_bindings.on_key.space = {
help = "and & greet",
messages = {
{ CallLua = "custom.ask_name_and_greet" }
}
}
-- Now, when you press "space" in default mode, you will be prompted for your
-- name. Enter your name to receive a nice greeting and to know your location.
```
### CallLua Argument
This is a special argument passed to the lua functions when called using the
`CallLua`, `CallLuaSilently` messages.
It contains the following information:
- version
- config
- pwd
- focused_node
- directory_buffer
- selection
- mode
- layout
- input_buffer
- pid
- session_path
- explorer_config
- history
- last_modes
TODO: Document each. For now, refer to the
[rust doc](https://docs.rs/xplr/latest/xplr/app/struct.CallLuaArg.html#fields).
Environment Variables and Pipes
-------------------------------
Alternative to `CallLua`, `CallLuaSilently` messages that call Lua functions,
there are `Call`, `CallLuaSilently`, `BashExec`, `BashExecSilently` messages
that call shell commands.
However, unlike the Lua functions, these shell commands have to read the useful
information and send messages via environment variables and temporary files
called "pipe"s. These environment variables and files are only available when
a command is being executed.
Visit the [**fzf integration tutorial**](modes.html#tutorial-adding-a-new-mode)
for example.
### Environment variables
To see the environment variables, invoke the shell by typing `:!` in default
mode and run the following command:
```
env | grep ^XPLR_
```
You will see something like:
```
XPLR_FOCUS_INDEX=0
XPLR_MODE=action to
XPLR_PIPE_SELECTION_OUT=/run/user/1000/xplr/session/122278/pipe/selection_out
XPLR_INPUT_BUFFER=
XPLR_PIPE_GLOBAL_HELP_MENU_OUT=/run/user/1000/xplr/session/122278/pipe/global_help_menu_out
XPLR_PID=122278
XPLR_PIPE_MSG_IN=/run/user/1000/xplr/session/122278/pipe/msg_in
XPLR_PIPE_LOGS_OUT=/run/user/1000/xplr/session/122278/pipe/logs_out
XPLR_PIPE_RESULT_OUT=/run/user/1000/xplr/session/122278/pipe/result_out
XPLR_PIPE_HISTORY_OUT=/run/user/1000/xplr/session/122278/pipe/history_out
XPLR_FOCUS_PATH=/home/sayanarijit/Documents/GitHub/xplr/docs/en/book
XPLR_SESSION_PATH=/run/user/1000/xplr/session/122278
XPLR_APP_VERSION=0.14.3
XPLR_PIPE_DIRECTORY_NODES_OUT=/run/user/1000/xplr/session/122278/pipe/directory_nodes_out
```
The environment variables starting with `XPLR_PIPE_` are the temporary files
called "pipe"s.
### Input pipe
Current there is only one input pipe.
- [XPLR_PIPE_MSG_IN](#xplr_pipe_msg_in)
### Output pipes
`XPLR_PIPE_*_OUT` are the output pipes that contain data which cannot be
exposed directly via environment variables, like multi-line string.
- [XPLR_PIPE_SELECTION_OUT](#xplr_pipe_selection_out)
- [XPLR_PIPE_GLOBAL_HELP_MENU_OUT](#xplr_pipe_global_help_menu_out)
- [XPLR_PIPE_LOGS_OUT](#xplr_pipe_logs_out)
- [XPLR_PIPE_RESULT_OUT](#xplr_pipe_result_out)
- [XPLR_PIPE_HISTORY_OUT](#xplr_pipe_history_out)
- [XPLR_PIPE_DIRECTORY_NODES_OUT](#xplr_pipe_directory_nodes_out)
### XPLR_PIPE_MSG_IN
Append new-line delimited messages to this pipe in [YAML](www.yaml.org) (or
[JSON](www.json.org)) syntax. These messages will be read and handled by xplr
after the command execution.
### XPLR_PIPE_SELECTION_OUT
New-line delimited list of selected paths.
### XPLR_PIPE_GLOBAL_HELP_MENU_OUT
The full help menu.
### XPLR_PIPE_LOGS_OUT
New-line delimited list of logs.
### XPLR_PIPE_RESULT_OUT
New-line delimited result (selected paths if any, else the focused path)
### XPLR_PIPE_HISTORY_OUT
New-line delimited list of last visited paths (similar to jump list in vim).
### XPLR_PIPE_DIRECTORY_NODES_OUT
New-line delimited list of paths, filtered and sorted as displayed in the
[files table](layouts.md#table).

@ -0,0 +1,259 @@
Modes
=====
xplr is a modal application. That means the users switch between different
modes, each containing a different set to key binding to avoid classes. The
modes can be configured using the `xplr.config.modes` Lua API.
- [builtin](#builtin)
- [custom](#custom)
The users can switch between these modes at run-time.
builtin
-------
Type: mapping of string and [Mode](#mode)
This is exposed by the `xplr.config.modes.builtin` API.
xplr by default provides the following builtin modes:
- default
- recover
- selection_ops
- create
- create_directory
- create_file
- number
- go_to
- rename
- delete
- action
- search
- filter
- relative_path_does_contain
- relative_path_does_not_contain
- sort
- switch_layout
- quit
Visit the [Default Key Bindings](default-key-bindings.md) to see what each mode
does.
custom
------
Type: mapping of string and [Mode](#mode)
This is exposed by the `xplr.config.layouts.custom` API.
It allows the users to define any custom layout.
Example:
```lua
xplr.config.modes.custom.example = {
name = "example",
key_bindings = {
on_key = {
enter = {
help = "default mode",
messages = {
"PopMode",
{ SwitchModeBuiltin = "default" }
}
}
}
}
}
xplr.config.general.initial_mode = "example"
-- when you load xplr, you should be in the "example" mode,
-- pressing "enter" should take you to the "default" mode.
```
Mode
----
A mode contains the following information:
- [name](#name)
- [help](#help)
- [extra_help](#extra_help)
- [key_bindings](#key_bindings)
### name
Type: string
This is the name of the mode visible in the help menu.
### help
Type: nullable string
If specified, the help menu will display this instead of the auto generated
mappings.
### extra_help
Type: nullable string
If specified, the help menu will display this along-side the auto generated
help menu.
### key_bindings
Type: [Key Bindings](#key-bindings)
The key bindings available in that mode.
Key Bindings
------------
Key bindings define how each keyboard input will be handled in a specific mode.
See the [default key bindings](default-key-bindings.md) for example.
Key bindings contains the following information:
- [on_key](#on_key)
- [on_alphabet](#on_alphabet)
- [on_number](#on_number)
- [on_special_character](#on_special_character)
- [default](#default)
### on_key
Type: mapping of [Key](#key) to nullable [Action](#action)
Defines what to do when a specific key is pressed.
### on_alphabet
Type: nullable [Action](#action)
An action to perform if the keyboard input is an alphabet and is not mapped via
the [on_key](#on_key) field.
### on_number
Type: nullable [Action](#action)
An action to perform if the keyboard input is a number and is not mapped via
the [on_key](#on_key) field.
### on_special_character
Type: nullable [Action](#action)
An action to perform if the keyboard input is a special character and is not
mapped via the [on_key](#on_key) field.
### default
Type: nullable [Action](#action)
Default action to perform in case of a keyboard input not mapped via any of the
[on_key](#on_key), [on_alphabet](#on_alphabet), [on_number](#on_number) or
[on_special_character](#on_special_character) field.
Action
------
An action contains the following information:
- help
- [messages](#messages)
### help
Type: nullable string
Description of what it does. If unspecified, it will be excluded from the help
menu.
### messages
Type: A list of [Message](message.md) to send.
The list of messages to send when a key is pressed.
Tutorial: Adding a New Mode
---------------------------
Assuming xplr is [installed](install.md) and [setup](post-install.md), let's
add our own mode to integrate xplr with [fzf](https://github.com/junegunn/fzf).
We'll call it `fzxplr` mode.
First, let's add a custom mode called `fzxplr`, and map the key `F` to an
action that will call `fzf` to search and focus on a file or enter into a
directory.
```lua
xplr.config.modes.custom.fzxplr = {
name = "fzxplr",
key_bindings = {
on_key = {
F = {
help = "search",
messages = {
{
BashExec = [===[
PTH=$(cat "${XPLR_PIPE_DIRECTORY_NODES_OUT:?}" | awk -F/ '{print $NF}' | fzf)
if [ -d "$PTH" ]; then
echo ChangeDirectory: "'"${PWD:?}/${PTH:?}"'" >> "${XPLR_PIPE_MSG_IN:?}"
else
echo FocusPath: "'"${PWD:?}/${PTH:?}"'" >> "${XPLR_PIPE_MSG_IN:?}"
fi
]===]
},
"PopMode",
},
},
},
default = {
messages = {
"PopMode",
},
},
},
}
```
As you can see, the key `F` in mode `fzxplr` (the name can be anything)
executes a script in `bash`.
`BashExec`, `PopMode`, `SwitchModeBuiltin`, `ChangeDirectory` and `FocusPath`
are [messages](message.md), `$XPLR_PIPE_MSG_IN`,
`$XPLR_PIPE_DIRECTORY_NODES_OUT` are
[environment variables](message.md#environment-variables) exported by `xplr`
before executing the command. They contain the path to the
[input](message.md#input-pipe) and [output](message.md#output-pipes) pipes that
allows external tools to interact with `xplr`.
Now that we have our new mode ready, let's add an entry point to this mode via
the `default` mode.
```lua
xplr.config.modes.builtin.default.key_bindings.on_key["F"] = {
help = "fzf mode",
messages = {
{ SwitchModeCustom = "fzxplr" },
},
}
```
Now let's try out the new `xplr`-`fzf` integration.
[![xplr-fzf.gif](https://s3.gifyu.com/images/xplr-fzf.gif)](https://gifyu.com/image/tW86)

@ -0,0 +1,37 @@
Post Install
============
Once [installed](install.md), use the following steps to setup and run xplr.
Create the customizable config file
-----------------------------------
```bash
mkdir -p ~/.config/xplr
version="$(xplr | grep ^version: | cut -d' ' -f 2)"
# When the app loads, press `#`
echo version = '"'${version:?}'"' > ~/.config/xplr/init.lua
```
Then
**[copy from here](https://github.com/sayanarijit/xplr/blob/main/src/init.lua)**
and remove / comment out what you don't want to customize.
> **Note:** You don't generally need to create the config file. You can use the
> default configuration for basic operations. However, creating the config file
> is recommended because the project is in its early stage and the defaults
> might change. Creating the config file will save you from unexpected behavior
> when you [upgrade](upgrade-guide.md).
> Also, the default configuration is meant to be overwritten to suit your
> workflow.
Run
---
```
xplr
```

@ -0,0 +1,5 @@
Quickstart
==========
In this chapter, we'll learn how to install and configure xplr on our machine
for the first time.

@ -0,0 +1,89 @@
Style
=====
A style object contains the following information:
- [fg](#fg)
- [bg](#bg)
- [add_modifiers](#add_modifiers)
- [sub_modifiers](#sub_modifiers)
### fg
Type: nullable [Color](#color)
The foreground color.
### bg
Type: nullable [Color](#color)
The background color.
### add_modifiers
Type: nullable list of [Modifier](#modifier)
Modifiers to add.
### sub_modifiers
Type: nullable list of [Modifier](#modifier)
Modifiers to remove.
Color
-----
Color can be one of the following:
- "Reset"
- "Black"
- "Red"
- "Green"
- "Yellow"
- "Blue"
- "Magenta"
- "Cyan"
- "Gray"
- "DarkGray"
- "LightRed"
- "LightGreen"
- "LightYellow"
- "LightBlue"
- "LightMagenta"
- "LightCyan"
- "White"
- { Rgb = { int, int, int } }
- { Indexed = int }
Modifier
--------
Modifier can be one of the following:
- "Bold"
- "Dim"
- "Italic"
- "Underlined"
- "SlowBlink"
- "RapidBlink"
- "Reversed"
- "Hidden"
- "CrossedOut"
Example
-------
```lua
xplr.config.general.cursor.style.fg = "Red"
xplr.config.general.cursor.style.bg = { Rgb = { 100, 150, 200 } }
xplr.config.general.cursor.style.add_modifiers = { "Bold", "Italic" }
xplr.config.general.cursor.style.sub_modifiers = { "Hidden" }
```

@ -0,0 +1,28 @@
TODO
====
- [x] Saner key bindings.
- [x] Pipes.
- [x] Native search & filter.
- [x] Create, copy, move, delete files directly.
- [x] logging support.
- [x] Version compatibility instructions.
- [x] Implement CLI arguments.
- ~Add support for tabs and/or panes (non native)~ [hacked](https://github.com/sayanarijit/xplr/wiki/Hacks#spawn-multiple-sessions-in-different-windows) | [discussion](https://github.com/sayanarijit/xplr/discussions/15)
- ~Implement bookmarks.~ [hacked](https://github.com/sayanarijit/xplr/wiki/Hacks#bookmark)
- [x] Add sorting support.
- [x] Add filter support.
- [x] File previews.
- [ ] Implement plugins support (or some way to easily share configuration).
- [x] Bigger (and better) help menu.
- [ ] Offline docs.
- [ ] Support for background services.
- [x] ~Customize~ switch UI in run-time.
- [ ] More tests and benchmarks.
- [ ] Measure code coverage.
- [ ] Improve the [vim plugin](https://github.com/sayanarijit/xplr.vim).
- [ ] Cleanup, refactor, optimize.
[add more](https://github.com/sayanarijit/xplr/discussions/2)
Like this project so far? **[Please consider contributing](contribute.md).**

@ -0,0 +1,212 @@
Upgrade Guide
=============
When you upgrade xplr, you might see an error like this
```
Incompatible script version in: /home/sayanarijit/.config/xplr/init.lua. The script version is: 0.9.0, the required version is: 0.10.1. Visit https://github.com/sayanarijit/xplr/wiki/Upgrade-Guide
```
All you need to do is follow the [instructions](#instructions) starting from
your config version, all the way to the required version.
<details>
<summary>Expand for more information</summary>
With every update, we either implement a `major` breaking change (e.g.
deprecating or replacing messages), or a `minor` feature addition (e.g. adding
new messages) or `patch`, fixes, and optimization (e.g. performance
optimization).
Knowing that we use the `{major}.{minor}.{patch}` versioning format,
- Major version mismatch are generally incompatible. xplr will fail
with error.
- Minor version upgrades (not downgrades) and patch fixes are backwards
compatible. You might get notified by log a message which you can disable by
updating the version in your config file.
- However, if the config file has a higher value for the minor version
than the app, then also xplr will fail with error, suggesting you
to visit this page.
Though in that case, you will be downgrading your config file based on your
app version.
e.g.
- `1.0.0` -> `1.0.x`: Bug fix (fully compatible).
- `1.0.0` -> `1.x.x`: Only backwards compatible. You can't generally use for
e.g. `app-1.0.0` with `config-1.1.0`. But vice versa is fine.
- `1.0.0` -> `x.x.x`: Not compatible at all.
Note that until we're `v1`, we'll be using the `{minor}` version number as
`{major}`, and the `{patch}` fix number as `{minor}` to determine
compatibility.
</details>
### Instructions
#### [v0.13.7](https://github.com/sayanarijit/xplr/releases/tag/v0.13.7) -> [v0.14.2](https://github.com/sayanarijit/xplr/releases/tag/v0.14.2)
- macOS users need to place their config file (`init.lua`) in
`$HOME/.config/xplr/` or `/etc/xplr/`.
- Library users please refer to the latest API docs.
- Check out the new messages: `{Start|Stop|Toggle}Fifo`. These enable support
for [FIFO based file previews](https://github.com/sayanarijit/xplr/pull/229#issue-662426960).
- You can disable the recover mode using `config.general.disable_recover_mode = true`.
- Try running `xplr --help`. Yes, CLI has been implemented.
<sub>Like this project so far? **[Please consider contributing](contribute.md)**.</sub>
#### [v0.12.1](https://github.com/sayanarijit/xplr/releases/tag/v0.12.1) -> [v0.13.7](https://github.com/sayanarijit/xplr/releases/tag/v0.13.7)
- Lua functions called using [`CallLua`](https://docs.rs/xplr/latest/xplr/app/enum.ExternalMsg.html#variant.CallLua) and [`CallLuaSilently`](https://docs.rs/xplr/latest/xplr/app/enum.ExternalMsg.html#variant.CallLuaSilently) messages will receive [`CallLuaArg`](https://docs.rs/xplr/latest/xplr/app/struct.CallLuaArg.html) object as the function argument (instead of the [`App`](https://docs.rs/xplr/latest/xplr/app/struct.App.html) object).
- Each `node_types` config will inherit defaults from matching less specifig `node_types` config and overwrite them.
- Since version `v0.13.2`, you don't need to use/send `Refresh` anymore. It will be auto-handled by xplr.
#### [v0.11.1](https://github.com/sayanarijit/xplr/releases/tag/v0.11.1) -> [v0.12.1](https://github.com/sayanarijit/xplr/releases/tag/v0.12.1)
- `xplr.config.node_types.mime_essence` has split into type and subtype. Hence, instead of `xplr.config.node_types.mime_essence["text/plain"] = ..` use `xplr.config.node_types.mime_essence["text"] = { plain = .. }`.
- You can also define `xplr.config.node_types.mime_essence["text"]["*"]` that will match all text types (`text/*`).
#### [v0.10.2](https://github.com/sayanarijit/xplr/releases/tag/v0.10.2) -> [v0.11.1](https://github.com/sayanarijit/xplr/releases/tag/v0.11.1)
- `remaps:` has been removed to avoid confusion. Use lua assignments instead.
For e.g.
```
xplr.config.modes.builtin.default.key_bindings.on_key["v"] = xplr.config.modes.builtin.default.key_bindings.on_key.space
```
#### [v0.9.1](https://github.com/sayanarijit/xplr/releases/tag/v0.9.1) -> [v0.10.2](https://github.com/sayanarijit/xplr/releases/tag/v0.10.2)
- [`config.yml`](https://github.com/sayanarijit/xplr/blob/85696ded7a/src/config.yml) has been fully replaced with [`init.lua`](https://github.com/sayanarijit/xplr/blob/main/src/init.lua). If you have a lot of customization in your `config.yml`, [xplr-yml2lua](https://github.com/sayanarijit/xplr-yml2lua) can help you with migrating it to `init.lua`.
- `Handlebars` templates has been replaced with [Lua functions](https://github.com/sayanarijit/xplr/blob/bfdb7736b99bc3c5ae53e7d621ba0e7ca2299b14/src/init.lua#L2005-L2064). You can either remove the customizations or overwrite the functions accordingly.
- Added new messages `CallLua` and `CallLuaSilently` to call lua functions. The app state will be passed as input to the functions, and the returned messages will be handled by xplr. `CallLua` and `CallLuaSilently` are more flexible (and probably faster) alternatives to `Call`, `CallSilently`, `BashExec` and `BashExecSilently`. [e.g.](https://github.com/sayanarijit/xplr/pull/177#issue-650643573)
#### [v0.9.0](https://github.com/sayanarijit/xplr/releases/tag/v0.9.0) -> [v0.9.1](https://github.com/sayanarijit/xplr/releases/tag/v0.9.1)
- You can now set `remaps: {key: null}` to un-map a key.
- `gx` will open the item under focus.
- New key map `:sx` will open the selected items.
#### [v0.8.0](https://github.com/sayanarijit/xplr/releases/tag/v0.8.0) -> [v0.9.0](https://github.com/sayanarijit/xplr/releases/tag/v0.9.0)
Your previous config should mostly work fine. However, in case you are using `SwitchMode` heavily in your custom config, follow along.
- Introduced new message `PopMode`. You might want to use this message instead of `SwitchMode*` when returning back to the previous mode.
- After using (the group of) `PopMode` and `SwitchMode*` messages, you are now required to `Refresh` manually to avoid the UI lag.
- Pressing any invalid key will now lead you to the `recover` mode and will protect you from typing further invalid keys. Press `esc` to escape the `recover` mode.
- Introduced new message `LogWarning`, similar to other `Log*` messages.
- Creating files and directories has been optimized for batch creation.
#### [v0.7.2](https://github.com/sayanarijit/xplr/releases/tag/v0.7.2) -> [v0.8.0](https://github.com/sayanarijit/xplr/releases/tag/v0.8.0)
If you have made changes to the config file,
- Replace message `Explore` with `ExplorePwd` or `ExplorePwdAsync` or probably `ExploreParentsAsync`.
- Pipe `$XPLR_PIPE_FOCUS_OUT` has been removed. Use `$XPLR_FOCUS_PATH` env var instead.
- You might want to review your path escaping logics. For e.g. use `echo FocusPath: "'"$PWD"'" >> $PIPE` instead of `echo "FocusPath: $PWD" >> $PIPE`.
#### [v0.7.0](https://github.com/sayanarijit/xplr/releases/tag/v0.7.0) -> [v0.7.2](https://github.com/sayanarijit/xplr/releases/tag/v0.7.2)
- Just update the `version` in your config file.
- For version >= `v0.7.1`, you might want to free up or remap the `tab` key in `search` mode to enable easy selection during search.
#### [v0.6.0](https://github.com/sayanarijit/xplr/releases/tag/v0.6.0) -> [v0.7.0](https://github.com/sayanarijit/xplr/releases/tag/v0.7.0)
If you haven't made any changes in the config file, you should be fine just updating the version number. Else,
- You can make the `Table: ...`, `InputAndLogs: ...` layout values null and define the common properties in the `general.panel_ui` instead.
#### [v0.5.13](https://github.com/sayanarijit/xplr/releases/tag/v0.5.13) -> [v0.6.0](https://github.com/sayanarijit/xplr/releases/tag/v0.6.0)
If you haven't made any changes in the config file, you should be fine just updating the version number. Else,
- Rename `add_modifier: {bits: 1}` to `add_modifiers: [Bold]`, `sub_modifier: {bits: 1}` to `sub_modifiers: [Bold]` and so on.
- Rename `percentage: 10` to `Percentage: 10`, `ratio: 1` to `Ratio: 1` and so on.
- You might want to free up or remap the `ctrl-w` key binding in `default` mode to enable layout switching.
Optionally, checkout this new theme to learn more about what's new.
#### [v0.5.0](https://github.com/sayanarijit/xplr/releases/tag/v0.5.0) -> [v0.5.13](https://github.com/sayanarijit/xplr/releases/tag/v0.5.13)
- Just update the `version` in your config file.
- For versions >= `v0.5.8`, you can set `$OPENER` env var to declare a global GUI file opener (to open files using keys `gx`).
- You might also want to update other mappings to handle files with names starting with `-` (hiphen). For example, instead of `rm ${filename}` use `rm -- ${filename}`. Same goes for `cp`, `mv`, `cat`, `touch` etc.
- For version >= `v0.5.13`, you might want to use the more specific `SwitchModeBuiltin` and `SwitchModeCustom` messages instead of the general `SwitchMode` message.
#### [v0.4.3](https://github.com/sayanarijit/xplr/releases/tag/v0.4.3) -> [v0.5.0](https://github.com/sayanarijit/xplr/releases/tag/v0.5.0)
If you haven't have any changes in the config file, you should be fine just updating the version number.
Else do the following
- Replace `{RelativePathIs, case_sensitive: true}` with `RelativePathIs`.
- Replace `{RelativePathIs, case_sensitive: false}` with `IRelativePathIs`.
- Do the same with other filters you are using.
- You might want to update your `backspace` handling to use the `RemoveInputBufferLastCharacter` message.
- You might want to free-up `f`, `s`, `ctrl-r` and `ctrl-u` key bindings in the default mode, or remap them.
- You might want to use the new UI variables.
- Update your config version to `v0.5.0`.
#### [v0.4.2](https://github.com/sayanarijit/xplr/releases/tag/v0.4.2) -> [v0.4.3](https://github.com/sayanarijit/xplr/releases/tag/v0.4.3)
If you have customized `general.table.row.cols`, you might want to [update it](https://github.com/sayanarijit/xplr/blob/af1cda5762/src/config.yml#L46-L48) to use the new variables with better symlink support.
#### [v0.4.1](https://github.com/sayanarijit/xplr/releases/tag/v0.4.1) -> [v0.4.2](https://github.com/sayanarijit/xplr/releases/tag/v0.4.2)
In case you have mapped the keys `q`, `ctrl-i` and `ctrl-o`, you may want to revisit the default mode key bindings and remap accordingly to use the new functionalities.
#### [v0.3.13](https://github.com/sayanarijit/xplr/releases/tag/v0.3.13) -> [v0.4.1](https://github.com/sayanarijit/xplr/releases/tag/v0.4.1)
A lot has changed (apologies). But I promise from now on, upgrading will be much less painful (thanks to [@maximbaz](https://github.com/maximbaz)'s valuable [inputs](https://github.com/sayanarijit/xplr/issues/45#issue-854447104) and [code reviews](https://github.com/sayanarijit/xplr/pull/47)).
So, to start with the upgrade, let's remove everything from your config file except the `version` field and your custom modifications. If `version` is the only thing remaining, update it to `v0.4.1` and you are done.
Else, do the following
- Rename `general.focused_ui` to `general.focus_ui` ([see here](https://github.com/sayanarijit/xplr/blob/055c1083d6/src/config.yml#L124)).
- Rename `filetypes` to `node_types`. ([see here](https://github.com/sayanarijit/xplr/blob/055c1083d6/src/config.yml#L145))
- Rename `custom` field to `meta`. ([see here](https://github.com/sayanarijit/xplr/blob/055c1083d6/src/config.yml#L154-L155))
- Move `icon` to `meta.icon`. ([see here](https://github.com/sayanarijit/xplr/blob/055c1083d6/src/config.yml#L45))
- Rename `normal_ui` to `default_ui`. ([see here](https://github.com/sayanarijit/xplr/blob/055c1083d6/src/config.yml#L114))
- Split `modes` into `modes.builtin` and `modes.custom` ([see here](https://github.com/sayanarijit/xplr/blob/055c1083d6/src/config.yml#L180-L181)). Migrate your custom modes to `modes.custom`. And copy only the changes in the in-built modes in `modes.builtin`.
- Finally, update the `version` to `v0.4.1`.
#### [v0.3.8](https://github.com/sayanarijit/xplr/releases/tag/v0.3.8) -> [v0.3.13](https://github.com/sayanarijit/xplr/releases/tag/v0.3.13)
Your current config should work fine. However, you might want to replace some `Call` and `BashExec` messages with `CallSilently` and `BashExecSilently` to remove the flickering of the screen.
If you haven't made any changes to the configuration, you can delete and regenerate it.
Else, do the following
- Check the new default config by temporarily removing your current config (with backup) and dumping the new config.
- Search for `Call` and `BashExec` in the new config.
- Compare and probably replace the associated actions in your current config
#### [v0.3.0](https://github.com/sayanarijit/xplr/releases/tag/v0.3.0) -> [v0.3.8](https://github.com/sayanarijit/xplr/releases/tag/v0.3.8)
Your current config should work fine. However, you might want to replace some `ResetNodeFilters` messages with `RemoveNodeFilter` and `RemoveNodeFilterFromInput` to get a better search and filter experience.
If you haven't made any changes to the configuration, you can delete and regenerate it.
Else, do the following
- Check the new default config by temporarily removing your current config (with backup) and dumping the new config.
- Search for `RemoveNodeFilterFromInput` in the new config.
- Compare and probably replace the associated actions in your current config.
#### v0.2.14 -> [v0.3.0](https://github.com/sayanarijit/xplr/releases/tag/v0.3.0)
If you haven't made any changes to the configuration, you can delete and regenerate it.
Else do the following:
- `$XPLR_APP_YAML` has been removed. You can use `Debug` to export the app state.
- `$XPLR_RESULT` has been ported to file `$XPLR_PIPE_RESULT_OUT`. Use `cat` instead of `echo`, `<` instead of `<<<` etc.
- `$XPLR_GLOBAL_HELP_MENU` has been ported to
file `$XPLR_PIPE_GLOBAL_HELP_MENU_OUT`. Use `cat` instead of `echo`, `<` instead of `<<<` etc.
- `$XPLR_DIRECTORY_NODES` has been ported to
file `$XPLR_PIPE_DIRECTORY_NODES_OUT`. Use `cat` instead of `echo`, `<` instead of `<<<` etc.
- `$XPLR_LOGS` has been ported to file `$XPLR_PIPE_LOGS_OUT`. Use `cat` instead of `echo`, `<` instead of `<<<` etc.
- `$XPLR_PIPE_RESULT` has been ported to file `$XPLR_PIPE_RESULT_OUT`. Use `cat` instead of `echo`, `<` instead of `<<<` etc.
- Finally, update the `version` in your config file.

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<title>xplr book</title>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
<style>
div {
margin: 18pt;
font-size: 24pt;
}
</style>
</head>
<body>
<h1>xplr book</h1>
<ul>
<li><a href="en/index.html">English</a></li>
</ul>
</body>
</html>
Loading…
Cancel
Save