* feat(client): add config option keys.scroll_exits
If the config option is set the `false`, using the up/down key won't
exit the TUI when scrolled past the first/last entry.
Example:
```
[keys]
scroll_exits = false
```
The default is `true`, which is the current behavior.
* Update atuin/src/command/client/search/interactive.rs
Co-authored-by: Koichi Murase <myoga.murase@gmail.com>
* refactor: add option to config.toml
---------
Co-authored-by: Koichi Murase <myoga.murase@gmail.com>
* add xonsh to `atuin import auto`
* respect $HISTFILE in xonsh importers
* disable up-arrow binding in xonsh when completion menu is active
* include xonsh logic in the same conditional as other shells
* format and fix clippy lints
* feat: support syncing aliases
This is definitely not yet finished, but works for zsh right now.
TODO:
1. Support other shells
2. Cache the alias generation, so we don't have to do a bunch of work at
shell init time
* correct imports
* fix clippy errors
* fix tests
* add the other shells
* support xonsh
* add delete
* update rust, then make clippy happy once more
* omfg fmt too
Fixes https://github.com/atuinsh/atuin/issues/1719
[C-m] is usually identical to [RET] in the terminal protocol, and some
users use [C-m] in place of [RET]. However, kitty's extended keyboard
protocol enables differentiating them so that [C-m] does not function
as does without the extended keyboard protocol.
For the compatibility with terminals without extended keyboard
protocols, we anyway cannot assign a distinct feature to [C-m], so we
can safely add the explicit binding of InputAction::Accept to [C-m].
* add importers for xonsh JSON files and SQLite db
* rustfmt xonsh importers
* remove env-dependent tests from xonsh importers
* pass xonsh_data_dir into path resolver instead of looking up in env
* review: run format
* review: fix clippy errors
---------
Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
Instead of lots of small sqlite transaction, do one monster one.
A single tx with 100s of 1000s of rows should be fine on all systems
A very unscientific test shows this to be roughly 10x faster
The current 'i' binding to switch to insert mode is entirely unintuitive
since what I almost always want to do is append to the current query.
The fact that the cursor extends past the current input (which vim
doesn't do with default settings) adds to the problem. The 'a' key is
what I would reach for, but 'A' makes a lot of sense too so I added
that.
The 'h' and 'l' bindings for moving the cursor also help makes things
a bit more usable.
Low-end devices like RISC-V SBCs are sometimes too slow to initialize SQLite in 0.1s. Option to specify a higher value allows check to pass on such devices with relaxed restrictions.
The `Stdout::new` function first enters an alternate
screen then later enables enhanced keyboard mode.
In `Drop`, we need to do this in the opposite order:
disable enhanced keyboard mode then exit alternate mode.
Fixes#1693
Replace lots of logging with some progress bars. This looks much nicer
I'd like to move it out of the atuin-client crate and into the atuin
crate. But first, I want to decouple a lot of the record moving, so it
can wait until that's done.
* Allow specifying a timezone in history search/list
* Fix clippy complaints
* Add a bit more comment on supporting named timezones
* Add rudimentary tests
* Ditch local timezone test
* Timezone configuration support
* Set default timezone to `local`
* `--tz` -> `--timezone`
`--tz` is kept as a visible alias
* fix(bash/preexec): support termcap-based tput
The current uses of tput specify the terminfo entry names. However,
there are different implementations of the tput command. There are
two ways to specify the terminal capability: terminfo and termcap
names. Although recent implementations of tput (such as ncurses in
Linux) accepts the terminfo name, some accept both the terminfo and
termcap names, and some old implementations (such as in FreeBSD) only
accept the termcap names.
In this patch, we first attempt the terminfo name and then the termcap
name if the terminfo name fails.
Note: When both fail due to e.g. non-existent tput, we end up with
outputting nothing. This does not cause a serious problem because it
just does not clear the previous prompts.
* perf(bash/preexec): cache the results of tput
With the current implementation, we spwan 10 processes of the tput
command at most every time we perform `enter_accept`. In this patch,
to reduce the delay, we separate the related code into a function and
cache the results of the tput commands.
When the previous prompt is longer than the prompt calculated by the
current PS1, some extra characters from the previous prompt remains in
the terminal display. In this patch, we erase the content of the
previous prompt before outputting our new prompt.
Fixes https://github.com/atuinsh/atuin/issues/1668
When the prompt becomes longer after "enter_accept", Bash still uses
the previous shorter prompt, so the extra characters in the new prompt
drawn by Atuin is left in the terminal display. In this patch, we
remove the last line of the prompt drawn by Atuin so that it doesn't
interfere with the last line of the prompt drawn by Bash.
This allows the user to
1. Specify that they want to sync, but ONLY pull new data
2. Specify that they wish to force pull, which will wipe the local store
and download it from the remote
With the other set of changes, this allows the user to perform
sufficient maintenance to recovery from most errors I can think of right
now.
This will
1. Wipe the remote store
2. Upload all of the local store to remote
Imagine the scenario where you end up with some mixed keys locally :(
You confirm this with
```
atuin store verify
```
You then fix it locally with
```
atuin store purge
```
Ensure that your local changes are reflected remotely with
```
atuin store push --force
```
and then (another PR, coming soon), update all other hosts with
```
atuin store pull --force
```
This command will delete all records from the local store that cannot be
decrypted with the current key.
If a verify fails before running this, it should pass _after_ running
it.
Required afterwards:
- A `push --force`, to allow ensuring the remote store equals the local
store (deletions have now occured!)
- A `pull --force`, as once remote has been forced then local needs the
same
Nice to have:
- Provide "old" keys to purge, in case the are not lost. Or maybe rekey.
This ensures that the local store can be decrypted with the current
in-use key.
If it cannot, we can go on to perform maintenance operations and get
back into a happy state.
* feat: add prefers_reduced_motion flag
* use NO_MOTION, and ensure type is bool
* update default config
---------
Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
* feat: add record re-encrypting
* automatically re-encrypt store when logging in with a different key
* fix
* actually save the new key lmao
* add rekey
* save new key
* decode bip key
* "add test for sqlite store re encrypt"
I accidentially broke my atuin database by executing `atuin` from the
PR I was working on without setting these variables and had to manually
roll back my local database.
That shouldn't happen, so we set the database and record store path in
the devshell to something that does not overwrite our normal databases.
We also warn if these files already exist, because when entering the
devshell, a user might want to start from a clean slate here.
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Now that local history is stored encrypted, new_key should not overwrite
an existing one. This may be frustrating, but will remove the risk of
Atuin generating a new key and the user losing their old one.
* add support for getting the total length of a store
* tidy up sync
* auto call init if history is ahead
* fix import order, key regen
* fix import order, key regen
* do not delete key when user deletes account
* message output
* remote init store command; this is now automatic
* should probs make that function return u64 at some point
1. Test that multiple users can be registered without clobbering each
other
2. Test that one user can change their password without it affecting the
other
I'd like to also test sync with multiple users, to ensure we never
accidentally leak data cross-users.
For a few reasons
1. This step is really, really slow. I don't think there's sufficient
value in a slow CI step to keep it
2. Whenever we add an integration test it needs to be added to the
ignore list. I want to keep friction on adding such tests as low as
is possible.
3. We already run tests in a bunch of places, so I don't think this is
needed
Ref: #1123
* Add basic xonsh support
* Add init xonsh command
* Add Xonsh install instructions in docs
* Add xonsh ctrl-R search
* update xonsh script and instructions
Summary of changes:
* Added duration to postcommand hook
* Switched main search operation to use `subproccess.run()` rather than running as an xonsh shell command - this a) allows us to capture stderr without needing a temporary file and b) avoids a weird broken-buffer state that results from running a fullscreen TUI and then programmatically editing the buffer
* Added support for immediately executing chosen command via `__atuin_accept__:` (like bash/zsh/fish)
* strip newline from command before sending to atuin
* Add basic xonsh support
* Add init xonsh command
* Add xonsh ctrl-R search
* Remove advanced-install guide (was accidentally re-added during rebase)
* Clean up
Xonsh doesn't import private functions into the local namespace when sourcing a file
* Add xonsh ro readme
* Respect ATUIN_NOBIND
* Format with black, and improve PEP8 compliance
* Add up search
* Format rust code
---------
Co-authored-by: Joseph Montanaro <jfmonty2@gmail.com>