2012-05-05 12 views
6

Tengo un problema al saltar a un método de Ruby bang usando Ctags exuberantes. He buscado a otros que tienen un problema similar y no puedo encontrar nada. Un ejemplo del problema se puede demostrar utilizando la siguiente clase pequeña Ruby:Saltando a un método de Ruby bang usando Ctags en Vim

class Hello 
    def start 
    method! 
    end 

    def method 
    # Blah 
    end 

    def method! 
    # Blah 
    end 
end 

Cuando ctags -R . se ejecuta en este archivo la tags archivo resultante contiene los siguientes 2 líneas que demuestran que ambos métodos se descubren en generación:

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

Sin embargo, si coloco el cursor en la llamada al method! en la línea 3 y presiono ^], el cursor salta a la definición method en lugar de a la versión correcta de bang. Parece como si el signo de admiración no se incluyera en el identificador que se busca.

¿Hay alguna manera de arreglar esto para que el método correcto sea aceptado?

+1

^] saltos correctamente al método correcto en mi versión de vim. ¿Qué versión de vim y ctags estás usando? Tengo vim-ruby y matchit instalados y habilitados. No estoy seguro si eso hace una diferencia. – rjk

+0

Estoy usando MacVim Snapshot 63, que está basado en Vim 7.3. Yo también tengo ambos complementos. El problema persiste incluso si comienzo vim sin configuración ('mvim -u NINGUNO'). – xoebus

Respuesta

2

Me doy cuenta de que esto es muy viejo, pero me encontré con lo mismo tanto en Vim 8.0 como en Neovim. Si ingreso :tag mymethod! desde la línea de comandos de vim, encuentra la etiqueta relevante, pero si intento <C-]> con mi cursor sobre el nombre del método, comete un error E426: tag not found: mymethod (tenga en cuenta la falta de ! en el nombre buscado).

Puede solucionar este problema mediante la adición de ! a la lista de caracteres reconocidos como personajes de palabras clave en la sintaxis de Ruby:

:set iskeyword+=! 

Se podría añadir a esta ~/.vim/after/syntax/ruby.vim aplicarlo en cualquier archivo de Ruby abrir. Sin embargo, no he probado esto, así que no puedo decir si afectará negativamente a cualquier otra cosa. Sé que cambiará el comportamiento de salto de palabras. w tratará, por ejemplo, el ! como parte de la palabra "pequeña".

Pensándolo bien, definitivamente manipulará mal cosas como !some_test. Si tuviera que pulsar <C-]> con el cursor en cualquier lugar, buscaría un método llamado !some_test, que definitivamente no es lo que desea. Una mejor solución sería escribir una función de envoltura alrededor de la búsqueda de etiquetas para archivos Ruby. De hecho, estoy trabajando en algo para eso, así que publicaré cuando tenga algo tan presentable.

Actualización: He encontrado una solución sorprendentemente simple:

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

Por alguna razón, el comportamiento de <C-R><C-W> en el modo de línea de comandos se diferencia de la de expand('<cword>'), y podría decirse que a partir de la documentación. Aunque ! no es un 'iskeyword' carácter, y expand('<cword>') resultados en mymethod, <C-R><C-W> resultados en mymethod!. Lo mismo se aplica al is_this_your_method?. Se podría aplicar esta solución, poniendo lo siguiente en ~/.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> 

Actualización 2

Resulta que el comportamiento especial de <C-R><C-W> fue proporcionado por vim-rubí (y se incluye en los archivos de tiempo de ejecución de Vim por defecto) Ese script personaliza <C-R><C-W> y también agrega un mapeo <Plug><cword> para identificar correctamente el identificador del cursor Ruby. Sólo encontré con el mal manejo de ! porque había clobbered inadvertidamente las asignaciones ya previstas por vim-rubí cuando se añade lo que me parece ser más una combinación de teclas cómoda:

nnoremap <C-.> <C-]> 

Si hubiera hecho nmap lugar, vim- el mapeo de Ruby podría haber hecho su trabajo. Como alternativa, puede aprovechar lo vim-rubí proporciona mediante la práctica (en un archivo ftplugin rubí):

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

Se puede utilizar siempre :tag:

:tag method! 

O modo visual - si resalta cualquier texto (con v + movimiento) antes de llegar a ^], se utilizará el texto resaltado como el etiqueta en lugar de tratar de encontrar un "identificador" debajo del cursor. Así que si el cursor está en la m en method!, entonces

vE^] 

debe hacer el truco. Si su cursor está en otra parte de la palabra, primero presione b.

+0

He reasignado '^]' a 'viW ^]' por el momento, ¡gracias! Sin embargo, algunas de las semánticas de esta operación habrán cambiado, así que no estoy seguro de que esta solución sea ideal. – xoebus

0

Estaba usando MacVim snapshot 63 cuando publiqué esta pregunta. Ahora estoy usando la instantánea 72 y el problema se ha ido. El único consejo que puedo dar aquí es actualizar la versión de Vim que estás usando.

+0

También verifique la versión de 'ctags' que está usando. Las versiones anteriores, como la que no tiene una versión y que todavía se envía con Xcode desde 6.1, ni siquiera generarán etiquetas para los métodos de explosión para que vim haga referencia. Utilicé Homebrew para instalar Exuberant Ctags 5.8 y regeneré los archivos de etiquetas; ahora vim navega a los métodos de bang (y de interrogación) simplemente bien. –

Cuestiones relacionadas