As my time with linux, I created a lot of scripts. Some of them have input parameters and sometimes I just forget this parameters.

So I wonder if there is some way to create autocomplete parameters, like i autocomplete a path by pressing the tab key?

For example a script. ./test.sh can be completed with parameter-one, eg. ./test.sh parameter-one or ./test.sh parameter-two. If i type now ./test.sh followed by tab it should add parameter-one if i press tab again it should change to parameter-two.

How can I do that? I’m on bash…

  • unlawfulbooger@lemmy.blahaj.zone
    link
    fedilink
    arrow-up
    11
    ·
    2 days ago

    Here’s an article that does this: https://iridakos.com/programming/2018/03/01/bash-programmable-completion-tutorial

    I have done this for one of my own tools ta, which is a function that switches to a tmux session, or creates it if it doesn’t exist:

    # switch to existing tmux session, or create it.
    # overrides workdir if session name is "Work"
    function ta() {
            case "$1" in
                    Work) workdir="${HOME}/Work/" ;;
                    *) workdir="${HOME}" ;;
            esac
            if tmux has-session -t "$@" &>/dev/null; then
                    tmux switch-client -t "$@"
            else
                    tmux new-session -A -D -d -c "${workdir}" -s "$@"
                    tmux switch-client -t "$@"
            fi
    }
    
    # complete tmux sessions
    # exclude current session from completion
    function _ta_completion() {
            command="${1}"
            completing="${2}"
            previous="${3}"
            [[ "${command}" != 'ta' ]] && return
            current_session="$(tmux display-message -p '#S')"
            IFS=$'\a' COMPREPLY=( $(tmux list-sessions -F '#{session_name}' | grep -i "^${completing}" | grep -v "^${current_session}$"| tr '\n' '\a' ) )
    }
    # enable completion for ta function
    complete -F _ta_completion ta
    

    Usage

    $ tmux (starts session "0" by default)
    $ ta Personal # create session "Personal" because it doesn't exist
    $ ta Work # create session "Work" because it doesn't exist
    $ ta <tab> 
    0 Personal
    $ ta P<tab> -> $ta Personal
    $ ta <tab>
    0 Work
    
    • N0x0n@lemmy.ml
      link
      fedilink
      arrow-up
      1
      ·
      2 days ago

      This really looks great, I got a question though. As I understand it, it works based on your bash_history which can be very small or autodeleted after each poweroff for privacy & security reasons.

      So it doesn’t work in that case. However, creating a file containing a list or array? Of commands could that be a possible way to implemented a similar behavior?

      I’m asking because I’m not very proficient in any programming language but have done some small bash scripts here and there and quite interested in this functionality !

    • trevor@lemmy.blahaj.zone
      link
      fedilink
      English
      arrow-up
      2
      ·
      edit-2
      2 days ago

      Espanso is probably the most useful software that nobody is using. I can’t live without it.

      I hope it gets an update soon…

      • Flagstaff@programming.dev
        link
        fedilink
        English
        arrow-up
        1
        arrow-down
        1
        ·
        2 days ago

        Its .YML formatting is really clunky. It feels like it takes up twice as much line space as .AHK (for example), which can do a lot of this kind of stuff in a single line. But I wanna go cross-platform and this is all I can find…

        • trevor@lemmy.blahaj.zone
          link
          fedilink
          English
          arrow-up
          3
          ·
          2 days ago

          I like YAML, as long as you aren’t using complicated syntax. Using the | operator will get you some flexible usage that’s mostly easy enough to read. YAML definitely has its problems though. If you want, I can share some snippets of my config.

          Sadly though, due to Espanso not having a working RPM build for Wayland (or a Flatpak, which they’re working on), it’s not quite as cross-platform as I want it to be. It won’t work on any of the cool uBlue-derived distros that I’ve gravitated toward, so I’m hoping we get a nice, big update this year.

          • Flagstaff@programming.dev
            link
            fedilink
            English
            arrow-up
            1
            ·
            2 days ago

            Did you put in a request for this? And sure, I’m always interested in seeing how others use it—especially to complex levels.

  • a14o@feddit.org
    link
    fedilink
    arrow-up
    3
    arrow-down
    1
    ·
    edit-2
    2 days ago

    Not exactly what you are looking for, but modern shells like fish or zsh (probably?) are good at suggesting completions from history. fzf is another great tool for that. Both are super useful for remembering and repeating commands.