Điều hướng tệp Vim


90

Tôi đang rất cố gắng học vim sau khi sử dụng TextMate trong vài năm qua.

Tôi đã bắt đầu thực hiện một số điều hướng trong tệp vào bộ nhớ nhưng tôi đang gặp khó khăn với việc điều hướng giữa nhiều tệp.

Trong quy trình làm việc của tôi, khá phổ biến là tôi thường xuyên lật giữa một số tệp khá thường xuyên (đủ tệp khiến các cửa sổ chia ngăn trở nên quá nhỏ).

Tôi hiện đang sử dụng NERDTree nhưng thấy việc đi sâu vào các thư mục rất cồng kềnh cũng như liên tục sử dụng CTRL+ W h/ CTRL+ W lđể nhảy qua lại.

Tôi nghĩ tôi sẽ làm tốt hơn với các tab mà tôi có thể dễ dàng chuyển đổi giữa các tab nhưng có lẽ tôi cần sử dụng quy trình làm việc khác.

Tôi cũng muốn có lối tắt "Đi tới Tệp ..." như CMD+ Ttrong TextMate. Tôi đã tìm thấy fuzzy_file_findernhưng nó yêu cầu vim phải được xây dựng bằng các ràng buộc Ruby, đây không phải là trường hợp cài đặt gốc mà tôi đã làm việc.

Mặc dù tôi có thể xây dựng lại lý do chính mà tôi muốn chuyển sang vim là để tôi có thể có một môi trường biên tập viên mà tôi biết sẽ dễ dàng hoạt động trên mọi nền tảng.

Các tùy chọn ngoài kia áp đảo bất kỳ ý tưởng nào được đánh giá cao!


1
Tôi đã không tìm thấy một cách thực sự thỏa đáng để điều hướng các tệp và bộ đệm, mà hoàn toàn không sử dụng hỗ trợ bên ngoài. Việc xây dựng trong công cụ này là xấu khá (Ý tôi là, thay đổi để một bộ đệm bằng số của nó Ai đi xung quanh nhớ số bộ đệm tạm thời ...?)
Svend

1
@svend: bạn có thể tham khảo bộ đệm theo tên cũng như số - xem câu trả lời của tôi bên dưới
Dave Kirby

Câu trả lời:


92

Tôi không tìm thấy việc đi sâu vào các thư mục con thông qua đơn giản cũ :elà cồng kềnh với một cấu hình phù hợp để hoàn thành tab.

Xem xét 'wildmenu'tùy chọn để Vim hiển thị danh sách các hoàn thành (tên tệp) trong modeline phía trên dòng lệnh. Bạn có thể thay đổi 'wildmode'tùy chọn để định cấu hình thêm kiểu hoàn thành tab mà Vim sẽ thực hiện.

Cá nhân tôi sử dụng :set wildmode=full.

Quy trình làm việc của tôi như sau:

  1. :cd vào thư mục toplevel của dự án của tôi.
  2. Để mở tệp foo/bar/baz:

    • Kịch bản đơn giản nhất: loại :e f<tab>b<tab>b<tab><enter>.

    • Nếu có nhiều hơn một tập tin bắt đầu với bmột trong những thư mục bạn có thể phải làm một <left>hoặc <right>hay cách khác <tab>trên bàn phím để di chuyển giữa chúng (hoặc gõ một vài chữ cái hơn để disambiguate).

    • Trường hợp xấu nhất có các tệp và thư mục dùng chung tên và bạn cần đi sâu vào thư mục. Trong trường hợp này, hãy điền tên thư mục vào tab và sau đó nhập *<tab>để xem chi tiết.

  3. Mở 2 hoặc 3 cửa sổ và mở các tệp trong tất cả chúng nếu cần.
  4. Khi một tệp được mở trong bộ đệm, đừng giết bộ đệm. Để nó ở chế độ nền khi bạn mở các tệp mới. Chỉ :elà một tệp mới trong cùng một cửa sổ.
  5. Sau đó, sử dụng :b <tab>để chuyển qua các bộ đệm đã mở ở chế độ nền. Nếu bạn nhập, :b foo<tab>nó sẽ chỉ khớp với các tệp hiện đang mở khớp foo.

Tôi cũng sử dụng các ánh xạ này để giúp mở các cửa sổ mới và chuyển đổi giữa chúng dễ dàng hơn vì đó là việc tôi làm rất thường xuyên.

" 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

Tôi mất vài giây để mở Vim, thiết lập một số cửa sổ và mở một vài tệp trong đó. Cá nhân tôi chưa bao giờ thấy bất kỳ tập lệnh duyệt tệp nào của bên thứ ba là rất hữu ích.


4
Mẹo của chiếc mũ cho kỳ nghỉ tuyệt vời. Wag of the finger for skillsz ++, bạn đã cần phải hiểu cách giải thích.
Ông Baudin

257

Một cách dễ dàng để duyệt qua hệ thống tệp là lệnh:

:Sex

Tôi không bịa ra chuyện này :)


14
và từ sự trợ giúp, tôi thấy rằng: Vex cũng rất tuyệt.
jrwren

15
Và điều này có 69 lượt ủng hộ. Tôi không nghĩ mình có đủ tâm huyết để thay đổi điều đó.
AlbeyAmakiir

3
:Vexnếu bạn muốn chia màn hình theo chiều dọc thay vì ngang
sreenivas

1
Wow, không bao giờ biết một trong hai điều này. Tôi thấy :Vexthực tế hơn, nhưng :Sexchỉ làm cho ngày của tôi.
William Robertson

2
đối với bản ghi, :Secũng hoạt động (tương tự đối với các Ve, Tebiến thể). Không cần phải làm cho nó kỳ lạ :)
towc

47

:Sex, :Vex, :Tex:Exlà tất cả các lệnh hữu ích cho ex (ploring) các tập tin trên hệ thống của bạn nếu bạn muốn sử dụng một cái gì đó khác biệt so với:e

( S/V/Tviết tắt của Split / Vertical / Tab)


7

Nếu bạn chưa tìm thấy chúng, bạn có thể muốn xem:

  • plugin công cụ tìm mờ ban đầu - mà IIRC không có các vấn đề liên kết Ruby
  • plugin Dự án - tương tự như NERDTree
  • plugin khám phá bộ đệm - hiển thị danh sách các bộ đệm đang mở

Cũng nên nhớ rằng bạn có thể sửa lại các phím tắt trong .vimrc của mình để làm cho chúng bớt rườm rà hơn. Tôi sử dụng các cửa sổ chia nhỏ rất nhiều; Tôi thấy những điều sau đây làm cho việc đối phó với chúng dễ dàng hơn nhiều:

" 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

Tôi nghĩ rằng tôi sẽ làm tốt hơn với các tab mà tôi có thể dễ dàng chuyển đổi giữa các tab, nhưng có lẽ tôi cần sử dụng một quy trình làm việc khác.

Bạn có biết các tab của Vim không? Không chắc bạn đang đề cập đến các tab riêng của Vim ở đó hay chuyển hướng cho TextMate. Không rõ bạn đang sử dụng phiên bản Vim nào nhưng nó có các tab từ ít nhất là 7.0 (dường như được cài đặt ở mọi nơi tôi nhìn gần đây) và chúng thật tuyệt vời.

:tabemở một tab mới (viết tắt của "chỉnh sửa tab", ví dụ: :tabetrống hoặc :tabe path/to/fileđể mở tệp trong tab mới,) bạn có thể di chuyển giữa các tab liền kề với gt/ gTvà cũng có một loạt lệnh điều hướng liên quan đến tab, như bạn có thể mong đợi từ Vim ( :help tabs)

Quy trình làm việc của tôi cho các dự án lớn có xu hướng liên quan đến nhiều tab, mỗi tab có từ 1 đến 3 cửa sổ tùy thuộc vào loại ngữ cảnh mà tôi cần. Điều này thậm chí còn hoạt động tốt hơn nếu tôi có cửa sổ đầu cuối kép vì tôi có thể chia theo chiều dọc :vs, vì vậy một tab đơn có thể dễ dàng hiển thị cho tôi 4 tệp cùng lúc với nhiều chỗ cho mỗi tệp.

Mẹo cuối cùng: Đôi khi tôi sử dụng lệnh "switch buffer" ( :sb <partial_buf_name>) giống như cách tìm mờ của TM, ở chỗ nó hoạt động khá tốt nhưng chỉ dành cho các bộ đệm đã mở. Vẫn tuyệt vời khi tôi mở hàng chục tệp trở lên cùng một lúc. (Không, tôi cần phải có :set switchbuf=usetabtrong vimrc của mình để cái này hoạt động trên các tab, nhưng khi đã thiết lập thì thật tuyệt.)


1
Sự hiểu biết của tôi về các tab là nó giống như một trình bảo vệ bố cục, không thực sự là một phương pháp mở một bộ đệm trong mỗi tab (hãy xem các quan điểm riêng của Bram Molenaars về các tab trong video "7 thói quen chỉnh sửa văn bản hiệu quả".
Svend

Sau đó, khi bạn đã tìm ra các lệnh như thế này phù hợp với mình, bạn có thể liên kết chúng với một khóa. Tôi có điều khiển tab lật giữa các bộ đệm đang mở (một firefox), nhưng bạn có thể chuyển đổi các tab.
Jonathan Hartley

vim-titlecasevít với ánh xạ gt / gT, nhưng có một công việc xung quanh .
naught101

5

Tôi thấy LustyExplorer là tốt nhất cho đến nay.

Bạn có thể mở tệp bằng cách chỉ nhập một phần tên của tệp đó.

Bạn có thể mở một tệp từ thư mục của tệp hiện tại hoặc tệp hiện tại pwdhoặc từ danh sách bộ đệm.

Nếu bạn mở một tệp từ danh sách bộ đệm, bạn không phải điều hướng qua cây thư mục, mặc dù không may cho hai chế độ còn lại, bạn vẫn phải điều hướng qua cây. Điều tốt là bạn không cần phải bắt đầu từ ký tự đầu tiên.

Nếu bạn có:

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

và bạn muốn mở, dir_b/file.htmlbạn thường có thể tìm thấy nó bằng cách gõb<Tab>h


Tôi đã tạo một số tiện ích mở rộng cho addon tuyệt vời này. svendtofte.com/wp-content/uploads/2009/08/… svendtofte.com/other/vim-stuff Về cơ bản cho phép tôi chỉ nhập tên của một tệp được sử dụng gần đây, cho dù nó đã được tải hay chưa không quan trọng. Điều này có nghĩa là bạn chỉ cần duyệt FS khi mở tệp lần đầu tiên.
Svend 20/09/09

4

Thật ngạc nhiên khi thấy :findlệnh đó không được đề cập trong bất kỳ câu trả lời nào. Tôi thường làm việc với các dự án đường ray mà tôi cần đi sâu vào phân cấp thư mục. Vì vậy, đối với một tệp application.css, nằm trong app/assets/stylesheets/tất cả những gì tôi phải nhập :find applicavà sau đó nhấn tab để tự động hoàn thành và enter để mở.


3

Kiểm tra plugin ctrlp thay thế cho plugin Command-T . Nó tốt hơn điều này ở chỗ nó là một tập lệnh Vim 'nguyên bản' và không cần Vim được biên dịch với ruby ​​(hoặc hỗ trợ khác) trong khi nó chạy rất nhanh và không phô trương.


2

Nếu tệp bạn muốn đã được tải vào bộ đệm (có thể xảy ra nếu bạn thường xuyên lật giữa một số tệp) thì bạn có thể nhanh chóng chuyển sang bộ đệm bằng :b[uffer]lệnh.

:bcó thể lấy số đệm làm tham số hoặc (hữu ích hơn) một chuỗi khớp với một phần của đường dẫn / tên tệp. Nếu có nhiều kết quả phù hợp, bạn có thể sử dụng tab để chuyển qua chúng.

Nếu bạn muốn tách cửa sổ và mở bộ đệm trong cửa sổ mới thì hãy sử dụng :sb name

Nếu bạn muốn mở bộ đệm trong một tab mới thì hãy sử dụng :tab b name

Bạn cũng có thể sử dụng :lslệnh để xem danh sách các bộ đệm hiện đang được tải.


1

Tôi sử dụng chức năng này để tìm tệp trong thư mục con, mặc dù vậy tôi đã không viết nó. Nó từ wiki vim :

chức năng! Tìm (tên)
    let l: list = system ("find. -name '" .a: name. "' | grep -v \". svn / \ "| perl -ne 'print \" $. \\ t $ _ \ "' ") 
    let l: num = strlen (thay thế (l: list, "[^ \ n]", "", "g")) 
    nếu l: num 0 
            echo "Không phải số" 
            trở về 
        endif 
        nếu l: inputl: num 
            echo "Ngoài phạm vi" 
            trở về 
        endif 
        let l: line = matchstr ("\ n" .l: list, "\ n" .l: input. "\ t [^ \ n] *") 
    khác 
      let l: line = l: list 
    endif 
    let l: line = Replace (l: line, "^ [^ \ t] * \ t. /", "", "") 
    thực thi ": e" .l: dòng 
chức năng cuối cùng 

chỉ huy! -nargs = 1 Tìm: gọi Tìm ("")

Một điều tôi thích là nó có hỗ trợ cho các ký tự đại diện (*). Nó cũng hoạt động tốt cho nhiều trận đấu.


1

Ngoài các wildmenucâu trả lời, tôi sử dụng plugin BufExplorer và các ánh xạ sau để nhanh chóng nhảy bộ đệm:

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

Hoặc bạn chỉ có thể thay thế trình khám phá bộ đệm bằng :lslệnh, về cơ bản sẽ hiển thị cùng một thứ.

Bản đồ cuối cùng Alt-=để hiển thị trình khám phá bộ đệm.

Tôi không sử dụng Windows nhiều, vì tôi thường chỉ có một hoặc hai cửa sổ.

Tôi cũng đã sửa đổi statuslineđể bao gồm số bộ đệm %2n, để tôi luôn biết bộ đệm nào đang được chỉnh sửa. Xem:h statusline




0

Đây là một cái gì đó khá tầm thường mà tôi dính vào .vimrc. Nó sẽ tải một tệp từ bất kỳ thư mục con nào.

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

Vì vậy, tôi chỉ có thể nói:

: Er Main.java

và nó sẽ tìm kiếm các thư mục con, tìm Main.javavà tải nó. Nó không hoạt động tốt cho nhiều tệp cùng tên, nhưng nó nhanh chóng và đơn giản.

Công cụ khác mà tôi sử dụng là VTreeExplorer , cung cấp một cửa sổ tệp / thư mục dựa trên cây và không yêu cầu bất kỳ tùy chọn xây dựng đặc biệt nào từ VIM (tức là đó là một plugin vani).


Tôi muốn có thể tải từ một thư mục con, nhưng vấn đề nhiều tệp sẽ là một yếu tố phá vỡ thỏa thuận đối với tôi. Tôi là một nhà phát triển Django, vì vậy tôi thường có một loạt các thư mục con mà tất cả đều có models.py, views.pyvv
Pete

0

Luồng công việc của tôi để tìm tệp là menu đại diện, tự động và :e.

Các bộ phận liên quan trong .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\)$'

Và cách sử dụng nó:

:e myf^D

Điều đó cung cấp cho tất cả các tệp trong thư mục hiện tại bắt đầu bằng myf. Bạn cũng có thể <Tab>thông qua chúng. Sử dụng quay lại để mở :)

^Dsẽ luôn cung cấp cho bạn tất cả các trận đấu. Bởi vì autocmd luôn đi đến thư mục của tệp hiện tại nên rất dễ làm việc. Nếu bạn đang ở trong foo/bar.pyvà bạn muốn đến foo/baz.pythì chỉ có bạn làm :e baz.pyvà bạn ở đó. Điều đó cũng hoạt động với bộ đệm ( :b foo^Dliệt kê tất cả các bộ đệm bắt đầu bằng foo)


Làm thế nào về việc truy cập các thư mục khác? Ví dụ: tôi thường làm việc giữa chế độ xem Python, mẫu HTML và các tệp JavaScript, tất cả đều nằm trong các thư mục con khác nhau? Trong TextMate, tôi bắt đầu nhập tên của tệp và tất cả các kết quả trùng khớp trong "dự án" (còn gọi là cwd) của tôi sẽ hiển thị.
Pete

Nó không đệ quy thành các thư mục con, không. Nhưng tôi đã điều chỉnh quy trình làm việc của mình theo đó. Ngoài ra khi tôi mở tệp, tôi chỉ có thể đề cập đến tên của bộ đệm và ổn. Bạn có thể yêu cầu Vim nhớ các vùng đệm đang mở, sau đó bạn thường không cần tính năng đó.
Armin Ronacher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.