Does not work with fish 3.1.0
Thanks for creating this simple and useful tool. I have been using it for a few years and now wanted to switch one machine to the fish shell, which is supported according to the README.
Is this an issue in my setup or is fish currently not supported by php-version?
Error:
$ source (brew --prefix php-version)/php-version.sh
/usr/local/opt/php-version/php-version.sh (line 47): Unexpected ')' found, expecting '}'
-h|--help|-u|--usage)
^
from sourcing file /usr/local/opt/php-version/php-version.sh
called on line 11 of file ~/.config/fish/config.fish
from sourcing file ~/.config/fish/config.fish
called during startup
source: Error while reading file '/usr/local/opt/php-version/php-version.sh'
Debug information:
## System
Darwin <hostname> 19.4.0 Darwin Kernel Version 19.4.0: Wed Mar 4 22:28:40 PST 2020; root:xnu-6153.101.6~15/RELEASE_X86_64 x86_64
## Script
TYPE: NOT FOUND
VERSION: NOT FOUND
## Environment
SHELL: /usr/local/bin/fish
PATH: /Users/lux/.composer/vendor/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin
PHPS:
PHP_VERSIONS:
## Homebrew
VERSION: Homebrew 2.2.11-114-g28a1497
Homebrew/homebrew-core (git revision 1f6b068; last commit 2020-04-05)
Homebrew/homebrew-cask (git revision a5780; last commit 2020-04-05)
PATH: /usr/local/bin/brew
PHPS: /usr/local/Cellar/php
/usr/local/Cellar/[email protected]
/usr/local/Cellar/[email protected]
## PHP
VERSION: 7.4.4
## INI
Configuration File (php.ini) Path: /usr/local/etc/php/7.4
Loaded Configuration File: /usr/local/etc/php/7.4/php.ini
Scan for additional .ini files in: /usr/local/etc/php/7.4/conf.d
Additional .ini files parsed: /usr/local/etc/php/7.4/conf.d/ext-apcu.ini,
/usr/local/etc/php/7.4/conf.d/ext-opcache.ini,
/usr/local/etc/php/7.4/conf.d/ext-xdebug.ini
I'm also curious about this because the readme was changed at the start of 2019 to say fish is supported but it doesn't seem like it works
https://github.com/wilmoore/php-version/commit/de588d1ee6c97e7b2386cb97ddb428d21fb03f59
In case anyone stumbles across this I worked around it by using bass (installed using omf) and this function:
function php-version
bass source (brew --prefix php-version)/php-version.sh ';' php-version $argv
end
I've written an implementation in native fish for my own use, however it doesn't support all features of the original:
###
# Switches PHP versions by modifying the $PATH variable
# Based on https://github.com/wilmoore/php-version
# NOTE: Unlike the original, this fish implementation
# only supports versions installed via Homebrew
#
# Globals:
# $PATH, $MANPATH
# Arguments:
# $version string PHP version (e.g. `7`, `7.4` or `7.4.4`);
# if not given, all available versions are printed
# Returns:
# None
###
function php-version
# ensure that Homebrew is installed
if test -z (command -v brew)
echo -e "\033[31mError:\033[0m Homebrew is not available." >&2
return 1
end
# make a list of all installed PHP versions
set directories (find (brew --prefix)/opt -maxdepth 1 -name 'php@*') (brew --prefix)/opt/php
# ensure that we have found at least one PHP version
if test -z "$directories"
echo -e "\033[31mError:\033[0m No PHP versions were detected," >&2
echo -e " install some with \033[34mbrew install php@*\033[0m." >&2
return 1
end
# make a list of actual installed PHP versions
set versions
for d in $directories
set versions $versions ($d/bin/php-config --version)
end
if test -z "$argv[1]"
# no argument, print all available versions
# determine the current version
set currentVersion (php-config --version)
# print all versions and highlight the current one
for v in $versions
if test "$v" = "$currentVersion"
echo -e "\033[7m* $v\033[0m"
else
echo " $v"
end
end
else if test "$argv[1]" = "complete"
# output available versions for the completion
echo $versions
else
# switch to the specified PHP version
# find the first version (starting from the latest one)
# that starts with the specified version string
set selectedVersion
set selectedDirectory
for i in (seq (count $directories) 1)
if string match -q "$argv[1]*" "$versions[$i]"
set selectedVersion "$versions[$i]"
set selectedDirectory "$directories[$i]"
break
end
end
# ensure that we have found a version
if test -z $selectedVersion
echo -e "\033[31mError:\033[0m Could not find a matching PHP version for \033[34m$argv[1]\033[0m." >&2
echo -e " (Options: \033[34m$versions\033[0m)" >&2
return 1
end
echo -e "Switching to PHP \033[34m$selectedVersion\033[0m..."
# switch to the new version
set -x PATH $selectedDirectory/bin $selectedDirectory/sbin $PATH
set -x MANPATH $selectedDirectory/share/man $MANPATH
end
end
Matching fish completion:
set options (php-version complete)
if test -n options
complete -c php-version -a "$options"
end