Compare commits

..

13 Commits
3.0b1 ... 3.0.0

Author SHA1 Message Date
David Adam
938ce48d25 Bump version for 3.0.0 2018-12-28 21:01:03 +08:00
David Adam
0c25d7a49c CHANGELOG: 3.0.0 updates 2018-12-28 20:56:17 +08:00
David Adam
d6e315d25d cmake: define _GNU_SOURCE
Fixes the build on Cygwin. Analogous to AC_USE_SYSTEM_EXTENSIONS under Autoconf.

Closes #5423.
2018-12-20 21:36:01 +08:00
Fabian Homborg
14ee19cc1b Use HAVE_WCSTOD_L also in header 2018-12-18 11:03:33 +01:00
Aaron Gyes
57d6124e6e builtin_test: don't exit 1 for eval errors, add tests for big args
Return STATUS_INVALID_ARGS when failing due to evaluation errors,
so we can tell the difference between an error and falseness.

Add a test for the ERANGE error
2018-12-16 14:51:26 -08:00
Aaron Gyes
cf2b40040a STATUS_INVALID_ARGS = 2
The rest of the high-numbered exit codes are not values used by scripts
or builtins, they are internal to fish and come out of
the parser for example.

Prior to adding STATUS_INVALID_ARGS, builtins were usually exiting 2
if they had a special exit status for the situation of bad arguments.

Set it to 2.
2018-12-16 14:51:18 -08:00
Aaron Gyes
b404b9392c builtin_test.cpp: split a long line, add braces 2018-12-16 14:51:10 -08:00
Aaron Gyes
1f871c4d0c builtin_test.cpp: check for ERANGE and special fish_wcstoll errno
We were not parsing an in-range number when we claimed we were,
and were thus failing to error with invalid numbers and returned
a wrong test result. Fixed #5414

Also, provide the detail we can for the other error cases.
2018-12-16 14:51:02 -08:00
Fabian Homborg
e07b45f447 Revert "completions/git: Allow aliases with whitespace in the command"
This reverts commit 081e14fd21, which was bogus.
2018-12-15 11:13:38 +01:00
Fabian Homborg
081e14fd21 completions/git: Allow aliases with whitespace in the command
Fixes #5412.
2018-12-13 22:49:12 +01:00
Fabian Homborg
99ba07354a fish_vi_key_bindings: Remove weird argv handling
Instead of maybe adding "-s" and "-M" if "-s" hasn't already been
given, just add "-s" to _every_ bind invocation, and "-M" to those who
need it.

Fixes #5028.
2018-12-13 17:33:48 +01:00
David Adam
79d53a32dc history: drop use of fish_indent
Largely reverts 007d794b6e.

fish_indent is extremely resource-intensive on large inputs and can crash; it also does not handle
invalid characters gracefully.

Work on #5402.
2018-12-13 21:57:24 +08:00
Fabian Homborg
ffab420e43 Add fallback wcstod_l for musl
Just sets locale to "C" (because that's the only one we need), does
wcstod and resets the locale.

No idea why uselocale(loc) failed for me, but it did.

Fixes #5407.
2018-12-12 15:12:12 +01:00
14 changed files with 246 additions and 197 deletions

View File

@@ -1,3 +1,21 @@
# fish 3.0.0 (released December 28, 2018)
fish 3 is a major release, which introduces some breaking changes alongside improved functionality. Although most existing scripts will continue to work, they should be reviewed against the list contained in the 3.0b1 release notes below.
Compared to the beta release of fish 3.0b1, fish version 3.0.0:
- builds correctly against musl libc (#5407)
- handles huge numeric arguments to `test` correctly (#5414)
- removes the history colouring introduced in 3.0b1, which did not always work correctly
There is one significant known issue which was not able to be corrected before the release:
- fish 3.0.0 builds on Cygwin (#5423), but does not run correctly (#5426) and will result in a hanging terminal when started. Cygwin users are encouraged to continue using 2.7.1 until a release which corrects this is available.
If you are upgrading from version 2.7.1 or before, please also review the release notes for 3.0b1 (included below).
---
# fish 3.0b1 (released December 11, 2018)
fish 3 is a major release, which introduces some breaking changes alongside improved functionality. Although most existing scripts will continue to work, they should be reviewed against the list below.
@@ -57,7 +75,7 @@ A new feature flags mechanism is added for staging deprecations and breaking cha
- `exec` prompts for confirmation if background jobs are running.
- `funced` has a new `--save` option to automatically save the edited function after successfully editing (#4668).
- `functions` has a new ` --handlers` option to show functions registered as event handlers (#4694).
- `history search` supports globs for wildcard searching (#3136) and has a new `--reverse` option to show entries from oldest to newest (#4375)..
- `history search` supports globs for wildcard searching (#3136) and has a new `--reverse` option to show entries from oldest to newest (#4375).
- `jobs` has a new `--quiet` option to silence the output.
- `read` has a new `--delimiter` option for splitting input into arrays (#4256).
- `read` writes directly to stdout if called without arguments (#4407).

View File

@@ -72,6 +72,7 @@ CHECK_CXX_SYMBOL_EXISTS(wcsdup wchar.h HAVE_WCSDUP)
CHECK_CXX_SYMBOL_EXISTS(wcslcpy wchar.h HAVE_WCSLCPY)
CHECK_CXX_SYMBOL_EXISTS(wcsncasecmp wchar.h HAVE_WCSNCASECMP)
CHECK_CXX_SYMBOL_EXISTS(wcsndup wchar.h HAVE_WCSNDUP)
CHECK_CXX_SYMBOL_EXISTS(wcstod_l wchar.h HAVE_WCSTOD_L)
CHECK_CXX_SYMBOL_EXISTS(_sys_errs stdlib.h HAVE__SYS__ERRS)

View File

@@ -142,6 +142,11 @@
/* Define to 1 if tparm accepts a fixed amount of paramters. */
#cmakedefine TPARM_SOLARIS_KLUDGE 1
/* Enable GNU extensions on systems that have them. */
#ifndef _GNU_SOURCE
# define _GNU_SOURCE 1
#endif
/* The size of wchar_t in bits. */
#define WCHAR_T_BITS ${WCHAR_T_BITS}

View File

@@ -316,6 +316,7 @@ AC_STRUCT_DIRENT_D_TYPE
#
AC_CHECK_FUNCS( wcsndup )
AC_CHECK_FUNCS( wcstod_l )
AC_CHECK_FUNCS( futimes )
AC_CHECK_FUNCS( wcslcpy lrand48_r killpg )
AC_CHECK_FUNCS( backtrace_symbols getifaddrs )

View File

@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2.7.900</string>
<string>3.0.0</string>
<key>CFBundleVersion</key>
<string>0.1</string>
<key>LSApplicationCategoryType</key>

View File

@@ -206,7 +206,7 @@
#define PACKAGE_NAME "fish"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "fish 3.0b1"
#define PACKAGE_STRING "fish 3.0.0"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "fish"
@@ -215,7 +215,7 @@
#define PACKAGE_URL ""
/* Define to the version of this package. */
#define PACKAGE_VERSION "3.0b1"
#define PACKAGE_VERSION "3.0.0"
/* The size of `wchar_t', as computed by sizeof. */
#define SIZEOF_WCHAR_T 4

View File

@@ -17,11 +17,6 @@ function fish_vi_key_bindings --description 'vi-like key bindings for fish'
bind --erase --all --preset # clear earlier bindings, if any
end
# Silence warnings about unavailable keys. See #4431, 4188
if not contains -- -s $argv
set argv "-s" "-M" $argv
end
# Allow just calling this function to correctly set the bindings.
# Because it's a rather discoverable name, users will execute it
# and without this would then have subtly broken bindings.
@@ -61,217 +56,217 @@ function fish_vi_key_bindings --description 'vi-like key bindings for fish'
__fish_shared_key_bindings -M $mode
end
bind --preset $argv insert \r execute
bind --preset $argv insert \n execute
bind -s --preset -M insert \r execute
bind -s --preset -M insert \n execute
bind --preset $argv insert "" self-insert
bind -s --preset -M insert "" self-insert
# Add way to kill current command line while in insert mode.
bind --preset $argv insert \cc __fish_cancel_commandline
bind -s --preset -M insert \cc __fish_cancel_commandline
# Add a way to switch from insert to normal (command) mode.
# Note if we are paging, we want to stay in insert mode
# See #2871
bind --preset $argv insert \e "if commandline -P; commandline -f cancel; else; set fish_bind_mode default; commandline -f backward-char force-repaint; end"
bind -s --preset -M insert \e "if commandline -P; commandline -f cancel; else; set fish_bind_mode default; commandline -f backward-char force-repaint; end"
# Default (command) mode
bind --preset :q exit
bind --preset -m insert \cc __fish_cancel_commandline
bind --preset $argv default h backward-char
bind --preset $argv default l forward-char
bind --preset -m insert \n execute
bind --preset -m insert \r execute
bind --preset -m insert i force-repaint
bind --preset -m insert I beginning-of-line force-repaint
bind --preset -m insert a forward-char force-repaint
bind --preset -m insert A end-of-line force-repaint
bind --preset -m visual v begin-selection force-repaint
bind -s --preset :q exit
bind -s --preset -m insert \cc __fish_cancel_commandline
bind -s --preset -M default h backward-char
bind -s --preset -M default l forward-char
bind -s --preset -m insert \n execute
bind -s --preset -m insert \r execute
bind -s --preset -m insert i force-repaint
bind -s --preset -m insert I beginning-of-line force-repaint
bind -s --preset -m insert a forward-char force-repaint
bind -s --preset -m insert A end-of-line force-repaint
bind -s --preset -m visual v begin-selection force-repaint
#bind --preset -m insert o "commandline -a \n" down-line force-repaint
#bind --preset -m insert O beginning-of-line "commandline -i \n" up-line force-repaint # doesn't work
#bind -s --preset -m insert o "commandline -a \n" down-line force-repaint
#bind -s --preset -m insert O beginning-of-line "commandline -i \n" up-line force-repaint # doesn't work
bind --preset gg beginning-of-buffer
bind --preset G end-of-buffer
bind -s --preset gg beginning-of-buffer
bind -s --preset G end-of-buffer
for key in $eol_keys
bind --preset $key end-of-line
bind -s --preset $key end-of-line
end
for key in $bol_keys
bind --preset $key beginning-of-line
bind -s --preset $key beginning-of-line
end
bind --preset u history-search-backward
bind --preset \cr history-search-forward
bind -s --preset u history-search-backward
bind -s --preset \cr history-search-forward
bind --preset [ history-token-search-backward
bind --preset ] history-token-search-forward
bind -s --preset [ history-token-search-backward
bind -s --preset ] history-token-search-forward
bind --preset k up-or-search
bind --preset j down-or-search
bind --preset b backward-word
bind --preset B backward-bigword
bind --preset ge backward-word
bind --preset gE backward-bigword
bind --preset w forward-word forward-char
bind --preset W forward-bigword forward-char
bind --preset e forward-char forward-word backward-char
bind --preset E forward-bigword backward-char
bind -s --preset k up-or-search
bind -s --preset j down-or-search
bind -s --preset b backward-word
bind -s --preset B backward-bigword
bind -s --preset ge backward-word
bind -s --preset gE backward-bigword
bind -s --preset w forward-word forward-char
bind -s --preset W forward-bigword forward-char
bind -s --preset e forward-char forward-word backward-char
bind -s --preset E forward-bigword backward-char
# OS X SnowLeopard doesn't have these keys. Don't show an annoying error message.
# Vi/Vim doesn't support these keys in insert mode but that seems silly so we do so anyway.
bind --preset $argv insert -k home beginning-of-line 2>/dev/null
bind --preset $argv default -k home beginning-of-line 2>/dev/null
bind --preset $argv insert -k end end-of-line 2>/dev/null
bind --preset $argv default -k end end-of-line 2>/dev/null
bind -s --preset -M insert -k home beginning-of-line 2>/dev/null
bind -s --preset -M default -k home beginning-of-line 2>/dev/null
bind -s --preset -M insert -k end end-of-line 2>/dev/null
bind -s --preset -M default -k end end-of-line 2>/dev/null
# Vi moves the cursor back if, after deleting, it is at EOL.
# To emulate that, move forward, then backward, which will be a NOP
# if there is something to move forward to.
bind --preset $argv default x delete-char forward-char backward-char
bind --preset $argv default X backward-delete-char
bind --preset $argv insert -k dc delete-char forward-char backward-char
bind --preset $argv default -k dc delete-char forward-char backward-char
bind -s --preset -M default x delete-char forward-char backward-char
bind -s --preset -M default X backward-delete-char
bind -s --preset -M insert -k dc delete-char forward-char backward-char
bind -s --preset -M default -k dc delete-char forward-char backward-char
# Backspace deletes a char in insert mode, but not in normal/default mode.
bind --preset $argv insert -k backspace backward-delete-char
bind --preset $argv default -k backspace backward-char
bind --preset $argv insert \ch backward-delete-char
bind --preset $argv default \ch backward-char
bind --preset $argv insert \x7f backward-delete-char
bind --preset $argv default \x7f backward-char
bind --preset $argv insert \e\[3\;2~ backward-delete-char # Mavericks Terminal.app shift-ctrl-delete
bind --preset $argv default \e\[3\;2~ backward-delete-char # Mavericks Terminal.app shift-ctrl-delete
bind -s --preset -M insert -k backspace backward-delete-char
bind -s --preset -M default -k backspace backward-char
bind -s --preset -M insert \ch backward-delete-char
bind -s --preset -M default \ch backward-char
bind -s --preset -M insert \x7f backward-delete-char
bind -s --preset -M default \x7f backward-char
bind -s --preset -M insert \e\[3\;2~ backward-delete-char # Mavericks Terminal.app shift-ctrl-delete
bind -s --preset -M default \e\[3\;2~ backward-delete-char # Mavericks Terminal.app shift-ctrl-delete
bind --preset dd kill-whole-line
bind --preset D kill-line
bind --preset d\$ kill-line
bind --preset d\^ backward-kill-line
bind --preset dw kill-word
bind --preset dW kill-bigword
bind --preset diw forward-char forward-char backward-word kill-word
bind --preset diW forward-char forward-char backward-bigword kill-bigword
bind --preset daw forward-char forward-char backward-word kill-word
bind --preset daW forward-char forward-char backward-bigword kill-bigword
bind --preset de kill-word
bind --preset dE kill-bigword
bind --preset db backward-kill-word
bind --preset dB backward-kill-bigword
bind --preset dge backward-kill-word
bind --preset dgE backward-kill-bigword
bind --preset df begin-selection forward-jump kill-selection end-selection
bind --preset dt begin-selection forward-jump backward-char kill-selection end-selection
bind --preset dF begin-selection backward-jump kill-selection end-selection
bind --preset dT begin-selection backward-jump forward-char kill-selection end-selection
bind -s --preset dd kill-whole-line
bind -s --preset D kill-line
bind -s --preset d\$ kill-line
bind -s --preset d\^ backward-kill-line
bind -s --preset dw kill-word
bind -s --preset dW kill-bigword
bind -s --preset diw forward-char forward-char backward-word kill-word
bind -s --preset diW forward-char forward-char backward-bigword kill-bigword
bind -s --preset daw forward-char forward-char backward-word kill-word
bind -s --preset daW forward-char forward-char backward-bigword kill-bigword
bind -s --preset de kill-word
bind -s --preset dE kill-bigword
bind -s --preset db backward-kill-word
bind -s --preset dB backward-kill-bigword
bind -s --preset dge backward-kill-word
bind -s --preset dgE backward-kill-bigword
bind -s --preset df begin-selection forward-jump kill-selection end-selection
bind -s --preset dt begin-selection forward-jump backward-char kill-selection end-selection
bind -s --preset dF begin-selection backward-jump kill-selection end-selection
bind -s --preset dT begin-selection backward-jump forward-char kill-selection end-selection
bind --preset -m insert s delete-char force-repaint
bind --preset -m insert S kill-whole-line force-repaint
bind --preset -m insert cc kill-whole-line force-repaint
bind --preset -m insert C kill-line force-repaint
bind --preset -m insert c\$ kill-line force-repaint
bind --preset -m insert c\^ backward-kill-line force-repaint
bind --preset -m insert cw kill-word force-repaint
bind --preset -m insert cW kill-bigword force-repaint
bind --preset -m insert ciw forward-char forward-char backward-word kill-word force-repaint
bind --preset -m insert ciW forward-char forward-char backward-bigword kill-bigword force-repaint
bind --preset -m insert caw forward-char forward-char backward-word kill-word force-repaint
bind --preset -m insert caW forward-char forward-char backward-bigword kill-bigword force-repaint
bind --preset -m insert ce kill-word force-repaint
bind --preset -m insert cE kill-bigword force-repaint
bind --preset -m insert cb backward-kill-word force-repaint
bind --preset -m insert cB backward-kill-bigword force-repaint
bind --preset -m insert cge backward-kill-word force-repaint
bind --preset -m insert cgE backward-kill-bigword force-repaint
bind -s --preset -m insert s delete-char force-repaint
bind -s --preset -m insert S kill-whole-line force-repaint
bind -s --preset -m insert cc kill-whole-line force-repaint
bind -s --preset -m insert C kill-line force-repaint
bind -s --preset -m insert c\$ kill-line force-repaint
bind -s --preset -m insert c\^ backward-kill-line force-repaint
bind -s --preset -m insert cw kill-word force-repaint
bind -s --preset -m insert cW kill-bigword force-repaint
bind -s --preset -m insert ciw forward-char forward-char backward-word kill-word force-repaint
bind -s --preset -m insert ciW forward-char forward-char backward-bigword kill-bigword force-repaint
bind -s --preset -m insert caw forward-char forward-char backward-word kill-word force-repaint
bind -s --preset -m insert caW forward-char forward-char backward-bigword kill-bigword force-repaint
bind -s --preset -m insert ce kill-word force-repaint
bind -s --preset -m insert cE kill-bigword force-repaint
bind -s --preset -m insert cb backward-kill-word force-repaint
bind -s --preset -m insert cB backward-kill-bigword force-repaint
bind -s --preset -m insert cge backward-kill-word force-repaint
bind -s --preset -m insert cgE backward-kill-bigword force-repaint
bind --preset '~' capitalize-word
bind --preset gu downcase-word
bind --preset gU upcase-word
bind -s --preset '~' capitalize-word
bind -s --preset gu downcase-word
bind -s --preset gU upcase-word
bind --preset J end-of-line delete-char
bind --preset K 'man (commandline -t) 2>/dev/null; or echo -n \a'
bind -s --preset J end-of-line delete-char
bind -s --preset K 'man (commandline -t) 2>/dev/null; or echo -n \a'
bind --preset yy kill-whole-line yank
bind --preset Y kill-whole-line yank
bind --preset y\$ kill-line yank
bind --preset y\^ backward-kill-line yank
bind --preset yw kill-word yank
bind --preset yW kill-bigword yank
bind --preset yiw forward-char forward-char backward-word kill-word yank
bind --preset yiW forward-char forward-char backward-bigword kill-bigword yank
bind --preset yaw forward-char forward-char backward-word kill-word yank
bind --preset yaW forward-char forward-char backward-bigword kill-bigword yank
bind --preset ye kill-word yank
bind --preset yE kill-bigword yank
bind --preset yb backward-kill-word yank
bind --preset yB backward-kill-bigword yank
bind --preset yge backward-kill-word yank
bind --preset ygE backward-kill-bigword yank
bind -s --preset yy kill-whole-line yank
bind -s --preset Y kill-whole-line yank
bind -s --preset y\$ kill-line yank
bind -s --preset y\^ backward-kill-line yank
bind -s --preset yw kill-word yank
bind -s --preset yW kill-bigword yank
bind -s --preset yiw forward-char forward-char backward-word kill-word yank
bind -s --preset yiW forward-char forward-char backward-bigword kill-bigword yank
bind -s --preset yaw forward-char forward-char backward-word kill-word yank
bind -s --preset yaW forward-char forward-char backward-bigword kill-bigword yank
bind -s --preset ye kill-word yank
bind -s --preset yE kill-bigword yank
bind -s --preset yb backward-kill-word yank
bind -s --preset yB backward-kill-bigword yank
bind -s --preset yge backward-kill-word yank
bind -s --preset ygE backward-kill-bigword yank
bind --preset f forward-jump
bind --preset F backward-jump
bind --preset t forward-jump-till
bind --preset T backward-jump-till
bind --preset ';' repeat-jump
bind --preset , repeat-jump-reverse
bind -s --preset f forward-jump
bind -s --preset F backward-jump
bind -s --preset t forward-jump-till
bind -s --preset T backward-jump-till
bind -s --preset ';' repeat-jump
bind -s --preset , repeat-jump-reverse
# in emacs yank means paste
bind --preset p yank
bind --preset P backward-char yank
bind --preset gp yank-pop
bind -s --preset p yank
bind -s --preset P backward-char yank
bind -s --preset gp yank-pop
bind --preset '"*p' "commandline -i ( xsel -p; echo )[1]"
bind --preset '"*P' backward-char "commandline -i ( xsel -p; echo )[1]"
bind -s --preset '"*p' "commandline -i ( xsel -p; echo )[1]"
bind -s --preset '"*P' backward-char "commandline -i ( xsel -p; echo )[1]"
#
# Lowercase r, enters replace_one mode
#
bind --preset -m replace_one r force-repaint
bind --preset $argv replace_one -m default '' delete-char self-insert backward-char force-repaint
bind --preset $argv replace_one -m default \e cancel force-repaint
bind -s --preset -m replace_one r force-repaint
bind -s --preset -M replace_one -m default '' delete-char self-insert backward-char force-repaint
bind -s --preset -M replace_one -m default \e cancel force-repaint
#
# visual mode
#
bind --preset $argv visual h backward-char
bind --preset $argv visual l forward-char
bind -s --preset -M visual h backward-char
bind -s --preset -M visual l forward-char
bind --preset $argv visual k up-line
bind --preset $argv visual j down-line
bind -s --preset -M visual k up-line
bind -s --preset -M visual j down-line
bind --preset $argv visual b backward-word
bind --preset $argv visual B backward-bigword
bind --preset $argv visual ge backward-word
bind --preset $argv visual gE backward-bigword
bind --preset $argv visual w forward-word
bind --preset $argv visual W forward-bigword
bind --preset $argv visual e forward-word
bind --preset $argv visual E forward-bigword
bind --preset $argv visual o swap-selection-start-stop force-repaint
bind -s --preset -M visual b backward-word
bind -s --preset -M visual B backward-bigword
bind -s --preset -M visual ge backward-word
bind -s --preset -M visual gE backward-bigword
bind -s --preset -M visual w forward-word
bind -s --preset -M visual W forward-bigword
bind -s --preset -M visual e forward-word
bind -s --preset -M visual E forward-bigword
bind -s --preset -M visual o swap-selection-start-stop force-repaint
bind --preset $argv visual f forward-jump
bind --preset $argv visual t forward-jump-till
bind --preset $argv visual F backward-jump
bind --preset $argv visual T backward-jump-till
bind -s --preset -M visual f forward-jump
bind -s --preset -M visual t forward-jump-till
bind -s --preset -M visual F backward-jump
bind -s --preset -M visual T backward-jump-till
for key in $eol_keys
bind --preset $argv visual $key end-of-line
bind -s --preset -M visual $key end-of-line
end
for key in $bol_keys
bind --preset $argv visual $key beginning-of-line
bind -s --preset -M visual $key beginning-of-line
end
bind --preset $argv visual -m insert c kill-selection end-selection force-repaint
bind --preset $argv visual -m default d kill-selection end-selection force-repaint
bind --preset $argv visual -m default x kill-selection end-selection force-repaint
bind --preset $argv visual -m default X kill-whole-line end-selection force-repaint
bind --preset $argv visual -m default y kill-selection yank end-selection force-repaint
bind --preset $argv visual -m default '"*y' "commandline -s | xsel -p; commandline -f end-selection force-repaint"
bind -s --preset -M visual -m insert c kill-selection end-selection force-repaint
bind -s --preset -M visual -m default d kill-selection end-selection force-repaint
bind -s --preset -M visual -m default x kill-selection end-selection force-repaint
bind -s --preset -M visual -m default X kill-whole-line end-selection force-repaint
bind -s --preset -M visual -m default y kill-selection yank end-selection force-repaint
bind -s --preset -M visual -m default '"*y' "commandline -s | xsel -p; commandline -f end-selection force-repaint"
bind --preset $argv visual -m default \cc end-selection force-repaint
bind --preset $argv visual -m default \e end-selection force-repaint
bind -s --preset -M visual -m default \cc end-selection force-repaint
bind -s --preset -M visual -m default \e end-selection force-repaint
# Make it easy to turn an unexecuted command into a comment in the shell history. Also, remove
# the commenting chars so the command can be further edited then executed.
bind --preset $argv default \# __fish_toggle_comment_commandline
bind --preset $argv visual \# __fish_toggle_comment_commandline
bind -s --preset -M default \# __fish_toggle_comment_commandline
bind -s --preset -M visual \# __fish_toggle_comment_commandline
# Set the cursor shape
# After executing once, this will have defined functions listening for the variable.

View File

@@ -32,7 +32,6 @@ function history --description "display or manipulate interactive command histor
set -l hist_cmd
set -l show_time
set -l skip_indent
set -l max_count
set -q _flag_max
set max_count -n$_flag_max
@@ -41,10 +40,6 @@ function history --description "display or manipulate interactive command histor
and set -l _flag_show_time $_flag_with_time
if set -q _flag_show_time[1]
set show_time --show-time=$_flag_show_time
# `history -t` by default shows timestamps on seperate lines beginning with # characters.
# When colorized the timetamps would highlighted as comments by fish_indent. With a custom
# format there is no guarantee fish_indent can do anything useful.
set skip_indent true
else if set -q _flag_show_time
set show_time --show-time
end
@@ -93,18 +88,15 @@ function history --description "display or manipulate interactive command histor
and set pager $PAGER
# If the user hasn't preconfigured less with the $LESS environment variable,
# we do so to prevent the stripping of control characters (for color) and have
# it behave like cat if output fits on one screen. Prevent the screen from clearing
# on quit, so there is something to see if it exits.
# These are the same three options `git` sets through $LESS before starting the pager.
# we do so to have it behave like cat if output fits on one screen. Prevent the
# screen from clearing on quit, so there is something to see if it exits.
# These are two of the options `git` sets through $LESS before starting the pager.
not set -qx LESS
and set -x LESS --RAW-CONTROL-CHARS --quit-if-one-screen --no-init
and set -x LESS --quit-if-one-screen --no-init
not set -qx LV # ask the pager lv not to strip colors
and set -x LV -c
set -q skip_indent[1] # --show-time=FORMAT set, arbitrary output may not be valid fish script
and builtin history search $search_mode $show_time $max_count $_flag_case_sensitive $_flag_reverse $_flag_null -- $argv | $pager
or builtin history search $search_mode $show_time $max_count $_flag_case_sensitive $_flag_reverse $_flag_null -- $argv | fish_indent --ansi | $pager
builtin history search $search_mode $show_time $max_count $_flag_case_sensitive $_flag_reverse $_flag_null -- $argv | $pager
else
builtin history search $search_mode $show_time $max_count $_flag_case_sensitive $_flag_reverse $_flag_null -- $argv
end

View File

@@ -648,7 +648,6 @@ static bool parse_number(const wcstring &arg, number_t *number, wcstring_list_t
const wchar_t *argcs = arg.c_str();
double floating = 0;
bool got_float = parse_double(argcs, &floating);
errno = 0;
long long integral = fish_wcstoll(argcs);
bool got_int = (errno == 0);
@@ -656,18 +655,26 @@ static bool parse_number(const wcstring &arg, number_t *number, wcstring_list_t
// Here the value is just an integer; ignore the floating point parse because it may be
// invalid (e.g. not a representable integer).
*number = number_t{integral, 0.0};
return true;
} else if (got_float) {
} else if (got_float && errno != ERANGE) {
// Here we parsed an (in range) floating point value that could not be parsed as an integer.
// Break the floating point value into base and delta. Ensure that base is <= the floating
// point value.
double intpart = std::floor(floating);
double delta = floating - intpart;
*number = number_t{static_cast<long long>(intpart), delta};
return true;
} else {
// We could not parse a float or an int.
errors.push_back(format_string(_(L"invalid number '%ls'"), arg.c_str()));
// Check for special fish_wcsto* value or show standard EINVAL/ERANGE error.
if (errno == -1) {
errors.push_back(format_string(_(L"Integer %lld in '%ls' followed by non-digit"),
integral, argcs));
} else {
errors.push_back(format_string(L"%s: '%ls'", strerror(errno), argcs));
}
return false;
}
}
@@ -829,7 +836,7 @@ int builtin_test(parser_t &parser, io_streams_t &streams, wchar_t **argv) {
const wcstring_list_t args(argv + 1, argv + 1 + argc);
if (argc == 0) {
return STATUS_CMD_ERROR; // Per 1003.1, exit false.
return STATUS_INVALID_ARGS; // Per 1003.1, exit false.
} else if (argc == 1) {
// Per 1003.1, exit true if the arg is non-empty.
return args.at(0).empty() ? STATUS_CMD_ERROR : STATUS_CMD_OK;
@@ -852,11 +859,13 @@ int builtin_test(parser_t &parser, io_streams_t &streams, wchar_t **argv) {
wcstring_list_t eval_errors;
bool result = expr->evaluate(eval_errors);
if (!eval_errors.empty() && !should_suppress_stderr_for_tests()) {
streams.err.append(L"test returned eval errors:\n");
for (size_t i = 0; i < eval_errors.size(); i++) {
streams.err.append_format(L"\t%ls\n", eval_errors.at(i).c_str());
if (!eval_errors.empty()) {
if (!should_suppress_stderr_for_tests()) {
for (size_t i = 0; i < eval_errors.size(); i++) {
streams.err.append_format(L"\t%ls\n", eval_errors.at(i).c_str());
}
}
return STATUS_INVALID_ARGS;
}
return result ? STATUS_CMD_OK : STATUS_CMD_ERROR;
}

View File

@@ -1078,9 +1078,13 @@ enum {
STATUS_CMD_OK = 0,
/// The status code used for failure exit in a command (but not if the args were invalid).
STATUS_CMD_ERROR = 1,
/// The status code used for invalid arguments given to a command. This is distinct from valid
/// arguments that might result in a command failure. An invalid args condition is something
/// like an unrecognized flag, missing or too many arguments, an invalid integer, etc. But
STATUS_INVALID_ARGS = 2,
/// The status code used when a command was not found.
STATUS_CMD_UNKNOWN = 127,
/// TODO: Figure out why we have two distinct failure codes for when an external command cannot
/// be run.
///
@@ -1095,10 +1099,6 @@ enum {
STATUS_ILLEGAL_CMD = 123,
/// The status code used when `read` is asked to consume too much data.
STATUS_READ_TOO_MUCH = 122,
/// The status code used for invalid arguments given to a command. This is distinct from valid
/// arguments that might result in a command failure. An invalid args condition is something
/// like an unrecognized flag, missing or too many arguments, an invalid integer, etc. But
STATUS_INVALID_ARGS = 121,
};
/* Normally casting an expression to void discards its value, but GCC

View File

@@ -388,3 +388,18 @@ int flock(int fd, int op) {
}
#endif // HAVE_FLOCK
#ifndef HAVE_WCSTOD_L
// musl doesn't feature wcstod_l,
// so we just wrap wcstod.
double wcstod_l(const wchar_t *enptr, wchar_t **endptr, locale_t loc) {
char *saved_locale = strdup(setlocale(LC_NUMERIC, NULL));
// Yes, this is hardcoded to use the "C" locale.
// That's the only thing we need, and uselocale(loc) broke in my testing.
setlocale(LC_NUMERIC, "C");
double ret = wcstod(enptr, endptr);
setlocale(LC_NUMERIC, saved_locale);
free(saved_locale);
return ret;
}
#endif // defined(wcstod_l)

View File

@@ -198,3 +198,7 @@ int flock(int fd, int op);
#endif
#endif
#ifndef HAVE_WCSTOD_L
double wcstod_l(const wchar_t *enptr, wchar_t **endptr, locale_t loc);
#endif

View File

@@ -2155,7 +2155,12 @@ static bool run_one_test_test(int expected, wcstring_list_t &lst, bool bracket)
argv[i + 1] = NULL;
io_streams_t streams(0);
int result = builtin_test(parser, streams, argv);
if (expected != result)
err(L"expected builtin_test() to return %d, got %d", expected, result);
delete[] argv;
return expected == result;
}
@@ -2207,13 +2212,13 @@ static void test_test() {
do_test(run_test_test(0, L"' 2' -eq 2"));
do_test(run_test_test(0, L"'2 ' -eq 2"));
do_test(run_test_test(0, L"' 2 ' -eq 2"));
do_test(run_test_test(1, L"' 2x' -eq 2"));
do_test(run_test_test(1, L"'' -eq 0"));
do_test(run_test_test(1, L"'' -ne 0"));
do_test(run_test_test(1, L"' ' -eq 0"));
do_test(run_test_test(1, L"' ' -ne 0"));
do_test(run_test_test(1, L"'x' -eq 0"));
do_test(run_test_test(1, L"'x' -ne 0"));
do_test(run_test_test(2, L"' 2x' -eq 2"));
do_test(run_test_test(2, L"'' -eq 0"));
do_test(run_test_test(2, L"'' -ne 0"));
do_test(run_test_test(2, L"' ' -eq 0"));
do_test(run_test_test(2, L"' ' -ne 0"));
do_test(run_test_test(2, L"'x' -eq 0"));
do_test(run_test_test(2, L"'x' -ne 0"));
do_test(run_test_test(1, L"-1 -ne -1"));
do_test(run_test_test(0, L"abc != def"));
do_test(run_test_test(1, L"abc = def"));
@@ -2284,6 +2289,10 @@ static void test_test() {
do_test(run_test_test(1, L"-4611686018427387904 -ge 4611686018427387904"));
do_test(run_test_test(1, L"4611686018427387904 -gt 4611686018427387904"));
do_test(run_test_test(0, L"4611686018427387904 -ge 4611686018427387904"));
// test out-of-range numbers
do_test(run_test_test(2, L"99999999999999999999999999 -ge 1"));
do_test(run_test_test(2, L"1 -eq -99999999999999999999999999.9"));
}
static void test_wcstod() {

View File

@@ -38,7 +38,7 @@ Test 22 pass
6 0
7 4
8 0
9 121
9 2
10 0 A
11 1 B