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. Для тех, кто использовал это довольно долго, вы можете продемонстрировать, как вы на самом деле используете эти команды в комбинации, любые сопоставления, которые вы делаете, какие-либо ошибки, которые следует знать при использовании этого?
Ответы
Ответ 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 для просмотра файлов/каталогов