
自動化された研究アーティファクト — 上流プロジェクトではありません。
このリポジトリは、ラヴァル大学の修士論文のために、公開されている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 ページ。正しいパスに書き込むか、`man --local-file <(sk --man)` を実行します
- シェル補完(およびオプションのキーバインド)。`source <(sk --shell \<shell> \[--shell-bindings])` を使用します。詳細は以下を参照してください
# 使用方法
Skim は、一般的なフィルタ(`grep` に類似)としても、コマンドを実行するための
対話型インターフェースとしても使用できます。
## Vim プラグインとして(neovim では、skim プロファイルを指定して [fzf-lua](https://github.com/ibhagwan/fzf-lua) を確認してください)
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
ページ(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`(モード回転)を押すと、動的に `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) 内で使用できるようにする [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。
詳細については、man ページの KEY BINDINGS セクションを参照してください。
結果には score, index, begin, end, length の5つのソートキーがあります。レコードの並び順は、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`
- RGB16進値:`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
skの詳細については、manページ(man sk)を参照してください。
--ansi: データソースのANSIカラーコード(例: \e[32mABC)を解析する--regex: クエリを正規表現として使用し、データソースとマッチさせるインタラクティブモードでは、コマンドを動的に呼び出すことができます。試してみましょう:```sh sk --ansi -i -c 'rg --color=always --line-number {q}'
### どのように動作するのか?

- Skim は2種類のソースを受け付けます: コマンド出力またはパイプ入力
- Skimには2種類のプロンプトがあります: クエリパターンを指定するためのクエリプロンプトと、
コマンドの「引数」を指定するためのコマンドプロンプト
- `-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 は複数のアルゴリズムを提供しています。完全なリストはヘルプまたは man ページを確認してください。その中には以下のものがあります:
これは 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` オプションで指定されている場合、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` アクションで表示できます。
## Fields support
通常、この機能を理解する必要があるのはプラグインユーザーのみです。
例えば、次の形式のデータソースがあるとします:```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
`.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 と同じくらい機能豊富に保つことですが、コマンドフラグは異なる場合があります。
バグに遭遇した場合やアイデアがある場合は、新しい issue を作成してください。プルリクエストも歓迎します。
GUI を必要とせずに Windows 互換性をテストするために、ヘッドレスな Windows Server 2022 Core VM を起動する Vagrantfile が含まれています。ホストには VirtualBox と Vagrant が必要です(vagrant は flake.nix 経由で Nix dev shell に含まれています)。```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_DIRSを、正しいterminfoデータベースのパスに設定する必要があります
例えば、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 を実行する必要があります。
これらは数分間実行されます。