Как ориентироваться в методах Ruby в VIM? - PullRequest
43 голосов
/ 25 августа 2009

Я изучаю VIM для разработки на Rails и хотел бы легко перемещаться по методам в файле. Пока вижу несколько вариантов:

  • Найдите 'def' с помощью

    /def<space>
    
  • Создать макрос, соответствующий ключу, используя q и запись
  • использовать знаки VIM? (даже не уверен, что они делают, они просто звучат многообещающе

У кого-нибудь есть идеи получше?

Ответы [ 8 ]

40 голосов
/ 02 сентября 2009

: помощь] м

Я думаю, что для поддержки ruby ​​требуется vim-ruby .

35 голосов
/ 25 августа 2009

вам понадобится функция под названием ctags

см. exuberant ctags , он работает для многих языков, включая Ruby, и очень прост в использовании.

от VIM :help ctags

ctags создаст индекс всех идентификаторов в исходном дереве. Затем вы можете использовать команды тегов для перемещения по вашему исходному дереву. см :help tag-commands. Самый простой - навести курсор на ключевое слово и нажать CTRL - ] . Чтобы вернуться туда, откуда вы пришли, нажмите CTRL - T

Помимо этого, вы можете захотеть взглянуть на эту страницу, где описано, как использовать VIM в качестве более полнофункциональной среды Ruby IDE: Использование Vim в качестве полной среды Ruby On Rails

13 голосов
/ 22 июля 2013

Лучшее решение для Vim: использовать ctags . Прочитайте документацию Vim о том, как перемещаться в файлах TAGS, а также установите плагин, например CtrlP, который позволяет вам визуально просматривать теги.

Предупреждение: Exuberant ctags плохо работает с Ruby , синтаксический анализатор не в хорошем состоянии и не изменялся 4 года.

  • ctags не работает с: модулем A :: B
  • ctags не помечает (хотя бы некоторые из) операторные методы, такие как ==
  • ctags не поддерживает квалифицированные теги, -type = +
  • ctags не выводит теги для констант или атрибутов.

К сожалению, все остальные (я нашел 2) генераторы Ruby ctags либо устарели (без поддержки Ruby 1.9+), либо очень медленные.

Есть одно решение, хотя. Ripper-ctags: https://github.com/tmm1/ripper-tags Это быстро и работает как положено. Он основан на функции Ruby 1.9+ под названием «Ripper», которая позволяет нам строить поверх (быстрого) оригинального синтаксического анализатора Ruby. Это самый точный генератор ctags на сегодняшний день .

Параметры интерфейса Ripper CLI практически идентичны ctags, поэтому, если вы уже знаете ctags, вы легко поймете теги ripper. Это так же просто, как:

ripper-tags -R .

Это создает файл TAGS, который vim автоматически читает по умолчанию (должен быть каталогом, в котором вы открываете свой экземпляр vim, или вручную изменять настройку пути в vim, если вы запускаете его в другом каталоге - подробнее в руководстве Vim).

Если вам это нравится, вы можете пойти дальше и установить мой проект, который автоматически создает теги для всех устанавливаемых вами камней : https://github.com/lzap/gem-ripper-tags

Использование очень просто (обратите внимание, только Ruby 1.9 +):

gem install gem-ripper-tags

Затем сгенерируйте теги для всех уже установленных драгоценных камней:

gem ripper_tags

Каждый раз, когда вы устанавливаете самоцвет, теги будут создаваться автоматически.

gem instal some_gem ...

Я делаю еще один шаг - у меня есть шаблон git, который регенерирует мой проект TAGS после каждого git pull или слияния автоматически (с использованием тегов ripper):

https://github.com/lzap/bin-public/blob/master/git-hooks-reinstall

Обратите внимание, что вам также понадобятся файлы каталогов / git_template из того же хранилища git.

Я надеюсь, что это хорошая отправная точка для навигации по кодовым базам Ruby: -)

5 голосов
/ 25 августа 2009

Пара идей:

Во-первых, создайте отображение для использования функции поиска клавиш C в ~/.vim/after/ftplugin/ruby.vim:

:nmap [[ ?def <CR>
:nmap ]] /def <CR>

Затем вы можете использовать [[ и ]] для перехода вперед и назад функции, как в коде C / Perl / Java и т. Д.

Другой способ, который может помочь:

В .vimrc добавить строку:

:let ruby_fold = 1

Затем используйте zj, zk, z[ и z] для навигации по сгибам. Вы также можете установить этот плагин , чтобы вы могли легко удалять складки, используя daz.

Для поиска определенных функций (а не просто навигации по ним) вы захотите использовать ctags (как упомянуто chillitom). плагин taglist значительно упрощает переход к определенной функции, но (как сказал chillitom) Ctrl - ] и Ctrl - T полезны для следующих ключевых слов под курсором.

Для получения дополнительной информации см .:

:help [[
:help ft-ruby-syntax
:help z[
:help after-directory
3 голосов
/ 26 ноября 2011

Я недавно обнаружил, что Ruby.vim (согласно одному из ответов выше) поставляется с довольно полезными привязками клавиш:

nnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','b','n')<CR>
nnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','','n')<CR>
nnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','b','n')<CR>
nnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','','n')<CR>
xnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','b','v')<CR>
xnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','','v')<CR>
xnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','b','v')<CR>
xnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','','v')<CR>

nnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b','n')<CR>
nnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','','n')<CR>
nnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b','n')<CR>
nnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','','n')<CR>
xnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b','v')<CR>
xnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','','v')<CR>
xnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b','v')<CR>
xnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','','v')<CR>
1 голос
/ 25 августа 2009

Один трюк - это просто поиск с использованием '/f methodName'.

Вам также следует обратить внимание на включение свертывания кода, добавив эту строку в ваш .vimrc:

:let ruby_fold

Подробнее см. :help ft-ruby-syntax.

0 голосов
/ 30 мая 2018

Я написал небольшой сценарий оболочки, используя ag (Серебряный поисковик). Определите следующие функции в вашем .vimrc

Этот метод развернет слово под курсором.

function! SearchForDeclarationCursor()
  let searchTerm = expand("<cword>")
  call SearchForDeclaration(searchTerm)
endfunction

Затем объявите метод SearchForDeclaration

function! SearchForDeclaration(term)
  let definition = 'def ' . a:term
  cexpr system('ag -w ' . shellescape(definition))
endfunction

Обратите внимание, что мы явно ищем ключевое слово def. (Вы можете использовать синтаксис подписи вашего языкового метода)

Затем мы сопоставляем вышеуказанную функцию с командой Leader.

map <Leader>cd :call SearchForDeclarationCursor()<CR>

Теперь, если вы поместите курсор в любое место на метод, который определен «в вашем проекте», и нажмете <Leader>cd, он направит вас туда, где определен метод.

Обратите внимание, что метод может быть определен в нескольких классах. Вы можете переключаться, используя <Leader>n для следующего или <Leader>p для предыдущего.

Если вам нужно более подробное объяснение вышесказанного, я написал сообщение в блоге здесь: http://pradyumna.io/2017/12/17/search-ruby-method-declarations-in-vim.html

Надеюсь, это поможет!

0 голосов
/ 25 августа 2009

Обычно я просто набираю имя метода в пошаговом поиске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...