romkatv / powerlevel10k

A Zsh theme
MIT License
45.92k stars 2.17k forks source link

Lean style zsh-autocomplete history bug #2487

Closed chris3ware closed 10 months ago

chris3ware commented 10 months ago

I'm experiencing a strange issue with zsh-autocomplete history when using the Lean style. I'm raising this issue here, because I don't have the problem when I use the Pure style.

In Lean Style, when using the cursors to scroll up and down the history certain commands seem to clear the history. The commands I am able to reproduce this with consistently are aws and terraform. There may be others, but I use these everyday.

This occurs on different versions of macOS (11.7.10 and 13.6.2), different versions of VSCode (1.75.1 and 1.74.3) and different versions of zsh (5.8 and 5.9).

I've replicated the problem in an isolated environment with the configuration below and a .p10k.zsh configuration file, generated with the configuration wizard, in each environment.

❯ cd $(mktemp -d)
❯ ZDOTDIR=$PWD HOME=$PWD zsh -f
% source /Users/chris/.znap-plugins/marlonrichert/zsh-autocomplete/zsh-autocomplete.plugin.zsh
% source /Users/chris/.znap-plugins/romkatv/powerlevel10K/powerlevel10k.zsh-theme 

.zshrc

# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi

# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

p10k lean style configuration file

P10K pure style configuration file ```zsh # Generated by Powerlevel10k configuration wizard on 2023-11-17 at 10:01 GMT. # Based on romkatv/powerlevel10k/config/p10k-pure.zsh, checksum 35142. # Wizard options: nerdfont-complete + powerline, small icons, pure, original, rprompt, # 2 lines, sparse, transient_prompt, instant_prompt=verbose. # Type `p10k configure` to generate another config. # # Config file for Powerlevel10k with the style of Pure (https://github.com/sindresorhus/pure). # # Differences from Pure: # # - Git: # - `@c4d3ec2c` instead of something like `v1.4.0~11` when in detached HEAD state. # - No automatic `git fetch` (the same as in Pure with `PURE_GIT_PULL=0`). # # Apart from the differences listed above, the replication of Pure prompt is exact. This includes # even the questionable parts. For example, just like in Pure, there is no indication of Git status # being stale; prompt symbol is the same in command, visual and overwrite vi modes; when prompt # doesn't fit on one line, it wraps around with no attempt to shorten it. # # If you like the general style of Pure but not particularly attached to all its quirks, type # `p10k configure` and pick "Lean" style. This will give you slick minimalist prompt while taking # advantage of Powerlevel10k features that aren't present in Pure. # Temporarily change options. 'builtin' 'local' '-a' 'p10k_config_opts' [[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases') [[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob') [[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand') 'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand' () { emulate -L zsh -o extended_glob # Unset all configuration options. unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR' # Zsh >= 5.1 is required. [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return # Prompt colors. local grey='242' local red='1' local yellow='3' local blue='4' local magenta='5' local cyan='6' local white='7' # Left prompt segments. typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( # =========================[ Line #1 ]========================= # context # user@host dir # current directory vcs # git status # command_execution_time # previous command duration # =========================[ Line #2 ]========================= newline # \n # virtualenv # python virtual environment prompt_char # prompt symbol ) # Right prompt segments. typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( # =========================[ Line #1 ]========================= command_execution_time # previous command duration virtualenv # python virtual environment context # user@host # time # current time # =========================[ Line #2 ]========================= newline # \n ) # Basic style options that define the overall prompt look. typeset -g POWERLEVEL9K_BACKGROUND= # transparent background typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= # no surrounding whitespace typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' # separate segments with a space typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= # no end-of-line symbol typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION= # no segment icons # Add an empty line before each prompt except the first. This doesn't emulate the bug # in Pure that makes prompt drift down whenever you use the Alt-C binding from fzf or similar. typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true # Magenta prompt symbol if the last command succeeded. typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=$magenta # Red prompt symbol if the last command failed. typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=$red # Default prompt symbol. typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯' # Prompt symbol in command vi mode. typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='❮' # Prompt symbol in visual vi mode is the same as in command mode. typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='❮' # Prompt symbol in overwrite vi mode is the same as in command mode. typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=false # Grey Python Virtual Environment. typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=$grey # Don't show Python version. typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER= # Blue current directory. typeset -g POWERLEVEL9K_DIR_FOREGROUND=$blue # Context format when root: user@host. The first part white, the rest grey. typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE="%F{$white}%n%f%F{$grey}@%m%f" # Context format when not root: user@host. The whole thing grey. typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE="%F{$grey}%n@%m%f" # Don't show context unless root or in SSH. typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION= # Show previous command duration only if it's >= 5s. typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=5 # Don't show fractional seconds. Thus, 7s rather than 7.3s. typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 # Duration format: 1d 2h 3m 4s. typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' # Yellow previous command duration. typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=$yellow # Grey Git prompt. This makes stale prompts indistinguishable from up-to-date ones. typeset -g POWERLEVEL9K_VCS_FOREGROUND=$grey # Disable async loading indicator to make directories that aren't Git repositories # indistinguishable from large Git repositories without known state. typeset -g POWERLEVEL9K_VCS_LOADING_TEXT= # Don't wait for Git status even for a millisecond, so that prompt always updates # asynchronously when Git state changes. typeset -g POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS=0 # Cyan ahead/behind arrows. typeset -g POWERLEVEL9K_VCS_{INCOMING,OUTGOING}_CHANGESFORMAT_FOREGROUND=$cyan # Don't show remote branch, current tag or stashes. typeset -g POWERLEVEL9K_VCS_GIT_HOOKS=(vcs-detect-changes git-untracked git-aheadbehind) # Don't show the branch icon. typeset -g POWERLEVEL9K_VCS_BRANCH_ICON= # When in detached HEAD state, show @commit where branch normally goes. typeset -g POWERLEVEL9K_VCS_COMMIT_ICON='@' # Don't show staged, unstaged, untracked indicators. typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED}_ICON= # Show '*' when there are staged, unstaged or untracked files. typeset -g POWERLEVEL9K_VCS_DIRTY_ICON='*' # Show '⇣' if local branch is behind remote. typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON=':⇣' # Show '⇡' if local branch is ahead of remote. typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON=':⇡' # Don't show the number of commits next to the ahead/behind arrows. typeset -g POWERLEVEL9K_VCS_{COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=1 # Remove space between '⇣' and '⇡' and all trailing spaces. typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${${${P9K_CONTENT/⇣* :⇡/⇣⇡}// }//:/ }' # Grey current time. typeset -g POWERLEVEL9K_TIME_FOREGROUND=$grey # Format for the current time: 09:51:02. See `man 3 strftime`. typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}' # If set to true, time will update when you hit enter. This way prompts for the past # commands will contain the start times of their commands rather than the end times of # their preceding commands. typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false # Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt # when accepting a command line. Supported values: # # - off: Don't change prompt when accepting a command line. # - always: Trim down prompt when accepting a command line. # - same-dir: Trim down prompt when accepting a command line unless this is the first command # typed after changing current working directory. typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always # Instant prompt mode. # # - off: Disable instant prompt. Choose this if you've tried instant prompt and found # it incompatible with your zsh configuration files. # - quiet: Enable instant prompt and don't print warnings when detecting console output # during zsh initialization. Choose this if you've read and understood # https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt. # - verbose: Enable instant prompt and print a warning when detecting console output during # zsh initialization. Choose this if you've never tried instant prompt, haven't # seen the warning, or if you are unsure what this all means. typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose # Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized. # For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload # can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you # really need it. typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true # If p10k is already loaded, reload configuration. # This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true. (( ! $+functions[p10k] )) || p10k reload } # Tell `p10k configure` which file it should overwrite. typeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a} (( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]} 'builtin' 'unset' 'p10k_config_opts' ```

The video below illustrates this behaviour with lean style. Note how the history commands above the terraform and aws commands disappear as the terraform and aws commands are selected:

leanstyle

For context the video below illustrates the behaviour in pure style:

purestyle

romkatv commented 10 months ago

It's this feature: https://github.com/romkatv/powerlevel10k#show-on-command

Apparently, zsh-autocomplete bugs out when this feature is in use. This is likely caused by the same bug in zsh that causes completion menu to disappear on reset-prompt: https://www.zsh.org/mla/workers/2019/msg00161.html.

As a workaround you can remove all parameters in ~/.p10k.zsh that have SHOW_ON_COMMAND in their name.

chris3ware commented 10 months ago

Thanks for the quick response. I've disabled SHOW_ON_COMMAND in the config file and all is well.