go-ethereum icon indicating copy to clipboard operation
go-ethereum copied to clipboard

zsh completion not working

Open Xeonacid opened this issue 11 months ago • 5 comments

System information

Geth version: 1.13.13-stable OS & Version: Linux Ubuntu 22.04

Expected behaviour

Type geth then press Tab, a command completion is listed.

Actual behaviour

Files in cwd is listed, acting same as without a completion.

But if run source /usr/share/zsh/vendor-completions/_geth manually, it works fine like a charm.

Steps to reproduce the behaviour

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt install geth

In zsh, type geth then press Tab, files in cwd is listed.

Other command completions in /usr/share/zsh/vendor-completions work fine.

Run source /usr/share/zsh/vendor-completions/_geth and try again, completion works fine.

cc @willianpaixao

Xeonacid avatar Feb 25 '24 15:02 Xeonacid

Note: This only affects the ZSH completion, the BASH completion is sourced automatically as one would expect.

hashworks avatar Feb 25 '24 16:02 hashworks

Thanks for reporting, @Xeonacid. At the moment of writing I'm not in my computer but will test it later. That said, it looks like Zsh is not automatically sourcing that file, just stating the obvious. Which makes me think it's a Zsh issue and not Geth.

willianpaixao avatar Feb 26 '24 12:02 willianpaixao

That said, it looks like Zsh is not automatically sourcing that file, just stating the obvious. Which makes me think it's a Zsh issue and not Geth.

But any other file in the same folder (/usr/share/zsh/vendor-completions) is automatically sourced and completion works fine. I'm not a zsh expert and have no idea about what's wrong. :(

Xeonacid avatar Feb 26 '24 12:02 Xeonacid

Here's a solution, demonstrated via the docker example below. This modifies /usr/share/zsh/vendor-completions/_geth to be autoload compatible.

docker run -it --rm ubuntu:22.04 bash

apt update && apt install -y zsh software-properties-common

add-apt-repository -y ppa:ethereum/ethereum && apt install geth

cat << 'EOF' > /usr/share/zsh/vendor-completions/_geth
#compdef _geth geth

_geth() {
  local -a opts
  local cur
  cur=${words[-1]}
  if [[ "$cur" == "-"* ]]; then
    opts=("${(@f)$(${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}")
  else
    opts=("${(@f)$(${words[@]:0:#words[@]-1} --generate-bash-completion)}")
  fi

  if [[ "${opts[1]}" != "" ]]; then
    _describe 'values' opts
  else
    _files
  fi
}
EOF

zsh

geth acc  # tab --> turns into "geth account"

michaelbnewman avatar Aug 18 '24 03:08 michaelbnewman