Cách hiệu quả để tìm và mở các tập tin sâu trong cây dự án?


12

Không có plugin như ctrlpNERDTree, cách hiệu quả nhất để tìm và mở tệp sâu trong cây dự án là gì?

Thiết lập pathđể **/*kết quả trong các tập tin vô ích trong .gitvà thư mục ẩn khác, vì vậy mà dường như là ra câu hỏi.

Có cách nào để thiết lập đường dẫn một cách thông minh , để nó chỉ bao gồm các tệp trong git ls-fileshoặc một cái gì đó không?

Câu trả lời:


24

Dưới đây là các phần có liên quan trong thiết lập của tôi:

  • cho phép wildmenu,

    set wildmenu
    
  • làm cho tên tệp hoàn thành bỏ qua các tập tin và thư mục này,

    set wildignore+=*.swp,*.bak
    set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
    set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
    set wildignore+=*/min/*
    set wildignore+=tags,cscope.*
    set wildignore+=*.tar.*
    
  • làm cho nó không nhạy cảm

    set wildignorecase
    
  • liệt kê các tập tin và cho phép người dùng chọn với wildmenu,

    set wildmode=list:full
    
  • thêm thư mục của tệp hiện tại và mọi thư mục trong thư mục làm việc vào Vim's path,

    set path=.,**
    

    CẢNH BÁO! Tùy chọn đường dẫn là cực kỳ hữu ích. Giá trị trên - .,**- hoạt động với tôi nhưng 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.

  • một loạt các :findánh xạ, các biến thể chữ hoa bắt đầu tìm kiếm từ thư mục của tệp hiện tại để có hiệu suất tốt hơn,

    nnoremap ,f :find *
    nnoremap ,F :find <C-R>=expand('%:p:h').'/**/*'<CR>
    nnoremap ,s :sfind *
    nnoremap ,S :sfind <C-R>=expand('%:p:h').'/**/*'<CR>
    nnoremap ,v :vert sfind *
    nnoremap ,V :vert sfind <C-R>=expand('%:p:h').'/**/*'<CR>
    

Và đây là cách nó trông như thế nào:

:tìm thấy


1
Wow, đây là một số ánh xạ và cài đặt tuyệt vời. Cảm ơn bạn đã trả lời chi tiết.

3

Xem :h :command-completion-custom

Chúng ta có thể điều chỉnh ví dụ cuối cùng để hoàn thành chỉ các tệp được liệt kê bởi git.

command! -nargs=1 -bang -complete=customlist,GitFindComplete
      \ GitFind edit<bang> <args>

function! GitFindComplete(ArgLead, CmdLine, CursorPos)
  let search_pattern = "*" . a:ArgLead . "*"
  let shell_cmd = "git ls-files " . shellescape(search_pattern)
  return split(system(shell_cmd), "\n")
endfunction

Bây giờ bạn có thể sử dụng tự động hoàn thành để mở các tệp được liệt kê bởi git:

:GitFind ome_f<Tab>

Lưu ý rằng trong một chức năng hoàn thành tùy chỉnh, chúng ta phải làm nhiều hơn là chỉ liệt kê các tệp có thể được hoàn thành. Chúng ta cũng phải lọc danh sách liên quan đến đối số dòng lệnh hiện tại ArgLead. Trong ví dụ này, chúng tôi yêu cầu gitthực hiện việc lọc cho chúng tôi, bằng cách chuyển cho nó đối số được gói trong các *ký tự đại diện.


Đây là một thủ thuật tuyệt vời

1

Phương thức của tôi bao gồm hàm shell sau trong ~/.bash_profile :

vimf() {
  vim $(find . -name $1)
}

Sau đó, để mở bất kỳ tệp nào sâu trong cây dự án, chỉ cần gõ:

vimf some_file.c
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.