2012-05-05 8 views
6

Sto avendo un problema con il salto a un metodo di botto Ruby utilizzando Ctags Exhuberant. Ho cercato per altri problemi simili e non riesco a trovare nulla. Un esempio del problema può essere indicata mediante la seguente classe piccola rubino:Saltare a un metodo di vibrazione di Ruby usando Ctags in Vim

class Hello 
    def start 
    method! 
    end 

    def method 
    # Blah 
    end 

    def method! 
    # Blah 
    end 
end 

Quando ctags -R . viene eseguito in questo fascicolo tags file risultante contiene le seguenti 2 linee dimostrano che entrambi i metodi vengono scoperti alla generazione:

method test.rb /^ def method$/;" f class:Hello 
method! test.rb /^ def method!$/;" f class:Hello 

Tuttavia, se si posiziona il cursore sulla chiamata a method! sulla riga 3 e si preme ^], il cursore passa alla definizione method anziché alla versione bang corretta. Sembra che il punto esclamativo non venga incluso nell'identificatore cercato.

C'è un modo per risolvere il problema in modo che venga saltato il metodo corretto?

+1

^] salti correttamente il metodo giusto nella mia versione di vim. Quale versione di vim e ctags stai usando? Ho vim-ruby e matchit installati e abilitati. Non sono sicuro che questo faccia la differenza. – rjk

+0

Sto usando MacVim Snapshot 63 che è costruito su Vim 7.3. Anch'io ho entrambi questi plugin. Il problema persiste anche se avvii vim senza configurazione ('mvim -u NONE'). – xoebus

risposta

2

Mi rendo conto che questo è super-vecchio, ma mi sono imbattuto nella stessa cosa sia in Vim 8.0 che in Neovim. Se inserisco :tag mymethod! dalla riga di comando di vim, trova il tag pertinente, ma se provo <C-]> con il mio cursore sul nome del metodo, esso errori E426: tag not found: mymethod (notare la mancanza di ! nel nome cercato).

È possibile risolvere questo con l'aggiunta di ! all'elenco dei caratteri riconosciuti come caratteri di parole chiave nella sintassi di Ruby:

:set iskeyword+=! 

Si potrebbe aggiungere che questo ~/.vim/after/syntax/ruby.vim applicarla in qualsiasi file Rubino si apre. Non ho ancora provato questo, quindi non posso dire se influenzerà negativamente qualcos'altro. So che cambierà il comportamento del salto di parole. w, ad esempio, considererà lo ! come parte della parola "piccola".

Ripensandoci, sicuramente manterrà le cose come !some_test. Se dovessi colpire <C-]> con il cursore in qualsiasi punto, cercherà un metodo denominato !some_test, che non è sicuramente quello che desideri. Una soluzione migliore sarebbe scrivere una funzione wrapper attorno alla ricerca dei tag per i file Ruby. In realtà sto lavorando a qualcosa per questo, quindi posterò quando ho qualcosa di presentabile.

Aggiornamento: Ho trovato sorprendentemente semplice soluzione:

nnoremap <buffer><silent> <C-]> :tag <C-R><C-W><CR> 

Per qualche ragione, il comportamento di <C-R><C-W> in modalità riga di comando differisce da quella di expand('<cword>'), e probabilmente dalla documentazione. Anche se ! non è un 'iskeyword' carattere e expand('<cword>') risultati in mymethod, <C-R><C-W> risultati in mymethod!. Lo stesso vale per is_this_your_method?. Si potrebbe applicare questa soluzione mettendo quanto segue in ~/.vim/ftplugin/ruby.vim:

nnoremap <buffer><silent> <C-]> :tag  <C-R><C-W><CR> 
nnoremap <buffer><silent>  g] :tselect <C-R><C-W><CR> 
nnoremap <buffer><silent> g<C-]> :tjump <C-R><C-W><CR> 

Update 2

Si scopre il comportamento speciale di <C-R><C-W> è stato fornito da vim-ruby (e inclusa nel file di runtime di Vim per default). Questo script personalizza <C-R><C-W> e aggiunge anche un mapping <Plug><cword> per identificare correttamente l'identificatore del cursore Ruby. Mi sono imbattuto nella cattiva gestione di ! solo perché avevo inavvertitamente colpita le mappature già forniti da vim-ruby quando si aggiunge quello che trovo ad essere più una combinazione di tasti comodo:

nnoremap <C-.> <C-]> 

Se avessi fatto nmap invece, vim- la mappatura di Ruby avrebbe potuto fare il suo lavoro. In alternativa, si potrebbe sfruttare ciò che vim-ruby fornisce facendo (in un file ftplugin rubino):

nnoremap <buffer><silent> <C-]> :<C-U>exe v:count1."tag <Plug><cword>"<CR> 
nnoremap <buffer><silent>  g] :<C-U>tselect <Plug><cword><CR> 
nnoremap <buffer><silent> g<C-]> :<C-U>tjump <Plug><cword><CR> 
3

È sempre possibile utilizzare :tag:

:tag method! 

o la modalità visiva - se si evidenzia qualsiasi testo (con v + movimento) prima di colpire ^], verrà utilizzato il testo evidenziato come il tag invece di cercare di trovare un 'identificatore' sotto il cursore. Così, se il cursore si trova sulla m in method!, poi

vE^] 

dovrebbe fare il trucco. Se il tuo cursore si trova altrove nella parola, premi prima b.

+0

Ho rimappato '^]' in 'viW ^]' per ora, grazie! Tuttavia, alcune delle semantiche di questa operazione saranno cambiate quindi non sono sicuro che questa soluzione sia l'ideale. – xoebus

0

Stavo usando lo snapshot 63 di MacVim al momento in cui ho postato questa domanda. Ora sto usando lo snapshot 72 e il problema è finito. L'unico consiglio che posso dare qui è di aggiornare la versione di Vim che stai usando.

+0

Controlla anche la versione di 'ctags' che stai utilizzando. Le versioni precedenti, come la versione senza numero che viene ancora fornita con Xcode alla versione 6.1, non generano nemmeno i tag per i metodi bang per fare riferimento a vim. Ho usato Homebrew per installare Exuberant Ctags 5.8 e ho rigenerato i file dei tag; ora vim naviga per sbattere i metodi (e il punto interrogativo) bene. –

Problemi correlati