Skuteczny sposób na znajdowanie i otwieranie plików głęboko w drzewie projektu?

12

Bez wtyczek takich jak ctrlpi NERDTree, jaki byłby najbardziej efektywny sposób znajdowania i otwierania plików głęboko w drzewie projektu?

Ustawianie pathdo **/*wyników w niepotrzebnych plików .giti innych ukrytych katalogów, tak że wydaje się, że nie wchodzi w rachubę.

Czy istnieje sposób, aby ustawić ścieżkę w inteligentny sposób, aby zawierała tylko pliki git ls-fileslub coś takiego?

kenorb
źródło

Odpowiedzi:

24

Oto odpowiednie części mojej konfiguracji:

  • włącz wildmenu,

    set wildmenu
    
  • dopełnij uzupełnianie nazw plików, pomiń te pliki i katalogi,

    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.*
    
  • sprawiają, że wielkość liter nie ma znaczenia,

    set wildignorecase
    
  • wyświetl listę plików i pozwól użytkownikowi wybrać za pomocą wildmenu,

    set wildmode=list:full
    
  • dodaj katalog bieżącego pliku i każdy katalog w katalogu roboczym do Vima path,

    set path=.,**
    

    OSTRZEŻENIE! Opcja ścieżki jest bardzo przydatna. Wartość powyżej - .,**- działa dla mnie, ale języki, których używam, nie mają standardowej biblioteki. Prawidłowa wartość zależy wyłącznie od Twoich potrzeb.

  • kilka :findmapowań, warianty wielkich liter rozpoczynają wyszukiwanie od katalogu bieżącego pliku dla lepszej wydajności,

    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>
    

A oto jak to wygląda:

:odnaleźć

romainl
źródło
1
Wow, to są świetne mapowania i ustawienia. Dziękuję za szczegółową odpowiedź.
3

Widzieć :h :command-completion-custom

Możemy dostosować ostatni przykład, aby uzupełniał tylko pliki wymienione przez 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

Teraz możesz użyć automatycznego uzupełniania, aby otworzyć pliki wymienione przez git:

:GitFind ome_f<Tab>

Pamiętaj, że w niestandardowej funkcji uzupełniania musimy zrobić coś więcej niż po prostu wyświetlić listę plików, które można uzupełnić. Musimy także przefiltrować listę względem bieżącego argumentu wiersza poleceń ArgLead. W tym przykładzie prosimy gito wykonanie filtrowania dla nas, przekazując mu argument zawinięty w *symbole wieloznaczne.

joeytwiddle
źródło
To doskonała sztuczka
1

Moja metoda obejmuje następującą funkcję powłoki w ~/.bash_profile:

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

Następnie, aby otworzyć dowolny plik głęboko w drzewie projektu, po prostu wpisz:

vimf some_file.c
kenorb
źródło