Maneira eficiente de encontrar e abrir arquivos profundamente em uma árvore de projeto?

12

Sem plugins como ctrlpe NERDTree, qual seria a maneira mais eficiente de encontrar e abrir arquivos no fundo de uma árvore de projetos?

Definir pathpara **/*resulta em arquivos inúteis .gite em outros diretórios ocultos, para que isso pareça estar fora de questão.

Existe uma maneira de definir o caminho de maneira inteligente , de modo que inclua apenas arquivos git ls-filesou algo assim?

kenorb
fonte

Respostas:

24

Aqui estão as partes relevantes da minha configuração:

  • habilite o menu selvagem,

    set wildmenu
    
  • faça com que a conclusão do nome do arquivo pule esses arquivos e diretórios,

    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.*
    
  • torná-lo sem distinção entre maiúsculas e minúsculas,

    set wildignorecase
    
  • listar arquivos e deixar o usuário escolher com o menu wild,

    set wildmode=list:full
    
  • adicione o diretório do arquivo atual e todos os diretórios no diretório de trabalho ao Vim's path,

    set path=.,**
    

    AVISO! A opção de caminho é extremamente útil. O valor acima - .,**- funciona para mim, mas os idiomas que eu uso não têm uma biblioteca padrão. O valor adequado depende inteiramente de suas necessidades.

  • um monte de :findmapeamentos, as variantes em maiúsculas iniciam a pesquisa no diretório do arquivo atual para obter melhor desempenho,

    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>
    

E aqui está como se parece:

:encontrar

romainl
fonte
1
Uau, esses são alguns ótimos mapeamentos e configurações. Obrigado pela resposta detalhada.
3

Vejo :h :command-completion-custom

Podemos adaptar o último exemplo para concluir apenas os arquivos listados pelo 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

Agora você pode usar o preenchimento automático para abrir os arquivos listados pelo git:

:GitFind ome_f<Tab>

Observe que em uma função de conclusão personalizada, devemos fazer mais do que simplesmente listar os arquivos que podem ser concluídos. Também devemos filtrar a lista em relação ao argumento da linha de comando atual ArgLead. Neste exemplo, solicitamos gita filtragem para nós, passando o argumento entre *caracteres curinga.

joeytwiddle
fonte
Esse é um excelente truque #
1

Meu método inclui a seguinte função shell em ~/.bash_profile:

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

Para abrir qualquer arquivo na árvore do projeto, digite:

vimf some_file.c
kenorb
fonte