* Foreign Commands Not Appearing in 'history' Array When 'sharehistory' Option is Enabled Until a Command is Entered
@ 2024-10-28 15:06 Langbart
2024-10-28 16:42 ` Bart Schaefer
0 siblings, 1 reply; 5+ messages in thread
From: Langbart @ 2024-10-28 15:06 UTC (permalink / raw)
To: zsh-users
[-- Attachment #1: Type: text/plain, Size: 1659 bytes --]
Guten Tag,
is it a bug that when the 'sharehistory' option is enabled, commands from other shells ('foreign') aren't included in the 'history' array until the user enters a command?
Consider the following widget and settings in my '.zshrc':
```sh
test-history() {
BUFFER=""
print
print -- "=== HISTORY TEST ==="
print -- "history array:"
zmodload -F zsh/parameter p:history || return 1
printf "%s\t%s\n" "${(kv)history[@]}" | head -5
print -- "--------------------"
print -- "fc command:"
print -r -- "$(fc -rl -5)"
zle accept-line
}
zle -N test-history
bindkey '^R' test-history
setopt SHARE_HISTORY
```
I open two terminals, type 'echo Test 1' in Terminal 1, switch to Terminal 2, and press 'Enter' without entering a command. Pressing 'Ctrl-R' shows that the 'history' array doesn't include the 'echo Test 1' entry.
```txt
=== HISTORY TEST ===
history array:
--------------------
fc command:
1* echo Test 1
```
After entering 'echo Test 2' in Terminal 2 and pressing 'Ctrl-R' again in Terminal 2, the output is:
```txt
=== HISTORY TEST ===
history array:
2 echo Test 2
1 echo Test 1
--------------------
fc command:
2 echo Test 2
1* echo Test 1
```
Prepending 'fc -RI' before accessing the 'history' array seems to resolve the issue. Is this the recommended workaround to ensure that the 'history' array lists its resuls like 'fc -rl ...' does ?
```sh
...
[[ "${options[sharehistory]}" == "on" ]] && fc -RI
zmodload -F zsh/parameter p:history || return 1
printf "%s\t%s\n" "${(kv)history[@]}" | head -5
...
```
Related:
- [https://github.com/junegunn/fzf/issues/4061](https://github.com/junegunn/fzf/issues/4061#issuecomment-2436756709)
[-- Attachment #2: Type: text/html, Size: 4986 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Foreign Commands Not Appearing in 'history' Array When 'sharehistory' Option is Enabled Until a Command is Entered
2024-10-28 15:06 Foreign Commands Not Appearing in 'history' Array When 'sharehistory' Option is Enabled Until a Command is Entered Langbart
@ 2024-10-28 16:42 ` Bart Schaefer
2024-10-28 17:35 ` Roman Perepelitsa
0 siblings, 1 reply; 5+ messages in thread
From: Bart Schaefer @ 2024-10-28 16:42 UTC (permalink / raw)
To: Langbart; +Cc: zsh-users
[-- Attachment #1: Type: text/plain, Size: 964 bytes --]
Short answers:
On Mon, Oct 28, 2024 at 8:06 AM Langbart <Langbart@protonmail.com> wrote:
>
> is it a bug that when the 'sharehistory' option is enabled, commands from
> other shells ('foreign') aren't included in the 'history' array until the
> user enters a command?
>
No.
> Prepending 'fc -RI' before accessing the 'history' array seems to resolve
> the issue. Is this the recommended workaround to ensure that the 'history'
> array lists its resuls like 'fc -rl ...' does ?
>
Yes.
Longer answer:
When you're at a prompt, two things are going on. First, a history
position (the "next" number) has already been allocated for expansion of
the %h prompt escape, and loading from the shared history would have to
somehow fit "above" that. Second, the line editor is blocked on the
terminal driver waiting for input, it's not burning CPU in the background
polling the history file, etc., so you have to explicitly wake it up.
[-- Attachment #2: Type: text/html, Size: 1662 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Foreign Commands Not Appearing in 'history' Array When 'sharehistory' Option is Enabled Until a Command is Entered
2024-10-28 16:42 ` Bart Schaefer
@ 2024-10-28 17:35 ` Roman Perepelitsa
2024-10-28 18:14 ` Bart Schaefer
0 siblings, 1 reply; 5+ messages in thread
From: Roman Perepelitsa @ 2024-10-28 17:35 UTC (permalink / raw)
To: Bart Schaefer; +Cc: Langbart, zsh-users
On Mon, Oct 28, 2024 at 5:43 PM Bart Schaefer <schaefer@brasslantern.com> wrote:
>
> Short answers:
>
> On Mon, Oct 28, 2024 at 8:06 AM Langbart <Langbart@protonmail.com> wrote:
>>
>>
>> is it a bug that when the 'sharehistory' option is enabled, commands from other shells ('foreign') aren't included in the 'history' array until the user enters a command?
>
> No.
I believe the OP is saying that after you execute a command in one
terminal and press ENTER in another terminal, within that second
terminal all widgets that operate on history, such as
history-incremental-search-backward, will see the command, but the
`history` array won't contain it. You would need to execute a
non-empty command in the second terminal for `history` to get updated.
This sounds quite strange and unexpected to me. Is this really
intended? Why is an empty command enough to for all history related
widgets to pick up commands executed in another terminal, but for
`history` to update you need to execute a non-empty command?
Roman
P.S.
I haven't actually tried it but this is my understanding based on what
the OP wrote here and on github.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Foreign Commands Not Appearing in 'history' Array When 'sharehistory' Option is Enabled Until a Command is Entered
2024-10-28 17:35 ` Roman Perepelitsa
@ 2024-10-28 18:14 ` Bart Schaefer
2024-10-28 18:22 ` Roman Perepelitsa
0 siblings, 1 reply; 5+ messages in thread
From: Bart Schaefer @ 2024-10-28 18:14 UTC (permalink / raw)
To: zsh-users; +Cc: Langbart
On Mon, Oct 28, 2024 at 10:35 AM Roman Perepelitsa
<roman.perepelitsa@gmail.com> wrote:
>
> I believe the OP is saying that after you execute a command in one
> terminal and press ENTER in another terminal, within that second
> terminal all widgets that operate on history, such as
> history-incremental-search-backward, will see the command, but the
> `history` array won't contain it.
That would seem to be pretty nearly impossible, because $history is
populated by calling the same methods that the widgets use, it's not
pre-generated/cached.
However, I notice that the OP is doing this:
printf "%s\t%s\n" "${(kv)history[@]}" | head -5
The left hand side of that pipe is going to be forked off and might
not see the same history list as the parent shell. However, also note
from my "longer answer":
> First, a history position (the "next" number) has already been allocated for expansion of the %h prompt escape, and loading from the shared history would have to somehow fit "above" that.
The history number isn't incremented on an empty command, so this
situation remains. I just re-read the OP and I don't find the
"widgets that operate on history ... will see the command" part? What
have I missed?
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-10-28 18:23 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-10-28 15:06 Foreign Commands Not Appearing in 'history' Array When 'sharehistory' Option is Enabled Until a Command is Entered Langbart
2024-10-28 16:42 ` Bart Schaefer
2024-10-28 17:35 ` Roman Perepelitsa
2024-10-28 18:14 ` Bart Schaefer
2024-10-28 18:22 ` Roman Perepelitsa
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).