
보안 연구 랩으로, 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은 워크플로우를 더 빠르고 효율적으로 만들어 주도록 설계된 강력한 퍼지 파인더입니다.
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 페이지: 올바른 경로에 작성하거나 `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}에는 키 바인딩과 셸 통합이 포함되어 있습니다:
ctrl-t는 sk를 통해 파일을 선택합니다.ctrl-r은 sk를 통해 기록 항목을 선택합니다.alt-c는 sk를 통해 선택한 디렉터리로 cd합니다.fish에서는 사용 불가) **는 파일 경로를 완성합니다. 예를 들어 ls **<tab>은 폴더를 선택할 수 있는 sk 위젯을 표시합니다.이 기능들을 활성화하려면 key-bindings.{shell} 파일을 소스하고 셸 문서에 따라 완성을 설정하거나 아래를 참조하세요.
지원되는 셸(bash, zsh, fish, powershell 또는 elvish) 중 하나와 함께 --shell 플래그를 사용하여 선호하는 셸용 완성 스크립트를 생성할 수 있습니다:
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
page (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
`Ctrl-R`(Rotate Mode)를 누르면 동적으로 `regex` 모드로 전환할 수 있습니다.
## 종료 코드
| 종료 코드 | 의미 |
|-----------|-------------------------------------|
| 0 | 정상 종료 |
| 1 | 일치 항목 없음 |
| 130 | Ctrl-C/Ctrl-G/ESC 등으로 중단됨... |
# `skim`과 호환되는 도구
다음 도구들은 `skim`과 호환되거나 호환을 목표로 합니다:
## [fzf-lua neovim 플러그인](https://github.com/ibhagwan/fzf-lua)
코드를 탐색하기 위해 fzf와 skim을 사용할 수 있게 해주는 [neovim](https://neovim.io) 플러그인입니다.
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)
SQL 쿼리에서 `skim_score` 함수를 사용할 수 있게 해주는 로드 가능한 `sqlite` 모듈입니다.
# 사용자 지정
여기 문서는 미리보기일 뿐이며, 전체 옵션 목록은 매뉴얼 페이지(`man sk`)를 확인하세요.
## 키맵
바인딩을 쉼표로 구분된 쌍으로 지정합니다(공백 허용 안 됨). 예를 들어:```sh
sk --bind 'alt-a:select-all,alt-d:deselect-all'
추가로, +를 사용하여 액션을 연결할 수 있습니다. 예: execute-silent(echo {} | pbcopy)+abort.
자세한 내용은 매뉴얼 페이지의 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 16진수 값: `sk --color=fg:#FF0000` (빨간색 텍스트)
### 사용 가능한 색상 사용자 지정 옵션
다음 UI 요소를 사용자 지정할 수 있습니다:
| 요소 | 설명 | 예시 |
|--------------------|----------------------------------------|--------------------------------|
| `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은 여러 알고리즘을 제공하며, 전체 목록은 도움말 또는 manpage를 확인하세요. 그중에는 다음이 있습니다:
이것은 skim이 차용한 fzf의 훌륭한 기능입니다. 예를 들어, '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` 옵션으로 주어지면, skim은 `{}`를 현재 강조 표시된 줄로 바꾸되 작은따옴표로 감싼 다음, 명령을 호출하여 출력을 얻고, 그 출력을 미리보기 창에 표시합니다.
때로는 명령을 호출하기 위해 전체 줄이 필요하지 않을 수도 있습니다. 이 경우 `{}`, `{1..}`, `{..3}` 또는 `{1..5}`를 사용하여 필드를 선택할 수 있습니다. 이 구문은 [Fields Support](#filds-support) 섹션에서 설명합니다.
마지막으로, `--preview-window`로 미리보기 창의 위치를 구성할 수 있습니다:
- `--preview-window up:30%`는 창을 위쪽 위치에 skim 전체 높이의 30% 높이로 배치합니다.
- `--preview-window left:10:wrap`는 `wrap`을 지정하여 미리보기 창이 미리보기 명령의 출력을 줄바꿈하도록 허용합니다.
- `--preview-window wrap:hidden`은 시작 시 미리보기 창을 숨기며, 이후 `toggle-preview` 동작으로 표시할 수 있습니다.
## 필드 지원
일반적으로 플러그인 사용자만 이해하면 되는 부분입니다.
예를 들어, 다음과 같은 형식의 데이터 소스가 있다고 가정합니다:```sh
<filename>:<line number>:<column number>
그러나 쿼리를 입력할 때 <filename>만 검색하고 싶다면 어떻게 해야 할까요. 즉, 21을 입력했을 때 21을 포함하는 <filename>을 찾되, 줄 번호나 열 번호는 매칭하지 않으려는 경우입니다.
이 경우 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을 CLI로 사용할 때 필요하며, 라이브러리로 사용할 때는 *필요하지 않아야* 합니다.
### 기본 사용법
그런 다음 이 간단한 예제를 실행해 보세요:```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와 비동기 코드를 사용하여 skim을 라이브러리로 세부적으로 사용할 수도 있으며, 이를 통해 동적으로 상호작용할 수 있습니다.
Option<SkimItemReceiver>이 주어지면 skim은 그에 따라 항목을 읽고 작업을 수행한 후 선택된 항목, 쿼리 등을 포함한 사용자 선택 결과를 반환합니다. 참고 사항:
SkimItemReceiver는 crossbeam::channel::Receiver<Arc<dyn SkimItem>>입니다.none이면 주어진 명령을 호출하고 명령 출력에서 항목을 읽습니다.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
You could put it in your `.bashrc` or `.zshrc` if you like it to be default.
## Some files are not shown in Vim plugin
If you use the Vim plugin and execute the `:SK` command, you may find some
of your files not shown.
As described in [#3](https://github.com/skim-rs/skim/issues/3), in the Vim
plugin, `SKIM_DEFAULT_COMMAND` is set to the command by default:```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만큼 기능이 풍부하게 유지하는 것이지만, 명령 플래그는 다를 수 있습니다.
버그가 발생하거나 아이디어가 있으면 새 이슈를 생성하세요. 풀 리퀘스트는 언제나 환영합니다.
GUI 없이 Windows 호환성을 테스트하기 위해 헤드리스 Windows Server 2022 Core VM을 시작하는 Vagrantfile이 포함되어 있습니다. 호스트에 VirtualBox와 Vagrant가 필요합니다(vagrant는 flake.nix를 통해 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`을 경로로 설정할 수 있습니다. 그런 다음 실행 중이나 실행 후에 해당 로그를 읽어 상황을 더 잘 이해할 수 있습니다. 도움이 필요하면 해당 로그를 이슈에 추가하는 것을 주저하지 마세요.
## 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 또는 TERMINFO_DIRS를 설정해야 합니다.
예를 들어, termux에서는 bashrc에 다음을 추가할 수 있습니다:``` export TERMINFO=/data/data/com.termux/files/usr/share/terminfo
# 벤치마크
## 대화형 벤치마크(`cli`)
`cli` 벤치는 tmux 세션 내에서 대화형 인터페이스를 실행하고 일치 항목 수가 안정화될 때까지 상태 줄을 폴링하여 skim(또는 호환되는 바이너리)을 다른 버전이나 fzf와 비교 측정합니다. 이는 결코 정밀하거나 완벽한 측정은 아니지만, `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을 실행해야 합니다.
이 작업은 몇 분 정도 소요됩니다.