2021 Commits

Author SHA1 Message Date
Johannes Altmanninger
59658b44a9 functions/man: reuse __fish_print_help for viewing built-in man-pages
Historically,
- our "man" wrapper prepends /usr/share/fish/man to $MANPATH
- "__fish_print_help" only operates on /usr/share/fish/man, to it
  accesses that directly

However standalone builds -- where /usr/share/fish/man may not exist
-- have complicated things; we temporarily materialize a fake man
directory.

Reuse __fish_print_help instead of duplicating this.

Part of #12037
2025-11-09 13:08:47 +01:00
ridiculousfish
b4fc5160ba Set FISH_TEST_NO_CURSOR_POSITION_QUERY in pexpect tests
This was causing query timeouts with high parallelism in the tests.
2025-11-08 18:28:41 -08:00
SandWood Jones
9d3acbdd82 fix(abbr) --command conflicts
Fixes #11184

Closes #12021
2025-11-08 21:24:28 +01:00
Johannes Altmanninger
a772470b76 Multi-line autosuggestions
Unlike other shells, fish tries to make it easy to work with multiline
commands. Arguably, it's often better to use a full text editor but
the shell can feel more convenient.

Spreading long commands into multiple lines can improve readability,
especially when there is some semantic grouping (loops, pipelines,
command substitutions, quoted parts). Note that in Unix shell, every
quoted string can span multiple lines, like Python's triple quotes,
so the barrier to writing a multiline command is quite low.

However these commands are not autosuggested. From
1c4e5cadf2 (commitcomment-150853293)

> the reason we don't offer multi-line autosuggestion is that they
> can cause the command line to "jump" to make room for the second
> and third lines, if you're at the bottom of your terminal.

This jumping (as done by nushell for example) might be surprising,
especially since there is no limit on the height of a command.

Let's maybe avoid this jumping by rendering only however many lines
from the autosuggestion can fit on the screen without scrolling.

The truncation is hinted at by a single ellipsis ("…") after the
last suggested character, just like when a single-line autosuggestion
is truncated. (We might want to use something else in future.)

To implement this, query for the cursor position after every command,
so we know the y-position of the shell prompt within the terminal
window (whose height we already know).

Also, after we register a terminal window resize, query for the cursor
position before doing anything else (until we od #12004, only height
changes are relevant), to prevent this scenario:

	1. move prompt to bottom of terminal
	2. reduce terminal height
	3. increase terminal height
	4. type a command that triggers a multi-line autosuggestion
	5. observe that it would fail to truncate properly

As a refresher: when we fail to receive a query response, we always
wait for 2 seconds, except if the initial query had also failed,
see b907bc775a (Use a low TTY query timeout only if first query
failed, 2025-09-25).

If the terminal does not support cursor position report (which is
unlikely), show at most 1 line worth of autosuggestion.  Note that
either way, we don't skip multiline commands anymore.  This might make
the behavior worse on such terminals, which are probably not important
enough.  Alternatively, we could use no limit for such terminals,
that's probably the better fallback behavior. The only reason I didn't
do that yet is to stay a little bit closer to historical behavior.

Storing the prompt's position simplifies scrollback-push and the mouse
click handler, which no longer need to query.  Move some associated
code to the screen module.

Technically we don't need to query for cursor position if the previous
command was empty. But for now we do, trading a potential optimization
for andother simplification.

Disable this feature in pexpect tests for now, since those are still
missing some terminal emulation features.
2025-11-08 21:18:25 +01:00
Johannes Altmanninger
d6ed5f843e fish_tab_title to set terminal tab title independent of window title
Some modern terminals allow creating tabs in a single window;
this functionality has a lot of overlap with what a window manager
already provides, so I'm not sure if it's a good idea.  Regardless,
a lot of people still use terminal tabs (or even multiple levels of
tabs via tmux!), so let's add a fish-native way to set the tab title
independent of the window title.

Closes #2692
2025-11-06 13:02:23 +01:00
ken
199475b6ca Stop disabling mouse tracking
Commit eecc223 (Recognize and disable mouse-tracking CSI events,
2021-02-06) made fish disable mouse reporting whenever we receive a
mouse event.  This was because at the time we didn't have a parser
for mouse inputs.  We do now, so let's allow users to toggle mouse
support with

	printf '\e[?1000h'
	printf '\e[?1000l'

Currently the only mouse even we support is left click (to move cursor
in commandline, select pager items).

Part of #4918
See #12026

[ja: tweak patch and commit message]
2025-11-06 13:02:23 +01:00
Johannes Altmanninger
60b50afefd Fix missing ICANON regression after read in noninteractive shell
Since commit 7e3fac561d (Query terminal only just before reading
from it, 2025-09-25),

	fish -c 'read; cat'

fails to turn ICANON back on for cat.

Even before that commit, I don't know how this ever worked.  Before or
after, we'd call tcsetattr() only to set our shell modes, not the
ones for external commands (term_donate)

I also don't think there's a good reason why we set modes twice
(between term_donate () and old_modes), but I'll make a minimal (=
safer) change for now until I understand this.

The only change from 7e3fac561d was that instead of doing things in
this order:

	terminal_init()
		set_shell_modes
	read
		reader_push()
		reader_readline()
			save & restore old_modes
	cat

we now do

	read
		reader_push()
			terminal_init()
				set_shell_modes()
		reader_readline()
			save & restore old_modes
	cat

So we call set_shell_modes() just before saving modes,
which obviously makes us save the wrong thing.
Again, not sure how that wasn't a problem before.

Fix it by saving modes before calling terminal_init().

Fixes #12024
2025-11-06 13:02:23 +01:00
Johannes Altmanninger
7aa64dc423 help: use "introduction" instead of "index" in user-visible section title
The new completions are like

	help index#default-shell

Add a hack to use the "introduction" here.

Not sure if this is worth it but I guess we should be okay because
we at least have test for completions.

In future, we should find a better way to declare that "introduction"
is our landing page.
2025-11-06 13:01:08 +01:00
Johannes Altmanninger
2cd60077e6 help: get section titles from Sphinx
functions/help and completions/help duplicate a lot of information
from doc_src. Get this information from Sphinx.

Drop short section titles such as "help globbing" in favor of the
full HTML anchor:

	help language#wildcards-globbing 

I think the verbosity is no big deal because we have tab completion,
we're trading in conciseness for consistency and better searchability.

In future, we can add back shorter invocations like "help globbing"
(especially given that completion descriptions often already repeated
the anchor path), but it should be checked by CI.

Also
- Remove some unused Sphinx anchors
- Remove an obsoleted script.
- Test that completions are in sync with Sphinx sources.
  (note that an alternative would be to check
  in the generated help_sections.rs file, see
  https://internals.rust-lang.org/t/how-fail-on-cargo-warning-warnings-from-build-rs/23590/5)

Here's a list of deleted msgids. Some of them were unused, for others
there was a better message (+ translation).

	$variable $variable 变量
	(command) command substitution (命令) 命令替换
	< and > redirections < 和 > 重定向
	Autoloading functions 自动加载函数
	Background jobs 后台作业
	Builtin commands 内建命令
	Combining different expansions 合并不同的展开
	Command substitution (SUBCOMMAND) 命令替换 (子命令)
	Defining aliases 定义别名
	Escaping characters 转义字符
	Help on how to reuse previously entered commands 关于如何重复使用先前输入的命令的帮助
	How lists combine 列表如何组合
	Job control 作业控制
	Local, global and universal scope 局域、全局和通用作用域
	Other features 其他功能
	Programmable prompt 可编程提示符
	Shell variable and function names Shell 变量和函数名
	Some common words 一些常用词
	The status variable 状况变量
	Variable scope for functions 函数的变量作用域
	Vi mode commands Vi 模式命令
	What set -x does `set -x` 做什么
	Writing your own completions 自己写补全
	ifs and elses if 和 else
	var[x..y] slices var[x..y] 切片
	{a,b} brace expansion {a,b} 大括号展开
	~ expansion ~ 展开


Closes #11796
2025-11-06 12:58:59 +01:00
Johannes Altmanninger
2c68a6704f Don't escape '#' in some cases where it's not necessary
This is useful for the next commit where tab completion produces
tokens like "foo#bar". Some cases are missing though, because we
still need to tell this function what's the previous character.
I guess next commit could also use a different sigil.
2025-11-06 12:58:59 +01:00
Johannes Altmanninger
988985727f Disable failing fish_config test for now
This has probably been failing intermittently in CI ever since it
was introduced. We have a reproducible test now, so let's disable
this test in CI for now to reduce noise.

See #12018
2025-11-04 14:48:40 +01:00
Johannes Altmanninger
782916930a Work around failing asan tests
I could reproduce both
tests/checks/tmux-empty-prompt.fish
tests/pexpects/autosuggest.py

failing in ASan CI. I didn't bisect it, since I don't think there is
a problematic code change. Bump the timeout a bit.

Closes #12016
2025-11-03 09:17:00 +01:00
Peter Ammon
cf3c9d75d7 Don't run the man check test if FISH_BUILD_DOCS is 0 2025-11-01 13:12:58 -07:00
Johannes Altmanninger
e0a2fa35cc Define __fish_{data,help}_dir again on standalone builds
As mentioned in a previous commit ("Don't special-case __fish_data_dir
in standalone builds"), we want to enable embed-data by default.
To reduce the amount of breakage, we'll keep installing files,
and keep defining those variables at least for some time.

We have no use for $__fish_data_dir apart from helping plugins and
improving upgrade experience, but we still use $__fish_help_dir;
so this will allow installed "standalone" builds to use local docs
via our "help" function.
2025-11-01 12:58:13 +01:00
Johannes Altmanninger
8d02987c64 config_paths: reduce differences between standalone/installed builds
Some packagers such as Homebrew use the "relocatable-tree" logic,
i.e. "fish -d config" shows paths like:

	/usr/local/etc/fish
	/usr/local/share/fish

Other packagers use -DSYSCONFDIR=/etc, meaning we get

	/etc/fish
	/usr/share/fish

which we don't treat as relocatable tree,
because "/usr/etc/fish" does **not** exists.

To get embed-data in shape for being used as a default for installed
builds, we want it to support both cases.

Today, embed-data builds only handle the "in-build-dir" logic.
Teach them also about the relocatable-tree logic.  This will make
embed-data builds installed via Homebrew (i.e. CMake) use the correct
sysconfdir ("/usr/local/etc").

This means that if standalone fish is moved to ~/.local/bin/fish
and both ~/.local/share/fish as well as ~/.local/etc/fish exist,
fish will use the relocatable tree paths.

But only embedded files will be used, although a following commit will
make standalone builds define $__fish_data_dir and $__fish_help_dir
again; the latter will be used to look up help.
2025-11-01 12:58:13 +01:00
Johannes Altmanninger
ea5d77ad6f tests/man: try to fix intermittent failure in CI
This failed once in Ubuntu CI because there was one extra space in
the first column (after "ABBR(1)").
2025-11-01 12:58:13 +01:00
Johannes Altmanninger
7c61fc5151 tests/sphinx-markdown-changelog: workaround for mawk
awk is mawk on Ubuntu.
2025-11-01 12:45:17 +01:00
Johannes Altmanninger
2be3f34f2c Remove more obsolete uses of LC_CTYPE
Our test driver unsets all LC_* variables as well as LANGUAGE, and
it sets LANG=C, to make errors show up as

	set_color: Unknown color 'reset'

rather than

	set_color: Unknown color “reset”

It also sets LC_CTYPE which is hardly necessary since c8001b5023
(encoding: use UTF-8 everywhere, 2025-10-18).

The only place where we need it seems to be the use of GNU sed as
called in tests/checks/sphinx-markdown-changelog.fish.

In future we might want to avoid these issues by setting LANG=C.UTF-8
in the test_driver again.
2025-11-01 12:45:17 +01:00
Johannes Altmanninger
c0a988da21 Re-enable tests/checks/locale in CI
We don't currently run tsan tests anywhere.
2025-11-01 12:45:17 +01:00
Johannes Altmanninger
75be4e3f6a tests/config-paths-standalone: skip on installed builds
This fails:

	tests/test_driver.py ~/.local/opt/fish/bin tests/checks/config-paths-standalone.fish

because  we don't expect to run from a relocatable tree.
2025-11-01 12:45:17 +01:00
Johannes Altmanninger
6c267e88a1 __fish_macos_set_env: match macOS "path_helper" if MANPATH is overridden
Try to match
b33f386ac4/path_helper/path_helper.c
1. don't add empty segments
2. For MANPATH specifically, always add an empty segment at the end

See #10684
2025-11-01 12:45:17 +01:00
Johannes Altmanninger
27f49b9523 __fish_macos_set_env: extract function to make it testable 2025-11-01 12:45:17 +01:00
Johannes Altmanninger
3c4243fdd2 clang-format fish_test_helper 2025-11-01 12:42:55 +01:00
Peter Ammon
973f0f6134 Fix tmux-commandline.fish test harder
Make this pass on both macOS and Linux.

This was an obnoxious and uninteresting test to debug and so I used
claude code. It insists this is due to differences in pty handling between
macOS and Linux. Specifically it writes:

    The test was failing inconsistently because macOS and Linux have different
    PTY scrollback behavior after rendering prompts with right-prompts.

    Root cause: After fish writes a right-prompt to the rightmost column,
    different PTY drivers position the cursor differently:
    - macOS PTY: Cursor wraps to next line, creating a blank line
    - Linux PTY: Cursor stays on same line, no blank line

    This is OS kernel-level PTY driver behavior, not terminal emulator behavior.

    Fix: Instead of hardcoding platform-specific offsets, detect the actual
    terminal behavior by probing the output:
    1. Capture with -S -12 and check if the first line is blank
    2. If blank (macOS behavior), use -S -13 to go back one more line
    3. If not blank (Linux behavior), use -S -12

    Also split the C-l (clear-screen) command into its own send-keys call
    with tmux-sleep after it, ensuring the screen clears before new output
    appears. This improves test stability on both platforms.

    The solution is platform-independent and adapts to actual terminal
    behavior rather than making assumptions based on OS.
2025-10-26 13:34:35 -07:00
ridiculousfish
1973f3110e Make tmux-multiline-prompt.fish pass reliably on macOS 2025-10-26 12:06:35 -07:00
Peter Ammon
15d06f964d Make tmux-commandline.fish pass reliably on macOS 2025-10-25 19:36:34 -07:00
Peter Ammon
5f96a4e665 Make test_fish_update_completions.fish pass on macOS 2025-10-25 11:56:43 -07:00
kerty
f075c58eb5 Try to make tmux-transient-prompt.fish more consistent 2025-10-23 11:48:24 +02:00
kerty
07f0b1816e Wait until any output when initalasing tmux tests
Previously, if test setup didn't output word 'prompt' it would wait 5 second
timeout. This affected tmux-wrapping.fish and tmux-read.fish tests.

Change it so initialization function wait until any output and error out
on timeout.
2025-10-23 11:48:24 +02:00
kerty
73696da21c Allow for attaching to test tmux session without resizing 2025-10-23 11:48:24 +02:00
kerty
e22d90cbad Instead of variable pass args to tmux fish directly 2025-10-23 11:48:24 +02:00
kerty
0b7ab5a1b5 Fix not preserving empty last line in multiline prompts
Reproduction:
fish -C '
    function fish_prompt
        echo left-prompt\n
    end
    function fish_right_prompt
        echo right-prompt
    end
'
and pressing Enter would not preserve the line with right prompt.

This occurred because Screen::cursor_is_wrapped_to_own_line assumed
the last prompt line always had index 0. However, commit 606802daa (Make
ScreenData track multiline prompt, 2025-10-15) changed this so the last
prompt line's index is now `Screen.actual.visible_prompt_lines - 1`.

Screen::cursor_is_wrapped_to_own_line also didn't account for situations
where commandline indentation was 0.

Fix Screen::cursor_is_wrapped_to_own_line and add tests for prompts with
empty last lines.
2025-10-23 11:48:24 +02:00
Johannes Altmanninger
037a399746 Add test for brace in command position with trailling text
See #11962
2025-10-22 10:57:36 +02:00
Daniel Rainer
c8001b5023 encoding: use UTF-8 everywhere
Assume that UTF-8 is used everywhere. This allows for significant
simplification of encoding-related functionality. We no longer need
branching on single-byte vs. multi-byte locales, and we can get rid of
all the libc calls for encoding and decoding, replacing them with Rust's
built-in functionality, or removing them without replacement in cases
where their functionality is no longer needed.

Several tests are removed from `tests/checks/locale.fish`, since setting
the locale no longer impacts encoding behavior. We might want more
rigorous testing of UTF-8 handling instead.

Closes #11975
2025-10-20 03:42:38 +02:00
Aditya Bhargava
5cfcfc64d8 Add tests for final prompt having fewer lines than initial (transient)
Part of #11911
2025-10-19 14:09:27 +02:00
kerty
606802daaf Make ScreenData track multiline prompt
Instead of pretending that prompt is always 1 line, track multiline
prompt in ScreenData.visible_prompt_lines and ScreenData.line_datas as
empty lines.

This enables:
- Trimming part of the prompt that leaves the viewport.
- Removing of the old hack needed for locating first prompt line.
- Fixing #11875.

Part of #11911
2025-10-19 14:09:27 +02:00
kerty
bb7180a2d8 Fix off-by-one pager height error on empty lines
Commit 7db9553 (Fix regression causing off-by-one pager height on
truncated autosuggestion) adds line to pager if cursor located at
the start of line and previous line is softwrapped, even if line was
softwrapped normally and not by autosuggestion, giving pager too much space.

Fix that.

Part of #11911
2025-10-19 14:09:27 +02:00
kerty
6f5644a77c Disable fish_transient_prompt in tmux test setup
Part of #11911
2025-10-19 14:09:27 +02:00
traal
165e0d0ed5 man.fish: fix for commands ! . : [
[ja: add test]

Closes #11956
2025-10-16 16:43:03 +02:00
Johannes Altmanninger
1c853a4d24 tests fish_{config,delta}: fix for BSD sed and BusyBox cat 2025-10-15 12:51:20 +02:00
Johannes Altmanninger
73fbd5d994 tests/fish_config prompt choose: no "embedded:functions/foo.fish" via source
Today fish script can't produce this type of behavior:

	$ type fish_prompt
	# Defined in embedded:functions/fish_prompt.fish @ line 2

The above is only created for autoloaded functions.

On standalone builds, "fish_config prompt choose" uses the "source"
builtin, making this line say is "Defined via `source`".

In future, we might want to make things consistent (one way or
the other).
2025-10-15 12:00:24 +02:00
Johannes Altmanninger
28e8f45828 fish_config theme choose: correct error message for standalone builds 2025-10-15 12:00:24 +02:00
Johannes Altmanninger
584a21b34b tests/fish_config theme {choose,save} 2025-10-15 12:00:24 +02:00
Johannes Altmanninger
ea69133e48 tests/fish_delta 2025-10-15 12:00:24 +02:00
Johannes Altmanninger
f72ebca1e4 fish_delta: fix spurious output in standalone builds 2025-10-15 12:00:24 +02:00
Johannes Altmanninger
d4837f9ef1 fish_config prompt choose: reset mode prompt and load it like right prompt
Fixes #11937
2025-10-15 12:00:24 +02:00
Johannes Altmanninger
0d5fd181be tests/fish_config: share logic between standalone and installed builds 2025-10-15 12:00:24 +02:00
Johannes Altmanninger
37e0a5ae8d fish_config prompt save: don't define right prompt unnecessarily
If no "fish_right_prompt" is defined, then we also don't need to
define and save an empty one.  We can do nothing, which seems cleaner.
It's also what "fish_config prompt choose" does.  Git blame shows no
explicit reason for for this inconsistency.

Probably the implicit reason is that when both styles where introduced
(both in 69074c1591 (fish_config: Remove right prompt in `choose` and
`save`, 2021-09-26)), that was before the "fish_config prompt choose:
make right prompt hack less weird" commit, so the "prompt choose"
code path didn't know whether the prompt existed until after checking,
hence "--erase" was more suitable.. but that inconsistency is gone.
2025-10-15 12:00:24 +02:00
Johannes Altmanninger
73f0e14d90 tests/fish_config {prompt,theme} list 2025-10-15 12:00:24 +02:00
Johannes Altmanninger
fad0e39cfa tests/fish_update_completions: simple system test 2025-10-15 12:00:24 +02:00