-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support "$(cmd)" command substitution without line splitting #8059
Support "$(cmd)" command substitution without line splitting #8059
Conversation
If you can hold this for another few days, I think it would be worth waiting until after 3.3.0 to merge. |
cbcee44
to
7f5b3ff
Compare
Just want to drop a massive THANK YOU to @krobelus for getting the ball rolling on this – it's the one of the very few pieces of syntactic sugar (along with process substitution I appreciate the implementation isn't perfect in its current form, but having compiled and briefly tested it locally, I'm a very happy end user and can't wait to see it merged! 🎉 The only thing I might suggest is that the following error message is improved slightly:
Perhaps something like this is more suitable now:
|
Good idea, maybe even |
In bash, it should rarely be used because it splits on spaces ($IFS, to be exact). In fish, we could just split on newlines like we already do in To be honest I find it weird to merge this without support outside of quotes, because it's weirdly in the middle between support and not. |
Having read through the issues again, I think everyone agrees on adding If we make We could also look at how often the
I'm probably guilty of doublethink, but I think it's sort of consistent, because it's the obvious way to evaluate a command substitution inside double quotes. So I wouldn't mind adding it earlier. I'm not against Another random idea: disable the line splitting in |
That's just the thing - if it's the obvious way to do a command substitution inside double quotes, then it's also the obvious way to do it outside. Or, to come at it from another angle: This is an FAQ (not formally - there's a question about backticks instead - but given what we see. There is also an entry in fish-for-bash-users). We have users asking for this all the time. We have the opportunity to entirely remove that. I don't see the benefit in removing |
I’m with @faho: once |
The current error message on
I wonder if that will happen for |
7f5b3ff
to
095d2eb
Compare
Sorry for delay in getting to this - I've also been working on this but it looks like yours is a lot further along! Agreed with supporting unquoted |
i like the idea of supporting a way of quoted command substitution because it removes worries about a substitution returning a list or nothing and "corrupting" the string you're building. however i heavily disagree on supporting unquoted $ set 1 one; set 2 two; set 3 three
$ echo $(seq 3)
one two three
$ echo $(echo 2)
two if this is not supported and constructs with the new quoted substitution like $ set foobar foo bar
$ echo $"foo$(echo -n bar)"
foo bar dont work either, i fear we close the door to generative variable expansion forever and would miss out on a powerful feature for all the wrong reasons. |
If I understand correctly, by "generative variable expansion" you mean for a command substitution to output the name of a variable, and then expand that, as a shorthand:
Can you say more about why that's a powerful feature? Do other shells support this? |
That sounds like a nice feature for power users but I think it's rarely used in practice. Moreover, most users will probably expect the Bash behavior, so anything but that or an error message will catch them offguard. |
@krobelus I stand in awe. My approach was to teach fish about cmdsubs in quotes everywhere, which meant a lot of complexity and recursion. Your trick of making cmdsubs "temporarily close" quotes is so brilliantly simple, I would not have believed it possible! I learned from it today. There's a bug with escaping the output in
because the double-quote is not escaped. Backslash has the same problem. You may steal my function here which escapes a string so it may be inserted unchanged in double quotes. A second point is brackets:
do we want to support these? I go back and forth on this: the argument for support is consistency with variable expansion, but it feels like it would be a rarely used feature that users might trip over. Either way we should be deliberate about it and mention it in the docs. |
rediculousfish yes, i think you understand correctly.
im not sure
its about composability. shell scripting is awesome because you just make up whatever you need by connecting and substituting whats needed. but this is severely hindered when its painful to get the value of a variable you know the name of but cant access by simply throwing a dollar at it. fish doesn't have dictionaries and can't store lists in lists. allowing explicit variable expansion would make getting around that way more easy, performant, intuitive and powerful. having these data structures enables a whole new level of expressivness in your code. |
@marcusatiliusregulus From what little explanation you've given here, it would not be more powerful, as it's simply a shortcut. Would it be any easier, more performant or more intuitive? I'm not sold. Anyway, if you really wanted this supported, the way to do it would be to write up a proposal and ideally submit a patch, not vaguely allude to it in an entirely different PR. And if you want Pick something else, and explain where the power comes from! |
68846ff
to
04eb08f
Compare
ok, let me try to explain. why is it more powerful (imo): variable assignment and -lookup are quicker than manipulating lists is it simply a shortcut? argueably. but considere this: if i cannot |
May I point out that it's not just consistency with variable expansion, but also consistency with unquoted command substitutions? If fish supports unquoted I always find it helpful to imagine how I’d explain the feature to a fish newbie: of “command substitution is |
04eb08f
to
409415e
Compare
Yeah, it's simpler to just reuse the existing command-substitution parsing, since the behavior is almost the same. Fixed the bug with |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This LGTM, it's really great!
This adds a hack to the parser. Given a command echo "x$()y z" we virtually insert double quotes before and after the command substitution, so the command internally looks like echo "x"$()"y z" This hack allows to reuse the existing logic for handling (recursive) command substitutions. This makes the quoting syntax more complex; external highlighters should consider adding this if possible. The upside (more Bash compatibility) seems worth it. Closes fish-shell#159
For consistency with "$(cmd)" and with other shells.
409415e
to
bf5d2d1
Compare
@marcusatiliusregulus If I understand what you want correctly, surely you can define a function using |
If we wanted this the most natural syntax would be As it stands, I'd recommend spelling it out with a temp variable over having to define your own function with "--no-scope-shadowing": set -l tmp (echo foo)
echo $$tmp In my experience it's rarely needed - not never, but also not particularly often. So I'm not sold that we need a shortcut for it, but if we did |
yeah, looks good to me, ill use that. thanks |
I used the command from fish-shell#8092 to list issues/PRs with missing changelog entries, and went through most of them. Each issue gets three lines - subject - URL - verdict If the verdict ends with ", ignoring", I added it the the ignored list in the changelog. The issues are grouped by verdict, with the interesting/leftover ones on top (obviously no need to double check *everything*). The "gh" script is already a quantum leap we can still find better ways to share the changelog burden. 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. --- Issue/PR title: Make --no-config mode more comfortable fish-shell#8493 in-flight Issue/PR title: Debian fish binary package difficult to install fish-shell#7845 TODO Issue/PR title: Work around `setpgid` error on older Apple platforms fish-shell#8153 this extends 7474, which wasn't listed either, we should probably mention it? Issue/PR title: Abbr -q return status inconsistent fish-shell#8431 fixes return status of "abbr -q", should we mention this? Issue/PR title: math: (n n): incorrect error fish-shell#8511 improved error output, which is very nice but too minor? Issue/PR title: Fish autocomplete error on iOS procursus fish-shell#8205 niche fix, ignoring Issue/PR title: Fix `fish_key_reader` wrapper check fish-shell#8271 minor update to not create a harmless alias for fish_key_reader, ignoring Issue/PR title: funced dosn't like backslash escapes in function names fish-shell#8289 minor escaping fix, ignoring Issue/PR title: Hide whatis database building from the user fish-shell#8310 not something many users would notice in the first place, ignoring Issue/PR title: Duplicated "Type 'help argparse' for related documentation" for argparse fish-shell#8368 minor update to error message, ignoring Issue/PR title: Variable highlight color does not span lines fish-shell#8444 very obscure fix, ignoring --- Issue/PR title: Add --function to `read` fish-shell#8295 added to existing entry (565) Issue/PR title: Added completions for ethtool fish-shell#8283 added to existing entry Issue/PR title: Add dart completion fish-shell#8315 added to existing entry Issue/PR title: Add common lisp completions(sbcl/roswell) fish-shell#8330 added to existing entry Issue/PR title: Fix st issue with shift+tab fish-shell#8354 added to existing entry (8352) Issue/PR title: Support vi-mode cursors in Foot Terminal fish-shell#8391 added to existing entry (8167) Issue/PR title: Completions pager should redraw if the subbed completion wraps/unwraps the line fish-shell#8405 added to existing entry (8509) --- Issue/PR title: Binding escape as user binding breaks escape sequence bindings (arrows, etc) fish-shell#8428 added new entry Issue/PR title: Windows "color" command completion fish-shell#8483 added new entry Issue/PR title: Doesn't build when using netbsd curses on Linux fish-shell#8087 added new entry Issue/PR title: Don't override linker fish-shell#8152 added new entry Issue/PR title: Add completions for `git-sizer` fish-shell#8156 added new entry Issue/PR title: `d3ceba107e88b6c6e1a0358ebcb30366aeef653f` causes issues with repainting multi-line prompt fish-shell#8163 added new entry Issue/PR title: Builtin math ncr can be extremely slow fish-shell#8170 added new entry Issue/PR title: Completion sometimes missing the last token fish-shell#8175 added new entry Issue/PR title: `set -S` should mark read-only variables fish-shell#8179 added new entry Issue/PR title: Errors when trying to autocomplete (invalid) UTF-8 escapes fish-shell#8195 added new entry Issue/PR title: Always use LC_NUMERIC=C internally fish-shell#8204 added new entry Issue/PR title: Slow interaction between backgrounding, universal variables, and repainting fish-shell#8209 added new entry Issue/PR title: Unsetting `$fish_emoji_width` doesn't clear the cached width fish-shell#8274 added new entry Issue/PR title: If prompt ends in an empty line, the commandline is inserted at the width of the line before fish-shell#8298 added new entry Issue/PR title: assertion normal_exited() failed related to paged builtin help fish-shell#8308 added new entry Issue/PR title: colors don't kick in for ls on macOS Big Sur, Monterey (and maybe FreeBSD) fish-shell#8309 added new entry Issue/PR title: Adds sub-command clear-session to history command. Issue fish-shell#5791 fish-shell#8337 added new entry (as 5791) Issue/PR title: Display local branches before unique remote branches in git completion fish-shell#8338 added new entry Issue/PR title: Fix delete-key in st fish-shell#8352 added new entry Issue/PR title: sigsegv on set --show variable (when LANG is set to fr_FR.utf8) fish-shell#8358 added new entry Issue/PR title: Add clasp completion fish-shell#8373 added new entry Issue/PR title: `cargo run --example` completions break with nested example directories fish-shell#8429 added new entry Issue/PR title: argparse completions fish-shell#8434 added new entry Issue/PR title: Stop linking to StackOverflow fish-shell#8495 added new entry Issue/PR title: fish_key_reader ^C warning isn't right fish-shell#8510 added new entry Issue/PR title: Use `--almost-all` in `la` function fish-shell#8519 added new entry --- Issue/PR title: improve the experience of using fish over mosh fish-shell#1363 listed as 8376, ignoring Issue/PR title: incomplete man page completions fish-shell#8305 listed as 8309, ignoring Issue/PR title: Support "$(cmd)" command substitution without line splitting fish-shell#8059 listed as 159, ignoring Issue/PR title: fish_config: Read colorschemes from .theme files fish-shell#8127 listed as 8132, ignoring Issue/PR title: funced: edit the whole file, not just the function definition fish-shell#8130 listed as 391, ignoring Issue/PR title: builtin cd: print error about broken symlink fish-shell#8270 listed as 8264, ignoring Issue/PR title: fix man completion for BSD's mandoc fish-shell#8306 listed as 8305, ignoring Issue/PR title: Don't escape tildes that come from custom completions fish-shell#8441 listed as 8441, ignoring Issue/PR title: Use `cargo run --example` to get list of examples fish-shell#8446 listed as 8429, ignoring --- Issue/PR title: Node completion: add v8 sparkplug option fish-shell#8118 update to existing completions, ignoring Issue/PR title: Add zypper subcommands completion fish-shell#8183 update to existing completions, ignoring Issue/PR title: completion nmap: suppress warning when local scripts folder exists fish-shell#8184 update to existing completions, ignoring Issue/PR title: add missing `git commit` completions fish-shell#8191 update to existing completions, ignoring Issue/PR title: Updated ping completions fish-shell#8192 update to existing completions, ignoring Issue/PR title: Add `--function` to `set` completion fish-shell#8202 update to existing completions, ignoring Issue/PR title: completion: support `--no` prefixes for mpv flag options fish-shell#8219 update to existing completions, ignoring Issue/PR title: complete "mpc load" fish-shell#8241 update to existing completions, ignoring Issue/PR title: Add and fix completions for new options fish-shell#8243 update to existing completions, ignoring Issue/PR title: Fix completions/ls.fish fish-shell#8249 update to existing completions, ignoring Issue/PR title: Fix completions/coredumpctl.fish and add new complete fish-shell#8256 update to existing completions, ignoring Issue/PR title: completions/git: Handle "1 .T" & "1 AT" files fish-shell#8311 update to existing completions, ignoring Issue/PR title: completions/xbps-query: add missing `-p` completions fish-shell#8323 update to existing completions, ignoring Issue/PR title: Update ldapsearch.fish fish-shell#8326 update to existing completions, ignoring Issue/PR title: small fix completions/duply.fish fish-shell#8327 update to existing completions, ignoring Issue/PR title: Update ip.fish fish-shell#8334 update to existing completions, ignoring Issue/PR title: Fix ant completion fish-shell#8344 update to existing completions, ignoring Issue/PR title: Update dmesg completions fish-shell#8365 update to existing completions, ignoring Issue/PR title: No hints for -g|--global and -U|--universal flags for abbr command fish-shell#8367 update to existing completions, ignoring Issue/PR title: Updated systemd-analyze completions fish-shell#8381 update to existing completions, ignoring Issue/PR title: vmctl completion function call needs to be quoted fish-shell#8406 update to existing completions, ignoring Issue/PR title: pabcnetcclear command completion update fish-shell#8480 update to existing completions, ignoring --- Issue/PR title: document `--no-config` fish-shell#8176 doc update, ignoring Issue/PR title: Theme demo needs to be adjusted so that only unmatched quote is an error fish-shell#8260 doc update, ignoring Issue/PR title: no error about wrong >>? redirection operator fish-shell#8380 doc update, ignoring Issue/PR title: set -l works outside of command block fish-shell#8385 doc update, ignoring Issue/PR title: Some enhancements to "for" and "while" loop pages fish-shell#8409 doc update, ignoring Issue/PR title: Html docs: Remove link underlines again? fish-shell#8439 doc update, ignoring Issue/PR title: Old-style options support "=" assignment operator in complete builtin fish-shell#8457 doc update, ignoring Issue/PR title: Document prompt_hostname fish-shell#8522 doc update, ignoring --- Issue/PR title: edit_command_buffer: use "command" to ignore any functions with the same name fish-shell#8221 only helps broken systems, ignoring Issue/PR title: Prepend command to cat fish-shell#8287 only helps broken systems, ignoring Issue/PR title: Make less version check compatible with older Fish fish-shell#8299 only helps broken systems, ignoring Issue/PR title: Skip leading `command` in `__fish_man_page` fish-shell#8447 only helps broken systems, ignoring Issue/PR title: fish_config doesn't work without curses module fish-shell#8487 only helps broken systems, ignoring --- Issue/PR title: fix 'socket file name too long' error fish-shell#8128 test fix with long tempdirs (macOS), not really user-visible, ignoring Issue/PR title: Give tests a more generic name fish-shell#8449 not user-visible, ignoring Issue/PR title: string tests sometimes failing on macOS (Github Actions) fish-shell#8353 not user-visible, ignoring Issue/PR title: history merge test fails on OpenBSD fish-shell#6477 not user-visible, ignoring --- Issue/PR title: Obtain Deno completions from itself fish-shell#8471 update to an unreleased feature (7138), ignoring Issue/PR title: `string length --visible` performance fish-shell#8253 update to an unreleased feature, ignoring Issue/PR title: Backspace character is ignored when calculating string widths fish-shell#8277 update to an unreleased feature, ignoring Issue/PR title: `fish_config choose` leaves previous right prompt in place fish-shell#8314 update to an unreleased feature, ignoring Issue/PR title: parenthesis characters outer of $(command substitution) in string cause error fish-shell#8394 update to an unreleased feature, ignoring Issue/PR title: Parser bug with command substitutions in strings inside parenthesis fish-shell#8500 update to an unreleased feature, ignoring Issue/PR title: fish_config: silently doesn't set color schemes. fish-shell#8419 regression, not in any release, ignoring Issue/PR title: :program: in sphinx doesn't link fish-shell#8438 regression, not in any release, ignoring Issue/PR title: __fish_seen_argument.fish throws exception when autocompleting fish-shell#8478 regression, not in any release, ignoring --- Issue/PR title: Fix typo in abbr docs fish-shell#8280 typofix, ignoring Issue/PR title: Fix typo in `set_colors` command documentation fish-shell#8321 typofix, ignoring Issue/PR title: Typo funcions -> functions fish-shell#8257 typofix, ignoring --- Issue/PR title: remove make_pair fish-shell#8206 no behavior change, ignoring Issue/PR title: replace push_back with emplate_back fish-shell#8222 no behavior change, ignoring Issue/PR title: clang-tidy: remove pointless virtual fish-shell#8224 no behavior change, ignoring Issue/PR title: change value to rvalue reference fish-shell#8227 no behavior change, ignoring Issue/PR title: convert const ref to rvalue ref fish-shell#8228 no behavior change, ignoring Issue/PR title: clang-tidy: use for range loops fish-shell#8229 no behavior change, ignoring Issue/PR title: fix deleted constructors fish-shell#8230 nno behavior change, ignoring Issue/PR title: clang-tidy: const reference conversions fish-shell#8231 no behavior change, ignoring Issue/PR title: clang-tidy: simplify two bool returns fish-shell#8235 no behavior change, ignoring Issue/PR title: clang-tidy: replace size comparisons with empty fish-shell#8237 no behavior change, ignoring Issue/PR title: clang-tidy: replace NULL with nullptr fish-shell#8239 no behavior change, ignoring Issue/PR title: add constexpr fish-shell#8252 no behavior change, ignoring Issue/PR title: __fish_seen_subcommand_from and __fish_seen_argument update fish-shell#8430 no behavior change (apart from a regression that's fixed), ignoring Issue/PR title: Run fish_indent on all non-test .fish files fish-shell#8476 no behavior change, ignoring Issue/PR title: Use test command instead of bracket command fish-shell#8477 no behavior change, ignoring Issue/PR title: Fix code scanning alert - Wrong type of arguments to formatting function fish-shell#8521 no behavior change, ignoring Issue/PR title: clang-tidy: replace push_back with emplace_back fish-shell#8236 no behavior change, ignoring ---
This adds support for
echo "$(cmd)"
- quoted command substitution without line splittingecho $(cmd)
- same asecho (cmd)
Closes #159
TODOs: