Effiziente Möglichkeit, Dateien tief in einem Projektbaum zu finden und zu öffnen?

12

Was wäre ohne Plugins wie ctrlpund NERDTreeder effizienteste Weg, um Dateien tief in einem Projektbaum zu finden und zu öffnen?

Das Setzen von pathto **/*führt zu nutzlosen Dateien in .gitund anderen versteckten Verzeichnissen, sodass dies nicht in Frage zu kommen scheint.

Gibt es eine Möglichkeit, den Pfad auf intelligente Weise festzulegen , sodass nur Dateien git ls-filesoder ähnliches enthalten sind?

Kenorb
quelle

Antworten:

24

Hier sind die relevanten Teile meines Setups:

  • Aktivieren Sie das Wildmenü,

    set wildmenu
    
  • Vervollständigen Sie diese Dateien und Verzeichnisse.

    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.*
    
  • machen Sie es unabhängig von Groß- und Kleinschreibung,

    set wildignorecase
    
  • Listen Sie die Dateien auf und lassen Sie den Benutzer mit dem Wildmenü auswählen.

    set wildmode=list:full
    
  • Fügen Sie das Verzeichnis der aktuellen Datei und jedes Verzeichnis unter dem Arbeitsverzeichnis zu Vim's hinzu path.

    set path=.,**
    

    WARNUNG! Die Pfadoption ist äußerst nützlich. Der Wert über - .,**- funktioniert für mich, aber die von mir verwendeten Sprachen haben keine Standardbibliothek. Der richtige Wert hängt ganz von Ihren Bedürfnissen ab.

  • Bei einer Reihe von :findZuordnungen starten die Großbuchstaben die Suche aus dem Verzeichnis der aktuellen Datei, um eine bessere Leistung zu erzielen.

    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>
    

Und so sieht es aus:

:finden

romainl
quelle
1
Wow, das sind einige großartige Zuordnungen und Einstellungen. Vielen Dank für die ausführliche Antwort.
3

Sehen :h :command-completion-custom

Wir können das letzte Beispiel anpassen, um nur die von git aufgelisteten Dateien zu vervollständigen.

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

Jetzt können Sie die automatische Vervollständigung verwenden, um die von git aufgelisteten Dateien zu öffnen:

:GitFind ome_f<Tab>

Beachten Sie, dass wir in einer benutzerdefinierten Abschlussfunktion mehr tun müssen, als nur die Dateien aufzulisten, die abgeschlossen werden könnten. Wir müssen die Liste auch relativ zum aktuellen Befehlszeilenargument filternArgLead . In diesem Beispiel bitten wir gitSie, die Filterung für uns durchzuführen, indem Sie das in *Platzhalter eingeschlossene Argument übergeben .

joeytwiddle
quelle
Dies ist ein ausgezeichneter Trick
1

Meine Methode enthält die folgende Shell-Funktion in ~/.bash_profile:

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

Um eine Datei tief im Projektbaum zu öffnen, geben Sie einfach Folgendes ein:

vimf some_file.c
Kenorb
quelle