custom_item/
custom_item.rs1extern 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())) .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); 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}