custom_item/
custom_item.rs

1extern crate skim;
2use skim::prelude::*;
3
4struct MyItem {
5    inner: String,
6}
7
8impl SkimItem for MyItem {
9    fn text(&self) -> Cow<'_, str> {
10        Cow::Borrowed(&self.inner)
11    }
12
13    fn preview(&self, _context: PreviewContext) -> ItemPreview {
14        if self.inner.starts_with("color") {
15            ItemPreview::AnsiText(format!("\x1b[31mhello:\x1b[m\n{}", self.inner))
16        } else {
17            ItemPreview::Text(format!("hello:\n{}", self.inner))
18        }
19    }
20}
21
22fn main() {
23    let options = SkimOptionsBuilder::default()
24        .height(String::from("50%"))
25        .multi(true)
26        .preview(Some(String::new())) // preview should be specified to enable preview window
27        .build()
28        .unwrap();
29
30    let (tx_item, rx_item): (SkimItemSender, SkimItemReceiver) = unbounded();
31    let _ = tx_item.send(Arc::new(MyItem {
32        inner: "color aaaa".to_string(),
33    }));
34    let _ = tx_item.send(Arc::new(MyItem {
35        inner: "bbbb".to_string(),
36    }));
37    let _ = tx_item.send(Arc::new(MyItem {
38        inner: "ccc".to_string(),
39    }));
40    drop(tx_item); // so that skim could know when to stop waiting for more items.
41
42    let selected_items = Skim::run_with(options, Some(rx_item))
43        .map(|out| out.selected_items)
44        .unwrap_or_default();
45
46    for item in selected_items.iter() {
47        println!("{}", item.output());
48    }
49}