
Sicherheitsforschungs-Labor, das CVE-2026-41414 reproduziert (pull_request_target-Pwn in .github/workflows/pr.yml) — Snapshot von skim-rs/skim @ ca986f4, kein Fork.
Automatisiertes Forschungsobjekt — nicht das Upstream-Projekt.
Dieses Repository ist ein Wegwerf-Labor, das von einer automatisierten Testumgebung für eine Masterarbeit an der Université Laval zur Reproduktion veröffentlichter GitHub-Actions-Workflow- Schwachstellen erstellt wurde. Es ist eine wörtliche Momentaufnahme von
skim-rs/skimbeim Commitca986f444c37d2c1dc15ce1fad2fe101776af8d9(2026-04-14), weiterverbreitet unter der eigenen Lizenz dieses Projekts, deren Datei unverändert in dieser Momentaufnahme enthalten ist.Das Upstream-Projekt ist nicht beteiligt, wird niemals angegriffen, und die hier untersuchte Schwachstelle ist bereits öffentlich. Jedes Geheimnis und jede Variable in diesem Repository ist ein zufällig generierter Dummy-Wert — es sind keine echten Anmeldedaten vorhanden. Aktionsreferenzen und Runner-Images sind auf das fixiert, was sie am 2026-04-14 aufgelöst haben; siehe
pinning.mdin der Testumgebungsausgabe für jede an der Momentaufnahme vorgenommene Änderung.Fragen oder Einwände: [email protected]
Das Leben ist kurz, skim!
Wir verbringen so viel Zeit damit, durch Dateien, Zeilen und Befehle zu navigieren. Genau hier kommt Skim ins Spiel! Es ist ein leistungsstarker Fuzzy-Finder, der deinen Workflow schneller und effizienter machen soll.
Skim stellt eine einzelne ausführbare Datei namens sk bereit. Stell es dir als intelligentere Alternative zu Werkzeugen wie
grep vor – sobald du es ausprobierst, wirst du dich fragen, wie du je ohne es leben konntest!
Das Skim-Projekt enthält mehrere Komponenten:
sk-Programm – das Kernprogrammsk innerhalb von Vim/Nvim aufzurufen. Siehe skim.vim für die Vim-Unterstützung.| OS | Paketmanager | Befehl |
|---|---|---|
| macOS | Homebrew | brew install sk |
| macOS | MacPorts | sudo port install skim |
| Alpine | apk | apk add skim |
| Arch | pacman | pacman -S skim |
| Fedora | COPR | siehe unten |
| Gentoo | Portage | emerge --ask app-misc/skim |
| Guix | guix | guix install skim |
| Void | XBPS | xbps-install -S skim |
Aktuelle Fedora-Pakete werden über ein inoffizielles, von der Community gepflegtes COPR-Repository bereitgestellt.```bash sudo dnf copr enable sisyphus1813/skim sudo dnf install skim
## Manuell
Einer der folgenden Punkte trifft zu:
- Verwendung des Installationsskripts:
```sh
# Überprüfen Sie immer den Inhalt des Skripts, bevor Sie es ausführen!
$ curl --proto '=https' --tlsv1.2 -LsSf https://github.com/skim-rs/skim/releases/latest/download/skim-installer.sh | sh
```
- Verwendung der Binärdatei: Laden Sie einfach [die sk-ausführbare Datei](https://github.com/skim-rs/skim/releases) direkt herunter.
- Installation von [crates.io](https://crates.io/): `cargo install skim`
- Manuelle Erstellung:
```sh
$ git clone --depth 1 [email protected]:skim-rs/skim.git ~/.skim
$ cd ~/.skim
$ cargo build --release
$ # Fügen Sie die resultierende `target/release/sk`-ausführbare Datei zu Ihrem PATH hinzu
```
Sie haben dann Zugriff auf:
- Die Manpage, die Sie entweder in den richtigen Pfad schreiben oder mit `man --local-file <(sk --man)` ausführen können
- Die Shell-Vervollständigungen (und optionale Tastenkombinationen) mit `source <(sk --shell \<shell> \[--shell-bindings])`, siehe unten für Details
# Verwendung
Skim kann entweder als allgemeiner Filter (ähnlich wie `grep`) oder als interaktive
Schnittstelle zum Ausführen von Befehlen verwendet werden.
## Als Vim-Plugin (unter neovim, siehe [fzf-lua](https://github.com/ibhagwan/fzf-lua) mit dem skim-Profil)
Über vim-plug (empfohlen):
Installieren Sie skim, dann:```vim
Plug 'skim-rs/skim'
Hier sind einige Beispiele für den Einstieg:```bash
sk
vim $(find . -name "*.rs" | sk -m)
Dieser letzte Befehl ermöglicht es dir, Dateien mit der Erweiterung „.rs“ auszuwählen und öffnet
deine Auswahl in Vim – ein großer Zeitersparnis für Entwickler!
## Als interaktive Oberfläche
`skim` kann andere Befehle dynamisch aufrufen. Normalerweise möchtest du es
mit [grep](https://www.gnu.org/software/grep/),
[ack](https://github.com/petdance/ack2),
[ag](https://github.com/ggreer/the_silver_searcher) oder
[rg](https://github.com/BurntSushi/ripgrep) integrieren, um Inhalte in einem
Projektverzeichnis zu durchsuchen:```sh
# works with grep
sk --ansi -i -c 'grep -rI --color=always --line-number {q} .'
# works with ack
sk --ansi -i -c 'ack --color {q}'
# works with ag
sk --ansi -i -c 'ag --color {q}'
# works with rg
sk --ansi -i -c 'rg --color=always --line-number {q}'
Hinweis: In diesen Beispielen wird
{q}wörtlich durch die aktuelle Eingabeabfrage (in einfache Anführungszeichen gesetzt) ersetzt. Das bedeutet, dass diese Beispiele nach der exakten Abfragezeichenfolge suchen, nicht unscharf. Für unscharfe Suche leiten Sie die Befehlsausgabe inskum, ohne den interaktiven Modus zu verwenden.

Bindungen für Fish, Bash und Zsh sind im Verzeichnis shell verfügbar:
completion.{shell} enthält die Vervollständigungsskripte für die sk-CLI-Nutzungkey-bindings.{shell} enthält Tastenkombinationen und Shell-Integrationen:
ctrl-t zum Auswählen einer Datei über skctrl-r zum Auswählen eines Verlaufseintrags über skalt-c zum Wechseln (cd) in ein über sk ausgewähltes Verzeichnisfish verfügbar) ** zum Vervollständigen von Dateipfaden, z. B. zeigt ls **<tab> ein sk-Widget zum Auswählen eines OrdnersUm diese Funktionen zu aktivieren, laden Sie die Datei key-bindings.{shell} und richten Sie die Vervollständigungen gemäß der Dokumentation Ihrer Shell ein oder siehe unten.
Sie können Shell-Vervollständigungen für Ihre bevorzugte Shell mit dem Flag --shell und einer der unterstützten Shells generieren: bash, zsh, fish, powershell oder elvish:
source <(sk --shell bash)
source <(sk --shell zsh)
sk --shell fish | source
#### Option 2: In einer Datei speichern, die beim Shell-Start automatisch geladen wird```sh
# For bash, add to ~/.bashrc
echo 'source <(sk --shell bash)' >> ~/.bashrc # Or save to ~/.bash_completion
# For zsh, add to ~/.zshrc
sk --shell zsh > ~/.zfunc/_sk # Create ~/.zfunc directory and add to fpath in ~/.zshrc
# For fish, add to ~/.config/fish/completions/
sk --shell fish > ~/.config/fish/completions/sk.fish
Einige häufig verwendete Tastenkombinationen:
| Taste | Aktion |
|---|---|
| Enter | Übernehmen (aktuelles auswählen und beenden) |
| ESC/Ctrl-G | Abbrechen |
| Ctrl-P/Nach oben | Cursor nach oben bewegen |
| Ctrl-N/Nach unten | Cursor nach unten bewegen |
| TAB | Auswahl umschalten und nach unten (mit -m) |
| Shift-TAB | Auswahl umschalten und nach oben (mit -m) |
Eine vollständige Liste der Tastenkombinationen finden Sie in der Manpage (man sk).
skim übernimmt die Syntax von fzf zum Abgleichen von Einträgen:
| Token | Übereinstimmungstyp | Beschreibung |
|---|---|---|
text | Fuzzy-Übereinstimmung | Einträge, die mit text übereinstimmen |
^music | Präfix-Exaktübereinstimmung | Einträge, die mit music beginnen |
.mp3$ | Suffix-Exaktübereinstimmung | Einträge, die mit .mp3 enden |
'wild | Exaktübereinstimmung (in Anführungszeichen) | Einträge, die wild enthalten |
!fire | Inverse-Exaktübereinstimmung | Einträge, die fire nicht enthalten |
!.mp3$ | Inverse-Suffix-Exaktübereinstimmung | Einträge, die nicht mit .mp3 enden |
skim unterstützt auch die Kombination von Token.
Leerzeichen haben die Bedeutung von UND. Mit dem Begriff src main sucht skim
nach Einträgen, die sowohl src als auch main entsprechen.
| bedeutet ODER (beachten Sie die Leerzeichen um |). Mit dem Begriff .md$ | .markdown$ sucht skim nach Einträgen, die entweder mit .md oder
.markdown enden.
ODER hat höhere Priorität. Beispielsweise wird readme .md$ | .markdown$ interpretiert als
readme UND (.md$ ODER .markdown$).
Bei Verwendung der Option --split-match wird jeder Teil um Leerzeichen oder | herum aufgeteilt abgeglichen:
:) in der Abfrage fehlt, erfolgt ein normaler Abgleichrg weitergeleitet werden, um sowohl auf Dateinamen als auch auf Inhalt abzugleichen.Wenn Sie reguläre Ausdrücke bevorzugen, bietet skim einen regex-Modus:```sh
sk --regex
Sie können dynamisch in den `regex`-Modus wechseln, indem Sie `Strg-R` (Modus rotieren) drücken.
## Exit-Code
| Exit-Code | Bedeutung |
|-----------|--------------------------------------|
| 0 | Normal beendet |
| 1 | Keine Übereinstimmung gefunden |
| 130 | Durch Strg-C/Strg-G/ESC usw. abgebrochen |
# Mit `skim` kompatible Tools
Diese Tools sind mit `skim` kompatibel oder zielen darauf ab, es zu sein:
## [fzf-lua neovim-Plugin](https://github.com/ibhagwan/fzf-lua)
Ein [neovim](https://neovim.io)-Plugin, das die Verwendung von fzf und skim zur Navigation durch Ihren Code ermöglicht.
Installieren Sie es mit Ihrem Paketmanager, wie in der README beschrieben. Zum Beispiel mit `lazy.nvim`:```lua
{
"ibhagwan/fzf-lua",
-- enable `sk` support instead of the default `fzf`
opts = {'skim'}
}
Ein nushell-Plugin, das eine bessere Interaktion zwischen skim und nushell ermöglicht.
Befolgen Sie die Anweisungen in der README des Plugins, um es mit cargo zu installieren:```nu cargo install nu_plugin_skim plugin add ~/.cargo/bin/nu_plugin_skim
## [sqlite-Erweiterung](https://github.com/tzachar/sqlite_skim)
Ein ladbares `sqlite`-Modul, das eine `skim_score`-Funktion in SQL-Abfragen
ermöglicht.
# Anpassung
Die Dokumentation hier ist nur eine Vorschau; bitte lesen Sie die Manpage (`man sk`) für eine vollständige
Liste der Optionen.
## Tastenbelegung
Geben Sie die Bindungen als kommagetrennte Paare an (keine Leerzeichen erlaubt). Zum Beispiel:```sh
sk --bind 'alt-a:select-all,alt-d:deselect-all'
Zusätzlich kannst du + verwenden, um Aktionen zu verketten, z. B. execute-silent(echo {} | pbcopy)+abort.
Details findest du im Abschnitt KEY BINDINGS der Manpage.
Es gibt fünf Sortierschlüssel für Ergebnisse: score, index, begin, end, length. Du kannst
festlegen, wie die Datensätze sortiert werden, z. B. mit sk --tiebreak score,index,-begin oder in
einer beliebigen anderen Reihenfolge, die du möchtest.
Du hast wahrscheinlich deine eigenen ästhetischen Vorlieben! Zum Glück bist du nicht auf das Standard-Erscheinungsbild beschränkt – Skim unterstützt eine umfassende Anpassung seines Farbschemas.```sh --color=[BASE_SCHEME][,COLOR:ANSI]
Skim respektiert auch die Umgebungsvariable `NO_COLOR`. Setzen Sie sie auf einen beliebigen Wert und `sk` (sowie viele andere Terminal-Anwendungen) deaktivieren die gesamte farbige Ausgabe. Weitere Details finden Sie unter [no-color.org](https://no-color.org/).
### Verfügbare Basis-Farbschemata
Skim wird mit mehreren integrierten Farbschemata ausgeliefert, die Sie als Ausgangspunkt verwenden können:```sh
sk --color=dark # Default dark theme (256 colors)
sk --color=light # Light theme (256 colors)
sk --color=16 # Simple 16-color theme
sk --color=bw # Minimal black & white theme (no colors, just styles)
sk --color=none # Minimal black & white theme (no colors, no styles)
sk --color=molokai # Molokai-inspired theme (256 colors)
Sie können einzelne UI-Elemente anpassen, indem Sie nach dem Basisschema Farbwerte angeben:```sh sk --color=light,fg:232,bg:255,current_bg:116,info:27
Farben können auf verschiedene Weise angegeben werden:
- ANSI-Farben (0-255): `sk --color=fg:232,bg:255`
- RGB-Hexwerte: `sk --color=fg:#FF0000` (roter Text)
### Verfügbare Optionen zur Farbanpassung
Die folgenden UI-Elemente können angepasst werden:
| Element | Beschreibung | Beispiel |
|--------------------|---------------------------------------------|--------------------------------|
| `fg` | Vordergrundfarbe für normalen Text | `--color=fg:232` |
| `bg` | Hintergrundfarbe für normalen Text | `--color=bg:255` |
| `matched` | Übereinstimmender Text in Suchergebnissen | `--color=matched:108` |
| `matched_bg` | Hintergrund des übereinstimmenden Texts | `--color=matched_bg:0` |
| `current` | Vordergrundfarbe der aktuellen Zeile | `--color=current:254` |
| `current_bg` | Hintergrundfarbe der aktuellen Zeile | `--color=current_bg:236` |
| `current_match` | Übereinstimmender Text in der aktuellen Zeile | `--color=current_match:151` |
| `current_match_bg` | Hintergrund des übereinstimmenden Texts in der aktuellen Zeile | `--color=current_match_bg:236` |
| `spinner` | Farbe des Fortschrittsanzeigers | `--color=spinner:148` |
| `info` | Farbe der Informationszeile | `--color=info:144` |
| `prompt` | Farbe der Eingabeaufforderung | `--color=prompt:110` |
| `cursor` | Cursorfarbe | `--color=cursor:161` |
| `selected` | Farbe der Markierung ausgewählter Elemente | `--color=selected:168` |
| `header` | Farbe des Kopfzeilentexts | `--color=header:109` |
| `border` | Rahmenfarbe für Vorschau/Layout | `--color=border:59` |
### Beispiele```sh
# Use light theme but change the current line background
sk --color=light,current_bg:24
# Custom theme with multiple colors
sk --color=dark,matched:#00FF00,current:#FFFFFF,current_bg:#000080
# High contrast theme
sk --color=fg:232,bg:255,matched:160,current:255,current_bg:20
Weitere Details findest du in der Manpage (man sk).
--ansi: zum Parsen von ANSI-Farbcodes (z. B. \e[32mABC) der Datenquelle--regex: die Abfrage als regulären Ausdruck verwenden, um die Datenquelle abzugleichenIm interaktiven Modus kannst du einen Befehl dynamisch aufrufen. Probier es aus:```sh sk --ansi -i -c 'rg --color=always --line-number {q}'
### Wie funktioniert es?

- Skim akzeptiert zwei Arten von Quellen: Befehlsausgabe oder gepipte Eingabe
- Skim hat zwei Arten von Eingabeaufforderungen: Eine Abfrageaufforderung zur Angabe des Abfragemusters und eine
Befehlsaufforderung zur Angabe der „Argumente“ des Befehls
- `-c` wird verwendet, um den auszuführenden Befehl anzugeben und standardmäßig auf `SKIM_DEFAULT_COMMAND` gesetzt
- `-i` weist Skim an, die Befehlsaufforderung beim Start zu öffnen, die standardmäßig `c>` anzeigt.
Um die vom Befehl zurückgegebenen Ergebnisse weiter einzugrenzen, drücken Sie
`Ctrl-Q`, um den interaktiven Modus umzuschalten.
## Ausführen externer Programme
Sie können Tastenkombinationen konfigurieren, um externe Prozesse zu starten, ohne Skim zu verlassen (`execute`, `execute-silent`).```sh
# Press F1 to open the file with less without leaving skim
# Press CTRL-Y to copy the line to clipboard and aborts skim (requires pbcopy)
sk --bind 'f1:execute(less -f {}),ctrl-y:execute-silent(echo {} | pbcopy)+abort'
Skim bietet mehrere Algorithmen an; eine vollständige Liste findest du in der Hilfe oder der Manpage. Darunter sind:
skim_v2, der Standardalgorithmus, lose basierend auf dem Algorithmus von fzffrizbee, verwendet frizbee, den tippfehlerresistenten Algorithmus aus dem blink.cmp Neovim-Plugin (nur x86_64 und aarch64)fzy, basierend auf dem Algorithmus von fzy, erweitert um grundlegende Tippfehlerresistenzarinae, der neueste Algorithmus von skim, intern entwickelt mit Fokus auf Tippfehlerresistenz, der alle oben genannten erweitert, um tippfehlerresistentes Matching natürlicher wirken zu lassen, während die Leistung pro Eintrag auf höchstem Niveau bleibtDies ist eine großartige Funktion von fzf, die sich skim zunutze macht. Beispielsweise verwenden wir 'ag', um
die übereinstimmenden Zeilen zu finden, und sobald wir die Zielzeilen eingegrenzt haben, möchten wir
letztendlich entscheiden, welche Zeilen wir auswählen, indem wir den Kontext um die Zeile prüfen.
grep und ag haben die Option --context, und skim kann --context für
ein besseres Vorschaufenster nutzen. Zum Beispiel:```sh
sk --ansi -i -c 'ag --color {q}' --preview "preview.sh {}"
(Beachten Sie, dass [preview.sh](https://github.com/junegunn/fzf.vim/blob/master/bin/preview.sh) ein Skript ist, das den Kontext anhand von Dateiname:Zeilen:Spalten ausgibt)
Sie erhalten dann Folgendes:

### Wie funktioniert das?
Wenn der Vorschau-Befehl über die Option `--preview` angegeben wird, ersetzt skim das
`{}` durch die aktuell hervorgehobene Zeile, die in einfache Anführungszeichen gesetzt wird, ruft den
Befehl auf, um die Ausgabe zu erhalten, und zeigt die Ausgabe im Vorschaufenster an.
Manchmal benötigen Sie nicht die gesamte Zeile, um den Befehl auszuführen. In diesem Fall
können Sie `{}`, `{1..}`, `{..3}` oder `{1..5}` verwenden, um die Felder auszuwählen. Die
Syntax wird im Abschnitt [Feldunterstützung](#filds-support) erläutert.
Schließlich möchten Sie möglicherweise die Position des Vorschaufensters mit `--preview-window` konfigurieren:
- `--preview-window up:30%`, um das Fenster oben mit einer Höhe von
30 % der Gesamthöhe von skim zu platzieren.
- `--preview-window left:10:wrap`, um anzugeben, dass `wrap` es dem Vorschaufenster
ermöglicht, die Ausgabe des Vorschau-Befehls umzubrechen.
- `--preview-window wrap:hidden`, um das Vorschaufenster beim Start auszublenden; später
kann es durch die Aktion `toggle-preview` angezeigt werden.
## Feldunterstützung
Normalerweise müssen nur Plugin-Benutzer dies verstehen.
Sie haben beispielsweise die Datenquelle mit dem Format:```sh
<filename>:<line number>:<column number>
Allerdings möchtest du <filename> nur durchsuchen, wenn du Suchbegriffe eingibst. Das bedeutet, wenn du 21 eingibst, möchtest du ein <filename> finden, das 21 enthält, aber nicht die Zeilennummer oder Spaltennummer abgleichen.
Du kannst sk --delimiter ':' --nth 1 verwenden, um dies zu erreichen.
Du kannst auch --with-nth verwenden, um die Reihenfolge der Felder neu anzuordnen.
Bereichssyntax
<num> -- um das num-te Feld anzugeben, beginnend mit 1.start.. -- beginnend mit dem start-ten Feld und dem Rest...end -- beginnend mit dem 0-ten Feld, bis zum end-ten Feld,
einschließlich end.start..end -- beginnend mit dem start-ten Feld, bis zum end-ten
Feld, einschließlich end.Skim kann als Bibliothek in deinen Rust-Crates verwendet werden.
Füge zuerst skim zu deiner Cargo.toml hinzu:```toml
[dependencies]
skim = { version = "", default-features = false, features = [..] }
_Hinweis zu Features_:
- das `cli`-Feature ist erforderlich, um skim als CLI zu verwenden; es *sollte* nicht benötigt werden, wenn es als Bibliothek verwendet wird.
### Grundlegende Verwendung
Versuchen Sie dann, dieses einfache Beispiel auszuführen:```rust
extern crate skim;
use skim::prelude::*;
use std::io::Cursor;
pub fn main() {
let options = SkimOptionsBuilder::default()
.height("50%")
.multi(true)
.build()
.unwrap();
let input = "aaaaa\nbbbb\nccc".to_string();
// `SkimItemReader` is a helper to turn any `BufRead` into a stream of `SkimItem`
// `SkimItem` was implemented for `AsRef<str>` by default
let item_reader = SkimItemReader::default();
let items = item_reader.of_bufread(Cursor::new(input));
// `run_with` would read and show items from the stream
let selected_items = Skim::run_with(&options, Some(items))
.map(|out| out.selected_items)
.unwrap_or_else(|| Vec::new());
for item in selected_items.iter() {
println!("{}", item.output());
}
}
Sie können skim auch feingranular als Bibliothek mit tokio und asynchronem Code nutzen, um dynamisch mit
Bei einem Option<SkimItemReceiver> liest skim die Einträge entsprechend, erledigt seine
Aufgabe und liefert uns die Benutzerauswahl zurück, einschließlich der ausgewählten Einträge, der
Abfrage usw. Beachten Sie, dass:
SkimItemReceiver ist crossbeam::channel::Receiver<Arc<dyn SkimItem>>none ist, wird der angegebene Befehl aufgerufen und die Einträge aus der Befehlsausgabe gelesenDas Trait SkimItem wird bereitgestellt, um anzupassen, wie eine Zeile angezeigt,
verglichen und in der Vorschau dargestellt werden kann. Es ist standardmäßig für AsRef<str> implementiert.
Außerdem ist SkimItemReader ein Helfer, um ein BufRead in
SkimItemReceiver umzuwandeln (wir können eine File oder String leicht in BufRead umwandeln),
sodass Sie problemlos mit Zeichenketten oder Dateien arbeiten können.
Weitere Beispiele finden Sie im Verzeichnis examples/.
Dieser Benchmark führt die interaktive Oberfläche in einer tmux-Sitzung aus und wartet darauf, dass sich die Benutzeroberfläche stabilisiert.

Sie können die Diagramme mit just bench-plot erzeugen oder das Rezept manuell in GNU bash ausführen.
Skim ruft find . auf, um eine Liste von Dateien zum Filtern abzurufen. Sie können dies
überschreiben, indem Sie die Umgebungsvariable SKIM_DEFAULT_COMMAND setzen. Zum Beispiel:```sh
$ SKIM_DEFAULT_COMMAND="fd --type f || git ls-tree -r --name-only HEAD || rg --files || find ."
$ sk
Du kannst es in deine `.bashrc` oder `.zshrc` einfügen, wenn du möchtest, dass es standardmäßig verwendet wird.
## Einige Dateien werden im Vim-Plugin nicht angezeigt
Wenn du das Vim-Plugin verwendest und den Befehl `:SK` ausführst, kann es sein, dass einige
deiner Dateien nicht angezeigt werden.
Wie in [#3](https://github.com/skim-rs/skim/issues/3) beschrieben, wird im Vim-
Plugin `SKIM_DEFAULT_COMMAND` standardmäßig auf den Befehl gesetzt:```vim
let $SKIM_DEFAULT_COMMAND = "git ls-tree -r --name-only HEAD || rg --files || ag -l -g \"\" || find ."
Dies bedeutet, dass Dateien, die von git nicht erkannt werden, nicht angezeigt werden. Du kannst entweder den
Standardwert mit let $SKIM_DEFAULT_COMMAND = '' überschreiben oder die fehlenden Dateien
selbst finden.
fzf ist ein Fuzzy-Finder für die Kommandozeile, geschrieben in Go, und skim versucht, einen neuen in Rust zu implementieren!
Dieses Projekt wurde von Grund auf neu geschrieben. Einige Implementierungsentscheidungen unterscheiden sich von fzf. Zum Beispiel:
skim hat einen interaktiven Modus.skim unterstützt Vorauswahl.Allgemeiner gesagt erlauben sich die Maintainer von skim etwas Freiheit bei der Umsetzung.
Das Ziel ist es, skim genauso funktionsreich zu halten wie fzf, aber die Befehlsflags können sich unterscheiden.
Erstelle neue Issues, wenn du auf Fehler stößt oder Ideen hast. Pull Requests sind herzlich willkommen.
Eine Vagrantfile ist enthalten, um eine headless Windows Server 2022 Core VM für Tests
der Windows-Kompatibilität ohne GUI zu starten. Es erfordert VirtualBox
und Vagrant auf deinem Host (vagrant ist in der Nix-Dev-
Shell über flake.nix enthalten).```sh
vagrant up # First boot: downloads the box and provisions (~15–20 min)
ssh -p 2222 vagrant@localhost # Password: vagrant
Innerhalb der VM ist das Projektverzeichnis unter `C:\vagrant` eingebunden:```powershell
cd C:\vagrant
cargo build
cargo test
Nachfolgende Starts sind schnell — die Bereitstellung läuft nur einmal:```sh vagrant halt # Stop the VM vagrant up # Resume vagrant destroy # Delete the VM entirely
# Fehlerbehebung
Um zu diagnostizieren, was passiert, können Sie die Umgebungsvariable `SKIM_LOG` oder das Flag `--log-level` auf `debug` oder sogar `trace` setzen und die Umgebungsvariable `SKIM_LOG_FILE` oder das Flag `--log-file` auf einen Pfad setzen. Sie können diese Protokolle dann während oder nach der Ausführung lesen, um besser zu verstehen, was passiert. Zögern Sie nicht, diese Protokolle zu einem Issue hinzuzufügen, wenn Sie Hilfe benötigen.
## Probleme mit Zeilenumbrüchen bei nix, FreeBSD, termux
Wenn Sie Anzeigeprobleme wie diese feststellen:```bash
$ for n in {1..10}; do echo "$n"; done | sk
0/10 0/0.> 10/10 10 9 8 7 6 5 4 3 2> 1
Zum Beispiel
Du musst TERMINFO oder TERMINFO_DIRS auf den Pfad einer korrekten Terminfo-Datenbank setzen
Zum Beispiel kannst du mit Termux Folgendes in deiner bashrc hinzufügen:``` export TERMINFO=/data/data/com.termux/files/usr/share/terminfo
# Benchmarks
## Interaktiver Benchmark (`cli`)
Der `cli`-Benchmark testet skim (oder eine beliebige kompatible Binärdatei) gegen andere Versionen oder fzf, indem er die interaktive Oberfläche in einer tmux-Sitzung ausführt und die Statuszeile abfragt, bis die Anzahl der Treffer stabil bleibt. Dies ist keineswegs eine präzise oder narrensichere Messung, hat aber den zusätzlichen Vorteil, dass er gegen `fzf` benchmarkt und Ressourcenmetriken (Spitzen-RSS und CPU) liefert.```sh
cargo bench --bench cli -- run # defaults: sk, 1 M items, query "test"
cargo bench --bench cli -- run sk -n 500000 -q foo # bare name resolved via $PATH
cargo bench --bench cli -- run ./old/sk ./new/sk -r 5 # compare two binaries, 5 runs each
cargo bench --bench cli -- run sk -f input.txt -q search # use an existing file
cargo bench --bench cli -- generate -f testdata.txt -n 2000000 # generate input file and exit
cargo bench --bench cli -- run sk --perf # record perf data (auto-named file)
cargo bench --bench cli -- run sk --strace # record strace data (auto-named file)
cargo bench --bench cli -- run sk -p perf.data # record perf data to perf.data
cargo bench --bench cli -- run sk -j # JSON output
cargo bench --bench cli -- run sk -r 3 -- --tiebreak=index # pass extra flags to sk
Binärnamen werden vor der Verwendung über which zu absoluten Pfaden aufgelöst, sodass einfache Namen wie sk oder fzf funktionieren, solange sie sich auf $PATH befinden.
Criterion-Benchmarks sind verfügbar, um die Leistung von skim genauer zu messen.
Um sie auszuführen, müssen Sie zunächst Eingabedaten mit cargo bench --bench cli -- -g benches/fixtures/10M.txt -n 10000000 && cargo bench --bench cli -- -g benches/fixtures/1M.txt -n 1000000 generieren und dann cargo bench -j 1 ausführen.
Diese laufen mehrere Minuten lang.