Có cách nào để tìm kiếm tệp tin trong thư mục một cách đệ quy (sử dụng ký tự đại diện khi cần thiết) trong Vim không? Nếu không phải là nguyên bản, có plugin nào có thể xử lý điều này không?
Có cách nào để tìm kiếm tệp tin trong thư mục một cách đệ quy (sử dụng ký tự đại diện khi cần thiết) trong Vim không? Nếu không phải là nguyên bản, có plugin nào có thể xử lý điều này không?
Câu trả lời:
Bạn có thể sử dụng các ký tự đại diện với :editlệnh. Vì thế,
:e **/test/Suite.java
sẽ mở test / Suite.java cho dù nó ở đâu trong hệ thống phân cấp thư mục hiện tại. Điều này hoạt động với tính năng hoàn thành bằng tab nên bạn có thể sử dụng [tab] để mở rộng các ký tự đại diện trước khi mở tệp. Xem thêm wildmode lựa chọn cho một cách để duyệt qua tất cả các phần mở rộng có thể thay thế.
Một thủ thuật khác là sử dụng
:r! find . -type f
để tải danh sách tất cả các tệp trong thư mục hiện tại vào bộ đệm. Sau đó, bạn có thể sử dụng tất cả các công cụ thao tác văn bản vim thông thường để điều hướng / sắp xếp / cắt danh sách và CTRL+W gfđể mở tệp dưới con trỏ trong ngăn mới.
Có một lệnh tìm. Nếu bạn thêm **(xem :help starstar) vào 'path'thì bạn có thể tìm kiếm đệ quy:
:set path
sẽ cho bạn thấy con đường hiện tại của bạn, hãy thêm **bằng cách làm điều gì đó như
:set path+=**
sau đó bạn có thể chỉ cần gõ
:find myfile.txt
và nó mở ra một cách kỳ diệu!
Nếu bạn thêm lệnh set vào .vimrc của mình, nó sẽ đảm bảo rằng bạn có thể thực hiện tìm kiếm đệ quy trong tương lai. Nó dường như không tìm kiếm các thư mục dấu chấm (.ssh chẳng hạn)
my*.txtcũng làm được?
:h find.
:set path+=**
Tôi muốn giới thiệu ctrlp.vim . Đây là một plugin rất tốt, lý tưởng để làm việc trong các dự án lớn. Nó có tính năng tìm kiếm theo tên tệp hoặc đường dẫn đầy đủ, tìm kiếm regexp, tự động phát hiện gốc của dự án (tệp có thư mục .git | hg | svn | bzr | _darcs), loại trừ tên tệp được cá nhân hóa và nhiều hơn nữa.
Chỉ cần nhấn <c-p>và nó sẽ mở ra một ngăn rất trực quan, nơi bạn có thể tìm kiếm những gì bạn muốn:
Có thể chọn và mở nhiều tệp cùng một lúc. Nó cũng chấp nhận các lệnh tùy ý bổ sung, như nhảy đến một dòng nhất định, sự xuất hiện chuỗi hoặc bất kỳ lệnh Vim nào khác.
vim dưới dạng lệnh tìm nội trang (: help find) nhưng chỉ mở tệp đầu tiên được tìm thấy. Tuy nhiên, bạn có thể sử dụng plugin tuyệt vời này: FuzzyFinder thực hiện mọi thứ bạn muốn và thậm chí hơn thế nữa
Bạn có thể duyệt qua hệ thống tệp :ex ., nhưng tôi không biết cách tìm kiếm đệ quy (Tôi là người mới sử dụng Vim - tôi mới sử dụng nó được mười năm).
Có một số plugin trình duyệt tệp phổ biến:
Xem thêm chủ đề này trên SuperUser .
Bạn có thể dùng ! để chạy các lệnh shell:
:! find . -name *.xml
Command-t trong một trong những plugin vim yêu thích của tôi, đó là plugin dựa trên ruby ở trên tích hợp với FZF.
Bằng cách sử dụng Comamnd-T và FZF, bạn có thể thực hiện tìm kiếm với cơ chế "mờ" cực kỳ nhanh chóng cho:
Bạn có thể thấy
Tôi luôn tìm kiếm trong lịch sử lệnh bằng cách mở một thiết bị đầu cuối mới và nhấn:
CTRL+R
Ngoài việc tìm kiếm trong tất cả các thư mục một cách đệ quy bằng cách viết vào bất kỳ tab đầu cuối nào:
fzf
Ngoài ra, bạn có thể viết bên trong vim
:CommandT
Thực sự mạnh mẽ và nhanh chóng.
vim có bild trong các lệnh có tên grep, lgrep, vimgrep hoặc lvimgrep có thể thực hiện việc này
đây là hướng dẫn về cách sử dụng chúng http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search
bạn cũng có thể sử dụng một lệnh bên ngoài như find hoặc grep từ vim bằng cách thực thi nó như thế này
:!find ...
:grep test */.javasẽ tìm kiếm từ testtrong tất cả .javacác tệp. :!findsẽ sử dụng findlệnh shell để tìm tệp. Các findlệnh shell là khá mạnh mẽ, nếu bạn kết hợp nó với PCRE hoặc regex mở rộng
Tôi ngạc nhiên là chưa có ai đề cập đến Unite.vim .
Tìm kiếm tệp (mờ hoặc khác) chỉ là phần nổi của tảng băng chìm về những gì nó có thể làm cho một nhà phát triển. Nó đã được xây dựng trong hỗ trợ cho ag, gitvà vô số các chương trình / tiện ích / plugins vim khác. Con đường học tập có thể hơi dốc, nhưng tôi không thể tưởng tượng cuộc sống của mình nếu không có nó. Cơ sở người dùng lớn và các lỗi được sửa ngay lập tức.
Duyệt kết quả giống như Quickfix
Sử dụng:
Find my.regex
Kết quả:
grep -Eregex<enter>hoặc <C-w>gfđể mở tệp trên dòng hiện tại trong tab mớigf để mở tệp trên tab hiện tại và mất danh sách tệpTìm tất cả các tệp thay thế:
Find
Các phương thức thay thế:
Gfind my.regex: chỉ tìm kiếm các tệp được theo dõi Git ( git ls-files). Yêu cầu đào tẩu: https://github.com/tpope/vim-fugitive/issues/132#issuecomment-200749743Gtfind my.regex: thích Gfind, nhưng tìm kiếm từ git Cấp cao nhất thay vì thư mục hiện tạiLocate somefile: locatephiên bảnMã:
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>'))
Tùy thuộc vào tình huống của bạn (nghĩa là, giả sử lệnh sau sẽ chỉ tìm thấy một tệp duy nhất), có thể sử dụng lệnh như:
:e `locate SomeUniqueFileName.java`
Điều này sẽ làm cho Vim mở, trong tab hiện tại (lệnh e) một tệp là kết quả của việc chạy (trong ví dụ này),
locate SomeUniqueFileName.java
Lưu ý rằng điều kỳ diệu ở đây là các dấu gạch ngược xung quanh lệnh, sẽ chuyển đầu ra từ lệnh shell thành văn bản có thể sử dụng được trong lệnh Vim.
Bạn không cần plugin chỉ cho chức năng này, đoạn mã bên dưới là đủ.
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>
Chạy:
:args `find . -name '*xml'`
Vim sẽ chạy lệnh shell trong backticks, đưa danh sách các tệp vào arglist và mở tệp đầu tiên. Sau đó, bạn có thể sử dụng :argsđể xem các arglist (tức là danh sách các tập tin được tìm thấy) và :nvà :Nđể di chuyển về phía trước và bacwards thông qua các tập tin trong arglist. Xem https://vimhelp.org/editing.txt.html#%7Barglist%7D và https://vimhelp.org/editing.txt.html#backtick-expansion
Bạn có thể tìm các tệp một cách đệ quy trong "đường dẫn" của mình bằng plugin này . Nó cũng hỗ trợ hoàn thành tab cho tên tệp.
Công cụ ag và plugin Ag vim tương ứng giải quyết vấn đề này một cách hoàn hảo:
Để tìm tệp bằng cách sử dụng một số mẫu:
AgFile! pattern
Nó sẽ mở ra cửa sổ Quickfix với các kết quả mà bạn có thể chọn.
Bạn có thể thêm keybinding vim để gọi lệnh này bằng cách sử dụng từ đã chọn làm mẫu.
nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>