
सुरक्षा-अनुसंधान प्रयोगशाला जो CVE-2026-41414 (`.github/workflows/pr.yml` में pull_request_target pwn) को पुनरुत्पादित करती है — skim-rs/skim @ ca986f4 का स्नैपशॉट, फोर्क नहीं।
स्वचालित शोध कलाकृति — अपस्ट्रीम प्रोजेक्ट नहीं।
यह रिपॉजिटरी Université Laval में मास्टर की थीसिस के लिए एक स्वचालित हार्नेस द्वारा निर्मित एक डिस्पोजेबल लैब है, जो प्रकाशित GitHub Actions वर्कफ़्लो कमजोरियों को पुन: प्रस्तुत करने पर केंद्रित है। यह
skim-rs/skimका कमिटca986f444c37d2c1dc15ce1fad2fe101776af8d9(2026-04-14) पर एक शब्दशः स्नैपशॉट है, जो उस प्रोजेक्ट के अपने लाइसेंस के तहत पुनर्वितरित किया गया है, जिसकी फ़ाइल इस स्नैपशॉट में अपरिवर्तित शामिल है।अपस्ट्रीम प्रोजेक्ट शामिल नहीं है, उसे कभी लक्षित नहीं किया जाता है, और यहाँ अध्ययन की गई कमजोरी पहले से ही सार्वजनिक है। इस रिपॉजिटरी में हर सीक्रेट और वेरिएबल एक यादृच्छिक रूप से उत्पन्न डमी मान है — कोई वास्तविक क्रेडेंशियल मौजूद नहीं है। एक्शन संदर्भ और रनर इमेज 2026-04-14 पर उनके हल किए गए मानों पर पिन किए गए हैं; स्नैपशॉट में किए गए हर बदलाव के लिए हार्नेस आउटपुट में
pinning.mdदेखें।प्रश्न या आपत्तियाँ: [email protected]
जीवन छोटा है, skim करें!
हम अपना बहुत सारा समय फ़ाइलों, पंक्तियों और कमांड्स के बीच नेविगेट करने में बिताते हैं। यहीं पर Skim काम आता है! यह एक शक्तिशाली फ़ज़ी फाइंडर है जो आपके वर्कफ़्लो को तेज़ और अधिक कुशल बनाने के लिए डिज़ाइन किया गया है।
Skim एक एकल निष्पादन योग्य प्रदान करता है जिसे sk कहा जाता है। इसे grep जैसे टूल्स के एक स्मार्ट विकल्प के रूप में सोचें - एक बार आज़माने के बाद, आप सोचेंगे कि आप इसके बिना कैसे रहते थे!
skim प्रोजेक्ट में कई घटक शामिल हैं:
sk निष्पादन योग्य - मुख्य प्रोग्रामsk को कॉल करने के लिए। Vim समर्थन के लिए skim.vim देखें।| OS | पैकेज मैनेजर | कमांड |
|---|---|---|
| macOS | Homebrew | brew install sk |
| macOS | MacPorts | sudo port install skim |
| Alpine | apk | apk add skim |
| Arch | pacman | pacman -S skim |
| Fedora | COPR | नीचे देखें |
| Gentoo | Portage | emerge --ask app-misc/skim |
| Guix | guix | guix install skim |
| Void | XBPS | xbps-install -S skim |
अद्यतित Fedora पैकेज एक अनौपचारिक समुदाय-अनुरक्षित COPR रिपॉजिटरी के माध्यम से प्रदान किए जाते हैं।```bash sudo dnf copr enable sisyphus1813/skim sudo dnf install skim
## मैन्युअल रूप से
निम्नलिखित में से कोई भी लागू होता है:
- इंस्टॉल स्क्रिप्ट का उपयोग करके:
```sh
# चलाने से पहले हमेशा स्क्रिप्ट की सामग्री जांचें!
$ curl --proto '=https' --tlsv1.2 -LsSf https://github.com/skim-rs/skim/releases/latest/download/skim-installer.sh | sh
```
- बाइनरी का उपयोग करके: बस [sk एक्ज़ीक्यूटेबल डाउनलोड करें](https://github.com/skim-rs/skim/releases) सीधे।
- [crates.io](https://crates.io/) से इंस्टॉल करें: `cargo install skim`
- मैन्युअल रूप से बिल्ड करें:
```sh
$ git clone --depth 1 [email protected]:skim-rs/skim.git ~/.skim
$ cd ~/.skim
$ cargo build --release
$ # परिणामी `target/release/sk` एक्ज़ीक्यूटेबल को अपने PATH में जोड़ें
```
फिर आपके पास निम्न तक पहुंच होगी:
- मैन पेज, जिसे आप या तो सही पथ पर लिख सकते हैं या `man --local-file <(sk --man)` चला सकते हैं
- शेल कम्प्लीशन (और वैकल्पिक कीबाइंड्स), `source <(sk --shell \<shell> \[--shell-bindings])` का उपयोग करके, विवरण के लिए नीचे देखें
# उपयोग
Skim का उपयोग या तो एक सामान्य फ़िल्टर के रूप में (`grep` के समान) या कमांड चलाने के लिए एक इंटरैक्टिव
इंटरफ़ेस के रूप में किया जा सकता है।
## Vim प्लगइन के रूप में (neovim पर, [fzf-lua](https://github.com/ibhagwan/fzf-lua) को skim प्रोफ़ाइल के साथ देखें)
vim-plug के माध्यम से (अनुशंसित):
skim इंस्टॉल करें, फिर:```vim
Plug 'skim-rs/skim'
शुरुआत करने के लिए कुछ उदाहरण यहाँ दिए गए हैं:```bash
sk
vim $(find . -name "*.rs" | sk -m)
यह अंतिम कमांड आपको ".rs" एक्सटेंशन वाली फ़ाइलें चुनने देता है और आपके
चयन को Vim में खोलता है - डेवलपर्स के लिए एक बड़ा समय-बचतकर्ता!
## इंटरैक्टिव इंटरफ़ेस के रूप में
`skim` अन्य कमांड्स को गतिशील रूप से आमंत्रित कर सकता है। सामान्यतः आप इसे
किसी प्रोजेक्ट डायरेक्टरी में सामग्री खोजने के लिए
[grep](https://www.gnu.org/software/grep/),
[ack](https://github.com/petdance/ack2),
[ag](https://github.com/ggreer/the_silver_searcher), या
[rg](https://github.com/BurntSushi/ripgrep) के साथ एकीकृत करना चाहेंगे:```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}'
नोट: इन उदाहरणों में,
{q}को वर्तमान इनपुट क्वेरी (सिंगल कोट्स में लिपटा हुआ) में शाब्दिक रूप से विस्तारित किया जाएगा। इसका मतलब है कि ये उदाहरण सटीक क्वेरी स्ट्रिंग खोजेंगे, फ़ज़ी रूप से नहीं। फ़ज़ी खोज के लिए, कमांड आउटपुट को इंटरैक्टिव मोड का उपयोग किए बिनाskमें पाइप करें।

Fish, Bash और Zsh के लिए बाइंडिंग्स shell निर्देशिका में उपलब्ध हैं:
completion.{shell} में sk cli उपयोग के लिए कम्प्लीशन स्क्रिप्ट्स शामिल हैंkey-bindings.{shell} में की-बाइंड्स और शेल इंटीग्रेशन शामिल हैं:
sk के माध्यम से फ़ाइल चुनने के लिए ctrl-tsk के माध्यम से इतिहास प्रविष्टि चुनने के लिए ctrl-rsk के माध्यम से चुनी गई निर्देशिका में cd करने के लिए alt-cfish में उपलब्ध नहीं) फ़ाइल पथ पूर्ण करने के लिए **, उदाहरण के लिए ls **<tab> एक फ़ोल्डर चुनने के लिए sk विजेट दिखाएगाइन सुविधाओं को सक्षम करने के लिए, key-bindings.{shell} फ़ाइल को सोर्स करें और अपने शेल के दस्तावेज़ीकरण के अनुसार कम्प्लीशन सेट करें या नीचे देखें।
आप समर्थित शेल्स में से एक के साथ --shell फ़्लैग का उपयोग करके अपने पसंदीदा शेल के लिए शेल कम्प्लीशन उत्पन्न कर सकते हैं: bash, zsh, fish, powershell, या elvish:
source <(sk --shell bash)
source <(sk --shell zsh)
sk --shell fish | source
#### विकल्प 2: शेल स्टार्टअप पर स्वचालित रूप से लोड होने के लिए फ़ाइल में सहेजें```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
कुछ सामान्यतः उपयोग की जाने वाली की-बाइंडिंग्स:
| Key | Action |
|---|---|
| Enter | स्वीकार करें (वर्तमान चुनें और बाहर निकलें) |
| ESC/Ctrl-G | रद्द करें |
| Ctrl-P/Up | कर्सर ऊपर ले जाएँ |
| Ctrl-N/Down | कर्सर नीचे ले जाएँ |
| TAB | चयन टॉगल करें और नीचे जाएँ (-m के साथ) |
| Shift-TAB | चयन टॉगल करें और ऊपर जाएँ (-m के साथ) |
की-बाइंडिंग्स की पूरी सूची के लिए, man
पेज (man sk) देखें।
skim मिलान आइटम्स के लिए fzf का सिंटैक्स उधार लेता है:
| Token | Match type | Description |
|---|---|---|
text | fuzzy-match | आइटम जो text से मेल खाते हैं |
^music | prefix-exact-match | आइटम जो music से शुरू होते हैं |
.mp3$ | suffix-exact-match | आइटम जो .mp3 पर समाप्त होते हैं |
'wild | exact-match (quoted) | आइटम जिनमें wild शामिल है |
!fire | inverse-exact-match | आइटम जिनमें fire शामिल नहीं है |
!.mp3$ | inverse-suffix-exact-match | आइटम जो .mp3 पर समाप्त नहीं होते |
skim टोकन्स के संयोजन का भी समर्थन करता है।
व्हाइटस्पेस का अर्थ AND है। टर्म src main के साथ, skim उन आइटम्स को खोजेगा
जो दोनों src और main से मेल खाते हैं।
| का अर्थ OR है (| के आसपास स्पेस पर ध्यान दें)। टर्म .md$ | .markdown$ के साथ, skim उन आइटम्स को खोजेगा जो .md या
.markdown में से किसी एक पर समाप्त होते हैं।
OR की प्राथमिकता अधिक है। उदाहरण के लिए, readme .md$ | .markdown$ की व्याख्या इस प्रकार की जाती है:
readme AND (.md$ OR .markdown$)।
--split-match विकल्प का उपयोग करते समय, स्पेस या | के आसपास का प्रत्येक भाग विभाजित तरीके से मेल खाएगा:
:) क्वेरी में अनुपस्थित है, तो सामान्य मिलान करेंrg से इनपुट पाइप करके फ़ाइल नाम और सामग्री दोनों पर मिलान किया जाए।यदि आप नियमित अभिव्यक्तियों का उपयोग करना पसंद करते हैं, तो skim एक regex मोड प्रदान करता है:```sh
sk --regex
आप `Ctrl-R` (Rotate Mode) दबाकर डायनामिक रूप से `regex` मोड पर स्विच कर सकते हैं।
## exit code
| Exit Code | Meaning |
|-----------|-------------------------------------|
| 0 | Exited normally |
| 1 | No Match found |
| 130 | Aborted by Ctrl-C/Ctrl-G/ESC/etc... |
# `skim` के साथ संगत उपकरण
ये उपकरण `skim` के साथ संगत हैं या होने का लक्ष्य रखते हैं:
## [fzf-lua neovim plugin](https://github.com/ibhagwan/fzf-lua)
एक [neovim](https://neovim.io) प्लगइन जो fzf और skim को आपके कोड को नेविगेट करने के लिए उपयोग करने की अनुमति देता है।
इसे अपने पैकेज मैनेजर के साथ, README का पालन करते हुए इंस्टॉल करें। उदाहरण के लिए, `lazy.nvim` के साथ:```lua
{
"ibhagwan/fzf-lua",
-- enable `sk` support instead of the default `fzf`
opts = {'skim'}
}
एक nushell प्लगइन जो skim और nushell के बीच बेहतर इंटरैक्शन की अनुमति देता है।
प्लगइन के README में दिए गए निर्देशों का पालन करते हुए, आप इसे cargo के साथ इंस्टॉल कर सकते हैं:```nu cargo install nu_plugin_skim plugin add ~/.cargo/bin/nu_plugin_skim
## [sqlite एक्सटेंशन](https://github.com/tzachar/sqlite_skim)
एक `sqlite` लोड करने योग्य मॉड्यूल जो SQL क्वेरी में `skim_score` फ़ंक्शन को सक्षम करता है।
# अनुकूलन
यहाँ दिया गया दस्तावेज़ केवल एक पूर्वावलोकन है, विकल्पों की पूरी सूची के लिए कृपया मैन पेज (`man sk`) देखें।
## कीमैप
बाइंडिंग को कॉमा से अलग किए गए जोड़ों के रूप में निर्दिष्ट करें (कोई स्पेस की अनुमति नहीं)। उदाहरण के लिए:```sh
sk --bind 'alt-a:select-all,alt-d:deselect-all'
इसके अलावा, क्रियाओं को जोड़ने के लिए + का उपयोग करें, जैसे execute-silent(echo {} | pbcopy)+abort।
विवरण के लिए man पेज का KEY BINDINGS अनुभाग देखें।
परिणामों के लिए पाँच सॉर्ट कुंजियाँ हैं: score, index, begin, end, length। आप
sk --tiebreak score,index,-begin या अपनी पसंद के किसी अन्य क्रम द्वारा रिकॉर्ड्स को सॉर्ट करने का तरीका निर्दिष्ट कर सकते हैं।
आपके पास शायद अपनी खुद की सौंदर्य संबंधी प्राथमिकताएँ हैं! सौभाग्य से, आप डिफ़ॉल्ट रूप तक सीमित नहीं हैं - Skim अपनी रंग योजना के व्यापक अनुकूलन का समर्थन करता है।```sh --color=[BASE_SCHEME][,COLOR:ANSI]
Skim `NO_COLOR` पर्यावरण चर का भी सम्मान करता है। इसे किसी भी मान पर सेट करें और `sk` (और कई अन्य टर्मिनल ऐप्स) सभी रंगीन आउटपुट अक्षम कर देंगे। अधिक विवरण के लिए [no-color.org](https://no-color.org/) देखें।
### उपलब्ध आधार रंग योजनाएँ
Skim कई अंतर्निहित रंग योजनाओं के साथ आता है जिन्हें आप शुरुआती बिंदु के रूप में उपयोग कर सकते हैं:```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)
आप बेस स्कीम के बाद रंग मान निर्दिष्ट करके व्यक्तिगत UI तत्वों को अनुकूलित कर सकते हैं:```sh sk --color=light,fg:232,bg:255,current_bg:116,info:27
रंगों को कई तरीकों से निर्दिष्ट किया जा सकता है:
- ANSI रंग (0-255): `sk --color=fg:232,bg:255`
- RGB हेक्स मान: `sk --color=fg:#FF0000` (लाल टेक्स्ट)
### उपलब्ध रंग अनुकूलन विकल्प
निम्नलिखित UI तत्वों को अनुकूलित किया जा सकता है:
| Element | Description | Example |
|--------------------|---------------------------------------------|--------------------------------|
| `fg` | सामान्य टेक्स्ट अग्रभूमि रंग | `--color=fg:232` |
| `bg` | सामान्य टेक्स्ट पृष्ठभूमि रंग | `--color=bg:255` |
| `matched` | खोज परिणामों में मिलान किया गया टेक्स्ट | `--color=matched:108` |
| `matched_bg` | मिलान किए गए टेक्स्ट की पृष्ठभूमि | `--color=matched_bg:0` |
| `current` | वर्तमान पंक्ति अग्रभूमि रंग | `--color=current:254` |
| `current_bg` | वर्तमान पंक्ति पृष्ठभूमि रंग | `--color=current_bg:236` |
| `current_match` | वर्तमान पंक्ति में मिलान किया गया टेक्स्ट | `--color=current_match:151` |
| `current_match_bg` | वर्तमान पंक्ति में मिलान किए गए टेक्स्ट की पृष्ठभूमि | `--color=current_match_bg:236` |
| `spinner` | प्रगति संकेतक रंग | `--color=spinner:148` |
| `info` | सूचना पंक्ति रंग | `--color=info:144` |
| `prompt` | प्रॉम्प्ट रंग | `--color=prompt:110` |
| `cursor` | कर्सर रंग | `--color=cursor:161` |
| `selected` | चयनित आइटम मार्कर रंग | `--color=selected:168` |
| `header` | हेडर टेक्स्ट रंग | `--color=header:109` |
| `border` | पूर्वावलोकन/लेआउट के लिए बॉर्डर रंग | `--color=border:59` |
### उदाहरण```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
अधिक विवरण के लिए, मैन पेज देखें (man sk)।
--ansi: डेटा स्रोत के ANSI रंग कोड (जैसे, \e[32mABC) को पार्स करने के लिए--regex: डेटा स्रोत से मिलान करने के लिए क्वेरी को नियमित अभिव्यक्ति के रूप में उपयोग करेंइंटरैक्टिव मोड में, आप गतिशील रूप से एक कमांड लागू कर सकते हैं। इसे आज़माएँ:```sh sk --ansi -i -c 'rg --color=always --line-number {q}'
### यह कैसे काम करता है?

- Skim दो प्रकार के स्रोत स्वीकार करता है: कमांड आउटपुट या पाइप किया गया इनपुट
- Skim में दो प्रकार के प्रॉम्प्ट होते हैं: क्वेरी पैटर्न निर्दिष्ट करने के लिए एक क्वेरी प्रॉम्प्ट और
कमांड के "आर्ग्युमेंट्स" निर्दिष्ट करने के लिए एक कमांड प्रॉम्प्ट
- `-c` का उपयोग निष्पादित करने के लिए कमांड निर्दिष्ट करने हेतु किया जाता है और यह डिफ़ॉल्ट रूप से `SKIM_DEFAULT_COMMAND` पर सेट होता है
- `-i` skim को स्टार्टअप पर कमांड प्रॉम्प्ट खोलने के लिए कहता है, जो डिफ़ॉल्ट रूप से `c>` दिखाएगा।
कमांड द्वारा लौटाए गए परिणामों को और अधिक सीमित करने के लिए, इंटरैक्टिव मोड को टॉगल करने हेतु
`Ctrl-Q` दबाएँ।
## बाहरी प्रोग्राम निष्पादित करना
आप Skim से बाहर निकले बिना बाहरी प्रक्रियाएँ शुरू करने के लिए की बाइंडिंग कॉन्फ़िगर कर सकते हैं (`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 कई एल्गोरिदम प्रदान करता है, पूरी सूची के लिए help या manpage देखें। इनमें शामिल हैं:
skim_v2, डिफ़ॉल्ट एल्गोरिदम, मोटे तौर पर fzf के एल्गोरिदम पर आधारितfrizbee, frizbee का उपयोग करता है, जो blink.cmp neovim प्लगइन का टाइपो-प्रतिरोधी एल्गोरिदम है (केवल x86_64 और aarch64)fzy, fzy के एल्गोरिदम पर आधारित, जिसे बुनियादी टाइपो-प्रतिरोध के लिए विस्तारित किया गया हैarinae, skim का सबसे नया एल्गोरिदम, जिसे इन-हाउस टाइपो-प्रतिरोध को ध्यान में रखकर डिज़ाइन किया गया है, उपरोक्त सभी का विस्तार करते हुए टाइपो-प्रतिरोधी मिलान को अधिक स्वाभाविक बनाता है, साथ ही प्रति-आइटम प्रदर्शन को सर्वोत्तम मानकों तक बनाए रखता हैयह fzf की एक बेहतरीन विशेषता है जिसे skim ने अपनाया है। उदाहरण के लिए, हम मिलान की गई पंक्तियों को खोजने के लिए 'ag' का उपयोग करते हैं, और एक बार जब हम लक्ष्य पंक्तियों तक सीमित हो जाते हैं, तो हम पंक्ति के आसपास के संदर्भ की जाँच करके अंततः यह तय करना चाहते हैं कि कौन सी पंक्तियाँ चुननी हैं।
grep और ag में --context विकल्प होता है, और skim बेहतर प्रीव्यू विंडो के लिए --context का उपयोग कर सकता है। उदाहरण के लिए:```sh
sk --ansi -i -c 'ag --color {q}' --preview "preview.sh {}"
(ध्यान दें कि [preview.sh](https://github.com/junegunn/fzf.vim/blob/master/bin/preview.sh) एक स्क्रिप्ट है जो filename:lines:columns दिए जाने पर संदर्भ प्रिंट करती है)
आपको ऐसी चीज़ें मिलती हैं:

### यह कैसे काम करता है?
यदि preview कमांड `--preview` विकल्प द्वारा दी गई है, तो skim `{}` को वर्तमान हाइलाइट की गई पंक्ति से बदल देगा, जो single quotes से घिरी होती है, कमांड को कॉल करके आउटपुट प्राप्त करता है, और आउटपुट को preview विंडो पर प्रिंट करता है।
कभी-कभी आपको कमांड को लागू करने के लिए पूरी पंक्ति की आवश्यकता नहीं होती है। इस मामले में आप फ़ील्ड चुनने के लिए `{}`, `{1..}`, `{..3}` या `{1..5}` का उपयोग कर सकते हैं। सिंटैक्स को [Fields Support](#filds-support) अनुभाग में समझाया गया है।
अंत में, आप `--preview-window` के साथ preview विंडो की स्थिति कॉन्फ़िगर करना चाह सकते हैं:
- `--preview-window up:30%` विंडो को ऊपर की स्थिति में रखने के लिए, जिसकी ऊँचाई skim की कुल ऊँचाई का 30% हो।
- `--preview-window left:10:wrap` यह निर्दिष्ट करने के लिए कि `wrap` preview विंडो को preview कमांड के आउटपुट को लपेटने की अनुमति देता है।
- `--preview-window wrap:hidden` स्टार्टअप पर preview विंडो को छिपाने के लिए, बाद में इसे `toggle-preview` एक्शन द्वारा दिखाया जा सकता है।
## Fields support
सामान्यतः केवल प्लगइन उपयोगकर्ताओं को इसे समझने की आवश्यकता होती है।
उदाहरण के लिए, आपके पास निम्न प्रारूप वाला डेटा स्रोत है:```sh
<filename>:<line number>:<column number>
हालाँकि, आप <filename> को केवल तब खोजना चाहते हैं जब आप क्वेरी में टाइप कर रहे हों। इसका
मतलब है कि जब आप 21 टाइप करते हैं, तो आप एक ऐसा <filename> खोजना चाहते हैं जिसमें 21
हो, लेकिन लाइन नंबर या कॉलम नंबर से मेल न खाए।
आप इसे प्राप्त करने के लिए sk --delimiter ':' --nth 1 का उपयोग कर सकते हैं।
आप फ़ील्ड के क्रम को पुनर्व्यवस्थित करने के लिए --with-nth का भी उपयोग कर सकते हैं।
रेंज सिंटैक्स
<num> -- num-वें फ़ील्ड को निर्दिष्ट करने के लिए, 1 से शुरू करते हुए।start.. -- start-वें फ़ील्ड से शुरू करके बाकी सभी फ़ील्ड।..end -- 0-वें फ़ील्ड से शुरू करके end-वें फ़ील्ड तक,
end को शामिल करते हुए।start..end -- start-वें फ़ील्ड से शुरू करके end-वें
फ़ील्ड तक, end को शामिल करते हुए।Skim का उपयोग आपके Rust क्रेट्स में एक लाइब्रेरी के रूप में किया जा सकता है।
सबसे पहले, अपने Cargo.toml में skim जोड़ें:```toml
[dependencies]
skim = { version = "", default-features = false, features = [..] }
_सुविधाओं पर नोट_:
- `cli` सुविधा skim को क्ली के रूप में उपयोग करने के लिए आवश्यक है, इसे लाइब्रेरी के रूप में उपयोग करते समय *आवश्यक नहीं* होना चाहिए।
### बुनियादी उपयोग
फिर इस सरल उदाहरण को चलाने का प्रयास करें:```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());
}
}
आप tokio और async कोड का उपयोग करके skim को एक लाइब्रेरी के रूप में भी सूक्ष्म रूप से उपयोग कर सकते हैं, जिससे आप गतिशील रूप से इंटरैक्ट कर सकते हैं
एक Option<SkimItemReceiver> दिए जाने पर, skim तदनुसार आइटम पढ़ेगा, अपना कार्य करेगा और हमें उपयोगकर्ता का चयन वापस लाएगा, जिसमें चयनित आइटम, क्वेरी आदि शामिल होंगे। ध्यान दें कि:
SkimItemReceiver एक crossbeam::channel::Receiver<Arc<dyn SkimItem>> हैट्रेट SkimItem यह अनुकूलित करने के लिए प्रदान किया गया है कि एक पंक्ति को कैसे प्रदर्शित, तुलना और पूर्वावलोकन किया जा सकता है। यह डिफ़ॉल्ट रूप से AsRef<str> के लिए लागू किया गया है
इसके अलावा, SkimItemReader एक सहायक है जो BufRead को SkimItemReceiver में बदलने के लिए है (हम आसानी से File या String को BufRead में बदल सकते हैं), ताकि आप आसानी से स्ट्रिंग्स या फाइलों से निपट सकें।
examples/ निर्देशिका के अंतर्गत अधिक उदाहरण देखें।
यह बेंचमार्क इंटरैक्टिव इंटरफ़ेस को tmux सत्र में चलाता है, और UI के स्थिर होने की प्रतीक्षा करता है।

आप just bench-plot का उपयोग करके या GNU bash में रेसिपी को मैन्युअल रूप से चलाकर ग्राफ़ उत्पन्न कर सकते हैं।
Skim फ़िल्टरिंग के लिए फाइलों की सूची प्राप्त करने हेतु find . लागू करता है। आप पर्यावरण चर SKIM_DEFAULT_COMMAND सेट करके इसे ओवरराइड कर सकते हैं। उदाहरण के लिए:```sh
$ SKIM_DEFAULT_COMMAND="fd --type f || git ls-tree -r --name-only HEAD || rg --files || find ."
$ sk
आप इसे अपने `.bashrc` या `.zshrc` में रख सकते हैं यदि आप चाहते हैं कि यह डिफ़ॉल्ट हो।
## Vim प्लगइन में कुछ फ़ाइलें नहीं दिखाई जाती हैं
यदि आप Vim प्लगइन का उपयोग करते हैं और `:SK` कमांड चलाते हैं, तो आप पा सकते हैं कि आपकी
कुछ फ़ाइलें नहीं दिखाई जाती हैं।
जैसा कि [#3](https://github.com/skim-rs/skim/issues/3) में वर्णित है, Vim
प्लगइन में, `SKIM_DEFAULT_COMMAND` डिफ़ॉल्ट रूप से कमांड पर सेट होता है:```vim
let $SKIM_DEFAULT_COMMAND = "git ls-tree -r --name-only HEAD || rg --files || ag -l -g \"\" || find ."
इसका मतलब है कि git द्वारा पहचाने न जाने वाली फ़ाइलें नहीं दिखाई जाएँगी। आप या तो डिफ़ॉल्ट को let $SKIM_DEFAULT_COMMAND = '' से ओवरराइड कर सकते हैं या लापता फ़ाइलों को स्वयं खोज सकते हैं।
fzf एक कमांड-लाइन फ़ज़ी फाइंडर है जो Go में लिखा गया है और skim Rust में एक नया फ़ज़ी फाइंडर लागू करने का प्रयास करता है!
यह प्रोजेक्ट शुरू से लिखा गया है। कुछ कार्यान्वयन निर्णय fzf से भिन्न हैं। उदाहरण के लिए:
skim में एक इंटरैक्टिव मोड है।skim प्री-सेलेक्शन का समर्थन करता है।अधिक सामान्यतः, skim के अनुरक्षक स्वयं को कार्यान्वयन की कुछ स्वतंत्रता देते हैं। लक्ष्य skim को उतना ही फीचर-युक्त रखना है जितना fzf है, लेकिन कमांड फ़्लैग भिन्न हो सकते हैं।
यदि आपको कोई बग मिले या कोई विचार हो तो नई समस्याएँ बनाएँ। पुल रिक्वेस्ट का हार्दिक स्वागत है।
Windows संगतता का परीक्षण GUI की आवश्यकता के बिना करने के लिए एक Vagrantfile शामिल किया गया है, जो हेडलेस Windows Server 2022 Core VM चालू करता है। इसके लिए आपके होस्ट पर VirtualBox और Vagrant की आवश्यकता होती है (vagrant Nix डेव शेल में flake.nix के माध्यम से शामिल है)।```sh
vagrant up # First boot: downloads the box and provisions (~15–20 min)
ssh -p 2222 vagrant@localhost # Password: vagrant
अंदर VM में, प्रोजेक्ट रूट `C:\vagrant` पर माउंट किया गया है:```powershell
cd C:\vagrant
cargo build
cargo test
बाद के बूट तेज़ होते हैं — प्रोविज़निंग केवल एक बार चलती है:```sh vagrant halt # Stop the VM vagrant up # Resume vagrant destroy # Delete the VM entirely
# समस्या निवारण
क्या हो रहा है यह समझने के लिए, आप पर्यावरण चर `SKIM_LOG` या फ्लैग `--log-level` को `debug` या यहाँ तक कि `trace` पर सेट कर सकते हैं, और पर्यावरण चर `SKIM_LOG_FILE` या फ्लैग `--log-file` को किसी पथ पर सेट कर सकते हैं। फिर आप निष्पादन के दौरान या बाद में बेहतर समझ के लिए उन लॉग्स को पढ़ सकते हैं। यदि आपको सहायता चाहिए तो उन लॉग्स को किसी issue में जोड़ने में संकोच न करें।
## nix, FreeBSD, termux के साथ लाइन फीड की समस्याएँ
यदि आपको प्रदर्शन संबंधी समस्याएँ आती हैं जैसे:```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
उदाहरण के लिए
आपको TERMINFO या TERMINFO_DIRS को एक सही terminfo डेटाबेस पथ पर सेट करने की आवश्यकता है
उदाहरण के लिए, termux के साथ, आप इसे अपने bashrc में जोड़ सकते हैं:``` export TERMINFO=/data/data/com.termux/files/usr/share/terminfo
# बेंचमार्क
## इंटरैक्टिव बेंचमार्क (`cli`)
`cli` बेंच, skim (या कोई भी संगत बाइनरी) की तुलना अन्य संस्करणों या fzf से करता है, जिसमें इंटरैक्टिव इंटरफ़ेस को tmux सत्र के अंदर चलाया जाता है और स्टेटस लाइन को तब तक पोल किया जाता है जब तक कि मिलान की गई गिनती स्थिर न हो जाए। यह किसी भी तरह से सटीक या अचूक माप नहीं है, लेकिन इसका अतिरिक्त लाभ यह है कि यह `fzf` के विरुद्ध बेंचमार्क करता है और संसाधन मेट्रिक्स (पीक RSS और CPU) प्रदान करता है।```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
बाइनरी नामों को उपयोग से पहले which के माध्यम से पूर्ण पथों में हल किया जाता है, इसलिए sk या fzf जैसे सादे नाम तब तक काम करते हैं जब तक वे $PATH पर मौजूद हों।
क्राइटेरियन बेंचमार्क skim के प्रदर्शन को अधिक सटीक रूप से मापने के लिए उपलब्ध हैं।
इन्हें चलाने के लिए, आपको cargo bench --bench cli -- -g benches/fixtures/10M.txt -n 10000000 && cargo bench --bench cli -- -g benches/fixtures/1M.txt -n 1000000 का उपयोग करके इनपुट डेटा उत्पन्न करना होगा, फिर cargo bench -j 1 चलाएँ।
ये कई मिनट तक चलेंगे।