Comment naviguer dans les méthodes Ruby dans VIM?

J’apprends le développement de VIM pour Rails et souhaite naviguer facilement dans les méthodes d’un fichier. Jusqu’à présent, je vois plusieurs options:

  • Trouvez ‘def’ en utilisant

    /def 
  • Créer une macro qui correspond à une clé en utilisant q et enregistrer
  • utiliser les marques VIM? (même pas sûr de ce qu’ils font, ils semblent juste prometteurs

Quelqu’un a-t-il de meilleures idées?

:aide moi

Je pense qu’il faut vim-ruby pour le support de rbuy.

vous voulez une fonctionnalité appelée ctags

voir ctags exubérant , il fonctionne pour de nombreuses langues, y compris Ruby et est simple à utiliser.

de VIM :help ctags

Les ctags vont créer un index de tous les identifiants dans un arbre source. Vous pouvez ensuite utiliser les commandes de balise pour naviguer dans votre arbre source. voir :help tag-commands . Le plus simple est de placer le curseur sur un mot-clé et d’appuyer sur CTRL] . Pour revenir à votre provenance, appuyez sur CTRLT

Au-delà de cela, vous voudrez peut-être regarder cette page qui explique comment utiliser VIM comme un IDE Ruby plus complet: Utiliser Vim comme un IDE Ruby On Rails complet

Meilleure solution pour Vim: utiliser les ctags . Lisez la documentation de Vim sur la façon de naviguer dans les fichiers TAGS, installez également le plugin comme CtrlP qui vous permet de parcourir visuellement les tags.

Attention: les ctags exubérants ne fonctionnent pas bien avec Ruby , l’parsingur n’est pas en bon état et n’a pas été modifié depuis 4 ans.

  • ctags ne traite pas de: module A :: B
  • ctags ne marque pas (au moins certaines) les méthodes de l’opérateur comme ==
  • ctags ne supporte pas les balises qualifiées, -type = +
  • ctags ne génère pas de balises pour les constantes ou les atsortingbuts.

Malheureusement tous les autres (j’ai trouvé 2) les générateurs Ruby ctags sont soit obsolètes (pas de support Ruby 1.9+) ou très lents.

Il y a une solution. Ripper-ctags: https://github.com/tmm1/ripper-tags C’est rapide et ça marche comme prévu. Il est basé sur la fonctionnalité Ruby 1.9+ appelée “Ripper” qui nous permet de construire sur l’parsingur original (rapide) de Ruby. C’est le générateur de ctags le plus précis aujourd’hui .

Les options de Ripper CLI sont presque identiques à celles des ctags, donc si vous connaissez déjà les ctags, vous trouverez facilement des balises ripper. C’est aussi simple que:

 ripper-tags -R . 

Cela crée un fichier TAGS que vim lit automatiquement par défaut (doit être le répertoire dans lequel vous ouvrez votre instance vim ou changez manuellement le paramètre de chemin dans vim si vous le lancez dans un répertoire différent – plus dans le manuel de Vim).

Si vous aimez cela, vous pouvez aller plus loin et installer mon projet qui crée automatiquement des TAGS pour toutes les gemmes que vous installez : https://github.com/lzap/gem-ripper-tags

L’utilisation est très simple (notez encore, seulement Ruby 1.9+):

 gem install gem-ripper-tags 

Ensuite, générez des balises pour tous les gems déjà installés:

 gem ripper_tags 

Chaque fois que vous installez un bijou maintenant, les balises seront automatiquement créées.

 gem instal some_gem ... 

Je vais encore plus loin: j’ai un git template qui régénère mon projet TAGS après chaque git pull ou fusionne automatiquement (en utilisant des balises ripper):

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

Notez que vous aurez également besoin des fichiers de répertoire / git_template du même repository git.

J’espère que c’est un bon sharepoint départ pour naviguer dans les bases de code Ruby 🙂

Quelques idées:

Tout d’abord, créez un mappage pour utiliser les touches de recherche de la fonction C dans ~/.vim/after/ftplugin/ruby.vim :

 :nmap [[ ?def  :nmap ]] /def  

Ensuite, vous pouvez utiliser [[ et ]] pour avancer ou reculer d’une fonction, comme dans le code C / Perl / Java, etc.

Une autre façon qui pourrait aider:

Dans .vimrc , ajoutez la ligne:

 :let ruby_fold = 1 

Utilisez ensuite zj , zk , z[ et z] pour naviguer par plis. Vous pouvez également installer ce plugin pour pouvoir supprimer facilement les plis à l’aide de daz .

Pour trouver des fonctions spécifiques (plutôt que de simplement les contourner), vous devez utiliser les ctags (comme mentionné par chillitom). Le plugin taglist facilite la navigation vers une fonction spécifique, mais (comme dit chillitom) Ctrl] et CtrlT sont utiles pour suivre des mots-clés sous le curseur.

Pour plus d’informations, voir:

 :help [[ :help ft-ruby-syntax :help z[ :help after-directory 

J’ai récemment trouvé que Ruby.vim (selon l’une des réponses ci-dessus) est livré avec des raccourcis clavier très utiles:

 nnoremap   [m :call searchsyn('\','rubyDefine','b','n') nnoremap   ]m :call searchsyn('\','rubyDefine','','n') nnoremap   [M :call searchsyn('\','rubyDefine','b','n') nnoremap   ]M :call searchsyn('\','rubyDefine','','n') xnoremap   [m :call searchsyn('\','rubyDefine','b','v') xnoremap   ]m :call searchsyn('\','rubyDefine','','v') xnoremap   [M :call searchsyn('\','rubyDefine','b','v') xnoremap   ]M :call searchsyn('\','rubyDefine','','v') nnoremap   [[ :call searchsyn('\<\%(class\module\)\>','rubyModule\rubyClass','b','n') nnoremap   ]] :call searchsyn('\<\%(class\module\)\>','rubyModule\rubyClass','','n') nnoremap   [] :call searchsyn('\','rubyModule\rubyClass','b','n') nnoremap   ][ :call searchsyn('\','rubyModule\rubyClass','','n') xnoremap   [[ :call searchsyn('\<\%(class\module\)\>','rubyModule\rubyClass','b','v') xnoremap   ]] :call searchsyn('\<\%(class\module\)\>','rubyModule\rubyClass','','v') xnoremap   [] :call searchsyn('\','rubyModule\rubyClass','b','v') xnoremap   ][ :call searchsyn('\','rubyModule\rubyClass','','v') 

Une astuce consiste à rechercher simplement avec ‘ /f methodName ‘.

Vous devriez également envisager d’activer le pliage du code en ajoutant cette ligne à votre fichier .vimrc:

 :let ruby_fold 

Voir :help ft-ruby-syntax pour plus de détails.

En général, je tape simplement le nom de la méthode dans la recherche incrémentale.

J’ai écrit un petit script shell en utilisant ag (The Silver Searcher). Définissez les fonctions suivantes dans votre .vimrc

Cette méthode va développer le mot sous le curseur.

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

Puis déclarez la méthode SearchForDeclaration

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

Notez que nous recherchons explicitement le mot-clé def . (Vous pouvez utiliser la syntaxe de signature de votre méthode de langue)

Nous mappons ensuite la fonction ci-dessus à une commande Leader .

 map cd :call SearchForDeclarationCursor() 

Maintenant, si vous placez votre curseur n’importe où sur une méthode définie “dans votre projet”, et appuyez sur cd , cela vous mènera à l’endroit où la méthode est définie.

Notez qu’une méthode peut être définie dans plusieurs classes. Vous pouvez faire un cycle en utilisant n pour next ou p pour prev.

Si vous voulez une explication plus détaillée de ce qui précède, j’ai écrit un article de blog ici: http://pradyumna.io/2017/12/17/search-ruby-method-declarations-in-vim.html

J’espère que cela t’aides!