development

Vim에서 파일 찾기 (재귀 적 디렉토리 검색을 통해)

big-blog 2020. 10. 23. 08:03
반응형

Vim에서 파일 찾기 (재귀 적 디렉토리 검색을 통해)


Vim에서 파일을 재귀 적으로 검색하는 방법이 있습니까 (필요할 때 와일드 카드 사용)? 네이티브가 아니라면이를 처리 할 수있는 플러그인이 있습니까?


:edit명령에 와일드 카드를 사용할 수 있습니다 . 그래서,

:e **/test/Suite.java

현재 디렉토리 계층 구조에 상관없이 test / Suite.java를 엽니 다. 이것은 탭 완성과 함께 작동하므로 파일을 열기 전에 [tab]을 사용하여 와일드 카드를 확장 할 수 있습니다. 대신 가능한 모든 확장을 탐색하는 방법 wildmode 옵션을 참조하십시오 .

또 다른 트릭은

:r! find . -type f

현재 디렉토리의 모든 파일 목록을 버퍼로로드합니다. 그런 다음 모든 일반적인 vim 텍스트 조작 도구를 사용하여 목록을 탐색 / 정렬 / 자르고 CTRL+W gf새 창에서 커서 아래에 파일을 열 수 있습니다.


찾기 명령이 있습니다. **경로에 추가 하면 재귀 적으로 검색 할 수 있습니다.

:set path

현재 경로를 표시하고 다음과 같이 **를 추가합니다.

:set path=.,/usr/include,,**

**이니셜에서 복사 하기 전의 비트:set path

그런 다음 입력 할 수 있습니다.

:find myfile.txt

마법처럼 열립니다!

.vimrc에 set 명령을 추가하면 나중에 재귀 검색을 수행 할 수 있습니다. 도트 디렉토리 (예 : .ssh)를 검색하지 않는 것 같습니다.


ctrlp.vim을 추천 합니다 . 큰 프로젝트에서 작업하기에 이상적인 매우 좋은 플러그인입니다. 파일 이름 또는 전체 경로로 검색, regexp 검색, 프로젝트 루트 (.git | hg | svn | bzr | _darcs 폴더가있는 루트) 자동 감지, 개인화 된 파일 이름 제외 등이 있습니다.

누르기 만하면 <c-p>원하는 것을 검색 할 수있는 매우 직관적 인 창이 열립니다.

여기에 이미지 설명 입력

한 번에 여러 파일을 선택하고 열 수 있습니다. 또한 특정 줄로 이동, 문자열 발생 또는 기타 Vim 명령과 같은 추가 임의 명령을 허용합니다.

리포지토리 : https://github.com/kien/ctrlp.vim


vim은 내장 찾기 명령 (: help find)으로 사용되지만 처음 찾은 파일 만 엽니 다. 그러나이 놀라운 플러그인을 사용할 수 있습니다 : FuzzyFinder 는 원하는 모든 것을 수행합니다.


Command-T를 사용하면 문자를 입력하는 것만으로도 파일을 매우 빠르게 찾을 수 있습니다. 새 탭에서 파일을 열 수도 있지만 루비 지원으로 컴파일 된 vim이 필요합니다.


당신이 사용할 수있는 ! 쉘 명령을 실행하려면 다음을 수행하십시오.

:! find . -name *.xml

를 사용하여 파일 시스템을 탐색 할 수 :ex .있지만 재귀 적으로 검색하는 방법을 모르겠습니다 (저는 Vim 초보자입니다. 10 년 밖에 사용하지 않았습니다).

몇 가지 인기있는 파일 브라우저 플러그인이 있습니다.

SuperUser에 대한이 스레드를 참조하십시오 .


내가 가장 좋아하는 vim 플러그인 중 하나의 Command-tFZF와의 통합 위의 루비 기반 플러그인 입니다.

Comamnd-T 및 FZF를 사용하면 매우 빠른 "퍼지"메커니즘으로 검색을 수행 할 수 있습니다.

  • 파일 및 버퍼 열기
  • 태그 및 도움말로 이동
  • 실행 명령 또는 이전 검색 및 명령
  • 최소한의 키 입력으로.

보시다시피

여기에 이미지 설명 입력

나는 항상 새 터미널을 열고 다음을 눌러 명령 기록에서 검색합니다.

CTRL+R

터미널 탭에 작성하여 모든 폴더를 재귀 적으로 검색하는 것 외에도 :

fzf

또한 내부에 쓸 수 있습니다. vim

:CommandT 

정말 강력하고 빠릅니다.


vim은이를 수행 할 수있는 grep, lgrep, vimgrep 또는 lvimgrep 명령에 bild가 있습니다.

여기에 그것들을 사용하는 방법에 대한 튜토리얼이 있습니다 http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search

다음과 같이 실행하여 vim에서 find 또는 grep과 같은 외부 명령을 사용할 수도 있습니다.

:!find ...

아직 아무도 Unite.vim을 언급하지 않았다는 것에 놀랐습니다 .

파일 찾기 (모호하게 또는 기타)는 개발자가 할 수있는 일에 대한 빙산의 일각 일뿐입니다. 그것은에 대한 지원이 포함되어 있습니다 ag, git및 기타 프로그램 / 유틸리티 / 정력 플러그인의 무수한. 학습 곡선은 약간 가파르지만 그것 없이는 내 삶을 상상할 수 없습니다. 사용자 기반이 크고 버그가 즉시 수정됩니다.


Quickfix와 유사한 결과 탐색

용법:

Find my.regex

결과:

  • 새 탭이 열립니다
  • each line contains a relative path that matches a grep -E regex
  • hit:
    • <enter> or <C-w>gf to open the file on the current line in a new tab
    • gf to open the file on the current tab and lose the file list

Find all files instead:

Find

Alternative methods:

Code:

function! Find(cmd)
  let l:files = system(a:cmd)
  if (l:files =~ '^\s*$')
    echomsg 'No matching files.'
    return
  endif
  tabedit
  set filetype=filelist
      set buftype=nofile
  " TODO cannot open two such file lists with this. How to get a nice tab label then?
  " http://superuser.com/questions/715928/vim-change-label-for-specific-tab
  "file [filelist]
  put =l:files
  normal ggdd
  nnoremap <buffer> <Enter> <C-W>gf
  execute 'autocmd BufEnter <buffer> lcd ' . getcwd()
endfunction
command! -nargs=1 Find call Find("find . -iname '*'" . shellescape('<args>') . "'*'")
command! -nargs=1 Gfind call Find('git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Gtfind call Find('git rev-parse --show-toplevel && git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Locate call Find('locate ' . shellescape('<args>'))

Depending on your situation (that is, assuming the following command will find just a single file), perhaps use a command like:

:e `locate SomeUniqueFileName.java`

This will cause Vim to open, in the current tab (the e command) a file that is the result of running (in this example),

locate SomeUniqueFileName.java

여기서 마법은 명령 주위의 백틱으로, 쉘 명령의 출력을 Vim 명령에서 사용할 수있는 텍스트로 변환합니다.


이 기능에만 플러그인이 필요하지는 않습니다. 아래 코드 스 니펫이면 충분합니다.

function! FindFiles()
    call inputsave()
    let l:dir = input("Find file in: ", expand("%:p:h"), "dir")
    call inputrestore()
    if l:dir != ""
        call inputsave()
        let l:file = input("File name: ")
        call inputrestore()
        let l:nf = 'find '.l:dir.' -type f -iname '.l:file.' -exec grep -nH -m 1 ".*" {} \;'
        lexpr system(l:nf)
    endif
endfunction
nnoremap <silent> <leader>fo :call FindFiles()<CR>

플러그인을 사용하면 "경로"에서 파일을 재귀 적으로 찾을 수 있습니다 . 파일 이름에 대한 탭 완성도 지원합니다.


ag 도구와 해당 Ag vim 플러그인은이 문제를 완벽하게 해결합니다.

패턴을 사용하여 파일을 찾으려면 다음을 사용하십시오.

AgFile! pattern

선택할 수있는 결과가 포함 된 빠른 수정 창이 열립니다.

선택한 단어를 패턴으로 사용하여이 명령을 호출하도록 vim 키 바인딩을 추가 할 수 있습니다.

nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>

참고 URL : https://stackoverflow.com/questions/3554719/find-a-file-via-recursive-directory-search-in-vim

반응형