Use `--print-pwd-as-result` to print the last working directory instead
of the focused or selected nodes, when you quit using the `PrintResultAndQuit`
message (i.e. by pressing `enter`).
This helps with implementing the "cd on quit" functionality using a plain shell
alias.
Example:
```
alias xcd='cd "$(xplr --print-pwd-as-result)"'
```
With this alias set, you can navigate directories using xplr by entering
`xcd` command, and when you quit by pressing enter, you will enter the
directory.
You can of course, quit with plain `Quit` (i.e. by pressing `esc`) to
gracefully cancel "cd on quit".
Features:
- Display debug menu on configuration error
- Configure wether xplr should show the debug menu
(through `debug_on_error`)
- Open logs in editor
- Redirect people to the issues page on Github.
This PR breaks the custom layout renderer API by deprecating the
following heavyweight fields in the Lua Context passed to the renderer
functions.
The following fields are being deprecated:
- app.directory_buffer
- app.history
- app.last_modes
However, there's no change in the Lua Context passed to the functions
called via `CallLua*` messages.
Closes: https://github.com/sayanarijit/xplr/issues/418
This adds `on_function` handler to handle F1-F12 keys.
This also fixes issues with previously added handlers and adds a
checklist for future additions.
This PR adds a new message: `UpdateInputBuffer: InputOperation`
This makes it possible to perform cursor based input operations without
needing input from the keyboard.
New message: `UpdateInputBufferFromKey` to replace most
`BufferInputFromKey` usage.
This adds more functionalities to the input buffer and reduces
boilerplate code.
This commit also deprecates `config.general.cursor` as the cursor will
be set by the terminal from now.
Repo: https://github.com/sayanarijit/tui-input
fn runner() and fn from_cli(cli: Cli) util functions are located to
app.rs. However, those are utils for runner. So this commit change the
functions to runner.rs.
Use `-C` / `--extra-config` to load Lua files to overwrite the default
or user defined config.
This helps with integration, where integrating xplr with another tool
requires xplr to overwrite some config, without requiring the users to
install an xplr plugin or update the xplr config.
Example:
```bash
xplr -C one.lua two.lua
# Or
xplr -C one.lua -C two.lua
```
> **WARNING:**
>
> Extra config doesn't require specifying the `version`, hence, it's the
> integration author or the user's responsibility to assert
> compatibility using the globally exposed `version` in the extra config
> files, similar to xplr plugins.
Ref: https://github.com/sayanarijit/xplr/issues/316
This improves the compatibility and adds the ability to introduce
non-breaking changes by using a builder pattern.
Example:
```rust
fn main() {
match xplr::runner(None).and_then(|a| a.run()) {
Ok(Some(out)) => print!("{}", out),
Ok(None) => {}
Err(err) => {
if !err.to_string().is_empty() {
eprintln!("error: {}", err);
};
std::process::exit(1);
}
}
}
```
Remaps has been removed to simplify key bindings. With Lua, it's now
possible to remap using basic assignments.
For e.g.
```Lua
xplr.config.modes.builtin.default.key_bindings.on_key["v"] = xplr.config.modes.builtin.default.key_bindings.on_key.space
```
Help menu will auto detect remapped keys and display after removing the
redundant mappings.
Ref: https://github.com/sayanarijit/xplr/discussions/183#discussioncomment-774159
Public structs enable automatec documentation.
xplr is not (yet) a library. Even it want to become one, making fields
private is probably not the right way.
This works:
```lua
xplr.fn.custom.ping = function(app)
print("What's your name?")
local name = io.read()
os.execute('read -p "Hello ' .. name .. ', you are in ' .. app.pwd .. '"')
return {
{ LogSuccess = "pong" },
}
end
```
Then it can be called via `CallLua: custom.ping`.
This commit begins porting of `config.yml` to `init.lua`.
As of now, it's not be possible to do the complete migration
because of how lua and yaml handles `null`/`nil` value.
So, we will need to completely deprecate `config.yml` in order to do the
complete migration.
Use `remaps: {key: null}` to un-map a key.
Also,
- `gx` will now open only the file under focus.
- `:sx` will open the selected files.
And other minor improvements.
Discussion: https://github.com/sayanarijit/xplr/discussions/146
```
Benchmarking focus next item: Collecting 100 samples in estimated 5.1972 s (126k itera focus next item time: [41.216 us 41.346 us 41.494 us]
change: [-28.669% -28.110% -27.551%] (p = 0.00 < 0.05)
Performance has improved.
Found 9 outliers among 100 measurements (9.00%)
4 (4.00%) high mild
5 (5.00%) high severe
Benchmarking focus previous item: Collecting 100 samples in estimated 5.0576 s (116k i focus previous item time: [43.589 us 43.754 us 43.927 us]
change: [-29.506% -28.748% -28.039%] (p = 0.00 < 0.05)
Performance has improved.
Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) high mild
2 (2.00%) high severe
Benchmarking focus first item: Collecting 100 samples in estimated 5.1765 s (116k iter focus first item time: [44.071 us 44.340 us 44.634 us]
change: [-26.739% -26.314% -25.885%] (p = 0.00 < 0.05)
Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
8 (8.00%) high mild
4 (4.00%) high severe
Benchmarking focus last item: Collecting 100 samples in estimated 5.1522 s (116k itera focus last item time: [43.950 us 44.214 us 44.541 us]
change: [-27.571% -26.953% -26.337%] (p = 0.00 < 0.05)
Performance has improved.
Found 11 outliers among 100 measurements (11.00%)
5 (5.00%) high mild
6 (6.00%) high severe
Benchmarking leave and enter directory: Collecting 100 samples in estimated 5.4863 s ( leave and enter directory
time: [96.645 us 96.915 us 97.234 us]
change: [-28.720% -27.224% -25.666%] (p = 0.00 < 0.05)
Performance has improved.
Found 9 outliers among 100 measurements (9.00%)
6 (6.00%) high mild
3 (3.00%) high severe
```
This PR targets 2 pain points.
1. The `Explore` message was async, which caused some unexpected
behavior. This was fixed by splitting `Explore` into `ExplorePwd`,
`ExplorePwdAsync` and `ExploreParentsAsync`. `ExploreParentsAsync`
is similar to the former `Explore`, which is mainly used when loading
`xplr` for the first time. However, what we'll be using frequently
are `ExplorePwd` and `ExplorePwdAsync` messages.
2. Files with spaces caused some unexpected behavior. This was fixed by
escaping the paths properly. This also fixed focusing of a file after
creating or renaming it.
Anothor breaking change is that `XPLR_PIPE_FOCUS_OUT` has been removed.
`XPLR_FOCUS_PATH` is all we need. So, the rule of thumb is if a variable
contains one liner value, it can be used directly from the env vars.
Variables that can contain multi-line values, will be exposed via the
pipes.
Minor changes are
- Add `switch_mode` mode to the global key binding help menu
- Moved some UI related code from config.rs to ui.rs.
- Fixed compilation issue on `rustc 1.50.0`.
From this commit, the app state will be written to the output pipes only
when invoking a command.
For auto refreshing pipes, we can brainstorm on `service`s concept.
Now, users can change the UI layout via the `SwitchLayout{Builtin|Custom}`
message, or by using key `ctrl-w`.
There are 3 default layout options -
- default
- no_help
- no_selection
- no_help_no_selection
Also, the initial mode and the initial layout can be specified in the
config.
Closes: https://github.com/sayanarijit/xplr/issues/107