When expanding command substitutions, we use a naïve way of detecting whether
the cmdsub has the optional leading dollar. We check if the last character was
a dollar, which breaks if it's an escaped dollar. We wrongly expand
\$(echo "") to the empty string. Fix this by checking if the dollar was escaped.
The parse_util_* functions have a bunch of output parameters. We should
return a parameter bag instead (I think I tried once and failed).
Given
set var a
echo "$var$(echo b)"
the double-quoted string is expanded right-to-left, so we construct an
intermediate "$varb". Since the variable "varb" is undefined, this wrongly
expands to the empty string (should be "ab"). Fix this by isolating the
expanded command substitution internally. We do the same when handling
unquoted command substitutions.
Fixes#8849
The tmp and prompt variables collide with variables used as arguments.
Just avoid them entirely, at the cost of making the internals of the
functions somewhat more complicated.
Closes#8836.
fish reads the tty modes at startup, and tries to restore them to the
original values on exit, to be polite. However this causes problems when
fish is run in a pipeline with another process which also messes with the
tty modes. Example:
fish -c 'echo foo' | vim -
Here vim's manipulation of the tty would race with fish, and often vim
would end up with broken modes.
Only restore the tty if we are interactive. Fixes#8705.
This is a big cleanup to how tty transfer works. Recall that when job
control is active, we transfer the tty to jobs via tcsetpgrp().
Previously, transferring was done "as needed" in continue_job. That is, if
we are running a job, and the job wants the terminal and does not have it,
we will transfer the tty at that point.
This got pretty weird when running mixed pipelines. For example:
cmd1 | func1 | cmd2
Here we would run `func1` before calling continue_job. Thus the tty
would be transferred by the nested function invocation, and also restored
by that invocation, potentially racing with tty manipulation from cmd1 or
cmd2.
In the new model, migrate the tty transfer responsibility outside of
continue_job. The caller of continue_job is then responsible for setting up
the tty. There's two places where this gets done:
1. In `exec_job`, where we run a job for the first time.
2. In `builtin_fg` where we continue a stopped job in the foreground.
Fixes#8699
* Implement fish_wcstod_underscores
* Add fish_wcstod_underscores unit tests
* Switch to using fish_wcstod_underscores in tinyexpr
* Add tests for math builtin underscore separator functionality
* Add documentation for underscore separators for math builtin
* Add a changelog entry for underscore numeric separators
Helm 3 provides an autogenerated completion since version 3.4.0.
The previous implementation is replaced by this because it was specific to the
now-deprecated helm 2.
The completions appear to be fully featured including descriptions and
completion for dynamic arguments such as namespaces and releases.
Their names are not perfect, so let's keep them as internal functions,
until we figure out how/if we want to expose this.
This reverts 0445126c2 (Undunder __fish_is_nth_token, 2021-06-29) (but I
did it without "git revert").
Closes#8008
If you have vim set up to recognize `.editorconfig` files, the 80-char limit
from ours causes vim to keep chopping lines. This makes it ignore that limit
when editing `CHANGELOG.rst`
Say the user has a multi-char binding (typically an escape sequence), and a
signal arrives partway through the binding. The signal has an event handler
which enques some readline event, for example, `repaint`. Prior to this
change, the readline event would cause the multi-char binding to fail. This
would cause bits of the escape sequence to be printed to the screen.
Fix this by noticing when a sequence was "interrupted" by a non-char event,
and then rotating a sequence of such interruptions to the front of the
queue.
Fixes#8628
Today, a command like "var=val status " has custom completions
because we skip over the var=val variable override when detecting
the command token.
However if the custom completions read the commandline state (via
"commandline -opc") they do see they variable override, which breaks
them, most likely. Try "a=b git ".
For completions of wrapped commands, we already set a transient
commandline. Do the same for commands with leading variable overrides;
then git completions for "a=b git " will think the commandline is
"git ".
I used the command from #8092 to list issues/PRs with missing changelog
entries, and went through most of them and added them to the changelog
(or the "ignore" list).
This commit message lists the processed issues in a consistent format,
and lists the action/reason. For each issue/PR there are twolines:
- Issue/PR number + subject
- (I used bare issue numbers to avoid cross-referencing on github).
- verdict
- "added new entry" means that we add a changelog line
- "added to existing entry" means that we added the issue link to an existing
changelog line. Usually we don't add multiple issue links, but sometimes
there are multiple interesting issues.
- if the verdict ends with ", ignoring", we added it to the "ignore" list in
the changelog.
The issues are grouped by verdict, with the interesting/leftover ones
on top.
The "gh" script is already a quantum leap but we should still find
better ways to share the burden of writing the changelog.
I noticed that there are many minor updates that can probably be
ignored. Filtering them out doesn't take much time but it adds up,
especially if it's a single person doing it.
Here's the adapted script I used:
for issue in (gh issue list --state closed --milestone "fish 3.4.0" -L 500 | sort -n | cut -f 1)
egrep --quiet '\W'$issue CHANGELOG.rst; or echo https://github.com/fish-shell/fish-shell/issues/$issue
end
for pr in (gh pr list --state all --search "milestone:\"fish 3.4.0\"" -L 500 | sort -n | cut -f 1)
egrep --quiet '\W'$pr CHANGELOG.rst; or echo https://github.com/fish-shell/fish-shell/pull/$pr
end
---
Issue 8153: Work around `setpgid` error on older Apple platforms
workaround for old OSs for which we've since dropped support, ignoring
Issue 8511: math: (n n): incorrect error
improved error output, which is very nice but too minor, ignoring
Issue 8205: Fish autocomplete error on iOS procursus
niche fix, ignoring
Issue 8271: Fix `fish_key_reader` wrapper check
minor update to not create a harmless alias for fish_key_reader, ignoring
Issue 8289: funced dosn't like backslash escapes in function names
minor escaping fix, ignoring
Issue 8310: Hide whatis database building from the user
not something many users would notice in the first place, ignoring
Issue 8368: Duplicated "Type 'help argparse' for related documentation" for argparse
minor update to error message, ignoring
Issue 8444: Variable highlight color does not span lines
very obscure fix, ignoring
Issue 8195: Errors when trying to autocomplete (invalid) UTF-8 escapes
niche fix, ignoring
Issue 8308: assertion normal_exited() failed related to paged builtin help
niche fix, ignoring
Issue 8358: sigsegv on set --show variable (when LANG is set to fr_FR.utf8)
niche(?) fix, ignoring
Issue 8170: Builtin math ncr can be extremely slow
performance improvement only when the input is NaN, ignoring
Issue 8204: Always use LC_NUMERIC=C internally
performance improvement for math, ignoring
---
Issue 8295: Add --function to `read`
added to existing entry (565)
Issue 8283: Added completions for ethtool
added to existing entry
Issue 8315: Add dart completion
added to existing entry
Issue 8330: Add common lisp completions(sbcl/roswell)
added to existing entry
Issue 8354: Fix st issue with shift+tab
added to existing entry (8352)
Issue 8391: Support vi-mode cursors in Foot Terminal
added to existing entry (8167)
Issue 8405: Completions pager should redraw if the subbed completion wraps/unwraps the line
added to existing entry (8509)
---
Issue 8530: Speed up, fix fish_status_to_signal 8530
added new entry
Issue 8547: command -v nonexistent should exit 127
added new entry
Issue 8431: Abbr -q return status inconsistent
added new entry
Issue 8428: Binding escape as user binding breaks escape sequence bindings (arrows, etc)
added new entry
Issue 8483: Windows "color" command completion
added new entry
Issue 8087: Doesn't build when using netbsd curses on Linux
added new entry
Issue 8152: Don't override linker
added new entry
Issue 8156: Add completions for `git-sizer`
added new entry
Issue 8163: `d3ceba107e88b6c6e1a0358ebcb30366aeef653f` causes issues with repainting multi-line prompt
added new entry
Issue 8175: Completion sometimes missing the last token
added new entry
Issue 8179: `set -S` should mark read-only variables
added new entry
Issue 8209: Slow interaction between backgrounding, universal variables, and repainting
added new entry
Issue 8274: Unsetting `$fish_emoji_width` doesn't clear the cached width
added new entry
Issue 8298: If prompt ends in an empty line, the commandline is inserted at the width of the line before
added new entry
Issue 8309: colors don't kick in for ls on macOS Big Sur, Monterey (and maybe FreeBSD)
added new entry
Issue 8337: Adds sub-command clear-session to history command. Issue 5791
added new entry (as 5791)
Issue 8352: Fix delete-key in st
added new entry
Issue 8373: Add clasp completion
added new entry
Issue 8434: argparse completions
added new entry
Issue 8510: fish_key_reader ^C warning isn't right
added new entry
Issue 8519: Use `--almost-all` in `la` function
added new entry
---
Issue 1363: improve the experience of using fish over mosh
listed as 8376, ignoring
Issue 8305: incomplete man page completions
listed as 8309, ignoring
Issue 8059: Support "$(cmd)" command substitution without line splitting
listed as 159, ignoring
Issue 8127: fish_config: Read colorschemes from .theme files
listed as 8132, ignoring
Issue 8130: funced: edit the whole file, not just the function definition
listed as 391, ignoring
Issue 8270: builtin cd: print error about broken symlink
listed as 8264, ignoring
Issue 8306: fix man completion for BSD's mandoc
listed as 8305, ignoring
Issue 8441: Don't escape tildes that come from custom completions
listed as 8441, ignoring
---
Issue 8429: `cargo run --example` completions break with nested example directories
update to existing completions, ignoring
Issue 8446: Use `cargo run --example` to get list of examples
update to existing completions, ignoring
Issue 8338: Display local branches before unique remote branches in git completion
update to existing completions, ignoring
Issue 8118: Node completion: add v8 sparkplug option
update to existing completions, ignoring
Issue 8183: Add zypper subcommands completion
update to existing completions, ignoring
Issue 8184: completion nmap: suppress warning when local scripts folder exists
update to existing completions, ignoring
Issue 8191: add missing `git commit` completions
update to existing completions, ignoring
Issue 8192: Updated ping completions
update to existing completions, ignoring
Issue 8202: Add `--function` to `set` completion
update to existing completions, ignoring
Issue 8219: completion: support `--no` prefixes for mpv flag options
update to existing completions, ignoring
Issue 8241: complete "mpc load"
update to existing completions, ignoring
Issue 8243: Add and fix completions for new options
update to existing completions, ignoring
Issue 8249: Fix completions/ls.fish
update to existing completions, ignoring
Issue 8256: Fix completions/coredumpctl.fish and add new complete
update to existing completions, ignoring
Issue 8311: completions/git: Handle "1 .T" & "1 AT" files
update to existing completions, ignoring
Issue 8323: completions/xbps-query: add missing `-p` completions
update to existing completions, ignoring
Issue 8326: Update ldapsearch.fish
update to existing completions, ignoring
Issue 8327: small fix completions/duply.fish
update to existing completions, ignoring
Issue 8334: Update ip.fish
update to existing completions, ignoring
Issue 8344: Fix ant completion
update to existing completions, ignoring
Issue 8365: Update dmesg completions
update to existing completions, ignoring
Issue 8367: No hints for -g|--global and -U|--universal flags for abbr command
update to existing completions, ignoring
Issue 8381: Updated systemd-analyze completions
update to existing completions, ignoring
Issue 8406: vmctl completion function call needs to be quoted
update to existing completions, ignoring
Issue 8480: pabcnetcclear command completion update
update to existing completions, ignoring
---
Issue 8495: Stop linking to StackOverflow
doc update, ignoring
Issue 8176: document `--no-config`
doc update, ignoring
Issue 8260: Theme demo needs to be adjusted so that only unmatched quote is an error
doc update, ignoring
Issue 8380: no error about wrong >>? redirection operator
doc update, ignoring
Issue 8385: set -l works outside of command block
doc update, ignoring
Issue 8409: Some enhancements to "for" and "while" loop pages
doc update, ignoring
Issue 8439: Html docs: Remove link underlines again?
doc update, ignoring
Issue 8457: Old-style options support "=" assignment operator in complete builtin
doc update, ignoring
Issue 8522: Document prompt_hostname
doc update, ignoring
---
Issue 8221: edit_command_buffer: use "command" to ignore any functions with the same name
only helps broken systems, ignoring
Issue 8287: Prepend command to cat
only helps broken systems, ignoring
Issue 8299: Make less version check compatible with older Fish
only helps broken systems, ignoring
Issue 8487: fish_config doesn't work without curses module
only helps broken systems, ignoring
---
Issue 8128: fix 'socket file name too long' error
test fix with long tempdirs (macOS), not really user-visible, ignoring
Issue 8449: Give tests a more generic name
not user-visible, ignoring
Issue 8353: string tests sometimes failing on macOS (Github Actions)
not user-visible, ignoring
Issue 6477: history merge test fails on OpenBSD
not user-visible, ignoring
---
Issue 8471: Obtain Deno completions from itself
update to an unreleased feature (7138), ignoring
Issue 8253: `string length --visible` performance
update to an unreleased feature, ignoring
Issue 8277: Backspace character is ignored when calculating string widths
update to an unreleased feature, ignoring
Issue 8314: `fish_config choose` leaves previous right prompt in place
update to an unreleased feature, ignoring
Issue 8394: parenthesis characters outer of $(command substitution) in string cause error
update to an unreleased feature, ignoring
Issue 8500: Parser bug with command substitutions in strings inside parenthesis
update to an unreleased feature, ignoring
Issue 8419: fish_config: silently doesn't set color schemes.
regression, not in any release, ignoring
Issue 8438: :program: in sphinx doesn't link
regression, not in any release, ignoring
Issue 8478: __fish_seen_argument.fish throws exception when autocompleting
regression, not in any release, ignoring
---
Issue 8280: Fix typo in abbr docs
typofix, ignoring
Issue 8321: Fix typo in `set_colors` command documentation
typofix, ignoring
Issue 8257: Typo funcions -> functions
typofix, ignoring
---
Issue 8206: remove make_pair
no behavior change, ignoring
Issue 8222: replace push_back with emplate_back
no behavior change, ignoring
Issue 8224: clang-tidy: remove pointless virtual
no behavior change, ignoring
Issue 8227: change value to rvalue reference
no behavior change, ignoring
Issue 8228: convert const ref to rvalue ref
no behavior change, ignoring
Issue 8229: clang-tidy: use for range loops
no behavior change, ignoring
Issue 8230: fix deleted constructors
nno behavior change, ignoring
Issue 8231: clang-tidy: const reference conversions
no behavior change, ignoring
Issue 8235: clang-tidy: simplify two bool returns
no behavior change, ignoring
Issue 8237: clang-tidy: replace size comparisons with empty
no behavior change, ignoring
Issue 8239: clang-tidy: replace NULL with nullptr
no behavior change, ignoring
Issue 8252: add constexpr
no behavior change, ignoring
Issue 8430: __fish_seen_subcommand_from and __fish_seen_argument update
no behavior change (apart from a regression that's fixed), ignoring
Issue 8476: Run fish_indent on all non-test .fish files
no behavior change, ignoring
Issue 8477: Use test command instead of bracket command
no behavior change, ignoring
Issue 8521: Fix code scanning alert - Wrong type of arguments to formatting function
no behavior change, ignoring
Issue 8236: clang-tidy: replace push_back with emplace_back
no behavior change, ignoring
---
Use the remaining_to_disclose count to determine if all completions
are shown (allows consistent behavior between short and long completion
lists).
Closes#8485
A completion entry like «complete -a '\\~'» results in completions
that insert \~ into the command line. However we usually want to
insert ~, but there is no way to do that.
There are a couple of longstanding issues about completion escaping
[1]. Until we fix those in a general way, fix the common case by
never escaping tildes when applying custom completions to the command
line. This is a hack but will probably work out fine because we don't
expect literal tildes in arguments.
The tilde is included in completions for cdh, or
__fish_complete_suffix, which simply forwards results from "complete
-C". Revert a workaround to cdh that expanded ~, because we can now
render that without escaping.
Closes#4570, #8441
[ja: tweak patch and commit message]
[1]: https://github.com/fish-shell/fish-shell/pull/8441#discussion_r748803338
Currently,
set -q --unpath PATH
simply ignores the "--unpath" bit (and same for "--path").
This changes it, so just like exportedness you can check pathness.
On a commandline like "ls arg" (cursor at end) we do not expand
abbrevations on enter. OTOH, on "ls " we do expand. This can be
frustrating because it means that the two obvious ways to suppress
abbrevation expansion (C-Space or post-expansion C-Z) cannot be used to
suppress expansion of a command without arguments. (One workaround is
"ls #".)
Only expand-on-execute if the cursor is at the command name (no space
in between).
This is a strict improvement for realistic scenarios, because if there
is a space, the user has already expressed the intent to not expand
the abbreviation. (I hope no one is using recursive abbreviations.)
Closes#8423
- More Notable
- Put ``_`` change into deprecation
- Things that can happen in scripts are scripting improvements, not
- interactive (funced is an interactive thing)
- Fix the variable name to turn off autosuggestions - it's $fish_autosuggestion_enabled.
This fixes printing octal and hex values that are negative or larger
than UINT_MAX.
Negative values get a leading -, like:
> math --base hex -10
-0xa
Fixes#8417.
This program uses the Cobra framework for argument parsing and completion generation.
Just source the completions supplied by upstream.
This works around "go install" not being able to install completions files (only binaries).
Similar to `test`, `_` is so likely to at least slow down if not
break all things catastrophically that it ought not be allowed as a
function name. Fixes#8342
Mac OS 10.9 does not have the fstatat function which fish started
calling in commit 71a0d839a7. Let's end support for 10.9, which was
released in 2013.
The less -F / --quit-if-one-screen option is buggy before v530. To work
around this, pass --no-init less versions older than 530.
The --no-init option was previously passed; it was removed in d15a51897d
for mouse support. Unfortunately it looks like we can't have mouse
support and --quit-if-one-screen on macOS shipped less (version 487).
It's worth fixing this because otherwise history and help is just not
printed on stock macOS.
Relevant is https://unix.stackexchange.com/questions/107315/less-quit-if-one-screen-without-no-initFixes#8157.
Now that we removed EROTTEN which had the same error code as EPERM,
we can give a less confusing error in case a user has not allowed
their terminal access to a directory.
See #8264
When cd is passed a broken symlink, this changes the error message from
"no such directory" to "broken symbolic link". This scenario probably
won't happen very often since completion won't suggest broken symlinks
but it can't hurt to give a good error.
Fish used to do this until 7ac5932. This logic used to be in
path_get_cdpath, however, that is only used for highlighting, so we
don't need error messages there. Changing cd is enough.
Reword from "rotten" to "broken" since that's what file(1) uses.
Clean-up leftovers from old "rotten" code (nomen est omen).
See #8264
This disables job control inside command substitutions. Prior to this
change, a cmdsub might get its own process group. This caused it to fail
to cancel loops properly. For example:
while true ; echo (sleep 5) ; end
could not be control-C cancelled, because the signal would go to sleep,
and so the loop would continue on. The simplest way to fix this is to
match other shells and not use job control in cmdsubs.
Related is #1362
This is opt-in through a new feature flag "ampersand-nobg-in-token".
When this flag and "qmark-noglob" are enabled, this command no longer
needs quoting:
curl https://example.com/thing?foo=bar&duran=duran
Compared to the previous approach e1570a4 ("Let '&' only separate as
the first char of a word"), this has some advantages:
1. "&&" and "&>" are no longer affected. They are still special, even
if used between tokens without spaces, like "echo bar&>foo".
Maybe this is not really *better*, but it avoids risking to annoy
users by breaking the old variant.
2. "&" is still special if at the end of a token, like in "sleep 1&".
Word movement is not affected by the semantics change, so Alt-F and
friends still stop at every "&".
When the user presses control-C, fish marks a cancellation signal which
prevents fish script from running, allowing it to properly unwind.
Prior to this commit, the signal was cleared in the reader. However this
missed the case where a binding would set $fish_bind_mode which would
trigger event handlers: the event handlers would be skipped because of
the cancellation flag was still set. This is similar to #6937.
Let's clear the flag earlier, as soon as we it's set, in inputter_t.
Fixes#8125.
This introduces two functions to
- toggle a process prefix, used for adding "sudo"
- add a job suffix, used for adding "&| less"
Not sure if they are very useful; we'll see.
Closes#7905
Document the last few changes and move some of the things out of
"Interactive" into more specific categories. If it's to do with
completions, it goes into completions. Bindings? How about "Bindings"?
* add support for colorized ls on openbsd
* add changelog line for colorls support
* add readme line for colorls support
* determine ls command at runtime, don't cache it
* eliminate __fish_ls_command function
Now that `$last_pid` is never fish's pid, we no longer need to force
jobs to run in their own pgroup. Restore the job control behavior to
what it was prior, so that signals may be delivered properly in
non-interactive mode.
This reverts commit 3255999794
Prior to this change, a function with an on-job-exit event handler must be
added with the pgid of the job. But sometimes the pgid of the job is fish
itself (if job control is disabled) and the previous commit made last_pid
an actual pid from the job, instead of its pgroup.
Switch on-job-exit to accept any pid from the job (except fish itself).
This allows it to be used directly with $last_pid, except that it now
works if job control is off. This is implemented by "resolving" the pid to
the internal job id at the point the event handler is added.
Also switch to passing the last pid of the job, rather than its pgroup.
This aligns better with $last_pid.
When a job is placed in the background, fish will set the `$last_pid`
variable. Prior to this change, `$last_pid` was set to the process group
leader of the job. However this caussed problems when the job ran in
fish's process group, because then fish itself would be the process group
leader and commands like `wait` would not work.
Switch `$last_pid` to be the actual last pid of the pipeline. This brings
it in line with the `$!` variable from zsh and bash.
This is technically a breaking change, but it is unlikely to cause
problems, because `$last_pid` was already rather broken.
Fixes#5036Fixes#5832Fixes#7721
It is possible to run a function when a process exits via `function
--on-process-exit`, or when a job exits via `function --on-job-exits`.
Internally these were distinguished by the pid in the event: if it was
positive, then it was a process exit. If negative, it represents a pgid
and is a job exit. If zero, it fires for both jobs and processes, which is
pretty weird.
Switch to tracking these explicitly. Separate out the --on-process-exit
and --on-job-exit event types into separate types. Stop negating pgids as
well.
This switches builtin_wait from waiting on jobs in the active job list, to
waiting on the wait handles. The wait handles may be either derived from
the job list itself, or from saved wait handles from jobs that exited in
the background.
Fixes#7210
Prior to this fix, an escaped character like \x41 (hex for ascii A)
was interpreted the same was as A, so that $\x41 would be the same
as $A. Fix this by inserting an INTERNAL_SEPARATOR before these escapes,
so that we no longer treat it as part of the variable name.
This also affects brackets; don't treat echo $foo\1331\135 the same as
echo $foo[1].
Fixes#7969
In many cases we currently discard escaped newlines, since they
are often unnecessary (when used around &|;). Escaped newlines
are useful for structuring argument lists. Allow them for variable
assignments since they are similar.
Closes#7955
This refactors the behavior of string match with capture groups to
correctly handle multiple arguments. Now the variable capture applies to
the first match, as documented. Fixes#7938.
string match is documented as setting an unset variable if a capture group
is unmatched in an otherwise matched regex, and if the `--all` flag is not
provided. However prior to this fix, it instead set a variable containing
the empty string as a single value. Correct the implementation to match
the documentation.
Note that if the `--all` flag is provided we continue to set empty
strings, which is documented.
This correctly sets $status when a builtin succeeds but its output fails;
for example if the output is redirected to a file and that write fails.
Fixes#7857