2011-09-29 12 views
12

¿Hay alguna manera de configurarlo para que doble automáticamente los archivos fuente de ruby, pero solo doble en el nivel de método independientemente del nivel que se definan?plegado de rubí automático en vim

Por lo tanto, se plegará cuando tengo:

class MyClass 
    def method 
    ... 
    end 
end 

sino también cuando tengo:

module FirstModule 
    module SecondModule 
    class MyClass 
     def method 
     ... 
     end 
    end 
    end 
end 

He experimentado con foldmethod = sintaxis y los distintos niveles de plegado, pero no se necesita en cuenta la profundidad donde se define el método.

Además, no quiero que nada dentro del método se doble (si los bloques, cada bloque, etc.).

Creo que foldmethod = expr sería mi mejor opción, pero no he logrado averiguar cómo funcionan las expresiones de dobleces, y la ayuda en vim no ha sido muy esclarecedora.

Respuesta

11

¡Su corazonada sobre el uso del método expr, creo, era correcta!

Puede usar la estructura de sintaxis del archivo para jurar su propio syntax estilo plegable. El siguiente en mi .vimrc comportamiento esperado producido:

function! RubyMethodFold(line) 
    let line_is_method_or_end = synIDattr(synID(a:line,1,0), 'name') == 'rubyMethodBlock' 
    let line_is_def = getline(a:line) =~ '\s*def ' 
    return line_is_method_or_end || line_is_def 
endfunction 

set foldexpr=RubyMethodFold(v:lnum) 

Algunas advertencias:

no estoy seguro de si el argumento final para synID debe ser 0 o 1. Es el argumento el que determina si obtiene la información de sintaxis para el elemento transparente o no transparente más transparente en la ubicación proporcionada. Cuando no hay elemento transparente, el argumento no tiene efecto. En el ejemplo trivial que probé, no causó ningún problema, pero podría ser.

También vale la pena señalar que line_is_def regex es probablemente demasiado indulgente. Puede ser mejor devolver -1 en esta situación, por lo que una línea que coincida con la expresión regular solo se pliega cuando está justo al lado del bloque de método plegado. Una expresión regular más restrictiva también podría funcionar.

Si se siente mal, puede ampliar esto y devolver los niveles de dobleces por separado para rubyClass y rubyModule elementos también.

Si decides ir por esa ruta, hay algunos useful custom functions in my .vimrc para introspectar elementos de sintaxis y hilighting. Son más cómodos cuando están asignadas a una combinación de teclas para el uso rápido de esta manera:

nnoremap g<C-h> :echo GetSynInfo()<CR> 

Por favor, hágamelo saber si esto funciona para usted! Fue divertido descubrirlo.Además, por lo que vale la pena, mientras que :help 'foldexpr' es liviano en los detalles, :help 'fold-expr' es mucho más útil, e incluso tiene algunos ejemplos en la parte superior.

+2

esta es una gran respuesta. Parece que es la solución correcta, o al menos un buen punto de partida para llegar a donde quiero. Voy a probar para ver cómo funciona hoy y acepto su respuesta. También su vimrc parece un gran recurso de aprendizaje, especialmente con todas las funciones que definió. Gracias. – adivasile

+0

¡Eres bienvenido! ¡Feliz vimming! –

+0

¡Estaría interesado en saber cómo esto funcionó para usted, por cierto! –

1

Es posible que pueda salirse con la suya con una solución que se pliega dentro de un método también, mediante el uso del comando zO. zOabrirá recursivamente un doblez, por lo que si lo usa en lugar de zo, será como si nada dentro del método estuviera doblado. También puede reasignar zo a zO si se siente con curiosidad.

+0

que de hecho sería útil, pero el problema principal sigue siendo: tener los métodos doblados automáticamente. – adivasile

3

Es posible que tenga mejor suerte con esto, especialmente si ya tiene resaltado de sintaxis:

Esto iría en su ~/.vimrc

 
"" Enable folding based on syntax rules 
set foldmethod=syntax 

"" Adjust the highlighting 
highlight Folded guibg=grey guifg=blue 

"" Map folding to Spacebar 
nnoremap za 

Esta es también una gran VIMcast de plegado: http://vimcasts.org/episodes/how-to-fold/

4

Cambié la solución de Max Cantor, la mía funciona perfectamente, doblará los métodos def (incluyendo la palabra clave final) y los documentos (= comienzo = fin) bloques independientemente de dónde se encuentre (en una clase o sangrado)

function! RubyMethodFold(line) 
    let stack = synstack(a:line, (match(getline(a:line), '^\s*\zs'))+1) 

    for synid in stack 
    if GetSynString(GetSynDict(synid)) ==? "rubyMethodBlock" || GetSynString(GetSynDict(synid)) ==? "rubyDefine" || GetSynString(GetSynDict(synid)) ==? "rubyDocumentation" 
     return 1 
    endif 
    endfor 

    return 0 
endfunction 

set foldexpr=RubyMethodFold(v:lnum) 

set foldmethod=expr 

Gracias a Max Cantor por sus métodos de ayuda para imprimir la información de sintaxis.

Voy a explicar esta línea por línea:

La línea más importante sería la segunda línea donde se pone las pilas de nivel verious del elemento de sintaxis en una línea. Si tiene una línea como def methodname con espacios en blanco o pestañas antes, siempre obtendrá la pila en el primer carácter que no esté en blanco. El problema con la solución de Max Cantor es que su código solo imprimirá el elemento de sintaxis más bajo encontrado en la primera columna de la línea, por lo que siempre devolverá algo aleatorio, elementos como "rubyContant" que no nos importan.

Así que al usar match(getline(a:line), '^\s*\zs') podemos mover nuestro cursor a la columna del primer carácter no en blanco para que podamos obtener una imagen más precisa de las pilas. +1 porque el partido tiene índice cero.

Y el resto es similar al método GetSynInfo donde recorremos la pila y hacemos coincidir los elementos que queremos, y devolvemos 1 para que todos estén en el mismo nivel de pliegue y 0 para el resto.

Y eso es todo, una función de plegado expr de trabajo que sólo se pliega rubí definir métodos :)

disfrutar y tener un buen día!

+1

Su respuesta parece prometedora, pero desafortunadamente cuando lo probé no sucedió nada. Parece que la solución no define estas funciones: 'GetSynString' y' GetSynDict'. ¿Podrías por favor proporcionarlos? Gracias –

1

He hecho vim-ruby-fold plugin para el método simple doblando en ruby. Espero que ayude a la gente.

Cuestiones relacionadas