2009-08-25 13 views
41

Sto imparando lo sviluppo di VIM per Rails e vorrei esplorare facilmente i metodi in un file. Finora vedo diverse opzioni:Come si spostano i metodi Ruby in VIM?

  • Find 'def' utilizzando

    /def<space> 
    
  • creare una macro che corrisponde a una chiave utilizzando q e registrare marchi
  • uso VIM? (Nemmeno sicuro di quello che fanno, hanno solo il suono promettente

Qualcuno ha qualche idea migliore?

risposta

37

: help] m

Penso che richiede vim-ruby per il supporto rubino.

+0

La migliore risposta di gran lunga! –

+0

Sì. Sono d'accordo. Migliore risposta! – lucapette

+0

Ora utilizzo [ctags con git hooks] (http://tbaggery.com/2011/08/08/effortless-ctags-with-git.html) e [fzf per passare a un tag in un buffer corrente] (https : //github.com/junegunn/fzf/wiki/Examples- (vim) # jump-to-tag-in-the-corrente-buffer). Funziona benissimo, ma impostare tutto è abbastanza difficile. – eremite

34

si vorrà una caratteristica chiamata ctags

vedere exuberant ctags, funziona per molte lingue incluso rubino ed è semplice da usare v.

dal VIM :help ctags

ctags creerà un indice di tutti gli identificatori in un albero dei sorgenti. È quindi possibile utilizzare i comandi di tag per spostarsi all'interno dell'albero di origine. vedi :help tag-commands. Il modo più semplice è posizionare il cursore su una parola chiave e premere CTRL - ]. Per tornare da dove sei venuto dalla stampa CTRL - T

Al di là di questo si potrebbe desiderare di guardare in questa pagina, che documenta come utilizzare VIM come un più piena funzionalità Rubino IDE: Using Vim as a Complete Ruby On Rails IDE

+0

Perfetto! Inoltre, per chiunque sia interessato, c'è un plugin chiamato SimpleFold che probabilmente è più utile di piegare che usare il normale folding di ruby ​​(\ f o ruby_fold = 1). Ecco il link: http://www.vim.org/scripts/script.php?script_id=1868 – btelles

+0

ctags, oltre alla [Lista tag] (http://www.vim.org/scripts/script.php ? script_id = 273) Il modulo vim funziona davvero bene. –

+2

Grande avvertimento: Ctags non analizza correttamente i file Ruby. Ad esempio, non accetta la definizione della classe con quattro punti (ad esempio classe Xyz :: Classname) e molte altre cose. Sfortunatamente, l'ultima versione è del 2009 e anche la versione di sviluppo non lo supporta. – lzap

0

Solitamente Digito semplicemente il nome del metodo sulla ricerca incrementale.

1

Un trucco è cercare semplicemente utilizzando '/f methodName'.

Si dovrebbe anche guardare accendere raggruppamento del codice aggiungendo questa riga al vostro Vimrc:

:let ruby_fold 

Vedere :help ft-ruby-syntax per maggiori dettagli.

5

Un paio di idee:

In primo luogo, fare una mappatura per utilizzare la funzione C a cercare le chiavi in ​​~/.vim/after/ftplugin/ruby.vim:

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

quindi è possibile utilizzare [[ e ]] per andare avanti e indietro di una funzione, proprio come in C/Perl/codice Java ecc

Un altro modo che potrebbe aiutare:

In .vimrc, aggiungere la riga:

:let ruby_fold = 1 

Quindi utilizzare zj, zk, z[ e z] per spostarsi da pieghe.È inoltre possibile installare this plugin in modo da poter eliminare facilmente le pieghe utilizzando daz.

Per trovare funzioni specifiche (piuttosto che navigare intorno a esse) ti consigliamo di usare ctags (come detto da chillitom). Il taglist plugin rende molto più facile per navigare verso una funzione specifica, ma (come detto chillitom) Ctrl - ] e Ctrl - T sono utili per seguenti parole sotto il cursore.

Per ulteriori informazioni, vedere:

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

di recente ho scoperto che Ruby.vim (per una delle risposte di cui sopra) viene fornito con abbastanza utili-combinazioni di tasti:

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> 
12

migliore soluzione per Vim: uso ctags. Leggi la documentazione di Vim su come navigare nei file TAGS, installa anche plugin come CtrlP che ti permette di visualizzare visivamente i tag.

Avvertenza: I ctag esuberanti non funzionano bene con Ruby, il parser non è in buone condizioni e non è stato cambiato da 4 anni.

  • ctags non si occupa di: modulo A :: B
  • ctags non tag (almeno alcuni) i metodi operatore come ==
  • ctags non supporta i tag qualificati, - type = +
  • ctags non emette tag per costanti o attributi.

Sfortunatamente tutti gli altri (ho trovato 2) i generatori di ctags Ruby sono obsoleti (nessun supporto per Ruby 1.9+) o molto lenti.

C'è una soluzione. Ripper-ctags: https://github.com/tmm1/ripper-tags È veloce e funziona come previsto. È basato sulla funzionalità Ruby 1.9+ denominata "Ripper" che ci consente di creare un parser originale (veloce) Ruby. È il generatore di ctags più preciso oggi.

Le opzioni di Ripper CLI sono quasi identiche ai ctags, quindi se già conosci i ctags, troverai tag di ripper facili da imparare. E 'facile come:

ripper-tags -R . 

Questo crea file di tag che vim legge automaticamente per default (deve essere la directory in cui si apre l'istanza vim a, o modificare manualmente l'impostazione in vim percorso se si avvia in una directory diversa - altro nel manuale di Vim).

Se ti piace questo, si può andare oltre e installare il mio progetto che crea automaticamente i tag per tutte le gemme si installa: https://github.com/lzap/gem-ripper-tags

uso è molto semplice (nota ancora una volta, solo Rubino 1.9+):

gem install gem-ripper-tags 

Poi generare tag per tutte le gemme già installati:

gem ripper_tags 

Ogni volta che si installa una gemma ora, verrà creato automaticamente i tag.

gem instal some_gem ... 

io fare un passo ulteriore ulteriormente - Ho un modello di git che è rigenerando miei tag progetto dopo ogni tiro git o unire automaticamente (utilizzando ripper-tag):

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

Nota che avrai bisogno dei file di directory/git_template anche dallo stesso repository git.

Spero che questo è buon punto di partenza per la navigazione in Ruby basi di codice :-)

+0

Ctags, funziona meglio con i linguaggi statici (perché è un analizzatore statico di base). – Rollo

+0

Certo, ma è molto veloce in quanto non è necessario caricare tutte le classi in memoria ed è abbastanza preciso. Lavoro su molti progetti di Ruby, compresi codebase piuttosto ampi e ottengo risultati corretti del 90% circa. Per me va bene. – lzap

Problemi correlati