aboutsummaryrefslogtreecommitdiff
path: root/bash/bashrc.d/ed.bash
blob: 0f069b85c9c7b06adcde0c59b2a12abb04bef888 (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
# Add a colon prompt to ed when a command is expected rather than text; makes
# it feel a lot more like using ex. Only do this when stdin is a terminal,
# however. Also try and use -v for more verbose error output, and rlwrap(1) if
# it's available.
ed() {

    # Options for ed(1), and a command string in which to wrap the call if
    # appropriate
    local -a opts wrap

    if [[ -t 0 ]] ; then

        # Assemble options for interactive use: colon prompt, and verbose if
        # available (-p is POSIX, but -v is not)
        opts=(-p :)
        if ed -sv - </dev/null >&0 2>&0 ; then
            opts[${#opts[@]}]=-v
        fi

        # Use rlwrap(1) if it's available, but don't throw a fit if it isn't
        if hash rlwrap 2>/dev/null ; then
            wrap=(rlwrap)
        fi
    fi

    # Execute the ed(1) call, in a wrapper if appropriate and with the
    # concluded options
    command "${wrap[@]}" ed "${opts[@]}" "$@"
}