Эффективный способ найти и открыть файлы глубоко в дереве проекта?

12

Без таких плагинов, как ctrlpи NERDTreeкакой самый эффективный способ найти и открыть файлы в глубине дерева проекта?

Установка pathдля **/*результатов в бесполезных файлов .gitи других скрытых каталогов, так что , как представляется, может быть и речи.

Есть ли способ установить путь разумным образом, чтобы он включал только файлы git ls-filesили что-то?

kenorb
источник

Ответы:

24

Вот соответствующие части моей установки:

  • включить дикое меню,

    set wildmenu
    
  • сделайте так, чтобы имя файла завершалось, пропустите эти файлы и каталоги,

    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.*
    
  • сделать это без учета регистра,

    set wildignorecase
    
  • список файлов и пусть пользователь выбирает с помощью wildmenu,

    set wildmode=list:full
    
  • добавить каталог текущего файла и каждый каталог в рабочем каталоге в Vim's path,

    set path=.,**
    

    ПРЕДУПРЕЖДЕНИЕ! Опция path чрезвычайно полезна. Значение выше - .,**- работает для меня, но языки, которые я использую, не имеют стандартной библиотеки. Правильное значение полностью зависит от ваших потребностей.

  • куча :findсопоставлений, варианты в верхнем регистре запускают поиск из каталога текущего файла для лучшей производительности,

    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>
    

А вот как это выглядит:

:находить

romainl
источник
1
Вау, это отличные отображения и настройки. Спасибо за подробный ответ.
3

Видеть :h :command-completion-custom

Мы можем адаптировать последний пример, чтобы завершить только файлы, перечисленные в 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

Теперь вы можете использовать автозаполнение, чтобы открыть файлы, перечисленные в git:

:GitFind ome_f<Tab>

Обратите внимание, что в пользовательской функции завершения мы должны сделать больше, чем просто перечислить файлы, которые можно завершить. Мы должны также фильтровать список относительно текущего аргумента командной строки ArgLead. В этом примере, мы просим , gitчтобы сделать фильтрацию для нас, передав ей аргумент , завернутый в *подстановочных знаках.

joeytwiddle
источник
Это отличный трюк
1

Мой метод включает следующую функцию оболочки в ~/.bash_profile:

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

Затем, чтобы открыть любой файл в глубине дерева проекта, просто наберите:

vimf some_file.c
kenorb
источник