Compare commits

...

68 Commits
4.4.0 ... 4.5.0

Author SHA1 Message Date
Johannes Altmanninger
3478f78a05 Release 4.5.0
Created by ./build_tools/release.sh 4.5.0
2026-02-17 11:32:33 +11:00
Johannes Altmanninger
19cedb01bc changelog 2026-02-17 11:31:17 +11:00
xtqqczze
cb24c4a863 rust: use const_locks feature
Closes #12454
2026-02-17 11:28:58 +11:00
xtqqczze
93478e7c51 simplify serialize_with_vars
Closes #12453
2026-02-17 11:28:58 +11:00
xtqqczze
4eac5f4d9d clippy: fix unused_trait_names lint
https://rust-lang.github.io/rust-clippy/master/index.html#unused_trait_names

Closes #12450
2026-02-17 11:28:58 +11:00
xtqqczze
e76370b3b7 clippy: fix str_to_string lint
https://rust-lang.github.io/rust-clippy/master/index.html#str_to_string

Closes #12449
2026-02-17 11:13:34 +11:00
Daniel Rainer
1e3153c3fb unicode: fix history search cursor positioning
The cursor position calculation did not correctly account for the width
of Unicode text, resulting in the cursor being placed to far left in
scenarios with characters taking up 2 cells, such as in Chinese text.

Fix this by combining the entire line into a string and computing the
length of the resulting string using the `unicode-width` crate.

This is the first code in the main crate making use of `unicode-width`.
Eventually, we'll probably want to use it in more places, to get better
and consistent results.

Fixes #12444

Closes #12446
2026-02-17 11:13:25 +11:00
Peter Ammon
d0a95e4fde Fix some dumb clipply 2026-02-15 11:25:40 -08:00
Peter Ammon
7174ebbb4b Slightly refactor history tests
This introduces a create_test_history helper function; it looks sort of
silly now but will be useful for upcoming history improvements.
2026-02-15 11:09:14 -08:00
Peter Ammon
e81cec1633 Fix kill-word-vi on macOS/BSDs
`seq 0` outputs nothing on Linux but `1 0` on macOS and BSDs, breaking
this word motion. Fix it by not running `seq 0`.
2026-02-14 12:06:51 -08:00
Johannes Altmanninger
02c04550fd Fix Vi mode cw deleting trailing whitespace
Fixes 38e633d49b (fish_vi_key_bindings: add support for count,
2025-12-16).

Fixes #12443
2026-02-12 14:11:26 +11:00
David Adam
b0bfc7758a CHANGELOG: editing 2026-02-11 16:41:00 +08:00
Weixie Cui
cbf21b13d7 fix: unwrap may cause panic
Closes #12441
2026-02-11 14:49:54 +11:00
Aman Verma
14f3c3e13e completions: use upstream completions for dua
Our completions had gone out-of-date. They didn't support invocations
like `dua path/to/folder`, instead requiring a subcommand.

Closes #12438
2026-02-11 14:46:01 +11:00
Johannes Altmanninger
05ea6e9e66 Remove unused "Output" trait
Continue incidental cleanup started in earlier commit (Reduce the
number of escape sequences for text styles, 2026-02-06).
2026-02-11 14:37:38 +11:00
Nahor
74d2e6d5d8 Rip support for terminfo database
The terminfo database hasn't been used by default since 4.1.0
(see #11344, #11345)

Closes #12439
2026-02-11 14:37:38 +11:00
Nahor
1b8f9c2b03 Initialize Features using a loop
This removes the need to update `Features::new()` every time a feature
is added or removed

Part of #12439
2026-02-11 14:37:38 +11:00
Johannes Altmanninger
491158dfad Output reset_text_face: minor simplification 2026-02-11 14:37:38 +11:00
Johannes Altmanninger
7fa08e31c6 Tweak naming for outputter buffer consumer
Rust idiomatic naming is "take" for "move", also Rust might actually
move the object to a different memory adress, which is fine because
all Rust objects are trivially relocatable.
2026-02-11 14:22:14 +11:00
Nahor
7ac9ce7ffb Reduce the number of escape sequences for text styles
When setting graphics attributes (SGR), combine them into a single
escape sequence to reduce the length of the string and make it slightly
easier to read by people when needed.

Some terminal/parser[^1] may have a cap on the number of parameters, so
we limit the number to 16.

[^1]: https://vt100.net/emu/dec_ansi_parser: "There is no limit to the
number of characters in a parameter string, although a maximum of 16
parameters need be stored. If more than 16 parameters arrive, all
the extra parameters are silently ignored.""

Closes #12429
2026-02-11 14:22:14 +11:00
Johannes Altmanninger
197779697d Remove unused Output implementations
I think the OutputStream was used only in old fish_indent code.
The BufferedOutputter seems obsolete, maybe because DerefMut covers
this.
2026-02-11 14:22:14 +11:00
Weixie Cui
96fabe4b29 fix: update 2026-02-10 14:21:04 +01:00
David Adam
4a4d35b625 completions/dput: add new completions 2026-02-10 16:02:31 +08:00
David Adam
92739a06e2 completions/dscacheutil: correct description 2026-02-10 15:46:53 +08:00
David Adam
244e9586ca completions/chsh: remove stray whitespace 2026-02-10 15:44:29 +08:00
David Adam
13a2ccae66 release.sh: add a couple of explanatory comments 2026-02-10 14:29:16 +08:00
David Adam
ed34845b10 Debian packaging: don't link the .cargo directory from vendor tarball
The main tarball did not contain a .cargo directory, but it does now,
and this symlink ends up in the wrong place and is not needed.
2026-02-10 13:07:01 +08:00
Daniel Rainer
74b104c9f6 cleanup: delete unmaintained Dockerfile
This Dockerfile has been broken for quite a while now, at least since
Rust is required for building fish. No one seems to have complained
about it being broken, so there is no point in keeping it around. The
`docker` directory contains several Dockerfiles which could be used
instead.

https://github.com/fish-shell/fish-shell/pull/12408#discussion_r2770432433

Closes #12435
2026-02-09 12:16:52 +11:00
Francisco Giordano
1f8cdf85b6 Fix ctrl-l interference with history search
Closes #12436
2026-02-09 12:16:33 +11:00
David Adam
dc02a8ce35 CI: run apt-get update before any apt install
Try to avoid surprises down the track by doing this across the board.
2026-02-09 00:04:40 +08:00
Pothi Kalimuthu
65e726324a Fix the link to GitHub repo 2026-02-08 23:38:46 +08:00
Johannes Altmanninger
fe3c42af9e Work around github actions python failure
github actions runners have python 3.12, so the upgrade to debian
stable's 3.13 broke things:

	+ env UV_PYTHON=python uv --no-managed-python lock --check --exclude-newer=2026-02-01T13:00:00Z
	Using CPython 3.12.3 interpreter at: /usr/bin/python
	error: The requested interpreter resolved to Python 3.12.3, which is incompatible with the project's Python requirement: `>=3.13` (from `project.requires-python`)
	Error: Process completed with exit code 2.

Steps:
1. edit pyproject.toml and
2. uv lock --upgrade --exclude-newer="$(awk -F'"' <uv.lock '/^exclude-newer[[:space:]]*=/ {print $2}')"

In future we should maybe use managed python?
2026-02-08 14:03:53 +11:00
Johannes Altmanninger
28c7e7173f Fix fish_indent_interrupt CI workaround 2026-02-08 14:01:45 +11:00
Johannes Altmanninger
a897a26daa Test Vi mode dfX
Tests d25965afba (Vi mode: hack in support for df and friends,
2026-02-06).
2026-02-08 13:16:07 +11:00
Johannes Altmanninger
ffce214362 Test fish_vi_key_bindings argument
Tests 6d01138797 (Fix vi key bindings regression when called with
argument, 2026-02-04).
2026-02-08 13:16:07 +11:00
Liam Snow
bdb8e4847f dir_iter: handle missing d_type on illumos
Closes #12410
Fixes #11099
2026-02-08 13:16:07 +11:00
Liam Snow
9750d8c3ad path: return Unknown for remoteness check on illumos
Part of #12410
2026-02-08 13:12:41 +11:00
Johannes Altmanninger
dadec16661 path_remoteness: use cfg_if 2026-02-08 13:12:41 +11:00
Liam Snow
b5cd2763db spawn: POSIX_SPAWN flags are not i32 on illumos
Part of #12410
2026-02-08 13:12:41 +11:00
Liam Snow
a08dd70354 env: define _CS_PATH const for illumos
Part of #12410
2026-02-08 13:12:41 +11:00
Liam Snow
5b39d1fc6a ulimit: add illumos to platforms missing MEMLOCK/NPROC limits
Part of #12410
2026-02-08 13:12:41 +11:00
Nahor
38513de954 Remove duplicated code introduced in commit 289057f
Closes #12432
2026-02-08 13:12:41 +11:00
Johannes Altmanninger
cc1ae25c3a Fix kill-a-word kill-inner-word bounds checks if at end of command line
These commands are meant to be used in Vi mode when the cursor is on
a valid character, so there's not much reason to try to make them do
something when the cursor is past-end.  Do nothing, like we already
do for the empty commandline.

Reported in #12430
2026-02-08 13:12:41 +11:00
Johannes Altmanninger
002fa0e791 Fix cursor position after accepting Vi mode autosuggestion
Closes #12430
2026-02-08 13:12:41 +11:00
Jack Pickle
0589de7523 fix git stash completions not working after flags
update __fish_git_stash_not_using_subcommand check for actual subcommands
instead of treating any word after 'stash' as a subcommand.

stay dry by adding__fish_git_stash_is_push helper that matches both implicit and explicit push.

fixes #11307

Closes #12421
2026-02-08 13:12:41 +11:00
Johannes Altmanninger
4e7e0139fd Update to sphinx 9.1
sphinx==9.1.0 depends on Python>=3.12,
so change our pinning policy to fit.
Note we still support Python 3.9 in user-facing code.

Steps:
1. edit updatecli.d/python.yml
2. remove bad "uv lock" from build_tools/update-dependencies.sh
   (didn't respect exclude-newer)
3. updatecli apply --config updatecli.d/python.yml
4. uv lock --upgrade --exclude-newer="$(date --date='7 days ago' --iso-8601)"
2026-02-08 13:12:41 +11:00
Johannes Altmanninger
c044e1d433 update-dependencies.sh: update and pin 3rd party github workflows 2026-02-08 13:12:41 +11:00
Johannes Altmanninger
fb0edf564e Add AGENTS.md
LLM-generated contributions tend to produce too many redundant
comments. Fix that.  This doesn't work OOTB for Claude, but it's easy
to tell it to respect AGENTS.md..
2026-02-08 13:12:41 +11:00
Salman Muin Kayser Chishti
969ce68d5d Upgrade GitHub Actions for Node 24 compatibility
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>

Closes #12422
2026-02-08 12:59:26 +11:00
Salman Muin Kayser Chishti
6ef2e04518 Upgrade GitHub Actions to latest versions
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>

Closes #12423
2026-02-08 12:59:26 +11:00
Johannes Altmanninger
bc84fe9407 tests/pexpects/fish_indent_interrupt: skip in CI
This fails intermittently in CI. Disable it.  We disable a lot of
other tests as well which is why we run tests on developer machines
before pushing to master.

See #12351
2026-02-08 12:59:26 +11:00
Peter Ammon
38e8416da5 test_history_path_detection to adopt custom history directories
Simplifies this test by making it no longer serial.
2026-02-07 12:29:54 -08:00
Peter Ammon
cf0e07aecd test_history_formats to adopt custom history directories
Simplifies this test by making it no longer serial.
2026-02-07 12:23:13 -08:00
Peter Ammon
8e014bbf97 test_history_formats to adopt custom history directories
Simplifies this test by making it no longer serial.
2026-02-07 12:20:11 -08:00
Peter Ammon
f9013ad7a6 Allow histories to be created outside of the default path
Currently history files are written to the "data directory"
(XDG_DATA_HOME). This is awkward in testing since we have to put files
into this directory.

Allow histories to have their own directory, so that they don't
interfere with other files. This will help simplify some tests.

Adopt this in some (but not all) history tests.
2026-02-07 12:20:09 -08:00
Johannes Altmanninger
8d2d50573a changelog 2026-02-06 15:38:50 +11:00
Johannes Altmanninger
d25965afba Vi mode: hack in support for df and friends
Commit 38e633d49b (fish_vi_key_bindings: add support for count,
2025-12-16) introduced an operator mode which kind of makes a lot of
sense for today's fish.  If we end up needing more flexibility and
tighter integration, we might want to move some of this into core.

Unfortunately the change is at odds with our cursed forward-jump
implementation.  The forward-jump special input function works by
magically reading the next key from stdin, which causes problems when
we are executing a script:

	commandline -f begin-selection
	commandline -f forward-jump
	commandline -f end-selection

here end-selection will be executed immediately
and forward-jump fails to wait for a keystroke.

We should get rid of forward-jump implementation.

For now, replace only the broken thing with a dedicated bind mode
for each of f/F/t/T.

Fixes #12417
2026-02-06 15:38:50 +11:00
Johannes Altmanninger
6f895935a9 bind.rst: update meaning of --silent option
We can probably even remove this, since the remaining behavior doesn't
seem useful.
2026-02-06 15:19:49 +11:00
Johannes Altmanninger
70ebc969f9 fish_vi_key_bindings: remove unused "bind -s" option
Commit 46d1334f95 (Silence bind errors in default key bindings,
2017-10-03) worked around errors arising from "bind -k".
We no longer use that, so remove that.
2026-02-06 15:19:49 +11:00
Simon Olofsson
6d01138797 Fix vi key bindings regression when called with argument
Commit bbb2f0de8d added a ctrl-right binding to override the shared
binding with forward-word-vi for vi-compliance. However, it incorrectly
passed $argv which caused the error:
  "bind: cannot parse key 'default'"

when calling fish_vi_key_bindings with a mode argument like:
  fish_vi_key_bindings "default"

Fix that.

Co-Authored-By: Johannes Altmanninger <aclopte@gmail.com>

Closes #12413
2026-02-06 12:40:53 +11:00
Daniel Rainer
779f1371a1 l10n: localize colon followed by content
Some languages have different conventions regarding colons. In order to
handle this better in cases with non-constant strings, as is the case in
`describe_with_prefix`, use localization to figure out how colons should
be localized.

This approach fixes the extra whitespace inserted after Chinese colons.
See #12405.

Closes #12414
2026-02-06 12:05:03 +11:00
Daniel Rainer
5d24a846e3 cleanup: simplify pushing to WString
Part of #12414
2026-02-06 12:05:02 +11:00
madblobfish
c4f1c25a87 completion/rfkill: add completions for toggle command
"toggle" command was not considered in the completions

Closes #12412
2026-02-06 12:05:02 +11:00
Daniel Rainer
7d754b2865 ci: update before apt install
GitHub does not consistently provide images with up-to-date package
lists, causing `apt install` failures.
Work around this by updating the package list.
https://github.com/actions/runner-images/issues/13636
https://github.com/actions/runner-images/issues/12599

Closes #12418
2026-02-06 11:42:30 +11:00
Johannes Altmanninger
232e38f105 Fix rst syntax in changelog 2026-02-06 11:41:23 +11:00
Tristan Partin
725afc71fd Fix fish_mode_prompt formatting error
"variable" was in the formatted portion of the text when it should not
have been.

Signed-off-by: Tristan Partin <tristan@partin.io>
2026-02-05 07:14:21 +01:00
David Adam
6d60eaf04e CMake: use cargo variable to call cargo
Fixes the build where a custom cargo binary is passed in.
2026-02-03 11:10:34 +08:00
Johannes Altmanninger
7c1d8cf4f1 start new cycle
Created by ./build_tools/release.sh 4.4.0
2026-02-03 12:39:46 +11:00
132 changed files with 1878 additions and 1922 deletions

View File

@@ -10,7 +10,7 @@ jobs:
steps:
- name: Set label and milestone
id: set-label-milestone
uses: actions/github-script@v7
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8, build_tools/update-dependencies.sh
with:
script: |
const completionsLabel = 'completions';

View File

@@ -37,10 +37,10 @@ jobs:
steps:
-
name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
-
name: Login to Container registry
uses: docker/login-action@v3
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0, build_tools/update-dependencies.sh
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
@@ -48,14 +48,14 @@ jobs:
-
name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0, build_tools/update-dependencies.sh
with:
images: ${{ env.REGISTRY }}/${{ github.repository_owner }}/${{ env.NAMESPACE }}/${{ matrix.target }}
flavor: |
latest=true
-
name: Build and push
uses: docker/build-push-action@v6
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0, build_tools/update-dependencies.sh
with:
context: docker/context
push: true

View File

@@ -16,8 +16,8 @@ jobs:
cargo-deny:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: EmbarkStudios/cargo-deny-action@v2
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
- uses: EmbarkStudios/cargo-deny-action@44db170f6a7d12a6e90340e9e0fca1f650d34b14 # v2.0.15, build_tools/update-dependencies.sh
with:
command: check licenses
arguments: --all-features --locked --exclude-dev

View File

@@ -9,7 +9,7 @@ jobs:
format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
- uses: ./.github/actions/rust-toolchain@stable
with:
components: rustfmt
@@ -35,11 +35,13 @@ jobs:
- rust_version: "msrv"
features: ""
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
- uses: ./.github/actions/rust-toolchain
with:
toolchain_channel: ${{ matrix.rust_version }}
components: clippy
- name: Update package database
run: sudo apt-get update
- name: Install deps
run: |
sudo apt install gettext
@@ -49,8 +51,10 @@ jobs:
rustdoc:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
- uses: ./.github/actions/rust-toolchain@stable
- name: Update package database
run: sudo apt-get update
- name: Install deps
run: |
sudo apt install gettext

View File

@@ -18,7 +18,7 @@ jobs:
pull-requests: write # for dessant/lock-threads to lock PRs
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v4
- uses: dessant/lock-threads@f5f995c727ac99a91dec92781a8e34e7c839a65e # v6.0.0, build_tools/update-dependencies.sh
with:
github-token: ${{ github.token }}
issue-inactive-days: '365'

View File

@@ -16,7 +16,7 @@ jobs:
name: Pre-release checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
with:
# Workaround for https://github.com/actions/checkout/issues/882
ref: ${{ inputs.version }}
@@ -36,10 +36,12 @@ jobs:
version: ${{ steps.version.outputs.version }}
tarball-name: ${{ steps.version.outputs.tarball-name }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
with:
# Workaround for https://github.com/actions/checkout/issues/882
ref: ${{ inputs.version }}
- name: Update package database
run: sudo apt-get update
- name: Install dependencies
run: sudo apt install cmake gettext ninja-build python3-pip
- uses: ./.github/actions/install-sphinx
@@ -61,7 +63,7 @@ jobs:
sed -n 2p "$relnotes" | grep -q '^$'
sed -i 1,2d "$relnotes"
- name: Upload tarball artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0, build_tools/update-dependencies.sh
with:
name: source-tarball
path: |
@@ -74,7 +76,7 @@ jobs:
name: Build single-file fish for Linux
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
with:
# Workaround for https://github.com/actions/checkout/issues/882
ref: ${{ inputs.version }}
@@ -82,6 +84,8 @@ jobs:
uses: ./.github/actions/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-musl,aarch64-unknown-linux-musl
- name: Update package database
run: sudo apt-get update
- name: Install dependencies
run: sudo apt install crossbuild-essential-arm64 gettext musl-tools
- uses: ./.github/actions/install-sphinx
@@ -100,7 +104,7 @@ jobs:
tar -cazf fish-$(git describe)-linux-$arch.tar.xz \
-C target/$arch-unknown-linux-musl/release fish
done
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0, build_tools/update-dependencies.sh
with:
name: Static builds for Linux
path: fish-${{ inputs.version }}-linux-*.tar.xz
@@ -114,19 +118,19 @@ jobs:
name: Create release draft
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
with:
# Workaround for https://github.com/actions/checkout/issues/882
ref: ${{ inputs.version }}
- name: Download all artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0, build_tools/update-dependencies.sh
with:
merge-multiple: true
path: /tmp/artifacts
- name: List artifacts
run: find /tmp/artifacts -type f
- name: Create draft release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0, build_tools/update-dependencies.sh
with:
tag_name: ${{ inputs.version }}
name: fish ${{ inputs.version }}
@@ -142,7 +146,7 @@ jobs:
runs-on: macos-latest
environment: macos-codesign
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
with:
# Workaround for https://github.com/actions/checkout/issues/882
ref: ${{ inputs.version }}

View File

@@ -13,7 +13,7 @@ jobs:
ubuntu:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
- uses: ./.github/actions/rust-toolchain@oldest-supported
- name: Install deps
uses: ./.github/actions/install-dependencies
@@ -44,18 +44,19 @@ jobs:
ubuntu-32bit-static-pcre2:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
- uses: ./.github/actions/rust-toolchain@oldest-supported
with:
targets: "i586-unknown-linux-gnu"
- name: Update package database
run: sudo apt-get update
- name: Install deps
uses: ./.github/actions/install-dependencies
with:
include_pcre: false
include_sphinx: false
- name: Install g++-multilib
run: |
sudo apt install g++-multilib
run: sudo apt install g++-multilib
- name: cmake
env:
CFLAGS: "-m32"
@@ -80,13 +81,15 @@ jobs:
RUSTFLAGS: "-Zsanitizer=address"
# RUSTFLAGS: "-Zsanitizer=memory -Zsanitizer-memory-track-origins"
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
# All -Z options require running nightly
- uses: dtolnay/rust-toolchain@nightly
with:
# ASAN uses `cargo build -Zbuild-std` which requires the rust-src component
# this is comma-separated
components: rust-src
- name: Update package database
run: sudo apt-get update
- name: Install deps
uses: ./.github/actions/install-dependencies
with:
@@ -128,7 +131,7 @@ jobs:
# of crates.io, so give this a try. It's also sometimes significantly faster on all platforms.
CARGO_NET_GIT_FETCH_WITH_CLI: true
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
- uses: ./.github/actions/rust-toolchain@oldest-supported
- name: Install deps
run: |
@@ -155,8 +158,8 @@ jobs:
run:
shell: msys2 {0}
steps:
- uses: actions/checkout@v6
- uses: msys2/setup-msys2@v2
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2, build_tools/update-dependencies.sh
- uses: msys2/setup-msys2@4f806de0a5a7294ffabaff804b38a9b435a73bda # v2.30.0, build_tools/update-dependencies.sh
with:
update: true
msystem: MSYS

3
AGENTS.md Normal file
View File

@@ -0,0 +1,3 @@
# Coding style
- Use comments sparingly. Don't explain what the code is doing, rather explain why.

View File

@@ -1,3 +1,25 @@
fish 4.5.0 (released February 17, 2026)
=======================================
This is mostly a patch release for Vi mode regressions in 4.4.0 but other minor behavior changes are included as well.
Interactive improvements
------------------------
- :kbd:`ctrl-l` no longer cancels history search (:issue:`12436`).
- History search cursor positioning now works correctly with characters of arbitrary width.
Deprecations and removed features
---------------------------------
- fish no longer reads the terminfo database to alter behaviour based on the :envvar:`TERM` environment variable, and does not depend on ncurses or terminfo. The ``ignore-terminfo`` feature flag, introduced and enabled by default in fish 4.1, is now permanently enabled. fish may no longer work correctly on Data General Dasher D220 and Wyse WY-350 terminals, but should continue to work on all known terminal emulators released in the 21st century.
Regression fixes:
-----------------
- (from 4.4.0) Vi mode ``d,f`` key binding did not work (:issue:`12417`).
- (from 4.4.0) Vi mode ``c,w`` key binding wrongly deleted trailing spaces (:issue:`12443`).
- (from 4.4.0) Vi mode crash on ``c,i,w`` after accepting autosuggestion (:issue:`12430`).
- (from 4.4.0) ``fish_vi_key_bindings`` called with a mode argument produced an error (:issue:`12413`).
- (from 4.0.0) Build on Illumos (:issue:`12410`).
fish 4.4.0 (released February 03, 2026)
=======================================
@@ -15,7 +37,7 @@ Interactive improvements
New or improved bindings
------------------------
- Vi mode word movements (``w``, ``W``, ``e``, and ``E``) are now largely in line with Vim. The only exception is that underscores are treated as word separators (:issue:`12269`).
- New special input functions to support these movements: ``forward-word-vi``, ``kill-word-vi``, ``forward-bigword-vi``, ``kill-bigword-vi``, ````forward-word-end``, ``backward-word-end``, ``forward-bigword-end``, ``backward-bigword-end``, ````kill-a-word``, ``kill-inner-word``, ``kill-a-bigword``, and ``kill-inner-bigword``.
- New special input functions to support these movements: ``forward-word-vi``, ``kill-word-vi``, ``forward-bigword-vi``, ``kill-bigword-vi``, ``forward-word-end``, ``backward-word-end``, ``forward-bigword-end``, ``backward-bigword-end``, ``kill-a-word``, ``kill-inner-word``, ``kill-a-bigword``, and ``kill-inner-bigword``.
- Vi mode key bindings now support counts for movement and deletion commands (e.g. `d3w` or `3l`), via a new operator mode (:issue:`2192`).
- New ``catpuccin-*`` color themes.

117
Cargo.lock generated
View File

@@ -260,7 +260,7 @@ checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
[[package]]
name = "fish"
version = "4.4.0"
version = "4.5.0"
dependencies = [
"assert_matches",
"bitflags",
@@ -290,13 +290,13 @@ dependencies = [
"num-traits",
"once_cell",
"pcre2",
"phf_codegen 0.13.1",
"phf_codegen",
"portable-atomic",
"rand 0.9.2",
"rand",
"rsconf",
"rust-embed",
"serial_test",
"terminfo",
"unicode-width",
"unix_path",
"xterm-color",
]
@@ -352,7 +352,7 @@ name = "fish-gettext"
version = "0.0.0"
dependencies = [
"fish-gettext-maps",
"phf 0.13.1",
"phf",
]
[[package]]
@@ -370,8 +370,8 @@ version = "0.0.0"
dependencies = [
"fish-build-helper",
"fish-gettext-mo-file-parser",
"phf 0.13.1",
"phf_codegen 0.13.1",
"phf",
"phf_codegen",
"rsconf",
]
@@ -395,7 +395,7 @@ name = "fish-tempfile"
version = "0.0.0"
dependencies = [
"nix",
"rand 0.9.2",
"rand",
]
[[package]]
@@ -403,7 +403,7 @@ name = "fish-util"
version = "0.0.0"
dependencies = [
"fish-widestring",
"rand 0.9.2",
"rand",
]
[[package]]
@@ -437,12 +437,6 @@ dependencies = [
"widestring",
]
[[package]]
name = "fnv"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "foldhash"
version = "0.2.0"
@@ -599,12 +593,6 @@ version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "nix"
version = "0.31.1"
@@ -617,16 +605,6 @@ dependencies = [
"libc",
]
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]
[[package]]
name = "num-traits"
version = "0.2.19"
@@ -703,32 +681,13 @@ dependencies = [
"pkg-config",
]
[[package]]
name = "phf"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
dependencies = [
"phf_shared 0.11.3",
]
[[package]]
name = "phf"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
dependencies = [
"phf_shared 0.13.1",
]
[[package]]
name = "phf_codegen"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
dependencies = [
"phf_generator 0.11.3",
"phf_shared 0.11.3",
"phf_shared",
]
[[package]]
@@ -737,18 +696,8 @@ version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1"
dependencies = [
"phf_generator 0.13.1",
"phf_shared 0.13.1",
]
[[package]]
name = "phf_generator"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
dependencies = [
"phf_shared 0.11.3",
"rand 0.8.5",
"phf_generator",
"phf_shared",
]
[[package]]
@@ -758,16 +707,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737"
dependencies = [
"fastrand",
"phf_shared 0.13.1",
]
[[package]]
name = "phf_shared"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
dependencies = [
"siphasher",
"phf_shared",
]
[[package]]
@@ -824,15 +764,6 @@ version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"rand_core 0.6.4",
]
[[package]]
name = "rand"
version = "0.9.2"
@@ -840,7 +771,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha",
"rand_core 0.9.5",
"rand_core",
]
[[package]]
@@ -850,15 +781,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
"rand_core 0.9.5",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
[[package]]
name = "rand_core"
version = "0.9.5"
@@ -1087,18 +1012,6 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "terminfo"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4ea810f0692f9f51b382fff5893887bb4580f5fa246fde546e0b13e7fcee662"
dependencies = [
"fnv",
"nom",
"phf 0.11.3",
"phf_codegen 0.11.3",
]
[[package]]
name = "thiserror"
version = "2.0.18"

View File

@@ -39,7 +39,17 @@ libc = "0.2.177"
# disabling default features uses the stdlib instead, but it doubles the time to rewrite the history
# files as of 22 April 2024.
lru = "0.16.2"
nix = { version = "0.31.1", default-features = false, features = ["event", "fs", "inotify", "hostname", "resource", "process", "signal", "term", "user"] }
nix = { version = "0.31.1", default-features = false, features = [
"event",
"fs",
"inotify",
"hostname",
"resource",
"process",
"signal",
"term",
"user",
] }
num-traits = "0.2.19"
once_cell = "1.19.0"
pcre2 = { git = "https://github.com/fish-shell/rust-pcre2", tag = "0.2.9-utf32", default-features = false, features = [
@@ -62,8 +72,6 @@ rust-embed = { version = "8.11.0", features = [
"interpolate-folder-path",
] }
serial_test = { version = "3", default-features = false }
# We need 0.9.0 specifically for some crash fixes.
terminfo = "0.9.0"
widestring = "1.2.0"
unicode-segmentation = "1.12.0"
unicode-width = "0.2.0"
@@ -80,7 +88,7 @@ debug = true
[package]
name = "fish"
version = "4.4.0"
version = "4.5.0"
edition.workspace = true
rust-version.workspace = true
default-run = "fish"
@@ -116,7 +124,7 @@ num-traits.workspace = true
once_cell.workspace = true
pcre2.workspace = true
rand.workspace = true
terminfo.workspace = true
unicode-width.workspace = true
xterm-color.workspace = true
[target.'cfg(not(target_has_atomic = "64"))'.dependencies]
@@ -194,7 +202,7 @@ cloned_instead_of_copied = "warn"
explicit_into_iter_loop = "warn"
format_push_string = "warn"
implicit_clone = "warn"
len_without_is_empty = "allow" # we're not a library crate
len_without_is_empty = "allow" # we're not a library crate
let_and_return = "allow"
manual_assert = "warn"
manual_range_contains = "allow"
@@ -207,7 +215,9 @@ ptr_offset_by_literal = "warn"
ref_option = "warn"
semicolon_if_nothing_returned = "warn"
stable_sort_primitive = "warn"
str_to_string = "warn"
unnecessary_semicolon = "warn"
unused_trait_names = "warn"
# We do not want to use the e?print(ln)?! macros.
# These lints flag their use.

View File

@@ -1,18 +0,0 @@
FROM centos:latest
# Build dependency
RUN yum update -y &&\
yum install -y epel-release &&\
yum install -y clang cmake3 gcc-c++ make &&\
yum clean all
# Test dependency
RUN yum install -y expect vim-common
ADD . /src
WORKDIR /src
# Build fish
RUN cmake3 . &&\
make &&\
make install

View File

@@ -159,16 +159,14 @@ fn join_if_relative(parent_if_relative: &Path, path: String) -> PathBuf {
}
let prefix = overridable_path("PREFIX", |env_prefix| {
Some(PathBuf::from(
env_prefix.unwrap_or("/usr/local".to_string()),
))
Some(PathBuf::from(env_prefix.unwrap_or("/usr/local".to_owned())))
})
.unwrap();
overridable_path("SYSCONFDIR", |env_sysconfdir| {
Some(join_if_relative(
&prefix,
env_sysconfdir.unwrap_or("/etc/".to_string()),
env_sysconfdir.unwrap_or("/etc/".to_owned()),
))
});
@@ -199,5 +197,5 @@ fn get_version() -> String {
)
.unwrap()
.trim_ascii_end()
.to_string()
.to_owned()
}

View File

@@ -23,6 +23,6 @@
<p>
<code>chsh -s /usr/local/bin/fish</code>
</p>
<p>Enjoy! Bugs can be reported on <a href="https://github.org/fish-shell/fish-shell/">GitHub</a>.</p>
<p>Enjoy! Bugs can be reported on <a href="https://github.com/fish-shell/fish-shell/">GitHub</a>.</p>
</body>
</html>

View File

@@ -90,7 +90,7 @@ Created by ./build_tools/release.sh $version"
}
sed -i "s/^version = \".*\"/version = \"$1\"/g" Cargo.toml
cargo fetch --offline
cargo fetch --offline # bumps the version in Cargo.lock
if [ "$1" = "$version" ]; then
# debchange is a Debian script to manage the Debian changelog, but
# it's too annoying to install everywhere. Just do it by hand.
@@ -110,6 +110,8 @@ fi
git add CHANGELOG.rst Cargo.toml Cargo.lock
CreateCommit "Release $version"
# Tags must be full objects, not lightweight tags, for
# git_version-gen.sh to work.
git -c "user.signingKey=$committer" \
tag --sign --message="Release $version" $version

View File

@@ -13,9 +13,31 @@ sort --version-sort </dev/null
# TODO This is copied from .github/actions/install-sphinx/action.yml
uv lock --check --exclude-newer="$(awk -F'"' <uv.lock '/^exclude-newer[[:space:]]*=/ {print $2}')"
update_gh_action() {
repo=$1
version=$(curl -fsS "https://api.github.com/repos/$repo/releases/latest" | jq -r .tag_name)
[ -n "$version" ]
tag_oid=$(git ls-remote "https://github.com/$repo.git" "refs/tags/$version" | cut -f1)
[ -n "$tag_oid" ]
find .github/workflows -name '*.yml' -type f -exec \
sed -i "s|uses: $repo@\S\+\( \+#.*\)\?|\
uses: $repo@$tag_oid # $version, build_tools/update-dependencies.sh|g" {} +
}
update_gh_action actions/checkout
update_gh_action actions/github-script
update_gh_action actions/upload-artifact
update_gh_action actions/download-artifact
update_gh_action docker/login-action
update_gh_action docker/build-push-action
update_gh_action docker/metadata-action
update_gh_action EmbarkStudios/cargo-deny-action
update_gh_action dessant/lock-threads
update_gh_action softprops/action-gh-release
update_gh_action msys2/setup-msys2
updatecli "${@:-apply}"
uv lock # Python version constraints may have changed.
# Python version constraints may have changed.
uv lock --upgrade --exclude-newer="$(date --date='7 days ago' --iso-8601)"
from_gh() {

View File

@@ -18,14 +18,14 @@ set(VARS_FOR_CARGO_SPHINX_WRAPPER
add_custom_target(sphinx-docs
COMMAND env ${VARS_FOR_CARGO_SPHINX_WRAPPER}
cargo xtask html-docs --fish-indent=${FISH_INDENT_FOR_BUILDING_DOCS}
${Rust_CARGO} xtask html-docs --fish-indent=${FISH_INDENT_FOR_BUILDING_DOCS}
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
DEPENDS ${SPHINX_HTML_FISH_INDENT_DEP}
COMMENT "Building HTML documentation with Sphinx")
add_custom_target(sphinx-manpages
COMMAND env ${VARS_FOR_CARGO_SPHINX_WRAPPER}
cargo xtask man-pages
${Rust_CARGO} xtask man-pages
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
COMMENT "Building man pages with Sphinx")

View File

@@ -1,3 +1,11 @@
fish (4.5.0-1) stable; urgency=medium
* Release of new version 4.5.0.
See https://github.com/fish-shell/fish-shell/releases/tag/4.5.0 for details.
-- Johannes Altmanninger <aclopte@gmail.com> Tue, 17 Feb 2026 11:32:33 +1100
fish (4.4.0-1) stable; urgency=medium
* Release of new version 4.4.0.

View File

@@ -16,14 +16,12 @@ export DEB_BUILD_MAINT_OPTIONS=optimize=-lto
# Setting the build system is still required, because otherwise the GNUmakefile gets picked up
override_dh_auto_configure:
ln -s cargo-vendor/vendor vendor
ln -s cargo-vendor/.cargo .cargo
dh_auto_configure -- -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DRust_CARGO=$$(command -v cargo-1.85 || command -v cargo) \
-DRust_COMPILER=$$(command -v rustc-1.85 || command -v rustc)
override_dh_clean:
dh_clean --exclude=Cargo.toml.orig
-unlink .cargo
-unlink vendor
override_dh_auto_test:

View File

@@ -1,4 +1,4 @@
use std::{borrow::Cow, env, os::unix::ffi::OsStrExt, path::Path};
use std::{borrow::Cow, env, os::unix::ffi::OsStrExt as _, path::Path};
pub fn env_var(name: &str) -> Option<String> {
let err = match env::var(name) {

View File

@@ -43,7 +43,7 @@ fn build_man(sec1_dir: &Path) {
];
rsconf::rebuild_if_env_changed("FISH_BUILD_DOCS");
if env_var("FISH_BUILD_DOCS") == Some("0".to_string()) {
if env_var("FISH_BUILD_DOCS") == Some("0".to_owned()) {
rsconf::warn!("Skipping man pages because $FISH_BUILD_DOCS is set to 0");
return;
}
@@ -62,7 +62,7 @@ fn build_man(sec1_dir: &Path) {
Err(e) if e.kind() == std::io::ErrorKind::NotFound => {
assert_ne!(
env_var("FISH_BUILD_DOCS"),
Some("1".to_string()),
Some("1".to_owned()),
"Could not find sphinx-build required to build man pages.\n\
Install Sphinx or disable building the docs by setting $FISH_BUILD_DOCS=0."
);

View File

@@ -5,7 +5,7 @@
use std::io::Read;
use std::ops::{Deref, DerefMut};
use std::os::fd::{AsRawFd, BorrowedFd, RawFd};
use std::os::unix::ffi::OsStrExt;
use std::os::unix::ffi::OsStrExt as _;
use std::sync::OnceLock;
use std::sync::atomic::{AtomicI32, AtomicU32, Ordering};
use std::{env, mem, time};

View File

@@ -1,7 +1,7 @@
extern crate proc_macro;
use fish_tempfile::random_filename;
use proc_macro::TokenStream;
use std::{ffi::OsString, io::Write, path::PathBuf};
use std::{ffi::OsString, io::Write as _, path::PathBuf};
fn unescape_multiline_rust_string(s: String) -> String {
if !s.contains('\n') {

View File

@@ -22,7 +22,7 @@ fn embed_localizations(cache_dir: &Path) {
use fish_gettext_mo_file_parser::parse_mo_file;
use std::{
fs::File,
io::{BufWriter, Write},
io::{BufWriter, Write as _},
};
let po_dir = fish_build_helper::workspace_root()

View File

@@ -6,8 +6,7 @@
type Catalog = &'static phf::Map<&'static str, &'static str>;
static LANGUAGE_PRECEDENCE: LazyLock<Mutex<Vec<(&'static str, Catalog)>>> =
LazyLock::new(|| Mutex::new(vec![]));
static LANGUAGE_PRECEDENCE: Mutex<Vec<(&'static str, Catalog)>> = Mutex::new(Vec::new());
pub fn gettext(message_str: &'static str) -> Option<&'static str> {
let language_precedence = LANGUAGE_PRECEDENCE.lock().unwrap();

View File

@@ -51,7 +51,7 @@ macro_rules! sprintf {
{
// May be no args!
#[allow(unused_imports)]
use $crate::ToArg;
use $crate::ToArg as _;
$crate::printf_c_locale(
$target,
$fmt,

View File

@@ -6,8 +6,8 @@
use std::fmt::{self, Write};
use std::mem;
use std::result::Result;
use unicode_segmentation::UnicodeSegmentation;
use unicode_width::UnicodeWidthStr;
use unicode_segmentation::UnicodeSegmentation as _;
use unicode_width::UnicodeWidthStr as _;
#[cfg(feature = "widestring")]
use widestring::Utf32Str as wstr;

View File

@@ -1,6 +1,6 @@
use crate::arg::ToArg;
use crate::locale::{C_LOCALE, EN_US_LOCALE, Locale};
use crate::{Error, FormatString, sprintf_locale};
use crate::{Error, FormatString as _, sprintf_locale};
use std::f64::consts::{E, PI, TAU};
use std::ffi::CStr;
use std::fmt;
@@ -13,7 +13,7 @@ macro_rules! sprintf_check {
$(,)? // optional trailing comma
) => {
{
use unicode_width::UnicodeWidthStr;
use unicode_width::UnicodeWidthStr as _;
let mut target = String::new();
let mut args = [$($arg.to_arg()),*];
let len = $crate::printf_c_locale(

View File

@@ -5,7 +5,7 @@
path::PathBuf,
};
use rand::distr::{Alphanumeric, Distribution};
use rand::distr::{Alphanumeric, Distribution as _};
pub struct TempFile {
file: File,
@@ -114,7 +114,7 @@ pub fn new_dir() -> std::io::Result<TempDir> {
mod tests {
use std::{
fs::File,
io::{Read, Seek, Write},
io::{Read as _, Seek as _, Write as _},
};
#[test]

View File

@@ -1,7 +1,7 @@
//! Generic utilities library.
use fish_widestring::prelude::*;
use rand::{SeedableRng, rngs::SmallRng};
use rand::{SeedableRng as _, rngs::SmallRng};
use std::cmp::Ordering;
use std::time;

View File

@@ -1,7 +1,7 @@
use clap::{Parser, Subcommand};
use fish_build_helper::as_os_strs;
use std::{path::PathBuf, process::Command};
use xtask::{CommandExt, cargo};
use xtask::{CommandExt as _, cargo};
#[derive(Parser)]
#[command(

View File

@@ -102,7 +102,7 @@ The following options are available:
**--preset** should only be used in full binding sets (like when working on ``fish_vi_key_bindings``).
**-s** or **--silent**
Silences some of the error messages, including for unknown key names and unbound sequences.
Silences error message for unbound sequences.
**--color** *WHEN*
Controls when to use syntax highlighting colors when listing bindings.
@@ -401,6 +401,13 @@ The following special input functions are available:
``self-insert-notfirst``
inserts the matching sequence into the command line, unless the cursor is at the beginning
``get-key``
sets :envvar:`fish_key` to the key that was pressed to trigger this binding. Example use::
for i in (seq 0 9)
bind $i get-key 'commandline -i "#$fish_key"' 'set -eg fish_key'
end
``suppress-autosuggestion``
remove the current autosuggestion. Returns true if there was a suggestion to remove.

View File

@@ -20,7 +20,7 @@ Description
The ``fish_mode_prompt`` function outputs the mode indicator for use in vi mode.
The default ``fish_mode_prompt`` function will output indicators about the current vi editor mode displayed to the left of the regular prompt. Define your own function to customize the appearance of the mode indicator. The ``$fish_bind_mode variable`` can be used to determine the current mode. It will be one of ``default``, ``insert``, ``replace_one``, ``replace``, ``visual``, or ``operator``.
The default ``fish_mode_prompt`` function will output indicators about the current vi editor mode displayed to the left of the regular prompt. Define your own function to customize the appearance of the mode indicator. The ``$fish_bind_mode`` variable can be used to determine the current mode. It will be one of ``default``, ``insert``, ``replace_one``, ``replace``, ``visual``, or ``operator``.
You can also define an empty ``fish_mode_prompt`` function to remove the vi mode indicators::
@@ -55,7 +55,7 @@ Example
case visual
set_color --bold brmagenta
echo 'V'
case operator
case operator f F t T
set_color --bold cyan
echo 'N'
case '*'

View File

@@ -2044,7 +2044,7 @@ Here is what they mean:
- ``remove-percent-self`` turns off the special ``%self`` expansion. It was introduced in 4.0. To get fish's pid, you can use the :envvar:`fish_pid` variable.
- ``test-require-arg`` removes :doc:`builtin test <cmds/test>`'s one-argument form (``test "string"``. It was introduced in 4.0. To test if a string is non-empty, use ``test -n "string"``. If disabled, any call to ``test`` that would change sends a :ref:`debug message <debugging-fish>` of category "deprecated-test", so starting fish with ``fish --debug=deprecated-test`` can be used to find offending calls.
- ``mark-prompt`` makes fish report to the terminal the beginning and and of both shell prompts and command output.
- ``ignore-terminfo`` disables lookup of $TERM in the terminfo database. Use ``no-ignore-terminfo`` to turn it back on.
- ``ignore-terminfo`` was introduced in fish 4.1 and cannot be turned off since fish 4.5. It can still be tested for compatibility, but a ``no-ignore-terminfo`` value will be ignored. The flag disabled lookup of $TERM in the terminfo database.
- ``query-term`` allows fish to query the terminal by writing escape sequences and reading the terminal's response.
This enables features such as :ref:`scrolling <term-compat-cursor-position-report>`.
If you use an incompatible terminal, you can -- for the time being -- work around it by running (once) ``set -Ua fish_features no-query-term``.

View File

@@ -100,12 +100,12 @@ msgid "%s %s: unrecognized feature '%s'"
msgstr ""
#, c-format
msgid "%s (line %d):"
msgstr "%s (Zeile %d):"
msgid "%s (line %d)"
msgstr "%s (Zeile %d)"
#, c-format
msgid "%s (line %u):"
msgstr "%s (Zeile %u):"
msgid "%s (line %u)"
msgstr "%s (Zeile %u)"
#, c-format
msgid "%s and %s are mutually exclusive"
@@ -141,7 +141,7 @@ msgstr ""
#, c-format
msgid "%s: %s"
msgstr ""
msgstr "%s: %s"
#, c-format
msgid "%s: %s %s: options cannot be used together"
@@ -1460,12 +1460,12 @@ msgid "Standard input"
msgstr "Standardeingabe"
#, c-format
msgid "Standard input (line %d):"
msgid "Standard input (line %d)"
msgstr ""
#, c-format
msgid "Startup (line %d):"
msgstr "Start (Zeile %d):"
msgid "Startup (line %d)"
msgstr "Start (Zeile %d)"
msgid "State"
msgstr "Status"
@@ -6344,9 +6344,6 @@ msgstr ""
msgid "Aggregate sources for all modules in an aggregator project"
msgstr ""
msgid "Aggregate the consumed space of one or more directories or files"
msgstr ""
msgid "Aggressive scan options"
msgstr ""
@@ -13175,9 +13172,6 @@ msgstr ""
msgid "Count hard links multiple times"
msgstr "Harte Links mehrfach zählen"
msgid "Count hard-linked files each time they are seen"
msgstr ""
msgid "Count hidden files, too"
msgstr ""
@@ -16301,6 +16295,9 @@ msgstr ""
msgid "Disable chat search background indexer"
msgstr ""
msgid "Disable check for unique upload"
msgstr ""
msgid "Disable color"
msgstr ""
@@ -17429,9 +17426,6 @@ msgstr ""
msgid "Display answers as exclamation points and missing packets as dots"
msgstr ""
msgid "Display apparent size instead of disk usage"
msgstr ""
msgid "Display architecture specific information"
msgstr ""
@@ -17579,6 +17573,9 @@ msgstr ""
msgid "Display debugging information"
msgstr ""
msgid "Display debugging messages"
msgstr ""
msgid "Display deduplication histogram"
msgstr ""
@@ -17714,9 +17711,6 @@ msgstr ""
msgid "Display help and debug options"
msgstr ""
msgid "Display help and exit\t"
msgstr ""
msgid "Display help for Git Sizer"
msgstr ""
@@ -18065,6 +18059,9 @@ msgstr ""
msgid "Display hook variables"
msgstr ""
msgid "Display hosts listed in configuration"
msgstr ""
msgid "Display image centered on a backdrop"
msgstr ""
@@ -19307,9 +19304,6 @@ msgstr ""
msgid "Do not compress the uid/gid table"
msgstr ""
msgid "Do not compute total column for multiple inputs"
msgstr ""
msgid "Do not configure any interfaces"
msgstr ""
@@ -20480,9 +20474,6 @@ msgstr ""
msgid "Do not sort file arguments"
msgstr ""
msgid "Do not sort paths by their size in bytes"
msgstr ""
msgid "Do not sort the result"
msgstr ""
@@ -20636,6 +20627,9 @@ msgstr "Pakete nicht aktualisieren"
msgid "Do not upload binaries"
msgstr ""
msgid "Do not upload the files"
msgstr ""
msgid "Do not use \"abshi2\" pattern"
msgstr ""
@@ -20861,6 +20855,9 @@ msgstr ""
msgid "Do not write FETCH_HEAD file"
msgstr ""
msgid "Do not write a log file for uploads"
msgstr ""
msgid "Do not write a ~/.fehbg file"
msgstr ""
@@ -21230,6 +21227,9 @@ msgstr ""
msgid "Don't check if travis client is up to date"
msgstr ""
msgid "Don't check the signatures or upload the files"
msgstr ""
msgid "Don't clear the playlist"
msgstr ""
@@ -24425,6 +24425,9 @@ msgstr ""
msgid "Enable the JIT compiler"
msgstr ""
msgid "Enable the Lintian verification check"
msgstr ""
msgid "Enable the bitrate management engine"
msgstr ""
@@ -24458,6 +24461,9 @@ msgstr ""
msgid "Enable the live reloading in the development server, but only re-build files that have changed"
msgstr ""
msgid "Enable the local install check"
msgstr ""
msgid "Enable the necessary sparse-checkout config settings"
msgstr ""
@@ -30845,9 +30851,6 @@ msgstr ""
msgid "If project list is specified, also build projects that depend on projects on the list"
msgstr ""
msgid "If set, we will not cross filesystems or traverse mount points"
msgstr ""
msgid "If source path is a directory, publish all its content recursively"
msgstr ""
@@ -33482,9 +33485,6 @@ msgstr ""
msgid "Launch the Protontricks GUI"
msgstr ""
msgid "Launch the terminal user interface"
msgstr ""
msgid "Launch utility at startup and reload on file change"
msgstr ""
@@ -39722,9 +39722,6 @@ msgstr ""
msgid "One or more Kitchen Driver gems to be installed or added to a Gemfile "
msgstr ""
msgid "One or more absolute directories to ignore"
msgstr ""
msgid "Only match processes whose effective user ID is listed"
msgstr ""
@@ -44108,9 +44105,6 @@ msgstr ""
msgid "Print additional fields"
msgstr ""
msgid "Print additional statistics about the file traversal to stderr"
msgstr ""
msgid "Print all active monitors"
msgstr ""
@@ -44690,9 +44684,6 @@ msgstr ""
msgid "Print help message and exit"
msgstr ""
msgid "Print help message or the help of the given subcommand(s)"
msgstr ""
msgid "Print help of uncommon options"
msgstr ""
@@ -45689,6 +45680,9 @@ msgstr ""
msgid "Print the domain's hostname"
msgstr ""
msgid "Print the dput configuration"
msgstr ""
msgid "Print the drive capabilities for SCSI-3/mmc compliant drives"
msgstr ""
@@ -50624,6 +50618,9 @@ msgstr ""
msgid "Request distinct server name"
msgstr ""
msgid "Request dry-run of dinstall after upload"
msgstr ""
msgid "Request given address in DHCP DISCOVER message"
msgstr ""
@@ -66242,9 +66239,6 @@ msgstr ""
msgid "The age recipient the new group should contain. Can be specified more than once"
msgstr ""
msgid "The amount of threads to use"
msgstr ""
msgid "The architecture reported by uname in the container"
msgstr ""
@@ -66356,9 +66350,6 @@ msgstr ""
msgid "The format to convert to"
msgstr ""
msgid "The format with which to print byte counts"
msgstr ""
msgid "The full cost-based query optimiser is enabled."
msgstr ""
@@ -68948,6 +68939,9 @@ msgstr ""
msgid "Upload finished packages"
msgstr ""
msgid "Upload host"
msgstr ""
msgid "Upload locally saved terminal session to asciinema.org"
msgstr ""
@@ -68963,6 +68957,9 @@ msgstr ""
msgid "Upload stemcell"
msgstr ""
msgid "Upload to a delayed queue"
msgstr ""
msgid "Upload to server"
msgstr ""
@@ -70472,6 +70469,9 @@ msgstr ""
msgid "Use paired-single floating-point instructions"
msgstr ""
msgid "Use passive mode for FTP"
msgstr ""
msgid "Use passive mode for data transfers"
msgstr ""
@@ -78557,7 +78557,7 @@ msgstr ""
msgid "reset branch name to parent branch name"
msgstr ""
msgid "reset cache (DNS\t)"
msgid "reset cache"
msgstr ""
msgid "reset terminal state"

View File

@@ -100,12 +100,12 @@ msgid "%s %s: unrecognized feature '%s'"
msgstr ""
#, c-format
msgid "%s (line %d):"
msgstr "%s (line %d):"
msgid "%s (line %d)"
msgstr "%s (line %d)"
#, c-format
msgid "%s (line %u):"
msgstr "%s (line %u):"
msgid "%s (line %u)"
msgstr "%s (line %u)"
#, c-format
msgid "%s and %s are mutually exclusive"
@@ -1460,11 +1460,11 @@ msgid "Standard input"
msgstr "Standard input"
#, c-format
msgid "Standard input (line %d):"
msgid "Standard input (line %d)"
msgstr ""
#, c-format
msgid "Startup (line %d):"
msgid "Startup (line %d)"
msgstr ""
msgid "State"
@@ -6344,9 +6344,6 @@ msgstr ""
msgid "Aggregate sources for all modules in an aggregator project"
msgstr ""
msgid "Aggregate the consumed space of one or more directories or files"
msgstr ""
msgid "Aggressive scan options"
msgstr ""
@@ -13175,9 +13172,6 @@ msgstr ""
msgid "Count hard links multiple times"
msgstr "Count hard links multiple times"
msgid "Count hard-linked files each time they are seen"
msgstr ""
msgid "Count hidden files, too"
msgstr ""
@@ -16301,6 +16295,9 @@ msgstr ""
msgid "Disable chat search background indexer"
msgstr ""
msgid "Disable check for unique upload"
msgstr ""
msgid "Disable color"
msgstr ""
@@ -17429,9 +17426,6 @@ msgstr ""
msgid "Display answers as exclamation points and missing packets as dots"
msgstr ""
msgid "Display apparent size instead of disk usage"
msgstr ""
msgid "Display architecture specific information"
msgstr ""
@@ -17579,6 +17573,9 @@ msgstr ""
msgid "Display debugging information"
msgstr ""
msgid "Display debugging messages"
msgstr ""
msgid "Display deduplication histogram"
msgstr "Display deduplication histogram"
@@ -17714,9 +17711,6 @@ msgstr "Display help about darcs and darcs commands"
msgid "Display help and debug options"
msgstr ""
msgid "Display help and exit\t"
msgstr ""
msgid "Display help for Git Sizer"
msgstr ""
@@ -18065,6 +18059,9 @@ msgstr ""
msgid "Display hook variables"
msgstr ""
msgid "Display hosts listed in configuration"
msgstr ""
msgid "Display image centered on a backdrop"
msgstr ""
@@ -19307,9 +19304,6 @@ msgstr ""
msgid "Do not compress the uid/gid table"
msgstr ""
msgid "Do not compute total column for multiple inputs"
msgstr ""
msgid "Do not configure any interfaces"
msgstr ""
@@ -20480,9 +20474,6 @@ msgstr ""
msgid "Do not sort file arguments"
msgstr ""
msgid "Do not sort paths by their size in bytes"
msgstr ""
msgid "Do not sort the result"
msgstr ""
@@ -20636,6 +20627,9 @@ msgstr "Do not upgrade packages"
msgid "Do not upload binaries"
msgstr ""
msgid "Do not upload the files"
msgstr ""
msgid "Do not use \"abshi2\" pattern"
msgstr ""
@@ -20861,6 +20855,9 @@ msgstr ""
msgid "Do not write FETCH_HEAD file"
msgstr ""
msgid "Do not write a log file for uploads"
msgstr ""
msgid "Do not write a ~/.fehbg file"
msgstr ""
@@ -21230,6 +21227,9 @@ msgstr ""
msgid "Don't check if travis client is up to date"
msgstr ""
msgid "Don't check the signatures or upload the files"
msgstr ""
msgid "Don't clear the playlist"
msgstr ""
@@ -24425,6 +24425,9 @@ msgstr ""
msgid "Enable the JIT compiler"
msgstr ""
msgid "Enable the Lintian verification check"
msgstr ""
msgid "Enable the bitrate management engine"
msgstr ""
@@ -24458,6 +24461,9 @@ msgstr ""
msgid "Enable the live reloading in the development server, but only re-build files that have changed"
msgstr ""
msgid "Enable the local install check"
msgstr ""
msgid "Enable the necessary sparse-checkout config settings"
msgstr ""
@@ -30845,9 +30851,6 @@ msgstr ""
msgid "If project list is specified, also build projects that depend on projects on the list"
msgstr ""
msgid "If set, we will not cross filesystems or traverse mount points"
msgstr ""
msgid "If source path is a directory, publish all its content recursively"
msgstr ""
@@ -33482,9 +33485,6 @@ msgstr ""
msgid "Launch the Protontricks GUI"
msgstr ""
msgid "Launch the terminal user interface"
msgstr ""
msgid "Launch utility at startup and reload on file change"
msgstr ""
@@ -39722,9 +39722,6 @@ msgstr ""
msgid "One or more Kitchen Driver gems to be installed or added to a Gemfile "
msgstr ""
msgid "One or more absolute directories to ignore"
msgstr ""
msgid "Only match processes whose effective user ID is listed"
msgstr ""
@@ -44108,9 +44105,6 @@ msgstr ""
msgid "Print additional fields"
msgstr ""
msgid "Print additional statistics about the file traversal to stderr"
msgstr ""
msgid "Print all active monitors"
msgstr ""
@@ -44690,9 +44684,6 @@ msgstr ""
msgid "Print help message and exit"
msgstr "Print help message and exit"
msgid "Print help message or the help of the given subcommand(s)"
msgstr ""
msgid "Print help of uncommon options"
msgstr ""
@@ -45689,6 +45680,9 @@ msgstr ""
msgid "Print the domain's hostname"
msgstr ""
msgid "Print the dput configuration"
msgstr ""
msgid "Print the drive capabilities for SCSI-3/mmc compliant drives"
msgstr ""
@@ -50624,6 +50618,9 @@ msgstr ""
msgid "Request distinct server name"
msgstr ""
msgid "Request dry-run of dinstall after upload"
msgstr ""
msgid "Request given address in DHCP DISCOVER message"
msgstr ""
@@ -66242,9 +66239,6 @@ msgstr ""
msgid "The age recipient the new group should contain. Can be specified more than once"
msgstr ""
msgid "The amount of threads to use"
msgstr ""
msgid "The architecture reported by uname in the container"
msgstr ""
@@ -66356,9 +66350,6 @@ msgstr ""
msgid "The format to convert to"
msgstr ""
msgid "The format with which to print byte counts"
msgstr ""
msgid "The full cost-based query optimiser is enabled."
msgstr ""
@@ -68948,6 +68939,9 @@ msgstr ""
msgid "Upload finished packages"
msgstr ""
msgid "Upload host"
msgstr ""
msgid "Upload locally saved terminal session to asciinema.org"
msgstr ""
@@ -68963,6 +68957,9 @@ msgstr ""
msgid "Upload stemcell"
msgstr ""
msgid "Upload to a delayed queue"
msgstr ""
msgid "Upload to server"
msgstr ""
@@ -70472,6 +70469,9 @@ msgstr ""
msgid "Use paired-single floating-point instructions"
msgstr ""
msgid "Use passive mode for FTP"
msgstr ""
msgid "Use passive mode for data transfers"
msgstr ""
@@ -78557,7 +78557,7 @@ msgstr ""
msgid "reset branch name to parent branch name"
msgstr ""
msgid "reset cache (DNS\t)"
msgid "reset cache"
msgstr ""
msgid "reset terminal state"

View File

@@ -229,12 +229,12 @@ msgid "%s %s: unrecognized feature '%s'"
msgstr "%s %s : fonctionnalité non reconnue « %s »"
#, c-format
msgid "%s (line %d):"
msgstr "%s (ligne %d) :"
msgid "%s (line %d)"
msgstr "%s (ligne %d)"
#, c-format
msgid "%s (line %u):"
msgstr "%s (ligne %u) :"
msgid "%s (line %u)"
msgstr "%s (ligne %u)"
#, c-format
msgid "%s and %s are mutually exclusive"
@@ -1589,11 +1589,11 @@ msgid "Standard input"
msgstr "Entrée standard"
#, c-format
msgid "Standard input (line %d):"
msgid "Standard input (line %d)"
msgstr ""
#, c-format
msgid "Startup (line %d):"
msgid "Startup (line %d)"
msgstr ""
msgid "State"
@@ -6473,9 +6473,6 @@ msgstr ""
msgid "Aggregate sources for all modules in an aggregator project"
msgstr ""
msgid "Aggregate the consumed space of one or more directories or files"
msgstr ""
msgid "Aggressive scan options"
msgstr ""
@@ -13304,9 +13301,6 @@ msgstr ""
msgid "Count hard links multiple times"
msgstr "Compter plusieurs fois les liens matériels"
msgid "Count hard-linked files each time they are seen"
msgstr ""
msgid "Count hidden files, too"
msgstr ""
@@ -16430,6 +16424,9 @@ msgstr ""
msgid "Disable chat search background indexer"
msgstr ""
msgid "Disable check for unique upload"
msgstr ""
msgid "Disable color"
msgstr "Désactiver la couleur"
@@ -17558,9 +17555,6 @@ msgstr ""
msgid "Display answers as exclamation points and missing packets as dots"
msgstr ""
msgid "Display apparent size instead of disk usage"
msgstr ""
msgid "Display architecture specific information"
msgstr ""
@@ -17708,6 +17702,9 @@ msgstr "Afficher les symboles réservés au débogueur"
msgid "Display debugging information"
msgstr ""
msgid "Display debugging messages"
msgstr ""
msgid "Display deduplication histogram"
msgstr "Afficher lhistogramme de déduplication"
@@ -17843,9 +17840,6 @@ msgstr "Afficher une aide pour darcs et ses commandes"
msgid "Display help and debug options"
msgstr "Afficher laide et les options de débogage"
msgid "Display help and exit\t"
msgstr "Afficher laide et quitter\t"
msgid "Display help for Git Sizer"
msgstr ""
@@ -18194,6 +18188,9 @@ msgstr ""
msgid "Display hook variables"
msgstr ""
msgid "Display hosts listed in configuration"
msgstr ""
msgid "Display image centered on a backdrop"
msgstr ""
@@ -19436,9 +19433,6 @@ msgstr ""
msgid "Do not compress the uid/gid table"
msgstr ""
msgid "Do not compute total column for multiple inputs"
msgstr ""
msgid "Do not configure any interfaces"
msgstr ""
@@ -20609,9 +20603,6 @@ msgstr ""
msgid "Do not sort file arguments"
msgstr "Lister les fichiers dans lordre de larchive"
msgid "Do not sort paths by their size in bytes"
msgstr ""
msgid "Do not sort the result"
msgstr ""
@@ -20765,6 +20756,9 @@ msgstr "Ne pas mettre à jour les paquets"
msgid "Do not upload binaries"
msgstr "Ne pas téléverser les binaires"
msgid "Do not upload the files"
msgstr ""
msgid "Do not use \"abshi2\" pattern"
msgstr "Ne pas utiliser le motif « abshi2 »"
@@ -20990,6 +20984,9 @@ msgstr ""
msgid "Do not write FETCH_HEAD file"
msgstr ""
msgid "Do not write a log file for uploads"
msgstr ""
msgid "Do not write a ~/.fehbg file"
msgstr "Ne pas écrire de fichier ~/.fehbg"
@@ -21359,6 +21356,9 @@ msgstr ""
msgid "Don't check if travis client is up to date"
msgstr ""
msgid "Don't check the signatures or upload the files"
msgstr ""
msgid "Don't clear the playlist"
msgstr ""
@@ -24554,6 +24554,9 @@ msgstr ""
msgid "Enable the JIT compiler"
msgstr ""
msgid "Enable the Lintian verification check"
msgstr ""
msgid "Enable the bitrate management engine"
msgstr ""
@@ -24587,6 +24590,9 @@ msgstr ""
msgid "Enable the live reloading in the development server, but only re-build files that have changed"
msgstr ""
msgid "Enable the local install check"
msgstr ""
msgid "Enable the necessary sparse-checkout config settings"
msgstr ""
@@ -30974,9 +30980,6 @@ msgstr ""
msgid "If project list is specified, also build projects that depend on projects on the list"
msgstr ""
msgid "If set, we will not cross filesystems or traverse mount points"
msgstr ""
msgid "If source path is a directory, publish all its content recursively"
msgstr ""
@@ -33611,9 +33614,6 @@ msgstr ""
msgid "Launch the Protontricks GUI"
msgstr ""
msgid "Launch the terminal user interface"
msgstr ""
msgid "Launch utility at startup and reload on file change"
msgstr ""
@@ -39851,9 +39851,6 @@ msgstr ""
msgid "One or more Kitchen Driver gems to be installed or added to a Gemfile "
msgstr ""
msgid "One or more absolute directories to ignore"
msgstr ""
msgid "Only match processes whose effective user ID is listed"
msgstr ""
@@ -44237,9 +44234,6 @@ msgstr ""
msgid "Print additional fields"
msgstr ""
msgid "Print additional statistics about the file traversal to stderr"
msgstr ""
msgid "Print all active monitors"
msgstr ""
@@ -44819,9 +44813,6 @@ msgstr ""
msgid "Print help message and exit"
msgstr "Afficher un message daide et quitter"
msgid "Print help message or the help of the given subcommand(s)"
msgstr ""
msgid "Print help of uncommon options"
msgstr ""
@@ -45818,6 +45809,9 @@ msgstr "Afficher la description dune clé"
msgid "Print the domain's hostname"
msgstr ""
msgid "Print the dput configuration"
msgstr ""
msgid "Print the drive capabilities for SCSI-3/mmc compliant drives"
msgstr ""
@@ -50753,6 +50747,9 @@ msgstr ""
msgid "Request distinct server name"
msgstr ""
msgid "Request dry-run of dinstall after upload"
msgstr ""
msgid "Request given address in DHCP DISCOVER message"
msgstr "Demander ladresse spécifiée dans les messages DHCP DISCOVER"
@@ -66371,9 +66368,6 @@ msgstr ""
msgid "The age recipient the new group should contain. Can be specified more than once"
msgstr ""
msgid "The amount of threads to use"
msgstr ""
msgid "The architecture reported by uname in the container"
msgstr ""
@@ -66485,9 +66479,6 @@ msgstr ""
msgid "The format to convert to"
msgstr ""
msgid "The format with which to print byte counts"
msgstr ""
msgid "The full cost-based query optimiser is enabled."
msgstr ""
@@ -69077,6 +69068,9 @@ msgstr ""
msgid "Upload finished packages"
msgstr "Téléverser les paquets achevés"
msgid "Upload host"
msgstr ""
msgid "Upload locally saved terminal session to asciinema.org"
msgstr ""
@@ -69092,6 +69086,9 @@ msgstr ""
msgid "Upload stemcell"
msgstr ""
msgid "Upload to a delayed queue"
msgstr ""
msgid "Upload to server"
msgstr "Téléverser vers le serveur"
@@ -70601,6 +70598,9 @@ msgstr ""
msgid "Use paired-single floating-point instructions"
msgstr ""
msgid "Use passive mode for FTP"
msgstr ""
msgid "Use passive mode for data transfers"
msgstr ""
@@ -78686,7 +78686,7 @@ msgstr ""
msgid "reset branch name to parent branch name"
msgstr ""
msgid "reset cache (DNS\t)"
msgid "reset cache"
msgstr ""
msgid "reset terminal state"

View File

@@ -96,12 +96,12 @@ msgid "%s %s: unrecognized feature '%s'"
msgstr ""
#, c-format
msgid "%s (line %d):"
msgstr "%s (linia %d):"
msgid "%s (line %d)"
msgstr "%s (linia %d)"
#, c-format
msgid "%s (line %u):"
msgstr "%s (linia %u):"
msgid "%s (line %u)"
msgstr "%s (linia %u)"
#, c-format
msgid "%s and %s are mutually exclusive"
@@ -1456,11 +1456,11 @@ msgid "Standard input"
msgstr "Standardowe wejście"
#, c-format
msgid "Standard input (line %d):"
msgid "Standard input (line %d)"
msgstr ""
#, c-format
msgid "Startup (line %d):"
msgid "Startup (line %d)"
msgstr ""
msgid "State"
@@ -6340,9 +6340,6 @@ msgstr ""
msgid "Aggregate sources for all modules in an aggregator project"
msgstr ""
msgid "Aggregate the consumed space of one or more directories or files"
msgstr ""
msgid "Aggressive scan options"
msgstr ""
@@ -13171,9 +13168,6 @@ msgstr ""
msgid "Count hard links multiple times"
msgstr ""
msgid "Count hard-linked files each time they are seen"
msgstr ""
msgid "Count hidden files, too"
msgstr ""
@@ -16297,6 +16291,9 @@ msgstr ""
msgid "Disable chat search background indexer"
msgstr ""
msgid "Disable check for unique upload"
msgstr ""
msgid "Disable color"
msgstr ""
@@ -17425,9 +17422,6 @@ msgstr ""
msgid "Display answers as exclamation points and missing packets as dots"
msgstr ""
msgid "Display apparent size instead of disk usage"
msgstr ""
msgid "Display architecture specific information"
msgstr ""
@@ -17575,6 +17569,9 @@ msgstr ""
msgid "Display debugging information"
msgstr ""
msgid "Display debugging messages"
msgstr ""
msgid "Display deduplication histogram"
msgstr ""
@@ -17710,9 +17707,6 @@ msgstr ""
msgid "Display help and debug options"
msgstr ""
msgid "Display help and exit\t"
msgstr ""
msgid "Display help for Git Sizer"
msgstr ""
@@ -18061,6 +18055,9 @@ msgstr ""
msgid "Display hook variables"
msgstr ""
msgid "Display hosts listed in configuration"
msgstr ""
msgid "Display image centered on a backdrop"
msgstr ""
@@ -19303,9 +19300,6 @@ msgstr ""
msgid "Do not compress the uid/gid table"
msgstr ""
msgid "Do not compute total column for multiple inputs"
msgstr ""
msgid "Do not configure any interfaces"
msgstr ""
@@ -20476,9 +20470,6 @@ msgstr ""
msgid "Do not sort file arguments"
msgstr ""
msgid "Do not sort paths by their size in bytes"
msgstr ""
msgid "Do not sort the result"
msgstr ""
@@ -20632,6 +20623,9 @@ msgstr ""
msgid "Do not upload binaries"
msgstr ""
msgid "Do not upload the files"
msgstr ""
msgid "Do not use \"abshi2\" pattern"
msgstr ""
@@ -20857,6 +20851,9 @@ msgstr ""
msgid "Do not write FETCH_HEAD file"
msgstr ""
msgid "Do not write a log file for uploads"
msgstr ""
msgid "Do not write a ~/.fehbg file"
msgstr ""
@@ -21226,6 +21223,9 @@ msgstr ""
msgid "Don't check if travis client is up to date"
msgstr ""
msgid "Don't check the signatures or upload the files"
msgstr ""
msgid "Don't clear the playlist"
msgstr ""
@@ -24421,6 +24421,9 @@ msgstr ""
msgid "Enable the JIT compiler"
msgstr ""
msgid "Enable the Lintian verification check"
msgstr ""
msgid "Enable the bitrate management engine"
msgstr ""
@@ -24454,6 +24457,9 @@ msgstr ""
msgid "Enable the live reloading in the development server, but only re-build files that have changed"
msgstr ""
msgid "Enable the local install check"
msgstr ""
msgid "Enable the necessary sparse-checkout config settings"
msgstr ""
@@ -30841,9 +30847,6 @@ msgstr ""
msgid "If project list is specified, also build projects that depend on projects on the list"
msgstr ""
msgid "If set, we will not cross filesystems or traverse mount points"
msgstr ""
msgid "If source path is a directory, publish all its content recursively"
msgstr ""
@@ -33478,9 +33481,6 @@ msgstr ""
msgid "Launch the Protontricks GUI"
msgstr ""
msgid "Launch the terminal user interface"
msgstr ""
msgid "Launch utility at startup and reload on file change"
msgstr ""
@@ -39718,9 +39718,6 @@ msgstr ""
msgid "One or more Kitchen Driver gems to be installed or added to a Gemfile "
msgstr ""
msgid "One or more absolute directories to ignore"
msgstr ""
msgid "Only match processes whose effective user ID is listed"
msgstr ""
@@ -44104,9 +44101,6 @@ msgstr ""
msgid "Print additional fields"
msgstr ""
msgid "Print additional statistics about the file traversal to stderr"
msgstr ""
msgid "Print all active monitors"
msgstr ""
@@ -44686,9 +44680,6 @@ msgstr ""
msgid "Print help message and exit"
msgstr ""
msgid "Print help message or the help of the given subcommand(s)"
msgstr ""
msgid "Print help of uncommon options"
msgstr ""
@@ -45685,6 +45676,9 @@ msgstr ""
msgid "Print the domain's hostname"
msgstr ""
msgid "Print the dput configuration"
msgstr ""
msgid "Print the drive capabilities for SCSI-3/mmc compliant drives"
msgstr ""
@@ -50620,6 +50614,9 @@ msgstr ""
msgid "Request distinct server name"
msgstr ""
msgid "Request dry-run of dinstall after upload"
msgstr ""
msgid "Request given address in DHCP DISCOVER message"
msgstr ""
@@ -66238,9 +66235,6 @@ msgstr ""
msgid "The age recipient the new group should contain. Can be specified more than once"
msgstr ""
msgid "The amount of threads to use"
msgstr ""
msgid "The architecture reported by uname in the container"
msgstr ""
@@ -66352,9 +66346,6 @@ msgstr ""
msgid "The format to convert to"
msgstr ""
msgid "The format with which to print byte counts"
msgstr ""
msgid "The full cost-based query optimiser is enabled."
msgstr ""
@@ -68944,6 +68935,9 @@ msgstr ""
msgid "Upload finished packages"
msgstr ""
msgid "Upload host"
msgstr ""
msgid "Upload locally saved terminal session to asciinema.org"
msgstr ""
@@ -68959,6 +68953,9 @@ msgstr ""
msgid "Upload stemcell"
msgstr ""
msgid "Upload to a delayed queue"
msgstr ""
msgid "Upload to server"
msgstr ""
@@ -70468,6 +70465,9 @@ msgstr ""
msgid "Use paired-single floating-point instructions"
msgstr ""
msgid "Use passive mode for FTP"
msgstr ""
msgid "Use passive mode for data transfers"
msgstr ""
@@ -78553,7 +78553,7 @@ msgstr ""
msgid "reset branch name to parent branch name"
msgstr ""
msgid "reset cache (DNS\t)"
msgid "reset cache"
msgstr ""
msgid "reset terminal state"

View File

@@ -101,12 +101,12 @@ msgid "%s %s: unrecognized feature '%s'"
msgstr ""
#, c-format
msgid "%s (line %d):"
msgstr "%s (linha %d):"
msgid "%s (line %d)"
msgstr "%s (linha %d)"
#, c-format
msgid "%s (line %u):"
msgstr "%s (linha %u):"
msgid "%s (line %u)"
msgstr "%s (linha %u)"
#, c-format
msgid "%s and %s are mutually exclusive"
@@ -1461,11 +1461,11 @@ msgid "Standard input"
msgstr "Entrada padrão"
#, c-format
msgid "Standard input (line %d):"
msgid "Standard input (line %d)"
msgstr ""
#, c-format
msgid "Startup (line %d):"
msgid "Startup (line %d)"
msgstr ""
msgid "State"
@@ -6345,9 +6345,6 @@ msgstr ""
msgid "Aggregate sources for all modules in an aggregator project"
msgstr ""
msgid "Aggregate the consumed space of one or more directories or files"
msgstr ""
msgid "Aggressive scan options"
msgstr ""
@@ -13176,9 +13173,6 @@ msgstr ""
msgid "Count hard links multiple times"
msgstr "Count hard links multiple times"
msgid "Count hard-linked files each time they are seen"
msgstr ""
msgid "Count hidden files, too"
msgstr ""
@@ -16302,6 +16296,9 @@ msgstr ""
msgid "Disable chat search background indexer"
msgstr ""
msgid "Disable check for unique upload"
msgstr ""
msgid "Disable color"
msgstr ""
@@ -17430,9 +17427,6 @@ msgstr ""
msgid "Display answers as exclamation points and missing packets as dots"
msgstr ""
msgid "Display apparent size instead of disk usage"
msgstr ""
msgid "Display architecture specific information"
msgstr ""
@@ -17580,6 +17574,9 @@ msgstr ""
msgid "Display debugging information"
msgstr ""
msgid "Display debugging messages"
msgstr ""
msgid "Display deduplication histogram"
msgstr ""
@@ -17715,9 +17712,6 @@ msgstr ""
msgid "Display help and debug options"
msgstr ""
msgid "Display help and exit\t"
msgstr ""
msgid "Display help for Git Sizer"
msgstr ""
@@ -18066,6 +18060,9 @@ msgstr ""
msgid "Display hook variables"
msgstr ""
msgid "Display hosts listed in configuration"
msgstr ""
msgid "Display image centered on a backdrop"
msgstr ""
@@ -19308,9 +19305,6 @@ msgstr ""
msgid "Do not compress the uid/gid table"
msgstr ""
msgid "Do not compute total column for multiple inputs"
msgstr ""
msgid "Do not configure any interfaces"
msgstr ""
@@ -20481,9 +20475,6 @@ msgstr ""
msgid "Do not sort file arguments"
msgstr ""
msgid "Do not sort paths by their size in bytes"
msgstr ""
msgid "Do not sort the result"
msgstr ""
@@ -20637,6 +20628,9 @@ msgstr ""
msgid "Do not upload binaries"
msgstr ""
msgid "Do not upload the files"
msgstr ""
msgid "Do not use \"abshi2\" pattern"
msgstr ""
@@ -20862,6 +20856,9 @@ msgstr ""
msgid "Do not write FETCH_HEAD file"
msgstr ""
msgid "Do not write a log file for uploads"
msgstr ""
msgid "Do not write a ~/.fehbg file"
msgstr ""
@@ -21231,6 +21228,9 @@ msgstr ""
msgid "Don't check if travis client is up to date"
msgstr ""
msgid "Don't check the signatures or upload the files"
msgstr ""
msgid "Don't clear the playlist"
msgstr ""
@@ -24426,6 +24426,9 @@ msgstr ""
msgid "Enable the JIT compiler"
msgstr ""
msgid "Enable the Lintian verification check"
msgstr ""
msgid "Enable the bitrate management engine"
msgstr ""
@@ -24459,6 +24462,9 @@ msgstr ""
msgid "Enable the live reloading in the development server, but only re-build files that have changed"
msgstr ""
msgid "Enable the local install check"
msgstr ""
msgid "Enable the necessary sparse-checkout config settings"
msgstr ""
@@ -30846,9 +30852,6 @@ msgstr ""
msgid "If project list is specified, also build projects that depend on projects on the list"
msgstr ""
msgid "If set, we will not cross filesystems or traverse mount points"
msgstr ""
msgid "If source path is a directory, publish all its content recursively"
msgstr ""
@@ -33483,9 +33486,6 @@ msgstr ""
msgid "Launch the Protontricks GUI"
msgstr ""
msgid "Launch the terminal user interface"
msgstr ""
msgid "Launch utility at startup and reload on file change"
msgstr ""
@@ -39723,9 +39723,6 @@ msgstr ""
msgid "One or more Kitchen Driver gems to be installed or added to a Gemfile "
msgstr ""
msgid "One or more absolute directories to ignore"
msgstr ""
msgid "Only match processes whose effective user ID is listed"
msgstr ""
@@ -44109,9 +44106,6 @@ msgstr ""
msgid "Print additional fields"
msgstr ""
msgid "Print additional statistics about the file traversal to stderr"
msgstr ""
msgid "Print all active monitors"
msgstr ""
@@ -44691,9 +44685,6 @@ msgstr ""
msgid "Print help message and exit"
msgstr ""
msgid "Print help message or the help of the given subcommand(s)"
msgstr ""
msgid "Print help of uncommon options"
msgstr ""
@@ -45690,6 +45681,9 @@ msgstr ""
msgid "Print the domain's hostname"
msgstr ""
msgid "Print the dput configuration"
msgstr ""
msgid "Print the drive capabilities for SCSI-3/mmc compliant drives"
msgstr ""
@@ -50625,6 +50619,9 @@ msgstr ""
msgid "Request distinct server name"
msgstr ""
msgid "Request dry-run of dinstall after upload"
msgstr ""
msgid "Request given address in DHCP DISCOVER message"
msgstr ""
@@ -66243,9 +66240,6 @@ msgstr ""
msgid "The age recipient the new group should contain. Can be specified more than once"
msgstr ""
msgid "The amount of threads to use"
msgstr ""
msgid "The architecture reported by uname in the container"
msgstr ""
@@ -66357,9 +66351,6 @@ msgstr ""
msgid "The format to convert to"
msgstr ""
msgid "The format with which to print byte counts"
msgstr ""
msgid "The full cost-based query optimiser is enabled."
msgstr ""
@@ -68949,6 +68940,9 @@ msgstr ""
msgid "Upload finished packages"
msgstr ""
msgid "Upload host"
msgstr ""
msgid "Upload locally saved terminal session to asciinema.org"
msgstr ""
@@ -68964,6 +68958,9 @@ msgstr ""
msgid "Upload stemcell"
msgstr ""
msgid "Upload to a delayed queue"
msgstr ""
msgid "Upload to server"
msgstr ""
@@ -70473,6 +70470,9 @@ msgstr ""
msgid "Use paired-single floating-point instructions"
msgstr ""
msgid "Use passive mode for FTP"
msgstr ""
msgid "Use passive mode for data transfers"
msgstr ""
@@ -78558,7 +78558,7 @@ msgstr ""
msgid "reset branch name to parent branch name"
msgstr ""
msgid "reset cache (DNS\t)"
msgid "reset cache"
msgstr ""
msgid "reset terminal state"

View File

@@ -97,11 +97,11 @@ msgid "%s %s: unrecognized feature '%s'"
msgstr ""
#, c-format
msgid "%s (line %d):"
msgstr "%s (rad %d):"
msgid "%s (line %d)"
msgstr "%s (rad %d)"
#, c-format
msgid "%s (line %u):"
msgid "%s (line %u)"
msgstr ""
#, c-format
@@ -1457,11 +1457,11 @@ msgid "Standard input"
msgstr "Standard in"
#, c-format
msgid "Standard input (line %d):"
msgid "Standard input (line %d)"
msgstr ""
#, c-format
msgid "Startup (line %d):"
msgid "Startup (line %d)"
msgstr ""
msgid "State"
@@ -6341,9 +6341,6 @@ msgstr ""
msgid "Aggregate sources for all modules in an aggregator project"
msgstr ""
msgid "Aggregate the consumed space of one or more directories or files"
msgstr ""
msgid "Aggressive scan options"
msgstr ""
@@ -13172,9 +13169,6 @@ msgstr ""
msgid "Count hard links multiple times"
msgstr "Räkna hårda länkar alla gånger de förekommer"
msgid "Count hard-linked files each time they are seen"
msgstr ""
msgid "Count hidden files, too"
msgstr ""
@@ -16298,6 +16292,9 @@ msgstr ""
msgid "Disable chat search background indexer"
msgstr ""
msgid "Disable check for unique upload"
msgstr ""
msgid "Disable color"
msgstr ""
@@ -17426,9 +17423,6 @@ msgstr ""
msgid "Display answers as exclamation points and missing packets as dots"
msgstr ""
msgid "Display apparent size instead of disk usage"
msgstr ""
msgid "Display architecture specific information"
msgstr ""
@@ -17576,6 +17570,9 @@ msgstr ""
msgid "Display debugging information"
msgstr ""
msgid "Display debugging messages"
msgstr ""
msgid "Display deduplication histogram"
msgstr ""
@@ -17711,9 +17708,6 @@ msgstr ""
msgid "Display help and debug options"
msgstr "Visa hjälp och debug-val"
msgid "Display help and exit\t"
msgstr ""
msgid "Display help for Git Sizer"
msgstr ""
@@ -18062,6 +18056,9 @@ msgstr ""
msgid "Display hook variables"
msgstr ""
msgid "Display hosts listed in configuration"
msgstr ""
msgid "Display image centered on a backdrop"
msgstr ""
@@ -19304,9 +19301,6 @@ msgstr ""
msgid "Do not compress the uid/gid table"
msgstr ""
msgid "Do not compute total column for multiple inputs"
msgstr ""
msgid "Do not configure any interfaces"
msgstr ""
@@ -20477,9 +20471,6 @@ msgstr ""
msgid "Do not sort file arguments"
msgstr ""
msgid "Do not sort paths by their size in bytes"
msgstr ""
msgid "Do not sort the result"
msgstr ""
@@ -20633,6 +20624,9 @@ msgstr "Upgradera inte paket"
msgid "Do not upload binaries"
msgstr ""
msgid "Do not upload the files"
msgstr ""
msgid "Do not use \"abshi2\" pattern"
msgstr ""
@@ -20858,6 +20852,9 @@ msgstr ""
msgid "Do not write FETCH_HEAD file"
msgstr ""
msgid "Do not write a log file for uploads"
msgstr ""
msgid "Do not write a ~/.fehbg file"
msgstr ""
@@ -21227,6 +21224,9 @@ msgstr ""
msgid "Don't check if travis client is up to date"
msgstr ""
msgid "Don't check the signatures or upload the files"
msgstr ""
msgid "Don't clear the playlist"
msgstr ""
@@ -24422,6 +24422,9 @@ msgstr ""
msgid "Enable the JIT compiler"
msgstr ""
msgid "Enable the Lintian verification check"
msgstr ""
msgid "Enable the bitrate management engine"
msgstr ""
@@ -24455,6 +24458,9 @@ msgstr ""
msgid "Enable the live reloading in the development server, but only re-build files that have changed"
msgstr ""
msgid "Enable the local install check"
msgstr ""
msgid "Enable the necessary sparse-checkout config settings"
msgstr ""
@@ -30842,9 +30848,6 @@ msgstr ""
msgid "If project list is specified, also build projects that depend on projects on the list"
msgstr ""
msgid "If set, we will not cross filesystems or traverse mount points"
msgstr ""
msgid "If source path is a directory, publish all its content recursively"
msgstr ""
@@ -33479,9 +33482,6 @@ msgstr ""
msgid "Launch the Protontricks GUI"
msgstr ""
msgid "Launch the terminal user interface"
msgstr ""
msgid "Launch utility at startup and reload on file change"
msgstr ""
@@ -39719,9 +39719,6 @@ msgstr ""
msgid "One or more Kitchen Driver gems to be installed or added to a Gemfile "
msgstr ""
msgid "One or more absolute directories to ignore"
msgstr ""
msgid "Only match processes whose effective user ID is listed"
msgstr ""
@@ -44105,9 +44102,6 @@ msgstr ""
msgid "Print additional fields"
msgstr ""
msgid "Print additional statistics about the file traversal to stderr"
msgstr ""
msgid "Print all active monitors"
msgstr ""
@@ -44687,9 +44681,6 @@ msgstr ""
msgid "Print help message and exit"
msgstr ""
msgid "Print help message or the help of the given subcommand(s)"
msgstr ""
msgid "Print help of uncommon options"
msgstr ""
@@ -45686,6 +45677,9 @@ msgstr ""
msgid "Print the domain's hostname"
msgstr ""
msgid "Print the dput configuration"
msgstr ""
msgid "Print the drive capabilities for SCSI-3/mmc compliant drives"
msgstr ""
@@ -50621,6 +50615,9 @@ msgstr ""
msgid "Request distinct server name"
msgstr ""
msgid "Request dry-run of dinstall after upload"
msgstr ""
msgid "Request given address in DHCP DISCOVER message"
msgstr ""
@@ -66239,9 +66236,6 @@ msgstr ""
msgid "The age recipient the new group should contain. Can be specified more than once"
msgstr ""
msgid "The amount of threads to use"
msgstr ""
msgid "The architecture reported by uname in the container"
msgstr ""
@@ -66353,9 +66347,6 @@ msgstr ""
msgid "The format to convert to"
msgstr ""
msgid "The format with which to print byte counts"
msgstr ""
msgid "The full cost-based query optimiser is enabled."
msgstr ""
@@ -68945,6 +68936,9 @@ msgstr ""
msgid "Upload finished packages"
msgstr ""
msgid "Upload host"
msgstr ""
msgid "Upload locally saved terminal session to asciinema.org"
msgstr ""
@@ -68960,6 +68954,9 @@ msgstr ""
msgid "Upload stemcell"
msgstr ""
msgid "Upload to a delayed queue"
msgstr ""
msgid "Upload to server"
msgstr ""
@@ -70469,6 +70466,9 @@ msgstr ""
msgid "Use paired-single floating-point instructions"
msgstr ""
msgid "Use passive mode for FTP"
msgstr ""
msgid "Use passive mode for data transfers"
msgstr ""
@@ -78554,7 +78554,7 @@ msgstr ""
msgid "reset branch name to parent branch name"
msgstr ""
msgid "reset cache (DNS\t)"
msgid "reset cache"
msgstr ""
msgid "reset terminal state"

View File

@@ -121,12 +121,12 @@ msgid "%s %s: unrecognized feature '%s'"
msgstr "%s %s: 未识别的特性 '%s'"
#, c-format
msgid "%s (line %d):"
msgstr "%s (行 %d):"
msgid "%s (line %d)"
msgstr "%s (行 %d)"
#, c-format
msgid "%s (line %u):"
msgstr "%s (行 %u):"
msgid "%s (line %u)"
msgstr "%s (行 %u)"
#, c-format
msgid "%s and %s are mutually exclusive"
@@ -1481,12 +1481,12 @@ msgid "Standard input"
msgstr "标准输入"
#, c-format
msgid "Standard input (line %d):"
msgstr "标准输入 (行 %d)"
msgid "Standard input (line %d)"
msgstr "标准输入 (行 %d)"
#, c-format
msgid "Startup (line %d):"
msgstr "启动 (行 %d)"
msgid "Startup (line %d)"
msgstr "启动 (行 %d)"
msgid "State"
msgstr "状态"
@@ -6368,9 +6368,6 @@ msgstr ""
msgid "Aggregate sources for all modules in an aggregator project"
msgstr ""
msgid "Aggregate the consumed space of one or more directories or files"
msgstr ""
msgid "Aggressive scan options"
msgstr ""
@@ -13199,9 +13196,6 @@ msgstr ""
msgid "Count hard links multiple times"
msgstr ""
msgid "Count hard-linked files each time they are seen"
msgstr ""
msgid "Count hidden files, too"
msgstr ""
@@ -16325,6 +16319,9 @@ msgstr ""
msgid "Disable chat search background indexer"
msgstr ""
msgid "Disable check for unique upload"
msgstr ""
msgid "Disable color"
msgstr ""
@@ -17453,9 +17450,6 @@ msgstr ""
msgid "Display answers as exclamation points and missing packets as dots"
msgstr ""
msgid "Display apparent size instead of disk usage"
msgstr ""
msgid "Display architecture specific information"
msgstr ""
@@ -17603,6 +17597,9 @@ msgstr ""
msgid "Display debugging information"
msgstr ""
msgid "Display debugging messages"
msgstr ""
msgid "Display deduplication histogram"
msgstr ""
@@ -17738,9 +17735,6 @@ msgstr ""
msgid "Display help and debug options"
msgstr ""
msgid "Display help and exit\t"
msgstr ""
msgid "Display help for Git Sizer"
msgstr ""
@@ -18089,6 +18083,9 @@ msgstr ""
msgid "Display hook variables"
msgstr ""
msgid "Display hosts listed in configuration"
msgstr ""
msgid "Display image centered on a backdrop"
msgstr ""
@@ -19331,9 +19328,6 @@ msgstr ""
msgid "Do not compress the uid/gid table"
msgstr ""
msgid "Do not compute total column for multiple inputs"
msgstr ""
msgid "Do not configure any interfaces"
msgstr ""
@@ -20504,9 +20498,6 @@ msgstr ""
msgid "Do not sort file arguments"
msgstr ""
msgid "Do not sort paths by their size in bytes"
msgstr ""
msgid "Do not sort the result"
msgstr ""
@@ -20660,6 +20651,9 @@ msgstr ""
msgid "Do not upload binaries"
msgstr ""
msgid "Do not upload the files"
msgstr ""
msgid "Do not use \"abshi2\" pattern"
msgstr ""
@@ -20885,6 +20879,9 @@ msgstr ""
msgid "Do not write FETCH_HEAD file"
msgstr ""
msgid "Do not write a log file for uploads"
msgstr ""
msgid "Do not write a ~/.fehbg file"
msgstr ""
@@ -21254,6 +21251,9 @@ msgstr ""
msgid "Don't check if travis client is up to date"
msgstr ""
msgid "Don't check the signatures or upload the files"
msgstr ""
msgid "Don't clear the playlist"
msgstr ""
@@ -24449,6 +24449,9 @@ msgstr ""
msgid "Enable the JIT compiler"
msgstr ""
msgid "Enable the Lintian verification check"
msgstr ""
msgid "Enable the bitrate management engine"
msgstr ""
@@ -24482,6 +24485,9 @@ msgstr ""
msgid "Enable the live reloading in the development server, but only re-build files that have changed"
msgstr ""
msgid "Enable the local install check"
msgstr ""
msgid "Enable the necessary sparse-checkout config settings"
msgstr ""
@@ -30869,9 +30875,6 @@ msgstr ""
msgid "If project list is specified, also build projects that depend on projects on the list"
msgstr ""
msgid "If set, we will not cross filesystems or traverse mount points"
msgstr ""
msgid "If source path is a directory, publish all its content recursively"
msgstr ""
@@ -33506,9 +33509,6 @@ msgstr ""
msgid "Launch the Protontricks GUI"
msgstr ""
msgid "Launch the terminal user interface"
msgstr ""
msgid "Launch utility at startup and reload on file change"
msgstr ""
@@ -39746,9 +39746,6 @@ msgstr ""
msgid "One or more Kitchen Driver gems to be installed or added to a Gemfile "
msgstr ""
msgid "One or more absolute directories to ignore"
msgstr ""
msgid "Only match processes whose effective user ID is listed"
msgstr ""
@@ -44132,9 +44129,6 @@ msgstr ""
msgid "Print additional fields"
msgstr ""
msgid "Print additional statistics about the file traversal to stderr"
msgstr ""
msgid "Print all active monitors"
msgstr ""
@@ -44714,9 +44708,6 @@ msgstr ""
msgid "Print help message and exit"
msgstr ""
msgid "Print help message or the help of the given subcommand(s)"
msgstr ""
msgid "Print help of uncommon options"
msgstr ""
@@ -45713,6 +45704,9 @@ msgstr ""
msgid "Print the domain's hostname"
msgstr ""
msgid "Print the dput configuration"
msgstr ""
msgid "Print the drive capabilities for SCSI-3/mmc compliant drives"
msgstr ""
@@ -50648,6 +50642,9 @@ msgstr ""
msgid "Request distinct server name"
msgstr ""
msgid "Request dry-run of dinstall after upload"
msgstr ""
msgid "Request given address in DHCP DISCOVER message"
msgstr ""
@@ -66266,9 +66263,6 @@ msgstr ""
msgid "The age recipient the new group should contain. Can be specified more than once"
msgstr ""
msgid "The amount of threads to use"
msgstr ""
msgid "The architecture reported by uname in the container"
msgstr ""
@@ -66380,9 +66374,6 @@ msgstr ""
msgid "The format to convert to"
msgstr ""
msgid "The format with which to print byte counts"
msgstr ""
msgid "The full cost-based query optimiser is enabled."
msgstr ""
@@ -68972,6 +68963,9 @@ msgstr ""
msgid "Upload finished packages"
msgstr ""
msgid "Upload host"
msgstr ""
msgid "Upload locally saved terminal session to asciinema.org"
msgstr ""
@@ -68987,6 +68981,9 @@ msgstr ""
msgid "Upload stemcell"
msgstr ""
msgid "Upload to a delayed queue"
msgstr ""
msgid "Upload to server"
msgstr ""
@@ -70496,6 +70493,9 @@ msgstr ""
msgid "Use paired-single floating-point instructions"
msgstr ""
msgid "Use passive mode for FTP"
msgstr ""
msgid "Use passive mode for data transfers"
msgstr ""
@@ -78581,7 +78581,7 @@ msgstr ""
msgid "reset branch name to parent branch name"
msgstr ""
msgid "reset cache (DNS\t)"
msgid "reset cache"
msgstr ""
msgid "reset terminal state"

View File

@@ -94,12 +94,12 @@ msgid "%s %s: unrecognized feature '%s'"
msgstr "%s %s不認識的功能「%s」"
#, c-format
msgid "%s (line %d):"
msgstr "%s第 %d 行)"
msgid "%s (line %d)"
msgstr "%s第 %d 行)"
#, c-format
msgid "%s (line %u):"
msgstr "%s第 %u 行)"
msgid "%s (line %u)"
msgstr "%s第 %u 行)"
#, c-format
msgid "%s and %s are mutually exclusive"
@@ -1456,12 +1456,12 @@ msgid "Standard input"
msgstr "標準輸入流"
#, c-format
msgid "Standard input (line %d):"
msgstr "標準輸入流(第 %d 行)"
msgid "Standard input (line %d)"
msgstr "標準輸入流(第 %d 行)"
#, c-format
msgid "Startup (line %d):"
msgstr "啟動命令稿(第 %d 行)"
msgid "Startup (line %d)"
msgstr "啟動命令稿(第 %d 行)"
msgid "State"
msgstr "狀態"
@@ -6345,9 +6345,6 @@ msgstr ""
msgid "Aggregate sources for all modules in an aggregator project"
msgstr ""
msgid "Aggregate the consumed space of one or more directories or files"
msgstr ""
msgid "Aggressive scan options"
msgstr ""
@@ -13176,9 +13173,6 @@ msgstr ""
msgid "Count hard links multiple times"
msgstr ""
msgid "Count hard-linked files each time they are seen"
msgstr ""
msgid "Count hidden files, too"
msgstr ""
@@ -16302,6 +16296,9 @@ msgstr ""
msgid "Disable chat search background indexer"
msgstr ""
msgid "Disable check for unique upload"
msgstr ""
msgid "Disable color"
msgstr ""
@@ -17430,9 +17427,6 @@ msgstr ""
msgid "Display answers as exclamation points and missing packets as dots"
msgstr ""
msgid "Display apparent size instead of disk usage"
msgstr ""
msgid "Display architecture specific information"
msgstr ""
@@ -17580,6 +17574,9 @@ msgstr ""
msgid "Display debugging information"
msgstr ""
msgid "Display debugging messages"
msgstr ""
msgid "Display deduplication histogram"
msgstr ""
@@ -17715,9 +17712,6 @@ msgstr ""
msgid "Display help and debug options"
msgstr ""
msgid "Display help and exit\t"
msgstr ""
msgid "Display help for Git Sizer"
msgstr ""
@@ -18066,6 +18060,9 @@ msgstr ""
msgid "Display hook variables"
msgstr ""
msgid "Display hosts listed in configuration"
msgstr ""
msgid "Display image centered on a backdrop"
msgstr ""
@@ -19308,9 +19305,6 @@ msgstr ""
msgid "Do not compress the uid/gid table"
msgstr ""
msgid "Do not compute total column for multiple inputs"
msgstr ""
msgid "Do not configure any interfaces"
msgstr ""
@@ -20481,9 +20475,6 @@ msgstr ""
msgid "Do not sort file arguments"
msgstr ""
msgid "Do not sort paths by their size in bytes"
msgstr ""
msgid "Do not sort the result"
msgstr ""
@@ -20637,6 +20628,9 @@ msgstr ""
msgid "Do not upload binaries"
msgstr ""
msgid "Do not upload the files"
msgstr ""
msgid "Do not use \"abshi2\" pattern"
msgstr ""
@@ -20862,6 +20856,9 @@ msgstr ""
msgid "Do not write FETCH_HEAD file"
msgstr ""
msgid "Do not write a log file for uploads"
msgstr ""
msgid "Do not write a ~/.fehbg file"
msgstr ""
@@ -21231,6 +21228,9 @@ msgstr ""
msgid "Don't check if travis client is up to date"
msgstr ""
msgid "Don't check the signatures or upload the files"
msgstr ""
msgid "Don't clear the playlist"
msgstr ""
@@ -24426,6 +24426,9 @@ msgstr ""
msgid "Enable the JIT compiler"
msgstr ""
msgid "Enable the Lintian verification check"
msgstr ""
msgid "Enable the bitrate management engine"
msgstr ""
@@ -24459,6 +24462,9 @@ msgstr ""
msgid "Enable the live reloading in the development server, but only re-build files that have changed"
msgstr ""
msgid "Enable the local install check"
msgstr ""
msgid "Enable the necessary sparse-checkout config settings"
msgstr ""
@@ -30846,9 +30852,6 @@ msgstr ""
msgid "If project list is specified, also build projects that depend on projects on the list"
msgstr ""
msgid "If set, we will not cross filesystems or traverse mount points"
msgstr ""
msgid "If source path is a directory, publish all its content recursively"
msgstr ""
@@ -33483,9 +33486,6 @@ msgstr ""
msgid "Launch the Protontricks GUI"
msgstr ""
msgid "Launch the terminal user interface"
msgstr ""
msgid "Launch utility at startup and reload on file change"
msgstr ""
@@ -39723,9 +39723,6 @@ msgstr ""
msgid "One or more Kitchen Driver gems to be installed or added to a Gemfile "
msgstr ""
msgid "One or more absolute directories to ignore"
msgstr ""
msgid "Only match processes whose effective user ID is listed"
msgstr ""
@@ -44109,9 +44106,6 @@ msgstr ""
msgid "Print additional fields"
msgstr ""
msgid "Print additional statistics about the file traversal to stderr"
msgstr ""
msgid "Print all active monitors"
msgstr ""
@@ -44691,9 +44685,6 @@ msgstr ""
msgid "Print help message and exit"
msgstr ""
msgid "Print help message or the help of the given subcommand(s)"
msgstr ""
msgid "Print help of uncommon options"
msgstr ""
@@ -45690,6 +45681,9 @@ msgstr ""
msgid "Print the domain's hostname"
msgstr ""
msgid "Print the dput configuration"
msgstr ""
msgid "Print the drive capabilities for SCSI-3/mmc compliant drives"
msgstr ""
@@ -50625,6 +50619,9 @@ msgstr ""
msgid "Request distinct server name"
msgstr ""
msgid "Request dry-run of dinstall after upload"
msgstr ""
msgid "Request given address in DHCP DISCOVER message"
msgstr ""
@@ -66243,9 +66240,6 @@ msgstr ""
msgid "The age recipient the new group should contain. Can be specified more than once"
msgstr ""
msgid "The amount of threads to use"
msgstr ""
msgid "The architecture reported by uname in the container"
msgstr ""
@@ -66357,9 +66351,6 @@ msgstr ""
msgid "The format to convert to"
msgstr ""
msgid "The format with which to print byte counts"
msgstr ""
msgid "The full cost-based query optimiser is enabled."
msgstr ""
@@ -68949,6 +68940,9 @@ msgstr ""
msgid "Upload finished packages"
msgstr ""
msgid "Upload host"
msgstr ""
msgid "Upload locally saved terminal session to asciinema.org"
msgstr ""
@@ -68964,6 +68958,9 @@ msgstr ""
msgid "Upload stemcell"
msgstr ""
msgid "Upload to a delayed queue"
msgstr ""
msgid "Upload to server"
msgstr ""
@@ -70473,6 +70470,9 @@ msgstr ""
msgid "Use paired-single floating-point instructions"
msgstr ""
msgid "Use passive mode for FTP"
msgstr ""
msgid "Use passive mode for data transfers"
msgstr ""
@@ -78558,7 +78558,7 @@ msgstr ""
msgid "reset branch name to parent branch name"
msgstr ""
msgid "reset cache (DNS\t)"
msgid "reset cache"
msgstr ""
msgid "reset terminal state"

View File

@@ -3,12 +3,12 @@ name = "fish-shell"
version = "0.0.0"
# NOTE: versions for Python and Sphinx are specified for reproducibility.
# Lower versions will work too.
requires-python = ">=3.11" # updatecli.d/python.yml
requires-python = ">=3.12"
dependencies = []
[dependency-groups]
dev = [
"sphinx>=9.0", # updatecli.d/python.yml
"sphinx>=9.1", # updatecli.d/python.yml
"sphinx-markdown-builder",
]

View File

@@ -4,7 +4,7 @@
# This grep tries to match nonempty lines that do not start with hash
complete -c chsh -s s -l shell -x -a "(string match -r '^[^#].*' < /etc/shells)" -d "Specify your login shell"
complete -c chsh -s u -l help -d "Display help and exit "
complete -c chsh -s u -l help -d "Display help and exit"
complete -c chsh -s v -l version -d "Display version and exit"
complete -x -c chsh -a "(__fish_complete_users)"

View File

@@ -0,0 +1,19 @@
complete -c dput -s c -l config -d "Configuration file" -r
complete -c dput -s d -l debug -d "Display debugging messages"
complete -c dput -s D -l dinstall -d "Request dry-run of dinstall after upload"
complete -c dput -s f -l force -d "Disable check for unique upload"
complete -c dput -s h -l help -d "Display help"
complete -c dput -s H -l host-list -d "Display hosts listed in configuration"
complete -c dput -s l -l lintian -d "Enable the Lintian verification check"
complete -c dput -s U -l no-upload-log -d "Do not write a log file for uploads"
complete -c dput -s o -l check-only -d "Don't check the signatures or upload the files"
complete -c dput -s p -l print -d "Print the dput configuration"
complete -c dput -s P -l passive -d "Use passive mode for FTP"
complete -c dput -s s -l simulate -d "Do not upload the files"
complete -c dput -s e -l delayed -d "Upload to a delayed queue" -r
complete -c dput -s v -l version -d "Print the version"
complete -c dput -s V -l check-version -d "Enable the local install check"
complete -c dput -x -a '(dput --host-list | string match --regex --groups-only "(.+) => .*")' -d "Upload host" -n __fish_is_first_arg
# dput validates that filenames end in .changes
complete -c dput -x -a '(complete -C"\'\' $(commandline -ct)" | string match -re "(?:/|.changes)\$")'

View File

@@ -24,4 +24,4 @@ user\t'name or uid'
"
complete -c dscacheutil -o configuration -d 'print current config' -f -n '[ (commandline -xpc | count) -le 1 ]'
complete -c dscacheutil -o statistics -d 'prints cache stats' -f -n '[ (commandline -xpc | count) -le 1 ]'
complete -c dscacheutil -o flushcache -d 'reset cache (DNS )' -f -k -n '[ (commandline -xpc | count) -le 1 ]'
complete -c dscacheutil -o flushcache -d 'reset cache' -f -k -n '[ (commandline -xpc | count) -le 1 ]'

View File

@@ -1,35 +1 @@
# Options
set -l _sub_commands "aggregate a interactive i"
complete -c dua -n 'not __fish_seen_subcommand_from help' -s A -l apparent-size -d 'Display apparent size instead of disk usage'
complete -c dua -n 'not __fish_seen_subcommand_from help' -s f -l format -f -r -d "The format with which to print byte counts" -a "
metric\t'uses 1000 as base'
binary\t'use 1024 as base'
bytes\t'plain bytes without any formatting'
GB\t'only gigabytes'
GiB\t'only gibibytes'
MB\t'only megabytes'
MiB\t'only mebibytes'
"
complete -c dua -n 'not __fish_seen_subcommand_from help' -s h -l help -d 'Print help information'
complete -c dua -n 'not __fish_seen_subcommand_from help' -s i -l ignore-dirs -r -F -d 'One or more absolute directories to ignore'
complete -c dua -n 'not __fish_seen_subcommand_from help' -s l -l count-hard-links -d 'Count hard-linked files each time they are seen'
complete -c dua -n 'not __fish_seen_subcommand_from help' -s t -l threads -r -f -d 'The amount of threads to use'
complete -c dua -n 'not __fish_seen_subcommand_from help' -s V -l version -d 'Print version information'
complete -c dua -n 'not __fish_seen_subcommand_from help' -s x -l stay-on-filesystem -d 'If set, we will not cross filesystems or traverse mount points'
# Subcommands
complete -c dua -a aggregate -n "not __fish_seen_subcommand_from $_sub_commands help" -d 'Aggregate the consumed space of one or more directories or files'
complete -c dua -a a -n "not __fish_seen_subcommand_from $_sub_commands help" -d 'Aggregate the consumed space of one or more directories or files'
complete -c dua -n '__fish_seen_subcommand_from a aggregate' -l no-sort -d 'Do not sort paths by their size in bytes'
complete -c dua -n '__fish_seen_subcommand_from a aggregate' -l no-total -d 'Do not compute total column for multiple inputs'
complete -c dua -n '__fish_seen_subcommand_from a aggregate' -l stats -d 'Print additional statistics about the file traversal to stderr'
complete -c dua -a help -n "not __fish_seen_subcommand_from $_sub_commands" -f -d 'Print help message or the help of the given subcommand(s)'
complete -c dua -n "__fish_seen_subcommand_from help" -n "not __fish_any_arg_in $_sub_commands" -x -a "$_sub_commands"
complete -c dua -a interactive -n "not __fish_seen_subcommand_from $_sub_commands help" -d 'Launch the terminal user interface'
complete -c dua -a i -n "not __fish_seen_subcommand_from $_sub_commands help" -d 'Launch the terminal user interface'
dua completions fish | source

View File

@@ -779,10 +779,17 @@ function __fish_git_stash_not_using_subcommand
or return 2
set cmd $cmd[(contains -i -- "stash" $cmd)..-1]
set -q cmd[2]
or return 0
contains -- $cmd[2] list show pop apply clear drop create save branch push
and return 1
return 0
end
function __fish_git_stash_is_push
__fish_git_stash_not_using_subcommand
or __fish_git_stash_using_command push
end
function __fish_git_complete_worktrees
__fish_git worktree list --porcelain | string replace --regex --filter '^worktree\s*' ''
end
@@ -2425,16 +2432,16 @@ complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_not_u
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_not_using_subcommand -a branch -d 'Create a new branch from a stash'
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_not_using_subcommand -a push -d 'Create a new stash with given files'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command apply branch drop pop show' -ka '(__fish_git_complete_stashes)'
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_is_push -a '(__fish_git_files modified deleted modified-staged-deleted)'
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_is_push -s a -l all -d 'Stash ignored and untracked files'
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_is_push -s k -l keep-index -d 'Keep changes in index intact'
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_is_push -s p -l patch -d 'Interactively select hunks'
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_is_push -s m -l message -d 'Add a description'
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_is_push -l no-keep-index -d 'Don\'t keep changes in index intact'
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_is_push -s S -l staged -d 'Stash only staged changes'
complete -f -c git -n '__fish_git_using_command stash' -n __fish_git_stash_is_push -s u -l include-untracked -d 'Stash untracked files'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command push' -a '(__fish_git_files modified deleted modified-staged-deleted)'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command push' -s a -l all -d 'Stash ignored and untracked files'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command push' -s k -l keep-index -d 'Keep changes in index intact'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command push' -s p -l patch -d 'Interactively select hunks'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command push' -s m -l message -d 'Add a description'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command push' -l no-keep-index -d 'Don\'t keep changes in index intact'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command push' -s S -l staged -d 'Stash only staged changes'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command push' -s u -l include-untracked -d 'Stash untracked files'
complete -f -c git -n '__fish_git_using_command stash' -n '__fish_git_stash_using_command apply branch drop pop show' -ka '(__fish_git_complete_stashes)'
### config
complete -f -c git -n __fish_git_needs_command -a config -d 'Set and read git configuration variables'

View File

@@ -1,5 +1,5 @@
complete -c rfkill -xa 'block unblock list event help' -n 'not __fish_seen_subcommand_from block unblock list event help'
complete -c rfkill -n '__fish_seen_subcommand_from block unblock list' -d 'device group' -xa "all wifi wlan bluetooth uwb ultrawideband wimax wwan gps fm (rfkill list | string replace : \t)"
complete -c rfkill -n '__fish_seen_subcommand_from block unblock toggle list' -d 'device group' -xa "all wifi wlan bluetooth uwb ultrawideband wimax wwan gps fm (rfkill list | string replace : \t)"
complete -c rfkill -s V -l version -d 'Print version'
complete -c rfkill -s h -l help -d 'Print help'
complete -c rfkill -s J -l json -d 'JSON output'

View File

@@ -1,16 +1,8 @@
# localization: skip(private)
set -l erase_to_end_of_screen "$(
if status test-feature ignore-terminfo
echo \e\[J
else if type -q tput
tput ed
end
)"
function __fish_echo --inherit-variable erase_to_end_of_screen --description 'run the given command after the current commandline and redraw the prompt'
function __fish_echo --description 'run the given command after the current commandline and redraw the prompt'
set -l line (commandline --line)
string >&2 repeat -N \n --count=(math (commandline | count) - $line + 1)
printf %s $erase_to_end_of_screen >&2
echo -n \e\[J >&2
$argv >&2
string >&2 repeat -N \n --count=(math (count (fish_prompt)) - 1)
string >&2 repeat -N \n --count=(math $line - 1)

View File

@@ -18,7 +18,7 @@ function fish_default_mode_prompt --description "Display vi prompt mode"
case visual
set_color --bold magenta
echo '[V]'
case operator
case operator f F t T
set_color --bold cyan
echo '[N]'
end

View File

@@ -53,7 +53,7 @@ function fish_vi_yank_selection
end
function fish_vi_exec_motion
argparse linewise -- $argv
argparse --stop-nonopt linewise -- $argv
or return
set -l motion $argv
@@ -83,7 +83,7 @@ function fish_vi_exec_motion
else
set -l use_selection true
set -l swap_case_hack
switch $motion
switch $motion[1]
case forward-word-vi forward-bigword-vi
if test $__fish_vi_operator = swap-case
set swap_case_hack (string replace -r -- '^forward-((?:big)?word)-vi$' '$1' $motion)
@@ -93,50 +93,75 @@ function fish_vi_exec_motion
set motion (string replace -- forward kill $motion)
end
end
set -l motion_cmd
switch $motion[1]
case commandline
set motion_cmd $motion
case '*'
set motion_cmd commandline -f $motion
end
if $use_selection
commandline -f begin-selection
else
commandline -f begin-undo-group
end
set -l ok true
switch $__fish_vi_operator
case delete
for i in (seq $total)
commandline -f $motion
$motion_cmd || { set ok false; break }
end
if $use_selection
if $ok && $use_selection
commandline -f kill-selection
end
case change
for i in (seq $total)
commandline -f $motion
switch $motion[1]
case kill-word-vi
for i in (seq $total)
if test $i -eq $total
commandline -f kill-word
else
$motion_cmd
end
end
case '*'
for i in (seq $total)
$motion_cmd || { set ok false; break }
end
end
if $use_selection
commandline -f kill-selection
if $ok
if $use_selection
commandline -f kill-selection
end
set fish_bind_mode insert
end
set fish_bind_mode insert
case yank
for i in (seq $total)
commandline -f $motion
$motion_cmd || { set ok false; break }
end
if $use_selection
fish_vi_yank_selection
else
commandline -f yank
if $ok
if $use_selection
fish_vi_yank_selection
else
commandline -f yank
end
end
case swap-case
for i in (seq $total)
commandline -f $motion
$motion_cmd || { set ok false; break }
end
if set -q swap_case_hack[1]
set -l word $swap_case_hack
commandline -f \
backward-$word \
forward-$word-end \
togglecase-selection \
backward-$word \
forward-$word-vi
else
commandline -f togglecase-selection
if $ok
if set -q swap_case_hack[1]
set -l word $swap_case_hack
commandline -f \
backward-$word \
forward-$word-end \
togglecase-selection \
backward-$word \
forward-$word-vi
else
commandline -f togglecase-selection
end
end
end
if $use_selection
@@ -266,7 +291,9 @@ function fish_vi_key_bindings --description 'vi-like key bindings for fish'
# Inherit shared key bindings.
# Do this first so vi-bindings win over default.
for mode in insert default visual
__fish_shared_key_bindings -s -M $mode
__fish_shared_key_bindings -M $mode
__fish_per_os_bind --preset -M $mode ctrl-right forward-token forward-word-vi
# ctrl-left is same as emacs mode
end
# Add a way to switch from insert to normal (command) mode.
@@ -283,304 +310,307 @@ function fish_vi_key_bindings --description 'vi-like key bindings for fish'
commandline -f repaint-mode
end
'
bind -s --preset -M insert escape $on_escape
bind -s --preset -M insert ctrl-\[ $on_escape
bind --preset -M insert escape $on_escape
bind --preset -M insert ctrl-\[ $on_escape
# Default (command) mode
bind -s --preset :,q exit
bind -s --preset -m insert ctrl-c clear-commandline repaint-mode
bind --preset :,q exit
bind --preset -m insert ctrl-c clear-commandline repaint-mode
bind -s --preset -M default escape 'set -g __fish_vi_count'
bind -s --preset -M default ctrl-\[ 'set -g __fish_vi_count'
bind --preset -M default escape 'set -g __fish_vi_count'
bind --preset -M default ctrl-\[ 'set -g __fish_vi_count'
for i in (seq 1 9)
bind -s --preset -M default $i "fish_vi_arg_digit $i"
bind --preset -M default $i "fish_vi_arg_digit $i"
end
# 0 is special: it is 'beginning-of-line' unless we are already counting (e.g. 10)
bind -s --preset -M default 0 "if test -n \"\$__fish_vi_count\"; fish_vi_arg_digit 0; else; commandline -f beginning-of-line; end"
bind --preset -M default 0 "if test -n \"\$__fish_vi_count\"; fish_vi_arg_digit 0; else; commandline -f beginning-of-line; end"
# --- Movement with Count Support ---
bind -s --preset -M default h 'fish_vi_run_count backward-char'
bind -s --preset -M default l 'fish_vi_run_count forward-char'
bind --preset -M default h 'fish_vi_run_count backward-char'
bind --preset -M default l 'fish_vi_run_count forward-char'
bind -s --preset -M default k 'fish_vi_run_count up-or-search'
bind -s --preset -M default j 'fish_vi_run_count down-or-search'
bind --preset -M default k 'fish_vi_run_count up-or-search'
bind --preset -M default j 'fish_vi_run_count down-or-search'
bind -s --preset -M default b 'fish_vi_run_count backward-word'
bind -s --preset -M default B 'fish_vi_run_count backward-bigword'
bind -s --preset -M default g,e 'fish_vi_run_count backward-word-end'
bind -s --preset -M default g,E 'fish_vi_run_count backward-bigword-end'
bind --preset -M default b 'fish_vi_run_count backward-word'
bind --preset -M default B 'fish_vi_run_count backward-bigword'
bind --preset -M default g,e 'fish_vi_run_count backward-word-end'
bind --preset -M default g,E 'fish_vi_run_count backward-bigword-end'
bind -s --preset -M default w 'fish_vi_run_count forward-word-vi'
bind -s --preset -M default W 'fish_vi_run_count forward-bigword-vi'
bind --preset -M default w 'fish_vi_run_count forward-word-vi'
bind --preset -M default W 'fish_vi_run_count forward-bigword-vi'
bind -s --preset -M default e 'fish_vi_run_count forward-word-end'
bind -s --preset -M default E 'fish_vi_run_count forward-bigword-end'
bind --preset -M default e 'fish_vi_run_count forward-word-end'
bind --preset -M default E 'fish_vi_run_count forward-bigword-end'
bind -s --preset -M default x 'fish_vi_run_count delete-char'
bind -s --preset -M default X 'fish_vi_run_count backward-delete-char'
bind --preset -M default x 'fish_vi_run_count delete-char'
bind --preset -M default X 'fish_vi_run_count backward-delete-char'
bind -s --preset -m insert enter execute
bind -s --preset -m insert ctrl-j execute
bind -s --preset -m insert ctrl-m execute
bind -s --preset -m insert o 'set fish_cursor_end_mode exclusive' insert-line-under repaint-mode
bind -s --preset -m insert O 'set fish_cursor_end_mode exclusive' insert-line-over repaint-mode
bind -s --preset -m insert i repaint-mode
bind -s --preset -m insert I beginning-of-line repaint-mode
bind -s --preset -m insert a 'set fish_cursor_end_mode exclusive' forward-single-char repaint-mode
bind -s --preset -m insert A 'set fish_cursor_end_mode exclusive' end-of-line repaint-mode
bind -s --preset -m visual v begin-selection repaint-mode
bind --preset -m insert enter execute
bind --preset -m insert ctrl-j execute
bind --preset -m insert ctrl-m execute
bind --preset -m insert o 'set fish_cursor_end_mode exclusive' insert-line-under repaint-mode
bind --preset -m insert O 'set fish_cursor_end_mode exclusive' insert-line-over repaint-mode
bind --preset -m insert i repaint-mode
bind --preset -m insert I beginning-of-line repaint-mode
bind --preset -m insert a 'set fish_cursor_end_mode exclusive' forward-single-char repaint-mode
bind --preset -m insert A 'set fish_cursor_end_mode exclusive' end-of-line repaint-mode
bind --preset -m visual v begin-selection repaint-mode
bind -s --preset g,g beginning-of-buffer
bind -s --preset G end-of-buffer
bind --preset g,g beginning-of-buffer
bind --preset G end-of-buffer
for key in $eol_keys
bind -s --preset $key end-of-line
bind --preset $key end-of-line
end
# Note: 0 is handled in the numeric section above
for key in \^ g\^ _
bind -s --preset $key beginning-of-line
bind --preset $key beginning-of-line
end
bind -s --preset u undo
bind -s --preset ctrl-r redo
bind --preset u undo
bind --preset ctrl-r redo
bind -s --preset [ history-token-search-backward
bind -s --preset ] history-token-search-forward
bind -s --preset -m insert / history-pager repaint-mode
bind --preset [ history-token-search-backward
bind --preset ] history-token-search-forward
bind --preset -m insert / history-pager repaint-mode
__fish_per_os_bind --preset $argv ctrl-right forward-token forward-word-vi
# ctrl-left is same as emacs mode
bind -s --preset -M insert ctrl-n accept-autosuggestion
bind --preset -M insert ctrl-n accept-autosuggestion
# Vi/Vim doesn't support these keys in insert mode but that seems silly so we do so anyway.
bind -s --preset -M insert home beginning-of-line
bind -s --preset -M default home beginning-of-line
bind -s --preset -M insert end end-of-line
bind -s --preset -M default end end-of-line
bind --preset -M insert home beginning-of-line
bind --preset -M default home beginning-of-line
bind --preset -M insert end end-of-line
bind --preset -M default end end-of-line
bind -s --preset -M insert delete delete-char
bind -s --preset -M default delete delete-char
bind --preset -M insert delete delete-char
bind --preset -M default delete delete-char
# Backspace deletes a char in insert mode, but not in normal/default mode.
bind -s --preset -M insert backspace backward-delete-char
bind -s --preset -M insert shift-backspace backward-delete-char
bind -s --preset -M default backspace backward-char
bind -s --preset -M insert ctrl-h backward-delete-char
bind -s --preset -M default ctrl-h backward-char
bind --preset -M insert backspace backward-delete-char
bind --preset -M insert shift-backspace backward-delete-char
bind --preset -M default backspace backward-char
bind --preset -M insert ctrl-h backward-delete-char
bind --preset -M default ctrl-h backward-char
# Operators & Operator Mode
bind -s --preset -M default d 'fish_vi_start_operator delete'
bind -s --preset -M default c 'fish_vi_start_operator change'
bind -s --preset -M default y 'fish_vi_start_operator yank'
bind -s --preset -M default g,\~ 'fish_vi_start_operator swap-case'
bind --preset -M default d 'fish_vi_start_operator delete'
bind --preset -M default c 'fish_vi_start_operator change'
bind --preset -M default y 'fish_vi_start_operator yank'
bind --preset -M default g,\~ 'fish_vi_start_operator swap-case'
bind -s --preset -M operator escape fish_vi_operator_cancel
bind -s --preset -M operator ctrl-\[ fish_vi_operator_cancel
bind --preset -M operator escape fish_vi_operator_cancel
bind --preset -M operator ctrl-\[ fish_vi_operator_cancel
for i in (seq 1 9)
bind -s --preset -M operator $i "fish_vi_arg_digit $i"
bind --preset -M operator $i "fish_vi_arg_digit $i"
end
bind -s --preset -M operator 0 "if test -n \"\$__fish_vi_count\"; fish_vi_arg_digit 0; else; fish_vi_exec_motion beginning-of-line; end"
bind --preset -M operator 0 "if test -n \"\$__fish_vi_count\"; fish_vi_arg_digit 0; else; fish_vi_exec_motion beginning-of-line; end"
bind -s --preset -M operator h 'fish_vi_exec_motion backward-char'
bind -s --preset -M operator l 'fish_vi_exec_motion forward-char'
bind -s --preset -M operator k 'fish_vi_exec_motion up-line'
bind -s --preset -M operator j 'fish_vi_exec_motion down-line'
bind -s --preset -M operator b 'fish_vi_exec_motion backward-word'
bind -s --preset -M operator B 'fish_vi_exec_motion backward-bigword'
bind -s --preset -M operator g,e 'fish_vi_exec_motion backward-word-end'
bind -s --preset -M operator g,E 'fish_vi_exec_motion backward-bigword-end'
bind -s --preset -M operator w 'fish_vi_exec_motion forward-word-vi'
bind -s --preset -M operator W 'fish_vi_exec_motion forward-bigword-vi'
bind -s --preset -M operator e 'fish_vi_exec_motion forward-word-end'
bind -s --preset -M operator E 'fish_vi_exec_motion forward-bigword-end'
bind --preset -M operator h 'fish_vi_exec_motion backward-char'
bind --preset -M operator l 'fish_vi_exec_motion forward-char'
bind --preset -M operator k 'fish_vi_exec_motion up-line'
bind --preset -M operator j 'fish_vi_exec_motion down-line'
bind --preset -M operator b 'fish_vi_exec_motion backward-word'
bind --preset -M operator B 'fish_vi_exec_motion backward-bigword'
bind --preset -M operator g,e 'fish_vi_exec_motion backward-word-end'
bind --preset -M operator g,E 'fish_vi_exec_motion backward-bigword-end'
bind --preset -M operator w 'fish_vi_exec_motion forward-word-vi'
bind --preset -M operator W 'fish_vi_exec_motion forward-bigword-vi'
bind --preset -M operator e 'fish_vi_exec_motion forward-word-end'
bind --preset -M operator E 'fish_vi_exec_motion forward-bigword-end'
bind -s --preset -M operator 0 'fish_vi_exec_motion beginning-of-line'
bind -s --preset -M operator \^ 'fish_vi_exec_motion beginning-of-line'
bind -s --preset -M operator \$ 'fish_vi_exec_motion end-of-line'
bind --preset -M operator 0 'fish_vi_exec_motion beginning-of-line'
bind --preset -M operator \^ 'fish_vi_exec_motion beginning-of-line'
bind --preset -M operator \$ 'fish_vi_exec_motion end-of-line'
bind -s --preset -M operator f 'fish_vi_exec_motion forward-jump'
bind -s --preset -M operator F 'fish_vi_exec_motion backward-jump'
bind -s --preset -M operator t 'fish_vi_exec_motion forward-jump-till'
bind -s --preset -M operator T 'fish_vi_exec_motion backward-jump-till'
bind -s --preset -M operator ';' 'fish_vi_exec_motion repeat-jump'
bind -s --preset -M operator , 'fish_vi_exec_motion repeat-jump-reverse'
bind --preset -M operator f --sets-mode f ''
bind --preset -M operator F --sets-mode F ''
bind --preset -M operator t --sets-mode t ''
bind --preset -M operator T --sets-mode T ''
bind -s --preset -M operator d 'fish_vi_exec_motion --linewise'
bind -s --preset -M operator c 'fish_vi_exec_motion --linewise'
bind -s --preset -M operator y 'fish_vi_exec_motion --linewise'
bind -s --preset -M operator \~ 'fish_vi_exec_motion --linewise'
bind --preset -M f '' get-key 'fish_vi_exec_motion commandline --forward-jump=$fish_key' 'set -eg fish_key'
bind --preset -M F '' get-key 'fish_vi_exec_motion commandline --backward-jump=$fish_key' 'set -eg fish_key'
bind --preset -M t '' get-key 'fish_vi_exec_motion commandline --forward-jump-till=$fish_key' 'set -eg fish_key'
bind --preset -M T '' get-key 'fish_vi_exec_motion commandline --backward-jump-till=$fish_key' 'set -eg fish_key'
bind -s --preset D kill-line
bind -s --preset d,\$ kill-line
bind -s --preset d,\^ backward-kill-line
bind -s --preset d,0 backward-kill-line
bind --preset -M operator ';' 'fish_vi_exec_motion repeat-jump'
bind --preset -M operator , 'fish_vi_exec_motion repeat-jump-reverse'
bind -s --preset d,i,w kill-inner-word
bind -s --preset d,i,W kill-inner-bigword
bind -s --preset d,a,w kill-a-word
bind -s --preset d,a,W kill-a-bigword
bind -s --preset d,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket kill-selection end-selection
bind -s --preset d,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket kill-selection end-selection
bind -s --preset d,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection
bind -s --preset d,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection
bind -s --preset 'd,;' begin-selection repeat-jump kill-selection end-selection
bind -s --preset 'd,comma' begin-selection repeat-jump-reverse kill-selection end-selection
bind --preset -M operator d 'fish_vi_exec_motion --linewise'
bind --preset -M operator c 'fish_vi_exec_motion --linewise'
bind --preset -M operator y 'fish_vi_exec_motion --linewise'
bind --preset -M operator \~ 'fish_vi_exec_motion --linewise'
bind -s --preset -m insert s delete-char repaint-mode
bind -s --preset -m insert S kill-inner-line repaint-mode
bind -s --preset -m insert C kill-line repaint-mode
bind -s --preset -m insert c,\$ kill-line repaint-mode
bind -s --preset -m insert c,\^ backward-kill-line repaint-mode
bind -s --preset -m insert c,0 backward-kill-line repaint-mode
bind --preset D kill-line
bind --preset d,\$ kill-line
bind --preset d,\^ backward-kill-line
bind --preset d,0 backward-kill-line
bind -s --preset -m insert c,i,w kill-inner-word repaint-mode
bind -s --preset -m insert c,i,W kill-inner-bigword repaint-mode
bind -s --preset -m insert c,a,w kill-a-word repaint-mode
bind -s --preset -m insert c,a,W kill-a-bigword repaint-mode
bind -s --preset -m insert c,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket kill-selection end-selection
bind -s --preset -m insert c,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket kill-selection end-selection
bind -s --preset -m insert c,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection repaint-mode
bind -s --preset -m insert c,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection repaint-mode
bind --preset d,i,w kill-inner-word
bind --preset d,i,W kill-inner-bigword
bind --preset d,a,w kill-a-word
bind --preset d,a,W kill-a-bigword
bind --preset d,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket kill-selection end-selection
bind --preset d,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket kill-selection end-selection
bind --preset d,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection
bind --preset d,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection
bind --preset 'd,;' begin-selection repeat-jump kill-selection end-selection
bind --preset 'd,comma' begin-selection repeat-jump-reverse kill-selection end-selection
bind -s --preset \~ togglecase-char forward-single-char
bind -s --preset g,u downcase-word
bind -s --preset g,U upcase-word
bind --preset -m insert s delete-char repaint-mode
bind --preset -m insert S kill-inner-line repaint-mode
bind --preset -m insert C kill-line repaint-mode
bind --preset -m insert c,\$ kill-line repaint-mode
bind --preset -m insert c,\^ backward-kill-line repaint-mode
bind --preset -m insert c,0 backward-kill-line repaint-mode
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 -m insert c,i,w kill-inner-word repaint-mode
bind --preset -m insert c,i,W kill-inner-bigword repaint-mode
bind --preset -m insert c,a,w kill-a-word repaint-mode
bind --preset -m insert c,a,W kill-a-bigword repaint-mode
bind --preset -m insert c,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket kill-selection end-selection
bind --preset -m insert c,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket kill-selection end-selection
bind --preset -m insert c,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection repaint-mode
bind --preset -m insert c,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection repaint-mode
bind --preset \~ togglecase-char forward-single-char
bind --preset g,u downcase-word
bind --preset g,U upcase-word
bind --preset J end-of-line delete-char
bind --preset K 'man (commandline -t) 2>/dev/null; or echo -n \a'
# yy handled by operator mode
for seq in '",*,y,y' '",*,Y' '",+,y,y' '",+,Y'
bind -s --preset $seq fish_clipboard_copy
bind --preset $seq fish_clipboard_copy
end
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 y,0 backward-kill-line yank
bind -s --preset y,i,w kill-inner-word yank
bind -s --preset y,i,W kill-inner-bigword yank
bind -s --preset y,a,w kill-a-word yank
bind -s --preset y,a,W kill-a-bigword yank
bind -s --preset y,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket fish_vi_yank_selection end-selection
bind -s --preset y,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket fish_vi_yank_selection end-selection
bind -s --preset y,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump fish_vi_yank_selection end-selection
bind -s --preset y,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump fish_vi_yank_selection end-selection
bind --preset Y kill-whole-line yank
bind --preset y,\$ kill-line yank
bind --preset y,\^ backward-kill-line yank
bind --preset y,0 backward-kill-line yank
bind --preset y,i,w kill-inner-word yank
bind --preset y,i,W kill-inner-bigword yank
bind --preset y,a,w kill-a-word yank
bind --preset y,a,W kill-a-bigword yank
bind --preset y,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket fish_vi_yank_selection end-selection
bind --preset y,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket fish_vi_yank_selection end-selection
bind --preset y,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump fish_vi_yank_selection end-selection
bind --preset y,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump fish_vi_yank_selection end-selection
bind -s --preset % jump-to-matching-bracket
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
bind --preset % jump-to-matching-bracket
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
# in emacs yank means paste
# in vim p means paste *after* current character, so go forward a char before pasting
# also in vim, P means paste *at* current position (like at '|' with cursor = line),
# \ so there's no need to go back a char, just paste it without moving
bind -s --preset p 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' yank
bind -s --preset P yank
bind -s --preset g,p yank-pop
bind --preset p 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' yank
bind --preset P yank
bind --preset g,p yank-pop
# same vim 'pasting' note as upper
bind -s --preset '",*,p' 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' fish_clipboard_paste
bind -s --preset '",*,P' fish_clipboard_paste
bind -s --preset '",+,p' 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' fish_clipboard_paste
bind -s --preset '",+,P' fish_clipboard_paste
bind --preset '",*,p' 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' fish_clipboard_paste
bind --preset '",*,P' fish_clipboard_paste
bind --preset '",+,p' 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' fish_clipboard_paste
bind --preset '",+,P' fish_clipboard_paste
#
# Lowercase r, enters replace_one mode
#
bind -s --preset -m replace_one r repaint-mode
bind -s --preset -M replace_one -m default '' 'set -g fish_cursor_end_mode exclusive' delete-char self-insert backward-char repaint-mode 'set -g fish_cursor_end_mode inclusive'
bind -s --preset -M replace_one -m default enter 'set -g fish_cursor_end_mode exclusive' 'commandline -f delete-char; commandline -i \n; commandline -f backward-char' repaint-mode 'set -g fish_cursor_end_mode inclusive'
bind -s --preset -M replace_one -m default ctrl-j 'set -g fish_cursor_end_mode exclusive' 'commandline -f delete-char; commandline -i \n; commandline -f backward-char' repaint-mode 'set -g fish_cursor_end_mode inclusive'
bind -s --preset -M replace_one -m default ctrl-m 'set -g fish_cursor_end_mode exclusive' 'commandline -f delete-char; commandline -i \n; commandline -f backward-char' repaint-mode 'set -g fish_cursor_end_mode inclusive'
bind -s --preset -M replace_one -m default escape cancel repaint-mode
bind -s --preset -M replace_one -m default ctrl-\[ cancel repaint-mode
bind --preset -m replace_one r repaint-mode
bind --preset -M replace_one -m default '' 'set -g fish_cursor_end_mode exclusive' delete-char self-insert backward-char repaint-mode 'set -g fish_cursor_end_mode inclusive'
bind --preset -M replace_one -m default enter 'set -g fish_cursor_end_mode exclusive' 'commandline -f delete-char; commandline -i \n; commandline -f backward-char' repaint-mode 'set -g fish_cursor_end_mode inclusive'
bind --preset -M replace_one -m default ctrl-j 'set -g fish_cursor_end_mode exclusive' 'commandline -f delete-char; commandline -i \n; commandline -f backward-char' repaint-mode 'set -g fish_cursor_end_mode inclusive'
bind --preset -M replace_one -m default ctrl-m 'set -g fish_cursor_end_mode exclusive' 'commandline -f delete-char; commandline -i \n; commandline -f backward-char' repaint-mode 'set -g fish_cursor_end_mode inclusive'
bind --preset -M replace_one -m default escape cancel repaint-mode
bind --preset -M replace_one -m default ctrl-\[ cancel repaint-mode
#
# Uppercase R, enters replace mode
#
bind -s --preset -m replace R repaint-mode
bind -s --preset -M replace '' delete-char self-insert
bind -s --preset -M replace -m insert enter execute repaint-mode
bind -s --preset -M replace -m insert ctrl-j execute repaint-mode
bind -s --preset -M replace -m insert ctrl-m execute repaint-mode
bind -s --preset -M replace -m default escape cancel repaint-mode
bind -s --preset -M replace -m default ctrl-\[ cancel repaint-mode
bind --preset -m replace R repaint-mode
bind --preset -M replace '' delete-char self-insert
bind --preset -M replace -m insert enter execute repaint-mode
bind --preset -M replace -m insert ctrl-j execute repaint-mode
bind --preset -M replace -m insert ctrl-m execute repaint-mode
bind --preset -M replace -m default escape cancel repaint-mode
bind --preset -M replace -m default ctrl-\[ cancel repaint-mode
# in vim (and maybe in vi), <BS> deletes the changes
# but this binding just move cursor backward, not delete the changes
bind -s --preset -M replace backspace backward-char
bind -s --preset -M replace shift-backspace backward-char
bind --preset -M replace backspace backward-char
bind --preset -M replace shift-backspace backward-char
#
# Increment or decrement number under the cursor with ctrl+x ctrl+a
#
bind -s --preset -M default ctrl-a fish_vi_inc
bind -s --preset -M default ctrl-x fish_vi_dec
bind --preset -M default ctrl-a fish_vi_inc
bind --preset -M default ctrl-x fish_vi_dec
#
# visual mode
#
bind -s --preset -M visual h backward-char
bind -s --preset -M visual l forward-char
bind --preset -M visual h backward-char
bind --preset -M visual l forward-char
bind -s --preset -M visual k up-line
bind -s --preset -M visual j down-line
bind --preset -M visual k up-line
bind --preset -M visual j down-line
bind -s --preset -M visual b backward-word
bind -s --preset -M visual B backward-bigword
bind -s --preset -M visual g,e backward-word-end
bind -s --preset -M visual g,E backward-bigword-end
bind -s --preset -M visual w forward-word-vi
bind -s --preset -M visual W forward-bigword-vi
bind -s --preset -M visual e forward-word-end
bind -s --preset -M visual E forward-bigword-end
bind -s --preset -M visual o swap-selection-start-stop repaint-mode
bind --preset -M visual b backward-word
bind --preset -M visual B backward-bigword
bind --preset -M visual g,e backward-word-end
bind --preset -M visual g,E backward-bigword-end
bind --preset -M visual w forward-word-vi
bind --preset -M visual W forward-bigword-vi
bind --preset -M visual e forward-word-end
bind --preset -M visual E forward-bigword-end
bind --preset -M visual o swap-selection-start-stop repaint-mode
bind -s --preset -M visual % jump-to-matching-bracket
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
bind -s --preset -M visual ';' repeat-jump
bind -s --preset -M visual , repeat-jump-reverse
bind --preset -M visual % jump-to-matching-bracket
bind --preset -M visual f forward-jump
bind --preset -M visual t forward-jump-till
bind --preset -M visual F backward-jump
bind --preset -M visual T backward-jump-till
bind --preset -M visual ';' repeat-jump
bind --preset -M visual , repeat-jump-reverse
for key in $eol_keys
bind -s --preset -M visual $key end-of-line
bind --preset -M visual $key end-of-line
end
for key in $bol_keys
bind -s --preset -M visual $key beginning-of-line
bind --preset -M visual $key beginning-of-line
end
bind -s --preset -M visual -m default v end-selection repaint-mode
bind -s --preset -M visual -m insert i end-selection repaint-mode
bind -s --preset -M visual -m insert I end-selection beginning-of-line repaint-mode
bind -s --preset -M visual -m insert c kill-selection end-selection repaint-mode
bind -s --preset -M visual -m insert s kill-selection end-selection repaint-mode
bind -s --preset -M visual -m default d kill-selection end-selection backward-char repaint-mode
bind -s --preset -M visual -m default x kill-selection end-selection repaint-mode
bind -s --preset -M visual -m default X kill-whole-line end-selection repaint-mode
bind -s --preset -M visual -m default y fish_vi_yank_selection end-selection repaint-mode
bind -s --preset -M visual -m default '",*,y' "fish_clipboard_copy; commandline -f end-selection repaint-mode"
bind -s --preset -M visual -m default '",+,y' "fish_clipboard_copy; commandline -f end-selection repaint-mode"
bind -s --preset -M visual -m default \~ togglecase-selection end-selection repaint-mode
bind -s --preset -M visual -m default g,u downcase-selection end-selection repaint-mode
bind -s --preset -M visual -m default g,U upcase-selection end-selection repaint-mode
bind --preset -M visual -m default v end-selection repaint-mode
bind --preset -M visual -m insert i end-selection repaint-mode
bind --preset -M visual -m insert I end-selection beginning-of-line repaint-mode
bind --preset -M visual -m insert c kill-selection end-selection repaint-mode
bind --preset -M visual -m insert s kill-selection end-selection repaint-mode
bind --preset -M visual -m default d kill-selection end-selection backward-char repaint-mode
bind --preset -M visual -m default x kill-selection end-selection repaint-mode
bind --preset -M visual -m default X kill-whole-line end-selection repaint-mode
bind --preset -M visual -m default y fish_vi_yank_selection end-selection repaint-mode
bind --preset -M visual -m default '",*,y' "fish_clipboard_copy; commandline -f end-selection repaint-mode"
bind --preset -M visual -m default '",+,y' "fish_clipboard_copy; commandline -f end-selection repaint-mode"
bind --preset -M visual -m default \~ togglecase-selection end-selection repaint-mode
bind --preset -M visual -m default g,u downcase-selection end-selection repaint-mode
bind --preset -M visual -m default g,U upcase-selection end-selection repaint-mode
bind -s --preset -M visual -m default ctrl-c end-selection repaint-mode
bind -s --preset -M visual -m default escape end-selection repaint-mode
bind -s --preset -M visual -m default ctrl-\[ end-selection repaint-mode
bind --preset -M visual -m default ctrl-c end-selection repaint-mode
bind --preset -M visual -m default escape end-selection repaint-mode
bind --preset -M visual -m default ctrl-\[ end-selection repaint-mode
# 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 -s --preset -M default \# __fish_toggle_comment_commandline
bind -s --preset -M visual \# __fish_toggle_comment_commandline
bind -s --preset -M replace \# __fish_toggle_comment_commandline
bind --preset -M default \# __fish_toggle_comment_commandline
bind --preset -M visual \# __fish_toggle_comment_commandline
bind --preset -M replace \# __fish_toggle_comment_commandline
# Set the cursor shape
# After executing once, this will have defined functions listening for the variable.

View File

@@ -86,7 +86,7 @@ function fish_prompt
switch $fish_bind_mode
case default
set mode (set_color --bold red)N
case operator
case operator f F t T
set mode (set_color --bold cyan)N
case insert
set mode (set_color --bold green)I

View File

@@ -7,7 +7,7 @@
use crate::io::IoChain;
use crate::parser::Parser;
use crate::wutil::{FileId, INVALID_FILE_ID, file_id_for_path};
use fish_widestring::{L, WExt, WString, wstr};
use fish_widestring::{L, WExt as _, WString, wstr};
use lru::LruCache;
use rust_embed::RustEmbed;
use std::collections::{HashMap, HashSet};
@@ -477,7 +477,7 @@ macro_rules! run {
fn touch_file(path: &wstr) {
use nix::sys::stat::Mode;
use std::io::Write;
use std::io::Write as _;
let mut file = wopen_cloexec(
path,

View File

@@ -33,7 +33,7 @@
env::{
EnvMode, Statuses,
config_paths::ConfigPaths,
environment::{EnvStack, Environment, env_init},
environment::{EnvStack, Environment as _, env_init},
},
eprintf,
event::{self, Event},
@@ -480,7 +480,6 @@ fn throwing_main() -> i32 {
}
}
features::set_from_string(opts.features.as_utfstr());
fish::env_dispatch::read_terminfo_database(EnvStack::globals());
proc_init();
reader_init(true);

View File

@@ -2,7 +2,7 @@
use super::prelude::*;
use crate::{
env::{EnvMode, Environment},
env::{EnvMode, Environment as _},
fds::{BEST_O_SEARCH, wopen_dir},
parser::ParserEnvSetMode,
path::path_apply_cdpath,

View File

@@ -1,6 +1,6 @@
use super::prelude::*;
use super::read::TokenOutputMode;
use crate::ast::{self, Kind, Leaf};
use crate::ast::{self, Kind, Leaf as _};
use crate::common::{UnescapeFlags, UnescapeStringStyle, unescape_string};
use crate::complete::Completion;
use crate::expand::{ExpandFlags, ExpandResultCode, expand_string};
@@ -15,8 +15,9 @@
use crate::prelude::*;
use crate::proc::is_interactive_session;
use crate::reader::{
commandline_get_state, commandline_set_buffer, commandline_set_search_field,
reader_execute_readline_cmd, reader_showing_suggestion,
JumpDirection, JumpPrecision, commandline_get_state, commandline_set_buffer,
commandline_set_search_field, reader_execute_readline_cmd, reader_jump,
reader_showing_suggestion,
};
use crate::tokenizer::{TOK_ACCEPT_UNFINISHED, TokenType, Tokenizer};
use fish_wcstringutil::join_strings;
@@ -262,6 +263,11 @@ pub fn commandline(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr])
let mut showing_suggestion = false;
let mut override_buffer = None;
let mut forward_jump = false;
let mut backward_jump = false;
let mut forward_jump_till = false;
let mut backward_jump_till = false;
let mut jump_target = None;
let short_options = L!("abijpctfxorhI:CBELSsP");
let long_options: &[WOption] = &[
@@ -292,6 +298,10 @@ pub fn commandline(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr])
wopt(L!("search-field"), ArgType::NoArgument, '\x03'),
wopt(L!("is-valid"), ArgType::NoArgument, '\x01'),
wopt(L!("showing-suggestion"), ArgType::NoArgument, '\x04'),
wopt(L!("forward-jump"), ArgType::RequiredArgument, '\x07'),
wopt(L!("backward-jump"), ArgType::RequiredArgument, '\x08'),
wopt(L!("forward-jump-till"), ArgType::RequiredArgument, '\x09'),
wopt(L!("backward-jump-till"), ArgType::RequiredArgument, '\x0a'),
];
let mut w = WGetopter::new(short_options, long_options, args);
@@ -341,6 +351,22 @@ pub fn commandline(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr])
'\x03' => search_field_mode = true,
'\x01' => is_valid = true,
'\x04' => showing_suggestion = true,
'\x07' => {
forward_jump = true;
jump_target = Some(w.woptarg.unwrap().to_owned());
}
'\x08' => {
backward_jump = true;
jump_target = Some(w.woptarg.unwrap().to_owned());
}
'\x09' => {
forward_jump_till = true;
jump_target = Some(w.woptarg.unwrap().to_owned());
}
'\x0a' => {
backward_jump_till = true;
jump_target = Some(w.woptarg.unwrap().to_owned());
}
'h' => {
builtin_print_help(parser, streams, cmd);
return Ok(SUCCESS);
@@ -360,6 +386,27 @@ pub fn commandline(parser: &Parser, streams: &mut IoStreams, args: &mut [&wstr])
_ => panic!(),
}
}
if forward_jump || forward_jump_till || backward_jump || backward_jump_till {
let direction = if forward_jump || forward_jump_till {
JumpDirection::Forward
} else {
JumpDirection::Backward
};
let precision = if forward_jump || backward_jump {
JumpPrecision::To
} else {
JumpPrecision::Till
};
let target = jump_target.unwrap();
let Some(target) = target.chars().next() else {
return Err(STATUS_INVALID_ARGS);
};
return if reader_jump(direction, precision, target) {
Ok(SUCCESS)
} else {
Err(STATUS_CMD_ERROR)
};
}
let positional_args = w.argv.len() - w.wopt_index;

View File

@@ -462,7 +462,7 @@ pub fn complete(parser: &Parser, streams: &mut IoStreams, argv: &mut [&wstr]) ->
let mut errors = ParseErrorList::new();
if detect_parse_errors(condition_string, Some(&mut errors), false).is_err() {
for error in errors {
let prefix = cmd.to_owned() + L!(": -n '") + &condition_string[..] + L!("': ");
let prefix = cmd.to_owned() + L!(": -n '") + &condition_string[..] + L!("'");
streams.err.appendln(&error.describe_with_prefix(
condition_string,
&prefix,
@@ -475,11 +475,7 @@ pub fn complete(parser: &Parser, streams: &mut IoStreams, argv: &mut [&wstr]) ->
}
if !comp.is_empty() {
let mut prefix = WString::new();
prefix.push_utfstr(cmd);
prefix.push_str(": ");
if let Err(err_text) = detect_errors_in_argument_list(&comp, &prefix) {
if let Err(err_text) = detect_errors_in_argument_list(&comp, cmd) {
streams
.err
.appendln(&wgettext_fmt!("%s: %s: contains a syntax error", cmd, comp));

View File

@@ -2,21 +2,23 @@
use std::ffi::OsStr;
use std::fs;
use std::io::{Read, Write};
use std::os::unix::ffi::OsStrExt;
use std::io::{Read, Write as _};
use std::os::unix::ffi::OsStrExt as _;
use crate::locale::set_libc_locales;
use crate::panic::panic_handler;
use super::prelude::*;
use crate::ast::{self, AsNode, Ast, Kind, Leaf, Node, NodeVisitor, SourceRangeList, Traversal};
use crate::ast::{
self, AsNode as _, Ast, Kind, Leaf as _, Node, NodeVisitor, SourceRangeList, Traversal,
};
use crate::common::{
PROGRAM_NAME, ReadExt, UnescapeFlags, UnescapeStringStyle, bytes2wcstring, get_program_name,
osstr2wcstring, unescape_string, wcs2bytes,
PROGRAM_NAME, ReadExt as _, UnescapeFlags, UnescapeStringStyle, bytes2wcstring,
get_program_name, osstr2wcstring, unescape_string, wcs2bytes,
};
use crate::env::EnvStack;
use crate::env::env_init;
use crate::env::environment::Environment;
use crate::env::environment::Environment as _;
use crate::expand::INTERNAL_SEPARATOR;
use crate::future_feature_flags;
use crate::global_safety::RelaxedAtomicBool;

View File

@@ -14,11 +14,11 @@
use crate::{
builtins::shared::BUILTIN_ERR_UNKNOWN,
common::{PROGRAM_NAME, get_program_name, osstr2wcstring, shell_modes},
env::{EnvStack, Environment, env_init},
env::{EnvStack, Environment as _, env_init},
future_feature_flags,
input_common::{
CharEvent, ImplicitEvent, InputEventQueue, InputEventQueuer, KeyEvent, QueryResultEvent,
match_key_event_to_key,
CharEvent, ImplicitEvent, InputEventQueue, InputEventQueuer as _, KeyEvent,
QueryResultEvent, match_key_event_to_key,
},
key::{Key, char_to_symbol},
nix::isatty,

View File

@@ -2,7 +2,7 @@
use crate::ast::BlockStatement;
use crate::common::{valid_func_name, valid_var_name};
use crate::complete::complete_add_wrapper;
use crate::env::environment::Environment;
use crate::env::environment::Environment as _;
use crate::env::is_read_only;
use crate::event::{self, EventDescription, EventHandler};
use crate::function;

View File

@@ -9,7 +9,7 @@
use crate::proc::{HAVE_PROC_STAT, Job, clock_ticks_to_seconds, proc_get_jiffies};
use crate::wutil::fish_wcstoi;
use fish_wgetopt::{ArgType, WGetopter, WOption, wopt};
use fish_widestring::{L, WExt, WString, wstr};
use fish_widestring::{L, WExt as _, WString, wstr};
use std::num::NonZeroU32;
/// Print modes for the jobs builtin.
@@ -43,7 +43,7 @@ fn cpu_use(j: &Job) -> f64 {
fn builtin_jobs_print(j: &Job, mode: JobsPrintMode, header: bool, streams: &mut IoStreams) {
let pgid = match j.get_pgid() {
Some(pgid) => pgid.to_string(),
None => "-".to_string(),
None => "-".to_owned(),
};
let mut out = WString::new();

View File

@@ -1,6 +1,6 @@
use crate::env::environment::Environment;
use crate::env::environment::Environment as _;
use std::fs::Metadata;
use std::os::unix::prelude::{FileTypeExt, MetadataExt};
use std::os::unix::prelude::{FileTypeExt as _, MetadataExt as _};
use std::time::SystemTime;
use super::prelude::*;

View File

@@ -56,7 +56,7 @@
wcstoi::{Options as WcstoiOpts, wcstoi_partial},
wstr_offset_in,
};
use fish_printf::{ToArg, sprintf_locale};
use fish_printf::{ToArg as _, sprintf_locale};
use fish_widestring::{decode_byte_from_char, encode_byte_to_char};
/// Return true if `c` is an octal digit.

View File

@@ -2,7 +2,7 @@
use errno::errno;
use super::prelude::*;
use crate::{env::Environment, wutil::wrealpath};
use crate::{env::Environment as _, wutil::wrealpath};
// The pwd builtin. Respect -P to resolve symbolic links. Respect -L to not do that (the default).
const short_options: &wstr = L!("LPh");

View File

@@ -3,7 +3,7 @@
use crate::wutil;
use fish_util::get_seeded_rng;
use rand::rngs::SmallRng;
use rand::{Rng, RngCore};
use rand::{Rng as _, RngCore as _};
use std::sync::{LazyLock, Mutex};
static RNG: LazyLock<Mutex<SmallRng>> =

View File

@@ -8,7 +8,7 @@
use crate::common::unescape_string;
use crate::common::valid_var_name;
use crate::env::EnvMode;
use crate::env::Environment;
use crate::env::Environment as _;
use crate::env::READ_BYTE_LIMIT;
use crate::env::{EnvVar, EnvVarFlags};
use crate::input_common::DecodeState;

View File

@@ -3,7 +3,7 @@
use errno::errno;
use super::prelude::*;
use crate::env::Environment;
use crate::env::Environment as _;
use crate::{
path::path_apply_working_directory,
wutil::{normalize_path, wrealpath},

View File

@@ -3,7 +3,7 @@
use super::prelude::*;
use crate::common::bytes2wcstring;
use crate::screen::{is_dumb, only_grayscale};
use crate::terminal::{Outputter, use_terminfo};
use crate::terminal::Outputter;
use crate::text_face::{
self, PrintColorsArgs, SpecifiedTextFace, TextFace, TextStyling, parse_text_face_and_options,
};
@@ -63,7 +63,7 @@ pub fn set_color(parser: &Parser, streams: &mut IoStreams, argv: &mut [&wstr]) -
use text_face::ParseError::*;
use text_face::ParsedArgs::*;
let (specified_face, is_reset) =
let (specified_face, with_reset) =
match parse_text_face_and_options(argv, /*is_builtin=*/ true) {
Ok(SetFace(face)) => (face, false),
Ok(ResetFace) => (SpecifiedTextFace::default(), true),
@@ -126,19 +126,18 @@ pub fn set_color(parser: &Parser, streams: &mut IoStreams, argv: &mut [&wstr]) -
// Note that for historical reasons "set_color normal" reset all colors/attributes. So does
// "set_color reset" (undocumented).
if is_reset {
outp.reset_text_face();
}
outp.set_text_face_no_magic(TextFace::new(
specified_face.fg.unwrap_or(Color::None),
specified_face.bg.unwrap_or(Color::None),
specified_face.underline_color.unwrap_or(Color::None),
specified_face.style.unwrap_or_default(),
));
outp.set_text_face_no_magic(
TextFace::new(
specified_face.fg.unwrap_or(Color::None),
specified_face.bg.unwrap_or(Color::None),
specified_face.underline_color.unwrap_or(Color::None),
specified_face.style.unwrap_or_default(),
),
with_reset,
);
if specified_face.fg.is_some() && outp.contents().is_empty() {
assert!(is_dumb() || only_grayscale() || use_terminfo());
assert!(is_dumb() || only_grayscale());
// We need to do *something* or the lack of any output messes up
// when the cartesian product here would make "foo" disappear:
// $ echo (set_color foo)bar

View File

@@ -10,7 +10,7 @@
use errno::errno;
use fish_common::assert_sorted_by_name;
use fish_widestring::L;
use std::io::{BufRead, BufReader, Read};
use std::io::{BufRead as _, BufReader, Read as _};
pub type BuiltinCmd = fn(&Parser, &mut IoStreams, &mut [&wstr]) -> BuiltinResult;

View File

@@ -1,4 +1,4 @@
use std::os::fd::AsRawFd;
use std::os::fd::AsRawFd as _;
use crate::{
common::{FilenameRef, escape},

View File

@@ -1,5 +1,5 @@
use super::string;
use crate::builtins::shared::BuiltinResultExt;
use crate::builtins::shared::BuiltinResultExt as _;
use crate::io::IoChain;
use crate::io::{IoStreams, OutputStream, StringOutputStream};
use crate::prelude::*;

View File

@@ -24,7 +24,7 @@ pub mod common {
pub const DATA: libc::c_int = libc::RLIMIT_DATA as _;
pub const FSIZE: libc::c_int = libc::RLIMIT_FSIZE as _;
cfg_if!(
if #[cfg(cygwin)] {
if #[cfg(any(cygwin, target_os = "illumos"))] {
pub const MEMLOCK: libc::c_int = -1;
} else {
pub const MEMLOCK: libc::c_int = libc::RLIMIT_MEMLOCK as _;
@@ -34,7 +34,7 @@ pub mod common {
pub const STACK: libc::c_int = libc::RLIMIT_STACK as _;
pub const CPU: libc::c_int = libc::RLIMIT_CPU as _;
cfg_if!(
if #[cfg(cygwin)] {
if #[cfg(any(cygwin, target_os = "illumos"))] {
pub const NPROC: libc::c_int = -1;
} else {
pub const NPROC: libc::c_int = libc::RLIMIT_NPROC as _;

View File

@@ -10,7 +10,7 @@
use crate::key;
use crate::parse_util::escape_string_with_quote;
use crate::prelude::*;
use crate::terminal::Output;
use crate::terminal::Outputter;
use crate::termsize::Termsize;
use crate::wildcard::{ANY_CHAR, ANY_STRING, ANY_STRING_RECURSIVE};
use crate::wutil::fish_iswalnum;
@@ -1088,16 +1088,16 @@ pub fn valid_func_name(name: &wstr) -> bool {
}
// Output writes always succeed; this adapter allows us to use it in a write-like macro.
struct OutputWriteAdapter<'a, T: Output>(&'a mut T);
struct OutputterWriteAdapter<'a>(&'a mut Outputter);
impl<'a, T: Output> std::fmt::Write for OutputWriteAdapter<'a, T> {
impl<'a> std::fmt::Write for OutputterWriteAdapter<'a> {
fn write_str(&mut self, s: &str) -> std::fmt::Result {
self.0.write_bytes(s.as_bytes());
Ok(())
}
}
impl<'a, T: Output> std::io::Write for OutputWriteAdapter<'a, T> {
impl<'a> std::io::Write for OutputterWriteAdapter<'a> {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.0.write_bytes(buf);
Ok(buf.len())
@@ -1107,8 +1107,8 @@ fn flush(&mut self) -> std::io::Result<()> {
}
}
pub(crate) fn do_write_to_output(writer: &mut impl Output, args: std::fmt::Arguments<'_>) {
let mut adapter = OutputWriteAdapter(writer);
pub(crate) fn do_write_to_output(writer: &mut Outputter, args: std::fmt::Arguments<'_>) {
let mut adapter = OutputterWriteAdapter(writer);
std::fmt::write(&mut adapter, args).unwrap();
}
@@ -1394,7 +1394,7 @@ mod tests {
};
use fish_util::get_seeded_rng;
use fish_widestring::{ENCODE_DIRECT_BASE, L, WString, wstr};
use rand::{Rng, RngCore};
use rand::{Rng as _, RngCore as _};
use std::fmt::Write as _;
#[test]

View File

@@ -53,7 +53,7 @@
string_prefixes_string_case_insensitive, string_suffixes_string_case_insensitive,
strip_executable_suffix,
};
use fish_widestring::WExt;
use fish_widestring::WExt as _;
// Completion description strings, mostly for different types of files, such as sockets, block
// devices, etc.
@@ -2634,7 +2634,7 @@ mod tests {
};
use crate::abbrs::{self, Abbreviation, with_abbrs_mut};
use crate::common::str2wcstring;
use crate::env::{EnvMode, EnvSetMode, Environment};
use crate::env::{EnvMode, EnvSetMode, Environment as _};
use crate::io::IoChain;
use crate::operation_context::{
EXPANSION_LIMIT_BACKGROUND, EXPANSION_LIMIT_DEFAULT, OperationContext, no_cancel,

View File

@@ -2,7 +2,7 @@
use crate::{flog, flogf};
use fish_build_helper::workspace_root;
use std::ffi::OsStr;
use std::os::unix::ffi::OsStrExt;
use std::os::unix::ffi::OsStrExt as _;
use std::path::{Path, PathBuf};
use std::sync::OnceLock;

View File

@@ -30,7 +30,7 @@
use fish_wcstringutil::join_strings;
use libc::c_int;
use nix::{
NixPath,
NixPath as _,
unistd::{Uid, User, gethostname},
};
use std::collections::HashMap;
@@ -517,7 +517,15 @@ fn setup_user(global_exported_mode: EnvSetMode, vars: &EnvStack) {
pub(crate) static FALLBACK_PATH: LazyLock<&[WString]> = LazyLock::new(|| {
// _CS_PATH: colon-separated paths to find POSIX utilities. Same as USER_CS_PATH.
let cs_path = libc::_CS_PATH;
// Fix until rust-lang/libc#4956 is merged
cfg_if::cfg_if!(
if #[cfg(target_os = "illumos")] {
// See https://github.com/illumos/illumos-gate/blob/af641d205ecf080be0d900f89c4f3d2adb84f33f/usr/src/uts/common/sys/unistd.h#L50
let cs_path: c_int = 65;
} else {
let cs_path = libc::_CS_PATH;
}
);
let buf_size = unsafe { libc::confstr(cs_path, std::ptr::null_mut(), 0) };
let paths: Vec<WString> = if buf_size > 0 {
@@ -790,7 +798,7 @@ pub fn env_init(paths: Option<&ConfigPaths>, do_uvars: bool, default_paths: bool
#[cfg(test)]
mod tests {
use super::{EnvMode, EnvStack, Environment};
use super::{EnvMode, EnvStack, Environment as _};
use crate::env::EnvSetMode;
use crate::prelude::*;
use crate::tests::prelude::*;

2
src/env/var.rs vendored
View File

@@ -320,7 +320,7 @@ pub fn is_read_only(name: &wstr) -> bool {
mod tests {
use super::{EnvMode, EnvVar, EnvVarFlags};
use crate::env::EnvSetMode;
use crate::env::environment::{EnvStack, Environment};
use crate::env::environment::{EnvStack, Environment as _};
use crate::prelude::*;
use crate::tests::prelude::*;
use assert_matches::assert_matches;

View File

@@ -1,8 +1,9 @@
use crate::common::init_special_chars_once;
use crate::complete::complete_invalidate_path;
use crate::env::{DEFAULT_READ_BYTE_LIMIT, READ_BYTE_LIMIT};
use crate::env::{EnvMode, EnvStack, Environment, setenv_lock, unsetenv_lock};
use crate::env::{EnvMode, EnvStack, Environment as _, setenv_lock, unsetenv_lock};
use crate::flog::flog;
use crate::function;
use crate::input_common::{update_wait_on_escape_ms, update_wait_on_sequence_key_ms};
use crate::locale::{invalidate_numeric_locale, set_libc_locales};
use crate::prelude::*;
@@ -11,14 +12,10 @@
reader_current_data, reader_schedule_prompt_repaint, reader_set_autosuggestion_enabled,
reader_set_transient_prompt,
};
use crate::screen::{
IS_DUMB, LAYOUT_CACHE_SHARED, ONLY_GRAYSCALE, screen_set_midnight_commander_hack,
};
use crate::screen::{IS_DUMB, ONLY_GRAYSCALE, screen_set_midnight_commander_hack};
use crate::terminal::ColorSupport;
use crate::terminal::use_terminfo;
use crate::tty_handoff::xtversion;
use crate::wutil::fish_wcstoi;
use crate::{function, terminal};
use fish_wcstringutil::{bool_from_string, string_prefixes_string};
use std::collections::HashMap;
use std::sync::atomic::{AtomicBool, Ordering};
@@ -35,11 +32,6 @@
L!("LOCPATH"),
];
#[rustfmt::skip]
const CURSES_VARIABLES: [&wstr; 3] = [
L!("TERM"), L!("TERMINFO"), L!("TERMINFO_DIRS")
];
/// Whether to use `posix_spawn()` when possible.
static USE_POSIX_SPAWN: AtomicBool = AtomicBool::new(false);
@@ -58,9 +50,7 @@ macro_rules! vars {
table.add_anon(name, vars!(handle_locale_change));
}
for name in CURSES_VARIABLES {
table.add_anon(name, handle_term_change);
}
table.add_anon(L!("TERM"), handle_term_change);
table.add(L!("TZ"), handle_tz_change);
table.add_anon(L!("COLORTERM"), handle_fish_term_change);
@@ -337,7 +327,6 @@ fn handle_locale_change(vars: &EnvStack) {
fn handle_term_change(vars: &EnvStack, suppress_repaint: bool) {
guess_emoji_width(vars);
init_terminal(vars);
read_terminfo_database(vars);
if !suppress_repaint {
reader_schedule_prompt_repaint();
}
@@ -415,7 +404,7 @@ fn run_inits(vars: &EnvStack) {
/// Updates our idea of whether we support term256 and term24bit (see issue #10222).
fn update_fish_color_support(vars: &EnvStack) {
// Detect or infer term256 support. If fish_term256 is set, we respect it. Otherwise, infer it
// from $TERM or use terminfo.
// from $TERM.
let term = vars.get_unless_empty(L!("TERM"));
let term = term.as_ref().map_or(L!(""), |term| &term.as_list()[0]);
@@ -514,32 +503,6 @@ fn init_terminal(vars: &EnvStack) {
update_fish_color_support(vars);
}
pub fn read_terminfo_database(vars: &EnvStack) {
if !use_terminfo() {
return;
}
// The current process' environment needs to be modified because the terminfo crate will
// read these variables
for var_name in CURSES_VARIABLES {
if let Some(value) = vars
.getf_unless_empty(var_name, EnvMode::EXPORT)
.map(|v| v.as_string())
{
flog!(term_support, "curses var", var_name, "=", value);
setenv_lock(var_name, &value, true);
} else {
flog!(term_support, "curses var", var_name, "is missing or empty");
unsetenv_lock(var_name);
}
}
terminal::setup();
// Invalidate the cached escape sequences since they may no longer be valid.
LAYOUT_CACHE_SHARED.lock().unwrap().clear();
}
/// Initialize the locale subsystem
fn init_locale(vars: &EnvStack) {
let _guard = crate::locale::LOCALE_LOCK.lock().unwrap();

View File

@@ -9,11 +9,12 @@
use crate::wutil::{FileId, INVALID_FILE_ID, file_id_for_file, file_id_for_path_narrow, wrealpath};
use fish_wcstringutil::{LineIterator, join_strings};
use fish_widestring::decode_byte_from_char;
use itertools::Itertools as _;
use std::collections::HashSet;
use std::collections::hash_map::Entry;
use std::ffi::CString;
use std::fs::File;
use std::io::{Read, Write};
use std::io::{Read as _, Write as _};
use std::mem::MaybeUninit;
/// Callback data, reflecting a change in universal variables.
@@ -317,21 +318,20 @@ fn serialize_with_vars(vars: &VarTable) -> Vec<u8> {
contents.extend_from_slice(UVARS_VERSION_3_0);
contents.push(b'\n');
// Preserve legacy behavior by sorting the values first
let mut cloned: Vec<(&wstr, &EnvVar)> =
vars.iter().map(|(key, var)| (key.as_ref(), var)).collect();
cloned.sort_by(|(lkey, _), (rkey, _)| lkey.cmp(rkey));
vars.iter()
// Preserve legacy behavior by sorting the values first
.sorted_by_key(|(k, _)| *k)
.for_each(|(k, v)| {
// Append the entry. Note that append_file_entry may fail,
// but that only affects one variable; soldier on.
append_file_entry(
v.get_flags(),
k,
&encode_serialized(v.as_list()),
&mut contents,
);
});
for (key, var) in cloned {
// Append the entry. Note that append_file_entry may fail, but that only affects one
// variable; soldier on.
append_file_entry(
var.get_flags(),
key,
&encode_serialized(var.as_list()),
&mut contents,
);
}
contents
}

View File

@@ -380,7 +380,7 @@ pub fn get_desc(parser: &Parser, evt: &Event) -> WString {
format!("signal handler for {} ({})", signal.name(), signal.desc(),)
}
EventDescription::Variable { name } => format!("handler for variable '{name}'"),
EventDescription::ProcessExit { pid: None } => "exit handler for any process".to_string(),
EventDescription::ProcessExit { pid: None } => "exit handler for any process".to_owned(),
EventDescription::ProcessExit { pid: Some(pid) } => {
format!("exit handler for process {pid}")
}
@@ -392,11 +392,11 @@ pub fn get_desc(parser: &Parser, evt: &Event) -> WString {
format!("exit handler for job with pid {pid}")
}
} else {
"exit handler for any job".to_string()
"exit handler for any job".to_owned()
}
}
EventDescription::CallerExit { .. } => {
"exit handler for command substitution caller".to_string()
"exit handler for command substitution caller".to_owned()
}
EventDescription::Generic { param } => format!("handler for generic event '{param}'"),
EventDescription::Any => unreachable!(),

View File

@@ -11,7 +11,7 @@
ScopeGuard, bytes2wcstring, exit_without_destructors, truncate_at_nul, wcs2bytes, wcs2zstring,
write_loop,
};
use crate::env::{EnvMode, EnvSetMode, EnvStack, Environment, READ_BYTE_LIMIT, Statuses};
use crate::env::{EnvMode, EnvSetMode, EnvStack, Environment as _, READ_BYTE_LIMIT, Statuses};
#[cfg(have_posix_spawn)]
use crate::env_dispatch::use_posix_spawn;
use crate::fds::{
@@ -47,7 +47,7 @@
use crate::tty_handoff::TtyHandoff;
use crate::wutil::{fish_wcstol, perror};
use errno::{errno, set_errno};
use fish_widestring::ToWString;
use fish_widestring::ToWString as _;
use libc::{
EACCES, ENOENT, ENOEXEC, ENOTDIR, EPIPE, EXIT_FAILURE, EXIT_SUCCESS, STDERR_FILENO,
STDIN_FILENO, STDOUT_FILENO,
@@ -56,10 +56,10 @@
use nix::sys::stat;
use nix::unistd::getpgrp;
use std::ffi::CStr;
use std::io::{Read, Write};
use std::io::{Read as _, Write as _};
use std::mem::MaybeUninit;
use std::num::NonZeroU32;
use std::os::fd::{AsRawFd, FromRawFd, OwnedFd, RawFd};
use std::os::fd::{AsRawFd as _, FromRawFd as _, OwnedFd, RawFd};
use std::slice;
use std::sync::{
Arc, OnceLock,

View File

@@ -466,8 +466,8 @@ fn drop(&mut self) {
mod tests {
use crate::portable_atomic::AtomicU64;
use std::fs::File;
use std::io::Write;
use std::os::fd::{AsRawFd, OwnedFd};
use std::io::Write as _;
use std::os::fd::{AsRawFd as _, OwnedFd};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Arc, Barrier, Mutex};
use std::thread;

View File

@@ -320,7 +320,7 @@ mod tests {
use super::{BorrowedFdFile, FIRST_HIGH_FD, make_autoclose_pipes};
use crate::tests::prelude::*;
use libc::{F_GETFD, FD_CLOEXEC};
use std::os::fd::{AsRawFd, FromRawFd};
use std::os::fd::{AsRawFd as _, FromRawFd as _};
#[test]
#[serial]

View File

@@ -222,7 +222,7 @@ macro_rules! flog {
($category:ident, $($elem:expr),+ $(,)*) => {
if $crate::flog::categories::$category.enabled.load(std::sync::atomic::Ordering::Relaxed) {
#[allow(unused_imports)]
use $crate::{flog::{FloggableDisplay, FloggableDebug}};
use $crate::{flog::{FloggableDisplay as _, FloggableDebug as _}};
let mut output: Vec<u8> = Vec::new();
output.extend($crate::flog::categories::$category.name.to_flog_str());
output.push(b':');

View File

@@ -10,7 +10,7 @@
use libc::{O_RDONLY, pid_t};
use std::ffi::CStr;
use std::num::NonZeroU32;
use std::os::unix::fs::MetadataExt;
use std::os::unix::fs::MetadataExt as _;
use std::time::Duration;
/// The number of times to try to call fork() before giving up.
@@ -526,5 +526,23 @@ fn get_interpreter<'a>(command: &CStr, buffer: &'a mut [u8]) -> Option<&'a CStr>
} else {
return None;
};
Some(CStr::from_bytes_with_nul(&buffer[offset..idx.max(offset)]).unwrap())
CStr::from_bytes_with_nul(&buffer[offset..idx.max(offset)]).ok()
}
#[cfg(test)]
mod tests {
use super::get_interpreter;
use std::ffi::CString;
use std::os::unix::ffi::OsStrExt as _;
#[test]
fn test_get_interpreter_returns_none_on_embedded_nul() {
let script = fish_tempfile::new_file().unwrap();
std::fs::write(script.path(), b"#!/bin/\0sh\n").unwrap();
let command = CString::new(script.path().as_os_str().as_bytes()).unwrap();
let mut buffer = [0u8; 64];
assert!(get_interpreter(command.as_c_str(), &mut buffer).is_none());
}
}

View File

@@ -116,7 +116,7 @@ pub fn new(
};
// Set our flags.
let mut flags: i32 = 0;
let mut flags = 0;
flags |= libc::POSIX_SPAWN_SETSIGDEF;
flags |= libc::POSIX_SPAWN_SETSIGMASK;
if desired_pgid.is_some() {

View File

@@ -15,8 +15,8 @@
ffi::OsString,
fs::{File, OpenOptions},
os::{
fd::AsRawFd,
unix::{ffi::OsStringExt, fs::MetadataExt},
fd::AsRawFd as _,
unix::{ffi::OsStringExt as _, fs::MetadataExt as _},
},
path::PathBuf,
};

View File

@@ -2,7 +2,7 @@
// autoloading functions in the $fish_function_path. Actual function evaluation is taken care of by
// the parser and to some degree the builtin handling library.
use crate::ast::{self, Node};
use crate::ast::{self, Node as _};
use crate::autoload::{Autoload, AutoloadResult};
use crate::common::{FilenameRef, assert_sync, escape, valid_func_name};
use crate::complete::complete_wrap_map;

View File

@@ -131,9 +131,11 @@ pub struct FeatureMetadata {
flag: FeatureFlag::IgnoreTerminfo,
name: L!("ignore-terminfo"),
groups: L!("4.1"),
description: L!("do not look up $TERM in terminfo database"),
description: L!(
"do not look up $TERM in terminfo database (historical, can no longer be changed)"
),
default_value: true,
read_only: false,
read_only: true,
},
FeatureMetadata {
flag: FeatureFlag::QueryTerm,
@@ -204,20 +206,26 @@ pub fn set_from_string<'a>(str: impl Into<&'a wstr>) {
impl Features {
const fn new() -> Self {
Features {
values: [
AtomicBool::new(METADATA[0].default_value),
AtomicBool::new(METADATA[1].default_value),
AtomicBool::new(METADATA[2].default_value),
AtomicBool::new(METADATA[3].default_value),
AtomicBool::new(METADATA[4].default_value),
AtomicBool::new(METADATA[5].default_value),
AtomicBool::new(METADATA[6].default_value),
AtomicBool::new(METADATA[7].default_value),
AtomicBool::new(METADATA[8].default_value),
AtomicBool::new(METADATA[9].default_value),
],
}
// TODO: feature(const_array): use std::array::from_fn()
use std::mem::{MaybeUninit, transmute};
let values = {
let mut data: [MaybeUninit<AtomicBool>; METADATA.len()] =
[const { MaybeUninit::uninit() }; METADATA.len()];
let mut i = 0;
while i < METADATA.len() {
data[i].write(AtomicBool::new(METADATA[i].default_value));
i += 1;
}
// SAFETY: `data` is guaranteed initialized by the loop
unsafe {
transmute::<[MaybeUninit<AtomicBool>; METADATA.len()], [AtomicBool; METADATA.len()]>(
data,
)
}
};
Features { values }
}
fn test(&self, flag: FeatureFlag) -> bool {

View File

@@ -19,7 +19,7 @@
use fish_wcstringutil::{
string_prefixes_string, string_prefixes_string_case_insensitive, string_suffixes_string,
};
use fish_widestring::{L, WExt, WString, wstr};
use fish_widestring::{L, WExt as _, WString, wstr};
use libc::PATH_MAX;
use nix::unistd::AccessFlags;
use std::collections::{HashMap, HashSet};
@@ -435,7 +435,7 @@ mod tests {
use crate::redirection::RedirectionMode;
use std::fs::{self, File, Permissions, create_dir_all};
use std::os::unix::fs::PermissionsExt;
use std::os::unix::fs::PermissionsExt as _;
use std::path::PathBuf;
struct TempDirWithCtx {

View File

@@ -30,7 +30,7 @@
use fish_color::Color;
use fish_common::{ASCII_MAX, EXPAND_RESERVED_BASE, EXPAND_RESERVED_END};
use fish_wcstringutil::string_prefixes_string;
use fish_widestring::{L, WExt, WString, wstr};
use fish_widestring::{L, WExt as _, WString, wstr};
use std::collections::HashMap;
use std::collections::hash_map::Entry;
@@ -1308,7 +1308,7 @@ pub struct HighlightSpec {
mod tests {
use super::{HighlightColorResolver, HighlightRole, HighlightSpec, highlight_shell};
use crate::common::ScopeGuard;
use crate::env::{EnvMode, EnvSetMode, Environment};
use crate::env::{EnvMode, EnvSetMode, Environment as _};
use crate::future_feature_flags::{self, FeatureFlag};
use crate::highlight::parse_text_face_for_highlight;
use crate::operation_context::{EXPANSION_LIMIT_BACKGROUND, OperationContext};

View File

@@ -2,9 +2,9 @@
use std::{
fs::File,
io::Read,
io::Read as _,
ops::{Deref, DerefMut},
os::fd::AsRawFd,
os::fd::AsRawFd as _,
time::{SystemTime, UNIX_EPOCH},
};

View File

@@ -30,7 +30,7 @@
collections::{BTreeMap, HashMap, HashSet},
ffi::{CStr, CString},
fs::File,
io::{BufRead, BufWriter, Read, Write},
io::{BufRead, BufWriter, Read as _, Write as _},
mem::MaybeUninit,
num::NonZeroUsize,
ops::ControlFlow,
@@ -41,10 +41,10 @@
use bitflags::bitflags;
use lru::LruCache;
use nix::{fcntl::OFlag, sys::stat::Mode};
use rand::Rng;
use rand::Rng as _;
use crate::{
ast::{self, Kind, Node},
ast::{self, Kind, Node as _},
common::{CancelChecker, UnescapeStringStyle, bytes2wcstring, unescape_string, valid_var_name},
env::{EnvMode, EnvStack, Environment},
expand::{ExpandFlags, expand_one},
@@ -295,6 +295,9 @@ enum DeletionScope {
struct HistoryImpl {
/// The name of this list. Used for picking a suitable filename and for switching modes.
name: WString,
/// Optional custom directory for the history file. If None, uses path_get_data().
/// Primarily for testing.
custom_directory: Option<WString>,
/// New items. Note that these are NOT discarded on save. We need to keep these around so we can
/// distinguish between items in our history and items in the history of other shells that were
/// started after we were started.
@@ -333,7 +336,11 @@ fn history_file_path(&self) -> std::io::Result<Option<WString>> {
return Ok(None);
}
let Some(mut path) = path_get_data() else {
let mut path = if let Some(custom_dir) = &self.custom_directory {
custom_dir.clone()
} else if let Some(data_path) = path_get_data() {
data_path
} else {
return Err(std::io::Error::new(
std::io::ErrorKind::NotFound,
"Error obtaining data directory. This is a manually constructed error which does not indicate why this happened.",
@@ -343,7 +350,11 @@ fn history_file_path(&self) -> std::io::Result<Option<WString>> {
path.push('/');
path.push_utfstr(&self.name);
path.push_utfstr(L!("_history"));
if let Some(canonicalized_path) = wrealpath(&path) {
// For custom directories, skip wrealpath since file may not exist yet
if self.custom_directory.is_some() {
Ok(Some(path))
} else if let Some(canonicalized_path) = wrealpath(&path) {
Ok(Some(canonicalized_path))
} else {
Err(std::io::Error::other(format!(
@@ -736,9 +747,10 @@ fn save_unless_disabled(&mut self) {
self.save(vacuum);
}
fn new(name: WString) -> Self {
fn new(name: WString, custom_directory: Option<WString>) -> Self {
Self {
name,
custom_directory,
new_items: vec![],
first_unwritten_new_item_index: 0,
has_pending_item: false,
@@ -1210,18 +1222,26 @@ pub fn add_commandline(&self, s: WString) {
imp.add(item, false, true);
}
pub fn new(name: &wstr) -> Arc<Self> {
Arc::new(Self(Mutex::new(HistoryImpl::new(name.to_owned()))))
/// Creates a new History with a custom directory path.
/// The history file will be stored at `{directory}/{name}_history`.
/// If the directory is None, it will be stored at path_get_data().
pub fn new(name: &wstr, directory: Option<WString>) -> Arc<Self> {
Arc::new(Self(Mutex::new(HistoryImpl::new(
name.to_owned(),
directory,
))))
}
/// Returns history with the given name, creating it if necessary.
/// Returns the history with the given name, creating it if necessary, using the default data directory.
/// This uses the HISTORIES global collection. Note it is possible to create a history without
/// placing it into this collection.
pub fn with_name(name: &wstr) -> Arc<Self> {
let mut histories = HISTORIES.lock().unwrap();
if let Some(hist) = histories.get(name) {
Arc::clone(hist)
} else {
let hist = Self::new(name);
let hist = Self::new(name, None);
histories.insert(name.to_owned(), Arc::clone(&hist));
hist
}
@@ -1786,21 +1806,19 @@ mod tests {
History, HistoryItem, HistorySearch, PathList, PersistenceMode, SearchDirection,
SearchFlags, SearchType, VACUUM_FREQUENCY,
};
use crate::common::{ESCAPE_TEST_CHAR, ScopeGuard, osstr2wcstring, wcs2bytes, wcs2osstring};
use crate::common::{ESCAPE_TEST_CHAR, osstr2wcstring, wcs2bytes};
use crate::env::{EnvMode, EnvSetMode, EnvStack};
use crate::fs::{LockedFile, WriteMethod};
use crate::path::path_get_data;
use crate::prelude::*;
use crate::tests::prelude::*;
use fish_build_helper::workspace_root;
use fish_wcstringutil::{string_prefixes_string, string_prefixes_string_case_insensitive};
use rand::Rng;
use rand::Rng as _;
use rand::rngs::ThreadRng;
use std::collections::VecDeque;
use std::ffi::OsString;
use std::io::BufReader;
use std::sync::Arc;
use std::time::UNIX_EPOCH;
use std::time::{Duration, SystemTime};
use std::time::{Duration, SystemTime, UNIX_EPOCH};
fn history_contains(history: &History, txt: &wstr) -> bool {
for i in 1.. {
@@ -1816,6 +1834,11 @@ fn history_contains(history: &History, txt: &wstr) -> bool {
false
}
// Helper to create a history with a custom directory, for testing.
fn create_test_history(name: &wstr, custom_dir: &wstr) -> Arc<History> {
History::new(name, Some(custom_dir.to_owned()))
}
fn random_string(rng: &mut ThreadRng) -> WString {
let mut result = WString::new();
let max = rng.random_range(1..=32);
@@ -1829,9 +1852,10 @@ fn random_string(rng: &mut ThreadRng) -> WString {
}
#[test]
#[serial]
fn test_history() {
let _cleanup = test_init();
let tmpdir = fish_tempfile::new_dir().unwrap();
let hist_dir = osstr2wcstring(tmpdir.path());
macro_rules! test_history_matches {
($search:expr, $expected:expr) => {
let expected: Vec<&wstr> = $expected;
@@ -1858,7 +1882,7 @@ macro_rules! test_history_matches {
let nocase = SearchFlags::IGNORE_CASE;
// Populate a history.
let history = History::with_name(L!("test_history"));
let history = create_test_history(L!("test_history"), &hist_dir);
history.clear();
for s in items {
history.add_commandline(s.to_owned());
@@ -2010,9 +2034,9 @@ fn generate_history_lines(item_count: usize, idx: usize) -> Vec<WString> {
result
}
fn pound_on_history(item_count: usize, idx: usize) -> Arc<History> {
fn write_history_entries(dir: &wstr, item_count: usize, idx: usize) -> Arc<History> {
// Called in child thread to modify history.
let hist = History::new(L!("race_test"));
let hist = create_test_history(L!("race_test"), dir);
let hist_lines = generate_history_lines(item_count, idx);
for line in hist_lines {
hist.add_commandline(line);
@@ -2022,23 +2046,16 @@ fn pound_on_history(item_count: usize, idx: usize) -> Arc<History> {
}
#[test]
#[serial]
fn test_history_races() {
let _cleanup = test_init();
// Place history in a temp directory.
let tmpdir = fish_tempfile::new_dir().unwrap();
let hist_dir = osstr2wcstring(tmpdir.path());
let tmp_path = std::env::current_dir()
.unwrap()
.join("history-races-test-balloon");
std::fs::write(&tmp_path, []).unwrap();
let _cleanup = ScopeGuard::new((), |()| {
std::fs::remove_file(&tmp_path).unwrap();
});
if LockedFile::new(
crate::fs::LockingMode::Exclusive(WriteMethod::RenameIntoPlace),
&osstr2wcstring(&tmp_path),
)
.is_err()
{
// Skip tests if we can't get an exclusive lock on a file in that directory.
let tmp_balloon = tmpdir.path().join("history-races-test-balloon");
std::fs::write(&tmp_balloon, []).unwrap();
let mode = crate::fs::LockingMode::Exclusive(WriteMethod::RenameIntoPlace);
if LockedFile::new(mode, &osstr2wcstring(&tmp_balloon)).is_err() {
return;
}
@@ -2052,12 +2069,13 @@ fn test_history_races() {
const ITEM_COUNT: usize = 256;
// Ensure history is clear.
History::new(L!("race_test")).clear();
create_test_history(L!("race_test"), &hist_dir).clear();
let mut children = Vec::with_capacity(RACE_COUNT);
for i in 0..RACE_COUNT {
let hist_dir = hist_dir.clone();
children.push(std::thread::spawn(move || {
pound_on_history(ITEM_COUNT, i);
write_history_entries(&hist_dir, ITEM_COUNT, i);
}));
}
@@ -2074,7 +2092,7 @@ fn test_history_races() {
time_barrier();
// Ensure that we got sane, sorted results.
let hist = History::new(L!("race_test"));
let hist = create_test_history(L!("race_test"), &hist_dir);
// History is enumerated from most recent to least
// Every item should be the last item in some array
@@ -2128,25 +2146,26 @@ fn test_history_races() {
}
#[test]
#[serial]
fn test_history_external_rewrites() {
let _cleanup = test_init();
// Place history in a temp directory.
let tmpdir = fish_tempfile::new_dir().unwrap();
let hist_dir = osstr2wcstring(tmpdir.path());
// Write some history to disk.
{
let hist = pound_on_history(VACUUM_FREQUENCY / 2, 0);
let hist = write_history_entries(&hist_dir, VACUUM_FREQUENCY / 2, 0);
hist.add_commandline("needle".into());
hist.save();
}
std::thread::sleep(Duration::from_secs(1));
// Read history from disk.
let hist = History::new(L!("race_test"));
let hist = create_test_history(L!("race_test"), &hist_dir);
assert_eq!(hist.item_at_index(1).unwrap().str(), "needle");
// Add items until we rewrite the file.
// In practice this might be done by another shell.
pound_on_history(VACUUM_FREQUENCY, 0);
write_history_entries(&hist_dir, VACUUM_FREQUENCY, 0);
for i in 1.. {
if hist.item_at_index(i).unwrap().str() == "needle" {
@@ -2156,16 +2175,21 @@ fn test_history_external_rewrites() {
}
#[test]
#[serial]
fn test_history_merge() {
let _cleanup = test_init();
let tmpdir = fish_tempfile::new_dir().unwrap();
let hist_dir = osstr2wcstring(tmpdir.path());
// In a single fish process, only one history is allowed to exist with the given name But it's
// common to have multiple history instances with the same name active in different processes,
// e.g. when you have multiple shells open. We try to get that right and merge all their history
// together. Test that case.
const COUNT: usize = 3;
let name = L!("merge_test");
let hists = [History::new(name), History::new(name), History::new(name)];
let hists = [
create_test_history(name, &hist_dir),
create_test_history(name, &hist_dir),
create_test_history(name, &hist_dir),
];
let texts = [L!("History 1"), L!("History 2"), L!("History 3")];
let alt_texts = [
L!("History Alt 1"),
@@ -2204,7 +2228,7 @@ fn test_history_merge() {
// Make a new history. It should contain everything. The time_barrier() is so that the timestamp
// is newer, since we only pick up items whose timestamp is before the birth stamp.
time_barrier();
let everything = History::new(name);
let everything = create_test_history(name, &hist_dir);
for text in texts {
assert!(history_contains(&everything, text));
}
@@ -2265,10 +2289,13 @@ fn test_history_merge() {
}
#[test]
#[serial]
fn test_history_path_detection() {
let _cleanup = test_init();
// Regression test for #7582.
// Temporary directory for the history files.
let hist_tmpdir = fish_tempfile::new_dir().unwrap();
let hist_dir = Some(osstr2wcstring(hist_tmpdir.path()));
// Temporary directory for the files we will detect.
let tmpdir = fish_tempfile::new_dir().unwrap();
// Place one valid file in the directory.
@@ -2283,7 +2310,7 @@ fn test_history_path_detection() {
test_vars.set_one(L!("PWD"), global_mode, wdir_path.clone());
test_vars.set_one(L!("HOME"), global_mode, wdir_path.clone());
let history = History::with_name(L!("path_detection"));
let history = History::new(L!("path_detection"), hist_dir);
history.clear();
assert_eq!(history.size(), 0);
history.add_pending_with_file_detection(
@@ -2369,30 +2396,31 @@ fn test_history_path_detection() {
history.clear();
}
fn install_sample_history(name: &wstr) {
let path = path_get_data().expect("Failed to get data directory");
fn install_sample_history(name: &wstr, hist_dir: &wstr) {
let dst_hist_path: OsString = format!("{}/{}_history", hist_dir, name).into();
std::fs::copy(
workspace_root()
.join("tests")
.join(std::str::from_utf8(&wcs2bytes(name)).unwrap()),
wcs2osstring(&(path + L!("/") + name + L!("_history"))),
dst_hist_path,
)
.unwrap();
}
#[test]
#[serial]
fn test_history_formats() {
let _cleanup = test_init();
let tmpdir = fish_tempfile::new_dir().unwrap();
let hist_dir = osstr2wcstring(tmpdir.path());
// Test inferring and reading legacy and bash history formats.
let name = L!("history_sample_fish_2_0");
install_sample_history(name);
install_sample_history(name, &hist_dir);
let expected: Vec<WString> = vec![
"echo this has\\\nbackslashes".into(),
"function foo\necho bar\nend".into(),
"echo alpha".into(),
];
let test_history_imported = History::with_name(name);
let test_history_imported = create_test_history(name, &hist_dir);
assert_eq!(test_history_imported.get_history(), expected);
test_history_imported.clear();
@@ -2411,16 +2439,16 @@ fn test_history_formats() {
"history --help".into(),
"echo foo".into(),
];
let test_history_imported_from_bash = History::with_name(L!("bash_import"));
let test_history_imported_from_bash = create_test_history(L!("bash_import"), &hist_dir);
let file = std::fs::File::open(workspace_root().join("tests/history_sample_bash")).unwrap();
test_history_imported_from_bash.populate_from_bash(BufReader::new(file));
assert_eq!(test_history_imported_from_bash.get_history(), expected);
test_history_imported_from_bash.clear();
let name = L!("history_sample_corrupt1");
install_sample_history(name);
install_sample_history(name, &hist_dir);
// We simply invoke get_string_representation. If we don't die, the test is a success.
let test_history_imported_from_corrupted = History::with_name(name);
let test_history_imported_from_corrupted = create_test_history(name, &hist_dir);
let expected: Vec<WString> = vec![
"no_newline_at_end_of_file".into(),
"corrupt_prefix".into(),

View File

@@ -13,7 +13,7 @@
use fish_common::assert_sorted_by_name;
use std::mem;
use std::sync::{
LazyLock, Mutex, MutexGuard,
Mutex, MutexGuard,
atomic::{AtomicU32, Ordering},
};
@@ -162,6 +162,7 @@ const fn make_md(name: &'static wstr, code: ReadlineCmd) -> InputFunctionMetadat
make_md(L!("forward-word"), ReadlineCmd::ForwardWordEmacs),
make_md(L!("forward-word-end"), ReadlineCmd::ForwardWordEnd),
make_md(L!("forward-word-vi"), ReadlineCmd::ForwardWordVi),
make_md(L!("get-key"), ReadlineCmd::GetKey),
make_md(L!("history-delete"), ReadlineCmd::HistoryDelete),
make_md(L!("history-last-token-search-backward"), ReadlineCmd::HistoryLastTokenSearchBackward),
make_md(L!("history-last-token-search-forward"), ReadlineCmd::HistoryLastTokenSearchForward),
@@ -238,10 +239,18 @@ pub struct InputMappingSet {
preset_mapping_list: Vec<InputMapping>,
}
impl InputMappingSet {
const fn new() -> Self {
Self {
mapping_list: Vec::new(),
preset_mapping_list: Vec::new(),
}
}
}
/// Access the singleton input mapping set.
pub fn input_mappings() -> MutexGuard<'static, InputMappingSet> {
static INPUT_MAPPINGS: LazyLock<Mutex<InputMappingSet>> =
LazyLock::new(|| Mutex::new(InputMappingSet::default()));
static INPUT_MAPPINGS: Mutex<InputMappingSet> = Mutex::new(InputMappingSet::new());
INPUT_MAPPINGS.lock().unwrap()
}
@@ -698,7 +707,9 @@ pub fn read_char(&mut self) -> CharEvent {
let evt = self.readch();
match evt {
CharEvent::Readline(ref readline_event) => match readline_event.cmd {
ReadlineCmd::SelfInsert | ReadlineCmd::SelfInsertNotFirst => {
ReadlineCmd::SelfInsert
| ReadlineCmd::SelfInsertNotFirst
| ReadlineCmd::GetKey => {
// Typically self-insert is generated by the generic (empty) binding.
// However if it is generated by a real sequence, then insert that sequence.
let seq = readline_event.seq.chars().map(CharEvent::from_char);
@@ -721,6 +732,20 @@ pub fn read_char(&mut self) -> CharEvent {
kevt.input_style = CharInputStyle::NotFirst;
}
}
if readline_event.cmd == ReadlineCmd::GetKey {
if let CharEvent::Key(kevt) = res {
return CharEvent::Command(sprintf!(
"set -g fish_key %s",
escape(
&kevt
.key
.codepoint_text()
.map(|c| WString::from_chars(vec![c]))
.unwrap_or_default()
)
));
}
}
return res;
}
ReadlineCmd::FuncAnd | ReadlineCmd::FuncOr => {

View File

@@ -2,7 +2,7 @@
WSL, bytes2wcstring, fish_reserved_codepoint, is_windows_subsystem_for_linux, read_blocked,
shell_modes,
};
use crate::env::{EnvStack, Environment};
use crate::env::{EnvStack, Environment as _};
use crate::fd_readable_set::{FdReadableSet, Timeout};
use crate::flog::{FloggableDebug, FloggableDisplay, flog};
use crate::future_feature_flags::{FeatureFlag, test as feature_test};
@@ -107,6 +107,7 @@ pub enum ReadlineCmd {
HistoryLastTokenSearchForward,
SelfInsert,
SelfInsertNotFirst,
GetKey,
TransposeChars,
TransposeWords,
UpcaseWord,
@@ -1776,7 +1777,7 @@ fn parse_hex_into(out: &mut [u8], hex: &[u8]) -> Option<()> {
#[cfg(test)]
mod tests {
use super::{
CharEvent, InputEventQueue, InputEventQueuer, KeyEvent, KeyMatchQuality, ReadlineCmd,
CharEvent, InputEventQueue, InputEventQueuer as _, KeyEvent, KeyMatchQuality, ReadlineCmd,
match_key_event_to_key, parse_hex,
};
use crate::key::{Key, Modifiers};

View File

@@ -11,7 +11,6 @@
use crate::proc::JobGroupRef;
use crate::redirection::{RedirectionMode, RedirectionSpecList};
use crate::signal::SigChecker;
use crate::terminal::Output;
use crate::topic_monitor::Topic;
use crate::wutil::{perror, perror_io, unescape_bytes_and_write_to_fd, wdirname, wstat};
use errno::Errno;
@@ -20,7 +19,7 @@
use nix::sys::stat::Mode;
use std::fs::File;
use std::io;
use std::os::fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd, RawFd};
use std::os::fd::{AsFd as _, AsRawFd as _, BorrowedFd, OwnedFd, RawFd};
use std::sync::{Arc, LazyLock, Mutex, MutexGuard};
/// separated_buffer_t represents a buffer of output from commands, prepared to be turned into a
@@ -732,13 +731,6 @@ pub fn append_narrow_buffer(&mut self, buffer: &SeparatedBuffer) -> bool {
}
}
impl Output for OutputStream {
fn write_bytes(&mut self, command_part: &[u8]) {
// TODO Retry on interrupt.
self.append(&bytes2wcstring(command_part));
}
}
/// An output stream for builtins which outputs to an fd.
/// Note the fd may be something like stdout; there is no ownership implied here.
pub struct FdOutputStream {

View File

@@ -4,17 +4,17 @@
//! previous cuts.
use std::collections::VecDeque;
use std::sync::{LazyLock, Mutex};
use std::sync::Mutex;
use crate::prelude::*;
struct KillRing(VecDeque<WString>);
static KILL_RING: LazyLock<Mutex<KillRing>> = LazyLock::new(|| Mutex::new(KillRing::new()));
static KILL_RING: Mutex<KillRing> = Mutex::new(KillRing::new());
impl KillRing {
/// Create a new killring.
fn new() -> Self {
const fn new() -> Self {
Self(VecDeque::new())
}

View File

@@ -16,7 +16,7 @@ pub unsafe fn set_libc_locales(log_ok: bool) -> bool {
if log_ok {
crate::flog::flog!(env_locale, {
let source = if value == from_environment {
"from environment".to_string()
"from environment".to_owned()
} else {
format!("to '{}'", value.to_str().unwrap())
};

View File

@@ -1,9 +1,9 @@
use super::{localizable_consts, localizable_string, wgettext, wgettext_fmt};
use crate::env::{EnvStack, Environment};
use crate::env::{EnvStack, Environment as _};
use fish_widestring::{L, WString, wstr};
use itertools::Itertools;
use itertools::Itertools as _;
use std::collections::{HashMap, HashSet};
use std::sync::{LazyLock, Mutex};
use std::sync::Mutex;
#[derive(PartialEq, Eq, Clone, Copy)]
enum LanguagePrecedenceOrigin {
@@ -138,7 +138,7 @@ struct LocalizationState {
}
impl LocalizationState {
fn new() -> Self {
const fn new() -> Self {
Self {
precedence_origin: LanguagePrecedenceOrigin::Default,
}
@@ -322,8 +322,7 @@ fn update_precedence<'a, 'b, 'c: 'a + 'b, LocalizationLanguage: Copy + 'a>(
///
/// This struct should be updated when the relevant variables change or `status language` is used
/// to modify the localization state.
static LOCALIZATION_STATE: LazyLock<Mutex<LocalizationState>> =
LazyLock::new(|| Mutex::new(LocalizationState::new()));
static LOCALIZATION_STATE: Mutex<LocalizationState> = Mutex::new(LocalizationState::new());
/// Call this when one of `LANGUAGE`, `LC_ALL`, `LC_MESSAGES`, `LANG` changes.
/// Updates internal state such that the correct localizations will be used in subsequent

Some files were not shown because too many files have changed in this diff Show More