
مختبر أبحاث أمني يعيد إنتاج CVE-2026-41414 (ثغرة pull_request_target في .github/workflows/pr.yml) — لقطة من skim-rs/skim @ ca986f4، وليست نسخة متفرعة.
أداة بحث آلية — ليست المشروع الأصلي.
هذا المستودع عبارة عن بيئة مختبرية مؤقتة أُنشئت بواسطة نظام آلي لأطروحة ماجستير في جامعة لافال حول إعادة إنتاج ثغرات سير عمل 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/Nvim. راجع skim.vim لدعم Vim.| نظام التشغيل | مدير الحزم | الأمر |
|---|---|---|
| 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 page)، والتي يمكنك إما كتابتها إلى المسار الصحيح أو تشغيل `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 عبر سطر الأوامرkey-bindings.{shell} يحتوي على اختصارات المفاتيح وتكاملات الصدفة:
ctrl-t لتحديد ملف عبر skctrl-r لتحديد إدخال من السجل عبر skalt-c للانتقال إلى دليل محدد عبر skfish) ** لإكمال مسارات الملفات، على سبيل المثال 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
بعض ربطات المفاتيح شائعة الاستخدام:
| المفتاح | الإجراء |
|---|---|
| Enter | قبول (تحديد العنصر الحالي والخروج) |
| ESC/Ctrl-G | إحباط |
| Ctrl-P/الأعلى | تحريك المؤشر للأعلى |
| Ctrl-N/الأسفل | تحريك المؤشر للأسفل |
| TAB | تبديل التحديد والتحرك للأسفل (مع -m) |
| Shift-TAB | تبديل التحديد والتحرك للأعلى (مع -m) |
للحصول على قائمة كاملة بربطات المفاتيح، راجع صفحة
الرجل (man sk).
يستعير skim صيغة fzf لمطابقة العناصر:
| الرمز | نوع المطابقة | الوصف |
|---|---|---|
text | مطابقة ضبابية | العناصر التي تطابق text |
^music | مطابقة دقيقة بالبادئة | العناصر التي تبدأ بـ music |
.mp3$ | مطابقة دقيقة باللاحقة | العناصر التي تنتهي بـ .mp3 |
'wild | مطابقة دقيقة (بين علامتي اقتباس) | العناصر التي تتضمن wild |
!fire | مطابقة دقيقة معكوسة | العناصر التي لا تتضمن fire |
!.mp3$ | مطابقة دقيقة معكوسة باللاحقة | العناصر التي لا تنتهي بـ .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
يمكنك التبديل إلى وضع `regex` ديناميكيًا بالضغط على `Ctrl-R` (وضع التدوير).
## رمز الخروج
| رمز الخروج | المعنى |
|-----------|-------------------------------------|
| 0 | خرج بشكل طبيعي |
| 1 | لم يتم العثور على تطابق |
| 130 | تم الإنهاء بواسطة Ctrl-C/Ctrl-G/ESC/إلخ... |
# الأدوات المتوافقة مع `skim`
هذه الأدوات متوافقة أو تهدف إلى أن تكون متوافقة مع `skim`:
## [إضافة fzf-lua لـ neovim](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` تتيح استخدام دالة `skim_score` في استعلامات SQL.
# التخصيص
المستند هنا مجرد معاينة، يرجى مراجعة صفحة الدليل (`man sk`) للحصول على قائمة كاملة بالخيارات.
## خريطة المفاتيح
حدد الارتباطات بأزواج مفصولة بفواصل (بدون مسافات مسموحة). على سبيل المثال:```sh
sk --bind 'alt-a:select-all,alt-d:deselect-all'
بالإضافة إلى ذلك، استخدم + لدمج الإجراءات، مثل execute-silent(echo {} | pbcopy)+abort.
راجع قسم KEY BINDINGS في صفحة الدليل (man page) للحصول على التفاصيل.
هناك خمسة مفاتيح فرز للنتائج: 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)
يمكنك تخصيص عناصر واجهة المستخدم الفردية عن طريق تحديد قيم الألوان بعد المخطط الأساسي:```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` (نص أحمر)
### خيارات تخصيص الألوان المتاحة
يمكن تخصيص عناصر الواجهة التالية:
| العنصر | الوصف | المثال |
|----------------------|----------------------------------------------|----------------------------------|
| `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 خوارزميات متعددة، راجع التعليمات أو صفحة الدليل للحصول على قائمة شاملة. من بينها:
skim_v2، الخوارزمية الافتراضية، المستندة بشكل فضفاض إلى خوارزمية fzffrizbee، تستخدم 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) هو سكربت لطباعة السياق مع إعطاء اسم الملف:الأسطر:الأعمدة)
ستحصل على نتائج مثل هذه:

### كيف يعمل؟
إذا تم إعطاء أمر المعاينة عبر خيار `--preview`، فسيقوم skim باستبدال
`{}` بالسطر المميز حاليًا والمحاط بعلامات اقتباس مفردة، ثم يستدعي
الأمر للحصول على المخرجات، ويطبع المخرجات في نافذة المعاينة.
أحيانًا لا تحتاج إلى السطر بأكمله لاستدعاء الأمر. في هذه الحالة
يمكنك استخدام `{}` أو `{1..}` أو `{..3}` أو `{1..5}` لتحديد الحقول. يتم
شرح الصيغة في قسم [دعم الحقول](#filds-support).
أخيرًا، قد ترغب في تكوين موضع نافذة المعاينة باستخدام `--preview-window`:
- `--preview-window up:30%` لوضع النافذة في الموضع العلوي بارتفاع
30% من الارتفاع الكلي لـ skim.
- `--preview-window left:10:wrap` لتحديد أن `wrap` يسمح لنافذة المعاينة
بلف مخرجات أمر المعاينة.
- `--preview-window wrap:hidden` لإخفاء نافذة المعاينة عند بدء التشغيل، ويمكن
إظهارها لاحقًا بواسطة الإجراء `toggle-preview`.
## دعم الحقول
عادةً لا يحتاج سوى مستخدمي الإضافات إلى فهم هذا.
على سبيل المثال، لديك مصدر بيانات بالتنسيق:```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 الخاصة بك.
أولاً، أضف skim إلى ملف Cargo.toml الخاص بك:```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());
}
}
يمكنك أيضًا الحصول على استخدام دقيق لـ skim كمكتبة باستخدام tokio والكود غير المتزامن، مما يسمح لك بالتفاعل ديناميكيًا مع
عند تمرير Option<SkimItemReceiver>، سيقوم skim بقراءة العناصر وفقًا لذلك، ويؤدي
مهمته ويعيد لنا اختيار المستخدم بما في ذلك العناصر المحددة،
والاستعلام، وما إلى ذلك. لاحظ أن:
SkimItemReceiver هو crossbeam::channel::Receiver<Arc<dyn SkimItem>>يتم توفير Trait SkimItem لتخصيص كيفية عرض السطر،
ومقارنته ومعاينته. وهو مطبق افتراضيًا لـ AsRef<str>
بالإضافة إلى ذلك، فإن SkimItemReader هو مساعد لتحويل BufRead إلى
SkimItemReceiver (يمكننا بسهولة تحويل File أو String إلى BufRead)،
حتى تتمكن من التعامل مع السلاسل أو الملفات بسهولة.
اطلع على المزيد من الأمثلة في دليل examples/.
يقوم هذا المعيار بتشغيل الواجهة التفاعلية في جلسة tmux، وينتظر استقرار واجهة المستخدم.

يمكنك إنشاء الرسوم البيانية باستخدام 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. على سبيل المثال:
skim لديه وضع تفاعلي.skim يدعم الاختيار المسبق.بشكل عام، يسمح القائمون على صيانة skim لأنفسهم ببعض الحرية في التنفيذ.
الهدف هو إبقاء skim بنفس مستوى اكتمال الميزات الذي يتمتع به fzf، لكن علامات الأوامر قد تختلف.
أنشئ مشكلات جديدة إذا واجهت أي أخطاء أو كانت لديك أي أفكار. طلبات السحب مرحب بها بحرارة.
تم تضمين ملف Vagrantfile لتشغيل جهاز افتراضي بدون واجهة رسومية يعمل بنظام Windows Server 2022 Core لاختبار
التوافق مع ويندوز دون الحاجة إلى واجهة رسومية. يتطلب ذلك 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
داخل الجهاز الافتراضي، يتم تثبيت جذر المشروع في `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.
تتوفر معايير Criterion لقياس أداء 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.
ستستغرق هذه المعايير عدة دقائق.