diff --git a/completions/rbenv.fish b/completions/rbenv.fish new file mode 100644 index 00000000..3ca8e945 --- /dev/null +++ b/completions/rbenv.fish @@ -0,0 +1,22 @@ +function __fish_rbenv_needs_command + set cmd (commandline -opc) + if [ (count $cmd) -eq 1 -a $cmd[1] = 'rbenv' ] + return 0 + end + return 1 +end + +function __fish_rbenv_using_command + set cmd (commandline -opc) + if [ (count $cmd) -gt 1 ] + if [ $argv[1] = $cmd[2] ] + return 0 + end + end + return 1 +end + +complete -f -c rbenv -n '__fish_rbenv_needs_command' -a '(rbenv commands)' +for cmd in (rbenv commands) + complete -f -c rbenv -n "__fish_rbenv_using_command $cmd" -a "(rbenv completions $cmd)" +end diff --git a/libexec/rbenv-init b/libexec/rbenv-init index 2dbd67d1..c3a3bb02 100755 --- a/libexec/rbenv-init +++ b/libexec/rbenv-init @@ -62,6 +62,9 @@ if [ -z "$print" ]; then ksh ) profile='~/.profile' ;; + fish ) + profile='~/.config/fish/config.fish' + ;; * ) profile='your profile' ;; @@ -80,7 +83,14 @@ fi mkdir -p "${RBENV_ROOT}/"{shims,versions} if [[ ":${PATH}:" != *:"${RBENV_ROOT}/shims":* ]]; then - echo 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"' + case "$shell" in + fish ) + echo 'setenv PATH "'${RBENV_ROOT}'/shims"' '$PATH' ';' + ;; + * ) + echo 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"' + ;; + esac fi completion="${root}/completions/rbenv.${shell}" @@ -91,8 +101,27 @@ if [ -z "$no_rehash" ]; then fi commands=(`rbenv-commands --sh`) -IFS="|" -cat </dev/null || true" + +case "$shell" in +fish ) + # nothing to do + ;; +* ) + echo "hash -r 2>/dev/null || true" + ;; +esac diff --git a/libexec/rbenv-sh-shell b/libexec/rbenv-sh-shell index 4b89c6c0..d0ffe1b0 100755 --- a/libexec/rbenv-sh-shell +++ b/libexec/rbenv-sh-shell @@ -24,6 +24,7 @@ if [ "$1" = "--complete" ]; then fi version="$1" +shell="$(basename "$SHELL")" if [ -z "$version" ]; then if [ -z "$RBENV_VERSION" ]; then @@ -36,14 +37,28 @@ if [ -z "$version" ]; then fi if [ "$version" = "--unset" ]; then - echo "unset RBENV_VERSION" + case "$shell" in + fish ) + echo "set -e RBENV_VERSION" + ;; + * ) + echo "unset RBENV_VERSION" + ;; + esac exit fi # Make sure the specified version is installed. if rbenv-prefix "$version" >/dev/null; then - echo "export RBENV_VERSION=\"${version}\"" + case "$shell" in + fish ) + echo "setenv RBENV_VERSION \"${version}\"" + ;; + * ) + echo "export RBENV_VERSION=\"${version}\"" + ;; + esac else - echo "return 1" + echo "false" exit 1 fi diff --git a/test/init.bats b/test/init.bats index dc9fe302..a4c63199 100644 --- a/test/init.bats +++ b/test/init.bats @@ -18,13 +18,19 @@ load test_helper } @test "setup shell completions" { - export SHELL=/bin/bash root="$(cd $BATS_TEST_DIRNAME/.. && pwd)" - run rbenv-init - + SHELL=/bin/bash run rbenv-init - assert_success assert_line "source '${root}/libexec/../completions/rbenv.bash'" } +@test "setup shell completions (fish)" { + root="$(cd $BATS_TEST_DIRNAME/.. && pwd)" + SHELL=/usr/bin/fish run rbenv-init - + assert_success + assert_line '. "'${root}'/libexec/../completions/rbenv.fish";' +} + @test "option to skip rehash" { run rbenv-init - --no-rehash assert_success @@ -33,14 +39,28 @@ load test_helper @test "adds shims to PATH" { export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin" - run rbenv-init - + SHELL=/bin/bash run rbenv-init - assert_success assert_line 0 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"' } +@test "adds shims to PATH (fish)" { + export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin" + SHELL=/usr/bin/fish run rbenv-init - + assert_success + assert_line 0 'setenv PATH "'${RBENV_ROOT}'/shims" $PATH ;' +} + @test "doesn't add shims to PATH more than once" { export PATH="${RBENV_ROOT}/shims:$PATH" - run rbenv-init - + SHELL=/bin/bash run rbenv-init - assert_success refute_line 'export PATH="'${RBENV_ROOT}'/shims:${PATH}"' } + +@test "doesn't add shims to PATH more than once (fish)" { + export PATH="${RBENV_ROOT}/shims:$PATH" + SHELL=/usr/bin/fish run rbenv-init - + assert_success + refute_line 'setenv PATH "'${RBENV_ROOT}'/shims" $PATH ;' +} diff --git a/test/shell.bats b/test/shell.bats index 579d31ae..b14d1cfb 100644 --- a/test/shell.bats +++ b/test/shell.bats @@ -11,26 +11,42 @@ load test_helper } @test "shell version" { - RBENV_VERSION="1.2.3" run rbenv-sh-shell + SHELL=/bin/bash RBENV_VERSION="1.2.3" run rbenv-sh-shell + assert_success 'echo "$RBENV_VERSION"' +} + +@test "shell version (fish)" { + SHELL=/usr/bin/fish RBENV_VERSION="1.2.3" run rbenv-sh-shell assert_success 'echo "$RBENV_VERSION"' } @test "shell unset" { - run rbenv-sh-shell --unset + SHELL=/bin/bash run rbenv-sh-shell --unset assert_success "unset RBENV_VERSION" } +@test "shell unset (fish)" { + SHELL=/usr/bin/fish run rbenv-sh-shell --unset + assert_success "set -e RBENV_VERSION" +} + @test "shell change invalid version" { run rbenv-sh-shell 1.2.3 assert_failure assert_output <