Cara efisien untuk menemukan & membuka file jauh di dalam pohon proyek?

12

Tanpa plugin seperti ctrlpdan NERDTree, apa cara paling efisien untuk menemukan dan membuka file jauh di dalam pohon proyek?

Menyetel pathuntuk **/*menghasilkan file yang tidak berguna di .gitdan direktori tersembunyi lainnya, sehingga tampaknya keluar dari pertanyaan.

Apakah ada cara untuk mengatur jalur dengan cara yang cerdas , sehingga hanya menyertakan file git ls-filesatau sesuatu?

kenorb
sumber

Jawaban:

24

Berikut adalah bagian yang relevan dari pengaturan saya:

  • aktifkan wildmenu,

    set wildmenu
    
  • membuat nama file-selesai melewati file dan direktori ini,

    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.*
    
  • membuatnya case-insensitive,

    set wildignorecase
    
  • daftar file dan biarkan pengguna memilih dengan wildmenu,

    set wildmode=list:full
    
  • tambahkan direktori file saat ini dan setiap direktori di bawah direktori kerja ke Vim path,

    set path=.,**
    

    PERINGATAN! Opsi path sangat berguna. Nilai di atas - .,**- berfungsi untuk saya tetapi bahasa yang saya gunakan tidak memiliki perpustakaan standar. Nilai yang tepat tergantung sepenuhnya pada kebutuhan Anda .

  • banyak :findpemetaan, varian huruf besar memulai pencarian dari direktori file saat ini untuk kinerja yang lebih baik,

    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>
    

Dan begini tampilannya:

:Temukan

romainl
sumber
1
Wow, ini adalah beberapa pemetaan dan pengaturan yang bagus. Terima kasih atas jawaban terincinya.
3

Lihat :h :command-completion-custom

Kita dapat mengadaptasi contoh terakhir untuk menyelesaikan hanya file yang terdaftar oleh 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

Sekarang Anda dapat menggunakan pelengkapan otomatis untuk membuka file yang terdaftar oleh git:

:GitFind ome_f<Tab>

Perhatikan bahwa dalam fungsi penyelesaian kustom, kita harus melakukan lebih dari sekadar daftar file yang dapat diselesaikan. Kita juga harus memfilter daftar relatif terhadap argumen commandline saat ini ArgLead. Dalam contoh ini, kami meminta gituntuk melakukan penyaringan untuk kami, dengan memberikan argumen yang dibungkus dengan *wildcard.

joeytwiddle
sumber
Ini adalah trik yang sangat bagus
1

Metode saya meliputi fungsi shell berikut di ~/.bash_profile:

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

Kemudian untuk membuka file apa pun di dalam pohon proyek, cukup ketik:

vimf some_file.c
kenorb
sumber