vim, chuyển đổi nhanh chóng giữa các tệp bằng vani Vim (không có plugin)


103

Tôi hiểu rằng việc giới hạn bản thân với vanilla Vim (không sử dụng plugin) sẽ hạn chế sức mạnh của trình chỉnh sửa, nhưng khi tôi thường xuyên chuyển đổi giữa các máy khác nhau, thường quá khó khăn khi di chuyển môi trường của tôi khắp nơi. Tôi muốn ở lại vani Vim.

Một điều gì đó khiến tôi trở lại là khả năng chuyển đổi nhanh chóng giữa các tệp. I (tin ít nhất) có một hiểu biết tốt về bộ đệm , cửa sổ , các tab , cũng như netrw ( Vex, Ex, vv).

Nhưng trong một trình soạn thảo chẳng hạn như Sublime Text , tôi có thể chỉ cần nhập ctrl- pvà ngay lập tức tôi có mặt tại tệp.

Tôi biết rằng tôi có thể thả xuống trình bao, nhưng tôi tự hỏi liệu có bí mật "ẩn" nào khác để chuyển đổi nhanh chóng giữa các tệp trong Vim không chỉ dựa trên tên tệp.


2
Này không trả lời câu hỏi của bạn, nhưng nó có thể thuyết phục bạn để xem xét sử dụng plugin: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood

Cá nhân tôi đồng bộ cài đặt của mình với Dropbox. Nó vụng về nhưng nó ít nhiều hoạt động mà không cần phải suy nghĩ về nó. Một plugin mà tôi sử dụng và biết hoạt động tốt cho những gì bạn muốn là Command-T ( github.com/wincent/Command-T ). Ctrl-P có thể là một sự thay thế ( vim.org/scripts/script.php?script_id=3736 ).
FX

1
Bạn đã xem danielmiessler.com/study/vim chưa? Anh ấy thực hành rất thông minh khi đưa vimrc + tất cả các plug-in mà anh ấy cần vào Github ... ở bất cứ đâu anh ấy đến, anh ấy có thể sao chép nó và thì đấy, Vim chính xác như anh ấy thích. Brilliant
bobox

6
@bobox, hàng chục nghìn người làm điều đó; không có gì phi thường về điều đó.
romainl

Câu trả lời:


236

Tương đương gần nhất ("gần nhất", không phải "chính xác") với ST2's Ctrl+ Plà một plugin được gọi là, hãy sẵn sàng… CtrlP . Có các plugin tương tự khác như Command-T hoặc FuzzyFinder .

Tôi sử dụng CtrlP và tôi thích nó nhưng tôi hết lòng ủng hộ quyết định của bạn để sử dụng "plugin-free". Nó không phải là cách dễ dàng nhất để đi nhưng nó sẽ mang lại hiệu quả về lâu dài.


Mở tệp

Cách cơ bản nhất để mở một tệp là :e /path/to/filename. Rất may, bạn nhận được hoàn thành tab và ký tự đại diện: cổ điển *và đặc biệt,** , viết tắt của "bất kỳ thư mục con nào".

Kết hợp tất cả những điều đó, bạn có thể làm:

:e **/*foo<Tab>

để chọn từ tất cả các tệp có footên của chúng trong thư mục làm việc hoặc:

:e **/*foo/*bar<Tab>

để chọn từ tất cả các tệp có bartên của chúng trong bất kỳ thư mục con nào chứafoo tên của nó, ở bất kỳ đâu trong thư mục làm việc.

Tất nhiên, đó là công trình phục vụ :tabe[dit], :sp[lit]:vs[plit] , quá.

Tuy nhiên, các lệnh đó chỉ giới hạn trong một tệp. Sử dụng :nextđể mở nhiều tệp:

:next **/*.js

và hãy nhìn vào :help arglist.


Nhảy giữa các bộ đệm

:b[uffer] là lệnh chuyển đổi bộ đệm cơ bản:

:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

Lưu ý rằng nhiều lệnh trong số này và họ hàng của chúng chấp nhận một số lượng.

Các :lslệnh show bạn một danh sách các bộ đệm nạp. Tuy nhiên, nó hơi "đặc biệt": các bộ đệm được gán một số khi chúng được tạo để bạn có thể có một danh sách giống như 1 2 5nếu bạn xóa bộ đệm. Điều này hơi khó xử, vâng, và điều đó làm cho việc chuyển sang một bộ đệm theo số của nó trở nên quá rắc rối. Ưu tiên chuyển đổi theo một phần tên :b foo<Tab>hoặc đi xe đạp :bn :bp,.

Dù sao, đây là một ánh xạ thú vị liệt kê tất cả các bộ đệm đã tải và điền lời nhắc cho bạn, đợi bạn nhập số bộ đệm và nhấn <enter>:

nnoremap gb :ls<CR>:b<Space>

Với ánh xạ này, việc chuyển sang bộ đệm khác đơn giản như sau:

gb
(quickly scanning the list)
3<CR>

hoặc là:

gb
(quickly scanning the list)
foo<tab><CR>

Ý tưởng đến từ hình ảnh này được lấy từ bộ sưu tập đồ họa thông tin Vim của Bairui :

Bay và đạp xe

Vim cũng có <C-^>(hoặc <C-6>trên một số bàn phím) - chế độ bình thường tương đương :b#- để chuyển giữa bộ đệm hiện tại và bộ đệm trước đó. Sử dụng nó nếu bạn thường xuyên luân phiên giữa hai bộ đệm.

Đọc tất cả về bộ đệm trong :help buffers.


Đi đến khai báo

Trong một tệp, bạn có thể sử dụng gdhoặc gD.

Trong một dự án, tính năng "thẻ" của Vim là bạn của bạn nhưng bạn sẽ cần một trình lập chỉ mục mã bên ngoài như ctags hoặc cscope. Các lệnh cơ bản nhất là :tag foo<C-]>với con trỏ trên tên phương thức. Cả hai công cụ đều được tích hợp tốt vào Vim: see :help tags, :help ctagsand :help cscope.

Đối với những gì nó đáng giá, tôi sử dụng điều hướng thẻ rộng rãi để di chuyển trong một dự án ( chủ yếu là sử dụng CtrlP :CtrlPTag:CtrlPBufTagcác lệnh, nhưng cả những lệnh buit-in) và phương pháp chuyển đổi bộ đệm "chung chung" yêu thích của tôi là theo tên.


Triển khai cấu hình của bạn

Rất nhiều người dùng Vim đặt cấu hình của họ dưới quyền kiểm soát phiên bản, điều này làm cho việc cài đặt cấu hình của riêng bạn trên một máy mới rất nhanh chóng và dễ dàng. Hãy suy nghĩ về nó.


BIÊN TẬP

Vài tháng trước, tôi phải làm việc trên một chiếc máy từ xa với Vim lỗi thời. Lẽ ra, tôi đã có thể cài đặt một Vim phù hợp và sao chép cấu hình yêu thích của riêng mình nhưng lần này tôi quyết định đi du lịch nhẹ để "mài giũa". Tôi nhanh chóng xây dựng một bản tối giản .vimrcvà xem lại một vài tính năng gốc bị lãng quên. Sau buổi biểu diễn đó, tôi quyết định CtrlP là không cần thiết và loại bỏ nó: các tính năng gốc và ánh xạ tùy chỉnh không hấp dẫn bằng nhưng chúng hoàn thành công việc mà không cần phụ thuộc nhiều.


Tung hứng với các tệp

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *

:findlà một lệnh thực sự tuyệt vời ngay khi bạn set pathchính xác. Với cài đặt của tôi, ,ffoo<Tab>sẽ tìm thấy tất cả các tệp chứa footrong thư mục hiện tại, một cách đệ quy. Nó nhanh chóng, trực quan và nhẹ. Tất nhiên, tôi được hưởng lợi từ việc hoàn thành và ký tự đại diện giống như với :editvà bạn bè.

Để làm cho quá trình nhanh hơn nữa, các ánh xạ sau cho phép tôi bỏ qua toàn bộ các phần của dự án và tìm các tệp một cách đệ quy trong thư mục của tệp hiện tại:

nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

CẢNH BÁO! Các pathtùy chọn là vô cùng mạnh mẽ. Giá trị trên— .,**—có hiệu quả với tôi nhưng các ngôn ngữ tôi sử dụng không có thư viện chuẩn. Các hợp giá trị phụ thuộc hoàn toàn vào bạn nhu cầu.


Tung hứng với bộ đệm

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

Các ánh xạ ở trên liệt kê các bộ đệm có sẵn trong "menu đại diện" với lời nhắc trống, cho phép tôi điều hướng menu bằng <Tab>hoặc nhập một vài ký tự và <Tab>lặp lại để thu hẹp danh sách. Giống như với các ánh xạ tệp ở trên, quá trình này diễn ra nhanh chóng và hầu như không có rắc rối.

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

Những ánh xạ đó tự nói lên.


Tung hứng với các thẻ

nnoremap <leader>j :tjump /

Ánh xạ này sử dụng tìm kiếm regex thay vì tìm kiếm toàn bộ từ, vì vậy tôi có thể làm ,jba<Tab>để tìm thẻ foobarbaz().

Đúng vậy, kết hợp mờ gây nghiện nhưng bạn có thể làm việc hiệu quả mà không có nó. Và với một phần nhỏ chi phí.


CHỈNH SỬA THÊM

Một số mẹo / thủ thuật bổ sung…


Tùy chọn Wildmenu

"Wildmenu", được kích hoạt set wildmenu, giúp điều hướng tệp / bộ đệm dễ dàng hơn. Hành vi của nó được điều chỉnh bởi một loạt các tùy chọn đáng để điều tra:

wildmode cho Vim biết bạn muốn "wildmenu" hoạt động như thế nào:

set wildmode=list:full

wildignore lọc ra tất cả các mấu chốt:

set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*

wildignorecasecho phép bạn tìm kiếm foovà tìm thấy Foo:

set wildignorecase

Dấu tệp

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

Gần đây tôi đã tìm thấy viên ngọc này trong của người khác ~/.vimrc. Nó tạo ra một dấu tệp ở vị trí chính xác của con trỏ bất cứ khi nào bạn rời khỏi bộ đệm để dù bạn ở đâu, sẽ 'Jchuyển đến bộ đệm JavaScript mới nhất mà bạn đã chỉnh sửa. Tuyệt vời.


2
+1. Tôi không biết về "bất kỳ thư mục con nào" kết hợp với :enhưng tôi sẽ sử dụng nó rất nhiều kể từ bây giờ. Tôi ngạc nhiên trước công việc đã chuyển sang Ctrl-P và có thể học được nhiều điều từ nó nhưng nó không hiệu quả với tôi. Tôi thấy nó là một chút slugish và như vậy làm gián đoạn cái mình đang nói trong khi làm việc (có thể là hệ thống của tôi, cài đặt của tôi, bản thân mình nhưng tôi đã không điều tra)
Lieven Keersmaekers

2
**là tuyệt vời, thực sự.
romainl

1
Tôi muốn ủng hộ một lần nữa cho gbbản đồ. Một cái khác tôi sẽ sử dụng rất nhiều. Tất cả các plugin đệm mà tôi đã thử (CtrlP, bufExplorer, ...) gần như không nhanh như thế này (được cấp, chúng cung cấp nhiều chức năng hơn nhưng không đủ để tôi tiếp tục sử dụng chúng) .
Lieven Keersmaekers

2
@LievenKeersmaekers, đây là nơi tôi lấy nó và đây là nơi xuất phát bức ảnh ngớ ngẩn. Cảm ơn Bairui!
romainl

4
Đây có thể là câu trả lời tuyệt vời nhất từng có.
craigp

5

Câu trả lời phụ thuộc rất nhiều vào sở thích và hoàn cảnh của bạn. Vài ví dụ:

  • Nếu nó chủ yếu là hai tệp (ví dụ: tiêu đề C và tệp triển khai), <C-^>thì rất tiện dụng. Nói chung, tệp thay thế là một khái niệm quan trọng.
  • Nếu bạn sử dụng một cửa sổ trình soạn thảo lớn, cửa sổ :splitsẽ giải quyết vấn đề định vị bộ đệm từ việc định vị cửa sổ (khi bạn đã mở tất cả các bộ đệm). Bạn có thể sử dụng [N]<C-w><C-w>để nhanh chóng chuyển sang nó.
  • Nếu bạn có thể ghi nhớ (một vài) số đệm, các lệnh :[N]b[uffer]:[N]sb[uffer]sẽ khá tiện dụng; :lscho bạn biết những con số.

Các plugin (hoặc ít nhất là ánh xạ tùy chỉnh) có thể cải thiện mọi thứ rất nhiều và có rất nhiều thứ về chủ đề này trên vim.org . Có nhiều cơ chế khác nhau để phân phối cấu hình của bạn (Pathogen + GitHub, Dropbox, ...) hoặc bạn có thể chỉnh sửa từ xa các tệp máy chủ thông qua plugin netrw đi kèm với Vim.


4
Có lẽ sẽ đáng đề cập đến ctags, cscope, gtags, id và bạn bè. Tôi thấy việc sử dụng các dấu hoa sẽ rất hữu ích. Sử dụng mAđể lưu trữ dấu Avà `` A '' để trả về. Tôi thấy netrw hữu ích hơn nhiều sau khi tôi biết về :Rexcái nào trả về cho explorer. :b, :e, Và nhiều người khác có thể mất ký tự đại diện như ***. Các :blệnh có thể mất một tên tập tin cục bộ. Kết hợp nó với <c-d>hoặc wildmenu bạn có thể đi được khá xa. Đối với các plugin, bạn có thể sử dụng tên miền cụ thể như rail.vim, cung cấp các lệnh điều hướng cụ thể cho đường ray hoặc một cái gì đó chung chung hơn như CtrlP.
Peter Rincker

@PeterRincker: +1 để đề cập về nhãn hiệu. Tôi đề nghị xây dựng một câu trả lời có dấu.
Helbreder

<C - ^> và [N] <Cw> <Cw> nghĩa là gì?
Josh Desmond

5

Đôi khi cũng rất tiện lợi khi xem tuần tự danh sách các tệp (ví dụ: nếu bạn đã làm gì đó muốn vim *.phpmở nhiều tệp cùng một lúc). Sau đó, bạn có thể sử dụng :n[ext](cũng như :prev[ious], :fir[st]:la[st]) để điều hướng (ngoài những gì được đề xuất trong các câu trả lời khác).


4

Bạn có thể hoàn thành tab ký tự đại diện trên dòng lệnh mà không cần bất kỳ plugin nào. ví dụ

:e src/**/foo*<tab>

sẽ cho phép bạn duyệt qua tất cả các tệp bắt đầu bằng 'foo' trong cây thư mục dưới ./src và chọn tệp bạn muốn chỉnh sửa.

Nếu bạn đã chỉnh sửa tệp và tệp vẫn còn trong bộ đệm thì bạn có thể chuyển sang tệp bằng:

:b foo<tab>

sẽ xoay vòng qua tất cả các bộ đệm có 'foo' trong đường dẫn. Bạn có thể cần đặt các tùy chọn mã đại diện và menu đại diện để có được hành vi bạn muốn. Tôi có

wildmode=longest:full
wildmenu

trong .vimrc của tôi.


2

Nếu bạn đang sử dụng tên tệp và muốn chuyển đến tệp đó, gfnó sẽ làm điều đó cho bạn. Tôi cũng thích sử dụng ctags , không phải là một plugin; bạn chỉ cần tạo các thẻ và có thể dễ dàng di chuyển xung quanh cơ sở mã của mình.


1

Nếu bạn muốn chuyển đổi giữa các tệp trong trình chỉnh sửa vim, vui lòng xem câu trả lời bên dưới

Đầu tiên nhấn Escphím để thoát khỏi chế độ chỉnh sửa.

Sau đó gõ :eđể kiểm tra đường dẫn tệp hiện tại.

nếu bạn muốn chuyển sang một tệp khác, hãy nhập :e /path-of-file.txt/bằng cách sử dụng cái này, bạn có thể chuyển đổi.

Nếu bạn muốn truy cập tệp trước đó, chỉ cần nhập :e#chuyển đổi sang đường dẫn tệp trước đó.


0

Tôi đã gặp vấn đề tương tự với Vim.

Điều cuối cùng tôi muốn là phụ thuộc vào các plugin cho một nhiệm vụ đơn giản như chuyển đổi tệp.

Tôi đã thêm những dòng sau vào .vimrc

set path+=**
set wildmenu

Và BAM! Bây giờ tôi có thể :find any/filename/in/any/folder/miễn là vim nằm trong thư mục gốc của dự án. Tab hoàn thành hoạt động. Ký tự đại diện hoạt động!

Sau khi các tệp đã được mở và có rất nhiều bộ đệm trong nền (bạn có thể sử dụng :lsđể xem tất cả các bộ đệm), việc chạy :b any/file <TAB>sẽ làm mờ tìm kiếm tất cả các bộ đệm và chuyển đến tệp cần thiết. Trong trường hợp nó không phải là duy nhất, sẽ có một menu đại diện của các tab (do đó, dòng thứ 2 trong .vimrc) có thể được chọn bằng cách sử dụng tab.

Câu trả lời của tôi đến từ video tuyệt vời này
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
Có nhiều thủ thuật hơn và tôi khuyên bạn nên xem nó.

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.