¿Una manera eficiente de encontrar y abrir archivos en lo profundo de un árbol de proyecto?

12

Sin complementos como ctrlpy NERDTree, ¿cuál sería la forma más eficiente de encontrar y abrir archivos en un árbol de proyecto?

Ajustar el pathque **/*los resultados en archivos inútiles en .gity otros directorios ocultos, por lo que parece estar fuera de la cuestión.

¿Hay alguna manera de establecer la ruta de manera inteligente , de modo que solo incluya archivos git ls-fileso algo así?

kenorb
fuente

Respuestas:

24

Aquí están las partes relevantes de mi configuración:

  • habilitar el menú salvaje,

    set wildmenu
    
  • hacer que la finalización del nombre de archivo omita estos archivos y directorios,

    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.*
    
  • que no distinga entre mayúsculas y minúsculas,

    set wildignorecase
    
  • enumerar archivos y dejar que el usuario elija con el menú salvaje,

    set wildmode=list:full
    
  • agregue el directorio del archivo actual y cada directorio bajo el directorio de trabajo a Vim's path,

    set path=.,**
    

    ¡ADVERTENCIA! La opción de ruta es extremadamente útil. El valor anterior - .,**funciona para mí, pero los idiomas que uso no tienen una biblioteca estándar. El valor adecuado depende completamente de sus necesidades.

  • un montón de :findasignaciones, las variantes en mayúscula comienzan la búsqueda desde el directorio del archivo actual para un mejor rendimiento,

    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>
    

Y así es como se ve:

:encontrar

romainl
fuente
1
Wow, estos son algunos mapas y configuraciones geniales. Gracias por la respuesta detallada.
3

Ver :h :command-completion-custom

Podemos adaptar el último ejemplo para completar solo los archivos listados por 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

Ahora puede usar el autocompletado para abrir los archivos listados por git:

:GitFind ome_f<Tab>

Tenga en cuenta que en una función de finalización personalizada, debemos hacer más que simplemente enumerar los archivos que podrían completarse. También debemos filtrar la lista en relación con el argumento actual de la línea de comandos ArgLead. En este ejemplo, le pedimos gitque haga el filtrado por nosotros, pasándole el argumento envuelto en *comodines.

joeytwiddle
fuente
Este es un truco excelente
1

Mi método incluye la siguiente función de shell en ~/.bash_profile:

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

Luego, para abrir cualquier archivo en el árbol del proyecto, simplemente escriba:

vimf some_file.c
kenorb
fuente