Commit Graph

1008 Commits

Author SHA1 Message Date
Koichi Murase
99f76ced50
feat(bash): support high-resolution timing even without ble.sh (#1534)
* feat(bash): support high-resolution timing without blesh

For the integration using bash-preexec, this measures the execution
time of the command using EPOCHREALTIME without the support by ble.sh.
This is not as accurate as the measurement by ble.sh as it contains
also the processing time of the preexec and precmd hooks, but it is
still free from the fork cost.

* fix(shell): work around custom IFS for duration

When a custom IFS is set by the user, the word splitting of
${duration:+--duration "$duration"} does not work as expected.  We
instead use the form "--duration=$duration" with the word splitting
being disabled.
2024-01-10 13:23:51 +00:00
Koichi Murase
a80ca27cc4
refactor(shell): refactor and localize HISTORY => __atuin_output (#1535) 2024-01-10 13:21:13 +00:00
Mike Tsao
803b2fed5c
docs: Improve style (#1537)
"backup" is a noun. "back up" is a verb.
2024-01-10 08:22:35 +00:00
Ellie Huxtable
d1fc843db3
docs: clarify enter/tab usage (#1538) 2024-01-10 08:18:47 +00:00
Koichi Murase
f63f24699e
style(bash): use consistent coding style (#1528)
* style(bash): make indentation consistent

Initially, in this file, the first level is indented by four spaces,
and additional levels are indented by adding two spaces.  However,
this does not seem intentional because the other files, such as
atuin.zsh, are consistently indented by four spaces for any levels.
The indentation was gradually fixed to use four spaces when the
relevant code is updated, but there are still remaining parts using
two spaces.  In this patch, the remaining parts are updated to use the
consistent indentation of four spaces.

* style(bash): remove extra quotations on rhs of assignments

On the right-hand sides of assignments, the quoting of the variable
expansions are not needed because they are not subject to the word
splitting and the pathname expansions.

* style(bash): strip `{` and `}` from `${var}` when not needeed

* style(bash): do not use unnecessary quoting in the conditional commands

In the conditional commands [[ ... ]], the words are not subject to
the word splitting and the pathname expansions, so we do not need to
quote the expansions except for the right-hand sides of ==, !=, and
=~, where the quoting has a special meaning.  In the first place, the
syntax [[ .. ]] is introduced to resolve the issue of the quoting, so
it is natural to use the unquoted form inside [[ ... ]] by default.
In this patch, we use the unquoted form of expansions.

* style(bash): prefer [[ $a && ! $b ]] to [[ -n $a && -z $b ]]

* style(bash): put "then" in the same line as "if"

This is also the format that Bash outputs with `bash --pretty-print
FILE` or `declare -f FUNC`.
2024-01-09 20:42:27 +00:00
Azzam S.A
3a0e070e74
docs: fix Destination file already exists in Nushell (#1530)
It is a common practice to use `-f` in Nushell configurations to avoid
`Destination file already exists` error.
2024-01-09 16:37:57 +00:00
Ellie Huxtable
af51485767
docs: remove activity graph 2024-01-09 11:53:51 +00:00
Ellie Huxtable
2b94f05735
fix: disable musl deb building (#1525)
It never worked, and broke release building. I don't think we need musl
debs, but if so ensure they don't break install scripts

Resolve #1500
2024-01-09 11:49:00 +00:00
Koichi Murase
cc5efd2971
fix(shell): fix incorrect timing of child shells (#1510)
When a child shell session is started from another shell session
(parent session), the environment variable ATUIN_HISTORY_ID set by the
parent session causes Atuin's precmd hook of the child session to be
unexpectedly performed before the first call of Atuin's preexec hook.

In this patch, we clear ATUIN_HISTORY_ID (possibly set by the parent
session) on the startup of the session.
2024-01-08 20:22:42 +00:00
Ellie Huxtable
7e48768ddf
feat: make it clear what you are registering for (#1523)
Resolve #1516
2024-01-08 17:47:41 +00:00
Ellie Huxtable
41e8d135a8
chore: schema cleanup (#1522)
The columns referred to in this PR, were for some reason created with
defaults. When created years ago, they were `bigserial` not `bigint`.

The defaults were never actually used, as verified by

1. Checking the value of the sequences on the database
2. Checking the code

So we're safe to clean them up.
2024-01-08 13:43:33 +00:00
Matthew Berryman
21e934a23d
docs: refer to image with multi-arch support (#1513) 2024-01-08 09:43:15 +00:00
dependabot[bot]
d426397ca0
chore(deps): bump hyper from 0.14.28 to 1.1.0 (#1520)
Bumps [hyper](https://github.com/hyperium/hyper) from 0.14.28 to 1.1.0.
- [Release notes](https://github.com/hyperium/hyper/releases)
- [Changelog](https://github.com/hyperium/hyper/blob/master/CHANGELOG.md)
- [Commits](https://github.com/hyperium/hyper/compare/v0.14.28...v1.1.0)

---
updated-dependencies:
- dependency-name: hyper
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-08 09:42:27 +00:00
dependabot[bot]
b881268243
chore(deps): bump ratatui from 0.24.0 to 0.25.0 (#1521)
Bumps [ratatui](https://github.com/ratatui-org/ratatui) from 0.24.0 to 0.25.0.
- [Release notes](https://github.com/ratatui-org/ratatui/releases)
- [Changelog](https://github.com/ratatui-org/ratatui/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ratatui-org/ratatui/compare/v0.24.0...v0.25.0)

---
updated-dependencies:
- dependency-name: ratatui
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-08 09:42:06 +00:00
依云
5bd0eed6c5
feat(ui): add redraw (#1519)
replace old Ctrl-L shortcut and remove the opposite one (Ctrl-H).

fixes #1507.
2024-01-08 09:40:23 +00:00
Matthew Berryman
915bff6d28
feat: include atuin login in secret patterns (#1518)
* include atuin login in secret patterns

* doc catchup
2024-01-08 09:37:42 +00:00
Koichi Murase
7dca752dc3
fix(bash): fix and improve the keybinding to up (#1515)
* fix(bash): improve up key in multiline mode of ble.sh

ble.sh has a multiline mode where pressing [up] can be used to move to
the previous line.  The command history is loaded only when the [up]
key is pressed when the cursor is in the first line.  However, with
Atuin's integration, the [up] key always causes Atuin's history search
and cannot be used to move to the previous line when the cursor is not
in the first line.  There is also another situation that the [up] key
does not load the command history.

In this patch, with ble.sh, we perform Atuin's history search only in
the situation where the command history is loaded in the original
binding of ble.sh.

* fix(init): perform bind on explicitly specified keymaps

With the current implementation, the keybindings to [C-r] and [up] are
only set up in the currently activated keymaps in Bash.  As a result,
if the user changes the keymap after `eval "$(atuin init bash)"`,
Atuin's keybindings do not take effect.  In this patch, we bind
Atuin's keybindings in all the keymaps (emacs, vi-insert, and
vi-command) by explicitly specifying them (as done for the Zsh
integration).  The keybinding to "k" in the vi-command keymap is also
added to make it consistent with the Zsh integration.

* fix(init): work around limitation of "bind -x" in bash <= 4.2

In bash <= 4.2, "bind -x" with a key sequence with more than two bytes
does not work properly.  Inputting the key sequence will produce an
error message saying "bash: bash_execute_unix_command: cannot find
keymap for command", and the shell command is not executed.

To work around this, we can first translate the key sequences to
another key sequence with two bytes and run the shell command through
the two-byte key sequence.  In this patch, we use \C-x\C-p as the
two-byte key sequence.

* refactor(bash): move the inlined binding scripts to atuin.bash

* refactor(init): use `is_ok()` instead of negating `is_err()`

Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>

---------

Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
2024-01-07 22:19:46 +00:00
Koichi Murase
31c6ec0be5
fix(bash): work around custom IFS (#1514)
When the user sets a custom value of IFS, the up keybinding may fail
because the option `--shell-up-key-binding` passed to
`__atuin_history` is broken by the word splitting of the shell.  For
example, when the user sets IFS=-, `atuin` called from __atuin_history
receives `shell up key binding <content>` as the search string.

$ IFS=-
$ echo [up] # <-- this does not work as expected

Note that the problem only happens with the plain Bash without ble.sh.
The problem does not arise within ble.sh because ble.sh separates the
user environment and the line-editor environment by saving/restoring
the shell settings.  The keybindings are processed in the line-editor
environment, so the custom IFS set by the user does not affect it.

In this patch, we properly quote the arguments to the atuin command.
2024-01-07 16:38:51 +00:00
Ellie Huxtable
4e56f5a41e
refactor: String -> HistoryId (#1512) 2024-01-06 17:19:31 +00:00
Koichi Murase
179c6d20ef
fix(bash): prevent input to be interpreted as options for blesh auto-complete (#1511)
Apply the change for zsh-autosuggestions in
https://github.com/atuinsh/atuin/pull/1506 to the code for blesh
auto-complete.
2024-01-06 16:48:10 +00:00
Koichi Murase
86f2c8e588
fix(bash): avoid unexpected atuin history start for keybindings (#1509)
This fixes the second issue of "0s or wrong command duration" reported
at https://github.com/atuinsh/atuin/issues/1003.

The problem is that, with bash-preexec, the preexec hook may be called
even for the commands executed by the keybindings.

* In particular, the preexec is called before the command
  `__atuin_history` is executed on pressing [C-r] and [up].  In this
  case, $1 passed to `__atuin_preexec` contains the last entry in the
  command history, so `atuin history start` is called for the last
  command.  As a result, pressing [C-r] and [up] clears the duration
  of the last command.  This causes the reported 0s duration.

* Furthermore, the precmd hook corresponding to the keybinding command
  will not be called, so the duration is only filled when the next
  user command starts.  This replaces the duration of the last command
  with the time interval between the last press of [C-r] or [up] and
  the start time of the next command.  This causes the reported wrong
  duration.

There is no general and robust way to distinguish the preexec
invocation for keybindings from that for the user commands, but in
this patch we exclude the preexec invocation for Atuin's keybindings
[C-r] and [up] at least.
2024-01-06 16:45:19 +00:00
Ellie Huxtable
7bc6ccdd70
feat: rework record sync for improved reliability (#1478)
* feat: rework record sync for improved reliability

So, to tell a story

1. We introduced the record sync, intended to be the new algorithm to
   sync history.
2. On top of this, I added the KV store. This was intended as a simple
   test of the record sync, and to see if people wanted that sort of
   functionality
3. History remained syncing via the old means, as while it had issues it
   worked more-or-less OK. And we are aware of its flaws
4. If KV syncing worked ok, history would be moved across

KV syncing ran ok for 6mo or so, so I started to move across history.
For several weeks, I ran a local fork of Atuin + the server that synced
via records instead.

The record store maintained ordering via a linked list, which was a
mistake. It performed well in testing, but was really difficult to debug
and reason about. So when a few small sync issues occured, they took an
extremely long time to debug.

This PR is huge, which I regret. It involves replacing the "parent"
relationship that records once had (pointing to the previous record)
with a simple index (generally referred to as idx). This also means we
had to change the recordindex, which referenced "tails". Tails were the
last item in the chain.

Now that we use an "array" vs linked list, that logic was also replaced.
And is much simpler :D

Same for the queries that act on this data.

----

This isn't final - we still need to add

1. Proper server/client error handling, which has been lacking for a
   while
2. The actual history implementation on top
    This exists in a branch, just without deletions. Won't be much to
    add that, I just don't want to make this any larger than it already
    is

The _only_ caveat here is that we basically lose data synced via the old
record store. This is the KV data from before.

It hasn't been deleted or anything, just no longer hooked up. So it's
totally possible to write a migration script. I just need to do that.

* update .gitignore

* use correct endpoint

* fix for stores with length of 1

* use create/delete enum for history store

* lint, remove unneeded host_id

* remove prints

* add command to import old history

* add enable/disable switch for record sync

* add record sync to auto sync

* satisfy the almighty clippy

* remove file that I did not mean to commit

* feedback
2024-01-05 17:57:49 +00:00
Mattias Eriksson
604ae40b9d
fix: Prevent input to be interpreted as options for zsh autosuggestions (#1506)
Co-authored-by: Mattias Eriksson <snaggen@mayam.com>
2024-01-05 17:17:46 +00:00
Ellie Huxtable
e129f7a93e
feat: enable enhanced keyboard mode (#1505)
This enabled the Kitty Keyboard Protocol

Read more here: https://sw.kovidgoyal.net/kitty/keyboard-protocol/

No change on unsupported terminals, but means in the future we can be
more creative with keybinding depending on terminal.

Tested on Alacritty and events come through with all modifiers
supported.

Will be useful for #193
2024-01-05 13:15:28 +00:00
依云
951aafa414
refactor: use enum instead of magic numbers (#1499) 2024-01-04 14:29:46 +00:00
Ellie Huxtable
4233b6e6b7
docs: add forum link to contributing (#1498) 2024-01-03 21:44:22 +00:00
Marcin Puc
d303d68010
docs(readme): add repology badge (#1494) 2024-01-03 16:41:25 +00:00
Ellie Huxtable
37c4b7adff
chore: remove the teapot response (#1496)
It was fun, but it wasn't as informative as it needs to be

I'm leaving the function name though :)
2024-01-03 16:37:27 +00:00
Ellie Huxtable
9f79a34a9d
chore(release): prepare for release v17.2.1 (#1495) 2024-01-03 15:51:47 +00:00
Ellie Huxtable
198b4e2ceb
fix(server): typo with default config (#1493)
Without TLS config, the server fails to load defaults. Until this is
released, add this to your server config

```
[tls]
enable = false
cert_path = ""
pkey_path = ""
```
2024-01-03 13:30:17 +00:00
Ellie Huxtable
999a98c577
chore(release): prepare for release v17.2.0 (#1492) 2024-01-03 12:46:08 +00:00
依云
c37147d619
fix(import/zsh): zsh use a special format to escape some characters (#1490)
* fix(import/zsh): zsh use a special format to escape some characters

unescape those correctly rather than throw them away.

zsh side code:
9f57ca4ac8/Src/utils.c (L4889-L4900)

* fix code style
2024-01-03 08:46:59 +00:00
Koichi Murase
434e8238d8
feat(bash): provide auto-complete source for ble.sh (#1487)
* feat(bash): provide auto-complete source for ble.sh

* docs(integration): mention the auto-complete source for ble.sh
2024-01-02 12:35:24 +00:00
Koichi Murase
16309ca198
fix(bash): fix error by the use of ${PS1@P} in bash < 4.4 (#1488)
The parameter expansions for the prompt strings, `${PS1@P}`, is only
available in bash >= 4.4.  In Bash 4.3 or below w/ bash-preexec, the
current implementation produces error messages.  There is no way to
evaluate PS1 with bash < 4.4, so we give up the adjustments for
multiline prompts in bash < 4.4 in this patch.
2024-01-02 12:19:16 +00:00
DS/Charlie
f44db9d7f9
fix(zsh): zsh_autosuggest_strategy for no-unset environment (#1486)
* fix for zsh no-unset environments

* fix zsh_autosuggest_strategy for no-unset environment
2024-01-02 11:53:18 +00:00
Koichi Murase
34baad290c
feat(shell): support high-resolution duration if available (#1484)
* feat(bash): measure duration in microsecond resolution with ble.sh

* feat(zsh): measure duration in nanosecond resolution with zsh/datetime

* refactor(history): use Option<i64> for command-line arg duration

Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>

* style(history): apply suggestion by `cargo fmt`

* fix(history): use Option<u64> for arg duration

---------

Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
2024-01-02 11:40:38 +00:00
Koichi Murase
7f443588cf
fix(bash,zsh): fix quirks on search cancel (#1483)
* fix(bash): preserve the line content on search cancel

In the current implementation for Bash, the line content is lost when
the user cancels the atuin search by pressing ESC, C-g, or Down at the
bottom line.  This is because the line content is set to the empty
string returned by atuin on the cancellation of the search.

In the integrations for other shells, zsh and fish, the empty output
is properly handled so that the line content is preserved.  This patch
makes the behavior in Bash consistent with that in zsh and fish, i.e.,
we do nothing when the atuin search returns an empty output.

* fix(zsh): ignore confusing line `__atuin_accept__:*` on search cancel
2024-01-02 08:40:40 +00:00
Koichi Murase
d9dab6c92d
refactor(bash): refactor and optimize __atuin_accept_line (#1482)
* fix(bash): prefix "__atuin_" to avoid variable conflicts

Because the function "__atuin_history" executes an arbitary user
command for "enter_accept", the local variable names should be
carefully chosen.  A local variable can shadow a global variable that
the user wants to use when there is a name conflict.  To avoid such a
situation we try to namespace the variables used by atuin by prefixing
"__atuin_".

* fix(bash): work around "shopt -s xpg_echo"

* refactor(bash): simplify the rendering of the prompt

* perf(bash): avoid extra evaluation of PS1

* refactor(bash): count \n by wc

We can simply use "wc -l" to count the number of newline characters.
In the POSIX standard, a line in a text stream is defined as
characters terminated by a newline character, so the unterminated line
is not counted by "wc -l".  As a result, "wc -l" actually counts the
number of newline characters.

* refactor(bash): rename localvar `HISTORY => __atuin_command`

This patch renames the local variable `HISTORY` in __atuin_accept_line
to `__atuin_command`.  The name of the global variable `HISTORY` set
by `__atuin_history` is kept.
2024-01-02 08:29:16 +00:00
Ellie Huxtable
5bef19ba4c
docs: update logo (#1481) 2024-01-01 20:11:27 +00:00
Ellie Huxtable
7053823e7f
docs: remove stray character from README 2024-01-01 20:07:12 +00:00
Ellie Huxtable
84bc6e0744
docs: add docs for zsh-autosuggestion integration (#1480)
I've added an integrations page to the docs. We can maintain a list of
such integrations
2024-01-01 20:06:38 +00:00
Ellie Huxtable
356324b341
feat: integrate with zsh-autosuggestions (#1479)
* feat: integrate with zsh-autosuggestions

* Update atuin/src/shell/atuin.zsh

Co-authored-by: Patrick Jackson <patrick@jackson.dev>

* Update atuin/src/shell/atuin.zsh

Co-authored-by: Patrick Jackson <patrick@jackson.dev>

* feedback

---------

Co-authored-by: Patrick Jackson <patrick@jackson.dev>
2024-01-01 19:47:34 +00:00
Conrad Ludgate
e2a4e9cf13
fix(stats): time now_local not working 2024-01-01 16:42:36 +00:00
Koichi Murase
c7db7838e3
refactor(bash): factorize __atuin_accept_line (#1476) 2024-01-01 15:20:16 +00:00
Koichi Murase
1350d3fd74
fix(bash): fix small issues of enter_accept for the plain Bash (#1467)
* fix(bash): history should be updated before preexec

* fix(bash): properly execute "--"

With the current implementation, the user command "--" would not be
executed even if it were the intended one.  This is because it would
be confused as an option by the "eval" builtin.  We can specify "--"
to tell "eval" that the later arguments should be literally treated as
the command.

* fix(bash): correctly restore $? and $_

* fix(bash): fix the use of preexec_ret_value

The exit status of preexec_ret_value is used to suppress the execution
of the corresponding command in the extdebug mode.  The current
implementation somehow tries to set $? before the call of stty, which
does not have any effect.  Instead, we can manually turn off the
execution of the user command when the condition matches.

* feat(bash): support array PROMPT_COMMAND of Bash >= 5.1
2024-01-01 14:26:02 +00:00
Ellie Huxtable
7fe152a8a7
fix(install): discord broken link 2023-12-31 19:15:44 +00:00
Ellie Huxtable
9d4fdf71d0
fix(docs): discord link expired 2023-12-31 19:14:24 +00:00
Koichi Murase
a4122f062a
fix(bash): improve the support for enter_accept with ble.sh (#1465)
* feat(bash): check version of ble.sh

blehooks are only supported in ble.sh >= 0.4, so we require the ble.sh
version to be larger or equal to 0.4.  We also describe the version
requirement in README.md.

* fix(bash): use ble.sh's contrib/integration/bash-preexec

ble.sh provides module "contrib/integration/bash-preexec", which can
be used with the same interface as bash-preexec.  This module provides
"preexec_functions" and "precmd_functions" without requiring
bash-preexec.

This module also properly handles it when both ble.sh and bash-preexec
are loaded; the module resolves the conflicts between ble.sh and
bash-preexec, and the module also tries to support bash-preexec in the
detached state of ble.sh.

* fix(bash): use ble.sh's accept-line widget for enter_accept

In ble.sh, one can directly call the widget "accept-line" from a shell
script.  The widget "accept-line" is the actual widget that reserves
the command execution in ble.sh, so calling "accept-line" is
equivalent to the normal execution.  It includes all the necessary
adjustments and processing including stty and history.

In addition, the command will be executed at the top-level context
instead in a function scope.  For example, without ble.sh, running
"declare -A dict=()" through enter_accept will create an associative
array in the function scope unexpectedly.  With ble.sh, since the
command is executed at the top-level context, such a problem does not
happen.

When ble.sh is in a detached state, we fall back to the manual
execution of the command.  In this case, we cannot assume the
existence of the shell function "__bp_set_ret_value", so we always use
__atuin_set_ret_value.
2023-12-28 20:08:45 +00:00
Ellie Huxtable
5401ff12b7
fix(clippy): ignore struct_field_names (#1466)
In these cases, I think that's a _little_ too pedantic.
2023-12-28 20:02:11 +00:00
Koichi Murase
be1f6fd5ca
fix(bash): fix loss of the last output line with enter_accept (#1463)
With a single-line prompt, the last line of the output of the previous
command is overwritten by the prompt on the enter_accept.  In this
situation, `tput cuu` receives 0 as the argument, but `tput cuu 0`
emits the control sequence `\e[0A`, which moves the cursor above by
one line unexpectedly.  This is because the parameter 0 for CUU means
the default value, 1.  In this patch, to avoid moving the cursor when
the prompt offset is 0, we check the offset value before running `tput
cuu`.
2023-12-28 19:34:34 +00:00