File: pushd.fish

package info (click to toggle)
fish 4.2.1-3.1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 35,980 kB
  • sloc: python: 6,972; javascript: 1,407; sh: 1,009; xml: 411; ansic: 230; objc: 78; makefile: 20
file content (82 lines) | stat: -rw-r--r-- 2,389 bytes parent folder | download | duplicates (2)
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
# localization: tier1
function pushd --description 'Push directory to stack'
    set -l rot_r
    set -l rot_l

    if count $argv >/dev/null
        # check for --help
        switch $argv[1]
            case -h --h --he --hel --help
                __fish_print_help pushd
                return 0
        end

        # emulate bash by checking if argument of form +n or -n
        if string match -qr '^-[0-9]+$' -- $argv[1]
            set rot_r (string sub -s 2 -- $argv[1])
        else if string match -qr '^\+[0-9]+$' -- $argv[1]
            set rot_l (string sub -s 2 -- $argv[1])
        end
    end

    set -q dirstack
    or set -g dirstack

    # emulate bash: an empty pushd should switch the top of dirs
    if not set -q argv[1]
        # check that the stack isn't empty
        if not set -q dirstack[1]
            echo "pushd: no other directory" >&2
            return 1
        end

        # get the top two values of the dirs stack ... the first is pwd
        set -l top_dir $PWD
        set -l next_dir $dirstack[1]

        # alter the top of dirstack and move to directory
        set -g dirstack[1] $top_dir
        cd $next_dir
        return
    end

    # emulate bash: check for rotations
    if test -n "$rot_l" -o -n "$rot_r"
        # grab the current stack
        set -l stack $PWD $dirstack

        # translate a right rotation to a left rotation
        if test -n "$rot_r"
            # check the rotation in range
            if test $rot_r -ge (count $stack)
                echo "pushd: -$rot_r: directory stack index out of range" >&2
                return 1
            end

            set rot_l (math (count $stack) - 1 - $rot_r)
        end

        # check the rotation in range
        if test $rot_l -ge (count $stack)
            echo "pushd: +$rot_l: directory stack index out of range" >&2
            return 1
        else
            # rotate stack unless rot_l is 0
            if test $rot_l -gt 0
                set stack $stack[(math $rot_l + 1)..(count $stack)] $stack[1..$rot_l]
            end

            # now reconstruct dirstack and change directory
            set -g dirstack $stack[2..(count $stack)]
            cd $stack[1]
        end

        # print the new stack
        dirs
        return
    end

    # argv[1] is a directory
    set -l old_pwd $PWD
    cd $argv[1]; and set -g -p dirstack $old_pwd
end