자체 제작 CLI 도구에 Rust Fuzzy Finder skim 포함

13517 단어 Rusttech
Rust가 쓴 skim 중 Go가 쓴 fzf처럼 애매한 검색을 할 수 있다.cargo install skimsk를 설치하면 명령을 사용할 수 있습니다.
https://github.com/lotabout/skim
이것skim은 프로그램 라이브러리로도 사용할 수 있습니다.이번에 자체 제작한 책갈피 관리 CLI 도구skim에 편입해 보았다.

만든 물건


여기 있습니다.
https://github.com/urawa72/rbm
이 도구는 자주 방문하는 웹 페이지 기사 링크를 로컬에서 관리할 수 있는 CLI 도구입니다.책갈피는 파일~/rbm-bookmarks.toml에 저장됩니다.
손잡이와 브라우저의 책갈피도 괜찮지만, 자신은Vim을 자주 사용하기 때문에 하나하나 브라우저에 가서 터미널에서 열려고 한다.
crate.io에도 등록되어 cargo install rbm에 설치할 수 있습니다.rbm add 명령으로 새 책갈피를 추가합니다.
$ rbm add
Title> Google
URL> https://google.com
Tag> Google,Search
rbm list에 등록된 책갈피 일람표를 표시하고 브라우저에서 모호한 검색을 통해 선택한 책갈피를 열 수 있습니다.여기skim는 프로그램 라이브러리로 사용됩니다.

라이브러리의 일부로 사용되는 코드


책갈피 관리 CLI 도구skim에서 사용하여 흐리게 검색한 부분의 코드는 다음과 같습니다.
(CLI 도구 자체 제작 및 toml 파일에 저장된 부분은 분리됩니다. 자세한 내용은 GiitHub을 확인하십시오.)
use crate::bookmark::Bookmark;
use skim::prelude::*;
use skim::{Skim, SkimItemReceiver, SkimItemSender};
use std::{process::Command, sync::Arc};

impl SkimItem for Bookmark {
    // 曖昧検索に使われる値
    fn text(&self) -> Cow<str> {
        Cow::Borrowed(&self.inner)
    }

    // 絞り込んで選択した際に表示される値
    fn output(&self) -> Cow<str> {
        Cow::Borrowed(&self.url)
    }
}

/// Search bookmark with fuzzy finder.
pub fn finder(bookmarks: Vec<Bookmark>) {
    // 曖昧検索の起動時の画面高さを指定・Enterキーで選択する
    let options = SkimOptionsBuilder::default()
        .height(Some("50%"))
        .multi(true)
        .bind(vec!["Enter:accept"])
        .build()
        .unwrap();

    let (tx_item, rx_item): (SkimItemSender, SkimItemReceiver) = unbounded();
    for bookmark in bookmarks {
        let _ = tx_item.send(Arc::new(bookmark));
    }
    drop(tx_item);

    let selected_items = Skim::run_with(&options, Some(rx_item))
        .map(|out| match out.final_key {
            Key::Enter => out.selected_items,
            _ => Vec::new(),
        })
        .unwrap_or_else(Vec::new);

    for item in selected_items.iter() {
        let url = item.output();
        // 曖昧検索の結果出力されるurlをopenコマンドで開く
	// Macだけで動く
        Command::new("open")
            .arg(url.as_ref())
            .output()
            .expect("Faild to execute process");
    }
}
이 코드는 skim의 창고examples 내의 custom_item.rscustom_keybinding_actions.rs의 코드를 참고했다.
솔직히 내부 구조를 이해하고 능숙하게 사용할 수는 없지만, 자체 제작 CLI 도구에 애매한 검색을 간단하게 추가할 수 있다.

겸사겸사 말씀드리겠습니다.


이번에 제작된 책갈피 관리 앱은 마이크로소프트가 공개한 Rust의 학습교재명령줄을 만드는 to-do 목록 프로그램를 개조한 것이다.
이 교재는 나처럼 Rust를 공부하는 사람들에게 매우 도움이 된다.

좋은 웹페이지 즐겨찾기