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.