Подтвердить что ты не робот

VIM: использование FuzzyFinder, советы, gotchas - как можно использовать этот плагин?

http://www.vim.org/scripts/script.php?script_id=1984

Вы можете запустить FuzzyFinder следующие команды:

     Command           Mode ~
    |:FufBuffer|     - Buffer mode (|fuf-buffer-mode|)
    |:FufFile|       - File mode (|fuf-file-mode|)
    |:FufDir|        - Directory mode (|fuf-dir-mode|)
    |:FufMruFile|    - MRU-File mode (|fuf-mrufile-mode|)
    |:FufMruCmd|     - MRU-Command mode (|fuf-mrucmd-mode|)
    |:FufBookmark|   - Bookmark mode (|fuf-bookmark-mode|)
    |:FufTag|        - Tag mode (|fuf-tag-mode|)
    |:FufTaggedFile| - Tagged-File mode (|fuf-taggedfile-mode|)
    |:FufJumpList|   - Jump-List mode (|fuf-jumplist-mode|)
    |:FufChangeList| - Change-List mode (|fuf-changelist-mode|)
    |:FufQuickfix|   - Quickfix mode (|fuf-quickfix-mode|)
    |:FufLine|       - Line mode (|fuf-line-mode|)
    |:FufHelp|       - Help mode (|fuf-help-mode|)

Итак, я недавно узнал о FuzzyFinder. Для тех, кто использовал это довольно долго, вы можете продемонстрировать, как вы на самом деле используете эти команды в комбинации, любые сопоставления, которые вы делаете, какие-либо ошибки, которые следует знать при использовании этого?

4b9b3361

Ответ 1

FuzzyFinder сам по себе для меня бесполезен. Я использую его в сочетании с FuzzyFinder-TextMate и библиотекой Ruby, которая перемещает все файлы и подкаталоги для поиска файла, так же как и опция Cmd + T для TextMate на Mac. Вы можете увидеть это в действии здесь.

К сожалению, для его работы требуется некоторое усилие, так как первоначальный автор прекратил поддерживать script. Тем не менее, некоторые люди регулярно публикуют обновления для github. Вам понадобятся два сценария, fuzzyfinder_textmate.vim и fuzzy_file_finder.rb.

Последние версии работают без проблем в сочетании с Vim FuzzyFinder 2.22.3. Ваш Vim должен быть скомпилирован с поддержкой Ruby, иначе он не будет работать. blog исходного автора содержит дополнительную информацию о том, как правильно его использовать. Кроме того, взгляните на мою настройку Vim, чтобы увидеть, как ее можно использовать. Настройка определяет два сопоставления клавиш ,s и ,e для нечеткого поиска файла и открытия его в новом окне или в текущем окне соответственно:

function IdeFindTextMate()
  let g:FuzzyFinderOptions.Base.key_open = '<CR>'
  let g:FuzzyFinderOptions.Base.key_open_split = '<C-j>'
  exe "FuzzyFinderTextMate"
endfunction

function IdeSplitFindTextMate()
  let g:FuzzyFinderOptions.Base.key_open = '<C-j>'
  let g:FuzzyFinderOptions.Base.key_open_split = '<CR>'
  exe "FuzzyFinderTextMate"
endfunction

let mapleader = ","
map <silent> <leader>e :call IdeFindTextMate()<CR>
map <silent> <leader>s :call IdeSplitFindTextMate()<CR>

Update:

Сейчас я использую отличный плагин Command-T вместо FuzzyFinder. Посмотрите этот ответ суперпользователя по причинам, почему.

Ответ 2

Немного поздно для вечеринки, но я хотел бы добавить, что в последней версии FuzzyFinder есть новая команда: :FufCoverageFile, которая делает именно то, что вы хотите, т.е.:

>CoverageFile>appcontr
  20: app/controllers/application_controller.rb
  22: app/views/layouts/application.html.erb

Ответ 3

В дополнение к ответу Криса вы, вероятно, захотите сопоставить "**/" сразу в файле .vimrc следующим образом:

map ,f :FufFile **/<CR>

Поэтому вам просто нужно ввести:

,fTest 

чтобы найти все совпадения Test во всех подкаталогах!

НТН

Ответ 4

Я использую: FufFile, сопоставленный с, b и начинающийся с ввода **/, за которым следуют первые несколько символов строки, которую я ищу.

Здесь представлен список всех совпадающих файлов, содержащих вашу строку.

например

,b
**/doc
    13: app/models/document.rb
    75: test/fixtures/documents.yml
    82: test/unit/document_test.rb

Ответ 5

Сначала установите последний нечеткий поиск script. Тогда...

Config

Измените конфигурацию в вашем .vimrc:

" Truth be told, I don't remember what these do, but I must have
" found them necessary back when I installed fuzzyfinder years ago
let s:slash = '[/\\]'
let s:startname = '(^|'.s:slash.')'
let s:endname = '($|'.s:slash.')'

" directories and extensions to ignore when listing files
" these contain a lot of Python-isms, yours will probably vary
let s:extension = '\.bak|\.dll|\.exe|\.o|\.pyc|\.pyo|\.swp|\.swo'
let s:dirname = 'build|deploy|dist|vms|\.bzr|\.git|\.hg|\.svn|.+\.egg-info'
let g:fuf_file_exclude = '\v'.'('.s:startname.'('.s:dirname.')'.s:endname.')|(('.s:extension.')$)'
let g:fuf_dir_exclude = '\v'.s:startname.'('.s:dirname.')'.s:endname

" limit number of displayed matches
" (makes response instant even on huge source trees)
let g:fuf_enumeratingLimit = 60

и я определяю некоторые сочетания клавиш для его активации:

nnoremap <Leader>f :FufFile **/<cr>
nnoremap <Leader>b :FufBuffer<cr>
nnoremap <Leader>t :FufTag<cr>

и перезапустите Vim, чтобы перечитать конфигурацию .vimrc.

Найти файл/буфер

Теперь я могу нажать <leader> f, чтобы увидеть список файлов в текущем каталоге и поддиректорах. Начните вводить текст, и список фильтруется только для тех, которые (нечеткие) соответствуют введенным вами. Используйте клавиши курсора, чтобы выбрать совпадение и введите, чтобы открыть этот файл. В первый раз, когда вы активируете это в очень большом новом проекте, для кэширования имен файлов может потребоваться секунда.

Аналогично, когда у вас открыто несколько буферов, нажмите <leader> b, чтобы выбрать из списка открытых буферов.

Найти тег

Лучше всего это соответствие меток (например, переход к функции, классу, методу и т.д.). Сначала нам нужно создать файл тегов.

Если вы не используете теги для файлов, это может показаться неприятным, что нужно сделать это вручную. Имейте в виду, что многие инструменты используют файлы тегов, например, сам Vim будет читать их, чтобы включить "перейти к определению", см. Ссылку в конце этого ответа, поэтому изучение их возможно более ценно, чем вы могли бы ожидать.

Установите последние ctags (http://ctags.sourceforge.net/) и убедитесь, что это на вашем PATH, чтобы вы могли вызвать его из командной строки. Недавние версии значительно улучшены для таких языков, как Python. Затем определите нажатие клавиши в .vimrc, чтобы упростить повторное запуск в проекте и одновременно сдуть кеш fuzzyfinder:

noremap <f12> :silent !ctags -R --languages=python .<cr>:FufRenewCache<cr>

или в Windows:

noremap <f12> :!start /min ctags -R --languages=python .<cr>:FufRenewCache<cr>

(/min - это способ Windows для запуска команды в фоновом режиме, так что Vim не блокируется при индексировании очень больших проектов)

Перезапустите vim, и нажатие f12 теперь сканирует каждый файл в текущем каталоге и поддиректорах и создает индекс всех определенных функций, классов и т.д. ctags анализирует многие языки программирования. Выход идет в файл под названием "теги". Имеет смысл запустить это в корне вашего проекта (используйте Vim: pwd и: cd, чтобы убедиться, что вы там), чтобы файл тегов содержал все в вашем проекте.

Итак, теперь вы можете нажать <leader> t, чтобы просмотреть список всех классов, функций, методов и т.д. в вашем проекте. Как и выше, начните вводить текст, и список будет отфильтрован до тех, которые соответствуют типу. Используйте курсоры и введите их, и Vim перейдет к файлу/строке, где этот тег определен.

Gotchas

Если тег определен более чем один раз в вашем проекте (например, класс с тем же именем, что и функция), то fuzzyfinder предложит меню, чтобы вы могли выбрать, к какой из них вы хотите перейти. Это может быть немного раздражающим, потому что по умолчанию ctags создает слишком много определений тегов для файлов Python. В нем перечислены не только определения классов, методов и функций, но все места, где любой символ определен в исходном файле. Это включает в себя создание переменных и места, где символ импортируется из другого места. Это означает, что символ, который определен в одном файле и импортирован во второй файл, будет иметь два местоположения определения, что означает, что вам всегда будет представлено меню вместо простого перехода непосредственно к определению класса. Вы можете исправить это, создав файл опций ctags в ~/.ctags, сообщив ему не генерировать теги для статусов "include" и пропустить некоторые каталоги:

--python-kinds=-i
--exclude=build
--exclude=dist

При изменении исходного кода ваш файл тегов будет устаревшим. Если вы создадите новые классы/функции/методы/etc, то для перехода к ним вам придется повторно запустить ctags, как показано выше. Удивительно, как это редко бывает.

Я обнаружил, что <leader> b остановится на секунду перед работой, что было неприятно. Оказалось, что существует другое отображение, определенное для <leader> bd, определенное моим плагином BClose, и Vim ожидал, чтобы определить, нажал ли я последующий d, прежде чем принимать решение о том, какое ключевое отображение нужно вызвать. Я никогда не использовал это, поэтому я отключил его, используя это в моем .vimrc:

autocmd VimEnter * nunmap <Leader>bd

Кстати, теперь, когда вы создаете файлы тегов для своего проекта, легко также включить нажатие клавиши "перейти к определению" символа под вашим текстовым курсором. См. Мою статью в блоге об этом: http://tartley.com/?p=1277

Ответ 6

Вот сопоставление, которое я использую (они не мои, хотя я действительно привык к ним сейчас):

let g:fuf_modesDisable = []
let g:fuf_mrufile_maxItem = 1000
let g:fuf_mrucmd_maxItem = 400
let g:fuf_mrufile_exclude = '\v\~$|\.(bak|sw[po])$|^(\/\/|\\\\|\/mnt\/)'
nnoremap <silent> <C-n>      :FufBuffer<CR>
nnoremap <silent> <C-p>      :FufFileWithCurrentBufferDir<CR>
nnoremap <silent> <C-f><C-p> :FufFileWithFullCwd<CR>
nnoremap <silent> <C-f>p     :FufFile<CR>
nnoremap <silent> <C-f><C-d> :FufDirWithCurrentBufferDir<CR>
nnoremap <silent> <C-f>d     :FufDirWithFullCwd<CR>
nnoremap <silent> <C-f>D     :FufDir<CR>
nnoremap <silent> <C-j>      :FufMruFile<CR>
nnoremap <silent> <C-k>      :FufMruCmd<CR>
nnoremap <silent> <C-b>      :FufBookmarkDir<CR>
nnoremap <silent> <C-f><C-t> :FufTag<CR>
nnoremap <silent> <C-f>t     :FufTag!<CR>
noremap  <silent> g]         :FufTagWithCursorWord!<CR>
nnoremap <silent> <C-f><C-f> :FufTaggedFile<CR>
nnoremap <silent> <C-f><C-j> :FufJumpList<CR>
nnoremap <silent> <C-f><C-g> :FufChangeList<CR>
nnoremap <silent> <C-f><C-q> :FufQuickfix<CR>
nnoremap <silent> <C-f><C-l> :FufLine<CR>
nnoremap <silent> <C-f><C-h> :FufHelp<CR>
nnoremap <silent> <C-f><C-b> :FufAddBookmark<CR>
vnoremap <silent> <C-f><C-b> :FufAddBookmarkAsSelectedText<CR>
nnoremap <silent> <C-f><C-e> :FufEditInfo<CR>
nnoremap <silent> <C-f><C-r> :FufRenewCache<CR>

В основном я использую:  для последних открытых файлов  для изменения буферов (и я удалил все плагины buxexplorer) p для просмотра файлов/каталогов