Vim 파일 탐색


90

지난 몇 년간 TextMate를 사용한 후 vim을 배우기 위해 정말 열심히 노력하고 있습니다.

파일 내 탐색 중 일부를 메모리에 적용하기 시작했지만 여러 파일 사이를 탐색하는 데 어려움을 겪고 있습니다.

내 워크 플로에서 꽤 자주 몇 개의 파일 사이를 전환하는 것이 일반적입니다 (분할 창 창이 너무 작아지는만큼의 파일).

나는 현재 NERDTree를 사용하고 있지만 디렉토리로 드릴 다운하는 것이 번거롭고 CTRL+ W h/ CTRL+ W l를 계속 사용하여 앞뒤로 이동합니다.

쉽게 전환 할 수있는 탭으로 더 잘할 수 있다고 생각하지만 다른 워크 플로를 사용해야 할 수도 있습니다.

또한 TextMate에서 CMD+ 와 같은 "파일로 이동 ..."바로 가기를 원합니다 T. 찾았 fuzzy_file_finder지만 vim이 Ruby 바인딩으로 빌드되어야합니다. 이것은 제가 작업 한 네이티브 설치의 경우가 아닙니다.

내가 vim으로 전환하고 싶은 주된 이유 는 다시 빌드 할 수 있지만 모든 플랫폼에서 쉽게 작업 할 수있는 하나의 편집기 환경을 가질 수 있기 때문입니다.

압도적 인 아이디어가있는 옵션은 대단히 감사합니다!


1
외부 보조 도구를 전혀 사용하지 않는 파일과 버퍼를 탐색하는 정말 만족스러운 방법을 찾지 못했습니다. 내장 된 것들은 꽤 나쁘다 (내 말은, 그 숫자에 의해 버퍼로 바뀐다는 말인가? 누가 임시 버퍼 번호를 기억하고 돌아
— 다니는지

1
@svend : 당신은뿐만 아니라 수의 이름으로 버퍼를 참조 할 수 있습니다 - 내 대답은 아래를 참조
— 데이브 커비

답변:


92

:e탭 완성을위한 적절한 구성을 고려할 때 그다지 번거 롭다는 평범한 이전 을 통해 하위 디렉토리로 드릴 다운하는 것을 찾지 못했습니다 .

'wildmenu'명령 줄 위의 모델 라인에서 Vim이 완성 목록 (파일 이름)을 표시하도록 하는 옵션을 살펴보십시오 . 'wildmode'옵션을 변경하여 Vim이 수행 할 탭 완성 유형을 추가로 구성 할 수 있습니다.

개인적으로 나는 :set wildmode=full.

내 작업 흐름은 다음과 같습니다.

  1. :cd 내 프로젝트의 최상위 디렉토리로.
  2. 파일 열기 foo/bar/baz:

    • 가장 간단한 시나리오 : :e f<tab>b<tab>b<tab><enter>.

    • 하나 개의 파일로 시작보다 더가있는 경우 b그 디렉토리 중 하나에 당신이해야 할 수도 있습니다 <left>하거나 <right>또는 다른 <tab>그들 사이에 이동 (또는 명확하게에 몇 글자를 입력) 할 수있는 키보드.

    • 최악의 시나리오에는 이름을 공유하는 파일과 디렉토리가 있으며 디렉토리로 드릴 다운해야합니다. 이 경우 디렉토리 이름을 탭으로 완성한 다음 입력 *<tab>하여 드릴 다운합니다.

  3. 2 개 또는 3 개의 창을 열고 필요에 따라 모든 창에서 파일을 엽니 다.
  4. 파일이 버퍼에서 열리면 버퍼를 죽이지 마십시오. 새 파일을 열 때 백그라운드에서 열어 둡니다. :e같은 창에 새 파일 만 있습니다.
  5. 그런 다음을 사용 :b <tab>하여 이미 백그라운드에서 열려있는 버퍼를 순환합니다. 입력 :b foo<tab>하면 일치하는 현재 열려있는 파일에 대해서만 일치 foo합니다.

또한 이러한 매핑을 사용하여 새 창을 더 쉽게 열고 창 사이를 이동할 수 있습니다. 자주하는 작업이기 때문입니다.

" Window movements; I do this often enough to warrant using up M-arrows on this"
nnoremap <M-Right> <C-W><Right>
nnoremap <M-Left> <C-W><Left>
nnoremap <M-Up> <C-W><Up>
nnoremap <M-Down> <C-W><Down>

" Open window below instead of above"
nnoremap <C-W>N :let sb=&sb<BAR>set sb<BAR>new<BAR>let &sb=sb<CR>

" Vertical equivalent of C-w-n and C-w-N"
nnoremap <C-w>v :vnew<CR>
nnoremap <C-w>V :let spr=&spr<BAR>set nospr<BAR>vnew<BAR>let &spr=spr<CR>

" I open new windows to warrant using up C-M-arrows on this"
nmap <C-M-Up> <C-w>n
nmap <C-M-Down> <C-w>N
nmap <C-M-Right> <C-w>v
nmap <C-M-Left> <C-w>V

Vim을 열고 몇 개의 창을 설정하고 그 안에 몇 개의 파일을 여는 데 몇 초가 걸립니다. 개인적으로 매우 유용한 타사 파일 검색 스크립트를 찾지 못했습니다.


4
멋진 설명을위한 모자 팁. Skillz ++에 대한 손가락의 흔들림은 이미 설명을 이해해야합니다.
— Mr. Baudin 2014-06-28

257

파일 시스템을 탐색하는 쉬운 방법은 다음 명령입니다.

:Sex

나는 이것을 구성하지 않는다 :)


14
그리고 도움을 보니 벡스도 훌륭합니다.
— jrwren

15
그리고 이것은 69 개의 ​​찬성표를 가지고 있습니다. 나는 그것을 바꿀 마음이 없다고 생각합니다.
— AlbeyAmakiir

3
그리고 :Vex당신은 화면을 수평으로 분할 수직으로 대신 할 경우
— sreenivas

1
와우, 이들 중 어느 것도 몰랐습니다. 나는 :Vex더 실용적인 것을 찾고 있지만 :Sex방금 하루를 보냈습니다.
— William Robertson

2
기록을 위해 :Se도 작동합니다 ( Ve, Te변형에 대해서도 동일 ). 이상하게 만들 필요가 없습니다. :)
— towc

47

:Sex, :Vex, :Tex그리고 :Ex당신이에서 뭔가 다른를 사용하려면 시스템에있는 파일을 (ploring) 전 대한 모든 유용한 명령:e

( S/V/TSplit / Vertical / Tab의 약자)


7

아직 찾지 못했다면 다음을 확인해보십시오.

  • 원래 퍼지 파인더 플러그인-IIRC에는 Ruby 바인딩 문제가 없습니다.
  • 프로젝트 플러그인-NERDTree와 유사
  • 버퍼 탐색기 플러그인-열린 버퍼 목록을 표시합니다.

또한 .vimrc에서 키 단축키를 다시 매핑하여 번거 로움을 줄일 수 있습니다. 분할 창을 많이 사용합니다. 나는 다음이 그것들을 훨씬 쉽게 다룰 수 있음을 발견했습니다.

" set your own personal modifier key to something handy
let mapleader = "," 

" use ,v to make a new vertical split, ,s for horiz, ,x to close a split
noremap <leader>v <c-w>v<c-w>l
noremap <leader>s <c-w>s<c-w>j
noremap <leader>x <c-w>c

" use ctrl-h/j/k/l to switch between splits
map <c-j> <c-w>j
map <c-k> <c-w>k
map <c-l> <c-w>l
map <c-h> <c-w>h

5

쉽게 전환 할 수있는 탭으로 더 잘할 수 있다고 생각하지만 다른 워크 플로를 사용해야 할 수도 있습니다.

Vim의 탭을 알고 계십니까? Vim의 자체 탭을 언급했는지 또는 TextMate에 고정했는지 확실하지 않습니다. 사용중인 Vim 버전은 확실하지 않지만 7.0 이상 (최근 내가 보는 모든 곳에 설치되어있는 것 같음) 이후 탭이 있으며 훌륭합니다.

:tabe새 탭을 엽니 다 ( "탭 편집"의 약자, 예 :tabe를 들어 비어 있거나 :tabe path/to/file새 탭에서 파일을 여는 경우). gt/를 사용 하여 인접한 탭 사이를 이동할 수 gT있으며 다른 탭 관련 탐색 명령도 있습니다. Vim ( :help tabs) 에서 기대할 수 있습니다.

대규모 프로젝트에 대한 내 워크 플로에는 필요한 컨텍스트의 종류에 따라 각각 1 ~ 3 개의 창이있는 여러 개의 탭이 포함되는 경향이 있습니다. 를 사용하여 수직으로 분할 할 수 있기 때문에 더블 와이드 터미널 창이있는 경우 더 잘 작동 :vs하므로 단일 탭은 각각에 충분한 공간이있는 4 개의 파일을 한 번에 쉽게 표시 할 수 있습니다.

마지막 팁 : 나는 가끔 "switch buffer"명령 ( :sb <partial_buf_name>)을 사용하는데, 이것은 TM의 퍼지 발견과 비슷합니다. 그것은 꽤 잘 작동하지만 이미 열려있는 버퍼에 대해서만 작동한다는 점입니다. 한 번에 열 개 이상의 파일을 열 때 여전히 좋습니다. (NB :set switchbuf=usetab내 vimrc에서 이것이 탭에서 작동해야했지만 일단 설정되면 훌륭합니다.)


1
탭에 대한 나의 이해는 이것이 실제로 각 탭에서 하나의 버퍼를 여는 방법이 아니라 레이아웃 보존기에 가깝다는 것입니다 ( "효과적인 텍스트 편집의 7 가지 습관"비디오에서 Bram Molenaars의 탭보기를 확인하십시오.
— Svend

그런 다음 자신에게 적합한 명령을 찾았 으면 키에 바인딩 할 수 있습니다. 열린 버퍼 (Firefox)간에 컨트롤 탭 전환이 있지만 대신 탭을 전환 할 수 있습니다.
— Jonathan Hartley

vim-titlecasegt / gT 매핑이있는 나사가 있지만 해결 방법이 있습니다 .
— naught101

5

지금까지 LustyExplorer 가 최고 라고 생각 합니다.

이름의 일부만 입력하여 파일을 열 수 있습니다.

현재 파일의 디렉토리, 현재 pwd, 또는 버퍼 목록에서 파일을 열 수 있습니다 .

버퍼 목록에서 파일을 열면 디렉토리 트리를 탐색 할 필요가 없습니다. 불행히도 다른 두 모드의 경우 여전히 트리를 탐색해야합니다. 좋은 점은 첫 번째 캐릭터부터 시작할 필요가 없다는 것입니다.

당신이 가지고 있다면:

dir_a/
    ...
dir_b/
    file.js
    file.html

열려면 dir_b/file.html일반적으로 다음을 입력하여 찾을 수 있습니다.b<Tab>h


이 멋진 애드온을 확장했습니다. svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff 기본적으로로드 여부에 관계없이 최근에 사용한 파일의 이름 만 입력 할 수 있습니다. 즉, 처음으로 파일을 열 때 FS를 찾아보기 만하면됩니다.
— Svend

4

:find어떤 대답에도 명령이 언급되지 않은 것을 보는 것은 놀랍습니다 . 저는 보통 디렉토리 계층 구조를 자세히 살펴 봐야하는 rails 프로젝트에서 작업합니다. 따라서 파일의 application.css경우 app/assets/stylesheets/입력해야 할 것은 탭 을 :find applica눌러 자동 완성하고 Enter 키 를 눌러 엽니 다.


3

플러그인 Command-T 대신 플러그인 ctrlp 를 확인하십시오 . '네이티브'Vim 스크립트이고 매우 빠르고 눈에 거슬리지 않게 실행되는 동안 Vim을 루비 (또는 기타 지원)로 컴파일 할 필요가 없다는 점에서 이보다 낫습니다.


2

원하는 파일이 이미 버퍼에로드 된 경우 (정기적으로 몇 개의 파일 사이를 전환하는 경우) :b[uffer]명령 을 사용하여 신속하게 버퍼로 전환 할 수 있습니다 .

:b버퍼 번호를 매개 변수로 사용하거나 (더 유용하게는) 경로 / 파일 이름의 일부 와 일치하는 문자열을 사용할 수 있습니다. 일치하는 항목이 여러 개인 경우 탭을 사용하여 순환 할 수 있습니다.

창을 분할하고 새 창에서 버퍼를 열려면 다음을 사용하십시오. :sb name

새 탭에서 버퍼를 열려면 다음을 사용하십시오. :tab b name

:ls명령을 사용하여 현재로드 된 버퍼 목록을 볼 수도 있습니다 .


1

이 함수는 하위 디렉터리에서 파일을 찾는 데 사용하지만 작성하지는 않았습니다. vim 위키 에서 왔습니다 .

함수! 찾기 (이름)
    let l : list = system ( "find. -name '".a : name. "'| grep -v \". svn / \ "| perl -ne 'print \"$. \\ t $ _ \ "' ") 
    let l : num = strlen (substitute (l : list, "[^ \ n]", "", "g")) 
    만약 l : num 0 
            echo "숫자가 아님" 
            반환 
        endif 
        l : inputl : num 인 경우 
            echo "범위를 벗어남" 
            반환 
        endif 
        let l : line = matchstr ( "\ n".l : list, "\ n".l : input. "\ t [^ \ n] *") 
    그밖에 
      l : line = l : list하자 
    endif 
    let l : line = substitute (l : line, "^ [^ \ t] * \ t. /", "", "") 
    ": e".l : line 실행 
끝 기능 

명령! -nargs = 1 Find : call Find ( "")

내가 좋아하는 한 가지는 와일드 카드 (*)를 지원한다는 것입니다. 또한 여러 경기에 대해 잘 작동합니다.


1

wildmenu답변 외에도 BufExplorer 플러그인과 다음 매핑을 사용하여 버퍼를 빠르게 점프합니다.

nmap <A-1> :b 1<CR>
nmap <A-2> :b 2<CR>
nmap <A-3> :b 3<CR>
...
nmap <A-0> :b 10<CR>
nmap <A-=> \bs

또는 :ls기본적으로 동일한 내용을 표시하는 명령으로 버퍼 탐색기를 대체 할 수 있습니다 .

마지막 Alt-=것은 버퍼 탐색기를 표시하기 위해 매핑합니다 .

일반적으로 하나 또는 두 개의 창이 있기 때문에 Windows를 많이 사용하지 않습니다.

또한 statusline버퍼 번호를 포함 하도록을 수정하여 %2n편집중인 버퍼를 항상 알 수 있도록했습니다. 보다:h statusline




0

여기에 .vimrc. 모든 하위 디렉토리에서 파일을로드합니다.

" load from an unspecified subdirectory 
function! LoadFromSubdirectory(filespec) 
  let filename = glob("`find . -name '" . a:filespec . "' -print`") 
  exe ':e '.filename 
endfunction 
:command -nargs=1 Er :call LoadFromSubdirectory(<f-args>) 

그래서 저는 다음과 같이 말할 수 있습니다.

: Er Main.java

하위 디렉터리를 검색하고 찾아서 Main.java로드합니다. 같은 이름의 여러 파일에 대해서는 잘 작동하지 않지만 빠르고 간단합니다.

내가 사용하는 다른 도구 는 파일 / 디렉토리의 트리 기반 창을 제공하는 VTreeExplorer 이며 VIM의 특별한 빌드 옵션이 필요하지 않습니다 (즉, 바닐라 플러그인).


하위 디렉토리에서로드 할 수 있기를 원하지만 여러 파일 문제는 저에게 거래 차단기가 될 것입니다. 나는 일반적으로 하위 디렉토리의 무리 그래서 나는 모든이를 가지고, 장고 개발자입니다 models.py, views.py등
— 피트

0

파일을 찾기위한 내 워크 플로우는 wildmenu, autocwd 및 :e.

관련 부분 .vimrc:

set wildmenu
set wildignore=*.dll,*.o,*.pyc,*.bak,*.exe,*.jpg,*.jpeg,*.png,*.gif
set wildmode=list:full
set autochdir
let g:netrw_list_hide='^\.,.\(pyc\|pyo\|o\)$'

그리고 그것을 사용하는 방법 :

:e myf^D

그러면 myf로 시작하는 현재 디렉토리의 모든 파일이 제공됩니다. <Tab>그것들 을 통해서도 가능합니다. 반환을 사용하여 열기 :)

^D항상 당신에게 모든 성냥을 줄 것입니다. autocmd는 항상 현재 파일의 폴더로 이동하기 때문에 작업하기 쉽습니다. 당신은에 있다면 foo/bar.py당신이 가고 싶은 foo/baz.py당신은 할 :e baz.py당신은 거기에가있어. 그것은 또한 버퍼와 함께 작동합니다 ( :b foo^Dfoo로 시작하는 모든 버퍼를 나열합니다)


다른 디렉토리로 이동하는 것은 어떻습니까? 예를 들어, 저는 종종 다른 하위 디렉토리에있는 Python보기, HTML 템플릿 및 JavaScript 파일간에 작업을합니다. TextMate에서 파일 이름을 입력하기 시작하면 "프로젝트"(일명 cwd)의 모든 일치 항목이 표시됩니다.
— Pete

하위 폴더로 재귀하지 않습니다. 하지만 제 작업 흐름을 그것에 맞게 조정했습니다. 또한 파일을 열면 버퍼의 이름을 언급 할 수 있으며 괜찮습니다. Vim에게 열린 버퍼를 기억하도록 지시하면 일반적으로 해당 기능이 전혀 필요하지 않습니다.
— Armin Ronacher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.