aboutsummaryrefslogtreecommitdiffhomepage
path: root/share/functions/history.fish
blob: a365ae19e2abdaddf35a4f0dcf971d3c57c154e0 (plain)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#
# Wrap the builtin history command to provide additional functionality.
#
function history --shadow-builtin --description "Deletes an item from history"
    set -l argc (count $argv)
    set -l prefix_args ""
    set -l contains_args ""
    set -l cmd print
    set -l search_mode none
    set -l pager less
    if set -q PAGER
        set pager $PAGER
    end

    if test $argc -gt 0
        for i in (seq $argc)
            switch $argv[$i]
                case --delete
                    set cmd delete
                case --prefix
                    set search_mode prefix
                    set prefix_args $argv[(math $i + 1)]
                case --contains
                    set search_mode contains
                    set contains_args $argv[(math $i + 1)]
                case --save
                    set cmd save
                case --clear
                    set cmd clear
                case --search
                    set cmd print
                case --merge
                    set cmd merge
                case --help
                    set cmd help
                case --
                    set -e argv[$i]
                    break
                case "-*" "--*"
                    printf ( _ "%s: invalid option -- %s\n" ) history $argv[1] >&2
                    return 1
            end
        end
    else
        # Execute history builtin without any argument.
        if status --is-interactive
            builtin history | eval $pager
        else
            builtin history
        end
        return
    end

    switch $cmd
        case print
            # Print matching items. Note this may end up passing --search twice to the builtin,
            # but that's harmless.
            builtin history --search $argv

        case delete
            # Interactively delete history
            set -l found_items ""
            switch $search_mode
                case prefix
                    set found_items (builtin history --search --prefix $prefix_args)
                case contains
                    set found_items (builtin history --search --contains $contains_args)
                case none
                    builtin history $argv
                    # Save changes after deleting item.
                    builtin history --save
                    return 0
            end

            set found_items_count (count $found_items)
            if test $found_items_count -gt 0
                echo "[0] cancel"
                echo "[1] all"
                echo

                for i in (seq $found_items_count)
                    printf "[%s] %s \n" (math $i + 1) $found_items[$i]
                end

                read --local --prompt "echo 'Delete which entries? > '" choice
                set choice (string split " " -- $choice)

                for i in $choice

                    # Skip empty input, for example, if the user just hits return
                    if test -z $i
                        continue
                    end

                    # Following two validations could be embedded with "and" but I find the syntax
                    # kind of weird.
                    if not string match -qr '^[0-9]+$' $i
                        printf "Invalid input: %s\n" $i
                        continue
                    end

                    if test $i -gt (math $found_items_count + 1)
                        printf "Invalid input : %s\n" $i
                        continue
                    end

                    if test $i = "0"
                        printf "Cancel\n"
                        return
                    else
                        if test $i = "1"
                            for item in $found_items
                                builtin history --delete $item
                            end
                            printf "Deleted all!\n"
                        else
                            builtin history --delete $found_items[(math $i - 1)]
                        end

                    end
                end
                # Save changes after deleting item(s).
                builtin history --save
            end
        case save
            # Save changes to history file.
            builtin history $argv
        case merge
            builtin history --merge
        case help
            builtin history --help
        case clear
            # Erase the entire history.
            echo "Are you sure you want to clear history ? (y/n)"
            read ch
            if test $ch = "y"
                builtin history $argv
                echo "History cleared!"
            end
    end
end