aboutsummaryrefslogtreecommitdiff
path: root/bash/bashrc.d/vis.bash
blob: ffcfe02a6fbe2b7f4e406c5e227402337769064f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Create or edit a script in $PATH, creating in $HOME/.local/bin
vis() {
    local arg cmd file endopts
    local -a opts cmds files

    # Distinguish options from file arguments
    endopts=0
    for arg in "${@:?}" ; do
        if [[ $arg == -- ]] ; then
            endopts=1
        elif [[ $arg == -* ]] && ! ((endopts)) ; then
            opts=("${opts[@]}" "$arg")
        else
            cmds=("${cmds[@]}" "$arg")
        fi
    done

    # Check all the commands, if they don't exist, we'll create them
    for cmd in "${cmds[@]}" ; do
        file=$(type -p "${cmd##*/}")
        if [[ ! $file ]] ; then
            if ! mkdir -p "$HOME"/.local/bin ; then
                exit
            fi
            file="$HOME"/.local/bin/"${cmd##*/}"
        fi
        files=("${files[@]}" "$file")
    done

    # Run editor with all the options and full path file arguments
    command "${VISUAL:-${EDITOR:-vi}}" "${opts[@]}" -- "${files[@]}"

    # Attempt to make the new files executable by us
    chmod -f -- u+x "${files[@]}"
}

# Complete the vis function with command names
complete -A command vis