Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Bash's sadly flawed smart (programmable) completion (utcc.utoronto.ca)
39 points by soraminazuki on April 11, 2024 | hide | past | favorite | 14 comments


I wonder what the author thinks of zsh. Unlike bash, zsh completion just works. It's context-aware, properly completes subcommands and options, and doesn't suffer from the problem explained in the article. It even shows descriptions for each of the completion candidates.

In contrast, bash almost always falls back to filename completion for the most common commands even when third party frameworks like bash-completion are installed. It's frustrating when I have to deal with interactive bash sessions because, sigh, Docker.


Yes. 15+ year zsh user here. When dealing with bash, try to sneak in PackageKit-command-not-found and bash-completion.

And when running a shell, do it like this:

    docker run user/image:tag -it --rm bash -li
Also, zshdb, bashdb, and shellcheck are good stuff™ too.

My mantra is all programs and widely-used company tools should have current man pages and shell completions. The whole "Go look at a web page" for "help" is slow, distracting, and lazy.


> PackageKit-command-not-found

This one is so pathetically slow on Fedora that I find it counterproductive. Also, at least as of a year or two ago (I haven’t checked since then), PackageKit maintained its own, large, cache, thus wasting a surprising amount of space in /var.


It depends. It's better than nothing that can be ^C'ed.

Here's a naive, partial implementation that runs in <500 ms so long as there's an existing dnf cache:

   command_not_found_handle() {
    local pkgs
    readarray pkgs < <(dnf rq --whatprovides "$1" -C --qf '%{name}\n' 2>/dev/null | sed '/^$/d' | sort -uVr)
    if (( ! "${#pkgs[@]}" )); then
      echo >&2 'Command not found and no package provides it according to the dnf cache'
      return
    fi
    echo >&2 'Command not found, but offered via the following command(s):'
    pkgs=("${pkgs[@]/#/    dnf install }")
    echo >&2 " ${pkgs[@]}"
  }


yeah, zsh is just superior. it can even emulate bash!


https://github.com/akinomyoga/ble.sh

This revolutionizes Bash's user experience.


I read much on zsh, but I seem to be too invested in Bash to change. Is there are good migration guide for someone with a moderately complex ~./bashrc and a lot of aliases in ~/.bash_aliases?

I seem to recall doing an Arch installation a couple of years back and the zsh instance was well done but none of that setup was installed on the system even with zsh installed. I suppose I could have copied it from the installation media but didn't think about that at the time.


Bash's completion has caused me to waste a lot of time operating on the wrong file because it "knew" something was the only match based on the format when it really wasn't.

Didn't know about M-/ -- handy to have a solution that works on other people's systems.


What key-combination produces M-/?


Meta + slash

"Meta" usually means "alt", except by default in macOS Terminal.app, where you need to go into the settings and check "alt is meta".


M meaning modifier key.


alt + slash, with any luck


i just spent hours trying to hack systemclt's autocomplete sonit lists service names case insensitively (because they have less consistency than php methods)... only to be stoped by a hack that was already in place for something else on the original files that called the builtins methods again and then it became too hacky.


wow, the discipline required to blog every day with that much substance




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: