【fzf】터미널상에서 파일명 검색과 전문 검색을 Preview 첨부로 하고 싶다

12339 단어 Zshfzfripgrep
에디터·IDE등에 자주 있는 검색 기능을 fzf로 만들어 보자 기사

파일명 검색은 fzf로 준비되어 있는 KeyBind(Ctrl+T)를 커스터마이즈 합니다
$(brew --prefix)/opt/fzf/install 때 자동으로 설정합니다.
widget 함수에 대한 자세한 내용은 /usr/local/opt/fzf/shell/key-bindings.zsh에서 확인할 수 있습니다.

메모를 쓰는 것 같습니다.
  • 기사 내에서 외부 명령 (bat, rg, fd) 사용
  • macOS, zsh에서의 동작 만 확인했습니다

  • junegunn/fzf: A command-line fuzzy finder
    man page

    그 전에 내 fzf default option입니다. --height 는 지정이 있는 쪽이 보기 쉽고 좋아합니다. .zshrc export FZF_DEFAULT_OPTS=" --height 90% --reverse --border --prompt='➜' --margin=0,1 --inline-info --tiebreak=index --no-mouse --filepath-word --color fg:-1,bg:-1,hl:33,fg+:250,bg+:235,hl+:33 --color info:37,prompt:37,pointer:230,marker:230,spinner:37 --bind='ctrl-w:backward-kill-word,ctrl-x:jump,down:preview-page-down' --bind='ctrl-z:ignore,ctrl-]:replace-query,up:preview-page-up' --bind='ctrl-a:toggle-all,?:toggle-preview' " bindkey의 설정에 대해서는 여기

    개행 있어 Text가 개인적으로 싫었기 때문에 실제로는 배열, 연상 배열을 사용해 기술하고 있습니다
    즉 이렇게 ↓

    .zshrc
    # fzf
    export FZF_COMPLETION_TRIGGER=','
    typeset -Tgx FZF_DEFAULT_OPTS fzf_default_opts " " 
    fzf_default_opts=(
      '--height=90%'
      '--reverse'
      '--border'
      '--inline-info'
      '--prompt="➜  "'
      '--margin=0,2'
      '--tiebreak=index'
      '--no-mouse'
      '--filepath-word'
    )
    
    () {
      local -A color_map=(
        [fg]='-1'
        [bg]='-1'
        [hl]='33'
        [fg+]='250'
        [bg+]='235'
        [hl+]='33'
        [info]='37'
        [prompt]='37'
        [pointer]='230'
        [marker]='230'
        [spinner]='37'
      )
    
      for x in "${(k)color_map[@]}"; do
        fzf_color_opts+=("${x}:${color_map[${x}]}") 
      done
      fzf_default_opts+=( '--color="'"${(j.,.)fzf_color_opts}"'"' )
    }
    
    () {
      local -a fzf_bind_opts=()
      local -A bind_map=(
        [?]='toggle-preview'
        [ctrl-a]='toggle-all'
        ['ctrl-]']='replace-query'
        [ctrl-w]='backward-kill-word'
        [ctrl-x]='jump'
        [ctrl-z]='ignore'
        [up]='preview-page-up'
        [down]='preview-page-down'
      )
    
      for x in "${(k)bind_map[@]}"; do
        fzf_bind_opts+=("${x}:${bind_map[${x}]}")
      done
      fzf_default_opts+=( '--bind="'"${(j:,:)fzf_bind_opts}"'"' )
    }
    

    연상 배열의 기술이 version5.5 이상의 zsh가 아니면 읽을 수 없습니다
    보통 평문이라도 k

    외형은 이런 느낌


    파일 이름 검색



    기본 동작은 "현재 디렉토리 아래의 파일 디렉토리 검색"입니다.

    이번에는 다음과 같이 사용자 정의하고 싶습니다.
  • 기본 명령을 fd로 변경. 검색 대상은 파일에만
  • 선택하지 않으면 자동 종료, 1건만의 경우는 자동으로 선택
  • 미리보기보기 (bat 명령 사용)
  • 열기 (가능하면 다른 창에서)
  • 숨겨진 파일 표시 전환

  • 설명이 여기

    .zshrc
    export FZF_CTRL_T_COMMAND="fd --type f "
    export FZF_CTRL_T_OPTS="
        --select-1 --exit-0
        --bind 'ctrl-l:execute(tmux splitw -h -- nvim {})'
        --bind '>:reload($FZF_ALT_C_COMMAND -H -E .git )'
        --bind '<:reload($FZF_ALT_C_COMMAND)'
        --preview 'bat -r :100 --color=always --style=header,grid {}'"
    

    이런 상태가 됩니다


    전체 텍스트 검색



    현재 디렉토리 아래의 파일을 전체 텍스트 검색. 선택한 파일을 명령줄에 붙여넣기

    man에있는 설명을 참고로합니다.
    쿼리를 변경할 때마다 rg 검색이 실행됩니다.

    만든 것

    fzf-ripgrep-widget
    #!/usr/bin/env zsh
    
    main() {
      LBUFFER="${LBUFFER}$(__fzf_ripgrep)"
      local ret=$?
      zle reset-prompt
      return $ret
    }
    
    __fzf_ripgrep() {
      emulate -L zsh
      rg_cmd="rg --smart-case --line-number --color=always --trim" 
      selected=$(FZF_DEFAULT_COMMAND=":" \
          fzf --bind="change:top+reload($rg_cmd {q} || true)" \
              --bind="ctrl-l:execute(tmux splitw -h -- nvim +/{q} {1} +{2})" \
              --ansi --phony \
              --delimiter=":" \
              --preview="bat -H {2} --color=always --style=header,grid {1}" \
              --preview-window='down:60%:+{2}-10')
    
      local ret=$?
      [[ -n "$selected" ]] && echo ${${(@s/:/)selected}[1]}
      return $ret
    }
    
    main 
    

    .zshrc
    autoload -Uz fzf-ripgrep-widget
    
    zle -N fzf-ripgrep-widget
    bindkey '\ef' fzf-ripgrep-widget
    

    움직임


    검색 결과가 미리보기 내에서 추적하여 만족
    단지 하이라이트가 조금 미묘한 것과, 검색 결과 window의 format이 유감

    감상



    몇 가지 문제가 남아 있지만 이것이 현재 MAX
    Rust 관련 명령을 건드려 Rust 굉장합니다.

    좋은 웹페이지 즐겨찾기