zsh-users / zsh-syntax-highlighting

Fish shell like syntax highlighting for Zsh.
github.com/zsh-users/zsh-syntax-highlighting
BSD 3-Clause "New" or "Revised" License
20.19k stars 1.33k forks source link

_zsh_highlight_main_highlighter_highlight_list:231: array parameter in_alias created globally in function _zsh_highlight_main_highlighter_highlight_list #834

Closed xiaoxinbioinfo closed 3 years ago

xiaoxinbioinfo commented 3 years ago

Windows Subsystem for Linux, Ubuntu 18.04.5 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64)

When I run

for name in `ls`; do head -n 1 ${name}; done | cut -d"." -f 2 | grep -v ">" |less -SN

It shows

_zsh_highlight_main_highlighter_highlight_list:231: array parameter in_alias created globally in function _zsh_highlight_main_highlighter_highlight_list

Every time I typed a letter, the error message appeared. But when the command is short, such as in the for loop + less, the error message appears less often, only once or twice.

for name in `ls`; do head -n 1 ${name}; done | less -SN

Can anyone tell me how to solve this problem?

danielshahaf commented 3 years ago

I can't reproduce the problem in latest zsh, latest zsh-syntax-highlighting, using your command in zsh -f -o WARN_CREATE_GLOBAL.

In code inspection I see no codepath that uses $in_alias without declaring it first.

Please post the output of typeset -p ZSH_VERSION ZSH_PATCHLEVEL ZSH_HIGHLIGHT_REVISION ZSH_HIGHLIGHT_VERSION. (Do not upload a screenshot; copy-paste it as text, so we can copy-paste the values on our side.)

Please confirm whether you can reproduce the bug in zsh -f -o WARN_CREATE_GLOBAL after manually running source /path/to/zsh-syntax-highlighting.zsh therein.

danielshahaf commented 3 years ago

Aside: for name in `ls`; do head -n 1 ${name}; is better written as for name in *; do head -n 1 -- "${name}";. Without this, command substitution output undergoes word splitting.

xiaoxinbioinfo commented 3 years ago

I can't reproduce the problem in latest zsh, latest zsh-syntax-highlighting, using your command in zsh -f -o WARN_CREATE_GLOBAL.

In code inspection I see no codepath that uses $in_alias without declaring it first.

Please post the output of typeset -p ZSH_VERSION ZSH_PATCHLEVEL ZSH_HIGHLIGHT_REVISION ZSH_HIGHLIGHT_VERSION. (Do not upload a screenshot; copy-paste it as text, so we can copy-paste the values on our side.)

Please confirm whether you can reproduce the bug in zsh -f -o WARN_CREATE_GLOBAL after manually running source /path/to/zsh-syntax-highlighting.zsh therein.

Thanks for the quick reply!

When I type typeset, the resulting content is as follows:

typeset ZSH_VERSION=5.4.2
typeset ZSH_PATCHLEVEL=ubuntu/5.4.2-3ubuntu3.1
typeset ZSH_HIGHLIGHT_REVISION=HEAD
typeset ZSH_HIGHLIGHT_VERSION=0.8.0-alpha2-dev

I have found more detailed information now: Still the command above for name in `ls`; do head -n 1 ${name}; done | l, after the for loop, as long as I type l (less alias in zsh?), the error message will be displayed once every time I type a letter afterwards.

*But when I type the command you mentioned `for name in ; do head -n 1 ${name}; done | l`, if I keep typing l, the error message above will not appear**. So, this problem may be related to what is described above. I hope this information can help you locate the problem faster.

By the way, what is the difference between the for name in *; do head -n 1 ${name}; done | l command you mentioned above and the command for name in `ls`; do head -n 1 ${name}; done | l? I don't understand what you are saying.

Thank you very much!

danielshahaf commented 3 years ago

What's the output of the command alias?

What's the output of git diff 6e0e950154a4c6983d9e077ed052298ad9126144 in your zsh-syntax-highlighting directory?

Can you try zsh 5.8?

danielshahaf commented 3 years ago

By the way, what is the difference between the for name in *; do head -n 1 ${name}; done | l command you mentioned above and the command for name in `ls`; do head -n 1 ${name}; done | l? I don't understand what you are saying.

In a nutshell, the former is correct when filenames contain whitespace and the latter is not. See the zsh documentation for details (and the zsh support channels if you still have questions about this; it's beyond the scope of this project, I'm afraid).

xiaoxinbioinfo commented 3 years ago

The output of alias is as follows:

-='cd -'
...=../..
....=../../..
.....=../../../..
......=../../../../..
1='cd -'
2='cd -2'
3='cd -3'
4='cd -4'
5='cd -5'
6='cd -6'
7='cd -7'
8='cd -8'
9='cd -9'
_='sudo '
afind='ack -il'
diff='diff --color'
egrep='egrep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}'
fgrep='fgrep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}'
g=git
ga='git add'
gaa='git add --all'
gam='git am'
gama='git am --abort'
gamc='git am --continue'
gams='git am --skip'
gamscp='git am --show-current-patch'
gap='git apply'
gapa='git add --patch'
gapt='git apply --3way'
gau='git add --update'
gav='git add --verbose'
gb='git branch'
gbD='git branch -D'
gba='git branch -a'
gbd='git branch -d'
gbda='git branch --no-color --merged | command grep -vE "^(\+|\*|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs -n 1 git branch -d'
gbl='git blame -b -w'
gbnm='git branch --no-merged'
gbr='git branch --remote'
gbs='git bisect'
gbsb='git bisect bad'
gbsg='git bisect good'
gbsr='git bisect reset'
gbss='git bisect start'
gc='git commit -v'
'gc!'='git commit -v --amend'
gca='git commit -v -a'
'gca!'='git commit -v -a --amend'
gcam='git commit -a -m'
'gcan!'='git commit -v -a --no-edit --amend'
'gcans!'='git commit -v -a -s --no-edit --amend'
gcas='git commit -a -s'
gcasm='git commit -a -s -m'
gcb='git checkout -b'
gcd='git checkout $(git_develop_branch)'
gcf='git config --list'
gcl='git clone --recurse-submodules'
gclean='git clean -id'
gcm='git checkout $(git_main_branch)'
gcmsg='git commit -m'
'gcn!'='git commit -v --no-edit --amend'
gco='git checkout'
gcor='git checkout --recurse-submodules'
gcount='git shortlog -sn'
gcp='git cherry-pick'
gcpa='git cherry-pick --abort'
gcpc='git cherry-pick --continue'
gcs='git commit -S'
gcsm='git commit -s -m'
gcss='git commit -S -s'
gcssm='git commit -S -s -m'
gd='git diff'
gdca='git diff --cached'
gdct='git describe --tags $(git rev-list --tags --max-count=1)'
gdcw='git diff --cached --word-diff'
gds='git diff --staged'
gdt='git diff-tree --no-commit-id --name-only -r'
gdw='git diff --word-diff'
gf='git fetch'
gfa='git fetch --all --prune --jobs=10'
gfg='git ls-files | grep'
gfo='git fetch origin'
gg='git gui citool'
gga='git gui citool --amend'
ggpull='git pull origin "$(git_current_branch)"'
ggpur=ggu
ggpush='git push origin "$(git_current_branch)"'
ggsup='git branch --set-upstream-to=origin/$(git_current_branch)'
ghh='git help'
gignore='git update-index --assume-unchanged'
gignored='git ls-files -v | grep "^[[:lower:]]"'
git-svn-dcommit-push='git svn dcommit && git push github $(git_main_branch):svntrunk'
gk='\gitk --all --branches'
gke='\gitk --all $(git log -g --pretty=%h)'
gl='git pull'
glg='git log --stat'
glgg='git log --graph'
glgga='git log --graph --decorate --all'
glgm='git log --graph --max-count=10'
glgp='git log --stat -p'
glo='git log --oneline --decorate'
globurl='noglob urlglobber '
glod='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'\'
glods='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'\'' --date=short'
glog='git log --oneline --decorate --graph'
gloga='git log --oneline --decorate --graph --all'
glol='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'
glola='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --all'
glols='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --stat'
glp=_git_log_prettily
glum='git pull upstream $(git_main_branch)'
gm='git merge'
gma='git merge --abort'
gmom='git merge origin/$(git_main_branch)'
gmt='git mergetool --no-prompt'
gmtvim='git mergetool --no-prompt --tool=vimdiff'
gmum='git merge upstream/$(git_main_branch)'
gp='git push'
gpd='git push --dry-run'
gpf='git push --force-with-lease'
'gpf!'='git push --force'
gpoat='git push origin --all && git push origin --tags'
gpr='git pull --rebase'
gpristine='git reset --hard && git clean -dffx'
gpsup='git push --set-upstream origin $(git_current_branch)'
gpu='git push upstream'
gpv='git push -v'
gr='git remote'
gra='git remote add'
grb='git rebase'
grba='git rebase --abort'
grbc='git rebase --continue'
grbd='git rebase $(git_develop_branch)'
grbi='git rebase -i'
grbm='git rebase $(git_main_branch)'
grbo='git rebase --onto'
grbs='git rebase --skip'
grep='grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}'
grev='git revert'
grh='git reset'
grhh='git reset --hard'
grm='git rm'
grmc='git rm --cached'
grmv='git remote rename'
groh='git reset origin/$(git_current_branch) --hard'
grrm='git remote remove'
grs='git restore'
grset='git remote set-url'
grss='git restore --source'
grst='git restore --staged'
grt='cd "$(git rev-parse --show-toplevel || echo .)"'
gru='git reset --'
grup='git remote update'
grv='git remote -v'
gsb='git status -sb'
gsd='git svn dcommit'
gsh='git show'
gsi='git submodule init'
gsps='git show --pretty=short --show-signature'
gsr='git svn rebase'
gss='git status -s'
gst='git status'
gsta='git stash push'
gstaa='git stash apply'
gstall='git stash --all'
gstc='git stash clear'
gstd='git stash drop'
gstl='git stash list'
gstp='git stash pop'
gsts='git stash show --text'
gstu='gsta --include-untracked'
gsu='git submodule update'
gsw='git switch'
gswc='git switch -c'
gtl='gtl(){ git tag --sort=-v:refname -n -l "${1}*" }; noglob gtl'
gts='git tag -s'
gtv='git tag | sort -V'
gunignore='git update-index --no-assume-unchanged'
gunwip='git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1'
gup='git pull --rebase'
gupa='git pull --rebase --autostash'
gupav='git pull --rebase --autostash -v'
gupv='git pull --rebase -v'
gwch='git whatchanged -p --abbrev-commit --pretty=medium'
gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]"'
history=omz_history
l='ls -lah'
la='ls -lAh'
ll='ls -lh'
ls='ls --color=tty'
lsa='ls -lah'
md='mkdir -p'
rd=rmdir
which-command=whence

The output of alias is the default output message of zsh. I didn't add anything else to it.

The output of the command git diff 6e0e950154a4c6983d9e077ed052298ad9126144 is nothing. Because I reinstalled zsh-syntax-highlighting after the error. But the error still exists.

xiaoxinbioinfo commented 3 years ago

I updated zsh to version 5.8 and the problem was solved!

Not sure exactly what the problem was, but it's good to have it back to normal. Thanks a lot!

danielshahaf commented 3 years ago

I updated zsh to version 5.8 and the problem was solved!

Thanks for letting us know. I don't see a relevant change in upstream's git logs in the relevant history range.

The output of alias is the default output message of zsh. I didn't add anything else to it.

No, it's not. The default output is the following:

$ zsh -f
% alias
run-help=man
which-command=whence

What gave you the impression that you were using zsh's default configuration?

xiaoxinbioinfo commented 3 years ago

What gave you the impression that you were using zsh's default configuration?

Because I remember that only zsh and oh-my-zsh have been configured in my configuration file. So other aliases may be added by oh-my-zsh.