Vim에서 플러그인이 없는 대화식 모호 찾기

10320 단어 terminalfzfvim

카탈로그
  • Overview
  • The Setup
  • Bonus
  • Caveat
  • Summary

  • 개술
    FZF는 훌륭한 명령행 모호 검색기이고 fzf.vim 플러그인도 Vim과 통합되어 일부 기능을 제공했다. 예를 들어 :Files 은 파일에 대해 모호 검색을 하고 :Rg ripgrep 로 텍스트에 대해 모호 검색을 한다.
    그러나 최근에 나는 플러그인이 없는 Vim 설정을 시험해 왔다. :find 어떤 용례로는 충분하지만, 새로운 프로젝트나 대형 프로젝트에서 깊이 박힌 파일을 찾기 위해 Vim을 종료하고 실행하는 것을 발견했다.
    명령행 프로그램과 명령행 편집기를 통합하는 간단한 방법이 있어야 합니다. 그렇습니까?

    설정
    이 설정은 간단하다.vim의 이름quickfix을 이용한 기능이다.
    프로세스는 다음과 같습니다.
  • 전화 fzf
  • 서식 출력을 fzf 와 호환
  • 결과를 임시 파일에 기록
  • 사용 errorformat 또는 :cfile 결과를 Vim의 빠른 복구 목록에 로드하여 사용 가능 :cgetfile /:cnext 또는 :cprevious 조회 결과
  • 임시 파일 정리
  • 다음은 마지막vimscript의 모습입니다.
    function! FZF() abort
        let l:tempname = tempname()
        " fzf | awk '{ print $1":1:0" }' > file
        execute 'silent !fzf --multi ' . '| awk ''{ print $1":1:0" }'' > ' . fnameescape(l:tempname)
        try
            execute 'cfile ' . l:tempname
            redraw!
        finally
            call delete(l:tempname)
        endtry
    endfunction
    
    " :Files
    command! -nargs=* Files call FZF()
    
    " \ff
    nnoremap <leader>ff :Files<cr>
    
    빠른 세분화:
  • :copen
  • 임시 파일의 경로를 생성하여 변수에 저장합니다.
  • 참조 let l:tempname = tempname()
  • :h tempname()
  • execute 'silent !fzf --multi ' . '| awk ''{ print $1":1:0" }'' > ' . fnameescape(l:tempname) 호출fzf으로 여러 파일을 선택할 수 있음
  • 파이프를 --multiawkfzf 결과에 추가하여 :1:0를 호환시켰다.
  • 주의: 만약 당신errorformat이 당신의vimrc에서 이 awk 명령을 삭제할 수 있지만, 나는 set errorformat+=%f가 다른 프로그램의 출력에서 많은 오보를 포획했기 때문에 %f/:cnext는 이 오보 결과에 영향을 미치지 않는다는 것을 발견했다.
  • 마지막으로 결과를 임시 파일로 가져오기
  • :cprevious
  • 임시 파일의 결과를 빠른 복구 목록에 불러오고 첫 번째 결과로 이동합니다.
  • 참고 #1: 첫 번째 결과로 건너뛰지 않고 execute 'cfile ' . l:tempname 빠른 복구 목록에만 결과를 로드할 수 있습니다.
  • 주#2: 빠른 복구 목록 대신 위치 목록을 사용할 수 있도록 :cgetfile/:cfile/:cgetfile로 바꿀 수 있습니다.위치 목록은 창에 특정되며, 빠른 복구 목록은 전역적입니다.따라서vim 창마다 다른 결과 집합을 원한다면 :lfile/:lgetfile 를 사용하십시오.
  • :lfile
  • 임시 파일 삭제
  • 로 정리
  • :lgetfile
  • vim
  • 에서 호출call delete(l:tempname)할 때 호출command! -nargs=* Files call FZF() 함수
  • FZF()
  • 정상적인 모드로 비추면 우리는 :Files로 이 흐름을 촉발할 수 있다

  • 보너스nnoremap <leader>ff :Files<cr>는 나의 대다수 용례로 충분하지만fzf에서 사용한 사람<leader>ff은 충분하다.vim는 인터랙티브 모호 grepping 체험을 감상하고 vim에서 파일을 열기 전에 결과를 미리 볼 수 있는 능력을 제공합니다.
    여기에 순수한vim와 유사한 체험이 있다(분명히:set grepprg=rg\ --vimgrep:Rg 바이너리 파일은 여전히 필수적이다).
    function! RG(args) abort
        let l:tempname = tempname()
        let l:pattern = '.'
        if len(a:args) > 0
            let l:pattern = a:args
        endif
        " rg --vimgrep <pattern> | fzf -m > file
        execute 'silent !rg --vimgrep ''' . l:pattern . ''' | fzf -m > ' . fnameescape(l:tempname)
        try
            execute 'cfile ' . l:tempname
            redraw!
        finally
            call delete(l:tempname)
        endtry
    endfunction
    
    " :Rg [pattern]
    command! -nargs=* Rg call RG(<q-args>)
    
    " \fs
    nnoremap <leader>fs :Rg<cr>
    
    이는 다음과 같은 경험을 제공합니다.
  • fzf 매개 변수 없이vim에 모든 텍스트를 불러오고 사용자가 파일을 선택하기 전에 상호작용으로 결과를 입력하고 미리 볼 수 있도록 합니다
  • rg 미리 여과한 결과만 일치하도록 :Rg한 다음에 그것을 :Rg [pattern]에 전달하여 더욱 모호한 검색을 진행한다.

  • 경고
    나의 테스트에서 나는 주요한 경고가 나에게 큰 영향을 미치지 않았다는 것을 발견했지만 여전히 여기서 지적할 가치가 있다.
    vim에서 앞머리로 셸 명령을 실행합니다. 예를 들어 [pattern] 는 상호작용을 의미하지 않습니다. (적어도 상자를 열면 바로 사용할 수 없습니다.)GVim/MacVim의 문제일 수 있습니다.vimdocs는 다음과 같은 해결 방법을 언급했다.

    On Unix the command normally runs in a non-interactive shell. If you want an interactive shell to be used (to use aliases) set 'shellcmdflag' to "-ic".


    설정fzf은 셸의 시작/초기화 시간에 따라 시간 손실을 초래할 수 있습니다.

    요약
    Vim은 공통적이며 사용자 정의가 가능합니다.
    vim 개념에 대한 이해(예를 들어quickfix,:!fzf/shellcmdflag=-ic와 약간(vim & bash) 스크립트를 통해 당신은 더욱 풍부한 체험과 유쾌한 통합을 얻을 수 있으며 당신과 당신의 업무 절차에 적합한 방식으로 생산력을 향상시킬 수 있습니다.
    나는 네가 이 글을 좋아하길 바란다. 나는vim에서 너의 생산력 기교와 기교를 개발하고 공유하도록 격려할 수 있기를 바란다.
    해커!

    좋은 웹페이지 즐겨찾기