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


84

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



@E_Jovi 吊은 무슨 뜻인가요?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 중국에서 금지 된 것을 표현하는 당신의 이름을 의미합니다.
E_Jovi

1
@E_Jovi 그러나 吊은 무엇을 의미합니까? 내 Chinsese를 향상시키기 위해 :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

2
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 대부분의 다른 사람들은 할 수없는 동안 당신이 뭔가를하는 것을 의미합니다. , 경멸적인 용어로, 사람에 대한 존중이 부족한 방식으로 말하거나 행동하는 것을 표현합니다.
E_Jovi

답변:


108

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

:e **/test/Suite.java

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

또 다른 트릭은

:r! find . -type f

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


1
+1 편집 명령에서 와일드 카드를 시도한 적이 없습니다. 와일드 모드에서도 잘 작동합니다. 따라서 다음을 입력 할 수 있습니다. : e ** / Suite <tab> 그리고 모두 가능한 파일 목록을 갖게됩니다.
mb14

6
복잡한 디렉토리 구조를 가진 대용량 파일 모음에 대해 매우주의하십시오. 이 명령은 vim을 매우 오랫동안 중단시킬 수 있습니다. 내 코드베이스에서는 이미 20 분 동안 검색 중입니다. 문제가되는 것은 그것을 막을 방법이 없다는 것입니다. 일반적인 Ctrl + C 및 Ctrl + Break를 시도했습니다. Procmon은 vim이 여전히 내 파일을 검색하고 있음을 보여줍니다. 그래서 해결책은 모든 사람을위한 것이 아닙니다 :(
evpo

1
@evpo 나는 같은 문제가 있었다. 폴더 수를 줄이기 위해 검색 경로의 첫 번째 부분을 제공하여 해결했습니다. : e dir / ** / File.java. 그런 다음 1 초도 채 걸리지 않았습니다.
user79878

1
어떻게 내가 이것에 대해 몰랐 을까? 저는 20 년 이상 vim을 사용해 왔습니다. Just amazing 👏🏼👏🏼👏🏼
Bradley

1
맙소사!
Funkodebat

50

찾기 명령이 있습니다. 추가 **(참조 :help starstar)하면 'path'재귀 적으로 검색 할 수 있습니다.

:set path

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

:set path+=**

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

:find myfile.txt

마법처럼 열립니다!

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


1
파일 이름이 너무 길면이 방법이별로 편하지 my*.txt않습니까? 아니면 그렇게 합니까?
Shrikant Sharat

1
예, * 와일드 카드를 사용할 수 있습니다. 참조하십시오 :h find.
Tae

12
또한 수행하여 경로에 추가 할 수 있습니다:set path+=**
alanboy

vimrc에 유사한 논리를 추가하는 데 위험이 있습니까? CC의 @alanboy
iamnotsam

21

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

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

여기에 이미지 설명 입력

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

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


5
kien / ctrlp.vim은 유지되지 않는 것 같습니다. 합의가 사용할 수있을 것 같습니다 ctrlpvim / ctrlp.vim 포크, 적극적으로 유지 될 나타나는 : github.com/ctrlpvim/ctrlp.vim
데미안 Ó Ceallaigh

4
fzf는 ctrlp와 매우 유사합니다. 더 빠르고 결과를 더 잘 정렬합니다. Vim 외부에서도 작동하지만 Vim 지원 기능이 내장되어 있습니다. github.com/junegunn/fzf
still_dreaming_1

6

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



3

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


그리고 ctrlp.vim도 있습니다.
Chris

2

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

:! find . -name *.xml

2

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

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

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

보시다시피

여기에 이미지 설명 입력

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

CTRL+R

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

fzf

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

:CommandT 

정말 강력하고 빠릅니다.


command-t도 필요하지 않습니다. FZF와 관련 Vim 플러그인 github.com/junegunn/fzf.vim
icc97

1
이 문제를 제기 해 주셔서 감사합니다. 나는 vundle과 함께 설치하지만 그것이 있다는 것을 결코 모릅니다. 느리지 만 꾸준하게 VS 코드를 떠납니다. :). CLI 히어로가되는 것은 굉장합니다!
Benyamin Limanto

1

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

여기에 그들을 사용하는 방법에 대한 자습서가 있습니다. http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search

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

:!find ...

grep, lgrep, vimgrep 또는 lvimgrep는 어떻게 이것을 할 수 있습니까? 파일이 아닌 파일에서 검색합니다.
kroiz 2017-04-20

사용하여 실시 예를 들어 그렙 시험 * / 된 .java
니콜 그라드 올

이것은 파일 이름 .java에서 test라는 단어를 찾지 않습니까? 설명해 주시겠습니까? 나는 그것을 작동시킬 수 없었다.
kroiz 2017-04-22

@kroiz, yes :grep test */.javatest모든 .java파일 에서 단어 를 검색 합니다. 쉘 명령을 :!find사용하여 find파일을 찾습니다. find당신이 PCRE 또는 확장 정규식와 결합하면 쉘 명령은 매우 강력하다
alpha_989

1

아무도 Unite.vim을 언급하지 않아서 놀랐습니다.아직 않은 .

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


1

Quickfix와 유사한 결과 탐색

용법:

Find my.regex

결과:

  • 새 탭이 열립니다
  • 각 줄에는 grep -E 정규식
  • 히트:
    • <enter> 또는 <C-w>gf 새 탭에서 현재 줄의 파일을 열려면
    • gf 현재 탭에서 파일을 열고 파일 목록을 잃어 버리려면

대신 모든 파일 찾기 :

Find

대체 방법 :

암호:

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>'))

1

상황에 따라 (즉, 다음 명령이 단일 파일 만 찾는다고 가정) 다음과 같은 명령을 사용할 수 있습니다.

:e `locate SomeUniqueFileName.java`

이렇게하면 Vim이 현재 탭 (e 명령)에서 실행 결과 (이 예에서) 파일이 열립니다.

locate SomeUniqueFileName.java

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


1

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

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>

사용 방법 예를 추가해주세요.
Vitaly Zdanevich

1

운영:

:args `find . -name '*xml'`

Vim은 백틱으로 쉘 명령을 실행하고 파일 목록을 arglist에 넣고 첫 번째 파일을 엽니 다. 그럼 당신은 사용할 수 있습니다 :args아글리스트 (즉,이 파일이 발견 목록) 등을 볼 수 :n:N아글리스트에있는 파일을 통해 앞으로 bacwards 이동합니다. 참조 https://vimhelp.org/editing.txt.html#%7Barglist%7Dhttps://vimhelp.org/editing.txt.html#backtick-expansion


0

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


0

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.