it-swarm.com.de

Wie navigiert man in VIM durch Ruby-Methoden?

Ich lerne VIM für die Rails-Entwicklung und möchte einfach durch Methoden in einer Datei navigieren. Bisher sehe ich mehrere Möglichkeiten:

  • Finden Sie "def" mit

    /def<space>
    
  • Erstellen Sie mit q und record ein Makro, das einer Taste entspricht
  • VIM Markierungen verwenden? (nicht einmal sicher, was sie tun, sie klingen nur vielversprechend

Hat jemand bessere Ideen?

42
btelles

: hilfe] m

Ich denke, es erfordert vim-Ruby für die Ruby-Unterstützung.

39
eremite

sie möchten ein Feature namens ctags

siehe üppige ctags , es funktioniert für viele Sprachen einschließlich Ruby und ist v einfach zu bedienen.

from VIM :help ctags

ctags erstellt einen Index aller Bezeichner in einem Quellbaum. Sie können dann die Tag-Befehle verwenden, um in Ihrem Quellbaum zu navigieren. siehe :help tag-commands. Am einfachsten ist es, den Cursor über ein Schlüsselwort zu platzieren und zu drückenCTRL-]. Um dorthin zurückzukehren, wo Sie von der Presse gekommen sindCTRL-T

Außerdem möchten Sie vielleicht auf dieser Seite nachlesen, wie Sie VIM als umfassende Ruby-IDE verwenden: Verwenden von Vim als vollständige Ruby-on-Rails-IDE

35
chillitom

Beste Lösung für Vim: benutze ctags. Lesen Sie in der Vim-Dokumentation nach, wie Sie in TAGS-Dateien navigieren. Installieren Sie auch ein Plugin wie CtrlP, mit dem Sie Tags visuell durchsuchen können.

Warnung: Exuberant ctags funktioniert nicht gut mit Ruby, der Parser ist nicht in gutem Zustand und wurde seit 4 Jahren nicht geändert.

  • ctags befasst sich nicht mit: Modul A :: B
  • ctags markiert (zumindest einige) Operatormethoden wie == nicht
  • ctags unterstützt keine qualifizierten Tags, -type = +
  • ctags gibt keine Tags für Konstanten oder Attribute aus.

Leider sind alle anderen (ich fand 2) Ruby-Ctags-Generatoren entweder veraltet (keine Ruby 1.9+ -Unterstützung) oder sehr langsam.

Es gibt eine Lösung. Ripper-ctags: https://github.com/tmm1/ripper-tags Es ist schnell und es funktioniert wie erwartet. Es basiert auf der Ruby 1.9+ -Funktion "Ripper", mit der wir auf dem (schnellen) Ruby-Original-Parser aufbauen können. Es ist der derzeit genaueste Ctags-Generator.

Ripper CLI-Optionen sind fast identisch mit ctags. Wenn Sie also bereits ctags kennen, finden Sie Ripper-Tags leicht zu erlernen. Es ist so einfach wie:

ripper-tags -R .

Dadurch wird eine TAGS-Datei erstellt, die vim standardmäßig automatisch liest (muss das Verzeichnis sein, in dem Sie Ihre vim-Instanz öffnen, oder die Pfadeinstellung in vim manuell ändern, wenn Sie sie in einem anderen Verzeichnis starten - mehr im Vim-Handbuch).

Wenn Ihnen das gefällt, können Sie einen Schritt weiter gehen und mein Projekt installieren, das automatisch TAGS für alle Edelsteine ​​erstellt, die Sie installieren: https://github.com/lzap/gem-ripper-tags

Die Bedienung ist sehr einfach (Achtung, nur Ruby 1.9+):

gem install gem-ripper-tags

Dann generiere Tags für alle bereits installierten Edelsteine:

gem ripper_tags

Jedes Mal, wenn Sie jetzt einen Edelstein installieren, werden Tags automatisch erstellt.

gem instal some_gem ...

Ich gehe noch einen Schritt weiter - ich habe eine Git-Vorlage, die mein Projekt neu generiert. TAGS nach jedem Ziehen oder Zusammenführen von Git (unter Verwendung von Ripper-Tags):

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

Beachten Sie, dass Sie auch die Verzeichnisdateien/git_template aus demselben git-Repository benötigen.

Ich hoffe, das ist ein guter Ausgangspunkt für die Navigation in Ruby-Codebasen :-)

13
lzap

Ein paar Ideen:

Erstellen Sie zunächst eine Zuordnung, um die C-Funktionssuchtasten in ~/.vim/after/ftplugin/Ruby.vim zu verwenden:

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

Dann können Sie [[ und ]] verwenden, um eine Funktion vor- und zurückzuspringen, genau wie in C/Perl/Java-Code usw.

Ein anderer Weg, der helfen könnte:

Fügen Sie in .vimrc die folgende Zeile hinzu:

:let Ruby_fold = 1

Verwenden Sie dann zj, zk, z[ und z], um nach Falzen zu navigieren. Sie können auch dieses Plugin installieren, damit Sie Falten mit daz leicht löschen können.

Um bestimmte Funktionen zu finden (anstatt nur um sie herum zu navigieren), sollten Sie ctags verwenden (wie von chillitom erwähnt). Das Taglist Plugin erleichtert das Navigieren zu einer bestimmten Funktion erheblich, Ctrl-] und Ctrl-T sind nützlich, um Schlüsselwörter unter dem Cursor zu verfolgen.

Weitere Informationen finden Sie unter:

:help [[
:help ft-Ruby-syntax
:help z[
:help after-directory
5
DrAl

Ich habe kürzlich festgestellt, dass Ruby.vim (gemäß einer der obigen Antworten) ziemlich nützliche Tastenkombinationen enthält:

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>
3
btelles

Ein Trick besteht darin, einfach mit '/f methodName' zu suchen.

Sie sollten auch die Codefaltung aktivieren, indem Sie diese Zeile zu Ihrer .vimrc-Datei hinzufügen:

:let Ruby_fold

Siehe :help ft-Ruby-syntax für weitere Details.

1
too much php

Normalerweise gebe ich bei der inkrementellen Suche nur den Namen der Methode ein.

0

Ich habe ein kleines Shell-Skript mit ag (The Silver Searcher) geschrieben. Definieren Sie die folgenden Funktionen in Ihrem .vimrc

Diese Methode erweitert das Wort unter dem Cursor.

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

Dann deklarieren Sie die Methode SearchForDeclaration

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

Beachten Sie, dass wir explizit nach dem Schlüsselwort def suchen. (Sie können die Signatursyntax Ihrer Sprachmethode verwenden.)

Wir ordnen dann die obige Funktion einem Befehl Leader zu.

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

Wenn Sie nun den Cursor irgendwo auf eine Methode setzen, die "in Ihrem Projekt" definiert ist, und <Leader>cd drücken, werden Sie dorthin geleitet, wo die Methode definiert ist.

Beachten Sie, dass eine Methode in mehreren Klassen definiert werden kann. Sie können mit <Leader>n für next oder <Leader>p für prev wechseln.

Wenn Sie eine ausführlichere Erklärung für das oben Genannte wünschen, habe ich hier einen Blogeintrag verfasst: http://pradyumna.io/2017/12/17/search-Ruby-method-declarations-in-vim.html

Hoffe das hilft!

0